From 570f17e8b896cde93b2db517895180f78e246504 Mon Sep 17 00:00:00 2001 From: Tim Stollberg Date: Sat, 18 Jul 2026 16:27:19 +0700 Subject: [PATCH] feat(frontend): commit uncommitted settings, custom fields, and import work This local working tree had accumulated a substantial amount of finished-but-never-committed frontend work: custom client fields (replacing the old static ClientFields with a dynamic ClientCustomFieldCard + useCustomFields), CSV import (useImport + settings/import page), history type management (useHistoryTypes + settings/history-types page), an admin-only route middleware, several new icon components, a shared useApiFetch composable, and a client detail page restructure ([id].vue -> [id]/index.vue). None of it had ever been pushed, so production was running a stale build that was already linking to routes/components that didn't exist server-side (missing IconSettings, 404s on /settings/import, etc). This commit brings the repo in line with local state. --- frontend/components/IconArrowDown.vue | 16 ++ frontend/components/IconArrowLeft.vue | 16 ++ frontend/components/IconArrowUp.vue | 16 ++ frontend/components/IconClose.vue | 12 ++ frontend/components/IconEdit.vue | 16 ++ frontend/components/IconEye.vue | 21 ++ frontend/components/IconEyeOff.vue | 16 ++ frontend/components/IconLogout.vue | 16 ++ frontend/components/IconPrint.vue | 16 ++ frontend/components/IconTrash.vue | 16 ++ frontend/components/LogoutButton.vue | 10 +- frontend/components/client/ClientCard.vue | 20 ++ .../client/ClientCustomFieldCard.vue | 113 ++++++++++ frontend/components/client/ClientFields.vue | 52 ----- frontend/components/history/HistoryEntry.vue | 64 ++++-- frontend/components/history/HistoryForm.vue | 48 +++-- frontend/composables/useApiFetch.ts | 30 +++ frontend/composables/useAuth.ts | 29 +-- frontend/composables/useClient.ts | 38 ++-- frontend/composables/useCustomFields.ts | 42 ++++ frontend/composables/useHistory.ts | 34 ++- frontend/composables/useHistoryTypes.ts | 40 ++++ frontend/composables/useImport.ts | 16 ++ frontend/composables/useUsers.ts | 13 +- frontend/middleware/admin.ts | 15 ++ frontend/nuxt.config.ts | 3 + frontend/package-lock.json | 164 +-------------- frontend/package.json | 2 +- frontend/pages/clients/[id].vue | 99 --------- frontend/pages/clients/[id]/index.vue | 196 ++++++++++++++++++ frontend/pages/clients/[id]/print.vue | 35 ++-- frontend/pages/settings/accounts.vue | 50 ++++- frontend/pages/settings/fields.vue | 195 +++++++++++++++++ frontend/pages/settings/history-types.vue | 158 ++++++++++++++ frontend/pages/settings/import.vue | 131 ++++++++++++ frontend/types/index.ts | 56 ++++- frontend/utils/datetime.ts | 17 ++ 37 files changed, 1396 insertions(+), 435 deletions(-) create mode 100644 frontend/components/IconArrowDown.vue create mode 100644 frontend/components/IconArrowLeft.vue create mode 100644 frontend/components/IconArrowUp.vue create mode 100644 frontend/components/IconClose.vue create mode 100644 frontend/components/IconEdit.vue create mode 100644 frontend/components/IconEye.vue create mode 100644 frontend/components/IconEyeOff.vue create mode 100644 frontend/components/IconLogout.vue create mode 100644 frontend/components/IconPrint.vue create mode 100644 frontend/components/IconTrash.vue create mode 100644 frontend/components/client/ClientCustomFieldCard.vue delete mode 100644 frontend/components/client/ClientFields.vue create mode 100644 frontend/composables/useApiFetch.ts create mode 100644 frontend/composables/useCustomFields.ts create mode 100644 frontend/composables/useHistoryTypes.ts create mode 100644 frontend/composables/useImport.ts create mode 100644 frontend/middleware/admin.ts delete mode 100644 frontend/pages/clients/[id].vue create mode 100644 frontend/pages/clients/[id]/index.vue create mode 100644 frontend/pages/settings/fields.vue create mode 100644 frontend/pages/settings/history-types.vue create mode 100644 frontend/pages/settings/import.vue create mode 100644 frontend/utils/datetime.ts diff --git a/frontend/components/IconArrowDown.vue b/frontend/components/IconArrowDown.vue new file mode 100644 index 0000000..adf355f --- /dev/null +++ b/frontend/components/IconArrowDown.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/components/IconArrowLeft.vue b/frontend/components/IconArrowLeft.vue new file mode 100644 index 0000000..91e7401 --- /dev/null +++ b/frontend/components/IconArrowLeft.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/components/IconArrowUp.vue b/frontend/components/IconArrowUp.vue new file mode 100644 index 0000000..f27b8c9 --- /dev/null +++ b/frontend/components/IconArrowUp.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/components/IconClose.vue b/frontend/components/IconClose.vue new file mode 100644 index 0000000..c489bfe --- /dev/null +++ b/frontend/components/IconClose.vue @@ -0,0 +1,12 @@ + diff --git a/frontend/components/IconEdit.vue b/frontend/components/IconEdit.vue new file mode 100644 index 0000000..57e1cf9 --- /dev/null +++ b/frontend/components/IconEdit.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/components/IconEye.vue b/frontend/components/IconEye.vue new file mode 100644 index 0000000..f3db6d2 --- /dev/null +++ b/frontend/components/IconEye.vue @@ -0,0 +1,21 @@ + diff --git a/frontend/components/IconEyeOff.vue b/frontend/components/IconEyeOff.vue new file mode 100644 index 0000000..e2588fe --- /dev/null +++ b/frontend/components/IconEyeOff.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/components/IconLogout.vue b/frontend/components/IconLogout.vue new file mode 100644 index 0000000..efbfd69 --- /dev/null +++ b/frontend/components/IconLogout.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/components/IconPrint.vue b/frontend/components/IconPrint.vue new file mode 100644 index 0000000..2d2d335 --- /dev/null +++ b/frontend/components/IconPrint.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/components/IconTrash.vue b/frontend/components/IconTrash.vue new file mode 100644 index 0000000..3ff9209 --- /dev/null +++ b/frontend/components/IconTrash.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/components/LogoutButton.vue b/frontend/components/LogoutButton.vue index 47b73c4..13046ff 100644 --- a/frontend/components/LogoutButton.vue +++ b/frontend/components/LogoutButton.vue @@ -3,5 +3,13 @@ const { logout } = useAuth() diff --git a/frontend/components/client/ClientCard.vue b/frontend/components/client/ClientCard.vue index 6487382..4e758a6 100644 --- a/frontend/components/client/ClientCard.vue +++ b/frontend/components/client/ClientCard.vue @@ -2,6 +2,25 @@ import type { Client } from '~/types' const props = defineProps<{ client: Client }>() + +const daysAgo = (iso: string): number => { + const diffMs = Date.now() - new Date(iso).getTime() + return Math.max(0, Math.floor(diffMs / 86_400_000)) +} + +const info = computed(() => { + const count = props.client.history_count + if (count == null || count === 0) return null + + const updates = `${count} Verlauf-Update${count > 1 ? 's' : ''}` + const last = props.client.last_history_at + if (!last) return updates + + const d = daysAgo(last) + const when = + d === 0 ? 'heute' : `vor ${d} ${d === 1 ? 'Tag' : 'Tagen'}` + return `${updates} · zuletzt ${when}` +}) diff --git a/frontend/components/client/ClientCustomFieldCard.vue b/frontend/components/client/ClientCustomFieldCard.vue new file mode 100644 index 0000000..5fbd41b --- /dev/null +++ b/frontend/components/client/ClientCustomFieldCard.vue @@ -0,0 +1,113 @@ + + +