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(() => {