From bc87764df1ba8e4ac615fac76d1b3a095e2455ff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Mar 2026 23:22:30 +0000 Subject: [PATCH 1/2] Initial plan From 624884f896f0f4de84509a250628f3701482d2d8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Mar 2026 23:42:01 +0000 Subject: [PATCH 2/2] feat: save filter settings to localStorage and add Reset Filters button Co-authored-by: JoeProgrammer88 <7156063+JoeProgrammer88@users.noreply.github.com> Agent-Logs-Url: https://github.com/SpeakingInBits/TaskManagerWeb/sessions/41c5edf3-b3c3-4a12-9769-e45daadcdaab --- .gitignore | 1 + e2e/app.spec.ts | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ index.html | 1 + js/app.d.ts.map | 2 +- js/app.js | 55 +++++++++++++++++++++++++++++++++++++++--- src/app.ts | 55 +++++++++++++++++++++++++++++++++++++++--- 6 files changed, 171 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 95c7104..065d44a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ playwright-report/ # Misc .DS_Store +js/ diff --git a/e2e/app.spec.ts b/e2e/app.spec.ts index eae98c6..9cfde54 100644 --- a/e2e/app.spec.ts +++ b/e2e/app.spec.ts @@ -451,4 +451,68 @@ test.describe('Task Manager App', () => { expect(value).toBe('50'); }); }); + + // ======================== + // Filter Settings Persistence + // ======================== + test.describe('filter settings persistence', () => { + test.beforeEach(async ({ page }) => { + await page.click('[data-tab="tasks"]'); + }); + + test('should show the Reset Filters button', async ({ page }) => { + await expect(page.locator('#resetFiltersBtn')).toBeVisible(); + }); + + test('should persist status filter across page reloads', async ({ page }) => { + await page.selectOption('#statusFilter', 'completed'); + await page.reload(); + await page.waitForSelector('.header'); + await page.click('[data-tab="tasks"]'); + const value = await page.locator('#statusFilter').inputValue(); + expect(value).toBe('completed'); + }); + + test('should persist groupBy filter across page reloads', async ({ page }) => { + await page.selectOption('#groupBySelect', 'priority'); + await page.reload(); + await page.waitForSelector('.header'); + await page.click('[data-tab="tasks"]'); + const value = await page.locator('#groupBySelect').inputValue(); + expect(value).toBe('priority'); + }); + + test('should persist hideCompleted state across page reloads', async ({ page }) => { + await page.click('#hideCompletedBtn'); + await expect(page.locator('#hideCompletedBtn')).toContainText('Show Completed'); + await page.reload(); + await page.waitForSelector('.header'); + await page.click('[data-tab="tasks"]'); + await expect(page.locator('#hideCompletedBtn')).toContainText('Show Completed'); + }); + + test('should reset all filters when Reset Filters is clicked', async ({ page }) => { + await page.selectOption('#statusFilter', 'pending'); + await page.selectOption('#groupBySelect', 'category'); + await page.click('#hideCompletedBtn'); + + await page.click('#resetFiltersBtn'); + + const statusValue = await page.locator('#statusFilter').inputValue(); + const groupByValue = await page.locator('#groupBySelect').inputValue(); + expect(statusValue).toBe(''); + expect(groupByValue).toBe(''); + await expect(page.locator('#hideCompletedBtn')).toContainText('Hide Completed'); + }); + + test('should not restore filters after reset and reload', async ({ page }) => { + await page.selectOption('#statusFilter', 'pending'); + await page.click('#resetFiltersBtn'); + await page.reload(); + await page.waitForSelector('.header'); + await page.click('[data-tab="tasks"]'); + const value = await page.locator('#statusFilter').inputValue(); + expect(value).toBe(''); + }); + }); }); diff --git a/index.html b/index.html index 181a891..fed2e2a 100644 --- a/index.html +++ b/index.html @@ -149,6 +149,7 @@

Tasks

+ diff --git a/js/app.d.ts.map b/js/app.d.ts.map index da2d55c..5efcff5 100644 --- a/js/app.d.ts.map +++ b/js/app.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/js/app.js b/js/app.js index 5fc3ec4..44d050d 100644 --- a/js/app.js +++ b/js/app.js @@ -2,6 +2,7 @@ // Main Application Logic // ======================== import { storage, STORAGE_VERSION, getDaysUntilDueText } from './storage.js'; +const FILTER_SETTINGS_KEY = 'taskManagerFilterSettings'; class TaskManager { constructor() { this.currentEditingTaskId = null; @@ -44,6 +45,7 @@ class TaskManager { this.setupEventListeners(); this.initializeFinanceDateFilter(); this.updateDateNavigator(); + this.loadFilterSettings(); this.render(); this.processRecurringTasks(); } @@ -65,11 +67,12 @@ class TaskManager { document.getElementById('taskCategory').addEventListener('change', (e) => this.handleCategoryChange('task', e.target.value)); document.getElementById('taskCategorySave').addEventListener('click', () => this.handleAddCategory('task')); document.getElementById('taskCategoryCancel').addEventListener('click', () => this.cancelAddCategory('task')); - document.getElementById('categoryFilter').addEventListener('change', () => this.filterTasks()); - document.getElementById('statusFilter').addEventListener('change', () => this.filterTasks()); - document.getElementById('groupBySelect').addEventListener('change', () => this.filterTasks()); + document.getElementById('categoryFilter').addEventListener('change', () => { this.filterTasks(); this.saveFilterSettings(); }); + document.getElementById('statusFilter').addEventListener('change', () => { this.filterTasks(); this.saveFilterSettings(); }); + document.getElementById('groupBySelect').addEventListener('change', () => { this.filterTasks(); this.saveFilterSettings(); }); document.getElementById('searchTasks').addEventListener('input', () => this.filterTasks()); document.getElementById('hideCompletedBtn').addEventListener('click', () => this.toggleHideCompleted()); + document.getElementById('resetFiltersBtn').addEventListener('click', () => this.resetFilters()); // Projects section document.getElementById('addProjectBtn').addEventListener('click', () => this.openProjectModal()); document.getElementById('projectForm').addEventListener('submit', (e) => this.saveProject(e)); @@ -175,6 +178,7 @@ class TaskManager { document.getElementById('todayTasksItem').addEventListener('click', () => this.switchTab('tasks')); document.getElementById('overdueTasksItem').addEventListener('click', () => { document.getElementById('statusFilter').value = 'overdue'; + this.saveFilterSettings(); this.switchTab('tasks'); }); // Date navigator @@ -384,9 +388,54 @@ class TaskManager { // Tasks Management toggleHideCompleted() { this.hideCompleted = !this.hideCompleted; + this.updateHideCompletedBtn(); + this.filterTasks(); + this.saveFilterSettings(); + } + updateHideCompletedBtn() { const btn = document.getElementById('hideCompletedBtn'); btn.textContent = this.hideCompleted ? '👁 Show Completed' : '👁 Hide Completed'; btn.classList.toggle('active', this.hideCompleted); + } + saveFilterSettings() { + const categoryFilter = document.getElementById('categoryFilter').value; + const statusFilter = document.getElementById('statusFilter').value; + const groupBy = document.getElementById('groupBySelect').value; + const settings = { categoryFilter, statusFilter, groupBy, hideCompleted: this.hideCompleted }; + localStorage.setItem(FILTER_SETTINGS_KEY, JSON.stringify(settings)); + } + loadFilterSettings() { + const raw = localStorage.getItem(FILTER_SETTINGS_KEY); + if (!raw) + return; + try { + const settings = JSON.parse(raw); + const categoryFilter = document.getElementById('categoryFilter'); + const statusFilter = document.getElementById('statusFilter'); + const groupBySelect = document.getElementById('groupBySelect'); + if (settings.categoryFilter !== undefined) + categoryFilter.value = settings.categoryFilter; + if (settings.statusFilter !== undefined) + statusFilter.value = settings.statusFilter; + if (settings.groupBy !== undefined) + groupBySelect.value = settings.groupBy; + if (settings.hideCompleted) { + this.hideCompleted = true; + this.updateHideCompletedBtn(); + } + } + catch { + localStorage.removeItem(FILTER_SETTINGS_KEY); + } + } + resetFilters() { + document.getElementById('categoryFilter').value = ''; + document.getElementById('statusFilter').value = ''; + document.getElementById('groupBySelect').value = ''; + document.getElementById('searchTasks').value = ''; + this.hideCompleted = false; + this.updateHideCompletedBtn(); + localStorage.removeItem(FILTER_SETTINGS_KEY); this.filterTasks(); } // ======================== diff --git a/src/app.ts b/src/app.ts index ac5f565..cd0d89b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,6 +4,8 @@ import { StorageManager, storage, STORAGE_VERSION, Task, Habit, FinanceItem, WishItem, Note, getDaysUntilDueText } from './storage.js'; +const FILTER_SETTINGS_KEY = 'taskManagerFilterSettings'; + interface Activity { type: string; message: string; @@ -59,6 +61,7 @@ class TaskManager { this.setupEventListeners(); this.initializeFinanceDateFilter(); this.updateDateNavigator(); + this.loadFilterSettings(); this.render(); this.processRecurringTasks(); } @@ -82,11 +85,12 @@ class TaskManager { document.getElementById('taskCategory')!.addEventListener('change', (e) => this.handleCategoryChange('task', (e.target as HTMLSelectElement).value)); document.getElementById('taskCategorySave')!.addEventListener('click', () => this.handleAddCategory('task')); document.getElementById('taskCategoryCancel')!.addEventListener('click', () => this.cancelAddCategory('task')); - document.getElementById('categoryFilter')!.addEventListener('change', () => this.filterTasks()); - document.getElementById('statusFilter')!.addEventListener('change', () => this.filterTasks()); - document.getElementById('groupBySelect')!.addEventListener('change', () => this.filterTasks()); + document.getElementById('categoryFilter')!.addEventListener('change', () => { this.filterTasks(); this.saveFilterSettings(); }); + document.getElementById('statusFilter')!.addEventListener('change', () => { this.filterTasks(); this.saveFilterSettings(); }); + document.getElementById('groupBySelect')!.addEventListener('change', () => { this.filterTasks(); this.saveFilterSettings(); }); document.getElementById('searchTasks')!.addEventListener('input', () => this.filterTasks()); document.getElementById('hideCompletedBtn')!.addEventListener('click', () => this.toggleHideCompleted()); + document.getElementById('resetFiltersBtn')!.addEventListener('click', () => this.resetFilters()); // Projects section document.getElementById('addProjectBtn')!.addEventListener('click', () => this.openProjectModal()); @@ -207,6 +211,7 @@ class TaskManager { document.getElementById('todayTasksItem')!.addEventListener('click', () => this.switchTab('tasks')); document.getElementById('overdueTasksItem')!.addEventListener('click', () => { (document.getElementById('statusFilter') as HTMLSelectElement).value = 'overdue'; + this.saveFilterSettings(); this.switchTab('tasks'); }); @@ -432,9 +437,53 @@ class TaskManager { // Tasks Management toggleHideCompleted(): void { this.hideCompleted = !this.hideCompleted; + this.updateHideCompletedBtn(); + this.filterTasks(); + this.saveFilterSettings(); + } + + updateHideCompletedBtn(): void { const btn = document.getElementById('hideCompletedBtn')!; btn.textContent = this.hideCompleted ? '👁 Show Completed' : '👁 Hide Completed'; btn.classList.toggle('active', this.hideCompleted); + } + + saveFilterSettings(): void { + const categoryFilter = (document.getElementById('categoryFilter') as HTMLSelectElement).value; + const statusFilter = (document.getElementById('statusFilter') as HTMLSelectElement).value; + const groupBy = (document.getElementById('groupBySelect') as HTMLSelectElement).value; + const settings = { categoryFilter, statusFilter, groupBy, hideCompleted: this.hideCompleted }; + localStorage.setItem(FILTER_SETTINGS_KEY, JSON.stringify(settings)); + } + + loadFilterSettings(): void { + const raw = localStorage.getItem(FILTER_SETTINGS_KEY); + if (!raw) return; + try { + const settings = JSON.parse(raw); + const categoryFilter = document.getElementById('categoryFilter') as HTMLSelectElement; + const statusFilter = document.getElementById('statusFilter') as HTMLSelectElement; + const groupBySelect = document.getElementById('groupBySelect') as HTMLSelectElement; + if (settings.categoryFilter !== undefined) categoryFilter.value = settings.categoryFilter; + if (settings.statusFilter !== undefined) statusFilter.value = settings.statusFilter; + if (settings.groupBy !== undefined) groupBySelect.value = settings.groupBy; + if (settings.hideCompleted) { + this.hideCompleted = true; + this.updateHideCompletedBtn(); + } + } catch { + localStorage.removeItem(FILTER_SETTINGS_KEY); + } + } + + resetFilters(): void { + (document.getElementById('categoryFilter') as HTMLSelectElement).value = ''; + (document.getElementById('statusFilter') as HTMLSelectElement).value = ''; + (document.getElementById('groupBySelect') as HTMLSelectElement).value = ''; + (document.getElementById('searchTasks') as HTMLInputElement).value = ''; + this.hideCompleted = false; + this.updateHideCompletedBtn(); + localStorage.removeItem(FILTER_SETTINGS_KEY); this.filterTasks(); }