Skip to content
Open
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
21 changes: 21 additions & 0 deletions frontend/src/lib/pages/dashboard-personal.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
import * as Card from "$lib/components/ui/card";
import type { Task, Project } from "$lib/types/api";
import { ACTIVE_STATUSES } from "$lib/types/api";
import { getSnapshot, saveSnapshot } from "$lib/stores/task-filters.svelte";

let { params = {} }: { params?: Record<string, string> } = $props();

const ROUTE_KEY = "/dashboard";

let createdTasks = $state<Task[]>([]);
let assignedTasks = $state<Task[]>([]);
let projects = $state<Project[]>([]);
Expand All @@ -25,6 +28,14 @@
let searchQuery = $state("");
let sort = $state("-created_at");

let saved = getSnapshot(ROUTE_KEY);
if (saved) {
filterProject = saved.filterProject ?? "";
filterStatuses = saved.filterStatuses;
filterPriorities = saved.filterPriorities;
sort = saved.sort;
}

function toggleStatus(s: string) {
if (filterStatuses.includes(s)) {
filterStatuses = filterStatuses.filter((x) => x !== s);
Expand Down Expand Up @@ -60,6 +71,16 @@
navigate(`/tasks/${task.id}`);
}

$effect(() => {
saveSnapshot(ROUTE_KEY, {
filterProject: filterProject || undefined,
filterStatuses: [...filterStatuses],
filterPriorities: [...filterPriorities],
sort,
offset: 0,
});
});

$effect(() => {
loading = true;
error = "";
Expand Down
22 changes: 22 additions & 0 deletions frontend/src/lib/pages/dashboard-tasks.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@
import { Button } from "$lib/components/ui/button";
import type { Project, Task } from "$lib/types/api";
import { ACTIVE_STATUSES } from "$lib/types/api";
import { getSnapshot, saveSnapshot } from "$lib/stores/task-filters.svelte";

let { params = {} }: { params?: Record<string, string> } = $props();

const ROUTE_KEY = "/dashboard/all";

let tasks = $state<Task[]>([]);
let total = $state(0);
let projects = $state<Project[]>([]);
Expand All @@ -28,6 +31,15 @@
let offset = $state(0);
const limit = 50;

let saved = getSnapshot(ROUTE_KEY);
if (saved) {
filterProject = saved.filterProject ?? "";
filterStatuses = saved.filterStatuses;
filterPriorities = saved.filterPriorities;
sort = saved.sort;
offset = saved.offset;
}

function toggleStatus(s: string) {
if (filterStatuses.includes(s)) {
filterStatuses = filterStatuses.filter((x) => x !== s);
Expand Down Expand Up @@ -98,6 +110,16 @@

$effect(load);

$effect(() => {
saveSnapshot(ROUTE_KEY, {
filterProject: filterProject || undefined,
filterStatuses: [...filterStatuses],
filterPriorities: [...filterPriorities],
sort,
offset,
});
});

function handleTaskClick(task: Task) {
navigate(`/tasks/${task.id}`);
}
Expand Down
27 changes: 27 additions & 0 deletions frontend/src/lib/pages/project-tasks.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,20 @@
import { Button } from "$lib/components/ui/button";
import type { Project, Task } from "$lib/types/api";
import { ACTIVE_STATUSES } from "$lib/types/api";
import { getSnapshot, saveSnapshot } from "$lib/stores/task-filters.svelte";

// svelte-ignore a11y_click_events_have_key_events

let { params = {} }: { params?: Record<string, string> } = $props();
let slug = $derived(params.slug || "");
let routeKey = $derived(`/projects/${slug}`);

let project = $state<Project | null>(null);
let tasks = $state<Task[]>([]);
let total = $state(0);
let loading = $state(true);
let error = $state("");
let currentRouteKey = $state("");
let sort = $state("-created_at");
let offset = $state(0);
const limit = 50;
Expand All @@ -31,6 +34,19 @@
let filterPriorities = $state<string[]>([]);
let searchQuery = $state("");

$effect(() => {
const saved = getSnapshot(routeKey);
if (saved) {
filterStatuses = saved.filterStatuses;
filterPriorities = saved.filterPriorities;
sort = saved.sort;
offset = saved.offset;
} else {
searchQuery = "";
sort = "-created_at";
}
});

function toggleStatus(s: string) {
if (filterStatuses.includes(s)) {
filterStatuses = filterStatuses.filter((x) => x !== s);
Expand Down Expand Up @@ -78,12 +94,23 @@
error = e.message || "Failed to load data";
})
.finally(() => {
currentRouteKey = routeKey;
loading = false;
});
}

$effect(load);

$effect(() => {
if (routeKey !== currentRouteKey) return;
saveSnapshot(routeKey, {
filterStatuses: [...filterStatuses],
filterPriorities: [...filterPriorities],
sort,
offset,
});
});

Comment thread
capcom6 marked this conversation as resolved.
function handleSort(field: string) {
sort = sort === field ? `-${field}` : field;
offset = 0;
Expand Down
21 changes: 21 additions & 0 deletions frontend/src/lib/stores/task-filters.svelte.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export type FilterSnapshot = {
filterProject?: string
filterStatuses: string[]
filterPriorities: string[]
sort: string
offset: number
}

let store = $state<Record<string, FilterSnapshot>>({})

export function getSnapshot(path: string): FilterSnapshot | null {
return store[path] ?? null
}

export function saveSnapshot(path: string, snapshot: FilterSnapshot): void {
store[path] = snapshot
}

export function clearSnapshot(path: string): void {
delete store[path]
}
Loading