diff --git a/prisma/migrations/20240113221445_search_index/migration.sql b/prisma/migrations/20240113221445_search_index/migration.sql index cd6b5db..01b2f1f 100644 --- a/prisma/migrations/20240113221445_search_index/migration.sql +++ b/prisma/migrations/20240113221445_search_index/migration.sql @@ -33,4 +33,5 @@ EXECUTE PROCEDURE update_entry_tsvec (); ALTER TABLE patients ADD COLUMN full_name TEXT GENERATED ALWAYS AS (first_name || ' ' || last_name) STORED; +CREATE INDEX entries_tsvec ON entries USING GIN (tsvec); CREATE INDEX patients_full_name ON patients USING gin (full_name gin_trgm_ops); diff --git a/src/app.html b/src/app.html index 84ffad1..5f0dd88 100644 --- a/src/app.html +++ b/src/app.html @@ -6,7 +6,7 @@ %sveltekit.head% - +
%sveltekit.body%
diff --git a/src/lib/components/filter/Autocomplete.svelte b/src/lib/components/filter/Autocomplete.svelte index 64d535f..9f1f822 100644 --- a/src/lib/components/filter/Autocomplete.svelte +++ b/src/lib/components/filter/Autocomplete.svelte @@ -23,7 +23,7 @@ export let placeholder: string | undefined = undefined; export let padding = true; export let cls = ""; - export let inputCls = "w-full bg-transparent"; + export let inputCls = "w-full bg-transparent outline-none"; export let asTextInput = false; export let idInputName: string | undefined = undefined; diff --git a/src/lib/components/filter/FilterBar.svelte b/src/lib/components/filter/FilterBar.svelte index 1b481d6..b7bacfc 100644 --- a/src/lib/components/filter/FilterBar.svelte +++ b/src/lib/components/filter/FilterBar.svelte @@ -21,6 +21,7 @@ export let onUpdate: (filterData: FilterQdata | undefined) => void = () => {}; /** List of hidden filter IDs, can be specified for prefiltered views (e.g. by patient) */ export let hiddenFilters: string[] = []; + /** True if a separate search field should be displayed */ export let search = false; let autocomplete: Autocomplete | undefined; @@ -59,7 +60,9 @@ function updateFromQueryData(filterData: FilterQdata) { const filters: FilterData[] = []; for (const [id, value] of Object.entries(filterData)) { - if (hiddenFilters.includes(id)) continue; + // If filter is hidden or undefined, dont display it + if (hiddenFilters.includes(id) || !FILTERS[id]) continue; + // Extract search parameter if a separate search field is used if (search && id === "search") { searchVal = value.toString(); } else if (Array.isArray(value)) { @@ -183,10 +186,8 @@ } -
-
+
+
{#each activeFilters as fdata, i} { activeFilters = []; + searchVal = ""; updateFilter(); }} > @@ -239,3 +241,14 @@ {/if}
+ + diff --git a/src/lib/components/filter/FilterChip.svelte b/src/lib/components/filter/FilterChip.svelte index 82d9c62..6f9ee0e 100644 --- a/src/lib/components/filter/FilterChip.svelte +++ b/src/lib/components/filter/FilterChip.svelte @@ -32,9 +32,13 @@ autocomplete.open(); } + const TOFF = " aus"; + $: toggleState = fdata.selection?.toggle !== false; - $: filterName = toggleState ? filter.name : filter.toggleOff?.name; - $: filterIcon = toggleState ? filter.icon : filter.toggleOff?.icon; + $: filterName = toggleState + ? filter.name + : filter.toggleOff?.name ?? filter.name + TOFF; + $: filterIcon = toggleState ? filter.icon : filter.toggleOff?.icon ?? filter.icon; $: hasInputField = filter.inputType !== 0 && filter.inputType !== 3; diff --git a/src/lib/components/filter/filters.ts b/src/lib/components/filter/filters.ts index 4966925..6c8cfbf 100644 --- a/src/lib/components/filter/filters.ts +++ b/src/lib/components/filter/filters.ts @@ -2,6 +2,7 @@ import { trpc } from "$lib/shared/trpc"; import { mdiAccount, mdiAccountInjury, + mdiAccountMultipleOutline, mdiAccountRemoveOutline, mdiBedKingOutline, mdiCheckboxBlankOutline, @@ -118,4 +119,10 @@ export const PATIENT_FILTER: { [key: string]: FilterDef } = { icon: mdiAccountRemoveOutline, inputType: 0, }, + includeHidden: { + id: "includeHidden", + name: "Alle anzeigen", + icon: mdiAccountMultipleOutline, + inputType: 0, + }, }; diff --git a/src/lib/components/form/PatientForm.svelte b/src/lib/components/form/PatientForm.svelte index a519fab..d494b9a 100644 --- a/src/lib/components/form/PatientForm.svelte +++ b/src/lib/components/form/PatientForm.svelte @@ -6,6 +6,7 @@ import { superForm, superValidateSync } from "sveltekit-superforms/client"; import type { SuperValidated } from "sveltekit-superforms"; import { ZPatientNew } from "$lib/shared/model/validation"; + import { browser } from "$app/environment"; export let patient: RouterOutput["patient"]["get"] | null = null; export let formData: SuperValidated = @@ -91,11 +92,14 @@
- +
+ + +
diff --git a/src/lib/components/table/FilteredEntryTable.svelte b/src/lib/components/table/FilteredEntryTable.svelte index f3e03ac..d1acdf4 100644 --- a/src/lib/components/table/FilteredEntryTable.svelte +++ b/src/lib/components/table/FilteredEntryTable.svelte @@ -4,11 +4,9 @@ import FilterBar from "$lib/components/filter/FilterBar.svelte"; import type { PaginationRequest, SortRequest } from "$lib/shared/model"; import type { FilterQdata } from "$lib/components/filter/types"; - import { trpc, type RouterOutput } from "$lib/shared/trpc"; + import { type RouterOutput } from "$lib/shared/trpc"; import { ENTRY_FILTERS } from "$lib/components/filter/filters"; import { getQueryUrl } from "$lib/shared/util"; - import LoadingBar from "$lib/components/ui/LoadingBar.svelte"; - import ErrorMessage from "$lib/components/ui/ErrorMessage.svelte"; import type { ZEntriesQuery } from "$lib/shared/model/validation"; import { z } from "zod"; import { browser } from "$app/environment"; @@ -19,9 +17,6 @@ export let baseUrl: string; export let patientId: number | null = null; - let loadingBar: LoadingBar | undefined; - let loadError: Error | null = null; - function paginationUpdate(pagination: PaginationRequest) { updateQuery({ filter: query.filter, @@ -49,29 +44,6 @@ // Update page URL const url = getQueryUrl(q, baseUrl); goto(url, { replaceState: true, keepFocus: true }); - - // Apply patient filter - if (patientId !== null) { - if (!q.filter) q.filter = {}; - q.filter.patient = [{ id: patientId }]; - } - - loadingBar?.start(); - trpc() - .entry.list.query(q) - .then((ent) => { - entries = ent; - loadError = null; - loadingBar?.reset(); - }) - .catch((err) => { - query = q; - loadError = err; - loadingBar?.error(); - }) - .finally(() => { - query = q; - }); } } @@ -85,22 +57,16 @@ - + -{#if loadError} - -{:else} - - - -{/if} + diff --git a/src/lib/components/table/FilteredPatientTable.svelte b/src/lib/components/table/FilteredPatientTable.svelte index 98b3705..bef0116 100644 --- a/src/lib/components/table/FilteredPatientTable.svelte +++ b/src/lib/components/table/FilteredPatientTable.svelte @@ -4,11 +4,9 @@ import FilterBar from "$lib/components/filter/FilterBar.svelte"; import type { PaginationRequest, SortRequest } from "$lib/shared/model"; import type { FilterQdata } from "$lib/components/filter/types"; - import { trpc, type RouterOutput } from "$lib/shared/trpc"; + import { type RouterOutput } from "$lib/shared/trpc"; import { PATIENT_FILTER } from "$lib/components/filter/filters"; import { getQueryUrl } from "$lib/shared/util"; - import LoadingBar from "$lib/components/ui/LoadingBar.svelte"; - import ErrorMessage from "$lib/components/ui/ErrorMessage.svelte"; import type { ZPatientsQuery } from "$lib/shared/model/validation"; import { z } from "zod"; import { browser } from "$app/environment"; @@ -18,9 +16,6 @@ export let patients: RouterOutput["patient"]["list"]; export let baseUrl: string; - let loadingBar: LoadingBar | undefined; - let loadError: Error | null = null; - function paginationUpdate(pagination: PaginationRequest) { updateQuery({ filter: query.filter, @@ -46,22 +41,6 @@ // Update page URL const url = getQueryUrl(q, baseUrl); goto(url, { replaceState: true, keepFocus: true }); - - loadingBar?.start(); - trpc() - .patient.list.query(q) - .then((p) => { - patients = p; - loadError = null; - loadingBar?.reset(); - }) - .catch((err) => { - loadError = err; - loadingBar?.error(); - }) - .finally(() => { - query = q; - }); } } @@ -75,16 +54,10 @@ - + -{#if loadError} - -{:else} - - - -{/if} + diff --git a/src/lib/components/table/PatientField.svelte b/src/lib/components/table/PatientField.svelte index 4de6d23..8aa8597 100644 --- a/src/lib/components/table/PatientField.svelte +++ b/src/lib/components/table/PatientField.svelte @@ -2,7 +2,7 @@ import type { RouterOutput } from "$lib/shared/trpc"; import { gotoEntityQuery } from "$lib/shared/util"; - export let patient: RouterOutput["patient"]["get"]; + export let patient: RouterOutput["patient"]["list"]["items"][0]; export let baseUrl: string; function onClick(e: MouseEvent) { diff --git a/src/lib/components/table/PatientTable.svelte b/src/lib/components/table/PatientTable.svelte index 24c4f00..f9aeda1 100644 --- a/src/lib/components/table/PatientTable.svelte +++ b/src/lib/components/table/PatientTable.svelte @@ -1,12 +1,13 @@ Patient #{data.patient.id} - + + {#if data.patient.hidden} + + {:else if hasEntries} + + {:else} + + {/if} + -{#if data.patient.room} -

Einträge

+{#if hasEntries} +

Einträge ({data.patient.n_entries})