From 068c7961ae223324b827c9db71293fa5ad88485d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 14 May 2024 16:07:25 +0200 Subject: [PATCH 1/9] ci: set fetch-depth to 1 to extract tag messages --- .forgejo/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index e6dfd6e..dc1114b 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -67,7 +67,7 @@ jobs: - name: 👁️ Checkout repository uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 1 # important to fetch tag logs - name: 📦 pnpm install run: pnpm install From f76e7fd97f62d9b41ecbabc3334c2c1876be253d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 14 May 2024 16:28:23 +0200 Subject: [PATCH 2/9] fix: escape HTML for licenses file --- src/app.html | 2 +- vite.config.ts | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/app.html b/src/app.html index 5f0dd88..50038b5 100644 --- a/src/app.html +++ b/src/app.html @@ -1,5 +1,5 @@ - + diff --git a/vite.config.ts b/vite.config.ts index 9d34322..195765a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -23,7 +23,8 @@ export default defineConfig({ createViteLicensePlugin({ additionalFiles: { "oss-licenses.html": (packages) => { - let res = ` + let res = ` + Visitenbuch - Lizenzen @@ -31,6 +32,12 @@ export default defineConfig({

Open-Source-Lizenzen

JSON-formatted license list `; + const escapeHTML = (s: string | null) => s ? s.replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'") : ""; + for (const _p of packages) { type LicenseMetaExt = LicenseMeta & { repository: string | null, @@ -54,13 +61,13 @@ export default defineConfig({ } res += `
\n`; - res += `

${p.name}

\n`; + res += `

${escapeHTML(p.name)}

\n`; res += `\n`; - res += `\n`; - if (aut) res += `\n`; - res += `\n`; - if (repoUrl) res += `\n`; - else if (rp) res += `\n`; + res += `\n`; + if (aut) res += `\n`; + res += `\n`; + if (repoUrl) res += `\n`; + else if (rp) res += `\n`; res += `
Version:${p.version}
Author:${aut}
License:${p.license}
Repository:${repoUrl}
Repository:${rp}
Version:${escapeHTML(p.version)}
Author:${escapeHTML(aut)}
License:${escapeHTML(p.license)}
Repository:${escapeHTML(repoUrl)}
Repository:${escapeHTML(rp)}
\n`; res += "
"; } From d5e9a9469f0c57939367141985a97d8404fd6fbe Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 14 May 2024 22:51:20 +0200 Subject: [PATCH 3/9] fix: use btn-id class for all tables --- src/lib/components/table/PatientTable.svelte | 2 +- src/routes/(app)/rooms/+page.svelte | 2 +- src/routes/(app)/stations/+page.svelte | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/components/table/PatientTable.svelte b/src/lib/components/table/PatientTable.svelte index b4ecfed..57f1fbe 100644 --- a/src/lib/components/table/PatientTable.svelte +++ b/src/lib/components/table/PatientTable.svelte @@ -37,7 +37,7 @@ > {patient.id} {#each data.rooms as room (room.id)} - {room.name} + {room.name} {room.station.name} {/each} diff --git a/src/routes/(app)/stations/+page.svelte b/src/routes/(app)/stations/+page.svelte index 010080e..e94e7bf 100644 --- a/src/routes/(app)/stations/+page.svelte +++ b/src/routes/(app)/stations/+page.svelte @@ -27,7 +27,7 @@ {#each data.stations as station (station.id)} - {station.name} + {station.name} {/each} From a4eebb944f55da8e87cc899eebada0bd3fd37aa8 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 16 May 2024 17:29:22 +0200 Subject: [PATCH 4/9] fix: avoid global state, use context for savedFilters --- .forgejo/workflows/ci.yaml | 1 + src/lib/components/filter/SavedFilters.svelte | 4 +++- src/lib/stores/index.ts | 5 ++++- src/routes/(app)/+layout.svelte | 8 +++++++- src/routes/(app)/+page.svelte | 4 +++- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index dc1114b..d2ea852 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -50,6 +50,7 @@ jobs: id: e2etest run: | pnpm run build -l silent + npx playwright install chromium pnpm run test:e2e - name: 💢 Upload E2E report if: ${{ failure() && steps.e2etest.conclusion == 'failure' }} diff --git a/src/lib/components/filter/SavedFilters.svelte b/src/lib/components/filter/SavedFilters.svelte index 5854b2b..20baa2c 100644 --- a/src/lib/components/filter/SavedFilters.svelte +++ b/src/lib/components/filter/SavedFilters.svelte @@ -8,12 +8,14 @@ import { toastError, toastInfo } from "$lib/shared/util/toast"; import Icon from "$lib/components/ui/Icon.svelte"; - import { savedFilters } from "$lib/stores"; + import { getSavedFilters } from "$lib/stores"; import Chip from "./SavedFilterChip.svelte"; export let view: string; + const savedFilters = getSavedFilters(); + $: filters = $savedFilters[view] ?? []; function getQuery(): string { diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index 556cc5d..8d2e2c8 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -1,3 +1,4 @@ +import { getContext } from "svelte"; import { derived, writable, type Writable } from "svelte/store"; import type { SavedFilter } from "$lib/shared/model"; @@ -6,4 +7,6 @@ import type { SavedFilter } from "$lib/shared/model"; export const screenWidth = writable(0); export const screenWidthSmall = derived(screenWidth, ($mainWidth) => $mainWidth < 500); -export const savedFilters: Writable> = writable({}); +// Context key: "savedFilters" +export type SavedFilters = Writable>; +export const getSavedFilters: () => SavedFilters = () => getContext("savedFilters"); diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index ef24f7a..8d10a77 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -3,16 +3,22 @@ import type { LayoutData } from "./$types"; import { mdiAccount, mdiHome } from "@mdi/js"; + import { setContext } from "svelte"; + import { writable } from "svelte/store"; import { defaultFilterUrl, defaultVisitUrl } from "$lib/shared/util"; import Icon from "$lib/components/ui/Icon.svelte"; import NavLink from "$lib/components/ui/NavLink.svelte"; - import { savedFilters } from "$lib/stores"; + import type { SavedFilters } from "$lib/stores"; export let data: LayoutData; + const savedFilters: SavedFilters = writable(); + $: savedFilters.set(data.savedFilters); + + setContext("savedFilters", savedFilters); From cdb344609cde80084876faea9f80e7b26b01d0f2 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 16 May 2024 18:47:16 +0200 Subject: [PATCH 6/9] fix: remove process.on hooks (not necessary) --- src/hooks.server.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/hooks.server.ts b/src/hooks.server.ts index a7fddf5..87c81a0 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -31,7 +31,3 @@ export const handle = sequence( authorization, createTRPCHandle({ router, createContext }), ); - -// Allow server application to exit -process.on("SIGINT", () => process.exit()); // Ctrl+C -process.on("SIGTERM", () => process.exit()); // docker stop From 88a5040f9c4e19ae3efb5ad0894c8dc5b905a92e Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 16 May 2024 19:42:26 +0200 Subject: [PATCH 7/9] fix: autocomplete not closing on tab --- src/lib/components/filter/Autocomplete.svelte | 51 ++++++++----------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/src/lib/components/filter/Autocomplete.svelte b/src/lib/components/filter/Autocomplete.svelte index 035b387..7a20f6d 100644 --- a/src/lib/components/filter/Autocomplete.svelte +++ b/src/lib/components/filter/Autocomplete.svelte @@ -166,6 +166,14 @@ if (opened) { onClose(kb); } + // select remaining item if autoselect is enabled + if (!selection) { + if (!noAutoselect1 && filteredItems.length === 1) { + selectListItem(filteredItems[0], true); + } else { + setInputValue(""); + } + } opened = false; } @@ -185,43 +193,38 @@ } function onKeyDown(e: KeyboardEvent): void { - let { key } = e; - if (key === "Tab" && e.shiftKey) key = "ShiftTab"; - const fnmap: Record void> = { - Tab: () => close, - ShiftTab: () => close, - ArrowDown: () => { + switch (e.key) { + case "Tab": + close(); + break; + case "ArrowDown": open(); if (highlightIndex < filteredItems.length - 1) { highlightIndex++; highlight(); } - }, - ArrowUp: () => { + break; + case "ArrowUp": open(); if (highlightIndex > 0) { highlightIndex--; highlight(); } - }, - Escape: () => { + break; + case "Escape": e.stopPropagation(); if (opened) { if (inputElm) inputElm.focus(); close(); } - }, - Backspace: () => { + break; + case "Backspace": if (inputValue().length === 0) { onBackspace(); } else if (selection) { clearSelection(); } - }, - }; - const fn = fnmap[key]; - if (typeof fn === "function") { - fn(); + break; } } @@ -234,17 +237,6 @@ } } - function onBlur(): void { - if (!selection) { - if (!noAutoselect1 && filteredItems.length === 1) { - selectListItem(filteredItems[0], true); - } else { - setInputValue(""); - } - } - close(true); - } - function highlight(): void { if (browser && opened) { window.setTimeout(() => { @@ -304,12 +296,11 @@ on:focus={open} on:keydown={onKeyDown} on:keypress={onKeyPress} - on:blur={onBlur} use:floatingRef /> {#if opened && filteredItems.length > 0} -
+
{#each filteredItems as item, i}
Date: Thu, 16 May 2024 20:19:55 +0200 Subject: [PATCH 8/9] feat: select table entries on doubleclick --- src/lib/components/table/EntryTable.svelte | 3 +++ src/lib/components/table/PatientTable.svelte | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/lib/components/table/EntryTable.svelte b/src/lib/components/table/EntryTable.svelte index 42c2990..4af0262 100644 --- a/src/lib/components/table/EntryTable.svelte +++ b/src/lib/components/table/EntryTable.svelte @@ -1,4 +1,6 @@