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();
}