diff --git a/e2e/projects.spec.ts b/e2e/projects.spec.ts index cbb7e5b1..90e72c51 100644 --- a/e2e/projects.spec.ts +++ b/e2e/projects.spec.ts @@ -54,6 +54,37 @@ test('test that creating and deleting a new project via the modal works', async ); }); +test('test that archiving and unarchiving projects works', async ({ page }) => { + const newProjectName = + 'New Project ' + Math.floor(1 + Math.random() * 10000); + await goToProjectsOverview(page); + await page.getByRole('button', { name: 'Create Project' }).click(); + await page.getByLabel('Project Name').fill(newProjectName); + + await page.getByRole('button', { name: 'Create Project' }).nth(1).click(); + await expect(page.getByText(newProjectName)).toBeVisible(); + + await page.getByRole('row').first().getByRole('button').click(); + await Promise.all([ + page.getByRole('button').getByText('Archive').first().click(), + expect(page.getByText(newProjectName)).not.toBeVisible(), + ]); + await Promise.all([ + page.getByRole('tab', { name: 'Archived' }).click(), + expect(page.getByText(newProjectName)).toBeVisible(), + ]); + + await page.getByRole('row').first().getByRole('button').click(); + await Promise.all([ + page.getByRole('button').getByText('Unarchive').first().click(), + expect(page.getByText(newProjectName)).not.toBeVisible(), + ]); + await Promise.all([ + page.getByRole('tab', { name: 'Active' }).click(), + expect(page.getByText(newProjectName)).toBeVisible(), + ]); +}); + // Create new project with new Client // Create new project with existing Client diff --git a/e2e/tasks.spec.ts b/e2e/tasks.spec.ts index f36c070f..c8806eb8 100644 --- a/e2e/tasks.spec.ts +++ b/e2e/tasks.spec.ts @@ -98,6 +98,47 @@ test('test that creating and deleting a new tag in a new project works', async ( ); }); +test('test that archiving and unarchiving tasks works', async ({ page }) => { + const newProjectName = + 'New Project ' + Math.floor(1 + Math.random() * 10000); + const newTaskName = 'New Project ' + Math.floor(1 + Math.random() * 10000); + + await goToProjectsOverview(page); + await page.getByRole('button', { name: 'Create Project' }).click(); + await page.getByLabel('Project Name').fill(newProjectName); + + await page.getByRole('button', { name: 'Create Project' }).nth(1).click(); + await expect(page.getByText(newProjectName)).toBeVisible(); + + await page.getByText(newProjectName).click(); + + await page.getByRole('button', { name: 'Create Task' }).click(); + await page.getByPlaceholder('Task Name').fill(newTaskName); + await page.getByRole('button', { name: 'Create Task' }).nth(1).click(); + + await expect(page.getByRole('table')).toContainText(newTaskName); + + await page.getByRole('row').first().getByRole('button').click(); + await Promise.all([ + page.getByRole('button').getByText('Mark as done').first().click(), + expect(page.getByText(newTaskName)).not.toBeVisible(), + ]); + await Promise.all([ + page.getByRole('tab', { name: 'Done' }).click(), + expect(page.getByText(newTaskName)).toBeVisible(), + ]); + + await page.getByRole('row').first().getByRole('button').click(); + await Promise.all([ + page.getByRole('button').getByText('Mark as active').first().click(), + expect(page.getByText(newTaskName)).not.toBeVisible(), + ]); + await Promise.all([ + page.getByRole('tab', { name: 'Active' }).click(), + expect(page.getByText(newTaskName)).toBeVisible(), + ]); +}); + // Create new project with new Client // Create new project with existing Client diff --git a/resources/js/Components/Common/CardTitle.vue b/resources/js/Components/Common/CardTitle.vue index 81afe235..d92f0891 100644 --- a/resources/js/Components/Common/CardTitle.vue +++ b/resources/js/Components/Common/CardTitle.vue @@ -19,7 +19,7 @@ defineProps<{ {{ title }} -
+
diff --git a/resources/js/Components/Common/Project/ProjectMoreOptionsDropdown.vue b/resources/js/Components/Common/Project/ProjectMoreOptionsDropdown.vue index 21dff5c5..b775fd2e 100644 --- a/resources/js/Components/Common/Project/ProjectMoreOptionsDropdown.vue +++ b/resources/js/Components/Common/Project/ProjectMoreOptionsDropdown.vue @@ -1,11 +1,16 @@ diff --git a/resources/js/Components/Common/Project/ProjectTableRow.vue b/resources/js/Components/Common/Project/ProjectTableRow.vue index 1b013458..cbffcbfb 100644 --- a/resources/js/Components/Common/Project/ProjectTableRow.vue +++ b/resources/js/Components/Common/Project/ProjectTableRow.vue @@ -33,6 +33,13 @@ function deleteProject() { useProjectsStore().deleteProject(props.project.id); } +function archiveProject() { + useProjectsStore().updateProject(props.project.id, { + ...props.project, + is_archived: !props.project.is_archived, + }); +} + const billableRateInfo = computed(() => { if (props.project.is_billable) { if (props.project.billable_rate) { @@ -84,6 +91,7 @@ const showEditProjectModal = ref(false); diff --git a/resources/js/Components/Common/TabBar/TabBarItem.vue b/resources/js/Components/Common/TabBar/TabBarItem.vue index a418636f..efed8635 100644 --- a/resources/js/Components/Common/TabBar/TabBarItem.vue +++ b/resources/js/Components/Common/TabBar/TabBarItem.vue @@ -8,7 +8,7 @@ const props = defineProps<{ const activeClass = computed(() => { if (props.active) { - return 'bg-tab-background hover:bg-tab-background-active border border-tab-border text-white font-semibold'; + return 'bg-tab-background border border-tab-border text-white font-semibold'; } return ''; }); @@ -16,9 +16,10 @@ const activeClass = computed(() => {