diff --git a/prisma/migrations/20240113221445_search_index/migration.sql b/prisma/migrations/20240113221445_search_index/migration.sql index 01b2f1f..cd6b5db 100644 --- a/prisma/migrations/20240113221445_search_index/migration.sql +++ b/prisma/migrations/20240113221445_search_index/migration.sql @@ -33,5 +33,4 @@ 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 5f0dd88..84ffad1 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 9f1f822..64d535f 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 outline-none"; + export let inputCls = "w-full bg-transparent"; 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 b7bacfc..1b481d6 100644 --- a/src/lib/components/filter/FilterBar.svelte +++ b/src/lib/components/filter/FilterBar.svelte @@ -21,7 +21,6 @@ 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; @@ -60,9 +59,7 @@ function updateFromQueryData(filterData: FilterQdata) { const filters: FilterData[] = []; for (const [id, value] of Object.entries(filterData)) { - // 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 (hiddenFilters.includes(id)) continue; if (search && id === "search") { searchVal = value.toString(); } else if (Array.isArray(value)) { @@ -186,8 +183,10 @@ } -
-
+
+
{#each activeFilters as fdata, i} { activeFilters = []; - searchVal = ""; updateFilter(); }} > @@ -241,14 +239,3 @@ {/if}
- - diff --git a/src/lib/components/filter/FilterChip.svelte b/src/lib/components/filter/FilterChip.svelte index 6f9ee0e..82d9c62 100644 --- a/src/lib/components/filter/FilterChip.svelte +++ b/src/lib/components/filter/FilterChip.svelte @@ -32,13 +32,9 @@ autocomplete.open(); } - const TOFF = " aus"; - $: toggleState = fdata.selection?.toggle !== false; - $: filterName = toggleState - ? filter.name - : filter.toggleOff?.name ?? filter.name + TOFF; - $: filterIcon = toggleState ? filter.icon : filter.toggleOff?.icon ?? filter.icon; + $: filterName = toggleState ? filter.name : filter.toggleOff?.name; + $: filterIcon = toggleState ? filter.icon : filter.toggleOff?.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 6c8cfbf..4966925 100644 --- a/src/lib/components/filter/filters.ts +++ b/src/lib/components/filter/filters.ts @@ -2,7 +2,6 @@ import { trpc } from "$lib/shared/trpc"; import { mdiAccount, mdiAccountInjury, - mdiAccountMultipleOutline, mdiAccountRemoveOutline, mdiBedKingOutline, mdiCheckboxBlankOutline, @@ -119,10 +118,4 @@ 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 d494b9a..a519fab 100644 --- a/src/lib/components/form/PatientForm.svelte +++ b/src/lib/components/form/PatientForm.svelte @@ -6,7 +6,6 @@ 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 = @@ -92,14 +91,11 @@
-
- - -
+ diff --git a/src/lib/components/table/FilteredEntryTable.svelte b/src/lib/components/table/FilteredEntryTable.svelte index d1acdf4..f3e03ac 100644 --- a/src/lib/components/table/FilteredEntryTable.svelte +++ b/src/lib/components/table/FilteredEntryTable.svelte @@ -4,9 +4,11 @@ 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 { type RouterOutput } from "$lib/shared/trpc"; + import { trpc, 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"; @@ -17,6 +19,9 @@ 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, @@ -44,6 +49,29 @@ // 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; + }); } } @@ -57,16 +85,22 @@ - + - +{#if loadError} + +{:else} + + + +{/if} diff --git a/src/lib/components/table/FilteredPatientTable.svelte b/src/lib/components/table/FilteredPatientTable.svelte index bef0116..98b3705 100644 --- a/src/lib/components/table/FilteredPatientTable.svelte +++ b/src/lib/components/table/FilteredPatientTable.svelte @@ -4,9 +4,11 @@ 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 { type RouterOutput } from "$lib/shared/trpc"; + import { trpc, 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"; @@ -16,6 +18,9 @@ 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, @@ -41,6 +46,22 @@ // 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; + }); } } @@ -54,10 +75,16 @@ - + - +{#if loadError} + +{:else} + + + +{/if} diff --git a/src/lib/components/table/PatientField.svelte b/src/lib/components/table/PatientField.svelte index 8aa8597..4de6d23 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"]["list"]["items"][0]; + export let patient: RouterOutput["patient"]["get"]; 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 f9aeda1..24c4f00 100644 --- a/src/lib/components/table/PatientTable.svelte +++ b/src/lib/components/table/PatientTable.svelte @@ -1,13 +1,12 @@ Patient #{data.patient.id} - - {#if data.patient.hidden} - - {:else if hasEntries} - - {:else} - - {/if} - + -{#if hasEntries} -

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

+{#if data.patient.room} +

Einträge