Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/update-cache-version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
paths:
- 'index.html'
- 'css/**'
- 'js/**'
- 'src/**'
- 'manifest.json'

jobs:
Expand Down
7 changes: 3 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
# Dependencies
node_modules/

# TypeScript build output
js/*.js
js/*.js.map
js/*.d.ts
# TypeScript build output (compiled at deploy time, not committed)
js/

# Playwright
test-results/
playwright-report/

# Misc
.DS_Store
js/
64 changes: 64 additions & 0 deletions e2e/app.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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('');
});
});
});
8 changes: 8 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ <h2>Tasks</h2>
</select>
<input type="text" id="searchTasks" class="filter-input" placeholder="Search tasks...">
<button class="btn btn-secondary" id="hideCompletedBtn">👁 Hide Completed</button>
<button class="btn btn-secondary" id="resetFiltersBtn">↺ Reset Filters</button>
</div>

<!-- Task List -->
Expand Down Expand Up @@ -476,12 +477,14 @@ <h2>Finances</h2>

<!-- Date Range Filter -->
<div class="filters" style="margin-bottom: 1rem;">
<button class="btn btn-secondary" id="prevMonthBtn" style="margin-right: 0.5rem;">&#8249; Prev</button>
<label style="margin-right: 0.5rem;">From:</label>
<input type="date" id="financeStartDate" class="filter-input" style="width: auto;">
<label style="margin-left: 1rem; margin-right: 0.5rem;">To:</label>
<input type="date" id="financeEndDate" class="filter-input" style="width: auto;">
<button class="btn btn-secondary" id="filterFinancesBtn" style="margin-left: 0.5rem;">Apply</button>
<button class="btn btn-secondary" id="resetFinanceFilterBtn" style="margin-left: 0.5rem;">This Month</button>
<button class="btn btn-secondary" id="nextMonthBtn" style="margin-left: 0.5rem;">Next &#8250;</button>
</div>

<!-- Tabs for Expenses, Revenue, Other Charges -->
Expand Down Expand Up @@ -743,6 +746,11 @@ <h3>Data Management</h3>
<input type="file" id="importFile" accept=".json" style="display: none;">
<button class="btn btn-secondary" id="importBtn">Upload JSON</button>
</div>
<div class="setting-item">
<label>Migrate Data</label>
<button class="btn btn-secondary" id="migrateBtn">Migrate to Latest Version</button>
<p style="margin: 0.5rem 0 0 0; font-size: 0.85rem; color: #666;">Ensures all data is in the latest format. Safe to run at any time.</p>
</div>
<div class="setting-item">
<label>Clear All Data</label>
<button class="btn btn-danger" id="clearDataBtn">Clear Local Storage</button>
Expand Down
1 change: 0 additions & 1 deletion js/app.d.ts.map

This file was deleted.

Loading
Loading