From 16df2e4ae05195d77174d8650d3d10d86daa613c Mon Sep 17 00:00:00 2001 From: Henry Bui Date: Thu, 28 Nov 2024 12:06:28 -0500 Subject: [PATCH 01/49] move DEFAULT_DELEGATES into `$lib/delegate_presets` --- src/lib/delegate_presets/index.ts | 22 +++++++++++++--------- src/lib/stores/settings.ts | 3 +-- src/routes/admin/settings/+page.svelte | 6 +++--- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/lib/delegate_presets/index.ts b/src/lib/delegate_presets/index.ts index 87d0afd..f93124d 100644 --- a/src/lib/delegate_presets/index.ts +++ b/src/lib/delegate_presets/index.ts @@ -1,4 +1,15 @@ import type { DelegateAttrs } from "$lib/types"; +import DEFAULT_DELEGATES_JSON from "$lib/delegate_presets/preset-un.json"; + +type DelProperties = Record; +/** + * The object of default delegates. + */ +export const DEFAULT_DELEGATES: DelProperties = DEFAULT_DELEGATES_JSON; +/** + * The key of the default preset. + */ +export const DEFAULT_PRESET_KEY = "un"; /** * All defined presets. @@ -16,22 +27,15 @@ export const PRESETS = { */ const NO_PRESET: readonly (keyof typeof PRESETS)[] = ["custom"]; -/** - * @returns the default preset key (the first one defined on the object). - */ -export function defaultPresetKey(): keyof typeof PRESETS { - return (Object.keys(PRESETS) as (keyof typeof PRESETS)[])[0]; -} - /** * Gets the preset data at a given file key. * @param file the preset key (must be a key in `PRESETS`) * @returns the preset data (if it exists) * @throws if key is not in `PRESETS` or JSON is invalid or doesn't exist */ -export async function getPreset(key: keyof typeof PRESETS) { +export async function getPreset(key: keyof typeof PRESETS): Promise { if (!NO_PRESET.includes(key)) { const { default: json } = await import(`$lib/delegate_presets/preset-${key}.json`); - return structuredClone>(json); + return structuredClone(json); } } diff --git a/src/lib/stores/settings.ts b/src/lib/stores/settings.ts index f5853e3..4666b32 100644 --- a/src/lib/stores/settings.ts +++ b/src/lib/stores/settings.ts @@ -1,5 +1,4 @@ -// We're assuming preset-un.json exists and is the default. -import DEFAULT_DELEGATES from "$lib/delegate_presets/preset-un.json"; +import { DEFAULT_DELEGATES } from "$lib/delegate_presets"; import { DEFAULT_SORT_PRIORITY } from "$lib/motions/definitions"; import type { AccessibleSettings, Settings } from "$lib/types"; import { derived, readonly } from "svelte/store"; diff --git a/src/routes/admin/settings/+page.svelte b/src/routes/admin/settings/+page.svelte index 0f00e6f..616b1c7 100644 --- a/src/routes/admin/settings/+page.svelte +++ b/src/routes/admin/settings/+page.svelte @@ -3,7 +3,7 @@ import MetaTags from "$lib/components/MetaTags.svelte"; import DelLabel from "$lib/components/del-label/DelLabel.svelte"; import EditDelegateCard from "$lib/components/modals/EditDelegateCard.svelte"; - import { defaultPresetKey, getPreset, PRESETS } from "$lib/delegate_presets"; + import { DEFAULT_PRESET_KEY, getPreset, PRESETS } from "$lib/delegate_presets"; import { SORT_KIND_NAMES, SORT_PROPERTY_NAMES } from "$lib/motions/sort"; import { getSettingsContext, resetSettingsContext } from "$lib/stores/settings"; import type { DelegateAttrs, Preferences } from "$lib/types"; @@ -53,7 +53,7 @@ "Are you sure you want to reset all settings?", () => { // Reset preset state cause it's not bound to settings - currentPreset = defaultPresetKey(); + currentPreset = DEFAULT_PRESET_KEY; // Reset settings resetSettingsContext(settings); } @@ -87,7 +87,7 @@ }); } // DELEGATES - let currentPreset: keyof typeof PRESETS = $state(defaultPresetKey()); + let currentPreset: keyof typeof PRESETS = $state(DEFAULT_PRESET_KEY); async function setPreset() { const preset = await getPreset(currentPreset); if (typeof preset !== "undefined") { From 3eefa947b224a68c138cd526fc6b98e6a2f39e5e Mon Sep 17 00:00:00 2001 From: Henry Bui Date: Thu, 28 Nov 2024 11:17:26 -0500 Subject: [PATCH 02/49] add Dexie dependency --- package-lock.json | 7 +++++++ package.json | 1 + pnpm-lock.yaml | 8 ++++++++ 3 files changed, 16 insertions(+) diff --git a/package-lock.json b/package-lock.json index 41c85b9..89754f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "dependencies": { "@floating-ui/dom": "^1.6.12", + "dexie": "^4.0.10", "svelte-dnd-action": "^0.9.52", "svelte-persisted-store": "^0.11.0", "zod": "^3.23.8" @@ -1378,6 +1379,12 @@ "dev": true, "license": "MIT" }, + "node_modules/dexie": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.0.10.tgz", + "integrity": "sha512-eM2RzuR3i+M046r2Q0Optl3pS31qTWf8aFuA7H9wnsHTwl8EPvroVLwvQene/6paAs39Tbk6fWZcn2aZaHkc/w==", + "license": "Apache-2.0" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", diff --git a/package.json b/package.json index a627a4c..0ed0cb8 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "type": "module", "dependencies": { "@floating-ui/dom": "^1.6.12", + "dexie": "^4.0.10", "svelte-dnd-action": "^0.9.52", "svelte-persisted-store": "^0.11.0", "zod": "^3.23.8" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55cb759..41216bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@floating-ui/dom': specifier: ^1.6.12 version: 1.6.12 + dexie: + specifier: ^4.0.10 + version: 4.0.10 svelte-dnd-action: specifier: ^0.9.52 version: 0.9.52(svelte@5.2.10) @@ -550,6 +553,9 @@ packages: devalue@5.1.1: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + dexie@4.0.10: + resolution: {integrity: sha512-eM2RzuR3i+M046r2Q0Optl3pS31qTWf8aFuA7H9wnsHTwl8EPvroVLwvQene/6paAs39Tbk6fWZcn2aZaHkc/w==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -1413,6 +1419,8 @@ snapshots: devalue@5.1.1: {} + dexie@4.0.10: {} + didyoumean@1.2.2: {} dlv@1.1.3: {} From bb0da940081f9a37e858848125a83986fbdeb18d Mon Sep 17 00:00:00 2001 From: Henry Bui Date: Thu, 28 Nov 2024 11:17:51 -0500 Subject: [PATCH 03/49] start DB setup --- src/lib/db/index.ts | 45 ++++++++++++++++++++++++++ src/routes/admin/settings/+page.svelte | 10 ++++-- 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 src/lib/db/index.ts diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts new file mode 100644 index 0000000..8785331 --- /dev/null +++ b/src/lib/db/index.ts @@ -0,0 +1,45 @@ +import { DEFAULT_DELEGATES } from "$lib/delegate_presets"; +import { getFlagUrl } from "$lib/flags/flagcdn"; +import type { DelegatePresence, StatsData } from "$lib/types"; +import { Dexie, type EntityTable } from "dexie"; + +interface Delegate { + // Indexes: + id: number, + name: string, + aliases: string[] + + // Non-indexes: + order: number, + enabled: boolean, + flagURL: string, + presence: DelegatePresence, + stats: StatsData +} +interface SessionDatabase extends Dexie { + delegates: EntityTable +} + +export const db = new Dexie("sessionDatabase") as SessionDatabase; +db.version(1).stores({ + delegates: "++id, name, *aliases" +}); +db.on("populate", (tx) => { + let { delegates }: { delegates: SessionDatabase["delegates"] } = tx as any; + delegates.bulkAdd( + Object.entries(DEFAULT_DELEGATES) + .map(([key, { name, aliases, flagURL }], i) => ({ + name, aliases, + order: i, + enabled: true, + flagURL: flagURL ?? getFlagUrl(key)?.toString() ?? getFlagUrl("un")!.toString(), + presence: "NP", + stats: { + motionsProposed: 0, + motionsAccepted: 0, + timesSpoken: 0, + durationSpoken: 0 + } + })) + ) +}); \ No newline at end of file diff --git a/src/routes/admin/settings/+page.svelte b/src/routes/admin/settings/+page.svelte index 616b1c7..8b5a8f3 100644 --- a/src/routes/admin/settings/+page.svelte +++ b/src/routes/admin/settings/+page.svelte @@ -13,6 +13,8 @@ import Icon from "@iconify/svelte"; import { FileButton, getModalStore } from "@skeletonlabs/skeleton"; import EnableDelegatesCard from "$lib/components/modals/EnableDelegatesCard.svelte"; + import { liveQuery } from "dexie"; + import { db } from "$lib/db"; const settings = getSettingsContext(); const { delegateAttributes, sortOrder, delegatesEnabled, preferences } = settings; @@ -185,6 +187,8 @@ return $attrs; }) } + + let delegates = liveQuery(() => db.delegates.toCollection().sortBy("order")); @@ -314,14 +318,16 @@ - {#each Object.entries($delegateAttributes) as [key, attrs] (key)} + {#each ($delegates ?? []) as attrs (attrs.id)} + + {@const key = String(attrs.id)} {key} - +