From 4dc5aad0252a67306633b9f63e56d9d5737bce7d Mon Sep 17 00:00:00 2001 From: JoachimLK Date: Wed, 29 Apr 2026 16:14:47 +0200 Subject: [PATCH 1/9] feat: add property management utilities and schemas - Implemented property loading and attachment helpers in `properties.ts` for managing custom properties. - Created Zod schemas for property definitions and configurations in `schemas/property.ts`. - Introduced shared types and utility functions for properties in `shared/properties.ts`. Co-authored-by: Copilot --- app/components/AppTopBar.vue | 140 +- app/components/ColumnsMenu.vue | 88 + app/components/FilterDrawer.vue | 195 + app/components/JobSubNavActions.vue | 36 +- app/components/PropertyBlock.vue | 173 + app/components/PropertyFilterBar.vue | 318 + app/components/PropertySchemaEditor.vue | 416 ++ app/components/PropertyTableCell.vue | 69 + app/components/PropertyValueDisplay.vue | 143 + app/components/PropertyValueEditor.vue | 326 + app/components/SavedViewsMenu.vue | 227 + app/composables/useApplications.ts | 16 +- app/composables/useCandidates.ts | 18 +- app/composables/useProperties.ts | 160 + app/composables/useSavedViews.ts | 119 + app/pages/dashboard/applications/[id].vue | 14 +- app/pages/dashboard/applications/index.vue | 392 +- app/pages/dashboard/candidates/[id].vue | 11 + app/pages/dashboard/candidates/index.vue | 329 +- app/pages/dashboard/jobs/index.vue | 1040 +++- server/api/applications/[id].get.ts | 10 +- .../[id]/properties/[propId].put.ts | 84 + server/api/applications/index.get.ts | 51 +- server/api/candidates/[id].get.ts | 9 + .../[id]/properties/[propId].put.ts | 72 + server/api/candidates/index.get.ts | 40 +- server/api/jobs/index.get.ts | 2 + server/api/properties/[id].delete.ts | 33 + server/api/properties/[id].patch.ts | 39 + server/api/properties/index.get.ts | 59 + server/api/properties/index.post.ts | 76 + server/api/properties/reorder.post.ts | 47 + .../migrations/0028_custom_properties.sql | 42 + .../migrations/meta/0028_snapshot.json | 5372 +++++++++++++++++ server/database/migrations/meta/_journal.json | 7 + server/database/schema/app.ts | 79 + server/utils/properties.ts | 312 + server/utils/schemas/application.ts | 2 + server/utils/schemas/candidate.ts | 2 + server/utils/schemas/property.ts | 169 + shared/properties.ts | 158 + 41 files changed, 10529 insertions(+), 366 deletions(-) create mode 100644 app/components/ColumnsMenu.vue create mode 100644 app/components/FilterDrawer.vue create mode 100644 app/components/PropertyBlock.vue create mode 100644 app/components/PropertyFilterBar.vue create mode 100644 app/components/PropertySchemaEditor.vue create mode 100644 app/components/PropertyTableCell.vue create mode 100644 app/components/PropertyValueDisplay.vue create mode 100644 app/components/PropertyValueEditor.vue create mode 100644 app/components/SavedViewsMenu.vue create mode 100644 app/composables/useProperties.ts create mode 100644 app/composables/useSavedViews.ts create mode 100644 server/api/applications/[id]/properties/[propId].put.ts create mode 100644 server/api/candidates/[id]/properties/[propId].put.ts create mode 100644 server/api/properties/[id].delete.ts create mode 100644 server/api/properties/[id].patch.ts create mode 100644 server/api/properties/index.get.ts create mode 100644 server/api/properties/index.post.ts create mode 100644 server/api/properties/reorder.post.ts create mode 100644 server/database/migrations/0028_custom_properties.sql create mode 100644 server/database/migrations/meta/0028_snapshot.json create mode 100644 server/utils/properties.ts create mode 100644 server/utils/schemas/property.ts create mode 100644 shared/properties.ts diff --git a/app/components/AppTopBar.vue b/app/components/AppTopBar.vue index 0bdbb6e0..2190eeea 100644 --- a/app/components/AppTopBar.vue +++ b/app/components/AppTopBar.vue @@ -6,7 +6,7 @@ import { ChevronDown, Menu, X, Users, ChevronLeft, LayoutDashboard, Calendar, ArrowUpCircle, Cloud, Server, Sparkles, Radio, History, - MessageCircle, + MessageCircle, MoreHorizontal, } from 'lucide-vue-next' const route = useRoute() @@ -20,6 +20,8 @@ const showFeedbackModal = ref(false) const showUserMenu = ref(false) const showMobileMenu = ref(false) const showGetStartedMenu = ref(false) +const showMoreNav = ref(false) +const showMoreActions = ref(false) const config = useRuntimeConfig() const { activeOrg } = useCurrentOrg() @@ -162,6 +164,10 @@ function isActiveRoute(to: string, exact: boolean) { return route.path === localizedTo || route.path.startsWith(`${localizedTo}/`) } +const primaryNavLabels = ['Dashboard', 'Jobs', 'Candidates', 'Applications', 'Interviews'] +const primaryNavItems = computed(() => navItems.value.filter(i => primaryNavLabels.includes(i.label))) +const moreNavItems = computed(() => navItems.value.filter(i => !primaryNavLabels.includes(i.label))) + // Close menus on route change watch(() => route.path, () => { showUserMenu.value = false @@ -221,23 +227,66 @@ onUnmounted(() => { @@ -325,39 +374,64 @@ onUnmounted(() => { - -