@dragonmastery/dragoncore-vue 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/LICENSE +75 -0
  2. package/dist/AppLink-CHMMrSFI.js +54 -0
  3. package/dist/AppLink-CHMMrSFI.js.map +1 -0
  4. package/dist/Appearance-BfPdKMXw.js +70 -0
  5. package/dist/Appearance-BfPdKMXw.js.map +1 -0
  6. package/dist/Appearance-C3WguxT-.js +3 -0
  7. package/dist/ChangePasswordPage-Btu5lf-r.js +86 -0
  8. package/dist/ChangePasswordPage-Btu5lf-r.js.map +1 -0
  9. package/dist/ChangePasswordPage-mBBuQMkT.js +6 -0
  10. package/dist/CreateTeamForm-n2ut93vM.js +43 -0
  11. package/dist/CreateTeamMemberForm-CcH3AxNL.js +43 -0
  12. package/dist/CreateUserPage-CDrGuW9B.js +6 -0
  13. package/dist/CreateUserPage-Cmx8xjjv.js +76 -0
  14. package/dist/CreateUserPage-Cmx8xjjv.js.map +1 -0
  15. package/dist/CreditBalanceDashboard-DLz0ioP3.js +43 -0
  16. package/dist/CreditManagement-D3q5S-qc.js +43 -0
  17. package/dist/CustomerCreateSupportTicketForm-Ci7QYkG-.js +43 -0
  18. package/dist/CustomerEditSupportTicketForm-Dd5ZB74k.js +159 -0
  19. package/dist/CustomerEditSupportTicketForm-Dd5ZB74k.js.map +1 -0
  20. package/dist/CustomerEditSupportTicketForm-lLchVjnw.js +9 -0
  21. package/dist/CustomerSupportTicketAttachmentsTab-gBrVO97t.js +43 -0
  22. package/dist/CustomerSupportTicketCustomerNotesTab-D0jhzbOY.js +8 -0
  23. package/dist/CustomerSupportTicketCustomerNotesTab-D1aa9It7.js +23 -0
  24. package/dist/CustomerSupportTicketCustomerNotesTab-D1aa9It7.js.map +1 -0
  25. package/dist/CustomerSupportTicketHistoryTab-BNTf8EZq.js +6 -0
  26. package/dist/CustomerSupportTicketHistoryTab-CFYN_Sa4.js +17 -0
  27. package/dist/CustomerSupportTicketHistoryTab-CFYN_Sa4.js.map +1 -0
  28. package/dist/CustomerSupportTicketList-BkOzFxMP.js +6 -0
  29. package/dist/CustomerSupportTicketList-C2nUPawb.js +166 -0
  30. package/dist/CustomerSupportTicketList-C2nUPawb.js.map +1 -0
  31. package/dist/CustomerSupportTicketParent-2mONd9kL.js +66 -0
  32. package/dist/CustomerSupportTicketParent-2mONd9kL.js.map +1 -0
  33. package/dist/CustomerSupportTicketParent-N8ko1yFE.js +7 -0
  34. package/dist/CustomerSupportTicketSuccess-w_-9NXT4.js +43 -0
  35. package/dist/CustomerViewSupportTicket-CVwNH0lS.js +11 -0
  36. package/dist/CustomerViewSupportTicket-tZkxragu.js +363 -0
  37. package/dist/CustomerViewSupportTicket-tZkxragu.js.map +1 -0
  38. package/dist/EditTeamForm-BioqiTWE.js +43 -0
  39. package/dist/EditTeamMemberForm-DCq0Gsn_.js +7 -0
  40. package/dist/EditTeamMemberForm-ru4WgLz-.js +169 -0
  41. package/dist/EditTeamMemberForm-ru4WgLz-.js.map +1 -0
  42. package/dist/EditUserPage-BxJ5QvIM.js +112 -0
  43. package/dist/EditUserPage-BxJ5QvIM.js.map +1 -0
  44. package/dist/EditUserPage-XOBuxUxd.js +7 -0
  45. package/dist/FieldsetSection-CsHN38_o.js +27 -0
  46. package/dist/FieldsetSection-CsHN38_o.js.map +1 -0
  47. package/dist/ForgotPassword-CpqvcSFg.js +7 -0
  48. package/dist/ForgotPassword-CqhenzUG.js +73 -0
  49. package/dist/ForgotPassword-CqhenzUG.js.map +1 -0
  50. package/dist/InlineAttachments-I39rOvip.js +1351 -0
  51. package/dist/InlineAttachments-I39rOvip.js.map +1 -0
  52. package/dist/LoginForm-AM0qkfbU.js +7 -0
  53. package/dist/LoginForm-_PZ51Uwe.js +116 -0
  54. package/dist/LoginForm-_PZ51Uwe.js.map +1 -0
  55. package/dist/Logout-BMjiqHnS.js +38 -0
  56. package/dist/Logout-BMjiqHnS.js.map +1 -0
  57. package/dist/Logout-BfiBjlaH.js +6 -0
  58. package/dist/NoteList-C0hRPNMO.js +497 -0
  59. package/dist/NoteList-C0hRPNMO.js.map +1 -0
  60. package/dist/NotificationEmailsPage-BjRqtW95.js +141 -0
  61. package/dist/NotificationEmailsPage-BjRqtW95.js.map +1 -0
  62. package/dist/NotificationEmailsPage-bx-9rg3x.js +7 -0
  63. package/dist/ResetPassword-BQLkR9TZ.js +43 -0
  64. package/dist/Signup-CnCcQlB8.js +7 -0
  65. package/dist/Signup-c2-_yMOM.js +106 -0
  66. package/dist/Signup-c2-_yMOM.js.map +1 -0
  67. package/dist/StaffCreateSupportTicketForm-ChVFDJdA.js +43 -0
  68. package/dist/StaffEditSupportTicketForm-DY1Zkf5k.js +9 -0
  69. package/dist/StaffEditSupportTicketForm-DuUKuIGg.js +263 -0
  70. package/dist/StaffEditSupportTicketForm-DuUKuIGg.js.map +1 -0
  71. package/dist/StaffSupportTicketAttachmentsTab-DpDXsHXP.js +43 -0
  72. package/dist/StaffSupportTicketCustomerNotesTab-CusqQV2-.js +23 -0
  73. package/dist/StaffSupportTicketCustomerNotesTab-CusqQV2-.js.map +1 -0
  74. package/dist/StaffSupportTicketCustomerNotesTab-rbJHJ0_V.js +8 -0
  75. package/dist/StaffSupportTicketHistoryTab-D24myEm3.js +17 -0
  76. package/dist/StaffSupportTicketHistoryTab-D24myEm3.js.map +1 -0
  77. package/dist/StaffSupportTicketHistoryTab-nmVma5vp.js +6 -0
  78. package/dist/StaffSupportTicketInternalNotesTab-D8HM--dp.js +23 -0
  79. package/dist/StaffSupportTicketInternalNotesTab-D8HM--dp.js.map +1 -0
  80. package/dist/StaffSupportTicketInternalNotesTab-DihYd5XI.js +8 -0
  81. package/dist/StaffSupportTicketList-DelptSmK.js +43 -0
  82. package/dist/StaffSupportTicketParent-BCrj3ckV.js +7 -0
  83. package/dist/StaffSupportTicketParent-Cx1buQZw.js +66 -0
  84. package/dist/StaffSupportTicketParent-Cx1buQZw.js.map +1 -0
  85. package/dist/StaffSupportTicketSuccess-BYxtY5wZ.js +43 -0
  86. package/dist/StaffSupportTicketWorkflowTab-BrDDBeK9.js +9 -0
  87. package/dist/StaffSupportTicketWorkflowTab-DmVTPzxS.js +1234 -0
  88. package/dist/StaffSupportTicketWorkflowTab-DmVTPzxS.js.map +1 -0
  89. package/dist/SupportTicketHistoryTab-CLMopA7a.js +220 -0
  90. package/dist/SupportTicketHistoryTab-CLMopA7a.js.map +1 -0
  91. package/dist/SupportTicketStatusBadge-YdZzjvkh.js +163 -0
  92. package/dist/SupportTicketStatusBadge-YdZzjvkh.js.map +1 -0
  93. package/dist/TeamAttachmentsTab-BxUpTWYh.js +43 -0
  94. package/dist/TeamHistoryTab-CUCT9MRG.js +5 -0
  95. package/dist/TeamHistoryTab-gB3H2KZv.js +219 -0
  96. package/dist/TeamHistoryTab-gB3H2KZv.js.map +1 -0
  97. package/dist/TeamList-By6pzWm5.js +43 -0
  98. package/dist/TeamMemberList-CYV9fWEb.js +43 -0
  99. package/dist/TeamMemberParent-CVvGqpxD.js +43 -0
  100. package/dist/TeamMembersTab-4gmnP9sD.js +21 -0
  101. package/dist/TeamMembersTab-4gmnP9sD.js.map +1 -0
  102. package/dist/TeamMembersTab-CpE9BaCi.js +3 -0
  103. package/dist/TeamNotesTab-pfXTDhg6.js +23 -0
  104. package/dist/TeamNotesTab-pfXTDhg6.js.map +1 -0
  105. package/dist/TeamNotesTab-u4cDC67X.js +8 -0
  106. package/dist/TeamParent-BxT1KubK.js +43 -0
  107. package/dist/UserListPage-DsQdH2Sm.js +4 -0
  108. package/dist/UserListPage-WU56KiWj.js +153 -0
  109. package/dist/UserListPage-WU56KiWj.js.map +1 -0
  110. package/dist/UserProfilePage-B73JhjUu.js +7 -0
  111. package/dist/UserProfilePage-BtLUY1kt.js +125 -0
  112. package/dist/UserProfilePage-BtLUY1kt.js.map +1 -0
  113. package/dist/ViewTeam-DzX-obEl.js +43 -0
  114. package/dist/ViewTeamMember-PF6S_4Pb.js +43 -0
  115. package/dist/ZiniaContainer-C7c7Vwkh.js +18 -0
  116. package/dist/ZiniaContainer-C7c7Vwkh.js.map +1 -0
  117. package/dist/convertToLocalDateTime-D4IoNvRj.js +111 -0
  118. package/dist/convertToLocalDateTime-D4IoNvRj.js.map +1 -0
  119. package/dist/creditValueFormatter-DftEzu8d.js +128 -0
  120. package/dist/creditValueFormatter-DftEzu8d.js.map +1 -0
  121. package/dist/displayIdFormatter-Dz900Awr.js +13 -0
  122. package/dist/displayIdFormatter-Dz900Awr.js.map +1 -0
  123. package/dist/index.d.ts +6068 -0
  124. package/dist/index.js +45 -0
  125. package/dist/src-o5fMIo5_.js +6649 -0
  126. package/dist/src-o5fMIo5_.js.map +1 -0
  127. package/dist/useBreadcrumbs-DmgSucoe.js +41 -0
  128. package/dist/useBreadcrumbs-DmgSucoe.js.map +1 -0
  129. package/dist/useMutation-CFwe7H9j.js +50 -0
  130. package/dist/useMutation-CFwe7H9j.js.map +1 -0
  131. package/dist/useQuery-p7oJO7OD.js +107 -0
  132. package/dist/useQuery-p7oJO7OD.js.map +1 -0
  133. package/dist/useQueryCache-ByayvZgZ.js +254 -0
  134. package/dist/useQueryCache-ByayvZgZ.js.map +1 -0
  135. package/dist/useRpcAuth-BLlRSHy8.js +722 -0
  136. package/dist/useRpcAuth-BLlRSHy8.js.map +1 -0
  137. package/package.json +62 -0
  138. package/src/daisyui.css +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-o5fMIo5_.js","names":["$emit","merged: Breadcrumb[]","breadcrumbs: Breadcrumb[]","filters: any","files: Attachment[]","folderList: {\n id: string;\n name: string;\n parent_folder_id?: string | null;\n file_count?: number;\n }[]","path: { id: string; name: string }[]","currentFolderIdToFind: string | null","pairs: KeyValuePair[]","obj: Record<string, string>","$emit","$slots","DEFAULT_OPERATORS: Record<string, string>","config: FilterConfiguration","operator: string","params: Record<string, string>","userAlreadyLoggedIn: NavigationGuard","userRoutes: Array<ExtendedRouteRecordRaw>","teamMemberRoutes: Array<ExtendedRouteRecordRaw>","teamRoutes: Array<ExtendedRouteRecordRaw>","variables: TeamFiltersDto","variables: any","customerSupportTicketRoutes: Array<ExtendedRouteRecordRaw>","staffSupportTicketRoutes: Array<ExtendedRouteRecordRaw>","variables: any","sectionTitle: string","limitationMessage: string","submitText: string","submittingText: string","baseRoutes: Array<ExtendedRouteRecordRaw>","$emit","adminRoutes: Array<ExtendedRouteRecordRaw>","creditRoutes: Array<ExtendedRouteRecordRaw>","variables: any"],"sources":["../src/plugin.ts","../src/components/AppTabNavigation.vue","../src/components/AppHeader.vue","../src/components/BaseModal.vue","../src/components/InputModal.vue","../src/components/LoginButton.vue","../src/components/Navbar.vue","../src/components/NotFound.vue","../src/components/RightSidebar.vue","../src/composables/useBuildTag.ts","../src/components/Sidebar.vue","../src/layouts/Admin.vue","../src/layouts/Auth.vue","../src/layouts/Default.vue","../src/layouts/InApp.vue","../src/components/ui/FieldDisplay.vue","../src/components/ui/FieldGroup.vue","../src/components/ui/FileManager.vue","../src/components/ui/KeyValueEditor.vue","../src/components/ui/LoadingErrorStates.vue","../src/components/ui/RecordChangesSummary.vue","../src/components/ui/RecordVersionList.vue","../src/components/ui/RecordVersionViewer.vue","../src/components/ui/SummarySection.vue","../src/utils/timezones.ts","../src/utils/filterUrlParser.ts","../src/middleware/userAlreadyLoggedIn.ts","../src/middleware/userAuthorized.ts","../src/slices/user/userRoutes.ts","../src/slices/team/teamMetadata.ts","../src/slices/team/team_member/team_memberRoutes.ts","../src/slices/team/teamRoutes.ts","../src/slices/team/CreateTeamForm.vue","../src/slices/team/EditTeamForm.vue","../src/slices/team/components/TeamAttachments.vue","../src/slices/team/TeamAttachmentsTab.vue","../src/slices/team/teamFiltersMetadata.ts","../src/slices/team/TeamRowSchema.ts","../src/slices/team/TeamList.vue","../src/slices/team/TeamParent.vue","../src/slices/team/ViewTeam.vue","../src/slices/team/team_member/CreateTeamMemberForm.vue","../src/slices/team/team_member/teamMemberFiltersMetadata.ts","../src/slices/team/team_member/teamMemberRowSchema.ts","../src/slices/team/team_member/TeamMemberList.vue","../src/slices/team/team_member/TeamMemberParent.vue","../src/slices/team/team_member/ViewTeamMember.vue","../src/slices/support_ticket/customer/customerSupportTicketRoutes.ts","../src/slices/support_ticket/staff/staffSupportTicketRoutes.ts","../src/slices/support_ticket/customer/CustomerCreateSupportTicketForm.vue","../src/slices/support_ticket/customer/CustomerSupportTicketSuccess.vue","../src/slices/support_ticket/shared/SupportTicketAttachments.vue","../src/slices/support_ticket/customer/CustomerSupportTicketAttachmentsTab.vue","../src/slices/support_ticket/staff/StaffSupportTicketRowSchema.ts","../src/slices/support_ticket/staff/StaffSupportTicketList.vue","../src/slices/support_ticket/staff/StaffCreateSupportTicketForm.vue","../src/slices/support_ticket/staff/StaffSupportTicketSuccess.vue","../src/slices/support_ticket/staff/StaffSupportTicketAttachmentsTab.vue","../src/slices/support_ticket/shared/CreditBalanceWidget.vue","../src/slices/support_ticket/staff/staffSupportTicketFiltersMetadata.ts","../src/slices/support_ticket/customer/composables/useSupportTicketPermissions.ts","../src/slices/support_ticket/customer/composables/useSupportTicketStatus.ts","../src/slices/auth/authRoutes.ts","../src/slices/auth/features/reset_password/reset_password_schema.ts","../src/slices/auth/features/reset_password/ResetPassword.vue","../src/slices/auth/features/login/SocialLoginButtons.vue","../src/slices/admin/adminRoutes.ts","../src/slices/customer/creditRoutes.ts","../src/slices/customer/components/CreditBalanceOverview.vue","../src/slices/customer/creditTransactionRowSchema.ts","../src/slices/customer/components/CreditTransactionTypeBadge.vue","../src/slices/customer/components/CreditTransactionHistory.vue","../src/slices/customer/CreditBalanceDashboard.vue","../src/slices/customer/features/credit-management/creditFormMetadata.ts","../src/slices/customer/features/credit-management/AddCredits.vue","../src/slices/customer/features/credit-management/ResetMonthlyBalance.vue","../src/slices/customer/features/credit-management/SetMonthlyAllocation.vue","../src/slices/customer/features/credit-management/CreditManagement.vue"],"sourcesContent":["import type { App } from 'vue';\nimport type { Router } from 'vue-router';\nimport { setRouter } from './composables/useRpcAuth';\nimport type { AuthenticatableApi } from './utils/EnhancedRefreshTokenHandler';\nimport {\n EnhancedRefreshTokenHandler,\n setRefreshTokenHandler,\n} from './utils/EnhancedRefreshTokenHandler';\n\n/**\n * Options for the DragoncoreVue plugin\n */\nexport interface DragoncoreVuePluginOptions<TApi extends AuthenticatableApi> {\n /**\n * Router instance for navigation (e.g., redirecting to logout on auth errors)\n */\n router: Router;\n /**\n * Refresh token handler for your API type\n */\n refreshTokenHandler: EnhancedRefreshTokenHandler<TApi>;\n}\n\n/**\n * Dragoncore Vue Plugin\n *\n * Provides RPC authentication and data fetching capabilities to your Vue app.\n *\n * @example\n * ```typescript\n * import { createApp } from 'vue';\n * import { DragoncoreVue } from '@dragonmastery/dragoncore-vue';\n * import router from './router';\n * import { createRefreshTokenHandler } from '@dragonmastery/dragoncore-vue';\n * import type { AppApi } from '@follow-zap/shared';\n *\n * const app = createApp(App);\n * const refreshTokenHandler = createRefreshTokenHandler<AppApi>();\n *\n * app.use(DragoncoreVue, {\n * router,\n * refreshTokenHandler,\n * });\n * ```\n */\nexport const DragoncoreVue = {\n install<TApi extends AuthenticatableApi>(\n _app: App,\n options: DragoncoreVuePluginOptions<TApi>,\n ): void {\n // Validate required options\n if (!options.router) {\n throw new Error('DragoncoreVue plugin: router is required');\n }\n if (!options.refreshTokenHandler) {\n throw new Error('DragoncoreVue plugin: refreshTokenHandler is required');\n }\n\n // Register router and refresh token handler\n setRouter(options.router);\n setRefreshTokenHandler(options.refreshTokenHandler);\n },\n};\n","<template>\n <!-- Mobile-first tab navigation with responsive grid layout -->\n <div class=\"w-full\">\n <!-- Mobile view: Show dropdown on small screens -->\n <div class=\"md:hidden relative\">\n <button\n @click=\"isMenuOpen = !isMenuOpen\"\n class=\"w-full flex items-center justify-between px-4 py-3 bg-base-100\"\n >\n <span class=\"font-medium\">{{ activeTabLabel }}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n\n <!-- Dropdown menu -->\n <div v-if=\"isMenuOpen\" class=\"absolute z-20 w-full bg-base-100 shadow-lg\">\n <template v-for=\"(tab, index) in tabs\" :key=\"index\">\n <router-link\n v-if=\"tab.to\"\n :to=\"tab.to\"\n class=\"block px-4 py-3 hover:bg-base-200\"\n :class=\"[isActiveTab(tab) ? 'text-primary font-medium' : 'text-base-content/70']\"\n @click=\"isMenuOpen = false\"\n >\n {{ tab.label }}\n </router-link>\n\n <button\n v-else\n @click=\"handleTabClick(tab.id)\"\n class=\"block w-full text-left px-4 py-3 hover:bg-base-200\"\n :class=\"[\n activeTab === tab.id ? 'text-primary font-medium' : 'text-base-content/70',\n ]\"\n >\n {{ tab.label }}\n </button>\n </template>\n </div>\n </div>\n\n <!-- Desktop view: Show horizontal tabs on medium screens and up -->\n <div class=\"hidden md:flex items-center overflow-x-auto\">\n <div class=\"flex-1 flex\">\n <template v-for=\"(tab, index) in tabs\" :key=\"index\">\n <router-link\n v-if=\"tab.to\"\n :to=\"tab.to\"\n class=\"px-4 py-3 border-b-2 whitespace-nowrap flex items-center\"\n :class=\"[\n isActiveTab(tab)\n ? 'font-medium text-primary border-primary'\n : 'border-transparent hover:border-base-300 text-base-content/70 hover:text-base-content',\n ]\"\n >\n <slot :name=\"`icon-${tab.id}`\"></slot>\n <span>{{ tab.label }}</span>\n </router-link>\n\n <button\n v-else\n @click=\"handleTabClick(tab.id)\"\n class=\"px-4 py-3 border-b-2 whitespace-nowrap flex items-center\"\n :class=\"[\n activeTab === tab.id\n ? 'font-medium text-primary border-primary'\n : 'border-transparent hover:border-base-300 text-base-content/70 hover:text-base-content',\n ]\"\n >\n <slot :name=\"`icon-${tab.id}`\"></slot>\n <span>{{ tab.label }}</span>\n </button>\n </template>\n </div>\n\n <!-- Optional slot for additional content -->\n <div class=\"ml-auto shrink-0\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SectionTab } from '../types/ExtendedRoute';\nimport { computed, ref } from 'vue';\nimport { useRoute } from 'vue-router';\n\ninterface Props {\n tabs: SectionTab[];\n activeTab?: string; // For non-route tabs\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n activeTab: '',\n});\n\nconst emit = defineEmits<{\n (e: 'tab-click', tabId: string): void;\n}>();\n\nconst route = useRoute();\nconst isMenuOpen = ref(false);\n\n// Handle tab click and emit event\nconst handleTabClick = (tabId: string) => {\n emit('tab-click', tabId);\n isMenuOpen.value = false;\n};\n\n// Compute the label of the active tab for mobile view\nconst activeTabLabel = computed(() => {\n // Find active tab based on route or props\n const activeTab = props.tabs.find((tab) => {\n if (tab.to && isActiveTab(tab)) return true;\n return tab.id === props.activeTab;\n });\n\n return activeTab?.label || 'Navigation';\n});\n\n// Determine if a tab is active based on route or props\nconst isActiveTab = (tab: SectionTab) => {\n // For tabs with an ID that matches the activeTab prop\n if (props.activeTab && tab.id === props.activeTab) {\n return true;\n }\n\n // For tabs with route information\n if (tab.to) {\n // Check if the tab ID matches the current tab in the route\n if (route.meta.currentTab && tab.id === route.meta.currentTab) {\n return true;\n }\n\n // Check if routes match exactly (name and params)\n if (tab.to.name && route.name === tab.to.name) {\n // If there are params, check if they match\n if (tab.to.params) {\n const toParams = tab.to.params;\n const routeParams = route.params;\n\n // Check if all required params match\n for (const key in toParams) {\n if (routeParams[key] !== toParams[key]) return false;\n }\n\n // If we got here and there were params to check, it's a match\n return Object.keys(toParams).length > 0;\n }\n\n // If no params, it's a match if the names match\n return true;\n }\n\n // Check if paths match exactly\n if (tab.to.path && route.path === tab.to.path) {\n return true;\n }\n }\n\n return false;\n};\n</script>\n","<template>\n <!-- Full-width background with constrained content -->\n <div class=\"bg-base-100 border-b border-base-300 z-10 w-full\">\n <!-- Tab navigation - only shown when tabs are provided -->\n <div v-if=\"tabs.length > 0\" class=\"w-full\">\n <div class=\"max-w-7xl mx-auto px-3 sm:px-4 md:px-6\">\n <AppTabNavigation\n :tabs=\"tabs\"\n :active-tab=\"activeTab\"\n @tab-click=\"$emit('tab-click', $event)\"\n >\n <template v-for=\"tab in tabs\" :key=\"tab.id\" v-slot:[`icon-${tab.id}`]>\n <slot :name=\"`icon-${tab.id}`\"></slot>\n </template>\n\n <template #actions>\n <slot name=\"actions\"></slot>\n </template>\n </AppTabNavigation>\n </div>\n </div>\n\n <!-- Status badge slot (moved from breadcrumbs) -->\n <slot name=\"status\"></slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppTabNavigation from './AppTabNavigation.vue';\n\ninterface Tab {\n id: string;\n label: string;\n to?: any; // router-link to prop\n meta?: Record<string, any>; // Additional metadata for matching\n}\n\ninterface Props {\n tabs: Tab[];\n activeTab?: string;\n}\n\nwithDefaults(defineProps<Props>(), {\n activeTab: '',\n});\n\ndefineEmits<{\n (e: 'tab-click', tabId: string): void;\n}>();\n</script>\n","<template>\n <dialog ref=\"modal\" class=\"modal\">\n <div class=\"modal-box w-full max-w-full max-h-[90vh] flex flex-col p-0\">\n <!-- Header with title and close button - fixed, not scrollable -->\n <div\n class=\"flex justify-between items-center p-6 pb-4 border-b border-base-300 flex-shrink-0\"\n >\n <h3 class=\"font-bold text-lg\">\n <slot name=\"title\">{{ title }}</slot>\n </h3>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-circle btn-ghost\"\n @click.prevent=\"handleClose\"\n aria-label=\"Close modal\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Content slot - scrollable area -->\n <div class=\"modal-content flex-1 overflow-y-auto p-6\">\n <slot></slot>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click.prevent=\"handleClose\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\n\ninterface Props {\n isOpen: boolean;\n title?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: '',\n});\n\nconst emit = defineEmits<{\n close: [];\n}>();\n\nconst modal = ref<HTMLDialogElement>();\n\nconst handleClose = () => {\n emit('close');\n};\n\n// Watch for modal open/close\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen && modal.value) {\n modal.value.showModal();\n } else if (!isOpen && modal.value) {\n modal.value.close();\n }\n },\n { immediate: true },\n);\n</script>\n","<template>\n <div class=\"modal\" :class=\"{ 'modal-open': modelValue }\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">{{ title }}</h3>\n <div class=\"py-4\">\n <label class=\"form-control w-full\">\n <div class=\"label\">\n <span class=\"label-text\">{{ label }}</span>\n </div>\n <input\n v-model=\"inputValue\"\n type=\"text\"\n :placeholder=\"placeholder\"\n class=\"input input-bordered w-full\"\n @keyup.enter=\"handleConfirm\"\n @keyup.escape=\"handleCancel\"\n ref=\"inputRef\"\n />\n <div v-if=\"error\" class=\"label\">\n <span class=\"label-text-alt text-error\">{{ error }}</span>\n </div>\n </label>\n </div>\n <div class=\"modal-action\">\n <button class=\"btn\" @click=\"handleCancel\" :disabled=\"isProcessing\">\n {{ cancelText }}\n </button>\n <button\n class=\"btn\"\n :class=\"confirmButtonClass\"\n @click=\"handleConfirm\"\n :disabled=\"!inputValue || inputValue.trim() === '' || isProcessing\"\n >\n {{ isProcessing ? processingText : confirmText }}\n </button>\n </div>\n </div>\n <div class=\"modal-backdrop\" @click=\"handleCancel\"></div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { nextTick, ref, watch } from 'vue';\n\ninterface Props {\n modelValue: boolean;\n title?: string;\n label?: string;\n placeholder?: string;\n confirmText?: string;\n cancelText?: string;\n processingText?: string;\n confirmButtonClass?: string;\n isProcessing?: boolean;\n error?: string;\n initialValue?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: 'Input',\n label: 'Value',\n placeholder: 'Enter value',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n processingText: 'Processing...',\n confirmButtonClass: 'btn-primary',\n isProcessing: false,\n error: '',\n initialValue: '',\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean];\n confirm: [value: string];\n cancel: [];\n}>();\n\nconst inputValue = ref(props.initialValue);\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (newValue) {\n inputValue.value = props.initialValue || '';\n // Focus input after modal opens\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n }\n },\n);\n\nwatch(\n () => props.initialValue,\n (newValue) => {\n if (props.modelValue) {\n inputValue.value = newValue || '';\n }\n },\n);\n\nconst handleConfirm = () => {\n const value = inputValue.value.trim();\n if (value) {\n emit('confirm', value);\n }\n};\n\nconst handleCancel = () => {\n emit('update:modelValue', false);\n emit('cancel');\n inputValue.value = '';\n};\n</script>\n","<template>\n <router-link to=\"/auth/login\">\n <button class=\"btn-primary btn\">Login</button>\n </router-link>\n</template>\n\n<script setup lang=\"ts\"></script>\n","<template>\n <header\n class=\"sticky top-0 flex h-16 w-full justify-center border-b-2 border-solid border-b-base-300 bg-base-200 bg-opacity-90 text-base-content shadow-xs z-10\"\n >\n <nav class=\"navbar w-full\">\n <div class=\"flex flex-1 md:gap-1 lg:gap-2\">\n <label for=\"drawer\" class=\"btn-ghost drawer-button btn-square btn\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"h-6 w-6\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"\n />\n </svg>\n </label>\n <div class=\"items-center gap-2 flex\">\n <AppLink to=\"/\" aria-current=\"page\" aria-label=\"Homepage\">\n <div\n class=\"font-title inline-flex text-lg text-primary transition-all duration-200 md:text-3xl\"\n >\n <img\n src=\"/android-chrome-192x192-20250721.png\"\n alt=\"logo\"\n class=\"h-10 w-10 md:h-12 md:w-12\"\n />\n </div>\n </AppLink>\n\n <!-- Breadcrumbs in navbar - Desktop view -->\n <div\n v-if=\"breadcrumbs && breadcrumbs.length > 0\"\n class=\"hidden md:flex items-center ml-4\"\n >\n <div class=\"text-sm text-base-content/70 flex items-center gap-2\">\n <template v-for=\"(crumb, index) in breadcrumbs\" :key=\"index\">\n <!-- Link for all but the last item -->\n <router-link\n v-if=\"index < breadcrumbs.length - 1\"\n :to=\"crumb.to\"\n class=\"hover:text-primary\"\n >\n {{ crumb.label }}\n </router-link>\n\n <!-- Current page (not a link) -->\n <template v-else>\n <!-- Show loading spinner if explicitly loading -->\n <span v-if=\"crumb.loading\" class=\"loading loading-spinner loading-xs\"></span>\n <!-- Show label if provided -->\n <span v-else-if=\"crumb.label\" class=\"font-medium\">{{ crumb.label }}</span>\n <!-- Fallback if neither loading nor label -->\n <span v-else class=\"font-medium text-base-content/50\">...</span>\n </template>\n\n <!-- Separator between items -->\n <span v-if=\"index < breadcrumbs.length - 1\" class=\"text-base-content/50\"\n >/</span\n >\n </template>\n\n <!-- Optional status badge -->\n <slot name=\"status\"></slot>\n </div>\n </div>\n\n <!-- Breadcrumbs in navbar - Mobile view (GitHub style) -->\n <div\n v-if=\"breadcrumbs && breadcrumbs.length > 0\"\n class=\"flex md:hidden flex-col justify-center ml-2 leading-tight\"\n >\n <!-- Parent/previous breadcrumb (if exists) -->\n <router-link\n v-if=\"breadcrumbs.length > 1 && breadcrumbs[breadcrumbs.length - 2]\"\n :to=\"breadcrumbs[breadcrumbs.length - 2]!.to\"\n class=\"text-xs text-base-content/70 hover:text-primary truncate max-w-[120px]\"\n >\n {{ breadcrumbs[breadcrumbs.length - 2]!.label }}\n </router-link>\n\n <!-- Current page (last breadcrumb) -->\n <div class=\"font-medium text-sm truncate max-w-[150px]\">\n <!-- Show loading spinner if explicitly loading -->\n <span\n v-if=\"breadcrumbs[breadcrumbs.length - 1]?.loading\"\n class=\"loading loading-spinner loading-xs\"\n ></span>\n <!-- Show label if provided -->\n <template v-else-if=\"breadcrumbs[breadcrumbs.length - 1]?.label\">\n {{ breadcrumbs[breadcrumbs.length - 1]!.label }}\n </template>\n <!-- Fallback -->\n <span v-else class=\"text-base-content/50\">...</span>\n </div>\n\n <!-- Optional status badge -->\n <slot name=\"mobile-status\"></slot>\n </div>\n </div>\n </div>\n <div class=\"flex-none gap-2\">\n <div class=\"form-control hidden sm:flex\">\n <!-- <input\n type=\"text\"\n placeholder=\"Search\"\n class=\"input-bordered input input-sm\"\n /> -->\n </div>\n\n <template v-if=\"loading\">\n <button class=\"loading btn-primary btn\" />\n </template>\n <template v-else-if=\"user.currentSession\">\n <label\n for=\"my-drawer-4\"\n tabindex=\"0\"\n class=\"btn-ghost btn-circle avatar btn placeholder\"\n id=\"right-nav-label\"\n >\n <div class=\"bg-neutral-focus text-neutral-content w-10 rounded-full\">\n <span>U</span>\n </div>\n </label>\n </template>\n <template v-else>\n <LoginButton />\n </template>\n </div>\n </nav>\n </header>\n</template>\n\n<script setup lang=\"ts\">\nimport type { Breadcrumb } from '../composables/useBreadcrumbs';\nimport { useUserSessionStore } from '@dragonmastery/dragoncore-vue';\nimport { ref } from 'vue';\nimport AppLink from './AppLink.vue';\nimport LoginButton from './LoginButton.vue';\n\ninterface Props {\n breadcrumbs?: Breadcrumb[];\n}\n\ndefineProps<Props>();\n\nconst loading = ref(true);\n\nloading.value = true;\nconst user = useUserSessionStore();\n\nloading.value = false;\n</script>\n","<template>\n <div class=\"flex items-center justify-center bg-base-100 mt-4\">\n <div class=\"max-w-md mx-auto text-center px-4\">\n <div class=\"mb-8\">\n <h1 class=\"text-9xl font-bold text-primary mb-4\">404</h1>\n <h2 class=\"text-3xl font-bold mb-4\">Page Not Found</h2>\n <p class=\"text-base-content/70 mb-8\">\n Sorry, we couldn't find the page you're looking for. The page may have been moved,\n deleted, or the URL might be incorrect.\n </p>\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <router-link :to=\"{ name: 'Home' }\" class=\"btn btn-primary\"> Go to Home </router-link>\n <button @click=\"goBack\" class=\"btn btn-outline\">Go Back</button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router';\n\nconst router = useRouter();\n\nconst goBack = () => {\n if (window.history.length > 1) {\n router.go(-1);\n } else {\n router.push({ name: 'Home' });\n }\n};\n</script>\n","<template>\n <input id=\"my-drawer-4\" type=\"checkbox\" class=\"drawer-toggle\" v-model=\"checked\" />\n <div class=\"drawer-side z-50\">\n <label for=\"my-drawer-4\" class=\"drawer-overlay\"></label>\n <ul class=\"menu p-3 w-80 h-full bg-base-200 text-base-content\">\n <div class=\"flex pb-2\">\n <div class=\"avatar placeholder\">\n <div class=\"bg-neutral-focus text-neutral-content w-10 h-10 rounded-full\">\n <span>U</span>\n </div>\n </div>\n\n <label class=\"pl-3\">\n {{ userSession.currentSession?.user?.username }}\n </label>\n <div class=\"grow\"></div>\n <label for=\"my-drawer-4\" class=\"btn-square btn btn-outline btn-sm\"> X </label>\n </div>\n <li @click=\"closeDrawer\">\n <AppLink to=\"/user/profile\">My User Profile</AppLink>\n </li>\n <div class=\"divider\"></div>\n <li @click=\"closeDrawer\"><AppLink to=\"/auth/logout\">Logout</AppLink></li>\n </ul>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from './AppLink.vue';\nimport { useUserSessionStore } from '@dragonmastery/dragoncore-vue';\nimport { ref } from 'vue';\n\nconst userSession = useUserSessionStore();\n\nlet checked = ref(false);\nfunction closeDrawer(_: MouseEvent) {\n //console.log('closeDrawer', payload);\n checked.value = false;\n}\n</script>\n","import { readonly } from 'vue';\n\nexport function useBuildTag() {\n const tag = {\n build_tag: import.meta.env.VITE_BUILD_TAG as string,\n };\n\n return readonly(tag);\n}\n","<template>\n <div\n class=\"drawer-side z-50\"\n style=\"scroll-behavior: smooth; scroll-padding-top: 5rem\"\n ref=\"drawersidebar\"\n >\n <label for=\"drawer\" class=\"drawer-overlay\"></label>\n <aside class=\"w-80 bg-base-200 h-full flex flex-col\">\n <div class=\"flex-1 overflow-y-auto overflow-x-hidden min-h-0\">\n <ul class=\"menu p-3 w-full text-base-content\">\n <div class=\"flex\">\n <div\n class=\"font-title inline-flex text-2xl text-primary transition-all duration-200\"\n >\n <img src=\"/images/logo_words-20250721.png\" alt=\"logo\" class=\"h-12\" />\n </div>\n <div class=\"grow\"></div>\n <label for=\"drawer\" class=\"btn-square btn btn-outline btn-sm\" ref=\"close_button\">\n X\n </label>\n </div>\n <li v-for=\"(routes, section) in sidebarSections\" :key=\"section\" class=\"w-full\">\n <div class=\"menu-title\">\n <span>{{ section }}</span>\n </div>\n <template v-for=\"route in routes\" :key=\"route.path\">\n <AppLink\n :to=\"getRouteLink(route)\"\n class=\"whitespace-nowrap block w-full\"\n @click=\"closeDrawer\"\n >{{ route.meta?.title || route.name }}</AppLink\n >\n </template>\n </li>\n </ul>\n </div>\n <div class=\"flex flex-col items-center justify-center w-full h-16\">\n <div class=\"text-xs text-neutral-500\">Version: {{ tag.build_tag }}</div>\n </div>\n </aside>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// Test update\nimport { useUserSessionStore } from '@dragonmastery/dragoncore-vue';\nimport { computed, ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { useBuildTag } from '../composables/useBuildTag';\nimport type { ExtendedRouteMeta, ExtendedRouteRecordRaw } from '../types/ExtendedRoute';\nimport AppLink from './AppLink.vue';\n\nconst user = useUserSessionStore();\nconst router = useRouter();\nconst tag = useBuildTag();\nconst close_button = ref<HTMLLabelElement | null>(null);\n\nconst sidebarSections = computed(() => {\n const allRoutes = router.getRoutes() as ExtendedRouteRecordRaw[];\n let sections = {} as Record<string, ExtendedRouteRecordRaw[]>;\n\n allRoutes.forEach((route) => {\n const meta = route.meta as ExtendedRouteMeta;\n if (meta.side_bar?.section) {\n const side_bar = meta.side_bar;\n const section = meta.side_bar.section;\n\n // Filter based on user type\n const userType = user.currentSession?.user.user_type;\n if (!userType || !side_bar.visible_to?.includes(userType)) {\n return;\n }\n\n if (!sections[section]) {\n sections[section] = [];\n }\n\n // Add the route to the corresponding section\n sections[section].push(route);\n }\n });\n\n //sort sections by alphabetical order\n sections = Object.keys(sections)\n .sort()\n .reduce(\n (obj, key) => {\n obj[key] = sections[key] || [];\n return obj;\n },\n {} as Record<string, ExtendedRouteRecordRaw[]>,\n );\n\n return sections;\n});\nfunction closeDrawer(_: MouseEvent) {\n // console.log('closeDrawer', payload);\n close_button.value?.click();\n}\n\nfunction getRouteLink(route: ExtendedRouteRecordRaw): string {\n // Simple link - filters will be restored from localStorage when TrackerList page loads\n return route.path;\n}\n</script>\n","<template>\n <div class=\"drawer drawer-end\">\n <RightSidebar />\n </div>\n <div class=\"drawer h-[calc(100vh_-_64px_-_64px)] bg-base-100\">\n <input id=\"my-drawer-4\" type=\"checkbox\" class=\"drawer-toggle\" />\n <div class=\"drawer-content\">\n <Navbar />\n\n <div class=\"pr-1 pl-1 md:pr-4 md:pl-4\">\n <RouterView />\n </div>\n </div>\n <Sidebar />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Navbar from '../components/Navbar.vue';\nimport RightSidebar from '../components/RightSidebar.vue';\nimport Sidebar from '../components/Sidebar.vue';\nimport { RouterView } from 'vue-router';\n</script>\n","<template>\n <div class=\"m-4\">\n <div class=\"flex justify-center mb-6\">\n <img src=\"/images/logo-20250721.png\" alt=\"logo\" class=\"h-24\" />\n </div>\n\n <div class=\"min-h-screen bg-base-100 flex flex-col\">\n <RouterView />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { RouterView } from 'vue-router';\n</script>\n","<template>\n <div class=\"m-4\">\n <AppLink\n to=\"/auth/login\"\n aria-current=\"page\"\n aria-label=\"Homepage\"\n class=\"flex-0 btn px-2 btn-accent\"\n >\n <div class=\"text-lg md:text-3xl\">\n <span>Login</span>\n </div>\n </AppLink>\n <RouterView />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../components/AppLink.vue';\nimport { RouterView } from 'vue-router';\n</script>\n","<template>\n <!-- Right sidebar drawer -->\n <div class=\"drawer drawer-end\">\n <RightSidebar />\n\n <!-- Left sidebar drawer -->\n <div class=\"drawer h-[calc(100vh_)]\">\n <input id=\"drawer\" type=\"checkbox\" class=\"drawer-toggle\" />\n <div class=\"drawer-content flex flex-col\">\n <!-- Fixed navbar at top with breadcrumbs -->\n <Navbar class=\"sticky top-0 z-30\" :breadcrumbs=\"currentBreadcrumbs\" />\n\n <!-- Unified navigation with AppHeader (only shown when needed) -->\n <div v-if=\"shouldShowAppHeader\" class=\"z-20\">\n <AppHeader :tabs=\"currentSectionTabs\" :active-tab=\"currentActiveTab\" />\n </div>\n\n <!-- Main content -->\n <div class=\"flex-1 px-3 sm:px-4 md:px-6 pb-4\">\n <RouterView />\n </div>\n </div>\n\n <!-- Left sidebar -->\n <Sidebar />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppHeader from '../components/AppHeader.vue';\nimport Navbar from '../components/Navbar.vue';\nimport RightSidebar from '../components/RightSidebar.vue';\nimport Sidebar from '../components/Sidebar.vue';\nimport {\n BREADCRUMB_KEY,\n type Breadcrumb,\n type BreadcrumbContext,\n} from '../composables/useBreadcrumbs';\nimport { useUserSessionStore } from '../composables/useUserSessionStore';\nimport { computed, provide, ref } from 'vue';\nimport { RouterView, useRoute } from 'vue-router';\n\ninterface Tab {\n id: string;\n label: string;\n to?: any; // router-link to prop\n meta?: Record<string, any>; // Additional metadata for matching\n}\n\nconst route = useRoute();\nconst user = useUserSessionStore();\n\n// Reactive breadcrumb override from components (legacy mode)\nconst componentBreadcrumbs = ref<Breadcrumb[] | null>(null);\n\n// Breadcrumb segments for nested breadcrumb support\nconst breadcrumbSegments = ref<Map<symbol, Breadcrumb[]>>(new Map());\n\n// Provide setter function for components to use\nprovide<BreadcrumbContext>(BREADCRUMB_KEY, {\n setBreadcrumbs: (breadcrumbs: Breadcrumb[] | null) => {\n componentBreadcrumbs.value = breadcrumbs;\n },\n setBreadcrumbSegment: (componentId: symbol, breadcrumbs: Breadcrumb[] | null) => {\n if (breadcrumbs === null) {\n breadcrumbSegments.value.delete(componentId);\n } else {\n breadcrumbSegments.value.set(componentId, breadcrumbs);\n }\n },\n});\n\n// Determine if we should show the app header based on section tabs\nconst shouldShowAppHeader = computed(() => {\n // Show header only when there are section tabs to display\n return currentSectionTabs.value.length > 0;\n});\n\n// Generate breadcrumbs based on the current route\nconst currentBreadcrumbs = computed<Breadcrumb[]>(() => {\n // 1. Priority: Merged breadcrumb segments (for nested breadcrumbs)\n if (breadcrumbSegments.value.size > 0) {\n // Merge all segments in order (components mount from parent to child)\n const merged: Breadcrumb[] = [];\n for (const segment of breadcrumbSegments.value.values()) {\n merged.push(...segment);\n }\n return merged;\n }\n\n // 2. Priority: Legacy component-provided breadcrumbs\n if (componentBreadcrumbs.value !== null) {\n return componentBreadcrumbs.value;\n }\n\n // 3. Fallback: If route has a getBreadcrumbs function, call it\n if (typeof route.meta.getBreadcrumbs === 'function') {\n return route.meta.getBreadcrumbs(route);\n }\n\n // 4. Fallback: If route has static breadcrumbs defined in meta\n if (route.meta.breadcrumbs) {\n return route.meta.breadcrumbs as Breadcrumb[];\n }\n\n // Otherwise generate default breadcrumbs based on route hierarchy\n const breadcrumbs: Breadcrumb[] = [];\n\n // Always include home\n breadcrumbs.push({\n label: 'Home',\n to: { name: 'Home' },\n });\n\n // Add section if applicable (e.g., Quotes, Users, etc.)\n if (route.meta.section) {\n breadcrumbs.push({\n label: route.meta.section as string,\n to: { name: route.meta.sectionRoute as string },\n });\n }\n\n // Add current page if it has a title\n if (route.meta.title && route.name !== 'Home') {\n breadcrumbs.push({\n label: route.meta.title as string,\n to: route,\n });\n }\n\n return breadcrumbs;\n});\n\n// Generate tabs based on the current route section\nconst currentSectionTabs = computed<Tab[]>(() => {\n // If route has custom tabs defined in meta, use those\n if (route.meta.sectionTabs) {\n const allTabs = route.meta.sectionTabs as Tab[];\n\n // Filter tabs based on visible_to property\n const userType = user.currentSession?.user.user_type;\n return allTabs.filter((tab) => {\n // If tab has visible_to, check if user type is included\n if ((tab as any).visible_to && userType) {\n return (tab as any).visible_to.includes(userType);\n }\n // If no visible_to specified, show to everyone\n return true;\n });\n }\n\n // Otherwise return empty array - no tabs at this level\n return [];\n});\n\n// Determine the active tab based on the current route\nconst currentActiveTab = computed<string>(() => {\n return (route.meta.currentTab as string) || '';\n});\n</script>\n","<template>\n <div class=\"form-control\" :class=\"{ 'md:col-span-2': fullWidth }\">\n <label class=\"label\">\n <span class=\"label-text font-medium\">{{ label }}</span>\n </label>\n <div class=\"text-base-content\">{{ value ?? '-' }}</div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps<{\n label: string;\n value?: string | number | null;\n fullWidth?: boolean;\n}>();\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg mb-4\">{{ title }}</h2>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps<{\n title: string;\n}>();\n</script>\n","<template>\n <div class=\"w-full px-2 sm:px-0\">\n <!-- File Manager Header -->\n <div class=\"mb-4\">\n <!-- Mobile: Stacked layout -->\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-3\">\n <h3 class=\"text-lg font-medium\">{{ config.title || 'Attachments' }}</h3>\n <!-- Mobile: Action buttons -->\n <div class=\"flex gap-2 sm:hidden\">\n <button\n class=\"btn btn-sm btn-primary flex-1\"\n @click=\"openFileSelector\"\n :disabled=\"isUploading\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n {{ config.addButtonText || 'Add Files' }}\n </button>\n <button class=\"btn btn-sm btn-info flex-1\" @click=\"createFolder\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n New Folder\n </button>\n </div>\n <!-- Desktop: Action buttons -->\n <div class=\"hidden sm:flex gap-2\">\n <button class=\"btn btn-sm btn-info\" @click=\"createFolder\">New Folder</button>\n </div>\n </div>\n\n <!-- Breadcrumb Navigation - Mobile optimized -->\n <div class=\"breadcrumbs text-xs sm:text-sm overflow-x-auto -mx-2 px-2\">\n <ul class=\"min-w-max\">\n <li>\n <button\n class=\"btn btn-sm sm:btn-xs btn-ghost min-h-[2.5rem] sm:min-h-0 py-2 sm:py-1\"\n @click=\"navigateToFolder(null)\"\n :class=\"{ 'btn-active': !currentFolderId }\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 sm:mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\"\n />\n </svg>\n <span class=\"hidden sm:inline\">Root</span>\n </button>\n </li>\n <li v-for=\"(folder, index) in folderPath\" :key=\"folder.id\">\n <button\n class=\"btn btn-sm sm:btn-xs btn-ghost min-h-[2.5rem] sm:min-h-0 py-2 sm:py-1 max-w-[8rem] sm:max-w-none truncate\"\n @click=\"navigateToFolder(folder.id)\"\n :class=\"{ 'btn-active': index === folderPath.length - 1 }\"\n :title=\"folder.name\"\n >\n {{ folder.name }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n <input\n ref=\"fileInput\"\n type=\"file\"\n class=\"hidden\"\n @change=\"handleFileChange\"\n multiple\n :accept=\"config.acceptedTypes\"\n />\n\n <!-- Drag & Drop Zone (hidden on mobile) -->\n <div\n class=\"hidden sm:block border-2 border-dashed rounded-lg p-6 text-center mb-4 transition-colors\"\n :class=\"{\n 'border-primary bg-primary/5 cursor-pointer': isDragging,\n 'border-base-300 hover:border-primary/50': !isDragging,\n }\"\n @dragover.prevent=\"isDragging = true\"\n @dragleave.prevent=\"isDragging = false\"\n @drop.prevent=\"handleFileDrop\"\n @click=\"openFileSelector\"\n >\n <div class=\"flex flex-col items-center justify-center py-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-12 w-12 mb-2 text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p class=\"text-lg font-medium\">\n {{ config.dropText || 'Drag and drop files here' }}\n </p>\n <p class=\"text-sm text-base-content/70 mt-1\">\n {{ config.browseText || 'or click to browse files' }}\n </p>\n <p v-if=\"config.acceptText\" class=\"text-xs text-base-content/50 mt-3\">\n {{ config.acceptText }}\n </p>\n </div>\n </div>\n\n <!-- Upload Queue -->\n <div v-if=\"uploadQueue.length > 0\" class=\"mb-4\">\n <div class=\"text-sm font-medium mb-2\">File uploads</div>\n <div class=\"space-y-3\">\n <div\n v-for=\"item in uploadQueue\"\n :key=\"item.id\"\n class=\"border border-base-200 rounded-lg p-3\"\n :class=\"{\n 'bg-success/5 border-success/30': item.status === 'success',\n 'bg-error/5 border-error/30': item.status === 'error',\n }\"\n >\n <div class=\"flex justify-between items-start mb-2\">\n <div class=\"flex-1\">\n <div class=\"flex items-center gap-2\">\n <!-- Status Icon -->\n <div\n v-if=\"item.status === 'uploading'\"\n class=\"loading loading-spinner loading-xs text-primary\"\n ></div>\n <svg\n v-else-if=\"item.status === 'success'\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 text-success\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n <svg\n v-else-if=\"item.status === 'error'\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 text-error\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n <div v-else class=\"h-4 w-4 rounded-full bg-base-300\"></div>\n\n <!-- Filename -->\n <div class=\"min-w-0 flex-1\">\n <div class=\"font-medium text-sm break-all\">\n {{ item.file.name }}\n </div>\n </div>\n </div>\n <div class=\"text-xs text-base-content/70 mt-1 ml-6\">\n {{ formatFileSize(item.file.size) }}\n </div>\n <div\n v-if=\"item.status === 'error' && item.errorMessage\"\n class=\"text-xs text-error mt-1 ml-6\"\n >\n {{ item.errorMessage }}\n </div>\n </div>\n\n <!-- Dismiss Button (X) -->\n <button\n v-if=\"item.status === 'success' || item.status === 'error'\"\n class=\"btn btn-xs btn-ghost btn-circle\"\n @click=\"removeFromQueue(item.id)\"\n aria-label=\"Dismiss notification\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Progress Bar -->\n <div v-if=\"item.status === 'uploading' || item.status === 'pending'\">\n <div class=\"flex justify-between text-xs mb-1\">\n <span>{{ item.status === 'uploading' ? 'Uploading...' : 'Waiting...' }}</span>\n <span v-if=\"item.status === 'uploading'\">{{ item.progress.toFixed(2) }}%</span>\n </div>\n <progress\n class=\"progress w-full\"\n :class=\"{\n 'progress-primary': item.status === 'uploading',\n 'progress-secondary opacity-50': item.status === 'pending',\n }\"\n :value=\"item.status === 'uploading' ? item.progress : 0\"\n max=\"100\"\n ></progress>\n </div>\n\n <!-- Success/Error Message -->\n <div v-if=\"item.status === 'success'\" class=\"text-xs text-success mt-1\">\n Upload complete\n </div>\n <div v-if=\"item.status === 'error'\" class=\"text-xs text-error mt-1\">\n Upload failed - dismiss and try again\n </div>\n </div>\n </div>\n </div>\n\n <!-- Folder list (mobile) -->\n <div v-if=\"folders.length > 0\" class=\"block sm:hidden mb-4\">\n <div\n v-for=\"folder in folders\"\n :key=\"folder.id\"\n class=\"card card-compact bg-base-100 shadow-sm mb-3 border border-base-200 active:scale-[0.98] transition-transform\"\n @click=\"enterFolder(folder.id)\"\n >\n <div class=\"card-body py-4\">\n <div class=\"flex items-center gap-3\">\n <div class=\"badge badge-secondary badge-lg\">FOLDER</div>\n <h3 class=\"card-title text-base break-words flex-1\">\n {{ folder.name }}\n </h3>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5 text-base-content/50\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </div>\n </div>\n </div>\n </div>\n\n <!-- File List for Mobile -->\n <div v-if=\"attachments.length > 0\" class=\"block sm:hidden\">\n <div\n v-for=\"(file, index) in attachments\"\n :key=\"index\"\n class=\"card card-compact bg-base-100 shadow-sm mb-3 border border-base-200\"\n >\n <div class=\"card-body\">\n <div class=\"flex items-center gap-2 mb-2\">\n <div class=\"badge\" :class=\"getFileTypeBadgeClass(file.type)\">\n {{ getFileTypeLabel(file.type) }}\n </div>\n <h3 class=\"card-title text-base break-all\">{{ file.name }}</h3>\n </div>\n <div class=\"grid grid-cols-2 text-sm mb-3\">\n <div>\n <span class=\"text-base-content/70\">Size:</span>\n {{ formatFileSize(file.size) }}\n </div>\n <div>\n <span class=\"text-base-content/70\">Uploaded:</span>\n {{ formatDate(file.uploadedAt) }}\n </div>\n </div>\n <div class=\"card-actions justify-between mt-3 gap-2\">\n <button class=\"btn btn-sm flex-1 min-h-[2.75rem]\" @click=\"downloadFile(file)\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </button>\n <button\n class=\"btn btn-sm btn-outline btn-error flex-1 min-h-[2.75rem]\"\n @click=\"confirmDeleteFile(file)\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n Delete\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Folder and File List for Tablet/Desktop -->\n <div\n v-if=\"folders.length > 0 || attachments.length > 0\"\n class=\"hidden sm:block overflow-x-auto\"\n >\n <table class=\"table table-zebra w-full\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Size</th>\n <th>Uploaded</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n <!-- Folders -->\n <tr\n v-for=\"folder in folders\"\n :key=\"folder.id\"\n class=\"cursor-pointer\"\n @click=\"enterFolder(folder.id)\"\n >\n <td>\n <div class=\"flex items-center gap-3\">\n <div class=\"badge badge-secondary badge-sm\">FOLDER</div>\n <div class=\"font-medium break-all max-w-[200px] md:max-w-[500px]\">\n {{ folder.name }}\n <span\n v-if=\"folder.file_count !== undefined\"\n class=\"text-xs text-base-content/60 ml-2\"\n >\n ({{ folder.file_count }})\n </span>\n </div>\n </div>\n </td>\n <td>—</td>\n <td>—</td>\n <td>—</td>\n </tr>\n <!-- Files -->\n <tr v-for=\"(file, index) in attachments\" :key=\"index\">\n <td>\n <div class=\"flex items-center gap-3\">\n <div class=\"badge badge-sm\" :class=\"getFileTypeBadgeClass(file.type)\">\n {{ getFileTypeLabel(file.type) }}\n </div>\n <div class=\"font-medium break-all max-w-[200px] md:max-w-[500px]\">\n {{ file.name }}\n </div>\n </div>\n </td>\n <td>{{ formatFileSize(file.size) }}</td>\n <td>{{ formatDate(file.uploadedAt) }}</td>\n <td>\n <div class=\"flex gap-2\">\n <button class=\"btn btn-sm btn-ghost btn-circle\" @click=\"downloadFile(file)\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n </button>\n <button\n class=\"btn btn-sm btn-ghost btn-circle text-error\"\n @click=\"confirmDeleteFile(file)\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Loading State -->\n <div v-else-if=\"fetchingAttachments\" class=\"text-center py-8\">\n <div class=\"flex justify-center\">\n <span class=\"loading loading-spinner loading-md\"></span>\n </div>\n <p class=\"text-base-content/70 mt-2\">\n {{ config.loadingText || 'Loading attachments...' }}\n </p>\n </div>\n\n <!-- Empty State -->\n <div v-else-if=\"!isUploading\" class=\"text-center py-8\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-12 w-12 mx-auto mb-3 text-base-content/30\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 13h6m-3-3v6m5 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <p class=\"text-base-content/70\">\n {{ config.emptyText || 'No attachments yet' }}\n </p>\n <!-- Desktop instruction -->\n <p class=\"hidden sm:block text-sm text-base-content/70 mt-2\">\n {{ config.instructionText || 'Use the drag and drop area above to add files' }}\n </p>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"attachmentsError\" class=\"text-center py-8\">\n <p class=\"text-error\">\n {{ config.errorText || 'Failed to load attachments' }}\n </p>\n <button class=\"btn btn-sm btn-outline mt-2\" @click=\"refreshAttachments\">\n {{ config.retryText || 'Try Again' }}\n </button>\n </div>\n\n <!-- Create Folder Modal -->\n <InputModal\n v-model=\"showCreateFolderModal\"\n :title=\"config.createFolderTitle || 'Create New Folder'\"\n :label=\"config.folderNameLabel || 'Folder Name'\"\n placeholder=\"Enter folder name\"\n :confirm-text=\"config.createFolderButtonText || 'Create'\"\n :cancel-text=\"config.cancelText || 'Cancel'\"\n @confirm=\"handleCreateFolder\"\n />\n\n <!-- Delete Confirmation Modal -->\n <ConfirmDialog\n v-model=\"showDeleteModal\"\n :title=\"config.deleteTitle || 'Confirm Deletion'\"\n :confirm-text=\"config.confirmDeleteText || 'Delete'\"\n :cancel-text=\"config.cancelText || 'Cancel'\"\n confirm-button-class=\"btn-error\"\n @confirm=\"deleteFile\"\n >\n <template #message>\n <p class=\"mb-4\">\n {{\n config.deleteMessage ||\n 'Are you sure you want to delete this file? This action cannot be undone.'\n }}\n </p>\n <div v-if=\"fileToDelete\" class=\"bg-base-200 rounded-lg p-3 space-y-1 text-sm\">\n <div class=\"flex items-center gap-2\">\n <div class=\"badge badge-sm\" :class=\"getFileTypeBadgeClass(fileToDelete.type)\">\n {{ getFileTypeLabel(fileToDelete.type) }}\n </div>\n <span class=\"font-medium\">{{ fileToDelete.name }}</span>\n </div>\n <div class=\"text-base-content/70\">\n <div>\n <span class=\"font-medium\">Size:</span>\n {{ formatFileSize(fileToDelete.size) }}\n </div>\n <div>\n <span class=\"font-medium\">Uploaded:</span>\n {{ formatDate(fileToDelete.uploadedAt) }}\n </div>\n </div>\n </div>\n </template>\n </ConfirmDialog>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"TApi extends DragoncoreApi = DragoncoreApi\">\nimport type { DragoncoreApi, RecordType } from '@dragonmastery/dragoncore-shared';\nimport { useEnv, useUserSessionStore } from '@dragonmastery/dragoncore-vue';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { useMutation } from '../../composables/useMutation';\nimport { useQuery } from '../../composables/useQuery';\nimport ConfirmDialog from '../ConfirmDialog.vue';\nimport InputModal from '../InputModal.vue';\nimport type { FileManagerConfig } from './FileManagerConfig';\n\ninterface Attachment {\n id: string;\n name: string;\n size: number;\n type: string;\n uploadedAt: Date;\n}\n\ninterface QueueItem {\n id: string;\n file: File;\n status: 'pending' | 'uploading' | 'success' | 'error';\n progress: number;\n errorMessage?: string;\n}\n\nconst props = defineProps<{\n recordId: string;\n recordType: RecordType;\n config?: FileManagerConfig;\n}>();\n\nconst config = computed(() => props.config || {});\nconst envConfig = useEnv();\n\n// Default max file size: 50MB (50 * 1024 * 1024 bytes)\nconst DEFAULT_MAX_FILE_SIZE = 50 * 1024 * 1024;\nconst maxFileSize = computed(\n () => config.value.maxFileSize ?? envConfig.maxAttachmentFileSize ?? DEFAULT_MAX_FILE_SIZE,\n);\n\n// Router for URL navigation\nconst route = useRoute();\nconst router = useRouter();\n\n// File upload references\nconst fileInput = ref<HTMLInputElement | null>(null);\nconst isDragging = ref(false);\nconst isUploading = ref(false);\n\n// File queue management\nconst uploadQueue = ref<QueueItem[]>([]);\nconst currentUploadId = ref<string | null>(null);\n\n// File management state\nconst attachments = ref<Attachment[]>([]);\nconst folders = ref<\n {\n id: string;\n name: string;\n parent_folder_id?: string | null;\n file_count?: number;\n }[]\n>([]);\nconst currentFolderId = ref<string | null>(null);\nconst folderPath = ref<{ id: string; name: string }[]>([]);\nconst showDeleteModal = ref(false);\nconst showCreateFolderModal = ref(false);\nconst fileToDelete = ref<Attachment | null>(null);\n\n// Mutations\nconst { mutate: deleteAttachment } = useMutation<TApi>(\n (api, input: { id: string }) => api.attachments.deleteAttachment(input.id),\n { invalidate: /^attachments?:/ },\n);\n\nconst { mutate: createFolderMutation } = useMutation<TApi>(\n (\n api,\n input: {\n record_id: string;\n record_type: string;\n folder_name: string;\n parent_folder_id?: string | null;\n },\n ) => api.attachments.createFolder(input),\n { invalidate: /^attachments?:/ },\n);\n\n// Query for attachments\nconst {\n data: attachmentsData,\n loading: fetchingAttachments,\n error: attachmentsError,\n refetch: refetchAttachments,\n} = useQuery<TApi>(\n async (api) => {\n const filters: any = {\n limit: 50,\n include_folders: true,\n };\n\n // Explicitly set folder_id to null for root, or the folder ID\n if (currentFolderId.value === null) {\n filters.folder_id = null;\n } else if (currentFolderId.value) {\n filters.folder_id = currentFolderId.value;\n }\n\n return await api.attachments.listAttachments({\n record_id: props.recordId,\n record_type: props.recordType,\n filters,\n });\n },\n {\n staleTime: 2 * 60 * 1000,\n },\n);\n\n// Query for all folders (to build breadcrumb path)\nconst shouldFetchAllFolders = computed(\n () => !!currentFolderId.value && folderPath.value.length === 0,\n);\nconst { data: allFoldersData, refetch: refetchAllFolders } = useQuery<TApi>(\n async (api) => {\n const filters: any = {\n limit: 1000, // Get all folders\n include_folders: true,\n };\n\n return await api.attachments.listAttachments({\n record_id: props.recordId,\n record_type: props.recordType,\n filters,\n });\n },\n {\n enabled: shouldFetchAllFolders,\n watch: [currentFolderId, folderPath],\n staleTime: 5 * 60 * 1000,\n },\n);\n\n// Transform the API response to match our Attachment interface\nconst transformAttachments = computed(() => {\n if (!attachmentsData.value) return [];\n const files: Attachment[] = [];\n const folderList: {\n id: string;\n name: string;\n parent_folder_id?: string | null;\n file_count?: number;\n }[] = [];\n\n // Process folders\n const folderItems = attachmentsData.value.folders || [];\n for (const item of folderItems) {\n folderList.push({\n id: item.id,\n name: item.original_name,\n parent_folder_id: item.parent_folder_id ?? null,\n file_count: (item as any).file_count ?? 0,\n });\n }\n\n // Process files\n const fileItems = attachmentsData.value.files || [];\n for (const item of fileItems) {\n files.push({\n id: item.id,\n name: item.original_name,\n size: parseInt(item.file_size || '0'),\n type: item.content_type || '',\n uploadedAt: new Date(item.created_at),\n });\n }\n\n folders.value = folderList;\n\n return files;\n});\n\n// Initialize folder from URL query param on mount\nonMounted(() => {\n const folderIdFromUrl = route.query.folder_id as string | undefined;\n if (folderIdFromUrl) {\n currentFolderId.value = folderIdFromUrl;\n // Query all folders to build the breadcrumb path\n refetchAllFolders();\n }\n});\n\n// Watch for URL changes (e.g., browser back/forward)\nwatch(\n () => route.query.folder_id,\n (newFolderId) => {\n const folderId = (newFolderId as string) || null;\n if (folderId !== currentFolderId.value) {\n currentFolderId.value = folderId;\n // Reset path - it will be rebuilt when attachments load\n folderPath.value = [];\n // Query all folders to rebuild path if we have a folder ID\n if (folderId) {\n refetchAllFolders();\n }\n refreshAttachments();\n }\n },\n);\n\n// Watch for allFoldersData to build path when it's available\nwatch(\n () => allFoldersData.value?.folders,\n (allFoldersList) => {\n if (currentFolderId.value && folderPath.value.length === 0 && allFoldersList) {\n type FolderMapEntry = {\n id: string;\n name: string;\n parent_folder_id: string | null | undefined;\n };\n const allFoldersMap = new Map<string, FolderMapEntry>(\n allFoldersList.map((f: any) => [\n f.id,\n {\n id: f.id,\n name: f.original_name,\n parent_folder_id: f.parent_folder_id,\n },\n ]),\n );\n\n const path: { id: string; name: string }[] = [];\n let currentFolderIdToFind: string | null = currentFolderId.value;\n const visited = new Set<string>();\n\n // Traverse up the hierarchy from current folder to root\n while (currentFolderIdToFind) {\n if (visited.has(currentFolderIdToFind)) {\n // Circular reference, break\n break;\n }\n visited.add(currentFolderIdToFind);\n\n const folder = allFoldersMap.get(currentFolderIdToFind);\n if (!folder) {\n // Folder not found, can't build full path\n break;\n }\n\n path.unshift({ id: folder.id, name: folder.name });\n\n if (!folder.parent_folder_id) {\n // Reached root\n break;\n }\n\n currentFolderIdToFind = folder.parent_folder_id;\n }\n\n folderPath.value = path;\n }\n },\n);\n\n// Update attachments when data changes\nwatch(\n transformAttachments,\n (newAttachments) => {\n attachments.value = newAttachments;\n },\n { immediate: true },\n);\n\n// Update URL query param when folder changes\nconst updateUrlFolder = (folderId: string | null) => {\n const query = { ...route.query };\n if (folderId) {\n query.folder_id = folderId;\n } else {\n delete query.folder_id;\n }\n router.replace({ query });\n};\n\n// Navigate into a folder\nconst enterFolder = (folderId: string) => {\n const folder = folders.value.find((f) => f.id === folderId);\n if (folder) {\n folderPath.value.push({ id: folder.id, name: folder.name });\n currentFolderId.value = folderId;\n updateUrlFolder(folderId);\n refreshAttachments();\n }\n};\n\n// Navigate to a specific folder (used by breadcrumb)\nconst navigateToFolder = (folderId: string | null) => {\n if (folderId === null) {\n // Navigate to root\n folderPath.value = [];\n currentFolderId.value = null;\n } else {\n // Find the folder in the path and truncate to that point\n const index = folderPath.value.findIndex((f) => f.id === folderId);\n if (index !== -1) {\n folderPath.value = folderPath.value.slice(0, index + 1);\n currentFolderId.value = folderId;\n } else {\n // Folder not in path, just navigate to it\n const folder = folders.value.find((f) => f.id === folderId);\n if (folder) {\n folderPath.value = [{ id: folder.id, name: folder.name }];\n currentFolderId.value = folderId;\n }\n }\n }\n updateUrlFolder(folderId);\n refreshAttachments();\n};\n\n// Refresh attachments after upload\nconst refreshAttachments = () => {\n refetchAttachments();\n};\n\n// File input handlers\nconst openFileSelector = () => {\n fileInput.value?.click();\n};\n\nconst handleFileChange = async (event: Event) => {\n const target = event.target as HTMLInputElement;\n const files = target.files;\n\n if (files && files.length > 0) {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n if (file) {\n // Validate file size\n if (file.size > maxFileSize.value) {\n uploadQueue.value.push({\n id: crypto.randomUUID(),\n file: file,\n status: 'error',\n progress: 0,\n errorMessage: `File size (${formatFileSize(file.size)}) exceeds maximum allowed size (${formatFileSize(maxFileSize.value)})`,\n });\n continue;\n }\n\n uploadQueue.value.push({\n id: crypto.randomUUID(),\n file: file,\n status: 'pending',\n progress: 0,\n });\n }\n }\n\n if (!isUploading.value) {\n processUploadQueue();\n }\n\n target.value = '';\n }\n};\n\nconst handleFileDrop = async (event: DragEvent) => {\n isDragging.value = false;\n const files = event.dataTransfer?.files;\n\n if (files && files.length > 0) {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n if (file) {\n // Validate file size\n if (file.size > maxFileSize.value) {\n uploadQueue.value.push({\n id: crypto.randomUUID(),\n file: file,\n status: 'error',\n progress: 0,\n errorMessage: `File size (${formatFileSize(file.size)}) exceeds maximum allowed size (${formatFileSize(maxFileSize.value)})`,\n });\n continue;\n }\n\n uploadQueue.value.push({\n id: crypto.randomUUID(),\n file: file,\n status: 'pending',\n progress: 0,\n });\n }\n }\n\n if (!isUploading.value) {\n processUploadQueue();\n }\n }\n};\n\n// Remove an item from the queue\nconst removeFromQueue = (id: string) => {\n const index = uploadQueue.value.findIndex((item) => item.id === id);\n if (index !== -1) {\n uploadQueue.value.splice(index, 1);\n }\n};\n\n// Process the upload queue\nconst processUploadQueue = async () => {\n const nextItem = uploadQueue.value.find((item) => item.status === 'pending');\n\n if (!nextItem) {\n isUploading.value = false;\n return;\n }\n\n isUploading.value = true;\n currentUploadId.value = nextItem.id;\n\n nextItem.status = 'uploading';\n\n await uploadFile(nextItem);\n\n if (uploadQueue.value.some((item) => item.status === 'pending')) {\n processUploadQueue();\n } else {\n isUploading.value = false;\n currentUploadId.value = null;\n }\n};\n\n// File upload function with progress simulation\nconst uploadFile = async (item: QueueItem) => {\n const progressInterval = setInterval(() => {\n item.progress += Math.random() * 10;\n item.progress = Math.round(item.progress * 100) / 100;\n if (item.progress >= 99) {\n item.progress = 99;\n }\n }, 200);\n\n try {\n const env = useEnv();\n const userStore = useUserSessionStore();\n\n // Create FormData for file upload\n const formData = new FormData();\n formData.append('file', item.file);\n formData.append('file_name', item.file.name);\n formData.append('record_id', props.recordId);\n formData.append('record_type', props.recordType);\n if (currentFolderId.value) {\n formData.append('folder_id', currentFolderId.value);\n }\n\n const response = await fetch(\n `${env.restApiClient.apiUrl}/attachments/${props.recordType}/${props.recordId}`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${userStore.accessToken}`,\n },\n body: formData,\n },\n );\n\n if (!response.ok) {\n throw new Error(`Upload failed: ${response.statusText}`);\n }\n\n const result = await response.json();\n\n if (result && result.id) {\n clearInterval(progressInterval);\n item.progress = 100;\n item.status = 'success';\n refreshAttachments();\n } else {\n clearInterval(progressInterval);\n item.status = 'error';\n item.errorMessage = 'Upload failed: Invalid response';\n }\n } catch (error) {\n console.error('Upload failed:', error);\n clearInterval(progressInterval);\n item.status = 'error';\n item.errorMessage = error instanceof Error ? error.message : 'Upload failed';\n }\n};\n\n// Create folder\nconst createFolder = () => {\n showCreateFolderModal.value = true;\n};\n\nconst handleCreateFolder = async (folderName: string) => {\n try {\n await createFolderMutation({\n record_id: props.recordId,\n record_type: props.recordType,\n folder_name: folderName,\n parent_folder_id: currentFolderId.value || null,\n });\n showCreateFolderModal.value = false;\n refreshAttachments();\n } catch (error) {\n console.error('Create folder failed:', error);\n }\n};\n\nconst env = useEnv();\nconst useSession = useUserSessionStore();\n\n// File management functions\nconst downloadFile = async (file: Attachment | null) => {\n if (!file) return;\n const res = await fetch(\n `${env.restApiClient.apiUrl}/attachments/${props.recordType}/${file.id}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${useSession.accessToken}`,\n },\n },\n );\n if (!res.ok) {\n throw new Error('Failed to download file');\n }\n const blob = await res.blob();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = file.name;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n};\n\nconst confirmDeleteFile = (file: Attachment) => {\n fileToDelete.value = file;\n showDeleteModal.value = true;\n};\n\nconst deleteFile = async () => {\n if (!fileToDelete.value) return;\n\n try {\n await deleteAttachment({ id: fileToDelete.value.id });\n\n refreshAttachments();\n showDeleteModal.value = false;\n fileToDelete.value = null;\n } catch (error) {\n console.error('Delete failed:', error);\n }\n};\n\n// Utility functions\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n};\n\nconst formatDate = (date: Date): string => {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }).format(date);\n};\n\nconst getFileTypeLabel = (type: string): string => {\n if (type.includes('pdf')) return 'PDF';\n if (type.includes('word') || type.includes('doc')) return 'DOC';\n if (type.includes('sheet') || type.includes('excel') || type.includes('xls')) return 'XLS';\n if (type.includes('image')) return 'IMG';\n return 'FILE';\n};\n\nconst getFileTypeBadgeClass = (type: string): string => {\n if (type.includes('pdf')) return 'badge-error';\n if (type.includes('word') || type.includes('doc')) return 'badge-primary';\n if (type.includes('sheet') || type.includes('excel') || type.includes('xls'))\n return 'badge-success';\n if (type.includes('image')) return 'badge-warning';\n return 'badge-neutral';\n};\n</script>\n","<template>\n <div class=\"key-value-editor col-span-full\">\n <div v-if=\"label || helpText\" class=\"mb-2\">\n <label v-if=\"label\" class=\"label p-0\">\n <span class=\"label-text\">{{ label }}</span>\n </label>\n <p v-if=\"helpText\" class=\"text-xs text-base-content/60 mt-1\">\n {{ helpText }}\n </p>\n </div>\n\n <div v-if=\"error\" class=\"text-error text-sm mb-2\">{{ error }}</div>\n\n <div class=\"space-y-3\">\n <!-- Key-Value Pairs List -->\n <div v-for=\"(pair, index) in pairs\" :key=\"index\" class=\"flex gap-2 items-start\">\n <div class=\"flex-1\">\n <input\n v-model=\"pair.key\"\n type=\"text\"\n :placeholder=\"keyPlaceholder\"\n class=\"input input-bordered w-full\"\n @input=\"updatePair(index, 'key', ($event.target as HTMLInputElement).value)\"\n />\n </div>\n <div class=\"flex-1\">\n <input\n v-model=\"pair.value\"\n type=\"text\"\n :placeholder=\"valuePlaceholder\"\n class=\"input input-bordered w-full\"\n @input=\"updatePair(index, 'value', ($event.target as HTMLInputElement).value)\"\n />\n </div>\n <button\n type=\"button\"\n class=\"btn btn-error btn-sm\"\n @click=\"removePair(index)\"\n :disabled=\"pairs.length === 1 && !pair.key && !pair.value\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Add New Pair Button -->\n <button type=\"button\" class=\"btn btn-outline btn-sm w-full\" @click=\"addPair\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n Add Key-Value Pair\n </button>\n </div>\n\n <!-- Empty State -->\n <div v-if=\"pairs.length === 0\" class=\"text-center py-4 text-base-content/60\">\n No key-value pairs. Click \"Add Key-Value Pair\" to get started.\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { nextTick, ref, watch } from 'vue';\n\ninterface KeyValuePair {\n key: string;\n value: string;\n}\n\ninterface Props {\n modelValue?: string | null;\n label?: string;\n helpText?: string;\n keyPlaceholder?: string;\n valuePlaceholder?: string;\n error?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: null,\n label: 'Key-Value Pairs',\n helpText: 'Add custom metadata as key-value pairs',\n keyPlaceholder: 'Key',\n valuePlaceholder: 'Value',\n error: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | null];\n}>();\n\n// Parse JSON string to key-value pairs\nconst parseJsonToPairs = (jsonString: string | null | undefined): KeyValuePair[] => {\n if (!jsonString || jsonString.trim() === '') {\n return [{ key: '', value: '' }];\n }\n\n try {\n const parsed = JSON.parse(jsonString);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return [{ key: '', value: '' }];\n }\n\n const pairs: KeyValuePair[] = Object.entries(parsed).map(([key, value]) => ({\n key,\n value: String(value),\n }));\n\n return pairs.length > 0 ? pairs : [{ key: '', value: '' }];\n } catch {\n // If JSON parsing fails, return empty pair\n return [{ key: '', value: '' }];\n }\n};\n\n// Convert key-value pairs to JSON string\nconst pairsToJson = (pairs: KeyValuePair[]): string | null => {\n // Filter out empty pairs (both key and value empty)\n const validPairs = pairs.filter(\n (pair) => pair.key.trim() !== '' || pair.value.trim() !== '',\n );\n\n if (validPairs.length === 0) {\n return null;\n }\n\n // Build object from pairs\n const obj: Record<string, string> = {};\n for (const pair of validPairs) {\n if (pair.key.trim() !== '') {\n obj[pair.key.trim()] = pair.value.trim();\n }\n }\n\n // Return null if object is empty, otherwise return JSON string\n return Object.keys(obj).length === 0 ? null : JSON.stringify(obj);\n};\n\nconst pairs = ref<KeyValuePair[]>(parseJsonToPairs(props.modelValue));\nconst isInternalUpdate = ref(false);\n\n// Watch for external changes to modelValue\nwatch(\n () => props.modelValue,\n (newValue) => {\n // Skip if this is an internal update\n if (isInternalUpdate.value) {\n return;\n }\n\n const newPairs = parseJsonToPairs(newValue);\n // Only update if the pairs are actually different\n const currentJson = pairsToJson(pairs.value);\n if (currentJson !== newValue) {\n pairs.value = newPairs;\n }\n },\n { immediate: true },\n);\n\n// Watch for internal changes and emit updates\nwatch(\n pairs,\n async (newPairs) => {\n isInternalUpdate.value = true;\n const jsonString = pairsToJson(newPairs);\n emit('update:modelValue', jsonString);\n // Reset flag after next tick to allow external updates\n await nextTick();\n isInternalUpdate.value = false;\n },\n { deep: true },\n);\n\nconst addPair = () => {\n pairs.value.push({ key: '', value: '' });\n};\n\nconst removePair = (index: number) => {\n if (pairs.value.length > 1) {\n pairs.value.splice(index, 1);\n } else {\n // If it's the last pair, just clear it\n pairs.value[0] = { key: '', value: '' };\n }\n};\n\nconst updatePair = (index: number, field: 'key' | 'value', value: string) => {\n const pair = pairs.value[index];\n if (!pair) return;\n pair[field] = value;\n};\n</script>\n\n<style scoped>\n.key-value-editor {\n @apply w-full;\n}\n</style>\n","<template>\n <!-- Loading State -->\n <div v-if=\"isLoading\" class=\"text-center py-8\">\n <slot name=\"loading\">\n <div class=\"flex justify-center\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n <p class=\"text-base-content/70 mt-2\">\n {{ config.loadingText || 'Loading...' }}\n </p>\n </slot>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"text-center py-8\">\n <slot name=\"error\" :error=\"error\" :retry=\"handleRetry\">\n <div class=\"alert alert-error max-w-md mx-auto\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <h3 class=\"font-bold\">\n {{ config.errorTitle || 'Error' }}\n </h3>\n <div class=\"text-sm\">\n {{ getErrorMessage(error) }}\n </div>\n <button\n v-if=\"config.showRetry !== false\"\n class=\"btn btn-sm btn-outline mt-2\"\n @click=\"handleRetry\"\n >\n {{ config.retryText || 'Try Again' }}\n </button>\n </div>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ninterface LoadingErrorStatesConfig {\n loadingText?: string;\n errorTitle?: string;\n retryText?: string;\n showRetry?: boolean;\n customErrorMessage?: (error: Error) => string;\n}\n\nconst props = defineProps<{\n isLoading?: boolean;\n error?: Error | null;\n config?: LoadingErrorStatesConfig;\n}>();\n\nconst emit = defineEmits<{\n retry: [];\n}>();\n\nconst config = computed(() => props.config || {});\n\nfunction getErrorMessage(error: Error): string {\n if (config.value.customErrorMessage) {\n return config.value.customErrorMessage(error);\n }\n\n return error.message || 'An unexpected error occurred';\n}\n\nfunction handleRetry() {\n emit('retry');\n}\n</script>\n","<template>\n <div v-if=\"changedFields.length > 0\" class=\"card bg-base-100 shadow-sm mb-4\">\n <div class=\"card-body p-3 sm:p-5\">\n <div class=\"flex justify-between items-center\">\n <h2 class=\"card-title text-base sm:text-lg\">\n {{ config.title || 'Changes in This Version' }}\n </h2>\n <button @click=\"showChanges = !showChanges\" class=\"btn btn-sm btn-info\">\n {{\n showChanges ? config.hideText || 'Hide Changes' : config.showText || 'Show Changes'\n }}\n </button>\n </div>\n\n <div v-if=\"showChanges\">\n <!-- Desktop view - table format -->\n <div class=\"hidden md:block overflow-x-auto mt-4\">\n <table class=\"table table-zebra table-sm\">\n <thead>\n <tr>\n <th>{{ config.fieldColumnHeader || 'Field' }}</th>\n <th>{{ config.previousColumnHeader || 'Previous Value' }}</th>\n <th>{{ config.newColumnHeader || 'New Value' }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(change, index) in changedFields\" :key=\"index\">\n <td class=\"font-mono text-xs\">\n {{ formatFieldName(change.path) }}\n </td>\n <td>{{ formatValue(change.oldValue) }}</td>\n <td>{{ formatValue(change.newValue) }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Mobile view - card format -->\n <div class=\"md:hidden space-y-4 mt-4\">\n <div\n v-for=\"(change, index) in changedFields\"\n :key=\"index\"\n class=\"border border-base-300 rounded-lg p-3\"\n >\n <div class=\"mb-2\">\n <span class=\"font-mono text-xs font-bold\">{{\n formatFieldName(change.path)\n }}</span>\n </div>\n <div class=\"grid grid-cols-2 gap-2\">\n <div>\n <div class=\"text-xs text-base-content/70 mb-1\">\n {{ config.previousLabel || 'Previous:' }}\n </div>\n <div class=\"text-sm break-words\">\n {{ formatValue(change.oldValue) }}\n </div>\n </div>\n <div>\n <div class=\"text-xs text-base-content/70 mb-1\">\n {{ config.newLabel || 'New:' }}\n </div>\n <div class=\"text-sm break-words\">\n {{ formatValue(change.newValue) }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div v-else class=\"mt-2 text-sm text-base-content/70\">\n {{ changedFields.length }}\n {{\n changedFields.length === 1\n ? config.fieldSingular || 'field'\n : config.fieldPlural || 'fields'\n }}\n changed\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport type { PropertyChange } from './RecordVersionViewerConfig';\n\ninterface RecordChangesSummaryConfig {\n title?: string;\n showText?: string;\n hideText?: string;\n fieldColumnHeader?: string;\n previousColumnHeader?: string;\n newColumnHeader?: string;\n previousLabel?: string;\n newLabel?: string;\n fieldSingular?: string;\n fieldPlural?: string;\n fieldNameFormatter?: (path: string) => string;\n valueFormatter?: (value: any, path: string) => string;\n customFieldLabels?: Record<string, string>;\n}\n\nconst props = defineProps<{\n changedFields: PropertyChange[];\n config?: RecordChangesSummaryConfig;\n}>();\n\nconst config = computed(() => props.config || {});\n\n// State for showing/hiding changes - hidden by default\nconst showChanges = ref(false);\n\n// Default field name formatter - converts camelCase and dot notation to readable labels\nfunction defaultFieldNameFormatter(path: string): string {\n // Check for custom field labels first\n if (config.value.customFieldLabels?.[path]) {\n return config.value.customFieldLabels[path];\n }\n\n return path\n .split('.')\n .map((segment) =>\n segment\n .replace(/([A-Z])/g, ' $1') // Add space before capital letters\n .replace(/^./, (str) => str.toUpperCase()) // Capitalize first letter\n .trim(),\n )\n .join(' → '); // Use arrow to show nesting\n}\n\n// Format field name for display\nfunction formatFieldName(path: string): string {\n if (config.value.fieldNameFormatter) {\n return config.value.fieldNameFormatter(path);\n }\n return defaultFieldNameFormatter(path);\n}\n\n// Default value formatter\nfunction defaultValueFormatter(value: any): string {\n if (value === null || value === undefined) return 'N/A';\n\n // Handle objects and arrays\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n return value.length === 0 ? 'Empty array' : `Array (${value.length} items)`;\n }\n return JSON.stringify(value, null, 2);\n }\n\n // Handle boolean values\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n\n // Handle numbers with potential formatting\n if (typeof value === 'number') {\n // Format currency if it looks like a monetary value\n if (value > 0 && (value % 1 === 0 || value.toString().includes('.'))) {\n // Simple currency detection - could be made more sophisticated\n return value.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n }\n return value.toString();\n }\n\n // Default to string representation\n return String(value);\n}\n\n// Format value for display\nfunction formatValue(value: any, path?: string): string {\n if (config.value.valueFormatter) {\n return config.value.valueFormatter(value, path || '');\n }\n return defaultValueFormatter(value);\n}\n</script>\n","<template>\n <div class=\"space-y-4\">\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"space-y-4\">\n <div v-for=\"i in 3\" :key=\"i\" class=\"card bg-base-100 shadow-xs animate-pulse\">\n <div class=\"card-body p-4\">\n <div class=\"h-4 bg-base-300 rounded-sm w-1/4 mb-2\"></div>\n <div class=\"h-3 bg-base-300 rounded-sm w-1/3\"></div>\n </div>\n </div>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error shadow-lg text-sm\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <h3 class=\"font-bold\">{{ config.errorTitle || 'Error Loading Version History' }}</h3>\n <div class=\"text-sm\">{{ error.message }}</div>\n </div>\n <button class=\"btn btn-xs\" @click=\"$emit('retry')\">\n {{ config.retryText || 'Retry' }}\n </button>\n </div>\n\n <!-- No Versions -->\n <div v-else-if=\"!filteredVersions.length\" class=\"alert alert-info shadow-lg text-sm\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n class=\"stroke-current shrink-0 w-5 h-5\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{\n config.noVersionsText ||\n `No previous versions available for this ${config.recordDisplayName || 'record'}.`\n }}</span>\n </div>\n\n <!-- Version List -->\n <div v-else class=\"space-y-3 max-w-4xl mx-auto\">\n <div\n v-for=\"version in filteredVersions\"\n :key=\"version.id\"\n class=\"card bg-base-100 shadow-xs hover:shadow-md transition-shadow duration-200\"\n >\n <div class=\"card-body p-4\">\n <div class=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2\">\n <div>\n <h3 class=\"font-medium text-sm\">\n {{\n config.versionLabelFormat\n ? config.versionLabelFormat(version)\n : `Version from ${formatDate(version.recorded_at)}`\n }}\n </h3>\n <div class=\"flex items-center gap-2 text-xs text-base-content/70\">\n <span\n class=\"badge badge-xs\"\n :class=\"getOperationBadgeClass(version.operation)\"\n >\n {{ formatOperation(version.operation) }}\n </span>\n <span>by {{ version.auth_username || 'Unknown' }}</span>\n </div>\n <!-- Custom metadata slot -->\n <div v-if=\"$slots.versionMetadata\" class=\"mt-1\">\n <slot name=\"versionMetadata\" :version=\"version\"></slot>\n </div>\n </div>\n <div class=\"flex gap-2\">\n <!-- Custom actions slot -->\n <slot name=\"versionActions\" :version=\"version\">\n <!-- Default view action -->\n <button\n v-if=\"config.viewAction\"\n class=\"btn btn-primary btn-xs\"\n @click=\"config.viewAction(version)\"\n >\n {{ config.viewActionText || 'View Version' }}\n </button>\n </slot>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Pagination -->\n <div v-if=\"loadingMore\" class=\"text-center py-4\">\n <span class=\"loading loading-spinner loading-md\"></span>\n </div>\n <div v-if=\"hasNextPage\" class=\"text-center py-4\">\n <button\n class=\"btn btn-sm btn-neutral\"\n @click=\"$emit('load-more')\"\n :disabled=\"loadingMore\"\n >\n {{ config.loadMoreText || 'Load More' }}\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script\n setup\n lang=\"ts\"\n generic=\"\n T extends {\n id: string;\n operation: string;\n recorded_at: string;\n auth_username?: string | null;\n }\n \"\n>\nimport { computed } from 'vue';\nimport type { RecordVersionListConfig } from './RecordVersionListConfig';\n\nconst props = defineProps<{\n versions: T[];\n loading?: boolean;\n error?: Error | null;\n hasNextPage?: boolean;\n loadingMore?: boolean;\n config?: RecordVersionListConfig;\n excludeLatest?: boolean;\n}>();\n\ndefineEmits<{\n retry: [];\n 'load-more': [];\n}>();\n\nconst config = computed(() => props.config || {});\n\n// Filter out the latest version if requested (default behavior)\nconst filteredVersions = computed(() => {\n if (!props.excludeLatest) {\n return props.versions;\n }\n\n if (props.versions.length <= 1) {\n return [];\n }\n return props.versions.slice(1);\n});\n\n// Default operation labels\nconst defaultOperationLabels = {\n insert: 'Created',\n update: 'Updated',\n delete: 'Deleted',\n};\n\n// Default operation badge classes\nconst defaultOperationBadgeClasses = {\n insert: 'badge-success',\n update: 'badge-warning',\n delete: 'badge-error',\n};\n\n/**\n * Format a date string to a readable format\n */\nfunction formatDate(dateString: string | undefined | null): string {\n if (!dateString) return 'Unknown date';\n\n try {\n const date = new Date(dateString);\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date);\n } catch (e) {\n return 'Invalid date';\n }\n}\n\n/**\n * Format the operation type for display\n */\nfunction formatOperation(operation?: string): string {\n if (!operation) return 'Unknown';\n\n const labels = { ...defaultOperationLabels, ...config.value.operationLabels };\n return labels[operation as keyof typeof labels] || operation;\n}\n\n/**\n * Get CSS class for operation badge\n */\nfunction getOperationBadgeClass(operation?: string): string {\n if (!operation) return 'badge-neutral';\n\n const classes = { ...defaultOperationBadgeClasses, ...config.value.operationBadgeClasses };\n return classes[operation as keyof typeof classes] || 'badge-neutral';\n}\n</script>\n","<template>\n <div>\n <!-- Version Header - sticky on mobile -->\n <div class=\"sticky top-0 z-10 bg-base-100 shadow-sm\">\n <slot\n name=\"header\"\n :version=\"version\"\n :is-loading=\"isLoading\"\n :is-restoring=\"isRestoring\"\n >\n <!-- Default header -->\n <div class=\"flex justify-between items-center p-4 border-b\">\n <div>\n <h1 class=\"text-lg font-semibold\">\n {{ config.title || `View ${config.recordDisplayName || 'Record'} Version` }}\n </h1>\n <div v-if=\"version\" class=\"text-sm text-base-content/70\">\n {{ formatVersionInfo(version) }}\n </div>\n </div>\n <div class=\"flex gap-2\">\n <!-- Back button -->\n <button v-if=\"config.onBack\" @click=\"config.onBack\" class=\"btn btn-ghost btn-sm\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 19l-7-7m0 0l7-7m-7 7h18\"\n />\n </svg>\n {{ config.backText || 'Back' }}\n </button>\n\n <!-- Restore button -->\n <button\n v-if=\"config.onRestore && version && version.operation !== 'delete'\"\n @click=\"handleRestore\"\n :disabled=\"isRestoring\"\n class=\"btn btn-primary btn-sm\"\n >\n <span v-if=\"isRestoring\" class=\"loading loading-spinner loading-sm mr-1\"></span>\n {{ config.restoreText || 'Restore Version' }}\n </button>\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Loading and Error States -->\n <LoadingErrorStates :is-loading=\"isLoading\" :error=\"error\" />\n\n <!-- Main content area -->\n <div\n v-if=\"!isLoading && !error && recordData\"\n class=\"max-w-4xl mx-auto p-2 md:p-4 bg-base-200 rounded-lg shadow-sm\"\n >\n <!-- Changes Summary - Only show for update operations -->\n <div v-if=\"shouldShowChanges\" class=\"mb-4\">\n <slot name=\"changes\" :changed-fields=\"changedFields\" :version=\"version\">\n <RecordChangesSummary\n :changed-fields=\"changedFields\"\n :config=\"config.changesSummaryConfig\"\n />\n </slot>\n </div>\n\n <!-- Deletion Notice -->\n <div v-if=\"version?.operation === 'delete'\" class=\"mb-4\">\n <slot name=\"deletion-notice\" :version=\"version\">\n <div class=\"alert alert-warning\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n <div>\n <h3 class=\"font-bold\">\n {{ config.deletionNoticeTitle || 'Record Was Deleted' }}\n </h3>\n <div class=\"text-sm\">\n {{\n config.deletionNoticeText ||\n 'This version shows the state of the record before it was deleted.'\n }}\n </div>\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Record Information -->\n <div class=\"mb-4 p-3 bg-base-100 rounded-lg shadow-sm\">\n <slot name=\"record-info\" :record-data=\"recordData\" :version=\"version\">\n <!-- Default record info display -->\n <h3 class=\"font-semibold mb-2\">\n {{ config.recordInfoTitle || 'Record Information' }}\n </h3>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 text-sm\">\n <div v-for=\"(value, key) in filteredRecordData\" :key=\"key\">\n <strong class=\"text-base-content/70\">{{ formatFieldName(key) }}:</strong>\n <span class=\"ml-2\">{{ formatValue(value) }}</span>\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Custom Content Area -->\n <div class=\"space-y-4\">\n <slot\n name=\"content\"\n :record-data=\"recordData\"\n :version=\"version\"\n :changed-fields=\"changedFields\"\n >\n <!-- Fallback content if no slot provided -->\n <div class=\"p-4 bg-base-100 rounded-lg shadow-sm\">\n <h3 class=\"font-semibold mb-2\">{{ config.rawDataTitle || 'Raw Data' }}</h3>\n <pre class=\"text-xs bg-base-200 p-3 rounded overflow-auto max-h-96\">{{\n JSON.stringify(recordData, null, 2)\n }}</pre>\n </div>\n </slot>\n </div>\n </div>\n </div>\n</template>\n\n<script\n setup\n lang=\"ts\"\n generic=\"\n TRecord extends Record<string, any>,\n TVersion extends {\n id: string;\n operation: string;\n recorded_at: string;\n auth_username?: string | null;\n }\n \"\n>\nimport { computed } from 'vue';\nimport LoadingErrorStates from './LoadingErrorStates.vue';\nimport RecordChangesSummary from './RecordChangesSummary.vue';\nimport type { PropertyChange, RecordVersionViewerConfig } from './RecordVersionViewerConfig';\n\nconst props = withDefaults(\n defineProps<{\n version: TVersion | null;\n recordData: TRecord | null;\n changedFields?: PropertyChange[];\n isLoading?: boolean;\n isRestoring?: boolean;\n error?: Error | null;\n config?: RecordVersionViewerConfig;\n }>(),\n {\n changedFields: () => [],\n },\n);\n\nconst config = computed(() => props.config || {});\n\n// Compute whether to show changes summary\nconst shouldShowChanges = computed(() => {\n return (\n props.changedFields &&\n props.changedFields.length > 0 &&\n props.version?.operation === 'update'\n );\n});\n\n// Filter out system fields from record data display\nconst filteredRecordData = computed(() => {\n if (!props.recordData) return {};\n\n const excludeFields = new Set([\n 'id',\n 'created_at',\n 'updated_at',\n 'created_by',\n 'updated_by',\n '__typename',\n ...(config.value.excludeFields || []),\n ]);\n\n return Object.entries(props.recordData)\n .filter(([key]) => !excludeFields.has(key))\n .reduce(\n (acc, [key, value]) => {\n acc[key] = value;\n return acc;\n },\n {} as Record<string, any>,\n );\n});\n\n// Format version info for display\nfunction formatVersionInfo(version: TVersion): string {\n const date = new Date(version.recorded_at).toLocaleString();\n const operation = version.operation.charAt(0).toUpperCase() + version.operation.slice(1);\n const user = version.auth_username || 'Unknown';\n\n return `${operation} on ${date} by ${user}`;\n}\n\n// Default field name formatter\nfunction formatFieldName(field: string): string {\n if (config.value.formatFieldName) {\n return config.value.formatFieldName(field);\n }\n\n return field\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n\n// Default value formatter\nfunction formatValue(value: any): string {\n if (config.value.formatValue) {\n return config.value.formatValue(value);\n }\n\n if (value === null || value === undefined) return 'N/A';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\n// Handle restore action\nasync function handleRestore() {\n if (config.value.onRestore && props.version) {\n await config.value.onRestore(props.version);\n }\n}\n</script>\n","<template>\n <div class=\"bg-base-100 p-2 md:p-4 rounded-box overflow-hidden\">\n <h2 class=\"text-lg font-bold mb-2\">{{ title }}</h2>\n <div class=\"grid grid-auto-rows auto-rows-auto gap-x-4 gap-y-1\">\n <slot></slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps<{\n title: string;\n}>();\n</script>\n","export const timezones = [\n {\n label: '',\n value: '',\n },\n {\n label: 'US/Eastern (-04:00)',\n value: 'US/Eastern (-04:00)',\n },\n {\n label: 'US/East-Indiana (-04:00)',\n value: 'US/East-Indiana (-04:00)',\n },\n {\n label: 'US/Central (-05:00)',\n value: 'US/Central (-05:00)',\n },\n {\n label: 'US/Indiana-Starke (-05:00)',\n value: 'US/Indiana-Starke (-05:00)',\n },\n {\n label: 'US/Mountain (-06:00)',\n value: 'US/Mountain (-06:00)',\n },\n {\n label: 'US/Arizona (-07:00)',\n value: 'US/Arizona (-07:00)',\n },\n {\n label: 'US/Pacific (-07:00)',\n value: 'US/Pacific (-07:00)',\n },\n {\n label: 'US/Alaska (-08:00)',\n value: 'US/Alaska (-08:00)',\n },\n {\n label: 'US/Aleutian (-09:00)',\n value: 'US/Aleutian (-09:00)',\n },\n {\n label: 'US/Hawaii (-10:00)',\n value: 'US/Hawaii (-10:00)',\n },\n {\n label: 'US/Samoa (-11:00)',\n value: 'US/Samoa (-11:00)',\n },\n];\n","/**\n * Filter URL Parser - Query string serialization/deserialization\n * Uses compact DrizzleORM-style format: flt[field]=value or flt[field][op]=value\n */\n\nimport { OPERATORS } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Default operators for each field type when not specified in URL\n */\nconst DEFAULT_OPERATORS: Record<string, string> = {\n string: OPERATORS.CONTAINS,\n number: OPERATORS.EQUALS,\n date: OPERATORS.EQUALS,\n boolean: OPERATORS.EQUALS,\n enum: OPERATORS.EQUALS,\n};\n\n/**\n * Numeric types that should be converted to numbers\n */\nconst NUMERIC_TYPES = ['number', 'money', 'percentage'];\n\n/**\n * Check if operator requires array values\n */\nfunction requiresArrayValues(operator: string): boolean {\n return operator === OPERATORS.IS_ONE_OF || operator === OPERATORS.IS_NOT_ONE_OF || operator === OPERATORS.BETWEEN;\n}\n\n/**\n * Check if operator is a null check (requires no value)\n */\nfunction isNullCheckOperator(operator: string): boolean {\n return operator === OPERATORS.IS_EMPTY || operator === OPERATORS.IS_NOT_EMPTY;\n}\n\n/**\n * Field registry metadata for type inference\n */\nexport interface FieldRegistryMetadata {\n [fieldName: string]: {\n type: 'string' | 'number' | 'date' | 'boolean' | 'enum' | 'money' | 'percentage';\n filterable?: boolean;\n };\n}\n\n/**\n * Filter value object structure\n */\nexport interface FilterValueObject {\n operator: string;\n value?: any;\n values?: any[];\n caseSensitive?: boolean;\n}\n\n/**\n * Filter configuration - flat object mapping field names to filter objects\n */\nexport type FilterConfiguration = Record<string, FilterValueObject>;\n\n/**\n * Deserialize filter configuration from URL query parameters object\n * Parses compact DrizzleORM-style format: flt[field]=value or flt[field][op]=value\n *\n * @param params - URL query parameters object (from Vue Router route.query)\n * @param registry - Field registry metadata for type inference\n * @returns Filter configuration object\n *\n * @example\n * // URL: ?flt[department][eq]=Engineering&flt[id]=4&flt[role][in]=[\"admin\",\"user\"]\n * const filters = deserializeFiltersFromQueryParams(route.query, fieldRegistry);\n * // Result: {\n * // department: { operator: 'eq', value: 'Engineering' },\n * // id: { operator: 'eq', value: 4 },\n * // role: { operator: 'in', values: ['admin', 'user'] }\n * // }\n */\nexport function deserializeFiltersFromQueryParams(\n params: Record<string, string | string[]>,\n registry: FieldRegistryMetadata,\n): FilterConfiguration {\n const config: FilterConfiguration = {};\n const fieldMap = new Map<string, Partial<FilterValueObject>>();\n\n // Parse query params\n for (const [key, value] of Object.entries(params)) {\n // Match flt[field] or flt[field][op]\n const matchDefault = key.match(/^flt\\[([^\\]]+)\\]$/);\n const matchWithOp = key.match(/^flt\\[([^\\]]+)\\]\\[([^\\]]+)\\]$/);\n\n if (!matchDefault && !matchWithOp) continue;\n\n const fieldName = matchDefault ? matchDefault[1] : (matchWithOp ? matchWithOp[1] : null);\n const operatorShorthand = matchWithOp ? matchWithOp[2] : null;\n const stringValue = Array.isArray(value) ? value[0] : value;\n\n if (!fieldName) continue;\n\n const fieldMeta = registry[fieldName];\n if (!fieldMeta) continue; // Skip unknown fields\n\n const fieldType = fieldMeta.type;\n const defaultOp = DEFAULT_OPERATORS[fieldType] || OPERATORS.EQUALS;\n\n // Determine operator\n let operator: string;\n if (operatorShorthand) {\n operator = operatorShorthand;\n } else {\n operator = defaultOp;\n }\n\n if (!fieldMap.has(fieldName)) {\n fieldMap.set(fieldName, { operator });\n }\n\n const filter = fieldMap.get(fieldName)!;\n filter.operator = operator;\n\n // Parse value based on operator type\n if (isNullCheckOperator(operator)) {\n // Null checks don't have values\n // Value is already set, nothing more to do\n } else if (requiresArrayValues(operator)) {\n // Array operators: parse JSON array (handles commas/quotes in values)\n if (!stringValue || stringValue.trim() === '') {\n fieldMap.delete(fieldName);\n continue;\n }\n\n try {\n const parsed = JSON.parse(stringValue);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Convert to appropriate types based on field type\n if (NUMERIC_TYPES.includes(fieldType)) {\n filter.values = parsed.map((v) => Number(v));\n } else {\n filter.values = parsed;\n }\n } else {\n fieldMap.delete(fieldName);\n continue;\n }\n } catch (e) {\n // Invalid JSON, try legacy comma-separated format for backward compatibility\n const values = stringValue\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n if (values.length === 0) {\n fieldMap.delete(fieldName);\n continue;\n }\n\n if (operator === OPERATORS.BETWEEN && values.length === 2) {\n if (NUMERIC_TYPES.includes(fieldType)) {\n filter.values = [Number(values[0]!), Number(values[1]!)];\n } else if (fieldType === 'date') {\n filter.values = [values[0]!, values[1]!];\n } else {\n filter.values = values;\n }\n } else if (operator === OPERATORS.BETWEEN) {\n fieldMap.delete(fieldName);\n continue;\n } else {\n if (NUMERIC_TYPES.includes(fieldType)) {\n filter.values = values.map((v) => Number(v));\n } else {\n filter.values = values;\n }\n }\n }\n } else {\n // Single value operators\n // Special case: if operator is in/notIn but we got a single value, convert to array\n if ((operator === OPERATORS.IS_ONE_OF || operator === OPERATORS.IS_NOT_ONE_OF) && stringValue) {\n // Convert single value to array for array operators\n if (NUMERIC_TYPES.includes(fieldType)) {\n filter.values = [Number(stringValue)];\n } else {\n filter.values = [stringValue];\n }\n } else if (stringValue) {\n // Regular single value operator\n if (NUMERIC_TYPES.includes(fieldType)) {\n filter.value = Number(stringValue);\n } else if (fieldType === 'boolean') {\n filter.value = stringValue === 'true' || stringValue === '1';\n } else {\n filter.value = stringValue;\n }\n\n // String fields: always case-insensitive (contains is default)\n if (fieldType === 'string' && operator === OPERATORS.CONTAINS) {\n filter.caseSensitive = false;\n }\n }\n }\n }\n\n // Convert to FilterConfiguration\n for (const [fieldName, filter] of fieldMap.entries()) {\n if (filter.operator) {\n config[fieldName] = filter as FilterValueObject;\n }\n }\n\n return config;\n}\n\n/**\n * Serialize filter configuration to URL query parameters object\n * Uses compact DrizzleORM-style format: flt[field][op]=value\n *\n * @param config - Filter configuration object\n * @param registry - Field registry metadata for type inference\n * @returns URL query parameters object (can be used with Vue Router)\n *\n * @example\n * const filters = {\n * department: { operator: 'eq', value: 'Engineering' },\n * role: { operator: 'in', values: ['admin', 'user'] }\n * };\n * const params = serializeFiltersToQueryParams(filters, fieldRegistry);\n * // Result: {\n * // 'flt[department][eq]': 'Engineering',\n * // 'flt[role][in]': '[\"admin\",\"user\"]'\n * // }\n */\nexport function serializeFiltersToQueryParams(\n config: FilterConfiguration,\n registry: FieldRegistryMetadata,\n): Record<string, string> {\n const params: Record<string, string> = {};\n\n for (const [fieldName, filter] of Object.entries(config)) {\n const fieldMeta = registry[fieldName];\n if (!fieldMeta) continue;\n\n const operator = filter.operator;\n\n if (isNullCheckOperator(operator)) {\n // Null checks don't need values, just the operator\n params[`flt[${fieldName}][${operator}]`] = '';\n } else if (requiresArrayValues(operator)) {\n // Array operators: use JSON encoding (handles commas/quotes)\n if (filter.values && Array.isArray(filter.values)) {\n params[`flt[${fieldName}][${operator}]`] = JSON.stringify(filter.values);\n }\n } else {\n // Single value: include operator explicitly\n params[`flt[${fieldName}][${operator}]`] = String(filter.value);\n }\n }\n\n return params;\n}\n","import { useUserSessionStore } from '@dragonmastery/dragoncore-vue';\nimport type { NavigationGuard } from 'vue-router';\n\nexport const userAlreadyLoggedIn: NavigationGuard = (_to, _from, next) => {\n const userSession = useUserSessionStore();\n\n if (userSession.currentSession) {\n next('/');\n } else {\n next();\n }\n};\n","import type { UserTypeValues } from '@dragonmastery/dragoncore-shared';\nimport { logger, useUserSessionStore } from '@dragonmastery/dragoncore-vue';\nimport type { NavigationGuard, RouteLocationRaw } from 'vue-router';\n\nexport interface UserAuthorizedOptions {\n /**\n * List of user types allowed to access this route\n * Same pattern as `visible_to` in route meta\n */\n allowedUserTypes: UserTypeValues[];\n\n /**\n * Where to redirect if user is not authorized\n * Can be a route name, path, or route object\n */\n redirectTo?: RouteLocationRaw;\n\n /**\n * Login path for redirecting unauthenticated users\n * Only used if requireAuth is true\n */\n loginPath?: string;\n\n /**\n * Whether to also check authentication (token refresh, etc.)\n * Default: true\n */\n requireAuth?: boolean;\n}\n\n/**\n * Creates a navigation guard that checks both authentication and authorization\n * based on allowed user types.\n *\n * @example\n * // Only staff and super_admin can access\n * const staffOnly = createUserAuthorizedGuard({\n * allowedUserTypes: ['staff', 'super_admin'],\n * redirectTo: { name: 'Home' }\n * });\n *\n * @example\n * // All authenticated users can access\n * const authenticated = createUserAuthorizedGuard({\n * allowedUserTypes: ['consumer', 'lead', 'staff', 'super_admin'],\n * redirectTo: { name: 'Home' }\n * });\n */\nexport function createUserAuthorizedGuard(options: UserAuthorizedOptions): NavigationGuard {\n const {\n allowedUserTypes,\n redirectTo = { name: 'Home' },\n loginPath = '/auth/login',\n requireAuth = true,\n } = options;\n\n return async (to, _from, next) => {\n const userSession = useUserSessionStore();\n\n // Step 1: Check authentication if required\n if (requireAuth) {\n const hasAccessToken = !!userSession.accessToken;\n\n if (hasAccessToken) {\n const { accessTokenExpired, refreshTokenExpired } = userSession.isTokenExpired();\n\n if (!accessTokenExpired) {\n // Token is valid, proceed to authorization check\n } else if (refreshTokenExpired) {\n // Refresh token expired, redirect to login\n logger.warn('[UserAuthorized] Refresh token expired, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n } else {\n // Access token expired, try refresh\n logger.debug('[UserAuthorized] Access token expired, attempting refresh');\n const refreshSuccessful = await userSession.refreshToken();\n\n if (!refreshSuccessful) {\n logger.error('[UserAuthorized] Token refresh failed, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n }\n }\n } else {\n // No access token, try refresh token flow\n logger.debug('[UserAuthorized] No access token, attempting refresh token flow');\n const refreshSuccessful = await userSession.refreshToken();\n\n if (!refreshSuccessful) {\n logger.debug('[UserAuthorized] No valid session found, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n }\n }\n }\n\n // Step 2: Check authorization (user type)\n const userType = userSession.currentSession?.user.user_type;\n\n if (!userType) {\n logger.warn('[UserAuthorized] No user type found, redirecting');\n next(redirectTo);\n return;\n }\n\n if (allowedUserTypes.includes(userType)) {\n logger.debug(`[UserAuthorized] User type '${userType}' is authorized`);\n next();\n } else {\n logger.warn(\n `[UserAuthorized] User type '${userType}' is not authorized. Allowed: ${allowedUserTypes.join(', ')}`,\n );\n next(redirectTo);\n }\n };\n}\n\n/**\n * Pre-built guard: Staff and super admin only\n * Redirects non-staff users to the provided redirect path\n */\nexport function createStaffOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: Super admin only\n * Redirects non-super-admin users to the provided redirect path\n */\nexport function createSuperAdminOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['super_admin'],\n redirectTo: options?.redirectTo ?? '/notfound',\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: All authenticated users\n * Any logged-in user can access (consumer, lead, staff, or super_admin)\n */\nexport function createAuthenticatedGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['consumer', 'lead', 'staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: Lead, staff, and super admin\n * Consumers are not allowed\n */\nexport function createLeadOrStaffOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['lead', 'staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-configured guards with sensible defaults\n * Apps can use these directly or override with create*Guard functions\n */\n\n/**\n * Pre-configured: All authenticated users\n * Default redirect: Home, Default login: /auth/login\n */\nexport const userAuthenticated = createAuthenticatedGuard();\n\n/**\n * Pre-configured: Staff and super admin only\n * Default redirect: Home, Default login: /auth/login\n */\nexport const staffOnly = createStaffOnlyGuard();\n\n/**\n * Pre-configured: Super admin only\n * Default redirect: /notfound, Default login: /auth/login\n */\nexport const userIsSuperAdmin = createSuperAdminOnlyGuard();\n\n/**\n * Pre-configured: Lead, staff, and super admin\n * Default redirect: Home, Default login: /auth/login\n */\nexport const leadOrStaffOnly = createLeadOrStaffOnlyGuard();\n","import { userAuthenticated } from '../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../types/ExtendedRoute';\n\nexport const userRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/user',\n name: 'User',\n beforeEnter: [userAuthenticated],\n meta: {\n // Define user section tabs that will be shown for all user routes\n sectionTabs: [\n { id: 'profile', label: 'Profile', to: { name: 'Profile' } },\n { id: 'appearance', label: 'Appearance', to: { name: 'Appearance' } },\n { id: 'password', label: 'Password', to: { name: 'Password' } },\n ],\n },\n children: [\n {\n path: 'appearance',\n name: 'Appearance',\n component: () => import('./features/Appearance.vue'),\n meta: {\n title: 'Appearance',\n description: 'Appearance page for Category 5 App',\n },\n },\n {\n path: 'profile',\n name: 'Profile',\n component: () => import('./features/user_profile/UserProfilePage.vue'),\n meta: {\n title: 'Profile',\n description: 'Profile page for Category 5 App',\n },\n },\n {\n path: 'password',\n name: 'Password',\n component: () => import('./features/change_password/ChangePasswordPage.vue'),\n meta: {\n title: 'Password',\n description: 'Password page for Category 5 App',\n },\n },\n ],\n },\n];\n","import {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { TeamCreateSchema, TeamUpdateSchema } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\n\n// Create schema (no ID)\nexport const teamCreateSchemaWithMetadata = withMetadata(\n TeamCreateSchema,\n 'teamCreateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n contact_email: {\n inputType: 'email',\n placeholder: 'Enter contact email',\n },\n url: {\n inputType: 'text',\n placeholder: 'Enter URL',\n },\n email_sent_from: {\n inputType: 'email',\n placeholder: 'Enter sent from email',\n },\n email_reply_to: {\n inputType: 'email',\n placeholder: 'Enter reply to email',\n },\n },\n);\n\n// Update schema (with ID)\nexport const teamUpdateSchemaWithMetadata = withMetadata(\n TeamUpdateSchema,\n 'teamUpdateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n contact_email: {\n inputType: 'email',\n placeholder: 'Enter contact email',\n },\n url: {\n inputType: 'text',\n placeholder: 'Enter URL',\n },\n email_sent_from: {\n inputType: 'email',\n placeholder: 'Enter sent from email',\n },\n email_reply_to: {\n inputType: 'email',\n placeholder: 'Enter reply to email',\n },\n },\n);\n\nexport type TeamCreateFormDto = UseFormTyped<typeof TeamCreateSchema>;\nexport type TeamUpdateFormDto = UseFormTyped<typeof TeamUpdateSchema>;\n\nexport const injectTeamCreateForm = () => inject<TeamCreateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectTeamUpdateForm = () => inject<TeamUpdateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectTeamZinia = () =>\n inject<TeamCreateFormDto['zinia'] | TeamUpdateFormDto['zinia']>(ZINIA_FIELDS_KEY);\n","import { userAuthenticated } from '../../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../../types/ExtendedRoute';\n\nexport const teamMemberPaths = {\n list: {\n path: '',\n full_path: '/teams/:id/members',\n name: 'TeamMemberList',\n },\n create: {\n path: 'create',\n full_path: '/teams/:id/members/create',\n name: 'CreateTeamMember',\n },\n view: {\n path: ':member_id',\n full_path: '/teams/:id/members/:member_id',\n name: 'ViewTeamMember',\n },\n edit: {\n path: 'edit',\n full_path: '/teams/:id/members/:member_id/edit',\n name: 'EditTeamMember',\n },\n} as const;\n\nexport const teamMemberRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: teamMemberPaths.list.path,\n name: teamMemberPaths.list.name,\n component: () => import('./TeamMemberList.vue'),\n beforeEnter: [userAuthenticated],\n meta: {\n title: 'Team Members',\n description: 'View and manage team members',\n // Breadcrumbs managed by TeamMembersTab component\n },\n },\n {\n path: teamMemberPaths.create.path,\n name: teamMemberPaths.create.name,\n component: () => import('./CreateTeamMemberForm.vue'),\n beforeEnter: [userAuthenticated],\n meta: {\n title: 'Create Team Member',\n description: 'Create new team member',\n // Breadcrumbs managed by TeamMembersTab component\n },\n },\n {\n path: teamMemberPaths.view.path,\n component: () => import('./TeamMemberParent.vue'),\n beforeEnter: [userAuthenticated],\n meta: {\n // Define team member detail tabs\n sectionTabs: [\n {\n id: 'view',\n label: 'View',\n to: { name: teamMemberPaths.view.name },\n },\n {\n id: 'edit',\n label: 'Edit',\n to: { name: teamMemberPaths.edit.name },\n },\n ],\n },\n children: [\n {\n path: '',\n name: teamMemberPaths.view.name,\n component: () => import('./ViewTeamMember.vue'),\n meta: {\n title: 'View Team Member',\n description: 'View team member details',\n currentTab: 'view',\n },\n },\n {\n path: teamMemberPaths.edit.path,\n name: teamMemberPaths.edit.name,\n component: () => import('./EditTeamMemberForm.vue'),\n meta: {\n title: 'Edit Team Member',\n description: 'Edit team member details',\n currentTab: 'edit',\n },\n },\n ],\n },\n];\n","import { userAuthenticated } from '../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../types/ExtendedRoute';\nimport { teamMemberPaths, teamMemberRoutes } from './team_member/team_memberRoutes';\n\nexport const teamPaths = {\n list: {\n path: '',\n full_path: '/teams',\n name: 'TeamList',\n },\n create: {\n path: 'create',\n full_path: '/teams/create',\n name: 'CreateTeam',\n },\n view: {\n path: ':id',\n full_path: '/teams/:id',\n name: 'ViewTeam',\n },\n edit: {\n path: 'edit',\n full_path: '/teams/:id/edit',\n name: 'EditTeam',\n },\n notes: {\n path: 'notes',\n full_path: '/teams/:id/notes',\n name: 'TeamNotes',\n },\n attachments: {\n path: 'attachments',\n full_path: '/teams/:id/attachments',\n name: 'TeamAttachments',\n },\n history: {\n path: 'history',\n full_path: '/teams/:id/history',\n name: 'TeamHistory',\n },\n members: {\n path: 'members',\n full_path: '/teams/:id/members',\n name: 'TeamMembers',\n },\n} as const;\n\nexport const teamRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/teams',\n name: 'Team',\n redirect: { name: teamPaths.list.name },\n beforeEnter: [userAuthenticated],\n meta: {},\n children: [\n {\n path: teamPaths.list.path,\n name: teamPaths.list.name,\n component: () => import('./TeamList.vue'),\n meta: {\n title: 'Teams',\n description: 'Manage teams',\n side_bar: {\n section: 'Teams',\n visible_to: ['consumer', 'lead', 'staff', 'super_admin'],\n },\n },\n },\n {\n path: teamPaths.create.path,\n name: teamPaths.create.name,\n component: () => import('./CreateTeamForm.vue'),\n meta: {\n title: 'Create Team',\n description: 'Create new team',\n breadcrumbs: [\n {\n label: 'Teams',\n to: { name: teamPaths.list.name },\n },\n {\n label: 'Create',\n to: { name: teamPaths.create.name },\n },\n ],\n },\n },\n {\n path: teamPaths.view.path,\n component: () => import('./TeamParent.vue'),\n meta: {\n // Define team detail tabs\n sectionTabs: [\n {\n id: 'view',\n label: 'View',\n to: { name: teamPaths.view.name },\n },\n {\n id: 'edit',\n label: 'Edit',\n to: { name: teamPaths.edit.name },\n },\n {\n id: 'notes',\n label: 'Notes',\n to: { name: teamPaths.notes.name },\n },\n {\n id: 'attachments',\n label: 'Attachments',\n to: { name: teamPaths.attachments.name },\n },\n {\n id: 'history',\n label: 'History',\n to: { name: teamPaths.history.name },\n },\n {\n id: 'members',\n label: 'Members',\n to: { name: teamMemberPaths.list.name },\n },\n ],\n },\n children: [\n {\n path: '',\n name: teamPaths.view.name,\n component: () => import('./ViewTeam.vue'),\n meta: {\n title: 'View Team',\n description: 'View team details',\n currentTab: 'view',\n },\n },\n {\n path: teamPaths.edit.path,\n name: teamPaths.edit.name,\n component: () => import('./EditTeamForm.vue'),\n meta: {\n title: 'Edit Team',\n description: 'Edit team details',\n currentTab: 'edit',\n },\n },\n {\n path: teamPaths.notes.path,\n name: teamPaths.notes.name,\n component: () => import('./TeamNotesTab.vue'),\n meta: {\n title: 'Team Notes',\n description: 'View and manage notes',\n currentTab: 'notes',\n },\n },\n {\n path: teamPaths.attachments.path,\n name: teamPaths.attachments.name,\n component: () => import('./TeamAttachmentsTab.vue'),\n meta: {\n title: 'Team Attachments',\n description: 'View and manage attachments',\n currentTab: 'attachments',\n },\n },\n {\n path: teamPaths.history.path,\n name: teamPaths.history.name,\n component: () => import('./TeamHistoryTab.vue'),\n meta: {\n title: 'Team History',\n description: 'View audit trail and changes',\n currentTab: 'history',\n },\n },\n {\n path: teamPaths.members.path,\n name: teamPaths.members.name,\n component: () => import('./TeamMembersTab.vue'),\n meta: {\n title: 'Team Members',\n description: 'View and manage team members',\n currentTab: 'members',\n },\n children: teamMemberRoutes,\n },\n ],\n },\n ],\n },\n];\n","<template>\n <div v-if=\"form.isLoading\" class=\"flex flex-col items-center justify-center p-8\">\n <div class=\"loading loading-spinner loading-lg\"></div>\n <p class=\"mt-4 text-lg\">Loading...</p>\n </div>\n <div v-else-if=\"form.loadError\" class=\"flex flex-col items-center justify-center p-8\">\n <p class=\"mt-4 text-lg\">{{ form.loadError }}</p>\n </div>\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Create Team\"\n subtitle=\"Create a new team\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Team Details\">\n <zinia.UniqueNameField placeholder=\"Enter unique name\" />\n <zinia.DisplayNameField placeholder=\"Enter display name\" />\n <zinia.LegalNameField placeholder=\"Enter legal name (optional)\" />\n </FieldsetSection>\n\n <FieldsetSection title=\"Description\">\n <zinia.DescriptionField placeholder=\"Enter team description\" />\n </FieldsetSection>\n\n <!-- Contact Information -->\n <FieldsetSection title=\"Contact Information\">\n <zinia.ContactNameField placeholder=\"Enter contact name\" />\n <zinia.ContactEmailField placeholder=\"Enter contact email\" />\n <zinia.ContactBusinessPhoneField placeholder=\"Enter business phone\" />\n <zinia.ContactMobilePhoneField placeholder=\"Enter mobile phone\" />\n <zinia.ContactTimeZoneField placeholder=\"Enter time zone\" />\n </FieldsetSection>\n\n <!-- Address Information -->\n <FieldsetSection title=\"Address\">\n <zinia.AddressFullField placeholder=\"Enter address\" />\n <zinia.AddressCityField placeholder=\"Enter city\" />\n <zinia.AddressZipField placeholder=\"Enter zip code\" />\n </FieldsetSection>\n\n <!-- Web Presence -->\n <FieldsetSection title=\"Web Presence\">\n <zinia.TwitterUsernameField placeholder=\"Enter Twitter username\" />\n <zinia.UrlField placeholder=\"Enter URL\" />\n </FieldsetSection>\n\n <!-- Branding -->\n <FieldsetSection title=\"Branding\">\n <zinia.LogoField placeholder=\"Enter logo URL\" />\n </FieldsetSection>\n\n <!-- Email Settings -->\n <FieldsetSection title=\"Email Settings\">\n <zinia.EmailSentFromField placeholder=\"Enter sent from email\" />\n <zinia.EmailReplyToField placeholder=\"Enter reply to email\" />\n </FieldsetSection>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Create Team\" submittingText=\"Creating Team...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamCreateDto, TeamReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport FieldsetSection from '../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../composables/useMutation';\nimport { teamCreateSchemaWithMetadata } from './teamMetadata';\nimport { teamPaths } from './teamRoutes';\n\nconst router = useRouter();\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamCreateSchemaWithMetadata, {\n storeName: `create-team`,\n persistToLocalStorage: true,\n renderStyle: 'daisy_ui',\n initialValues: {\n unique_name: '',\n display_name: '',\n },\n});\n\n// Setup mutation for creating team\nconst { mutate: createTeam } = useMutation(\n (api, input: TeamCreateDto) => api.teams.createTeam(input),\n { invalidate: /^teams?:/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: TeamCreateDto) => {\n const createdTeam = await createTeam(formData);\n if (!createdTeam) {\n throw new Error('Failed to create team');\n }\n return createdTeam;\n};\n\n// Handle successful submission\nconst handleSuccess = async (createdTeam: TeamReadDto) => {\n clearSavedFormState();\n toast.success(`Team \"${createdTeam.display_name}\" created successfully!`);\n // Redirect to view page\n await router.push({\n name: teamPaths.view.name,\n params: { id: createdTeam.id },\n });\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div v-if=\"form.isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"form.loadError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.loadError }}</span>\n </div>\n\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Edit Team\"\n subtitle=\"Update team details\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Team Details\">\n <zinia.UniqueNameField placeholder=\"Enter unique name\" />\n <zinia.DisplayNameField placeholder=\"Enter display name\" />\n <zinia.LegalNameField placeholder=\"Enter legal name (optional)\" />\n </FieldsetSection>\n\n <FieldsetSection title=\"Description\">\n <zinia.DescriptionField placeholder=\"Enter team description\" />\n </FieldsetSection>\n\n <!-- Contact Information -->\n <FieldsetSection title=\"Contact Information\">\n <zinia.ContactNameField placeholder=\"Enter contact name\" />\n <zinia.ContactEmailField placeholder=\"Enter contact email\" />\n <zinia.ContactBusinessPhoneField placeholder=\"Enter business phone\" />\n <zinia.ContactMobilePhoneField placeholder=\"Enter mobile phone\" />\n <zinia.ContactTimeZoneField placeholder=\"Enter time zone\" />\n </FieldsetSection>\n\n <!-- Address Information -->\n <FieldsetSection title=\"Address\">\n <zinia.AddressFullField placeholder=\"Enter address\" />\n <zinia.AddressCityField placeholder=\"Enter city\" />\n <zinia.AddressZipField placeholder=\"Enter zip code\" />\n </FieldsetSection>\n\n <!-- Web Presence -->\n <FieldsetSection title=\"Web Presence\">\n <zinia.TwitterUsernameField placeholder=\"Enter Twitter username\" />\n <zinia.UrlField placeholder=\"Enter URL\" />\n </FieldsetSection>\n\n <!-- Branding -->\n <FieldsetSection title=\"Branding\">\n <zinia.LogoField placeholder=\"Enter logo URL\" />\n </FieldsetSection>\n\n <!-- Email Settings -->\n <FieldsetSection title=\"Email Settings\">\n <zinia.EmailSentFromField placeholder=\"Enter sent from email\" />\n <zinia.EmailReplyToField placeholder=\"Enter reply to email\" />\n </FieldsetSection>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Update Team\" submittingText=\"Updating Team...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport FieldsetSection from '../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { TeamReadDto, TeamUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { inject, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { teamUpdateSchemaWithMetadata } from './teamMetadata';\nimport { teamPaths } from './teamRoutes';\n\ninterface Props {\n team: TeamReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\nconst team_id = route.params.id as string;\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamUpdateSchemaWithMetadata, {\n storeName: `edit-team-${team_id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n if (!props.team) {\n throw new Error('No team data found');\n }\n\n return props.team as TeamUpdateDto;\n },\n});\n\n// Get refresh function from parent\nconst refreshTeam = inject<(() => Promise<void>) | undefined>('refreshTeam');\n\n// Redirect to view if team is archived\nwatch(\n () => props.team,\n (team) => {\n if (team?.archived_at) {\n router.replace({\n name: teamPaths.view.name,\n params: { id: team_id },\n });\n }\n },\n);\n\n// Setup mutation for updating team\nconst { mutate: updateTeam } = useMutation(\n (api, input: TeamUpdateDto) => api.teams.updateTeam(input),\n { invalidate: /^teams?:/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: TeamUpdateDto) => {\n const updatedTeam = await updateTeam(formData);\n if (!updatedTeam) {\n throw new Error('Failed to update team');\n }\n return updatedTeam;\n};\n\n// Handle successful submission\nconst handleSuccess = async () => {\n clearSavedFormState();\n toast.success(`Team updated successfully!`);\n // Refresh team data via parent\n if (refreshTeam) {\n await refreshTeam();\n }\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <FileManager :record-id=\"teamId\" record-type=\"team\" :config=\"config\" />\n</template>\n\n<script setup lang=\"ts\">\nimport FileManager from '../../../components/ui/FileManager.vue';\nimport { useRoute } from 'vue-router';\n\nconst route = useRoute();\nconst teamId = route.params.id as string;\n\nconst config = {\n title: 'Team Attachments',\n};\n</script>\n","<template>\n <TeamAttachmentsComponent />\n</template>\n\n<script setup lang=\"ts\">\nimport TeamAttachmentsComponent from './components/TeamAttachments.vue';\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { TeamFiltersSchema } from '@dragonmastery/dragoncore-shared';\n\nexport const teamFiltersSchemaWithMetadata = withMetadata(TeamFiltersSchema, 'teamFilters', {\n unique_name: {\n label: 'Unique Name',\n inputType: 'text' as const,\n },\n display_name: {\n label: 'Display Name',\n inputType: 'text' as const,\n },\n legal_name: {\n label: 'Legal Name',\n inputType: 'text' as const,\n },\n contact_email: {\n label: 'Contact Email',\n inputType: 'text' as const,\n },\n address_city: {\n label: 'City',\n inputType: 'text' as const,\n },\n includeArchived: {\n label: 'Include Archived',\n inputType: 'checkbox' as const,\n },\n});\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { TeamReadSchema } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Reuse the existing TeamReadSchema from the validation library\n * for the data table rows - don't recreate it!\n */\nexport const teamRowSchemaWithMetadata = withMetadata(TeamReadSchema, 'teamRow', {});\n\nexport type TeamRow = typeof TeamReadSchema._type;\n","<template>\n <div>\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4 mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold\">Teams</h1>\n <router-link\n :to=\"{ name: teamPaths.create.name }\"\n class=\"btn btn-primary btn-sm sm:btn-md\"\n >\n Create\n </router-link>\n </div>\n <ZiniaDataTable>\n <template #cell-display_name=\"{ row }\">\n <router-link\n :to=\"{ name: teamPaths.view.name, params: { id: row.id } }\"\n class=\"link link-primary\"\n >\n {{ row.display_name }}\n </router-link>\n </template>\n <template #cell-archived_at=\"{ row }\">\n {{ row.archived_at ? 'Archived' : 'Active' }}\n </template>\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n <template #cell-updated_at=\"{ row }\">\n {{ formatSystemTimestamp(row.updated_at) }}\n </template>\n <template #cell-actions=\"{ row }\">\n <router-link\n :to=\"{\n name: teamPaths.view.name,\n params: { id: row.id },\n }\"\n class=\"btn btn-sm btn-primary\"\n >\n View\n </router-link>\n </template>\n </ZiniaDataTable>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamFiltersDto } from '@dragonmastery/dragoncore-shared';\nimport { ActionIcons, useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { ref } from 'vue';\nimport { executeWithAuth } from '../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../utils/convertToLocalDateTime';\nimport { teamRowSchemaWithMetadata, type TeamRow } from './TeamRowSchema';\nimport { teamPaths } from './teamRoutes';\n\n// Store pagination token for breadcrumb state\nconst currentPaginationToken = ref<string | undefined | null>();\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable } = useCursorDataTable(teamRowSchemaWithMetadata, {\n fetchData: async ({ cursor, pageSize, sort, filters, search }) => {\n const variables: TeamFiltersDto = {\n first: pageSize,\n sortBy: sort?.field ? (sort.field as string) : 'created_at',\n sortDirection: (sort?.direction === 'asc' ? 'asc' : 'desc') as 'asc' | 'desc',\n ...(cursor ? { after: cursor } : {}),\n ...(currentPaginationToken.value\n ? { paginationToken: currentPaginationToken.value }\n : {}),\n ...(search ? { search } : {}),\n ...filters,\n };\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.teams.listTeams(variables);\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n // Store the new pagination token for next request\n currentPaginationToken.value = result?.pageInfo?.paginationToken;\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n display_name: {\n label: 'Name',\n field: 'display_name',\n sortable: true,\n },\n unique_name: {\n label: 'Unique Name',\n field: 'unique_name',\n sortable: true,\n },\n contact_email: {\n label: 'Contact Email',\n field: 'contact_email',\n sortable: true,\n filterable: true,\n },\n address_city: {\n label: 'City',\n field: 'address_city',\n sortable: true,\n filterable: true,\n },\n archived_at: {\n label: 'Status',\n field: 'archived_at',\n sortable: true,\n },\n created_at: {\n label: 'Created',\n field: 'created_at',\n sortable: true,\n },\n updated_at: {\n label: 'Updated',\n field: 'updated_at',\n sortable: true,\n },\n },\n actions: {\n items: [\n {\n key: 'view',\n icon: ActionIcons.edit,\n size: 'xs',\n variant: 'primary',\n type: 'link',\n href: (row: TeamRow) => `/teams/${row.id}`,\n },\n ],\n },\n search: {\n searchableFields: ['display_name', 'unique_name', 'legal_name'],\n },\n pagination: { pageSize: 25 },\n});\n</script>\n","<template>\n <div v-if=\"isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ error.message }}</span>\n </div>\n\n <RouterView v-else :team=\"team\" :isLoading=\"isLoading\" :error=\"error\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { useBreadcrumbs } from '../../composables/useBreadcrumbs';\nimport { useQuery } from '../../composables/useQuery';\nimport { computed, provide } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { teamPaths } from './teamRoutes';\n\nconst route = useRoute();\nconst teamId = route.params.id as string;\n\n// Fetch team data once at parent level\nconst {\n data,\n loading: isLoading,\n error,\n refetch,\n} = useQuery((api) => api.teams.getTeam(teamId), {});\n\nconst team = computed(() => data.value ?? null);\n\n// Provide refresh function to child components\nconst refreshTeam = async () => {\n await refetch();\n};\n\nprovide('refreshTeam', refreshTeam);\n\n// Get current tab name from route meta\nconst currentTabLabel = computed(() => {\n const currentTab = route.meta.currentTab as string | undefined;\n if (!currentTab) return null;\n\n // Find the tab label from sectionTabs\n const sectionTabs = route.meta.sectionTabs as\n | Array<{ id: string; label: string }>\n | undefined;\n if (sectionTabs) {\n const tab = sectionTabs.find((t) => t.id === currentTab);\n return tab?.label || null;\n }\n return null;\n});\n\n// Manage breadcrumbs at parent level - watch route to ensure reactivity\n// Use segment mode to allow TeamMemberParent to append its own breadcrumbs\nuseBreadcrumbs(\n () => {\n // Access route params and meta to ensure reactivity to route changes\n const memberId = route.params.member_id;\n const currentTab = route.meta.currentTab as string | undefined;\n\n const breadcrumbs = [\n {\n label: 'Teams',\n to: { name: teamPaths.list.name },\n },\n {\n label:\n team.value?.display_name ||\n team.value?.unique_name ||\n team.value?.legal_name ||\n 'Team',\n loading: !team.value,\n to: {\n name: teamPaths.view.name,\n params: { id: teamId },\n },\n },\n ];\n\n // Add current tab if we're not on the main view tab and not viewing a member\n if (!memberId && currentTabLabel.value && currentTab !== 'view') {\n breadcrumbs.push({\n label: currentTabLabel.value,\n to: route as any, // Route object for current tab\n });\n }\n\n return breadcrumbs;\n },\n true, // Use segment mode for nested breadcrumbs\n);\n</script>\n","<template>\n <div v-if=\"isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ error.message }}</span>\n </div>\n\n <ZiniaContainer v-else-if=\"teamData\">\n <!-- Header with Title -->\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold text-base-content break-words leading-tight\">\n {{ teamData.display_name }}\n </h1>\n <div class=\"flex flex-wrap items-center gap-2 mt-2\">\n <span class=\"badge badge-sm badge-primary\">{{ teamData.unique_name }}</span>\n <span v-if=\"teamData.archived_at\" class=\"badge badge-sm badge-error\">Archived</span>\n <span v-else class=\"badge badge-sm badge-success\">Active</span>\n </div>\n </div>\n\n <!-- Description -->\n <div v-if=\"teamData.description\" class=\"prose prose-sm sm:prose-base max-w-none mb-4\">\n <p class=\"text-base-content/80 whitespace-pre-wrap text-sm sm:text-base leading-relaxed\">\n {{ teamData.description }}\n </p>\n </div>\n\n <!-- Team Information Grid -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-6\">\n <!-- Basic Information -->\n <div v-if=\"teamData.legal_name\" class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Basic Information</h3>\n <div v-if=\"teamData.legal_name\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Legal Name:</span>\n <span class=\"ml-2\">{{ teamData.legal_name }}</span>\n </div>\n </div>\n </div>\n\n <!-- Contact Information -->\n <div\n v-if=\"\n teamData.contact_name ||\n teamData.contact_email ||\n teamData.contact_business_phone ||\n teamData.contact_mobile_phone\n \"\n class=\"card bg-base-100 shadow-sm\"\n >\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Contact Information</h3>\n <div v-if=\"teamData.contact_name\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Name:</span>\n <span class=\"ml-2\">{{ teamData.contact_name }}</span>\n </div>\n <div v-if=\"teamData.contact_email\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Email:</span>\n <a :href=\"`mailto:${teamData.contact_email}`\" class=\"ml-2 link link-primary\">\n {{ teamData.contact_email }}\n </a>\n </div>\n <div v-if=\"teamData.contact_business_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Business Phone:</span>\n <span class=\"ml-2\">{{ teamData.contact_business_phone }}</span>\n </div>\n <div v-if=\"teamData.contact_mobile_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Mobile Phone:</span>\n <span class=\"ml-2\">{{ teamData.contact_mobile_phone }}</span>\n </div>\n <div v-if=\"teamData.contact_time_zone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Time Zone:</span>\n <span class=\"ml-2\">{{ teamData.contact_time_zone }}</span>\n </div>\n </div>\n </div>\n\n <!-- Address Information -->\n <div\n v-if=\"teamData.address_full || teamData.address_city || teamData.address_zip\"\n class=\"card bg-base-100 shadow-sm\"\n >\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Address</h3>\n <div v-if=\"teamData.address_full\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Address:</span>\n <span class=\"ml-2\">{{ teamData.address_full }}</span>\n </div>\n <div v-if=\"teamData.address_city\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">City:</span>\n <span class=\"ml-2\">{{ teamData.address_city }}</span>\n </div>\n <div v-if=\"teamData.address_zip\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Zip:</span>\n <span class=\"ml-2\">{{ teamData.address_zip }}</span>\n </div>\n </div>\n </div>\n\n <!-- Web Presence -->\n <div v-if=\"teamData.twitter_username || teamData.url\" class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Web Presence</h3>\n <div v-if=\"teamData.twitter_username\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Twitter:</span>\n <span class=\"ml-2\">@{{ teamData.twitter_username }}</span>\n </div>\n <div v-if=\"teamData.url\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">URL:</span>\n <a\n :href=\"teamData.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ml-2 link link-primary\"\n >\n {{ teamData.url }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Metadata -->\n <div class=\"mt-4 pt-4 border-t border-base-300 text-xs sm:text-sm text-base-content/50\">\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-4\">\n <span v-if=\"teamData.created_by\"\n >Created by {{ getUserNameWithFallback(teamData.created_by) }}</span\n >\n <span v-if=\"teamData.created_at\">\n Created {{ formatSystemTimestamp(teamData.created_at) }}\n </span>\n <span\n v-if=\"teamData.updated_at && teamData.updated_at !== teamData.created_at\"\n class=\"text-xs\"\n >\n Updated {{ formatSystemTimestamp(teamData.updated_at) }}\n </span>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 justify-center mt-6\">\n <router-link\n :to=\"{\n name: teamPaths.edit.name,\n params: { id: team_id },\n }\"\n class=\"btn btn-primary\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit Team\n </router-link>\n </div>\n </ZiniaContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\nimport { useRoute } from 'vue-router';\nimport ZiniaContainer from '../../components/ui/ZiniaContainer.vue';\nimport { useUserLookup } from '../../composables/useUserLookup';\nimport { formatSystemTimestamp } from '../../utils/convertToLocalDateTime';\nimport { teamPaths } from './teamRoutes';\n\ninterface Props {\n team: TeamReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst team_id = route.params.id as string;\n\nconst teamData = computed(() => props.team);\n\n// User lookup for mapping user IDs to usernames\nconst { getUserNameWithFallback } = useUserLookup((api) =>\n api.teamMembers.getUserTeamMembers(),\n);\n</script>\n","<template>\n <div v-if=\"form.isLoading\" class=\"flex flex-col items-center justify-center p-8\">\n <div class=\"loading loading-spinner loading-lg\"></div>\n <p class=\"mt-4 text-lg\">Loading...</p>\n </div>\n <div v-else-if=\"form.loadError\" class=\"flex flex-col items-center justify-center p-8\">\n <p class=\"mt-4 text-lg\">{{ form.loadError }}</p>\n </div>\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Create Team Member\"\n subtitle=\"Add a new member to the team\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Member Details\">\n <zinia.UserIdField :select-options=\"form.extraData.users\" placeholder=\"Select user\" />\n <zinia.DisplayNameField placeholder=\"Enter display name (optional)\" />\n <zinia.RoleField />\n </FieldsetSection>\n\n <!-- Contact Information -->\n <FieldsetSection title=\"Contact Information\">\n <zinia.EmailAddressField placeholder=\"Enter email address (optional)\" />\n <zinia.BusinessPhoneField placeholder=\"Enter business phone (optional)\" />\n <zinia.MobilePhoneField placeholder=\"Enter mobile phone (optional)\" />\n <zinia.TimeZoneField placeholder=\"Enter time zone (optional)\" />\n </FieldsetSection>\n\n <!-- Web Presence -->\n <FieldsetSection title=\"Web Presence\">\n <zinia.WebsiteAddressField placeholder=\"Enter website address (optional)\" />\n </FieldsetSection>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton\n submitText=\"Create Team Member\"\n submittingText=\"Creating Team Member...\"\n />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport FieldsetSection from '../../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useQuery } from '../../../composables/useQuery';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport type { z } from 'zod';\nimport { teamMemberCreateSchemaWithMetadata } from './teamMemberMetadata';\nimport { teamMemberPaths } from './team_memberRoutes';\n\nconst router = useRouter();\nconst route = useRoute();\nconst team_id = route.params.id as string;\n\n// Fetch users for selection\nconst {\n data: usersData,\n loading: usersLoading,\n error: usersError,\n} = useQuery((api) => api.users.getUsersForSelection(), {\n staleTime: 10 * 60 * 1000,\n});\n\nconst loadUsers = async () => {\n // Wait for query to complete\n while (usersLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n if (usersError.value) {\n return [];\n }\n\n const users = usersData.value || [];\n\n // Transform to select options format: [{ value: id, label: email }]\n return users.map((user) => ({\n value: user.id,\n label: user.email,\n }));\n};\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamMemberCreateSchemaWithMetadata, {\n storeName: `create-team-member-${team_id}`,\n persistToLocalStorage: true,\n renderStyle: 'daisy_ui',\n initialValues: {},\n dataLoaders: {\n users: loadUsers,\n },\n});\n\n// Setup mutation for creating team member\nconst { mutate: createTeamMember } = useMutation(\n (api, input: any) => api.teamMembers.createTeamMember(input),\n { invalidate: /^team-members?:|^user:teams/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: z.infer<typeof teamMemberCreateSchemaWithMetadata>) => {\n const createdTeamMember = await createTeamMember({\n team_id: team_id,\n user_id: formData.user_id,\n role: formData.role,\n display_name: formData.display_name,\n business_phone: formData.business_phone,\n mobile_phone: formData.mobile_phone,\n email_address: formData.email_address,\n website_address: formData.website_address,\n time_zone: formData.time_zone,\n } as any);\n\n if (!createdTeamMember) {\n throw new Error('Failed to create team member');\n }\n\n return createdTeamMember;\n};\n\n// Handle successful submission\nconst handleSuccess = async (createdTeamMember: any) => {\n clearSavedFormState();\n toast.success(\n `Team member \"${createdTeamMember.display_name || createdTeamMember.id}\" created successfully!`,\n );\n // Redirect to list page\n await router.push({\n name: teamMemberPaths.list.name,\n params: { id: team_id },\n });\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { TeamMemberFiltersSchema } from '@dragonmastery/dragoncore-shared';\n\nexport const teamMemberFiltersSchemaWithMetadata = withMetadata(\n TeamMemberFiltersSchema,\n 'teamMemberFilters',\n {\n display_name: {\n label: 'Display Name',\n inputType: 'text' as const,\n },\n role: {\n label: 'Role',\n inputType: 'text' as const,\n },\n email_address: {\n label: 'Email Address',\n inputType: 'text' as const,\n },\n business_phone: {\n label: 'Business Phone',\n inputType: 'text' as const,\n },\n mobile_phone: {\n label: 'Mobile Phone',\n inputType: 'text' as const,\n },\n time_zone: {\n label: 'Time Zone',\n inputType: 'text' as const,\n },\n },\n);\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { TeamMemberReadSchema } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Reuse the existing TeamMemberReadSchema from the validation library\n * for the data table rows - don't recreate it!\n */\nexport const teamMemberRowSchemaWithMetadata = withMetadata(\n TeamMemberReadSchema,\n 'teamMemberRow',\n {},\n);\n\nexport type TeamMemberRow = typeof TeamMemberReadSchema._type;\n","<template>\n <div>\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4 mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold\">Team Members</h1>\n <router-link\n :to=\"{\n name: teamMemberPaths.create.name,\n params: { id: team_id },\n }\"\n class=\"btn btn-primary btn-sm sm:btn-md\"\n >\n Create\n </router-link>\n </div>\n <ZiniaDataTable>\n <template #cell-display_name=\"{ row }\">\n {{ row.display_name || 'N/A' }}\n </template>\n <template #cell-email_address=\"{ row }\">\n <router-link\n :to=\"{\n name: teamMemberPaths.view.name,\n params: { id: team_id, member_id: row.id },\n }\"\n class=\"link link-primary\"\n >\n {{ row.email_address || 'N/A' }}\n </router-link>\n </template>\n <template #cell-role=\"{ row }\">\n {{ row.role || 'N/A' }}\n </template>\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n <template #cell-updated_at=\"{ row }\">\n {{ formatSystemTimestamp(row.updated_at) }}\n </template>\n <template #cell-actions=\"{ row }\">\n <router-link\n :to=\"{\n name: teamMemberPaths.view.name,\n params: { id: team_id, member_id: row.id },\n }\"\n class=\"btn btn-sm btn-primary\"\n >\n View\n </router-link>\n </template>\n </ZiniaDataTable>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../../utils/convertToLocalDateTime';\nimport { OPERATORS } from '@dragonmastery/dragoncore-shared';\nimport { ActionIcons, useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { ref } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { teamMemberRowSchemaWithMetadata, type TeamMemberRow } from './teamMemberRowSchema';\nimport { teamMemberPaths } from './team_memberRoutes';\n\nconst route = useRoute();\nconst team_id = route.params.id as string;\n\n// Store pagination token for breadcrumb state\nconst currentPaginationToken = ref<string | undefined | null>();\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable } = useCursorDataTable(teamMemberRowSchemaWithMetadata, {\n fetchData: async ({ cursor, pageSize, sort, filters, search }) => {\n const variables: any = {\n team_id: {\n operator: OPERATORS.EQUALS,\n value: team_id,\n },\n first: pageSize,\n sortBy: sort?.field ? (sort.field as string) : 'created_at',\n sortDirection: (sort?.direction === 'asc' ? 'asc' : 'desc') as 'asc' | 'desc',\n ...(cursor ? { after: cursor } : {}),\n ...(currentPaginationToken.value\n ? { paginationToken: currentPaginationToken.value }\n : {}),\n ...(search\n ? {\n search:\n typeof search === 'string'\n ? {\n query: search,\n searchableFields: ['display_name', 'role', 'email_address'],\n }\n : search,\n }\n : {}),\n ...filters,\n };\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.teamMembers.listTeamMembers(variables);\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n // Store the new pagination token for next request\n currentPaginationToken.value = result?.pageInfo?.paginationToken;\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n email_address: {\n label: 'Email',\n field: 'email_address',\n sortable: true,\n filterable: true,\n },\n role: {\n label: 'Role',\n field: 'role',\n sortable: true,\n filterable: true,\n },\n display_name: {\n label: 'Name',\n field: 'display_name',\n sortable: true,\n },\n business_phone: {\n label: 'Business Phone',\n field: 'business_phone',\n sortable: true,\n filterable: true,\n },\n mobile_phone: {\n label: 'Mobile Phone',\n field: 'mobile_phone',\n sortable: true,\n filterable: true,\n },\n created_at: {\n label: 'Created',\n field: 'created_at',\n sortable: true,\n },\n updated_at: {\n label: 'Updated',\n field: 'updated_at',\n sortable: true,\n },\n },\n actions: {\n items: [\n {\n key: 'view',\n icon: ActionIcons.edit,\n size: 'xs',\n variant: 'primary',\n type: 'link',\n href: (row: TeamMemberRow) => `/teams/${team_id}/members/${row.id}`,\n },\n ],\n },\n search: {\n searchableFields: ['display_name', 'role', 'email_address'],\n },\n pagination: { pageSize: 25 },\n});\n</script>\n","<template>\n <div v-if=\"isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ error.message }}</span>\n </div>\n\n <RouterView v-else :teamMember=\"teamMember\" :isLoading=\"isLoading\" :error=\"error\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { OPERATORS } from '@dragonmastery/dragoncore-shared';\nimport { useBreadcrumbs } from '../../../composables/useBreadcrumbs';\nimport { useQuery } from '../../../composables/useQuery';\nimport { computed, provide } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { teamMemberPaths } from './team_memberRoutes';\n\nconst route = useRoute();\nconst team_id = route.params.id as string;\nconst member_id = route.params.member_id as string;\n\n// Fetch team member data - filter by team_id and find matching member\nconst {\n data,\n loading: isLoading,\n error,\n refetch,\n} = useQuery(\n async (api) => {\n const result = await api.teamMembers.listTeamMembers({\n team_id: {\n operator: OPERATORS.EQUALS,\n value: team_id,\n },\n first: 100, // Fetch up to 100 members to find the one we need\n });\n // Find the member with matching id\n return result.items.find((item: any) => item.id === member_id) || null;\n },\n {\n staleTime: 5 * 60 * 1000,\n },\n);\n\nconst teamMember = computed(() => data.value ?? null);\n\n// Manage breadcrumbs at parent level\n// Use segment mode to append to TeamParent breadcrumbs\nuseBreadcrumbs(\n () => [\n {\n label: 'Members',\n to: {\n name: teamMemberPaths.list.name,\n params: { id: team_id },\n },\n },\n {\n label: teamMember.value?.display_name || teamMember.value?.email_address || 'Member',\n loading: !teamMember.value,\n to: {\n name: teamMemberPaths.view.name,\n params: { id: team_id, member_id: member_id },\n },\n },\n ],\n true, // Use segment mode to append to parent breadcrumbs\n);\n\n// Provide refresh function to child components\nconst refreshTeamMember = async () => {\n await refetch();\n};\n\nprovide('refreshTeamMember', refreshTeamMember);\n</script>\n","<template>\n <div v-if=\"isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ error.message }}</span>\n </div>\n\n <ZiniaContainer v-else-if=\"teamMemberData\">\n <!-- Header with Title -->\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold text-base-content break-words leading-tight\">\n {{ teamMemberData.display_name || 'Team Member' }}\n </h1>\n <div class=\"flex flex-wrap items-center gap-2 mt-2\">\n <span v-if=\"teamMemberData.role\" class=\"badge badge-sm badge-primary\">{{\n teamMemberData.role\n }}</span>\n <span v-if=\"teamMemberData.deleted_at\" class=\"badge badge-sm badge-error\">\n Deleted\n </span>\n <span v-else class=\"badge badge-sm badge-success\">Active</span>\n </div>\n </div>\n\n <!-- Team Member Information Grid -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-6\">\n <!-- Contact Information -->\n <div\n v-if=\"\n teamMemberData.email_address ||\n teamMemberData.business_phone ||\n teamMemberData.mobile_phone\n \"\n class=\"card bg-base-100 shadow-sm\"\n >\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Contact Information</h3>\n <div v-if=\"teamMemberData.email_address\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Email:</span>\n <a :href=\"`mailto:${teamMemberData.email_address}`\" class=\"ml-2 link link-primary\">\n {{ teamMemberData.email_address }}\n </a>\n </div>\n <div v-if=\"teamMemberData.business_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Business Phone:</span>\n <span class=\"ml-2\">{{ teamMemberData.business_phone }}</span>\n </div>\n <div v-if=\"teamMemberData.mobile_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Mobile Phone:</span>\n <span class=\"ml-2\">{{ teamMemberData.mobile_phone }}</span>\n </div>\n <div v-if=\"teamMemberData.time_zone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Time Zone:</span>\n <span class=\"ml-2\">{{ teamMemberData.time_zone }}</span>\n </div>\n </div>\n </div>\n\n <!-- Web Presence -->\n <div v-if=\"teamMemberData.website_address\" class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Web Presence</h3>\n <div v-if=\"teamMemberData.website_address\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Website:</span>\n <a\n :href=\"teamMemberData.website_address\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ml-2 link link-primary\"\n >\n {{ teamMemberData.website_address }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Metadata -->\n <div class=\"mt-4 pt-4 border-t border-base-300 text-xs sm:text-sm text-base-content/50\">\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-4\">\n <span v-if=\"teamMemberData.created_by\"\n >Created by {{ getUserNameWithFallback(teamMemberData.created_by) }}</span\n >\n <span v-if=\"teamMemberData.created_at\">\n Created {{ formatSystemTimestamp(teamMemberData.created_at) }}\n </span>\n <span\n v-if=\"\n teamMemberData.updated_at &&\n teamMemberData.updated_at !== teamMemberData.created_at\n \"\n class=\"text-xs\"\n >\n Updated {{ formatSystemTimestamp(teamMemberData.updated_at) }}\n </span>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 justify-center mt-6\">\n <router-link\n :to=\"{\n name: teamMemberPaths.edit.name,\n params: { id: team_id, member_id: member_id },\n }\"\n class=\"btn btn-primary\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit Team Member\n </router-link>\n </div>\n </ZiniaContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { useUserLookup } from '../../../composables/useUserLookup';\nimport { formatSystemTimestamp } from '../../../utils/convertToLocalDateTime';\nimport ZiniaContainer from '../../../components/ui/ZiniaContainer.vue';\nimport type { TeamMemberReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { teamMemberPaths } from './team_memberRoutes';\n\ninterface Props {\n teamMember: TeamMemberReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst team_id = route.params.id as string;\nconst member_id = route.params.member_id as string;\n\nconst teamMemberData = computed(() => props.teamMember);\n\n// User lookup for mapping user IDs to usernames\nconst { getUserNameWithFallback } = useUserLookup((api) => api.teamMembers.getUserTeamMembers());\n</script>\n","import { userAuthenticated } from '../../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../../types/ExtendedRoute';\n\nexport const customerSupportPaths = {\n customer_list: {\n path: '',\n full_path: '/support',\n name: 'CustomerSupportTicketList',\n },\n customer_create: {\n path: 'create',\n full_path: '/support/create',\n name: 'CustomerCreateSupportTicket',\n },\n customer_create_success: {\n path: 'create/success',\n full_path: '/support/create/success',\n name: 'CustomerSupportTicketSuccess',\n },\n customer_view: {\n path: ':id',\n full_path: '/support/:id',\n name: 'CustomerViewSupportTicket',\n },\n customer_edit: {\n path: 'edit',\n full_path: '/support/:id/edit',\n name: 'CustomerEditSupportTicket',\n },\n customer_customer_notes: {\n path: 'customer-notes',\n full_path: '/support/:id/customer-notes',\n name: 'CustomerSupportTicketCustomerNotes',\n },\n customer_history: {\n path: 'history',\n full_path: '/support/:id/history',\n name: 'CustomerSupportTicketHistory',\n },\n customer_attachments: {\n path: 'attachments',\n full_path: '/support/:id/attachments',\n name: 'CustomerSupportTicketAttachments',\n },\n} as const;\n\nexport const customerSupportTicketRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/support',\n name: 'CustomerSupportTicket',\n redirect: { name: customerSupportPaths.customer_list.name },\n beforeEnter: [userAuthenticated],\n meta: {},\n children: [\n {\n path: customerSupportPaths.customer_list.path,\n name: customerSupportPaths.customer_list.name,\n component: () => import('./CustomerSupportTicketList.vue'),\n meta: {\n title: 'Tickets',\n description: 'Support tickets',\n side_bar: {\n section: 'Support',\n visible_to: ['consumer', 'lead', 'staff', 'super_admin'],\n },\n },\n },\n {\n path: customerSupportPaths.customer_create.path,\n name: customerSupportPaths.customer_create.name,\n component: () => import('./CustomerCreateSupportTicketForm.vue'),\n meta: {\n title: 'Create Support Ticket',\n description: 'Create new support ticket',\n breadcrumbs: [\n {\n label: 'Support',\n to: { name: customerSupportPaths.customer_list.name },\n },\n {\n label: 'Create',\n to: { name: customerSupportPaths.customer_create.name },\n },\n ],\n },\n },\n {\n path: customerSupportPaths.customer_create_success.path,\n name: customerSupportPaths.customer_create_success.name,\n component: () => import('./CustomerSupportTicketSuccess.vue'),\n meta: {\n title: 'Support Ticket Submitted',\n description: 'Support ticket submitted successfully',\n breadcrumbs: [\n {\n label: 'Support',\n to: { name: customerSupportPaths.customer_list.name },\n },\n {\n label: 'Create',\n to: { name: customerSupportPaths.customer_create.name },\n },\n {\n label: 'Success',\n to: { name: customerSupportPaths.customer_create_success.name },\n },\n ],\n },\n },\n {\n path: customerSupportPaths.customer_view.path,\n component: () => import('./CustomerSupportTicketParent.vue'),\n meta: {\n // Define support ticket detail tabs\n // Note: Customer Notes tab will redirect to Internal Notes for INTERNAL support ticket\n sectionTabs: [\n {\n id: 'view',\n label: 'View',\n to: { name: customerSupportPaths.customer_view.name },\n },\n {\n id: 'edit',\n label: 'Edit',\n to: { name: customerSupportPaths.customer_edit.name },\n },\n {\n id: 'customer-notes',\n label: 'Customer Notes',\n to: { name: customerSupportPaths.customer_customer_notes.name },\n },\n {\n id: 'history',\n label: 'History',\n to: { name: customerSupportPaths.customer_history.name },\n },\n {\n id: 'attachments',\n label: 'Attachments',\n to: { name: customerSupportPaths.customer_attachments.name },\n },\n ],\n },\n children: [\n {\n path: '',\n name: customerSupportPaths.customer_view.name,\n component: () => import('./CustomerViewSupportTicket.vue'),\n meta: {\n title: 'View Support Ticket',\n description: 'View support ticket details',\n currentTab: 'view',\n },\n },\n {\n path: customerSupportPaths.customer_edit.path,\n name: customerSupportPaths.customer_edit.name,\n component: () => import('./CustomerEditSupportTicketForm.vue'),\n meta: {\n title: 'Edit Support Ticket',\n description: 'Edit support ticket details',\n currentTab: 'edit',\n },\n },\n {\n path: customerSupportPaths.customer_customer_notes.path,\n name: customerSupportPaths.customer_customer_notes.name,\n component: () => import('./CustomerSupportTicketCustomerNotesTab.vue'),\n meta: {\n title: 'Customer Notes',\n description: 'Communication history with customer',\n currentTab: 'customer-notes',\n },\n },\n {\n path: customerSupportPaths.customer_history.path,\n name: customerSupportPaths.customer_history.name,\n component: () => import('./CustomerSupportTicketHistoryTab.vue'),\n meta: {\n title: 'Support Ticket History',\n description: 'View audit trail and changes',\n currentTab: 'history',\n },\n },\n {\n path: customerSupportPaths.customer_attachments.path,\n name: customerSupportPaths.customer_attachments.name,\n component: () => import('./CustomerSupportTicketAttachmentsTab.vue'),\n meta: {\n title: 'Support Ticket Attachments',\n description: 'Manage ticket attachments',\n currentTab: 'attachments',\n },\n },\n ],\n },\n ],\n },\n];\n","import { staffOnly, userAuthenticated } from '../../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../../types/ExtendedRoute';\n\nexport const staffSupportPaths = {\n staff_list: {\n path: '',\n full_path: '/staff/support',\n name: 'StaffSupportTicketList',\n },\n staff_create: {\n path: 'create',\n full_path: '/staff/support/create',\n name: 'StaffCreateSupportTicket',\n },\n staff_create_success: {\n path: 'create/success',\n full_path: '/staff/support/create/success',\n name: 'StaffSupportTicketSuccess',\n },\n staff_edit: {\n path: ':id',\n full_path: '/staff/support/:id',\n name: 'StaffEditSupportTicket',\n },\n staff_workflow: {\n path: 'workflow',\n full_path: '/staff/support/:id/workflow',\n name: 'StaffSupportTicketWorkflow',\n },\n staff_customer_notes: {\n path: 'customer-notes',\n full_path: '/staff/support/:id/customer-notes',\n name: 'StaffSupportTicketCustomerNotes',\n },\n staff_internal_notes: {\n path: 'internal-notes',\n full_path: '/staff/support/:id/internal-notes',\n name: 'StaffSupportTicketInternalNotes',\n },\n staff_history: {\n path: 'history',\n full_path: '/staff/support/:id/history',\n name: 'StaffSupportTicketHistory',\n },\n staff_attachments: {\n path: 'attachments',\n full_path: '/staff/support/:id/attachments',\n name: 'StaffSupportTicketAttachments',\n },\n} as const;\n\nexport const staffSupportTicketRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/staff/support',\n name: 'StaffSupportTicket',\n redirect: { name: staffSupportPaths.staff_list.name },\n beforeEnter: [userAuthenticated, staffOnly],\n meta: {},\n children: [\n {\n path: staffSupportPaths.staff_list.path,\n name: staffSupportPaths.staff_list.name,\n component: () => import('./StaffSupportTicketList.vue'),\n meta: {\n title: 'Manage Support',\n description: 'Admin support ticket management',\n side_bar: {\n section: ' Staff',\n visible_to: ['staff', 'super_admin'],\n },\n },\n },\n {\n path: staffSupportPaths.staff_create.path,\n name: staffSupportPaths.staff_create.name,\n component: () => import('./StaffCreateSupportTicketForm.vue'),\n meta: {\n title: 'Create Support Ticket',\n description: 'Create new support ticket item',\n breadcrumbs: [\n {\n label: 'Staff Support Ticket',\n to: { name: staffSupportPaths.staff_list.name },\n },\n {\n label: 'Create',\n to: { name: staffSupportPaths.staff_create.name },\n },\n ],\n },\n },\n {\n path: staffSupportPaths.staff_create_success.path,\n name: staffSupportPaths.staff_create_success.name,\n component: () => import('./StaffSupportTicketSuccess.vue'),\n meta: {\n title: 'Support Ticket Created',\n description: 'Support ticket created successfully',\n breadcrumbs: [\n {\n label: 'Staff Support Ticket',\n to: { name: staffSupportPaths.staff_list.name },\n },\n {\n label: 'Create',\n to: { name: staffSupportPaths.staff_create.name },\n },\n {\n label: 'Success',\n to: { name: staffSupportPaths.staff_create_success.name },\n },\n ],\n },\n },\n {\n path: staffSupportPaths.staff_edit.path,\n component: () => import('./StaffSupportTicketParent.vue'),\n meta: {\n // Define support ticket detail tabs\n // Note: Customer Notes tab will redirect to Internal Notes for INTERNAL support ticket\n sectionTabs: [\n {\n id: 'edit',\n label: 'Details',\n to: { name: staffSupportPaths.staff_edit.name },\n },\n {\n id: 'workflow',\n label: 'Workflow',\n to: { name: staffSupportPaths.staff_workflow.name },\n },\n {\n id: 'customer-notes',\n label: 'Customer Notes',\n to: { name: staffSupportPaths.staff_customer_notes.name },\n },\n {\n id: 'internal-notes',\n label: 'Internal Notes',\n to: { name: staffSupportPaths.staff_internal_notes.name },\n },\n {\n id: 'history',\n label: 'History',\n to: { name: staffSupportPaths.staff_history.name },\n },\n {\n id: 'attachments',\n label: 'Attachments',\n to: { name: staffSupportPaths.staff_attachments.name },\n },\n ],\n },\n children: [\n {\n path: '',\n name: staffSupportPaths.staff_edit.name,\n component: () => import('./StaffEditSupportTicketForm.vue'),\n meta: {\n title: 'Edit Support Ticket',\n description: 'Edit support ticket details',\n currentTab: 'edit',\n },\n },\n {\n path: staffSupportPaths.staff_workflow.path,\n name: staffSupportPaths.staff_workflow.name,\n component: () => import('./StaffSupportTicketWorkflowTab.vue'),\n meta: {\n title: 'Support Ticket Workflow',\n description: 'Manage workflow actions',\n currentTab: 'workflow',\n },\n },\n {\n path: staffSupportPaths.staff_customer_notes.path,\n name: staffSupportPaths.staff_customer_notes.name,\n component: () => import('./StaffSupportTicketCustomerNotesTab.vue'),\n meta: {\n title: 'Customer Notes',\n description: 'Communication history with customer',\n currentTab: 'customer-notes',\n },\n },\n {\n path: staffSupportPaths.staff_internal_notes.path,\n name: staffSupportPaths.staff_internal_notes.name,\n component: () => import('./StaffSupportTicketInternalNotesTab.vue'),\n meta: {\n title: 'Internal Notes',\n description: 'Staff-only communication',\n currentTab: 'internal-notes',\n },\n },\n {\n path: staffSupportPaths.staff_history.path,\n name: staffSupportPaths.staff_history.name,\n component: () => import('./StaffSupportTicketHistoryTab.vue'),\n meta: {\n title: 'Support Ticket History',\n description: 'View audit trail and changes',\n currentTab: 'history',\n },\n },\n {\n path: staffSupportPaths.staff_attachments.path,\n name: staffSupportPaths.staff_attachments.name,\n component: () => import('./StaffSupportTicketAttachmentsTab.vue'),\n meta: {\n title: 'Support Ticket Attachments',\n description: 'Manage ticket attachments',\n currentTab: 'attachments',\n },\n },\n ],\n },\n ],\n },\n];\n","<template>\n <div v-if=\"form.isLoading\" class=\"flex flex-col items-center justify-center p-8\">\n <div class=\"loading loading-spinner loading-lg\"></div>\n <p class=\"mt-4 text-lg\">Loading...</p>\n </div>\n <div v-else-if=\"form.loadError\" class=\"flex flex-col items-center justify-center p-8\">\n <p class=\"mt-4 text-lg\">{{ form.loadError }}</p>\n </div>\n <ZiniaForm\n v-else\n @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Create Support Ticket\"\n subtitle=\"Submit your support ticket or feature request\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Support Ticket Details\">\n <zinia.TitleField placeholder=\"Enter a clear, descriptive title\" />\n <zinia.TypeField />\n <zinia.PriorityField />\n </FieldsetSection>\n\n <FieldsetSection title=\"Description\">\n <zinia.DescriptionField\n placeholder=\"Provide detailed information about your support ticket, including steps to reproduce (for bugs) or specific requirements (for features)\"\n />\n </FieldsetSection>\n\n <!-- Attachments (Jira-style inline) - Files will be uploaded after ticket creation -->\n <div class=\"mt-6\">\n <InlineAttachments\n :can-upload=\"true\"\n :can-delete=\"false\"\n @files-queued=\"handleFilesQueued\"\n ref=\"attachmentsRef\"\n />\n </div>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Create\" submittingText=\"Submitting Support Ticket...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport FieldsetSection from '../../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../../composables/useMutation';\nimport { customerSupportTicketCreateSchemaWithMetadata } from './customerSupportTicketMetadata';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type {\n CustomerSupportTicketCreateDto,\n CustomerSupportTicketReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport InlineAttachments from '../shared/InlineAttachments.vue';\nimport { customerSupportPaths } from './customerSupportTicketRoutes';\n\nconst router = useRouter();\nconst attachmentsRef = ref<InstanceType<typeof InlineAttachments> | null>(null);\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(customerSupportTicketCreateSchemaWithMetadata, {\n storeName: `create-customer-support-ticket`,\n persistToLocalStorage: true,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n // Return default values for new customer support ticket\n return {\n title: '',\n type: 'IMPROVEMENT' as const,\n priority: 'MEDIUM' as const,\n description: '',\n } satisfies CustomerSupportTicketCreateDto;\n },\n});\n\n// Setup mutation for creating customer support ticket\nconst { mutate: createSupportTicket } = useMutation(\n (api, input: CustomerSupportTicketCreateDto) => api.supportTickets.createTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst beforeValidate = () => {\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: CustomerSupportTicketCreateDto) => {\n const createdSupportTicket = await createSupportTicket(formData);\n if (!createdSupportTicket) {\n throw new Error('Failed to create support ticket');\n }\n return createdSupportTicket;\n};\n\n// Handle files queued during form filling\nconst handleFilesQueued = (_files: File[]) => {\n // Files are queued and will be uploaded after ticket creation\n};\n\n// Handle successful submission\nconst handleSuccess = async (createdSupportTicket: CustomerSupportTicketReadDto) => {\n // Upload any queued files after ticket creation\n if (attachmentsRef.value) {\n try {\n await attachmentsRef.value.uploadQueuedFiles(createdSupportTicket.id);\n } catch (error) {\n console.error('Failed to upload attachments:', error);\n // Don't block success - attachments can be added later\n toast.warning(\n 'Ticket created, but some attachments failed to upload. You can add them later.',\n );\n }\n }\n\n clearSavedFormState();\n await router.push({\n name: customerSupportPaths.customer_create_success.name,\n });\n toast.success(\n `Support Ticket \"${createdSupportTicket.title}\" submitted successfully! Our team will review it shortly.`,\n );\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div class=\"flex flex-col items-center justify-center min-h-[60vh] p-8\">\n <div class=\"text-center max-w-2xl\">\n <!-- Success Icon -->\n <div class=\"mb-6\">\n <div class=\"inline-flex items-center justify-center w-20 h-20 bg-success rounded-full\">\n <svg\n class=\"w-10 h-10 text-success-content\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M5 13l4 4L19 7\"\n ></path>\n </svg>\n </div>\n </div>\n\n <!-- Success Message -->\n <h1 class=\"text-3xl font-bold text-base-content mb-4\">\n Support Ticket Submitted Successfully!\n </h1>\n\n <p class=\"text-lg text-base-content/70 mb-8\">\n Your support ticket has been submitted and our team will review it shortly.\n </p>\n\n <!-- What Happens Next -->\n <div class=\"bg-base-200 rounded-lg p-6 mb-8\">\n <h2 class=\"text-xl font-semibold mb-4\">What happens next?</h2>\n <div class=\"space-y-3 text-left\">\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 1\n </div>\n <div>\n <div class=\"font-medium\">Review</div>\n <div class=\"text-sm text-base-content/70\">\n Our team will review your ticket and determine the best approach\n </div>\n </div>\n </div>\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 2\n </div>\n <div>\n <div class=\"font-medium\">Notification</div>\n <div class=\"text-sm text-base-content/70\">\n You'll receive email updates on status changes and progress\n </div>\n </div>\n </div>\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 3\n </div>\n <div>\n <div class=\"font-medium\">Tracking</div>\n <div class=\"text-sm text-base-content/70\">\n Monitor progress in your support ticket list\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <router-link\n :to=\"{ name: customerSupportPaths.customer_list.name }\"\n class=\"btn btn-primary btn-lg\"\n >\n View My Support Tickets\n </router-link>\n <router-link\n :to=\"{ name: customerSupportPaths.customer_create.name }\"\n class=\"btn btn-outline btn-lg\"\n >\n Submit Another Ticket\n </router-link>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { customerSupportPaths } from './customerSupportTicketRoutes';\n</script>\n","<template>\n <FileManager :record-id=\"supportTicketId\" record-type=\"support_ticket\" :config=\"config\" />\n</template>\n\n<script setup lang=\"ts\">\nimport FileManager from '../../../components/ui/FileManager.vue';\nimport { useRoute } from 'vue-router';\n\nconst route = useRoute();\nconst supportTicketId = route.params.id as string;\n\nconst config = {\n title: 'Support Ticket Attachments',\n};\n</script>\n","<template>\n <ZiniaContainer>\n <SupportTicketAttachments />\n </ZiniaContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport ZiniaContainer from '../../../components/ui/ZiniaContainer.vue';\nimport SupportTicketAttachments from '../shared/SupportTicketAttachments.vue';\n</script>\n\n\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { StaffSupportTicketReadSchema } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Reuse the existing StaffSupportTicketReadSchema from the validation library\n * for the data table rows - don't recreate it!\n */\nexport const adminSupportTicketRowSchemaWithMetadata = withMetadata(\n StaffSupportTicketReadSchema,\n 'adminSupportTicketRow',\n {},\n);\n\nexport type AdminSupportTicketRow = typeof StaffSupportTicketReadSchema._type;\n","<template>\n <div>\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4 mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold\">Manage Support Tickets</h1>\n <div class=\"flex flex-col sm:flex-row gap-2\">\n <router-link\n :to=\"{ name: 'CustomerSupportTicketList' }\"\n class=\"btn btn-outline btn-sm sm:btn-md\"\n >\n Customer View\n </router-link>\n <router-link\n :to=\"{ name: staffSupportPaths.staff_create.name }\"\n class=\"btn btn-primary btn-sm sm:btn-md\"\n >\n Create\n </router-link>\n </div>\n </div>\n <ZiniaDataTable>\n <template #cell-displayId=\"{ row }\">\n {{ formatTicketDisplayId(row.display_id, row.display_id_prefix, row.id) }}\n </template>\n <template #cell-type=\"{ row }\">\n <SupportTicketTypeBadge :type=\"row.type\" size=\"sm\" />\n </template>\n <template #cell-priority=\"{ row }\">\n <SupportTicketPriorityBadge :priority=\"row.priority\" size=\"sm\" />\n </template>\n <template #cell-approval_status=\"{ row }\">\n <SupportTicketApprovalBadge :approvalStatus=\"row.approval_status\" size=\"sm\" />\n </template>\n <template #cell-dev_lifecycle=\"{ row }\">\n <SupportTicketDevLifecycleBadge\n :devLifecycle=\"row.dev_lifecycle || 'PENDING'\"\n size=\"sm\"\n />\n </template>\n <template #cell-credit_value=\"{ row }\">\n {{ formatStaffCreditValue(row.credit_value, row.approval_status) }}\n </template>\n <template #cell-target_at=\"{ row }\">\n {{ formatUserDate(row.target_at) || 'TBD' }}\n </template>\n <template #cell-updated_at=\"{ row }\">\n {{ formatSystemTimestamp(row.updated_at) }}\n </template>\n <template #cell-actions=\"{ row }\">\n <router-link\n :to=\"{\n name: 'AdminEditSupportTicket',\n params: { id: row.id },\n }\"\n class=\"btn btn-sm btn-primary\"\n >\n Manage\n </router-link>\n </template>\n </ZiniaDataTable>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp, formatUserDate } from '../../../utils/convertToLocalDateTime';\nimport { OPERATORS } from '@dragonmastery/dragoncore-shared';\nimport { ActionIcons, useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { ref } from 'vue';\nimport SupportTicketApprovalBadge from '../components/SupportTicketApprovalBadge.vue';\nimport SupportTicketDevLifecycleBadge from '../components/SupportTicketDevLifecycleBadge.vue';\nimport SupportTicketPriorityBadge from '../components/SupportTicketPriorityBadge.vue';\nimport SupportTicketTypeBadge from '../components/SupportTicketTypeBadge.vue';\nimport { formatStaffCreditValue } from '../utils/creditValueFormatter';\nimport { formatTicketDisplayId } from '../utils/displayIdFormatter';\nimport {\n adminSupportTicketRowSchemaWithMetadata,\n type AdminSupportTicketRow,\n} from './StaffSupportTicketRowSchema';\nimport { staffSupportPaths } from './staffSupportTicketRoutes';\n\n// Store pagination token for breadcrumb state\nconst currentPaginationToken = ref<string | undefined | null>();\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable } = useCursorDataTable(adminSupportTicketRowSchemaWithMetadata, {\n fetchData: async ({ cursor, pageSize, sort, filters, search }) => {\n const variables: any = {\n first: pageSize,\n sortBy: sort?.field ? (sort.field as string) : 'updated_at',\n sortDirection: (sort?.direction === 'asc' ? 'asc' : 'desc') as 'asc' | 'desc',\n ...(cursor ? { after: cursor } : {}),\n ...(currentPaginationToken.value\n ? { paginationToken: currentPaginationToken.value }\n : {}),\n ...(search\n ? {\n search:\n typeof search === 'string'\n ? {\n query: search,\n searchableFields: ['display_id', 'title', 'description'],\n }\n : search,\n }\n : {}),\n ...filters,\n };\n\n // Apply default filter to exclude terminal states (unless user explicitly filtered dev_lifecycle)\n if (!filters || !filters.dev_lifecycle) {\n variables.dev_lifecycle = {\n operator: OPERATORS.IS_NOT_ONE_OF,\n values: ['DEPLOYED', 'CANCELLED'],\n };\n }\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.supportTickets.staffListTickets(variables ?? {});\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n // Store the new pagination token for next request\n currentPaginationToken.value = result?.pageInfo?.paginationToken;\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n display_id: {\n label: 'Ticket ID',\n field: 'display_id',\n sortable: true,\n },\n title: {\n label: 'Title',\n field: 'title',\n sortable: true,\n },\n type: {\n label: 'Type',\n field: 'type',\n sortable: true,\n filterable: true,\n },\n priority: {\n label: 'Priority',\n field: 'priority',\n sortable: true,\n filterable: true,\n },\n approval_status: {\n label: 'Approval',\n field: 'approval_status',\n sortable: true,\n filterable: true,\n // Note: INTERNAL status indicates internal tasks (no customer/approval needed)\n },\n dev_lifecycle: {\n label: 'Dev Stage',\n field: 'dev_lifecycle',\n sortable: true,\n filterable: true,\n },\n credit_value: {\n label: 'Credits',\n field: 'credit_value',\n sortable: false,\n },\n target_at: {\n label: 'Delivery Est.',\n field: 'target_at',\n sortable: true,\n },\n updated_at: {\n label: 'Last Updated',\n field: 'updated_at',\n sortable: true,\n },\n requester_email: {\n label: 'Requester',\n field: 'requester_email',\n sortable: true,\n filterable: true,\n },\n },\n actions: {\n items: [\n {\n key: 'manage',\n icon: ActionIcons.edit,\n size: 'xs',\n variant: 'primary',\n type: 'link',\n href: (row: AdminSupportTicketRow) => `/staff/support/${row.id}`,\n },\n ],\n },\n search: {\n searchableFields: ['title'],\n },\n\n pagination: { pageSize: 25 },\n});\n</script>\n","<template>\n <div v-if=\"form.isLoading\" class=\"flex flex-col items-center justify-center p-8\">\n <div class=\"loading loading-spinner loading-lg\"></div>\n <p class=\"mt-4 text-lg\">Loading...</p>\n </div>\n <div v-else-if=\"form.loadError\" class=\"flex flex-col items-center justify-center p-8\">\n <p class=\"mt-4 text-lg\">{{ form.loadError }}</p>\n </div>\n <ZiniaForm\n v-else\n @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Create Support Ticket\"\n subtitle=\"Create new ticket or internal task\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Support Ticket Details\">\n <zinia.TitleField placeholder=\"Enter ticket title\" />\n <zinia.TypeField />\n <zinia.PriorityField />\n </FieldsetSection>\n <FieldsetSection title=\"Description\">\n <zinia.DescriptionField placeholder=\"Describe the ticket in detail\" />\n </FieldsetSection>\n\n <!-- Attachments (Jira-style inline) - Files will be uploaded after ticket creation -->\n <div class=\"mt-6\">\n <InlineAttachments\n :can-upload=\"true\"\n :can-delete=\"false\"\n @files-queued=\"handleFilesQueued\"\n ref=\"attachmentsRef\"\n />\n </div>\n\n <!-- Staff Options -->\n <FieldsetSection title=\"Staff Options\">\n <zinia.IsInternalField label=\"Internal Staff Task\" />\n <!-- Show devLifecycle only for internal tasks -->\n <zinia.DevLifecycleField v-if=\"form.values.is_internal\" />\n </FieldsetSection>\n\n <!-- Credits (only for customer support ticket) -->\n <FieldsetSection v-if=\"!form.values.is_internal\" title=\"Credits (Optional)\">\n <zinia.CreditValueField placeholder=\"0.00\" />\n </FieldsetSection>\n\n <!-- Timeline (Optional) -->\n <FieldsetSection title=\"Timeline (Optional)\">\n <zinia.StartAtField :formatter=\"formatToISODate\" />\n <zinia.TargetAtField :formatter=\"formatToISODate\" />\n </FieldsetSection>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton\n submitText=\"Create Support Ticket\"\n submittingText=\"Creating Support Ticket...\"\n />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport FieldsetSection from '../../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../../composables/useMutation';\nimport { formatToISODate } from '../../../utils/convertToLocalDateTime';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type {\n StaffSupportTicketCreateDto,\n StaffSupportTicketReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport InlineAttachments from '../shared/InlineAttachments.vue';\nimport { adminSupportTicketCreateSchemaWithMetadata } from './StaffSupportTicketMetadata';\nimport { staffSupportPaths } from './staffSupportTicketRoutes';\n\nconst router = useRouter();\nconst attachmentsRef = ref<InstanceType<typeof InlineAttachments> | null>(null);\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(adminSupportTicketCreateSchemaWithMetadata, {\n storeName: `create-admin-support-ticket`,\n persistToLocalStorage: true,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n // Return default values for new support ticket (all required fields)\n return {\n title: '',\n type: 'IMPROVEMENT' as const,\n priority: 'MEDIUM' as const,\n is_internal: false, // Default to customer support ticket\n };\n },\n});\n\n// Setup mutation for creating support ticket with staff fields\nconst { mutate: createSupportTicket } = useMutation(\n (api, input: StaffSupportTicketCreateDto) => api.supportTickets.staffCreateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst beforeValidate = () => {\n // Clear credit_value if internal task (can't have credits)\n if (form.values.is_internal) {\n form.values.credit_value = null;\n\n // Set dev_lifecycle to BACKLOG for internal tasks if not valid\n const validDevLifecycleValues = [\n 'BACKLOG',\n 'CODE_REVIEW',\n 'DEVELOPMENT',\n 'PLANNING',\n 'PO_APPROVAL',\n 'STAGING',\n 'TESTING',\n ];\n if (\n !form.values.dev_lifecycle ||\n !validDevLifecycleValues.includes(form.values.dev_lifecycle)\n ) {\n form.values.dev_lifecycle = 'BACKLOG';\n }\n }\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: StaffSupportTicketCreateDto) => {\n const createdSupportTicket = await createSupportTicket(formData);\n if (!createdSupportTicket) {\n throw new Error('Failed to create support ticket');\n }\n return createdSupportTicket;\n};\n\n// Handle files queued during form filling\nconst handleFilesQueued = (_files: File[]) => {\n // Files are queued and will be uploaded after ticket creation\n};\n\n// Handle successful submission\nconst handleSuccess = async (createdSupportTicket: StaffSupportTicketReadDto) => {\n // Upload any queued files after ticket creation\n if (attachmentsRef.value) {\n try {\n await attachmentsRef.value.uploadQueuedFiles(createdSupportTicket.id);\n } catch (error) {\n console.error('Failed to upload attachments:', error);\n // Don't block success - attachments can be added later\n toast.warning(\n 'Ticket created, but some attachments failed to upload. You can add them later.',\n );\n }\n }\n\n clearSavedFormState();\n await router.push({ name: staffSupportPaths.staff_create_success.name });\n toast.success(`Support Ticket \"${createdSupportTicket.title}\" created successfully!`);\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div class=\"flex flex-col items-center justify-center min-h-[60vh] p-8\">\n <div class=\"text-center max-w-2xl\">\n <!-- Success Icon -->\n <div class=\"mb-6\">\n <div class=\"inline-flex items-center justify-center w-20 h-20 bg-success rounded-full\">\n <svg\n class=\"w-10 h-10 text-success-content\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M5 13l4 4L19 7\"\n ></path>\n </svg>\n </div>\n </div>\n\n <!-- Success Message -->\n <h1 class=\"text-3xl font-bold text-base-content mb-4\">\n Support Ticket Created Successfully!\n </h1>\n\n <p class=\"text-lg text-base-content/70 mb-8\">\n The support ticket has been created and is ready for processing.\n </p>\n\n <!-- What Happens Next -->\n <div class=\"bg-base-200 rounded-lg p-6 mb-8\">\n <h2 class=\"text-xl font-semibold mb-4\">Next Steps</h2>\n <div class=\"space-y-3 text-left\">\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 1\n </div>\n <div>\n <div class=\"font-medium\">Review & Assign</div>\n <div class=\"text-sm text-base-content/70\">\n Review the ticket details and assign to appropriate team member\n </div>\n </div>\n </div>\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 2\n </div>\n <div>\n <div class=\"font-medium\">Set Timeline</div>\n <div class=\"text-sm text-base-content/70\">\n Update target dates and delivery estimates if needed\n </div>\n </div>\n </div>\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 3\n </div>\n <div>\n <div class=\"font-medium\">Begin Work</div>\n <div class=\"text-sm text-base-content/70\">\n Start development or operational work as appropriate\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <router-link\n :to=\"{ name: staffSupportPaths.staff_list.name }\"\n class=\"btn btn-primary btn-lg\"\n >\n View All Support Tickets\n </router-link>\n <router-link\n :to=\"{ name: staffSupportPaths.staff_create.name }\"\n class=\"btn btn-outline btn-lg\"\n >\n Create Another Ticket\n </router-link>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { staffSupportPaths } from './staffSupportTicketRoutes';\n</script>\n","<template>\n <ZiniaContainer>\n <SupportTicketAttachments />\n </ZiniaContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport ZiniaContainer from '../../../components/ui/ZiniaContainer.vue';\nimport SupportTicketAttachments from '../shared/SupportTicketAttachments.vue';\n</script>\n\n\n","<template>\n <div class=\"credit-balance-widget\" :class=\"variant === 'compact' ? 'compact' : ''\">\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"flex items-center gap-2\">\n <span class=\"loading loading-spinner loading-sm\"></span>\n <span class=\"text-sm\">Loading credits...</span>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error\">\n <span class=\"text-sm\">Failed to load credit balance</span>\n </div>\n\n <!-- Compact Variant (Badge) -->\n <div v-else-if=\"variant === 'compact' && creditBalance\" class=\"flex items-center gap-2\">\n <div\n class=\"badge badge-lg gap-2\"\n :class=\"{\n 'badge-success': totalAvailable > 0,\n 'badge-warning': totalAvailable === 0,\n }\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span class=\"font-bold\"\n >{{ formatStaffCreditValue(totalAvailable.toString()) }} Credits</span\n >\n </div>\n <button v-if=\"expandable\" class=\"btn btn-ghost btn-xs\" @click=\"expanded = !expanded\">\n {{ expanded ? 'Hide' : 'Details' }}\n </button>\n </div>\n\n <!-- Expanded/Full Variant -->\n <div v-else-if=\"creditBalance && (variant === 'full' || expanded)\" class=\"space-y-3\">\n <h4 v-if=\"showTitle\" class=\"text-sm font-medium text-base-content/60\">\n Your Available Credits\n </h4>\n\n <div class=\"space-y-2\">\n <div class=\"flex justify-between items-center p-3 bg-base-200 rounded-lg\">\n <span class=\"text-sm\">Monthly Balance:</span>\n <span class=\"font-bold\">{{ formatStaffCreditValue(creditBalance.monthly) }}</span>\n </div>\n <div class=\"flex justify-between items-center p-3 bg-base-200 rounded-lg\">\n <span class=\"text-sm\">Rollover Balance:</span>\n <span class=\"font-bold\">{{ formatStaffCreditValue(creditBalance.rollover) }}</span>\n </div>\n <div\n class=\"flex justify-between items-center p-3 rounded-lg\"\n :class=\"{\n 'bg-success/20': totalAvailable > 0,\n 'bg-warning/20': totalAvailable === 0,\n }\"\n >\n <span class=\"font-medium\">Total Available:</span>\n <span\n class=\"text-xl font-bold\"\n :class=\"{\n 'text-success': totalAvailable > 0,\n 'text-warning': totalAvailable === 0,\n }\"\n >{{ formatStaffCreditValue(totalAvailable.toString()) }}</span\n >\n </div>\n </div>\n\n <!-- Warning if low balance -->\n <div v-if=\"totalAvailable === 0\" class=\"alert alert-warning\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <div>\n <h3 class=\"font-bold\">No Credits Available</h3>\n <p class=\"text-sm\">\n Contact support to purchase more credits or wait for your monthly reset.\n </p>\n </div>\n </div>\n\n <!-- View History Link -->\n <div v-if=\"showHistoryLink\" class=\"pt-2\">\n <router-link\n :to=\"{ name: 'CreditTransactionHistory' }\"\n class=\"link link-primary text-sm\"\n >\n View Credit History →\n </router-link>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useQuery } from '../../../composables/useQuery';\nimport { computed, ref } from 'vue';\nimport { formatStaffCreditValue } from '../utils/creditValueFormatter';\n\ninterface Props {\n variant?: 'compact' | 'full';\n expandable?: boolean;\n showTitle?: boolean;\n showHistoryLink?: boolean;\n}\n\nwithDefaults(defineProps<Props>(), {\n variant: 'full',\n expandable: false,\n showTitle: true,\n showHistoryLink: true,\n});\n\nconst expanded = ref(false);\n\n// Fetch credit balance\nconst { data, loading, error } = useQuery((api) => api.customer.getCreditBalance(), {\n staleTime: 2 * 60 * 1000,\n});\n\nconst creditBalance = computed(() => data.value ?? null);\n\nconst totalAvailable = computed(() => {\n if (!creditBalance.value) return 0;\n const monthly = parseFloat(creditBalance.value.monthly) || 0;\n const rollover = parseFloat(creditBalance.value.rollover) || 0;\n return monthly + rollover;\n});\n</script>\n\n<style scoped>\n.credit-balance-widget.compact {\n display: inline-flex;\n align-items: center;\n}\n</style>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { StaffSupportTicketFiltersSchema } from '@dragonmastery/dragoncore-shared';\n\nexport const adminSupportTicketFiltersSchemaWithMetadata = withMetadata(\n StaffSupportTicketFiltersSchema,\n 'adminSupportTicketFilters',\n {\n type: {\n label: 'Type',\n inputType: 'select' as const,\n },\n status: {\n label: 'Status',\n inputType: 'select' as const,\n },\n approval_status: {\n label: 'Approval Status',\n inputType: 'select' as const,\n // Note: Use 'INTERNAL' value to filter for internal tasks\n },\n priority: {\n label: 'Priority',\n inputType: 'select' as const,\n },\n },\n);\n","import type { SupportTicketStatus } from './useSupportTicketStatus';\n\nexport interface EditInfo {\n sectionTitle: string;\n showLimitation: boolean;\n limitationMessage: string;\n canEditTitle: boolean;\n canEditDescription: boolean;\n canEditType: boolean;\n canEditPriority: boolean;\n canSubmit: boolean;\n submitText: string;\n submittingText: string;\n}\n\nexport function useSupportTicketPermissions() {\n const canEditField = (field: string, status: string, isLocked?: boolean): boolean => {\n switch (status as SupportTicketStatus) {\n case 'PENDING':\n return !isLocked; // Can edit all fields if not locked\n case 'CANCELLED':\n return true; // Can edit all fields for resubmission\n case 'FOLLOWUP':\n case 'IN_PROGRESS':\n return field === 'priority'; // Only priority can be changed once approved\n default:\n return false; // No editing allowed for completed\n }\n };\n\n const canFullyEdit = (status: string, isLocked?: boolean): boolean => {\n return (status === 'PENDING' && !isLocked) || status === 'CANCELLED';\n };\n\n const getEditInfo = (status: string, isLocked?: boolean): EditInfo => {\n const canEditTitle = canEditField('title', status, isLocked);\n const canEditDescription = canEditField('description', status, isLocked);\n const canEditType = canEditField('type', status, isLocked);\n const canEditPriority = canEditField('priority', status, isLocked);\n const canSubmit = status !== 'COMPLETED';\n const showLimitation = !canFullyEdit(status, isLocked);\n\n let sectionTitle: string;\n let limitationMessage: string;\n let submitText: string;\n let submittingText: string;\n\n switch (status as SupportTicketStatus) {\n case 'CANCELLED':\n sectionTitle = 'Resubmit SupportTicket';\n limitationMessage = '';\n submitText = 'Resubmit SupportTicket';\n submittingText = 'Resubmitting...';\n break;\n\n case 'FOLLOWUP':\n sectionTitle = 'Limited Editing';\n limitationMessage =\n 'This support ticket has been approved for development. Only priority can be adjusted.';\n submitText = 'Update Priority';\n submittingText = 'Updating Priority...';\n break;\n\n case 'IN_PROGRESS':\n sectionTitle = 'Limited Editing';\n limitationMessage = 'Development is in progress. Only priority can be adjusted.';\n submitText = 'Update Priority';\n submittingText = 'Updating Priority...';\n break;\n\n case 'PENDING':\n sectionTitle = 'SupportTicket Details';\n limitationMessage = isLocked\n ? 'This support ticket is locked for review.'\n : 'Editing is temporarily limited.';\n submitText = 'Update SupportTicket';\n submittingText = 'Updating SupportTicket...';\n break;\n\n default:\n sectionTitle = 'SupportTicket Details';\n limitationMessage = 'Editing is limited for this support ticket status.';\n submitText = 'Update SupportTicket';\n submittingText = 'Updating SupportTicket...';\n }\n\n return {\n sectionTitle,\n showLimitation,\n limitationMessage,\n canEditTitle,\n canEditDescription,\n canEditType,\n canEditPriority,\n canSubmit,\n submitText,\n submittingText,\n };\n };\n\n const getSuccessMessage = (status: string): string => {\n switch (status as SupportTicketStatus) {\n case 'CANCELLED':\n return 'SupportTicket resubmitted successfully! It will be reviewed again.';\n case 'FOLLOWUP':\n case 'IN_PROGRESS':\n return 'Priority updated successfully!';\n default:\n return 'SupportTicket updated successfully!';\n }\n };\n\n return {\n canEditField,\n canFullyEdit,\n getEditInfo,\n getSuccessMessage,\n };\n}\n","export type SupportTicketStatus =\n | 'PENDING'\n | 'FOLLOWUP'\n | 'IN_PROGRESS'\n | 'COMPLETED'\n | 'CANCELLED';\n\nexport interface StatusInfo {\n icon: string;\n label: string;\n description: string;\n alertClass: string;\n whatsNext: string;\n}\n\nexport function useSupportTicketStatus() {\n const getStatusInfo = (status: string, isLocked?: boolean): StatusInfo => {\n switch (status as SupportTicketStatus) {\n case 'FOLLOWUP':\n return {\n icon: '✅',\n label: 'Approved - To Do',\n description:\n 'Your support_ticket has been approved and is scheduled for development',\n alertClass: 'alert-success',\n whatsNext: \"Development will begin soon. You'll be notified of progress updates.\",\n };\n\n case 'IN_PROGRESS':\n return {\n icon: '🔧',\n label: 'In Development',\n description: 'Development work is currently in progress',\n alertClass: 'alert-warning',\n whatsNext:\n \"Development is currently in progress. You'll be notified when completed.\",\n };\n\n case 'COMPLETED':\n return {\n icon: '🎉',\n label: 'Completed',\n description: 'Your support ticket has been successfully implemented',\n alertClass: 'alert-success',\n whatsNext:\n 'Your support ticket has been completed! Thank you for your contribution.',\n };\n\n case 'CANCELLED':\n return {\n icon: '❌',\n label: 'Cancelled',\n description: 'This support ticket was not approved for development',\n alertClass: 'alert-error',\n whatsNext:\n 'You can modify and resubmit your support ticket with additional details.',\n };\n\n case 'PENDING':\n return {\n icon: '⏳',\n label: 'Under Review',\n description: 'Your support ticket is being reviewed by our team',\n alertClass: 'alert-info',\n whatsNext: isLocked\n ? 'Your support ticket is locked for review. Limited changes may be allowed.'\n : \"Our team is reviewing your support ticket. You can still make changes while it's under review.\",\n };\n\n default:\n return {\n icon: 'ℹ️',\n label: status,\n description: 'Status information',\n alertClass: 'alert-info',\n whatsNext: 'Check back for updates on your support ticket status.',\n };\n }\n };\n\n const isEditable = (status: string, _isLocked?: boolean): boolean => {\n return status !== 'COMPLETED';\n };\n\n const isApproved = (status: string): boolean => {\n return ['FOLLOWUP', 'IN_PROGRESS', 'COMPLETED'].includes(status);\n };\n\n const canResubmit = (status: string): boolean => {\n return status === 'CANCELLED';\n };\n\n return {\n getStatusInfo,\n isEditable,\n isApproved,\n canResubmit,\n };\n}\n","import { useEnv } from '../../composables/useEnv';\nimport { userAlreadyLoggedIn } from '../../middleware/userAlreadyLoggedIn';\nimport type { ExtendedRouteRecordRaw } from '../../types/ExtendedRoute';\n\nexport const authPaths = {\n login: {\n path: 'login',\n full_path: '/auth/login',\n name: 'Login',\n },\n register: {\n path: 'signup',\n full_path: '/auth/signup',\n name: 'Signup',\n },\n forgot_password: {\n path: 'forgot-password',\n full_path: '/auth/forgot-password',\n name: 'Forgot Password',\n },\n reset_password: {\n path: 'reset-password/:token',\n full_path: '/auth/reset-password',\n name: 'Reset Password',\n },\n logout: {\n path: 'logout',\n full_path: '/auth/logout',\n name: 'Logout',\n },\n} as const;\n\nconst { allowUserSignup } = useEnv();\n\nconst baseRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: authPaths.login.path,\n name: authPaths.login.name,\n component: () => import('./features/login/LoginForm.vue'),\n meta: {\n title: 'Login',\n description: 'Login page for Category 5 App',\n },\n beforeEnter: [userAlreadyLoggedIn],\n },\n {\n path: authPaths.forgot_password.path,\n name: authPaths.forgot_password.name,\n component: () => import('./features/forgot_password/ForgotPassword.vue'),\n meta: {\n title: 'Forgot Password',\n description: 'Forgot Password page for Category 5 App',\n },\n beforeEnter: [userAlreadyLoggedIn],\n },\n {\n path: authPaths.reset_password.path,\n name: authPaths.reset_password.name,\n component: () => import('./features/reset_password/ResetPassword.vue'),\n meta: {\n title: 'Reset Password',\n description: 'Reset Password page for Category 5 App',\n },\n beforeEnter: [userAlreadyLoggedIn],\n },\n {\n path: authPaths.logout.path,\n name: authPaths.logout.name,\n component: () => import('./features/Logout.vue'),\n meta: {\n title: 'Logout',\n description: 'Logout page for Category 5 App',\n },\n },\n];\n\nif (allowUserSignup) {\n baseRoutes.splice(1, 0, {\n path: authPaths.register.path,\n name: authPaths.register.name,\n component: () => import('./features/signup/Signup.vue'),\n meta: {\n title: 'Register',\n description: 'Register page for Category 5 App',\n },\n beforeEnter: [userAlreadyLoggedIn],\n });\n}\n\nexport const authRoutes = baseRoutes;\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { resetPasswordInputSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type ResetPasswordForm = z.infer<typeof resetPasswordInputSchema>;\n\n// Enhance the schema with metadata\nexport const resetPasswordSchemaWithMetadata = withMetadata(\n resetPasswordInputSchema,\n 'resetPasswordSchema',\n {\n 'passwords.password': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'new-password',\n className: 'login-field',\n },\n 'passwords.password_confirm': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'new-password',\n className: 'login-field',\n },\n },\n);\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Reset Password</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\n\n <ZiniaSubmitButton submitText=\"Reset Password\" submittingText=\"Resetting Password...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" to=\"/auth/login\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport { authPaths } from '../../authRoutes';\nimport { resetPasswordSchemaWithMetadata } from './reset_password_schema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst token = route.params.token as string;\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(\n resetPasswordSchemaWithMetadata,\n {\n storeName: 'reset-password-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n },\n);\n\nconst { mutate: resetPasswordMutate } = useMutation(\n (api, input: z.infer<typeof resetPasswordSchemaWithMetadata> & { token: string }) =>\n api.passwordReset.resetPassword(input),\n {\n skipAuthCheck: true, // Reset password should work without authentication\n },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof resetPasswordSchemaWithMetadata>) => {\n const result = await resetPasswordMutate({\n ...data,\n token,\n });\n if (!result?.ok) throw new Error('Reset password failed');\n return result;\n};\n\n// Handle success\nconst handleSuccess = async (_data: { ok: boolean }) => {\n form.reset();\n await router.push(authPaths.login.full_path);\n toast.success('Password reset successful!');\n};\n\n// Handle error\nconst handleError = (error: any) => {\n console.log('Reset password failed', error);\n toast.error(error.message || 'Reset password failed');\n};\n</script>\n","<template>\n <div class=\"social-login-buttons space-y-3\">\n <button type=\"button\" class=\"btn btn-outline w-full\" @click=\"$emit('login', 'google')\">\n <span class=\"mr-2\">🔍</span> Sign in with Google\n </button>\n\n <button type=\"button\" class=\"btn btn-outline w-full\" @click=\"$emit('login', 'github')\">\n <span class=\"mr-2\">🐱</span> Sign in with GitHub\n </button>\n\n <button type=\"button\" class=\"btn btn-outline w-full\" @click=\"$emit('login', 'facebook')\">\n <span class=\"mr-2\">👤</span> Sign in with Facebook\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// Define emits\ndefineEmits<{\n (e: 'login', provider: string): void;\n}>();\n</script>\n","import { userIsSuperAdmin } from '../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../types/ExtendedRoute';\n\nexport const adminRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/admin',\n name: 'Admin',\n beforeEnter: [userIsSuperAdmin],\n meta: {\n // Define admin section tabs that will be shown for all admin routes\n sectionTabs: [\n { id: 'create-user', label: 'Create User', to: { name: 'CreateUser' } },\n {\n id: 'user-management',\n label: 'User Management',\n to: { name: 'UserManagement' },\n },\n {\n id: 'credit-management',\n label: 'Credit Management',\n to: { name: 'CreditManagement' },\n },\n {\n id: 'notification-emails',\n label: 'Notification Emails',\n to: { name: 'NotificationEmails' },\n },\n ],\n },\n children: [\n {\n path: 'create-user',\n name: 'CreateUser',\n component: () => import('./features/create_user/CreateUserPage.vue'),\n meta: {\n title: 'Create User',\n description: 'Create User page for Category 5 App',\n side_bar: {\n section: ' Admin',\n visible_to: ['super_admin'],\n },\n },\n },\n {\n path: 'users',\n name: 'UserManagement',\n component: () => import('./features/user_management/UserListPage.vue'),\n meta: {\n title: 'User Management',\n description: 'View and manage all users',\n side_bar: {\n section: ' Admin',\n visible_to: ['super_admin'],\n },\n },\n },\n {\n path: 'users/:id/edit',\n name: 'EditUser',\n component: () => import('./features/user_management/EditUserPage.vue'),\n meta: {\n title: 'Edit User',\n description: 'Edit user role',\n\n breadcrumbs: [\n {\n label: 'Home',\n to: { name: 'Home' },\n },\n {\n label: 'User Management',\n to: { name: 'UserManagement' },\n },\n {\n label: 'Edit User',\n to: { name: 'EditUser' },\n },\n ],\n },\n },\n {\n path: 'credit-management',\n name: 'CreditManagement',\n component: () => import('../customer/features/credit-management/CreditManagement.vue'),\n meta: {\n title: 'Credit Management',\n description: 'Manage customer credits and allocations',\n side_bar: {\n section: ' Admin',\n visible_to: ['super_admin'],\n },\n },\n },\n {\n path: 'notification-emails',\n name: 'NotificationEmails',\n component: () => import('./features/notification-emails/NotificationEmailsPage.vue'),\n meta: {\n title: 'Notification Emails',\n description: 'Configure email notifications for support tickets',\n side_bar: {\n section: ' Admin',\n visible_to: ['super_admin'],\n },\n },\n },\n ],\n },\n];\n","import { leadOrStaffOnly, userAuthenticated } from '../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../types/ExtendedRoute';\n\nexport const creditPaths = {\n credit_balance: {\n path: '',\n full_path: '/credits',\n name: 'CreditBalanceDashboard',\n },\n} as const;\n\nexport const creditRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/credits',\n name: 'Credits',\n beforeEnter: [userAuthenticated, leadOrStaffOnly],\n meta: {},\n children: [\n {\n path: creditPaths.credit_balance.path,\n name: creditPaths.credit_balance.name,\n component: () => import('./CreditBalanceDashboard.vue'),\n meta: {\n title: 'Credit Balance',\n description: 'View your current credit balance and history.',\n side_bar: {\n section: 'Support',\n visible_to: ['lead', 'staff', 'super_admin'],\n },\n },\n },\n ],\n },\n];\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h2 class=\"card-title\">Current Balance</h2>\n\n <div v-if=\"loading\" class=\"flex items-center gap-2\">\n <span class=\"loading loading-spinner loading-sm\"></span>\n <span>Loading balance...</span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error\">\n <span>Failed to load credit balance</span>\n </div>\n\n <div v-else-if=\"data\" class=\"grid grid-cols-1 md:grid-cols-3 gap-4 mt-4\">\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Monthly Credits</div>\n <div class=\"stat-value text-primary\">\n {{ data.monthly }}\n </div>\n <div class=\"stat-desc\">Resets each month</div>\n </div>\n\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Rollover Credits</div>\n <div class=\"stat-value text-secondary\">\n {{ data.rollover }}\n </div>\n <div class=\"stat-desc\">Accumulated balance</div>\n </div>\n\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Total Available</div>\n <div class=\"stat-value text-accent\">{{ totalAvailable }}</div>\n <div class=\"stat-desc\">Ready to use</div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useQuery } from '../../../composables/useQuery';\nimport { computed, inject, ref, watch, type Ref } from 'vue';\n\n// Fetch credit balance\nconst {\n data,\n loading,\n error,\n refetch: executeQuery,\n} = useQuery((api) => api.customer.getCreditBalance(), {\n staleTime: 2 * 60 * 1000,\n});\n\nconst totalAvailable = computed(() => {\n if (!data.value) return '0.00';\n const monthly = parseFloat(data.value.monthly) || 0;\n const rollover = parseFloat(data.value.rollover) || 0;\n return (monthly + rollover).toFixed(2);\n});\n\n// Inject the refresh trigger\nconst refreshTrigger = inject<Ref<number>>('refreshTrigger', ref(0));\n\n// Watch for changes and refetch\nwatch(refreshTrigger, () => {\n executeQuery();\n});\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { CreditTransactionReadSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\nexport const creditTransactionRowSchemaWithMetadata = withMetadata(\n CreditTransactionReadSchema,\n 'creditTransactionRowSchema',\n {\n id: { label: 'ID' },\n support_ticket_id: { label: 'Support Ticket' },\n amount: { label: 'Amount' },\n type: { label: 'Type', sortable: true, filterable: true },\n description: { label: 'Description' },\n balance_after: { label: 'Balance After' },\n created_at: { label: 'Created At', sortable: true },\n created_by: { label: 'Created By', sortable: true },\n },\n);\n\nexport type CreditTransactionRow = z.infer<typeof CreditTransactionReadSchema>;\n","<template>\n <span class=\"badge badge-sm\" :class=\"typeClasses\">\n {{ typeLabel }}\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ninterface Props {\n type: string;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'sm',\n});\n\nconst typeClasses = computed(() => {\n const baseClasses = `badge-${props.size}`;\n switch (props.type) {\n case 'DEDUCTION':\n return `${baseClasses} badge-error`;\n case 'REFUND':\n return `${baseClasses} badge-success`;\n case 'PURCHASE_ONETIME':\n return `${baseClasses} badge-info`;\n case 'PURCHASE_RECURRING':\n return `${baseClasses} badge-primary`;\n case 'ADJUSTMENT':\n return `${baseClasses} badge-warning`;\n default:\n return `${baseClasses} badge-ghost`;\n }\n});\n\nconst typeLabel = computed(() => {\n switch (props.type) {\n case 'DEDUCTION':\n return 'DEDUCTION';\n case 'REFUND':\n return 'REFUND';\n case 'PURCHASE_ONETIME':\n return 'ONE-TIME PURCHASE';\n case 'PURCHASE_RECURRING':\n return 'RECURRING PURCHASE';\n case 'ADJUSTMENT':\n return 'ADJUSTMENT';\n default:\n return props.type.replace('_', ' ').toUpperCase();\n }\n});\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h2 class=\"card-title\">Transaction History</h2>\n\n <ZiniaDataTable>\n <template #cell-type=\"{ row }\">\n <CreditTransactionTypeBadge :type=\"row.type\" size=\"sm\" />\n </template>\n\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n\n <template #cell-amount=\"{ row }\">\n <span class=\"font-mono\" :class=\"getAmountClass(row.type)\">\n {{ formatAmount(row.amount, row.type) }}\n </span>\n </template>\n\n <template #cell-balance_after=\"{ row }\">\n <span class=\"font-mono font-bold\">\n {{ formatCredits(row.balance_after) }}\n </span>\n </template>\n\n <template #cell-description=\"{ row }\">\n <div class=\"flex flex-col\">\n <span>{{ row.description || 'No description' }}</span>\n <router-link\n v-if=\"row.support_ticket_id\"\n :to=\"{\n name: customerSupportPaths.customer_view.name,\n params: { id: row.support_ticket_id },\n }\"\n class=\"text-xs text-primary hover:underline\"\n >\n View Support Ticket →\n </router-link>\n </div>\n </template>\n </ZiniaDataTable>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../../utils/convertToLocalDateTime';\nimport { useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { inject, ref, watch, type Ref } from 'vue';\nimport { customerSupportPaths } from '../../support_ticket/customer/customerSupportTicketRoutes';\nimport { creditTransactionRowSchemaWithMetadata } from '../creditTransactionRowSchema';\nimport CreditTransactionTypeBadge from './CreditTransactionTypeBadge.vue';\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable, refresh } = useCursorDataTable(\n creditTransactionRowSchemaWithMetadata,\n {\n fetchData: async ({ cursor, pageSize, filters, search }) => {\n const variables: any = {\n first: pageSize,\n ...(cursor ? { after: cursor } : {}),\n ...(search ? { search } : {}),\n ...filters,\n };\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.customer.getCreditTransactions(variables);\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n created_at: {\n label: 'Date',\n field: 'created_at',\n sortable: true,\n },\n type: {\n label: 'Type',\n field: 'type',\n sortable: true,\n filterable: true,\n },\n description: {\n label: 'Description',\n field: 'description',\n sortable: false,\n },\n amount: {\n label: 'Amount',\n field: 'amount',\n sortable: true,\n },\n balance_after: {\n label: 'Balance After',\n field: 'balance_after',\n },\n },\n pagination: { pageSize: 25 },\n },\n);\n\n// Utility functions for formatting\nconst formatCredits = (value: string) => {\n const num = parseFloat(value);\n return isNaN(num) ? '0.00' : num.toFixed(2);\n};\n\nconst formatAmount = (amount: string, type: string) => {\n const num = parseFloat(amount);\n const formatted = isNaN(num) ? '0.00' : Math.abs(num).toFixed(2);\n\n if (type === 'DEDUCTION') {\n return `-${formatted}`;\n }\n return `+${formatted}`;\n};\n\nconst getAmountClass = (type: string) => {\n return type === 'DEDUCTION' ? 'text-error' : 'text-success';\n};\n\n// Inject the refresh trigger\nconst refreshTrigger = inject<Ref<number>>('refreshTrigger', ref(0));\n\n// Watch for changes and refetch\nwatch(refreshTrigger, () => {\n refresh();\n});\n</script>\n","<template>\n <div class=\"container mx-auto py-6\">\n <div class=\"flex justify-between items-center mb-6\">\n <h1 class=\"text-2xl font-bold\">Credit Balance</h1>\n </div>\n\n <!-- Credit balance display -->\n <div class=\"space-y-6\">\n <!-- Credit Balance Overview -->\n <CreditBalanceOverview />\n\n <!-- Transaction History -->\n <CreditTransactionHistory />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport CreditBalanceOverview from './components/CreditBalanceOverview.vue';\nimport CreditTransactionHistory from './components/CreditTransactionHistory.vue';\n</script>\n","import {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { AddCreditsSchema, SetMonthlyAllocationSchema } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\n\n// Add Credits Form Metadata\nexport const addCreditsSchemaWithMetadata = withMetadata(\n AddCreditsSchema,\n 'addCreditsSchema',\n {\n amount: {\n label: 'Amount',\n placeholder: 'e.g., 100.00',\n helpText: 'Enter the amount to add to rollover credits',\n },\n reason: {\n label: 'Reason',\n inputType: 'textarea',\n placeholder: 'e.g., Purchase, Bonus, Refund',\n helpText: 'Optional reason for adding credits',\n },\n },\n);\n\n// Set Monthly Allocation Form Metadata\nexport const setMonthlyAllocationSchemaWithMetadata = withMetadata(\n SetMonthlyAllocationSchema,\n 'setMonthlyAllocationSchema',\n {\n amount: {\n label: 'Monthly Allocation Amount',\n placeholder: 'e.g., 200.00',\n helpText: 'This amount will be reset monthly',\n },\n },\n);\n\n// Form types\nexport type AddCreditsFormData = UseFormTyped<typeof AddCreditsSchema>;\nexport type SetMonthlyAllocationFormData = UseFormTyped<typeof SetMonthlyAllocationSchema>;\n\n// Injection functions\nexport const injectAddCreditsForm = () => inject<AddCreditsFormData['form']>(ZINIA_FORM_KEY);\nexport const injectSetMonthlyAllocationForm = () =>\n inject<SetMonthlyAllocationFormData['form']>(ZINIA_FORM_KEY);\nexport const injectAddCreditsZinia = () =>\n inject<AddCreditsFormData['zinia']>(ZINIA_FIELDS_KEY);\nexport const injectSetMonthlyAllocationZinia = () =>\n inject<SetMonthlyAllocationFormData['zinia']>(ZINIA_FIELDS_KEY);\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Add Credits</h3>\n <p class=\"text-sm text-base-content/70\">One-time credit addition (goes to rollover)</p>\n\n <ZiniaForm\n @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Add Credits\"\n subtitle=\"Add one-time credits to rollover balance\"\n >\n <zinia.AmountField />\n <zinia.ReasonField />\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Add Credits\" submittingText=\"Adding Credits...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { AddCreditsDto } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { addCreditsSchemaWithMetadata } from './creditFormMetadata';\n\n// Props\ninterface Props {\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n onSuccess: () => {},\n});\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n refreshFormData,\n} = useForm(addCreditsSchemaWithMetadata, {\n storeName: `add-credits-form`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n return {\n amount: '',\n reason: '',\n } satisfies AddCreditsDto;\n },\n});\n\n// Setup mutation for adding credits\nconst { mutate: addCredits } = useMutation(\n (api, input: AddCreditsDto) => api.customer.addCredits(input),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst beforeValidate = () => {\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: AddCreditsDto) => {\n const result = await addCredits({\n amount: formData.amount,\n reason: formData.reason || undefined,\n });\n\n if (!result) {\n throw new Error('Failed to add credits');\n }\n\n return result;\n};\n\n// Handle successful submission\nconst handleSuccess = async (_: any) => {\n refreshFormData();\n toast.success(`Added ${form.values.amount} credits!`);\n refreshCredits();\n props.onSuccess();\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Reset Monthly Balance</h3>\n <p class=\"text-sm text-base-content/70\">Manually trigger monthly reset</p>\n\n <div class=\"alert alert-warning mt-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <span class=\"text-xs\"\n >This will move current monthly balance ({{ currentMonthlyBalance }}) to rollover and\n reset to allocation amount</span\n >\n </div>\n\n <button class=\"btn btn-warning mt-4\" @click=\"showResetModal\" :disabled=\"isResetting\">\n <span v-if=\"isResetting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isResetting ? 'Resetting...' : 'Reset Now' }}\n </button>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2\">\n <span class=\"text-xs\">{{ error }}</span>\n </div>\n </div>\n </div>\n\n <!-- Confirmation Modal -->\n <dialog ref=\"confirmModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Reset Monthly Balance?</h3>\n <p class=\"py-4\">\n This will move the current monthly balance ({{ currentMonthlyBalance }}) to rollover\n and reset monthly credits to the allocation amount.\n </p>\n <p class=\"text-warning font-medium\">This action cannot be undone.</p>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeModal\">Cancel</button>\n <button class=\"btn btn-warning\" @click=\"handleReset\">Confirm Reset</button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button @click=\"closeModal\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { inject, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\n\n// Props\ninterface Props {\n currentMonthlyBalance?: string;\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n currentMonthlyBalance: '0.00',\n onSuccess: () => {},\n});\n\n// Component state\nconst confirmModal = ref<HTMLDialogElement | null>(null);\nconst error = ref('');\nconst { mutate: resetBalance, loading: isResetting } = useMutation(\n (api, _input?: void) => api.customer.resetMonthlyBalance(),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst showResetModal = () => {\n confirmModal.value?.showModal();\n};\n\nconst closeModal = () => {\n confirmModal.value?.close();\n};\n\nconst handleReset = async () => {\n error.value = '';\n closeModal();\n\n try {\n await resetBalance(undefined);\n\n toast.success('Monthly balance reset successfully!');\n\n refreshCredits();\n // Call success callback\n props.onSuccess();\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : 'Failed to reset balance';\n error.value = errorMessage;\n toast.error(errorMessage);\n }\n};\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Monthly Allocation</h3>\n <p class=\"text-sm text-base-content/70\">Set recurring monthly credit amount</p>\n\n <ZiniaForm\n @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Set Monthly Allocation\"\n subtitle=\"Set the recurring monthly credit amount\"\n >\n <zinia.AmountField />\n\n <!-- Information Notice -->\n <div class=\"alert alert-info mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <div class=\"font-semibold\">Monthly Reset</div>\n <div class=\"text-sm\">\n This amount will be automatically reset each month. Any unused credits will roll\n over to the rollover balance.\n </div>\n </div>\n </div>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton\n submitText=\"Set Monthly Allocation\"\n submittingText=\"Setting Allocation...\"\n />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { formatDollar, type SetMonthlyAllocationDto } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { setMonthlyAllocationSchemaWithMetadata } from './creditFormMetadata';\n\n// Props\ninterface Props {\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n onSuccess: () => {},\n});\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(setMonthlyAllocationSchemaWithMetadata, {\n storeName: `set-monthly-allocation-form`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n return {\n amount: '',\n } satisfies SetMonthlyAllocationDto;\n },\n});\n\n// Setup mutation for setting monthly allocation\nconst { mutate: setAllocation } = useMutation(\n (api, input: SetMonthlyAllocationDto) => api.customer.setMonthlyAllocation(input),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst beforeValidate = () => {\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: SetMonthlyAllocationDto) => {\n const result = await setAllocation({\n amount: formData.amount,\n });\n\n if (!result) {\n throw new Error('Failed to set monthly allocation');\n }\n\n return result;\n};\n\n// Handle successful submission\nconst handleSuccess = async (data: any) => {\n clearSavedFormState();\n toast.success(`Monthly allocation set to ${formatDollar(data.monthly)}!`);\n refreshCredits();\n props.onSuccess();\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div class=\"container mx-auto py-6\">\n <h1 class=\"text-3xl font-bold mb-6\">Credit Management</h1>\n\n <!-- Current Balance Overview -->\n <div class=\"mb-6\">\n <CreditBalanceOverview />\n </div>\n\n <!-- Management Actions -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <AddCredits />\n <SetMonthlyAllocation />\n <ResetMonthlyBalance />\n </div>\n\n <!-- Recent Transactions -->\n <div class=\"mt-6\">\n <CreditTransactionHistory />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, ref } from 'vue';\nimport CreditBalanceOverview from '../../components/CreditBalanceOverview.vue';\nimport CreditTransactionHistory from '../../components/CreditTransactionHistory.vue';\nimport AddCredits from './AddCredits.vue';\nimport ResetMonthlyBalance from './ResetMonthlyBalance.vue';\nimport SetMonthlyAllocation from './SetMonthlyAllocation.vue';\n\n// Create a reactive trigger that child components can watch\nconst refreshTrigger = ref(0);\n\n// Provide the trigger function to child components\nprovide('refreshCredits', () => {\n refreshTrigger.value++;\n});\n\n// Provide the trigger value for components to watch\nprovide('refreshTrigger', refreshTrigger);\n</script>\n"],"mappings":"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"}