@dragonmastery/dragoncore-vue 0.0.21 → 0.0.23

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 (245) hide show
  1. package/dist/{AppLink-CHMMrSFI.js → AppLink-FcNGKgvG.js} +1 -1
  2. package/dist/{AppLink-CHMMrSFI.js.map → AppLink-FcNGKgvG.js.map} +1 -1
  3. package/dist/Appearance-Ch4zfWZ3.js +3 -0
  4. package/dist/{Appearance-DxWTyx1M.js → Appearance-shr0Aql0.js} +1 -1
  5. package/dist/{Appearance-DxWTyx1M.js.map → Appearance-shr0Aql0.js.map} +1 -1
  6. package/dist/{ChangePasswordPage--3XwluwE.js → ChangePasswordPage-C633yQiU.js} +2 -2
  7. package/dist/{ChangePasswordPage--3XwluwE.js.map → ChangePasswordPage-C633yQiU.js.map} +1 -1
  8. package/dist/ChangePasswordPage-CYuCCosx.js +7 -0
  9. package/dist/ConfirmDialog-DjthOYU6.js +85 -0
  10. package/dist/ConfirmDialog-DjthOYU6.js.map +1 -0
  11. package/dist/ConsentRequired-BPjsZoPY.js +211 -0
  12. package/dist/ConsentRequired-BPjsZoPY.js.map +1 -0
  13. package/dist/CreateTeamForm-CeaC41VY.js +142 -0
  14. package/dist/CreateTeamForm-CeaC41VY.js.map +1 -0
  15. package/dist/CreateTeamForm-DfgCaUwX.js +12 -0
  16. package/dist/CreateTeamMemberForm-Bv9gNG4z.js +140 -0
  17. package/dist/CreateTeamMemberForm-Bv9gNG4z.js.map +1 -0
  18. package/dist/CreateTeamMemberForm-CnHfpob_.js +12 -0
  19. package/dist/CreateUserPage-C9uOeYDJ.js +7 -0
  20. package/dist/{CreateUserPage-DLwXeLAq.js → CreateUserPage-CqKcY7_X.js} +2 -2
  21. package/dist/{CreateUserPage-DLwXeLAq.js.map → CreateUserPage-CqKcY7_X.js.map} +1 -1
  22. package/dist/CreditBalanceDashboard-0HiJE_OS.js +13 -0
  23. package/dist/CreditBalanceDashboard-k_orNn4h.js +28 -0
  24. package/dist/CreditBalanceDashboard-k_orNn4h.js.map +1 -0
  25. package/dist/CreditManagement-BVBZQDI4.js +356 -0
  26. package/dist/CreditManagement-BVBZQDI4.js.map +1 -0
  27. package/dist/CreditManagement-DXdIN-0d.js +13 -0
  28. package/dist/CreditTransactionHistory-DSu-6aDi.js +229 -0
  29. package/dist/CreditTransactionHistory-DSu-6aDi.js.map +1 -0
  30. package/dist/CustomerCreateSupportTicketForm-BsjX8Pja.js +14 -0
  31. package/dist/CustomerCreateSupportTicketForm-kf8YIGjx.js +158 -0
  32. package/dist/CustomerCreateSupportTicketForm-kf8YIGjx.js.map +1 -0
  33. package/dist/{CustomerSupportTicketDetailPage-BdyaKG1v.js → CustomerSupportTicketDetailPage-C_-YoAaP.js} +12 -9
  34. package/dist/{CustomerSupportTicketDetailPage-BdyaKG1v.js.map → CustomerSupportTicketDetailPage-C_-YoAaP.js.map} +1 -1
  35. package/dist/CustomerSupportTicketList-DdACn3ug.js +63 -0
  36. package/dist/{CustomerSupportTicketParent-HIxwSVdu.js → CustomerSupportTicketParent-BpBuYCrP.js} +4 -4
  37. package/dist/{CustomerSupportTicketParent-HIxwSVdu.js.map → CustomerSupportTicketParent-BpBuYCrP.js.map} +1 -1
  38. package/dist/CustomerSupportTicketParent-Djy7pNqO.js +8 -0
  39. package/dist/CustomerSupportTicketSuccess-DsFzpJFU.js +12 -0
  40. package/dist/CustomerSupportTicketSuccess-cumNSGdx.js +54 -0
  41. package/dist/CustomerSupportTicketSuccess-cumNSGdx.js.map +1 -0
  42. package/dist/EditTeamForm-BE3iX2x3.js +12 -0
  43. package/dist/EditTeamForm-BxRN338L.js +163 -0
  44. package/dist/EditTeamForm-BxRN338L.js.map +1 -0
  45. package/dist/EditTeamMemberForm-D7D1Zddh.js +9 -0
  46. package/dist/{EditTeamMemberForm-CaS2GLjV.js → EditTeamMemberForm-DfgJr5Cy.js} +7 -72
  47. package/dist/EditTeamMemberForm-DfgJr5Cy.js.map +1 -0
  48. package/dist/EditUserPage-C0K7EGjM.js +8 -0
  49. package/dist/{EditUserPage-DURc5rmi.js → EditUserPage-CI_jtU8P.js} +4 -4
  50. package/dist/{EditUserPage-DURc5rmi.js.map → EditUserPage-CI_jtU8P.js.map} +1 -1
  51. package/dist/EnhancedRefreshTokenHandler-C6tZCcfX.js +189 -0
  52. package/dist/EnhancedRefreshTokenHandler-C6tZCcfX.js.map +1 -0
  53. package/dist/FieldsetSection-Cd4B8Ad7.js +27 -0
  54. package/dist/FieldsetSection-Cd4B8Ad7.js.map +1 -0
  55. package/dist/{ForgotPassword-OjIPi9s9.js → ForgotPassword-Ckb9Z-wb.js} +4 -4
  56. package/dist/{ForgotPassword-OjIPi9s9.js.map → ForgotPassword-Ckb9Z-wb.js.map} +1 -1
  57. package/dist/ForgotPassword-tJVSg7PB.js +8 -0
  58. package/dist/{TimelineSystemEvent-BHzFr46C.js → InlineAttachments-DAn_QknY.js} +60 -661
  59. package/dist/InlineAttachments-DAn_QknY.js.map +1 -0
  60. package/dist/{LoginForm-9UFnA-fO.js → LoginForm-CMN2T1fA.js} +5 -5
  61. package/dist/{LoginForm-9UFnA-fO.js.map → LoginForm-CMN2T1fA.js.map} +1 -1
  62. package/dist/LoginForm-QFJ8NHww.js +8 -0
  63. package/dist/{Logout-YgTgOFUH.js → Logout-CFLYHlLr.js} +5 -5
  64. package/dist/{Logout-YgTgOFUH.js.map → Logout-CFLYHlLr.js.map} +1 -1
  65. package/dist/Logout-CjDBff3W.js +8 -0
  66. package/dist/MfaSetup-BZcoxJx-.js +9 -0
  67. package/dist/{MfaSetup-RtFMY_dj.js → MfaSetup-XqoAwBXx.js} +5 -5
  68. package/dist/{MfaSetup-RtFMY_dj.js.map → MfaSetup-XqoAwBXx.js.map} +1 -1
  69. package/dist/{MfaVerify-Cvhe8bEM.js → MfaVerify-C-A75TFZ.js} +6 -6
  70. package/dist/{MfaVerify-Cvhe8bEM.js.map → MfaVerify-C-A75TFZ.js.map} +1 -1
  71. package/dist/MfaVerify-Dy2aV5Gk.js +9 -0
  72. package/dist/{RecordVersionViewer-BWZ78vvE.js → RecordVersionViewer-D2j10HdK.js} +1 -1
  73. package/dist/{RecordVersionViewer-BWZ78vvE.js.map → RecordVersionViewer-D2j10HdK.js.map} +1 -1
  74. package/dist/{ResetPassword-BE4mXK9q.js → ResetPassword-Cd-Yxp8E.js} +4 -4
  75. package/dist/{ResetPassword-BE4mXK9q.js.map → ResetPassword-Cd-Yxp8E.js.map} +1 -1
  76. package/dist/ResetPassword-D6to3G6a.js +8 -0
  77. package/dist/{SavedFiltersPage-DQt6uc8m.js → SavedFiltersPage-DM5DvAFa.js} +62 -34
  78. package/dist/{SavedFiltersPage-DQt6uc8m.js.map → SavedFiltersPage-DM5DvAFa.js.map} +1 -1
  79. package/dist/{Signup-9TjMMnU4.js → Signup-2pqvJiVt.js} +57 -57
  80. package/dist/Signup-2pqvJiVt.js.map +1 -0
  81. package/dist/Signup-XdImA1os.js +9 -0
  82. package/dist/{SignupConsentFlow-QUZGKjdB.js → SignupConsentFlow-X3kXuviv.js} +106 -70
  83. package/dist/SignupConsentFlow-X3kXuviv.js.map +1 -0
  84. package/dist/{SignupRequirementsPage-DfbYmpQD.js → SignupRequirementsPage-Cf-ElkEq.js} +9 -8
  85. package/dist/{SignupRequirementsPage-DfbYmpQD.js.map → SignupRequirementsPage-Cf-ElkEq.js.map} +1 -1
  86. package/dist/StaffCreateSupportTicketForm-BlUP2XXy.js +14 -0
  87. package/dist/StaffCreateSupportTicketForm-D2nn4rTU.js +255 -0
  88. package/dist/StaffCreateSupportTicketForm-D2nn4rTU.js.map +1 -0
  89. package/dist/{StaffSupportTicketDetailPage-DQdfh6H1.js → StaffSupportTicketDetailPage-MFtm06BE.js} +14 -11
  90. package/dist/{StaffSupportTicketDetailPage-DQdfh6H1.js.map → StaffSupportTicketDetailPage-MFtm06BE.js.map} +1 -1
  91. package/dist/StaffSupportTicketList-LfLx0pYP.js +63 -0
  92. package/dist/StaffSupportTicketParent-B7mEN1oD.js +8 -0
  93. package/dist/{StaffSupportTicketParent-CilR4RGM.js → StaffSupportTicketParent-BvPwgOqH.js} +4 -4
  94. package/dist/{StaffSupportTicketParent-CilR4RGM.js.map → StaffSupportTicketParent-BvPwgOqH.js.map} +1 -1
  95. package/dist/StaffSupportTicketSuccess-BMCOP3ko.js +12 -0
  96. package/dist/StaffSupportTicketSuccess-Ca2WrcRg.js +54 -0
  97. package/dist/StaffSupportTicketSuccess-Ca2WrcRg.js.map +1 -0
  98. package/dist/{SupportStaffPage-KKugAnFm.js → SupportStaffPage-B69-kuvg.js} +8 -7
  99. package/dist/{SupportStaffPage-KKugAnFm.js.map → SupportStaffPage-B69-kuvg.js.map} +1 -1
  100. package/dist/{SupportTicketDevLifecycleBadge-EMrQHfyG.js → SupportTicketDevLifecycleBadge-BoAjMb08.js} +1 -1
  101. package/dist/{SupportTicketDevLifecycleBadge-EMrQHfyG.js.map → SupportTicketDevLifecycleBadge-BoAjMb08.js.map} +1 -1
  102. package/dist/{SupportTicketMaintenancePage-smItdkrD.js → SupportTicketMaintenancePage-Bptja-xb.js} +5 -4
  103. package/dist/{SupportTicketMaintenancePage-smItdkrD.js.map → SupportTicketMaintenancePage-Bptja-xb.js.map} +1 -1
  104. package/dist/TeamAttachmentsTab-Dk3LxX3n.js +63 -0
  105. package/dist/TeamHistoryTab-CRONdHcL.js +6 -0
  106. package/dist/{TeamHistoryTab-D5biUPmq.js → TeamHistoryTab-DM8KBEG1.js} +7 -19
  107. package/dist/TeamHistoryTab-DM8KBEG1.js.map +1 -0
  108. package/dist/TeamList-DYm_vQ2z.js +8 -0
  109. package/dist/TeamList-qdwlMuJv.js +141 -0
  110. package/dist/TeamList-qdwlMuJv.js.map +1 -0
  111. package/dist/TeamMemberList-4LRLT_7Z.js +7 -0
  112. package/dist/TeamMemberList-DyI1U1t_.js +166 -0
  113. package/dist/TeamMemberList-DyI1U1t_.js.map +1 -0
  114. package/dist/TeamMemberParent-B63pRfI6.js +10 -0
  115. package/dist/TeamMemberParent-D9Fxu7GD.js +83 -0
  116. package/dist/TeamMemberParent-D9Fxu7GD.js.map +1 -0
  117. package/dist/TeamMembersTab-BGcdyEE8.js +3 -0
  118. package/dist/{TeamMembersTab-4gmnP9sD.js → TeamMembersTab-BigqpBDH.js} +1 -1
  119. package/dist/{TeamMembersTab-4gmnP9sD.js.map → TeamMembersTab-BigqpBDH.js.map} +1 -1
  120. package/dist/{TeamNotesTab-BzGZZ1h8.js → TeamNotesTab-BgxleidZ.js} +6 -5
  121. package/dist/{TeamNotesTab-BzGZZ1h8.js.map → TeamNotesTab-BgxleidZ.js.map} +1 -1
  122. package/dist/TeamNotesTab-o7glfjoY.js +8 -0
  123. package/dist/TeamParent-BwXqA3rj.js +83 -0
  124. package/dist/TeamParent-BwXqA3rj.js.map +1 -0
  125. package/dist/TeamParent-CFOmyKPz.js +11 -0
  126. package/dist/{TimelineNoteInput-0p-M4Qie.js → TimelineNoteInput-DXaodm43.js} +3 -2
  127. package/dist/{TimelineNoteInput-0p-M4Qie.js.map → TimelineNoteInput-DXaodm43.js.map} +1 -1
  128. package/dist/TimelineSystemEvent-zCMUx5Zz.js +525 -0
  129. package/dist/TimelineSystemEvent-zCMUx5Zz.js.map +1 -0
  130. package/dist/UserListPage-Bmwg0an5.js +5 -0
  131. package/dist/{UserListPage-DUE5gJTo.js → UserListPage-DtA8tLff.js} +4 -3
  132. package/dist/{UserListPage-DUE5gJTo.js.map → UserListPage-DtA8tLff.js.map} +1 -1
  133. package/dist/UserProfilePage-DRbCAr9H.js +8 -0
  134. package/dist/{UserProfilePage-C3b93Keh.js → UserProfilePage-g4-VEDXo.js} +4 -4
  135. package/dist/{UserProfilePage-C3b93Keh.js.map → UserProfilePage-g4-VEDXo.js.map} +1 -1
  136. package/dist/{VerifyEmail-DlOmWGG-.js → VerifyEmail-CM5ehFB8.js} +7 -7
  137. package/dist/{VerifyEmail-DlOmWGG-.js.map → VerifyEmail-CM5ehFB8.js.map} +1 -1
  138. package/dist/VerifyEmail-DMHczC9f.js +10 -0
  139. package/dist/ViewTeam-CXyABxE6.js +8 -0
  140. package/dist/ViewTeam-DSbKV60o.js +220 -0
  141. package/dist/ViewTeam-DSbKV60o.js.map +1 -0
  142. package/dist/ViewTeamMember-BB0nvPOe.js +167 -0
  143. package/dist/ViewTeamMember-BB0nvPOe.js.map +1 -0
  144. package/dist/ViewTeamMember-jrOnBaDh.js +7 -0
  145. package/dist/ZiniaContainer-CjVhCnGB.js +18 -0
  146. package/dist/ZiniaContainer-CjVhCnGB.js.map +1 -0
  147. package/dist/{convertToLocalDateTime-CFhtN6PI.js → convertToLocalDateTime-BF25N4xd.js} +1 -2
  148. package/dist/convertToLocalDateTime-BF25N4xd.js.map +1 -0
  149. package/dist/customerSupportTicketRoutes-C7OxGAGl.js +142 -0
  150. package/dist/customerSupportTicketRoutes-C7OxGAGl.js.map +1 -0
  151. package/dist/{displayIdFormatter-Dz900Awr.js → displayIdFormatter-B-_WQHOr.js} +1 -1
  152. package/dist/{displayIdFormatter-Dz900Awr.js.map → displayIdFormatter-B-_WQHOr.js.map} +1 -1
  153. package/dist/{extractRpcErrorMessage-Di8E8-Wh.js → extractRpcErrorMessage-diUBl6Ij.js} +1 -1
  154. package/dist/{extractRpcErrorMessage-Di8E8-Wh.js.map → extractRpcErrorMessage-diUBl6Ij.js.map} +1 -1
  155. package/dist/index.d.ts +793 -834
  156. package/dist/index.js +66 -38
  157. package/dist/{mfaSchema-BnRWf0ma.js → mfaSchema-Ukqzdyck.js} +1 -1
  158. package/dist/{mfaSchema-BnRWf0ma.js.map → mfaSchema-Ukqzdyck.js.map} +1 -1
  159. package/dist/saved_filter-CfzH0BzK.js +1210 -0
  160. package/dist/saved_filter-CfzH0BzK.js.map +1 -0
  161. package/dist/signupConsentStorage-DS9vCUuC.js +27 -0
  162. package/dist/signupConsentStorage-DS9vCUuC.js.map +1 -0
  163. package/dist/{src-CEBiyg_f.css → src-C6ZmNSSU.css} +1 -1
  164. package/dist/{src-CEBiyg_f.css.map → src-C6ZmNSSU.css.map} +1 -1
  165. package/dist/src-DVe_0RO9.js +4654 -0
  166. package/dist/src-DVe_0RO9.js.map +1 -0
  167. package/dist/staffSupportTicketRoutes-CWutoQWp.js +135 -0
  168. package/dist/staffSupportTicketRoutes-CWutoQWp.js.map +1 -0
  169. package/dist/teamMemberMetadata-CQnbVepq.js +49 -0
  170. package/dist/teamMemberMetadata-CQnbVepq.js.map +1 -0
  171. package/dist/teamMetadata-DlvwO5V0.js +53 -0
  172. package/dist/teamMetadata-DlvwO5V0.js.map +1 -0
  173. package/dist/teamRoutes-KFgnsdDP.js +192 -0
  174. package/dist/teamRoutes-KFgnsdDP.js.map +1 -0
  175. package/dist/team_memberRoutes-Cjpw_ql6.js +84 -0
  176. package/dist/team_memberRoutes-Cjpw_ql6.js.map +1 -0
  177. package/dist/{useBreadcrumbs-qB6ghsAf.js → useBreadcrumbs-DIqU5AAp.js} +1 -1
  178. package/dist/{useBreadcrumbs-qB6ghsAf.js.map → useBreadcrumbs-DIqU5AAp.js.map} +1 -1
  179. package/dist/{useEmailVerificationChannel-BNi926Ho.js → useEmailVerificationChannel-B51z65PN.js} +3 -3
  180. package/dist/{useEmailVerificationChannel-BNi926Ho.js.map → useEmailVerificationChannel-B51z65PN.js.map} +1 -1
  181. package/dist/{useMutation-BTsyHKyn.js → useMutation-BLNuJoYl.js} +6 -3
  182. package/dist/useMutation-BLNuJoYl.js.map +1 -0
  183. package/dist/{useQuery-BggIE52P.js → useQuery-BzUGEOj0.js} +4 -3
  184. package/dist/{useQuery-BggIE52P.js.map → useQuery-BzUGEOj0.js.map} +1 -1
  185. package/dist/{useQueryCache-Bjm-S8v5.js → useQueryCache-alzaRWEb.js} +2 -2
  186. package/dist/{useQueryCache-Bjm-S8v5.js.map → useQueryCache-alzaRWEb.js.map} +1 -1
  187. package/dist/{useReturnUrl-qFeazn-G.js → useReturnUrl-B5V3SJf5.js} +1 -1
  188. package/dist/{useReturnUrl-qFeazn-G.js.map → useReturnUrl-B5V3SJf5.js.map} +1 -1
  189. package/dist/{useRpcAuth-rmHf7bYx.js → useRpcAuth-CJtq1dqM.js} +25 -194
  190. package/dist/useRpcAuth-CJtq1dqM.js.map +1 -0
  191. package/dist/userAuthorized-C09FHWGL.js +185 -0
  192. package/dist/userAuthorized-C09FHWGL.js.map +1 -0
  193. package/package.json +3 -3
  194. package/dist/Appearance-D5pwxuf4.js +0 -3
  195. package/dist/ChangePasswordPage-CpDPmEml.js +0 -6
  196. package/dist/ConsentRequired-C4IRMA0c.js +0 -213
  197. package/dist/ConsentRequired-C4IRMA0c.js.map +0 -1
  198. package/dist/CreateTeamForm-B4cIuYAf.js +0 -35
  199. package/dist/CreateTeamMemberForm-Chrw1y00.js +0 -35
  200. package/dist/CreateUserPage-WruMs7WP.js +0 -6
  201. package/dist/CreditBalanceDashboard-CkcsrZ_e.js +0 -35
  202. package/dist/CreditManagement-Ddvu9dMw.js +0 -35
  203. package/dist/CustomerCreateSupportTicketForm-BKperKGS.js +0 -35
  204. package/dist/CustomerSupportTicketList-DcbrjDa9.js +0 -35
  205. package/dist/CustomerSupportTicketParent-BeNzUwuP.js +0 -7
  206. package/dist/CustomerSupportTicketSuccess-CC967u3y.js +0 -35
  207. package/dist/EditTeamForm-B5Tee5wL.js +0 -35
  208. package/dist/EditTeamMemberForm-CaS2GLjV.js.map +0 -1
  209. package/dist/EditTeamMemberForm-OtcS8QWt.js +0 -6
  210. package/dist/EditUserPage-T4DQlKhf.js +0 -7
  211. package/dist/ForgotPassword-CUifhmqP.js +0 -7
  212. package/dist/LoginForm-Bg7GoZEA.js +0 -7
  213. package/dist/Logout-Bs92csWH.js +0 -7
  214. package/dist/MfaSetup-BACX5XP-.js +0 -8
  215. package/dist/MfaVerify-ak4iSdQ2.js +0 -8
  216. package/dist/ResetPassword-pY1uhTdl.js +0 -7
  217. package/dist/Signup-9TjMMnU4.js.map +0 -1
  218. package/dist/Signup-Bq-G3D-s.js +0 -9
  219. package/dist/SignupConsentFlow-QUZGKjdB.js.map +0 -1
  220. package/dist/StaffCreateSupportTicketForm-D0ZuisDk.js +0 -35
  221. package/dist/StaffSupportTicketList-CiqC05XB.js +0 -35
  222. package/dist/StaffSupportTicketParent-DkV329NI.js +0 -7
  223. package/dist/StaffSupportTicketSuccess-CUYnimaI.js +0 -35
  224. package/dist/TeamAttachmentsTab-DUtCD1Yi.js +0 -35
  225. package/dist/TeamHistoryTab-BsUoH4VK.js +0 -4
  226. package/dist/TeamHistoryTab-D5biUPmq.js.map +0 -1
  227. package/dist/TeamList-BkPIqZ8V.js +0 -35
  228. package/dist/TeamMemberList-1mxUGCNa.js +0 -35
  229. package/dist/TeamMemberParent-DzeBIElY.js +0 -35
  230. package/dist/TeamMembersTab-CBB2Yl_I.js +0 -3
  231. package/dist/TeamNotesTab-ClHl2nXd.js +0 -7
  232. package/dist/TeamParent-DJa9UZTP.js +0 -35
  233. package/dist/TimelineSystemEvent-BHzFr46C.js.map +0 -1
  234. package/dist/UserListPage-BTLE4J0s.js +0 -4
  235. package/dist/UserProfilePage-CVTORtSx.js +0 -7
  236. package/dist/VerifyEmail-DCP4DWIw.js +0 -9
  237. package/dist/ViewTeam-DVfnLMhV.js +0 -35
  238. package/dist/ViewTeamMember-L4v3gCIn.js +0 -35
  239. package/dist/convertToLocalDateTime-CFhtN6PI.js.map +0 -1
  240. package/dist/src-QZJyMfGX.js +0 -8951
  241. package/dist/src-QZJyMfGX.js.map +0 -1
  242. package/dist/useMutation-BTsyHKyn.js.map +0 -1
  243. package/dist/useRpcAuth-rmHf7bYx.js.map +0 -1
  244. package/dist/useSignupPendingData-BWHwUHhL.js +0 -47
  245. package/dist/useSignupPendingData-BWHwUHhL.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"src-QZJyMfGX.js","names":["$emit","$slots","merged: Breadcrumb[]","breadcrumbs: Breadcrumb[]","$slots","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>","DEFAULT_OPERATORS: Record<string, string>","config: FilterConfiguration","operator: string","params: Record<string, string>","filters: FilterQueryParams","base: Record<string, string | string[]>","userAlreadyLoggedIn: NavigationGuard","userRoutes: Array<ExtendedRouteRecordRaw>","teamMemberRoutes: Array<ExtendedRouteRecordRaw>","teamRoutes: Array<ExtendedRouteRecordRaw>","variables: TeamFiltersDto","variables: any","LAST_USED_PREFIX","getLastUsedKey","savedFilterRoutes: Array<ExtendedRouteRecordRaw>","customerSupportTicketRoutes: Array<ExtendedRouteRecordRaw>","staffSupportTicketRoutes: Array<ExtendedRouteRecordRaw>","statusConfig: Record<SupportTicketStatus, StatusBadgeConfig>","variables: any","variables: any","sectionTitle: string","limitationMessage: string","submitText: string","submittingText: string","skipVerifyEmailIfAlreadyVerified: NavigationGuard","signupConsentsGuard: NavigationGuard","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/ui/LogoPlaceholder.vue","../src/components/Navbar.vue","../src/components/NotFound.vue","../src/components/RightSidebar.vue","../src/composables/useBuildTag.ts","../src/constants/time.ts","../src/slices/saved_filter/usePinnedPresets.ts","../src/components/Sidebar.vue","../src/composables/useEmailVerificationGuard.ts","../src/components/UnverifiedEmailBanner.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/SummarySection.vue","../src/composables/useUserLookup.ts","../src/utils/filterUrlParser.ts","../src/utils/timezones.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/saved_filter/lastUsedPresetGuard.ts","../src/slices/saved_filter/useSavedFilters.ts","../src/slices/saved_filter/savedFilterRoutes.ts","../src/slices/saved_filter/SaveFilterModal.vue","../src/slices/saved_filter/ManagePresetsModal.vue","../src/slices/saved_filter/PresetsModal.vue","../src/slices/saved_filter/SavedFilterPresets.vue","../src/slices/support_ticket/customer/customerSupportTicketRoutes.ts","../src/slices/support_ticket/staff/staffSupportTicketRoutes.ts","../src/slices/support_ticket/customer/components/SupportTicketTimeline.vue","../src/slices/support_ticket/customer/customerSupportTicketMetadata.ts","../src/slices/support_ticket/customer/CustomerCreateSupportTicketForm.vue","../src/slices/support_ticket/shared/SupportTicketStatusBadge.vue","../src/slices/support_ticket/customer/customerSupportTicketRowSchema.ts","../src/slices/support_ticket/customer/CustomerSupportTicketList.vue","../src/slices/support_ticket/customer/CustomerSupportTicketSuccess.vue","../src/slices/support_ticket/staff/components/CustomerCreditBalance.vue","../src/slices/support_ticket/staff/components/ApproveRejectActions.vue","../src/slices/support_ticket/staff/components/CancelInternalTaskWorkflow.vue","../src/slices/support_ticket/staff/components/CompleteSupportTicketForm.vue","../src/slices/support_ticket/staff/components/ConvertToCustomerWorkflow.vue","../src/slices/support_ticket/staff/components/ConvertToInternalWorkflow.vue","../src/slices/support_ticket/staff/components/ReactivateInternalTaskWorkflow.vue","../src/slices/support_ticket/staff/StaffSupportTicketMetadata.ts","../src/slices/support_ticket/staff/StaffCreateSupportTicketForm.vue","../src/slices/support_ticket/staff/StaffSupportTicketRowSchema.ts","../src/slices/support_ticket/staff/StaffSupportTicketList.vue","../src/slices/support_ticket/staff/StaffSupportTicketSuccess.vue","../src/slices/support_ticket/shared/CreditBalanceWidget.vue","../src/slices/support_ticket/shared/SupportTicketAttachments.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/middleware/skipVerifyEmailIfAlreadyVerified.ts","../src/slices/auth/signupConsentsGuard.ts","../src/slices/auth/authRoutes.ts","../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 max-w-md 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 <div\n :class=\"[\n 'flex items-center justify-center rounded-lg bg-base-300 text-base-content/50',\n size === 'xs' ? 'h-10 w-10 md:h-12 md:w-12 text-xs' : size === 'sm' ? 'h-12 w-24 text-xs' : 'h-24 w-32 text-sm',\n ]\"\n >\n <span class=\"font-medium\">Logo</span>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** Size variant: 'xs' for navbar, 'sm' for sidebar, 'md' for auth layout */\n size?: 'xs' | 'sm' | 'md';\n }>(),\n { size: 'md' },\n);\n</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 <LogoPlaceholder v-if=\"!logoSrc || imageLoadFailed\" size=\"xs\" />\n <img\n v-else\n :src=\"logoSrc\"\n alt=\"logo\"\n class=\"h-10 w-10 md:h-12 md:w-12\"\n @error=\"imageLoadFailed = true\"\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';\nimport LogoPlaceholder from './ui/LogoPlaceholder.vue';\n\ninterface Props {\n breadcrumbs?: Breadcrumb[];\n /** Logo image URL. Placeholder shown when not provided or when image fails to load. */\n logoSrc?: string;\n}\n\ndefineProps<Props>();\n\nconst imageLoadFailed = ref(false);\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\">\n <AppLink :to=\"logoutLink\">Logout</AppLink>\n </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 { withReturnUrl } from '../utils/useReturnUrl';\nimport { computed, ref } from 'vue';\n\nconst userSession = useUserSessionStore();\n\n/**\n * Where to redirect after logout. Default '/' (homepage) so user can browse anonymously.\n * Apps can pass a different path via the logoutReturnUrl prop if needed.\n */\nconst props = withDefaults(\n defineProps<{ logoutReturnUrl?: string }>(),\n { logoutReturnUrl: '/' },\n);\n\nconst logoutLink = computed(() =>\n withReturnUrl('/auth/logout', props.logoutReturnUrl),\n);\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","/**\n * Time duration constants in milliseconds.\n * Use for staleTime, cache TTL, etc.\n *\n * @example\n * staleTime: 30 * MS.ONE_SECOND\n * staleTime: 5 * MS.ONE_MINUTE\n * staleTime: 24 * MS.ONE_HOUR\n */\nexport const MS = {\n ONE_SECOND: 1000,\n ONE_MINUTE: 60 * 1000,\n ONE_HOUR: 60 * 60 * 1000,\n} as const;\n","/**\n * Composable for pinning presets to favorites (home page + sidebar).\n * Uses API with 24h cache. Max 5 pinned presets.\n *\n * Call usePinnedPresets() once in the layout (InAppLayout) and provide it.\n * Children use useInjectedPinnedPresets() to avoid duplicate fetches.\n */\n\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport type { InjectionKey } from 'vue';\nimport { inject } from 'vue';\nimport { MS } from '../../constants/time';\nimport { useMutation } from '../../composables/useMutation';\nimport { useQuery } from '../../composables/useQuery';\nimport { computed } from 'vue';\n\nconst CACHE_KEY = 'pinned-presets';\nconst MAX_PINNED = 5;\n\nexport type PinnedPreset = Pick<\n SavedFilterReadDto,\n 'id' | 'name' | 'context' | 'route_path' | 'filters'\n>;\n\nexport function usePinnedPresets() {\n const { data: pinnedData, refetch } = useQuery(\n (api) => api.savedFilters.listPinnedPresets(),\n { cacheKey: CACHE_KEY, staleTime: 24 * MS.ONE_HOUR },\n );\n\n const { mutate: addPin } = useMutation(\n (api, id: string) => api.savedFilters.addPinnedPreset(id),\n { invalidate: CACHE_KEY },\n );\n\n const { mutate: removePin } = useMutation(\n (api, id: string) => api.savedFilters.removePinnedPreset(id),\n { invalidate: CACHE_KEY },\n );\n\n const pinned = computed(() => pinnedData.value ?? []);\n const pinnedIds = computed(() => new Set(pinned.value.map((p) => p.id)));\n const canPinMore = computed(() => pinned.value.length < MAX_PINNED);\n\n function isPinned(presetId: string): boolean {\n return pinnedIds.value.has(presetId);\n }\n\n async function pinPreset(preset: SavedFilterReadDto): Promise<boolean> {\n if (pinned.value.length >= MAX_PINNED) return false;\n if (pinnedIds.value.has(preset.id)) return true;\n try {\n await addPin(preset.id);\n await refetch();\n return true;\n } catch {\n return false;\n }\n }\n\n async function unpinPreset(presetId: string): Promise<void> {\n try {\n await removePin(presetId);\n await refetch();\n } catch {\n // Error handled by mutation\n }\n }\n\n async function togglePin(preset: SavedFilterReadDto): Promise<boolean> {\n if (isPinned(preset.id)) {\n await unpinPreset(preset.id);\n return false;\n }\n return pinPreset(preset);\n }\n\n function getPresetLink(preset: PinnedPreset): {\n path: string;\n query: Record<string, string | string[]>;\n } {\n return {\n path: preset.route_path,\n query: preset.filters ?? {},\n };\n }\n\n function updatePinnedPreset(\n presetId: string,\n updates: Partial<PinnedPreset>,\n ): void {\n // API is source of truth. Call refetchPinned when a preset is renamed\n // to refresh the pinned list with updated names.\n void presetId;\n void updates;\n }\n\n return {\n pinned,\n pinnedIds,\n canPinMore,\n isPinned,\n pinPreset,\n unpinPreset,\n togglePin,\n getPresetLink,\n updatePinnedPreset,\n refetchPinned: refetch,\n maxPinned: MAX_PINNED,\n };\n}\n\nexport const PINNED_PRESETS_KEY = Symbol('pinnedPresets') as InjectionKey<\n ReturnType<typeof usePinnedPresets>\n>;\n\n/** Use pinned presets from the layout provider. Call this in child components (Sidebar, AppHome, etc.). */\nexport function useInjectedPinnedPresets() {\n const injected = inject(PINNED_PRESETS_KEY);\n if (!injected) {\n throw new Error(\n 'useInjectedPinnedPresets must be used within a component tree that provides pinned presets (e.g. InAppLayout).',\n );\n }\n return injected;\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 <slot name=\"logo\">\n <LogoPlaceholder v-if=\"!logoSrc || imageLoadFailed\" size=\"sm\" />\n <img\n v-else\n :src=\"logoSrc\"\n alt=\"logo\"\n class=\"h-12\"\n @error=\"imageLoadFailed = true\"\n />\n </slot>\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 <!-- Favorites section (pinned presets) at top -->\n <li v-if=\"pinnedPresets.pinned.value.length > 0\" class=\"w-full\">\n <div class=\"menu-title\">\n <span>FAVORITES</span>\n </div>\n <template v-for=\"preset in pinnedPresets.pinned.value\" :key=\"preset.id\">\n <router-link\n :to=\"pinnedPresets.getPresetLink(preset)\"\n class=\"whitespace-nowrap block w-full pl-6\"\n @click=\"closeDrawer\"\n >\n {{ preset.name }}\n </router-link>\n </template>\n </li>\n <li v-for=\"(routes, section) in sidebarSections\" :key=\"section\" class=\"w-full\">\n <div class=\"menu-title\">\n <span>{{ capitalizeSection(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 pl-6\"\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\">\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';\nimport { useInjectedPinnedPresets } from '../slices/saved_filter/usePinnedPresets';\nimport LogoPlaceholder from './ui/LogoPlaceholder.vue';\n\ndefineProps<{\n /** Logo image URL. Placeholder shown when not provided or when image fails to load. */\n logoSrc?: string;\n}>();\n\nconst user = useUserSessionStore();\nconst pinnedPresets = useInjectedPinnedPresets();\nconst router = useRouter();\nconst tag = useBuildTag();\nconst close_button = ref<HTMLLabelElement | null>(null);\nconst imageLoadFailed = ref(false);\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 capitalizeSection(section: string): string {\n return section.trim().toUpperCase();\n}\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","import { computed } from 'vue';\nimport type { UseEmailVerificationGuardReturn } from './types';\nimport { useEnv } from './useEnv';\nimport { useUserSessionStore } from './useUserSessionStore';\n\n/**\n * Composable for email verification checks in soft/strict mode.\n * Use to restrict features or show UI based on verification status.\n */\nexport function useEmailVerificationGuard(): UseEmailVerificationGuardReturn {\n const { emailVerificationMode } = useEnv();\n const session = useUserSessionStore();\n\n const requiresVerification = computed(\n () => emailVerificationMode === 'soft' || emailVerificationMode === 'strict',\n );\n\n const isVerified = computed(() => session.userSession?.user.email_verified ?? true);\n\n const showVerificationPrompt = computed(\n () => requiresVerification.value && !isVerified.value && !!session.userSession,\n );\n\n return {\n requiresVerification,\n isVerified,\n showVerificationPrompt,\n emailVerificationMode,\n };\n}\n","<template>\n <div\n v-if=\"showVerificationPrompt\"\n class=\"bg-warning border border-warning text-warning-content px-4 py-2 flex items-center justify-between gap-4\"\n >\n <p class=\"text-sm\">\n Please verify your email. Check your inbox or\n <button\n type=\"button\"\n class=\"link link-hover font-medium underline\"\n :disabled=\"resendLoading\"\n @click=\"resendVerification\"\n >\n {{ resendLoading ? 'Sending...' : 'resend verification email' }}\n </button>.\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport type { EmailVerificationApi } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../composables/useMutation';\nimport { useEmailVerificationGuard } from '../composables/useEmailVerificationGuard';\nimport { useUserSessionStore } from '../composables/useUserSessionStore';\n\nconst { showVerificationPrompt } = useEmailVerificationGuard();\nconst session = useUserSessionStore();\nconst resendLoading = ref(false);\n\nconst { mutate: resendMutate } = useMutation(\n (api, _input?: unknown) => {\n const verifyEmail = (api as DragoncoreApi).verifyEmail;\n if (!verifyEmail) throw new Error('Email verification is not configured');\n return (verifyEmail as EmailVerificationApi).resendVerificationEmail();\n },\n { skipAuthCheck: false },\n);\n\nconst resendVerification = async () => {\n try {\n resendLoading.value = true;\n const result = await resendMutate(undefined);\n if (result?.ok) {\n toast.success('Verification email sent. Please check your inbox.');\n await session.refreshToken();\n } else {\n toast.error('Failed to resend verification email.');\n }\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Failed to resend');\n } finally {\n resendLoading.value = false;\n }\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 :logoSrc=\"navbarLogoSrc\" />\n\n <div class=\"pr-1 pl-1 md:pr-4 md:pl-4\">\n <RouterView />\n </div>\n </div>\n <Sidebar :logoSrc=\"logoSrc\">\n <template v-if=\"$slots.sidebarLogo\" #logo>\n <slot name=\"sidebarLogo\" />\n </template>\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\ndefineProps<{\n /** Logo image URL for the sidebar. Placeholder shown when not provided. */\n logoSrc?: string;\n /** Logo image URL for the navbar. Placeholder shown when not provided. */\n navbarLogoSrc?: string;\n}>();\n</script>\n","<template>\n <div class=\"m-2 sm:m-4\">\n <div v-if=\"hasBackLinks\" class=\"flex justify-center mb-2\">\n <nav class=\"flex flex-wrap gap-4 text-sm\">\n <AppLink v-for=\"(link, i) in backLinks\" :key=\"i\" :to=\"link.to\" class=\"link link-hover\">\n {{ link.label ?? 'Back to site' }}\n </AppLink>\n </nav>\n </div>\n <div class=\"flex justify-center mb-6\">\n <slot name=\"logo\">\n <LogoPlaceholder v-if=\"!logoSrc || imageLoadFailed\" size=\"md\" />\n <img v-else :src=\"logoSrc\" alt=\"logo\" class=\"h-24\" @error=\"imageLoadFailed = true\" />\n </slot>\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 type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, provide, ref } from 'vue';\nimport { useRoute, RouterView } from 'vue-router';\nimport AppLink from '../components/AppLink.vue';\nimport LogoPlaceholder from '../components/ui/LogoPlaceholder.vue';\nimport { SIGNUP_REQUIREMENTS_KEY } from '../slices/auth/signupRequirements';\nimport { getBackLinkFromRoute } from '../utils/useReturnUrl';\n\nconst props = defineProps<{\n /** Logo image URL. Placeholder shown when not provided or when image fails to load. */\n logoSrc?: string;\n /**\n * Links to show above the logo so users can navigate back to other parts of the site.\n * Pass a single link or array of links. Each link: { to: string; label?: string }.\n * Can also use ?backLink=/&backLinkLabel=... in the URL instead of or in addition to this.\n */\n backLinks?: { to: string; label?: string } | Array<{ to: string; label?: string }>;\n /** Signup consent requirements. When provided, injected for Signup and SignupConsentFlow. */\n signupRequirements?: SignupRequirementsDto;\n}>();\n\nif (props.signupRequirements !== undefined) {\n provide(SIGNUP_REQUIREMENTS_KEY, props.signupRequirements);\n}\n\nconst route = useRoute();\nconst imageLoadFailed = ref(false);\n\nconst backLinks = computed(() => {\n const fromQuery = getBackLinkFromRoute(route);\n if (fromQuery) return [fromQuery];\n const fromProps = props.backLinks;\n return !fromProps ? [] : Array.isArray(fromProps) ? fromProps : [fromProps];\n});\n\nconst hasBackLinks = computed(() => backLinks.value.length > 0);\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\n class=\"sticky top-0 z-30\"\n :breadcrumbs=\"currentBreadcrumbs\"\n :logoSrc=\"navbarLogoSrc\"\n />\n\n <UnverifiedEmailBanner />\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 :logoSrc=\"logoSrc\">\n <template v-if=\"$slots.sidebarLogo\" #logo>\n <slot name=\"sidebarLogo\" />\n </template>\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 UnverifiedEmailBanner from '../components/UnverifiedEmailBanner.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 { PINNED_PRESETS_KEY, usePinnedPresets } from '../slices/saved_filter/usePinnedPresets';\nimport { computed, provide, ref } from 'vue';\nimport { RouterView, useRoute } from 'vue-router';\n\ndefineProps<{\n /** Logo image URL for the sidebar. Placeholder shown when not provided. */\n logoSrc?: string;\n /** Logo image URL for the navbar. Placeholder shown when not provided. */\n navbarLogoSrc?: string;\n}>();\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// Single source for pinned presets - provided to Sidebar, AppHome, SavedFilterPresets\nprovide(PINNED_PRESETS_KEY, usePinnedPresets());\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 <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","import { computed } from 'vue';\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport type { QueryFunction, UseQueryOptions } from './types';\nimport { useQuery } from './useQuery';\n\n/**\n * Team member item with user identification fields\n */\nexport interface TeamMemberItem {\n user_id: string | null;\n display_name?: string | null;\n email_address?: string | null;\n}\n\n/**\n * Response type for user team members query\n */\nexport interface UserTeamMembersResponse {\n items: TeamMemberItem[];\n}\n\n/**\n * Generic composable for looking up user information by user ID\n * Fetches team members from the user's teams and caches them\n * Provides a map of user_id -> display_name for easy lookups\n *\n * @deprecated Prefer API-side display name enrichment (*_display_name fields) instead.\n * @param queryFn - Function that queries team members from the API\n * @param options - Optional query options (cacheKey defaults to 'user-team-members')\n */\nexport function useUserLookup<TApi extends Record<string, any> = DragoncoreApi>(\n queryFn: QueryFunction<TApi, UserTeamMembersResponse>,\n options?: Omit<UseQueryOptions, 'cacheKey'> & { cacheKey?: string },\n) {\n // Fetch user team members for lookups\n const { data: userTeamMembers, loading: isUserTeamMembersLoading } = useQuery<\n TApi,\n UserTeamMembersResponse\n >(queryFn, {\n cacheKey: options?.cacheKey ?? 'user-team-members',\n staleTime: options?.staleTime ?? 24 * 60 * 60 * 1000, // 24 hours\n ...options,\n });\n\n // Create a user lookup map: user_id -> display_name (or email_address as fallback)\n const userMap = computed(() => {\n const map = new Map<string, string>();\n userTeamMembers.value?.items?.forEach((member: TeamMemberItem) => {\n if (member.user_id) {\n // Use display_name if available, otherwise fall back to email_address\n const displayName = member.display_name || member.email_address;\n if (displayName) {\n map.set(member.user_id, displayName);\n }\n }\n });\n return map;\n });\n\n /**\n * Get the display name for a user ID\n * @param userId - The user ID to look up\n * @returns The display name if found, or null if not found\n */\n const getUserName = (userId: string | null | undefined): string | null => {\n if (!userId) return null;\n return userMap.value.get(userId) || null;\n };\n\n /**\n * Get the display name for a user ID, with a fallback\n * @param userId - The user ID to look up\n * @param fallback - The fallback text to use if not found (default: the userId itself)\n * @returns The display name if found, or the fallback (or userId) if not found\n */\n const getUserNameWithFallback = (\n userId: string | null | undefined,\n fallback?: string,\n ): string => {\n if (!userId) return fallback || '';\n const displayName = userMap.value.get(userId);\n if (displayName) return displayName;\n // If not found, return the fallback if provided, otherwise return the userId\n return fallback !== undefined ? fallback : userId;\n };\n\n return {\n userTeamMembers,\n isUserTeamMembersLoading,\n userMap,\n getUserName,\n getUserNameWithFallback,\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 (\n operator === OPERATORS.IS_ONE_OF ||\n operator === OPERATORS.IS_NOT_ONE_OF ||\n operator === OPERATORS.BETWEEN\n );\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 (\n (operator === OPERATORS.IS_ONE_OF || operator === OPERATORS.IS_NOT_ONE_OF) &&\n stringValue\n ) {\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\n/** Raw filter params format used by useSavedFilters (flt[key]=value) */\nexport type FilterQueryParams = Record<string, string | string[]>;\n\n/**\n * Extract filter query params from route query.\n * Handles Vue Router's LocationQuery type which can have null values.\n * Only extracts flt[...] params (actual filters).\n *\n * @example\n * // URL: ?flt[type][in]=[\"sales\",\"escalation\"]&flt[phase][ne]=Post+Sale\n * // Returns: { 'flt[type][in]': '[\"sales\",\"escalation\"]', 'flt[phase][ne]': 'Post+Sale' }\n */\nexport function extractFiltersFromQuery(query: Record<string, unknown>): FilterQueryParams {\n const filters: FilterQueryParams = {};\n\n Object.keys(query).forEach((key) => {\n if (key.startsWith('flt[')) {\n const value = query[key];\n if (value !== null && value !== undefined) {\n if (Array.isArray(value)) {\n const filtered = value.filter((v): v is string => v !== null && v !== undefined);\n if (filtered.length > 0) {\n filters[key] = filtered;\n }\n } else {\n filters[key] = String(value);\n }\n }\n }\n });\n\n return filters;\n}\n\n/**\n * Build a new query object with filter params replaced (not merged).\n * Strips all flt[...] params from the current query, then adds the new filters.\n * Preserves non-filter params (sort, pagination, etc).\n */\nexport function buildQueryWithFilters(\n currentQuery: Record<string, unknown>,\n filters: FilterQueryParams,\n): Record<string, string | string[]> {\n const base: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(currentQuery)) {\n if (!key.startsWith('flt[') && value !== null && value !== undefined) {\n base[key] = Array.isArray(value)\n ? (value.filter((v): v is string => v != null) as string[])\n : String(value);\n }\n }\n return { ...base, ...filters };\n}\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","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, useEnv, 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 const env = useEnv();\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 consent status (when requireConsentForExistingUsers)\n if (to.path !== '/auth/consent-required' && env.requireConsentForExistingUsers) {\n const consentsComplete = userSession.currentSession?.user?.consents_complete;\n if (consentsComplete === false) {\n logger.debug('[UserAuthorized] Consents incomplete, redirecting to consent-required');\n next({ path: '/auth/consent-required', query: to.query });\n return;\n }\n }\n\n // Step 2.5: In strict mode, block unverified users from app entirely\n if (\n !to.path.startsWith('/auth/') &&\n env.emailVerificationMode === 'strict'\n ) {\n const emailVerified = userSession.currentSession?.user?.email_verified ?? true;\n if (!emailVerified) {\n logger.debug('[UserAuthorized] Strict mode: unverified user, redirecting to verify-email');\n next({ path: '/auth/verify-email', query: { returnUrl: to.fullPath } });\n return;\n }\n }\n\n // Step 3: 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 {{ teamData.created_by_display_name ?? 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 { 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</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 {{ teamMemberData.created_by_display_name ?? 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 { 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</script>\n","/**\n * Router guard helper: redirect to last-used preset filters when navigating with no URL filters.\n * Uses localStorage (no API call) - filters are stored when user applies a preset.\n * Prevents double fetch by applying preset before the list component mounts.\n */\n\nimport { buildQueryWithFilters, extractFiltersFromQuery } from '../../utils/filterUrlParser';\n\nconst LAST_USED_PREFIX = 'lastUsedPreset:';\nconst LAST_USED_FILTERS_PREFIX = 'lastUsedPresetFilters:';\n\nfunction getLastUsedKey(context: string): string {\n return `${LAST_USED_PREFIX}${context}`;\n}\n\nfunction getLastUsedFiltersKey(context: string): string {\n return `${LAST_USED_FILTERS_PREFIX}${context}`;\n}\n\nexport function getLastUsedPresetFilters(\n context: string,\n): Record<string, string | string[]> | null {\n try {\n const stored = localStorage.getItem(getLastUsedFiltersKey(context));\n if (!stored) return null;\n const parsed = JSON.parse(stored) as Record<string, string | string[]>;\n return typeof parsed === 'object' && parsed !== null ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function setLastUsedPresetFilters(\n context: string,\n filters: Record<string, string | string[]> | null,\n): void {\n try {\n if (filters && Object.keys(filters).length > 0) {\n localStorage.setItem(getLastUsedFiltersKey(context), JSON.stringify(filters));\n } else {\n localStorage.removeItem(getLastUsedFiltersKey(context));\n }\n } catch {\n // Ignore\n }\n}\n\n/**\n * If navigating with no filters and we have a last-used preset, returns the query to redirect to.\n * Otherwise returns null (no redirect needed).\n */\nexport function getLastUsedPresetRedirect(\n context: string,\n currentQuery: Record<string, unknown>,\n): Record<string, string | string[]> | null {\n const filters = extractFiltersFromQuery(currentQuery);\n if (Object.keys(filters).length > 0) return null;\n\n const lastUsedId = localStorage.getItem(getLastUsedKey(context));\n if (!lastUsedId) return null;\n\n const lastUsedFilters = getLastUsedPresetFilters(context);\n if (!lastUsedFilters || Object.keys(lastUsedFilters).length === 0) return null;\n\n return buildQueryWithFilters(currentQuery, lastUsedFilters);\n}\n\n/**\n * Creates a Vue Router beforeEnter guard that redirects to last-used preset when navigating with no filters.\n * Use on list routes that have SavedFilterPresets.\n */\nexport function createLastUsedPresetGuard(\n context: string,\n routeName: string,\n) {\n return (to: { name?: unknown; query: Record<string, unknown> }) => {\n if (to.name !== routeName) return undefined;\n const redirectQuery = getLastUsedPresetRedirect(context, to.query);\n if (!redirectQuery) return undefined;\n return { name: routeName, query: redirectQuery };\n };\n}\n","/**\n * Composable for saved filter presets - save, apply, and manage named filter configurations.\n * Works with any data table that provides getFiltersFromTable / applyFiltersToTable adapters.\n */\n\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { MS } from '../../constants/time';\nimport { useMutation } from '../../composables/useMutation';\nimport { useQuery } from '../../composables/useQuery';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { setLastUsedPresetFilters } from './lastUsedPresetGuard';\n\nconst LAST_USED_PREFIX = 'lastUsedPreset:';\n\nexport type SavedFiltersConfig = {\n /** Unique context per table type (e.g. \"tracker\", \"followup\") */\n context: string;\n /** Route path for the table (e.g. \"/trackers\", \"/followups\") */\n routePath: string;\n /** Read current filters from the table/URL */\n getFiltersFromTable: () => Record<string, string | string[]>;\n /** Apply filters to the table/URL */\n applyFiltersToTable: (filters: Record<string, string | string[]>) => void;\n /** Called when user explicitly clears all filters - clear last-used preset */\n onClearFilters?: () => void;\n};\n\nfunction getLastUsedKey(context: string): string {\n return `${LAST_USED_PREFIX}${context}`;\n}\n\nfunction getLastUsedPresetId(context: string): string | null {\n try {\n return localStorage.getItem(getLastUsedKey(context));\n } catch {\n return null;\n }\n}\n\nfunction setLastUsedPresetId(context: string, presetId: string | null): void {\n try {\n if (presetId) {\n localStorage.setItem(getLastUsedKey(context), presetId);\n } else {\n localStorage.removeItem(getLastUsedKey(context));\n }\n } catch {\n // Ignore\n }\n}\n\nexport function useSavedFilters<TApi extends DragoncoreApi = DragoncoreApi>(\n config: SavedFiltersConfig,\n) {\n const {\n context,\n routePath,\n getFiltersFromTable,\n applyFiltersToTable,\n onClearFilters,\n } = config;\n\n const cacheKey = `saved-filters:${context}`;\n const hasAppliedLastUsed = ref(false);\n const lastUsedPresetIdRef = ref<string | null>(getLastUsedPresetId(context));\n\n const { data: presets, loading: presetsLoading, refetch: refetchPresets } = useQuery<\n TApi,\n SavedFilterReadDto[]\n >((api) => api.savedFilters.listSavedFilters(context), {\n cacheKey,\n staleTime: 24 * MS.ONE_HOUR,\n });\n\n const { mutate: createPreset, loading: creating } = useMutation<\n TApi,\n { name: string; context: string; route_path: string; filters: Record<string, string | string[]>; sort_by?: string; sort_direction?: 'asc' | 'desc' },\n SavedFilterReadDto\n >(\n (api, input) => api.savedFilters.createSavedFilter(input),\n { invalidate: /^saved-filters:/ },\n );\n\n const { mutate: updatePreset, loading: updating } = useMutation<\n TApi,\n { id: string; name?: string; route_path?: string; filters?: Record<string, string | string[]>; sort_by?: string; sort_direction?: 'asc' | 'desc' },\n SavedFilterReadDto | null\n >(\n (api, input) => api.savedFilters.updateSavedFilter(input),\n { invalidate: /^saved-filters:|^pinned-presets/ },\n );\n\n const { mutate: deletePreset, loading: deleting } = useMutation<TApi, string, boolean>(\n (api, id) => api.savedFilters.deleteSavedFilter(id),\n { invalidate: /^saved-filters:/ },\n );\n\n function applyPreset(preset: SavedFilterReadDto): void {\n applyFiltersToTable(preset.filters);\n setLastUsedPresetId(context, preset.id);\n setLastUsedPresetFilters(context, preset.filters);\n lastUsedPresetIdRef.value = preset.id;\n }\n\n function clearPreset(): void {\n applyFiltersToTable({});\n setLastUsedPresetId(context, null);\n setLastUsedPresetFilters(context, null);\n lastUsedPresetIdRef.value = null;\n }\n\n function clearLastUsed(): void {\n setLastUsedPresetId(context, null);\n setLastUsedPresetFilters(context, null);\n lastUsedPresetIdRef.value = null;\n onClearFilters?.();\n }\n\n async function saveCurrentFilters(name: string): Promise<SavedFilterReadDto | null> {\n const filters = getFiltersFromTable();\n if (Object.keys(filters).length === 0) {\n return null;\n }\n try {\n const result = await createPreset({\n name,\n context,\n route_path: routePath,\n filters,\n });\n if (result) {\n await refetchPresets();\n setLastUsedPresetId(context, result.id);\n setLastUsedPresetFilters(context, result.filters);\n lastUsedPresetIdRef.value = result.id;\n }\n return result ?? null;\n } catch {\n return null;\n }\n }\n\n async function updatePresetFilters(presetId: string, name?: string): Promise<SavedFilterReadDto | null> {\n const filters = getFiltersFromTable();\n try {\n const result = await updatePreset({\n id: presetId,\n ...(name !== undefined && { name }),\n filters,\n });\n return result ?? null;\n } catch {\n return null;\n }\n }\n\n async function renamePreset(presetId: string, name: string): Promise<SavedFilterReadDto | null> {\n try {\n const result = await updatePreset({ id: presetId, name });\n if (result) {\n await refetchPresets();\n }\n return result ?? null;\n } catch {\n return null;\n }\n }\n\n async function removePreset(presetId: string): Promise<boolean> {\n try {\n await deletePreset(presetId);\n await refetchPresets();\n return true;\n } catch {\n return false;\n }\n }\n\n // On mount: if no filters in URL, apply last-used preset when presets load.\n // Note: For routes with lastUsedPresetGuard, the guard redirects before mount so this is often a no-op.\n onMounted(() => {\n const filters = getFiltersFromTable();\n if (Object.keys(filters).length > 0) {\n hasAppliedLastUsed.value = true;\n return;\n }\n const lastUsedId = getLastUsedPresetId(context);\n if (!lastUsedId) {\n hasAppliedLastUsed.value = true;\n return;\n }\n const unwatch = watch(\n () => presets.value,\n (list) => {\n if (!list || hasAppliedLastUsed.value) return;\n const preset = list.find((p) => p.id === lastUsedId);\n if (preset) {\n applyPreset(preset);\n }\n hasAppliedLastUsed.value = true;\n unwatch();\n },\n { immediate: true },\n );\n });\n\n const activePreset = computed(() => {\n const id = lastUsedPresetIdRef.value;\n if (!id) return null;\n return (presets.value ?? []).find((p) => p.id === id) ?? null;\n });\n\n return {\n presets: computed(() => presets.value ?? []),\n presetsLoading,\n creating,\n updating,\n deleting,\n applyPreset,\n clearPreset,\n clearLastUsed,\n activePreset,\n saveCurrentFilters,\n updatePresetFilters,\n renamePreset,\n removePreset,\n };\n}\n","import { userAuthenticated } from '../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../types/ExtendedRoute';\n\nexport const savedFilterRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/saved-filters',\n name: 'SavedFilters',\n component: () => import('./SavedFiltersPage.vue'),\n beforeEnter: [userAuthenticated],\n meta: {\n title: 'Saved Filters',\n description: 'Manage your saved filter presets and favorites',\n side_bar: {\n section: 'Saved Filters',\n visible_to: ['consumer', 'lead', 'staff', 'super_admin'],\n },\n },\n },\n];\n","<template>\n <BaseModal :is-open=\"isOpen\" title=\"Save Filter Preset\" @close=\"close\">\n <form @submit.prevent=\"handleSubmit\" class=\"space-y-4\">\n <div class=\"form-control\">\n <label class=\"label\">\n <span class=\"label-text\">Preset name</span>\n </label>\n <input\n v-model=\"name\"\n type=\"text\"\n placeholder=\"e.g. My Sales Escalations\"\n class=\"input input-bordered w-full\"\n maxlength=\"100\"\n />\n <label v-if=\"error\" class=\"label\">\n <span class=\"label-text-alt text-error\">{{ error }}</span>\n </label>\n </div>\n <div class=\"flex justify-end gap-2\">\n <button type=\"button\" class=\"btn btn-ghost\" @click=\"close\">\n Cancel\n </button>\n <button type=\"submit\" class=\"btn btn-primary\" :disabled=\"saving || !name.trim()\">\n {{ saving ? 'Saving...' : 'Save' }}\n </button>\n </div>\n </form>\n </BaseModal>\n</template>\n\n<script setup lang=\"ts\">\nimport BaseModal from '../../components/BaseModal.vue';\nimport { ref, watch } from 'vue';\n\nconst props = defineProps<{\n isOpen: boolean;\n saving?: boolean;\n}>();\n\nconst emit = defineEmits<{\n close: [];\n save: [name: string];\n}>();\n\nconst name = ref('');\nconst error = ref('');\n\nfunction close() {\n emit('close');\n}\n\nfunction handleSubmit() {\n const trimmed = name.value.trim();\n if (!trimmed) {\n error.value = 'Name is required';\n return;\n }\n if (trimmed.length > 100) {\n error.value = 'Name must be 100 characters or less';\n return;\n }\n error.value = '';\n emit('save', trimmed);\n}\n\nwatch(() => props.isOpen, (open) => {\n if (open) {\n name.value = '';\n error.value = '';\n }\n});\n</script>\n","<template>\n <BaseModal :is-open=\"isOpen\" title=\"Manage Filter Presets\" @close=\"close\">\n <div class=\"space-y-4\">\n <p v-if=\"presets.length === 0 && !loading\" class=\"text-base-content/70 text-sm\">\n No saved presets yet. Set filters, then use \"Save current filters\" in the Presets menu.\n </p>\n <div v-else-if=\"loading\" class=\"flex justify-center py-4\">\n <span class=\"loading loading-spinner loading-md\" />\n </div>\n <ul v-else class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-2 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <span class=\"font-medium truncate flex-1 min-w-0\">\n {{ preset.name }}\n <span class=\"text-base-content/60 text-xs font-normal ml-1\">\n ({{ Object.keys(preset.filters || {}).length }})\n </span>\n </span>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost\"\n title=\"Rename\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" 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 </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n <div class=\"flex justify-end pt-2\">\n <button type=\"button\" class=\"btn btn-ghost\" @click=\"close\">\n Close\n </button>\n </div>\n </div>\n </BaseModal>\n</template>\n\n<script setup lang=\"ts\">\nimport BaseModal from '../../components/BaseModal.vue';\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { nextTick, ref, watch } from 'vue';\n\nconst props = defineProps<{\n isOpen: boolean;\n presets: SavedFilterReadDto[];\n loading?: boolean;\n deleting?: boolean;\n renaming?: boolean;\n renamePreset: (presetId: string, name: string) => Promise<SavedFilterReadDto | null>;\n}>();\n\nconst emit = defineEmits<{\n close: [];\n delete: [preset: SavedFilterReadDto];\n}>();\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nfunction close() {\n emit('close');\n}\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n const result = await props.renamePreset(presetId, name);\n if (result) {\n cancelRename();\n }\n}\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n emit('delete', preset);\n}\n\nwatch(() => props.isOpen, (open) => {\n if (!open) {\n cancelRename();\n }\n});\n</script>\n","<template>\n <BaseModal :is-open=\"isOpen\" title=\"Filter Presets\" @close=\"close\">\n <div class=\"space-y-4\">\n <!-- Preset list: apply (click name), rename, delete -->\n <div v-if=\"presets.length > 0\">\n <p class=\"text-xs font-medium text-base-content/60 uppercase tracking-wide mb-2\">\n Apply preset\n </p>\n <ul class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-2 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <button\n type=\"button\"\n class=\"flex-1 min-w-0 text-left font-medium truncate rounded px-2 py-1 -mx-2 -my-1 hover:bg-base-300\"\n :class=\"{ 'bg-primary/10': preset.id === activePreset?.id }\"\n @click=\"applyAndClose(preset)\"\n >\n {{ preset.name }}\n <span class=\"text-base-content/60 text-xs font-normal ml-1\">\n ({{ Object.keys(preset.filters || {}).length }})\n </span>\n </button>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost\"\n :title=\"isPinned(preset.id) ? 'Unpin from favorites' : (canPinMore ? 'Pin to favorites (home + sidebar)' : `Maximum ${maxPinned} pinned`)\"\n :disabled=\"!canPinMore && !isPinned(preset.id)\"\n @click.stop=\"handleTogglePin(preset)\"\n >\n <svg\n class=\"w-4 h-4\"\n :class=\"{ 'text-primary': isPinned(preset.id) }\"\n :fill=\"isPinned(preset.id) ? 'currentColor' : 'none'\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost\"\n title=\"Rename\"\n @click.stop=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click.stop=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" 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 </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n </div>\n\n <!-- Empty state -->\n <p\n v-else-if=\"!loading\"\n class=\"text-base-content/70 text-sm\"\n >\n No presets yet. Set filters, then save below.\n </p>\n\n <div v-if=\"loading\" class=\"flex justify-center py-2\">\n <span class=\"loading loading-spinner loading-md\" />\n </div>\n\n <div class=\"divider my-2\" />\n\n <!-- Save current filters: inline form when saving -->\n <div v-if=\"showSaveForm\" class=\"space-y-2\">\n <label class=\"label py-0\">\n <span class=\"label-text\">Preset name</span>\n </label>\n <div class=\"flex gap-2\">\n <input\n ref=\"saveInputRef\"\n v-model=\"saveName\"\n type=\"text\"\n placeholder=\"e.g. My Sales Escalations\"\n class=\"input input-sm input-bordered flex-1\"\n maxlength=\"100\"\n @keydown.enter=\"submitSave\"\n @keydown.escape=\"cancelSave\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary\"\n :disabled=\"creating || !saveName.trim()\"\n @click=\"submitSave\"\n >\n {{ creating ? 'Saving...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost\"\n :disabled=\"creating\"\n @click=\"cancelSave\"\n >\n Cancel\n </button>\n </div>\n </div>\n <button\n v-else\n type=\"button\"\n class=\"btn btn-ghost btn-sm btn-block justify-start gap-2\"\n :disabled=\"!hasFilters || creating || !canSaveMore\"\n :title=\"!canSaveMore ? `Maximum ${MAX_PRESETS_PER_CONTEXT} presets per page. Delete one to save a new preset.` : undefined\"\n @click=\"startSave\"\n >\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m8-8v8H4V4h8m0 0l4 4-4 4\" />\n </svg>\n Save current filters\n <span v-if=\"!canSaveMore\" class=\"text-base-content/60 text-xs\">(max {{ MAX_PRESETS_PER_CONTEXT }})</span>\n </button>\n\n <div class=\"flex justify-end pt-2\">\n <button type=\"button\" class=\"btn btn-ghost\" @click=\"close\">\n Close\n </button>\n </div>\n </div>\n </BaseModal>\n</template>\n\n<script setup lang=\"ts\">\nimport BaseModal from '../../components/BaseModal.vue';\nimport {\n MAX_PRESETS_PER_CONTEXT,\n type SavedFilterReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { computed, nextTick, ref, watch } from 'vue';\n\nconst props = defineProps<{\n isOpen: boolean;\n presets: SavedFilterReadDto[];\n loading?: boolean;\n creating?: boolean;\n deleting?: boolean;\n renaming?: boolean;\n hasFilters: boolean;\n activePreset: SavedFilterReadDto | null;\n applyPreset: (preset: SavedFilterReadDto) => void;\n saveCurrentFilters: (name: string) => Promise<SavedFilterReadDto | null>;\n renamePreset: (presetId: string, name: string) => Promise<SavedFilterReadDto | null>;\n isPinned: (presetId: string) => boolean;\n togglePin: (preset: SavedFilterReadDto) => boolean | Promise<boolean>;\n canPinMore: boolean;\n maxPinned?: number;\n}>();\n\nconst maxPinned = computed(() => props.maxPinned ?? 5);\n\nfunction handleTogglePin(preset: SavedFilterReadDto) {\n props.togglePin(preset);\n}\n\nconst emit = defineEmits<{\n close: [];\n delete: [preset: SavedFilterReadDto];\n rename: [preset: SavedFilterReadDto];\n}>();\n\nconst canSaveMore = computed(\n () => props.presets.length < MAX_PRESETS_PER_CONTEXT,\n);\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nconst showSaveForm = ref(false);\nconst saveName = ref('');\nconst saveInputRef = ref<HTMLInputElement | null>(null);\n\nfunction close() {\n emit('close');\n}\n\nfunction applyAndClose(preset: SavedFilterReadDto) {\n props.applyPreset(preset);\n close();\n}\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n const result = await props.renamePreset(presetId, name);\n if (result) {\n emit('rename', result);\n cancelRename();\n }\n}\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n emit('delete', preset);\n}\n\nfunction startSave() {\n if (props.hasFilters && canSaveMore.value) {\n showSaveForm.value = true;\n saveName.value = '';\n nextTick(() => saveInputRef.value?.focus());\n }\n}\n\nfunction cancelSave() {\n showSaveForm.value = false;\n saveName.value = '';\n}\n\nasync function submitSave() {\n const name = saveName.value.trim();\n if (!name) return;\n const result = await props.saveCurrentFilters(name);\n if (result) {\n cancelSave();\n close();\n }\n}\n\nwatch(() => props.isOpen, (open) => {\n if (!open) {\n cancelRename();\n cancelSave();\n }\n});\n</script>\n","<template>\n <div class=\"flex items-center gap-2 flex-wrap\">\n <!-- Active preset chip: shows when a preset is applied, with clear (×) -->\n <div\n v-if=\"props.activePreset\"\n class=\"badge badge-primary badge-lg gap-1 pr-1\"\n >\n <span class=\"truncate max-w-[8rem] sm:max-w-[12rem]\">{{ props.activePreset.name }}</span>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-circle\"\n aria-label=\"Clear preset\"\n @click=\"handleClearPreset\"\n >\n <svg class=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Presets button: opens modal with everything -->\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost\"\n :disabled=\"props.presetsLoading\"\n :title=\"props.presets.length ? 'Apply, save, or manage presets' : 'No presets saved'\"\n @click=\"showPresetsModal = true\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n Presets\n </button>\n\n <!-- Delete confirmation modal -->\n <ConfirmDialog\n v-model=\"showDeleteConfirm\"\n title=\"Delete preset?\"\n confirm-text=\"Delete\"\n cancel-text=\"Cancel\"\n processing-text=\"Deleting...\"\n confirm-button-class=\"btn-error\"\n :is-processing=\"props.deleting\"\n @confirm=\"confirmDelete\"\n @cancel=\"presetToDelete = null\"\n >\n <template #message>\n <p>\n Are you sure you want to delete \"{{ presetToDelete?.name }}\"?\n This cannot be undone.\n </p>\n </template>\n </ConfirmDialog>\n\n <!-- Single Presets modal: apply, save, rename, delete -->\n <PresetsModal\n :is-open=\"showPresetsModal\"\n :presets=\"props.presets\"\n :loading=\"props.presetsLoading\"\n :creating=\"props.creating\"\n :deleting=\"props.deleting\"\n :renaming=\"props.renaming\"\n :has-filters=\"props.hasFilters\"\n :active-preset=\"props.activePreset\"\n :apply-preset=\"props.applyPreset\"\n :save-current-filters=\"props.saveCurrentFilters\"\n :rename-preset=\"props.renamePreset\"\n :is-pinned=\"pinnedPresets.isPinned\"\n :toggle-pin=\"pinnedPresets.togglePin\"\n :can-pin-more=\"pinnedPresets.canPinMore.value\"\n :max-pinned=\"pinnedPresets.maxPinned\"\n @close=\"showPresetsModal = false\"\n @delete=\"handleDelete\"\n @rename=\"handleRename\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport ConfirmDialog from '../../components/ConfirmDialog.vue';\nimport PresetsModal from './PresetsModal.vue';\nimport { useInjectedPinnedPresets } from './usePinnedPresets';\n\nconst pinnedPresets = useInjectedPinnedPresets();\n\nconst props = defineProps<{\n presets: SavedFilterReadDto[];\n presetsLoading: boolean;\n creating: boolean;\n deleting: boolean;\n renaming: boolean;\n hasFilters: boolean;\n activePreset: SavedFilterReadDto | null;\n applyPreset: (preset: SavedFilterReadDto) => void;\n clearPreset: () => void;\n saveCurrentFilters: (name: string) => Promise<SavedFilterReadDto | null>;\n renamePreset: (presetId: string, name: string) => Promise<SavedFilterReadDto | null>;\n removePreset: (presetId: string) => Promise<boolean>;\n}>();\n\nconst showPresetsModal = ref(false);\nconst showDeleteConfirm = ref(false);\nconst presetToDelete = ref<{ id: string; name: string } | null>(null);\n\nfunction handleClearPreset() {\n props.clearPreset();\n}\n\nfunction handleDelete(preset: { id: string; name: string }) {\n presetToDelete.value = preset;\n showDeleteConfirm.value = true;\n}\n\nasync function confirmDelete() {\n if (!presetToDelete.value) return;\n pinnedPresets.unpinPreset(presetToDelete.value.id);\n await props.removePreset(presetToDelete.value.id);\n presetToDelete.value = null;\n showDeleteConfirm.value = false;\n}\n\nasync function handleRename(preset: { id: string; name: string }) {\n pinnedPresets.updatePinnedPreset(preset.id, { name: preset.name });\n await pinnedPresets.refetchPinned?.();\n}\n</script>\n","import { createLastUsedPresetGuard } from '../../../slices/saved_filter';\nimport { userAuthenticated } from '../../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../../types/ExtendedRoute';\n\nconst customerListPresetGuard = createLastUsedPresetGuard('support_ticket_customer', 'CustomerSupportTicketList');\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 beforeEnter: (to) => customerListPresetGuard(to),\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 title: 'View Support Ticket',\n description: 'View support ticket details',\n },\n children: [\n {\n path: '',\n name: customerSupportPaths.customer_view.name,\n component: () => import('./CustomerSupportTicketDetailPage.vue'),\n meta: {\n title: 'View Support Ticket',\n description: 'View support ticket details',\n },\n },\n {\n path: customerSupportPaths.customer_edit.path,\n redirect: (to) => ({\n name: customerSupportPaths.customer_view.name,\n params: { id: to.params.id },\n query: { mode: 'edit' },\n }),\n },\n ],\n },\n ],\n },\n];\n","import { createLastUsedPresetGuard } from '../../../slices/saved_filter';\nimport { staffOnly, userAuthenticated } from '../../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../../types/ExtendedRoute';\n\nconst staffListPresetGuard = createLastUsedPresetGuard('support_ticket_staff', 'StaffSupportTicketList');\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 beforeEnter: (to) => staffListPresetGuard(to),\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 title: 'View Support Ticket',\n description: 'View support ticket details',\n },\n children: [\n {\n path: '',\n name: staffSupportPaths.staff_edit.name,\n component: () => import('./StaffSupportTicketDetailPage.vue'),\n meta: {\n title: 'View Support Ticket',\n description: 'View support ticket details',\n },\n },\n ],\n },\n ],\n },\n];\n","<template>\n <div class=\"mt-8\">\n <h3 class=\"text-lg font-semibold text-base-content mb-4\">SupportTicket Progress</h3>\n <div class=\"relative\">\n <!-- Timeline line -->\n <div class=\"absolute left-4 top-0 bottom-0 w-0.5 bg-base-300\"></div>\n\n <!-- Timeline items -->\n <div class=\"space-y-6 relative\">\n <!-- Submitted -->\n <div class=\"flex items-start group\">\n <div\n class=\"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center z-10\"\n :class=\"{\n 'bg-primary text-primary-content': [\n 'PENDING',\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\n 'bg-base-300 text-base-content/40': ![\n 'PENDING',\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\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=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <div class=\"ml-4\">\n <p class=\"font-medium text-base-content\">Submitted</p>\n <p class=\"text-sm text-base-content/60\">Your ticket has been received</p>\n <p class=\"text-xs text-base-content/40 mt-1\">\n {{ formatSystemTimestamp(support_ticket.created_at) }}\n </p>\n </div>\n </div>\n\n <!-- Under Review / In Progress / Completed -->\n <div class=\"flex items-start group\">\n <div\n class=\"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center z-10\"\n :class=\"{\n 'bg-primary text-primary-content': [\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\n 'bg-base-300 text-base-content/40': ![\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\n }\"\n >\n <svg\n v-if=\"support_ticket.status === 'PENDING'\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4 animate-pulse\"\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 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <svg\n v-else-if=\"support_ticket.status === 'CANCELLED'\"\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 <svg\n v-else\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=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <div class=\"ml-4\">\n <p class=\"font-medium text-base-content\">\n <template v-if=\"support_ticket.status === 'PENDING'\">Under Review</template>\n <template v-else-if=\"support_ticket.status === 'FOLLOWUP'\">Approved</template>\n <template v-else-if=\"support_ticket.status === 'IN_PROGRESS'\"\n >In Development</template\n >\n <template v-else-if=\"support_ticket.status === 'COMPLETED'\">Completed</template>\n <template v-else-if=\"support_ticket.status === 'CANCELLED'\"\n >Not Approved</template\n >\n </p>\n <p class=\"text-sm text-base-content/60\">\n <template v-if=\"support_ticket.status === 'PENDING'\"\n >Our team is reviewing your support_ticket</template\n >\n <template v-else-if=\"support_ticket.status === 'FOLLOWUP'\"\n >Your ticket has been approved and is in our backlog</template\n >\n <template v-else-if=\"support_ticket.status === 'IN_PROGRESS'\"\n >We're currently working on implementing this</template\n >\n <template v-else-if=\"support_ticket.status === 'COMPLETED'\"\n >This has been implemented and deployed</template\n >\n <template v-else-if=\"support_ticket.status === 'CANCELLED'\"\n >This ticket wasn't approved for implementation</template\n >\n </p>\n <p\n v-if=\"\n support_ticket.updated_at &&\n support_ticket.updated_at !== support_ticket.created_at\n \"\n class=\"text-xs text-base-content/40 mt-1\"\n >\n {{ formatSystemTimestamp(support_ticket.updated_at) }}\n </p>\n </div>\n </div>\n\n <!-- Credit Information -->\n <div\n v-if=\"\n formatCustomerCreditValue(support_ticket.credit_value) !== 'TBD' &&\n formatCustomerCreditValue(support_ticket.credit_value) !== 'N/A'\n \"\n class=\"flex items-start group\"\n >\n <div\n class=\"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center z-10\"\n :class=\"{\n 'bg-error text-error-content': [\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\n 'bg-warning text-warning-content': ![\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\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 </div>\n <div class=\"ml-4\">\n <p\n class=\"font-medium\"\n :class=\"{\n 'text-error': ['FOLLOWUP', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED'].includes(\n support_ticket.status,\n ),\n 'text-warning': ![\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\n }\"\n >\n {{\n ['FOLLOWUP', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED'].includes(\n support_ticket.status,\n )\n ? 'Credit Deducted'\n : 'Credit Will Be Deducted'\n }}\n </p>\n <p\n class=\"text-sm\"\n :class=\"{\n 'text-error/70': [\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\n 'text-warning/70': ![\n 'FOLLOWUP',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'CANCELLED',\n ].includes(support_ticket.status),\n }\"\n >\n <template\n v-if=\"\n ['FOLLOWUP', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED'].includes(\n support_ticket.status,\n )\n \"\n >\n {{ formatCustomerCreditValue(support_ticket.credit_value) }}\n credit(s) have been deducted from your account for this ticket\n </template>\n <template v-else>\n {{ formatCustomerCreditValue(support_ticket.credit_value) }}\n credit(s) will be deducted from your account once this ticket is approved\n </template>\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { formatSystemTimestamp } from '../../../../utils/convertToLocalDateTime';\nimport type { CustomerSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { formatCustomerCreditValue } from '../../utils/creditValueFormatter';\n\ntype SupportTicket = CustomerSupportTicketReadDto;\n\ndefineProps<{\n support_ticket: SupportTicket;\n}>();\n</script>\n","import {\n CustomerSupportTicketCreateSchema,\n CustomerSupportTicketUpdateSchema,\n SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { inject } from 'vue';\n\n// Create schema (no ID)\nexport const customerSupportTicketCreateSchemaWithMetadata = withMetadata(\n CustomerSupportTicketCreateSchema,\n 'customerSupportTicketCreateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n priority: {\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n },\n);\n\n// Update schema (with ID)\nexport const customerSupportTicketUpdateSchemaWithMetadata = withMetadata(\n CustomerSupportTicketUpdateSchema,\n 'customerSupportTicketUpdateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n priority: {\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n },\n);\n\nexport type CustomerSupportTicketCreateFormDto = UseFormTyped<\n typeof CustomerSupportTicketCreateSchema\n>;\nexport type CustomerSupportTicketUpdateFormDto = UseFormTyped<\n typeof CustomerSupportTicketUpdateSchema\n>;\n\nexport const injectCustomerSupportTicketCreateForm = () =>\n inject<CustomerSupportTicketCreateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectCustomerSupportTicketUpdateForm = () =>\n inject<CustomerSupportTicketUpdateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectCustomerSupportTicketZinia = () =>\n inject<\n CustomerSupportTicketCreateFormDto['zinia'] | CustomerSupportTicketUpdateFormDto['zinia']\n >(ZINIA_FIELDS_KEY);\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 class=\"w-full\"\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 {\n SUPPORT_TICKET_PRIORITY_TO_NUMBER,\n type CustomerSupportTicketCreateDto,\n type 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: SUPPORT_TICKET_PRIORITY_TO_NUMBER.MEDIUM,\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=\"badgeClasses\" :aria-label=\"ariaLabel\" role=\"status\">\n {{ displayText }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * SupportTicketStatusBadge - A reusable Vue component for displaying support ticket status\n * as color-coded badges with consistent DaisyUI styling and accessibility features.\n *\n * @example\n * <SupportTicketStatusBadge :status=\"'PENDING'\" size=\"md\" />\n * <SupportTicketStatusBadge :status=\"'COMPLETED'\" size=\"sm\" variant=\"outline\" />\n */\nimport type { SupportTicketStatus } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\n\n/**\n * Props for the SupportTicketStatusBadge component\n */\ninterface Props {\n /** The support ticket status to display */\n status: SupportTicketStatus;\n /** Size of the badge - defaults to 'md' */\n size?: 'sm' | 'md' | 'lg';\n /** Visual variant of the badge - defaults to 'default' */\n variant?: 'default' | 'outline';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n variant: 'default',\n});\n\n/**\n * Configuration for each status badge\n */\ninterface StatusBadgeConfig {\n /** DaisyUI badge color class */\n color: string;\n /** Display text for the badge */\n text: string;\n /** Accessibility label for screen readers */\n ariaLabel: string;\n}\n\nconst statusConfig: Record<SupportTicketStatus, StatusBadgeConfig> = {\n PENDING: {\n color: 'badge-warning',\n text: 'Pending',\n ariaLabel: 'Status: Pending review by support team',\n },\n FOLLOWUP: {\n color: 'badge-info',\n text: 'To Do',\n ariaLabel: 'Status: Approved and ready to begin work',\n },\n IN_PROGRESS: {\n color: 'badge-secondary',\n text: 'Active',\n ariaLabel: 'Status: Currently being worked on',\n },\n VERIFICATION: {\n color: 'badge-warning',\n text: 'Verification',\n ariaLabel: 'Status: Please verify and leave a comment to confirm completion',\n },\n COMPLETED: {\n color: 'badge-success',\n text: 'Done',\n ariaLabel: 'Status: Successfully completed',\n },\n CANCELLED: {\n color: 'badge-error',\n text: 'Cancelled',\n ariaLabel: 'Status: Cancelled or rejected',\n },\n};\n\nconst getStatusConfig = (status: SupportTicketStatus): StatusBadgeConfig => {\n const config = statusConfig[status];\n if (!config) {\n return {\n color: 'badge-neutral',\n text: status || 'Unknown',\n ariaLabel: `Status: ${status || 'Unknown status'}`,\n };\n }\n return config;\n};\n\nconst config = computed(() => getStatusConfig(props.status));\n\nconst badgeClasses = computed(() => {\n const baseClasses = ['badge', 'text-xs'];\n\n // Add color class\n baseClasses.push(config.value.color);\n\n // Add size class with responsive text sizing\n if (props.size === 'sm') {\n baseClasses.push('badge-sm', 'text-xs');\n } else if (props.size === 'lg') {\n baseClasses.push('badge-lg', 'text-sm');\n } else {\n // md size - responsive text\n baseClasses.push('text-xs', 'sm:text-sm');\n }\n\n // Add variant class\n if (props.variant === 'outline') {\n baseClasses.push('badge-outline');\n }\n\n return baseClasses.join(' ');\n});\n\nconst displayText = computed(() => config.value.text);\nconst ariaLabel = computed(() => config.value.ariaLabel);\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { CustomerSupportTicketReadSchema } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Reuse the existing CustomerSupportTicketReadSchema from the validation library\n * for the data table rows - don't recreate it!\n */\nexport const customerSupportTicketRowSchemaWithMetadata = withMetadata(\n CustomerSupportTicketReadSchema,\n 'customerSupportTicketRow',\n {},\n);\n\nexport type CustomerSupportTicketRow = typeof CustomerSupportTicketReadSchema._type;\n","<template>\n <div class=\"mt-2\">\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4 mb-4\">\n <div class=\"flex items-center gap-2\">\n <SavedFilterPresets\n :presets=\"savedFilters.presets.value\"\n :presets-loading=\"savedFilters.presetsLoading.value\"\n :creating=\"savedFilters.creating.value\"\n :deleting=\"savedFilters.deleting.value\"\n :renaming=\"savedFilters.updating.value\"\n :has-filters=\"hasSupportFilters\"\n :active-preset=\"savedFilters.activePreset.value\"\n :apply-preset=\"savedFilters.applyPreset\"\n :clear-preset=\"savedFilters.clearPreset\"\n :save-current-filters=\"savedFilters.saveCurrentFilters\"\n :rename-preset=\"savedFilters.renamePreset\"\n :remove-preset=\"savedFilters.removePreset\"\n />\n <h1 class=\"text-xl sm:text-2xl font-bold\">Support Tickets</h1>\n </div>\n <div class=\"flex gap-2\">\n <router-link\n :to=\"{ name: 'CustomerCreateSupportTicket' }\"\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-status=\"{ row }\">\n <SupportTicketStatusBadge :status=\"row.status\" size=\"sm\" />\n </template>\n <template #cell-credit_value=\"{ row }\">\n {{ formatCustomerCreditValue(row.credit_value) }}\n </template>\n <template #cell-created_by=\"{ row }\">\n {{ row.created_by_display_name }}\n </template>\n <template #cell-target_at=\"{ row }\">\n {{ formatUserDate(row.target_at) || 'TBD' }}\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: 'EditSupportTicket',\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 {\n OPERATORS,\n SUPPORT_TICKET_PRIORITY_FILTER_OPTIONS,\n SUPPORT_TICKET_STATUS_FILTER_OPTIONS,\n SUPPORT_TICKET_TYPE_FILTER_OPTIONS,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n buildQueryWithFilters,\n extractFiltersFromQuery,\n SavedFilterPresets,\n useSavedFilters,\n} from '@dragonmastery/dragoncore-vue';\nimport {\n ActionIcons,\n useCursorDataTable,\n useDataTableUrlSync,\n} from '@dragonmastery/zinia-forms-core';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp, formatUserDate } from '../../../utils/convertToLocalDateTime';\nimport SupportTicketPriorityBadge from '../shared/SupportTicketPriorityBadge.vue';\nimport SupportTicketStatusBadge from '../shared/SupportTicketStatusBadge.vue';\nimport SupportTicketTypeBadge from '../shared/SupportTicketTypeBadge.vue';\nimport { formatCustomerCreditValue } from '../utils/creditValueFormatter';\nimport { formatTicketDisplayId } from '../utils/displayIdFormatter';\nimport {\n customerSupportTicketRowSchemaWithMetadata,\n type CustomerSupportTicketRow,\n} from './customerSupportTicketRowSchema';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// Saved filter presets\nconst savedFiltersConfig = {\n context: 'support_ticket_customer',\n routePath: '/support',\n getFiltersFromTable: () => extractFiltersFromQuery(route.query),\n applyFiltersToTable: (filters: Record<string, string | string[]>) => {\n router.push({ query: buildQueryWithFilters(route.query, filters) });\n },\n};\nconst savedFilters = useSavedFilters(savedFiltersConfig);\nconst hasSupportFilters = computed(() => {\n const filters = extractFiltersFromQuery(route.query);\n return Object.keys(filters).length > 0;\n});\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 cursorTable = useCursorDataTable(customerSupportTicketRowSchemaWithMetadata, {\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\n if (!filters || !filters.status) {\n variables.status = {\n operator: OPERATORS.IS_NOT_ONE_OF,\n values: ['COMPLETED', 'CANCELLED'],\n };\n }\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.supportTickets.listTickets(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 filterType: 'select',\n filterOptions: [...SUPPORT_TICKET_TYPE_FILTER_OPTIONS],\n },\n priority: {\n label: 'Priority',\n field: 'priority',\n sortable: true,\n filterable: true,\n filterType: 'select',\n filterOptions: [...SUPPORT_TICKET_PRIORITY_FILTER_OPTIONS],\n },\n status: {\n label: 'Status',\n field: 'status',\n filterable: true,\n filterType: 'select',\n filterOptions: [...SUPPORT_TICKET_STATUS_FILTER_OPTIONS],\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 created_by: {\n label: 'Requester',\n field: 'created_by',\n sortable: false,\n filterable: true,\n filterType: 'select',\n filterOptionsLoader: async () => {\n const users = await executeWithAuth(\n (api) => api.supportTickets.getRequestorsForActiveTickets(),\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n return (users || []).map((u) => ({ value: u.id, label: u.email }));\n },\n },\n },\n actions: {\n items: [\n {\n key: 'view',\n icon: ActionIcons.eye,\n size: 'xs',\n variant: 'primary',\n type: 'link',\n href: (row: CustomerSupportTicketRow) => `/support/${row.id}`,\n },\n ],\n },\n search: {\n searchableFields: ['title'],\n },\n\n pagination: { pageSize: 25 },\n autoLoad: false,\n});\n\nconst { ZiniaDataTable } = cursorTable;\n\n// Sync filters with URL (handles back/forward, loads from URL on mount)\nuseDataTableUrlSync(cursorTable.table, router);\n\n// When user explicitly clears all filters, clear the last-used preset\nconst previousFilters = ref<Record<string, string | string[]>>({});\nonMounted(() => {\n previousFilters.value = extractFiltersFromQuery(route.query);\n});\nwatch(\n () => route.query,\n (query) => {\n const filters = extractFiltersFromQuery(query);\n const hadPrevious = Object.keys(previousFilters.value).length > 0;\n const hasCurrent = Object.keys(filters).length > 0;\n if (!hasCurrent && hadPrevious) {\n savedFilters.clearLastUsed();\n }\n previousFilters.value = filters;\n },\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 <div>\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 customer balance...</span>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error alert-sm\">\n <span class=\"text-xs\">Failed to load customer balance</span>\n </div>\n\n <!-- Balance Display -->\n <div v-else-if=\"creditBalance\" class=\"space-y-2\">\n <div class=\"grid grid-cols-2 gap-2 text-sm\">\n <div>\n <span class=\"text-base-content/60\">Monthly:</span>\n <span class=\"font-bold ml-2\">{{\n formatStaffCreditValue(creditBalance.monthly)\n }}</span>\n </div>\n <div>\n <span class=\"text-base-content/60\">Rollover:</span>\n <span class=\"font-bold ml-2\">{{\n formatStaffCreditValue(creditBalance.rollover)\n }}</span>\n </div>\n </div>\n <div\n class=\"flex items-center justify-between p-2 rounded\"\n :class=\"{\n 'bg-success/20': totalAvailable > 0,\n 'bg-error/20': totalAvailable === 0,\n }\"\n >\n <span class=\"text-sm font-medium\">Total Available:</span>\n <span\n class=\"font-bold\"\n :class=\"{\n 'text-success': totalAvailable > 0,\n 'text-error': totalAvailable === 0,\n }\"\n >{{ formatStaffCreditValue(totalAvailable.toString()) }}</span\n >\n </div>\n\n <!-- Warning if no balance -->\n <div v-if=\"totalAvailable === 0\" class=\"alert alert-warning alert-sm\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-4 w-4\"\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\">Customer has insufficient credits</span>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useQuery } from '../../../../composables/useQuery';\nimport { computed } from 'vue';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\n\n// Since there's only one customer in the system, admins see the same global 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","<template>\n <!-- Approve/Reject Section (PENDING only) -->\n <ZiniaContainer v-if=\"props.support_ticket.approval_status === 'PENDING'\">\n <h3 class=\"card-title text-base sm:text-lg\">Approve or Reject</h3>\n\n <div\n v-if=\"\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ) === 'TBD'\n \"\n class=\"alert alert-warning py-2\"\n >\n <div>\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=\"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 sm:text-sm\">You must set an estimate before approving</span>\n </div>\n </div>\n\n <div v-else class=\"space-y-3\">\n <div class=\"alert alert-info py-2\">\n <div>\n <span class=\"text-xs sm:text-sm\"\n >Estimate:\n {{\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n )\n }}\n credits</span\n >\n </div>\n </div>\n\n <!-- Show Customer's Credit Balance -->\n <div class=\"bg-base-100 rounded-lg p-3\">\n <h4 class=\"text-xs sm:text-sm font-medium mb-2\">Customer Balance Check</h4>\n <CustomerCreditBalance />\n </div>\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-2 sm:gap-3 justify-end mt-4\">\n <button\n class=\"btn btn-error btn-outline w-full sm:w-auto order-2 sm:order-1\"\n @click.prevent=\"showRejectModal\"\n :disabled=\"isApproving || isRejecting\"\n >\n <span v-if=\"isRejecting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isRejecting ? 'Rejecting...' : 'Reject' }}\n </button>\n <button\n class=\"btn btn-success w-full sm:w-auto order-1 sm:order-2\"\n @click.prevent=\"showApproveModal\"\n :disabled=\"\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ) === 'TBD' ||\n isApproving ||\n isRejecting\n \"\n >\n <span v-if=\"isApproving\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isApproving ? 'Approving...' : 'Approve & Deduct' }}\n </button>\n </div>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2 py-2\">\n <span class=\"text-sm\">{{ error }}</span>\n </div>\n </ZiniaContainer>\n\n <!-- Revert Section (APPROVED/REJECTED only) -->\n <ZiniaContainer\n v-else-if=\"\n props.support_ticket.approval_status === 'APPROVED' ||\n props.support_ticket.approval_status === 'REJECTED'\n \"\n >\n <h3 class=\"card-title text-base sm:text-lg\">Revert Decision</h3>\n\n <div class=\"alert alert-warning py-2\">\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=\"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 class=\"text-xs sm:text-sm\">\n <div class=\"font-medium mb-1\">Admin Action Required</div>\n <div>\n This support ticket is currently\n <span class=\"font-semibold\">{{ props.support_ticket.approval_status }}</span\n >. You can revert it back to PENDING status.\n </div>\n </div>\n </div>\n\n <div\n v-if=\"\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ) !== 'TBD' &&\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ) !== 'N/A'\n \"\n class=\"alert alert-info py-2\"\n >\n <div class=\"text-xs sm:text-sm\">\n Credits:\n {{\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n )\n }}\n will be refunded to customer\n </div>\n </div>\n\n <div class=\"flex mt-4\">\n <button\n class=\"btn btn-warning w-full sm:w-auto\"\n @click.prevent=\"showRevertModal\"\n :disabled=\"isReverting\"\n >\n <span v-if=\"isReverting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isReverting ? 'Reverting...' : 'Revert to PENDING' }}\n </button>\n </div>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2 py-2\">\n <span class=\"text-sm\">{{ error }}</span>\n </div>\n </ZiniaContainer>\n\n <!-- Confirmation Modal (for Approve and Revert) -->\n <dialog ref=\"confirmModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">{{ modalTitle }}</h3>\n <p class=\"py-4 whitespace-pre-line\">{{ modalMessage }}</p>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeModal\">Cancel</button>\n <button class=\"btn\" :class=\"modalButtonClass\" @click=\"() => modalCallback?.()\">\n {{ modalButtonText }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button @click=\"closeModal\">close</button>\n </form>\n </dialog>\n\n <!-- Reject Modal with Reason -->\n <dialog ref=\"rejectModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Reject Ticket</h3>\n <p class=\"text-sm text-base-content/70 py-2\">\n This will lock the ticket and notify the requester.\n </p>\n <div class=\"form-control py-4\">\n <label class=\"label\">\n <span class=\"label-text text-sm font-medium\">Reason (optional)</span>\n </label>\n <textarea\n v-model=\"rejectReason\"\n class=\"textarea textarea-bordered w-full\"\n rows=\"3\"\n placeholder=\"Why is this ticket being rejected?\"\n :disabled=\"isRejecting\"\n ></textarea>\n </div>\n <div v-if=\"rejectError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ rejectError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n class=\"btn btn-ghost\"\n @click=\"closeRejectModal\"\n :disabled=\"isRejecting\"\n >\n Cancel\n </button>\n <button\n class=\"btn btn-error\"\n @click=\"handleRejectWithReason\"\n :disabled=\"isRejecting\"\n >\n <span v-if=\"isRejecting\" class=\"loading loading-spinner loading-xs mr-2\"></span>\n {{ isRejecting ? 'Rejecting...' : 'Reject Ticket' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button @click=\"closeRejectModal\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport ZiniaContainer from '../../../../components/ui/ZiniaContainer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport type { NoteCreateDto, StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\nimport CustomerCreditBalance from './CustomerCreditBalance.vue';\n\ntype SupportTicket = StaffSupportTicketReadDto;\n\nconst props = defineProps<{ support_ticket: SupportTicket }>();\nconst emit = defineEmits(['update']);\n\nconst error = ref<string | null>(null);\nconst confirmModal = ref<HTMLDialogElement | null>(null);\nconst modalTitle = ref('');\nconst modalMessage = ref('');\nconst modalButtonText = ref('');\nconst modalButtonClass = ref('');\nconst modalCallback = ref<(() => Promise<void>) | null>(null);\n\nconst rejectModal = ref<HTMLDialogElement | null>(null);\nconst rejectReason = ref('');\nconst rejectError = ref<string | null>(null);\n\nconst { mutate: approveSupportTicket, loading: isApproving } = useMutation(\n (api, input: { id: string; credit_value: string }) =>\n api.supportTickets.approveTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\nconst { mutate: rejectSupportTicket, loading: isRejecting } = useMutation(\n (api, input: { id: string }) => api.supportTickets.rejectTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\nconst { mutate: createNote } = useMutation(\n (api, input: NoteCreateDto) => api.notes.createNote(input),\n { invalidate: /^notes?:/ },\n);\nconst { mutate: revertSupportTicket, loading: isReverting } = useMutation(\n (api, input: { id: string }) => api.supportTickets.revertTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst showApproveModal = () => {\n const creditDisplay = formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n );\n const credits =\n creditDisplay === 'TBD' || creditDisplay === 'N/A' ? 0 : parseFloat(creditDisplay);\n modalTitle.value = 'Approve Support Ticket?';\n modalMessage.value =\n `This will:\\n\\n` +\n `• Deduct ${credits.toFixed(2)} credits from customer\\n` +\n `• Lock the support ticket item\\n` +\n `• Start development workflow\\n\\n` +\n `This action cannot be undone.`;\n modalButtonText.value = 'Approve & Deduct';\n modalButtonClass.value = 'btn-success';\n modalCallback.value = handleApprove;\n confirmModal.value?.showModal();\n};\n\nconst showRejectModal = () => {\n rejectReason.value = '';\n rejectError.value = null;\n rejectModal.value?.showModal();\n};\n\nconst showRevertModal = () => {\n modalTitle.value = 'Revert Support Ticket to PENDING?';\n const creditDisplay = formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n );\n const hasCredits = creditDisplay !== 'TBD' && creditDisplay !== 'N/A';\n modalMessage.value =\n `This will:\\n\\n` +\n `• Change status back to PENDING\\n` +\n `• Unlock the support ticket item\\n` +\n (hasCredits ? `• Refund ${creditDisplay} credits to customer\\n` : '') +\n `• Allow the customer to edit again\\n\\n` +\n `Are you sure you want to revert this decision?`;\n modalButtonText.value = 'Revert to PENDING';\n modalButtonClass.value = 'btn-warning';\n modalCallback.value = handleRevert;\n confirmModal.value?.showModal();\n};\n\nconst closeModal = () => {\n confirmModal.value?.close();\n modalCallback.value = null;\n};\n\nconst closeRejectModal = () => {\n rejectModal.value?.close();\n rejectReason.value = '';\n rejectError.value = null;\n};\n\nconst handleApprove = async () => {\n error.value = null;\n const creditValue = props.support_ticket.credit_value?.trim();\n if (!creditValue) {\n error.value = 'Credit value is required to approve';\n toast.error('Credit value is required to approve');\n return;\n }\n closeModal();\n\n try {\n const response = await approveSupportTicket({\n id: props.support_ticket.id,\n credit_value: creditValue,\n });\n\n toast.success(\n `Support Ticket approved! ${formatStaffCreditValue(props.support_ticket.credit_value, props.support_ticket.approval_status)} credits deducted.`,\n );\n\n emit('update', response);\n } catch (e) {\n const errorMessage = extractRpcErrorMessage(e, 'Failed to approve');\n error.value = errorMessage;\n toast.error(errorMessage);\n }\n};\n\nconst handleRejectWithReason = async () => {\n rejectError.value = null;\n error.value = null;\n\n try {\n const reasonTrimmed = rejectReason.value.trim();\n\n // Create customer note if reason is provided\n if (reasonTrimmed) {\n await createNote({\n record_id: props.support_ticket.id,\n record_type: 'support_ticket' as const,\n body: reasonTrimmed,\n tag: null,\n is_internal: false,\n });\n }\n\n // Reject the ticket\n const response = await rejectSupportTicket({ id: props.support_ticket.id });\n\n toast.info('Support Ticket rejected.');\n\n closeRejectModal();\n emit('update', response);\n } catch (e) {\n const errorMessage = extractRpcErrorMessage(e, 'Failed to reject');\n rejectError.value = errorMessage;\n toast.error(errorMessage);\n }\n};\n\nconst handleRevert = async () => {\n error.value = null;\n closeModal();\n\n try {\n const response = await revertSupportTicket({ id: props.support_ticket.id });\n\n const creditDisplay = formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n );\n const refundMessage =\n creditDisplay !== 'TBD' && creditDisplay !== 'N/A'\n ? ` ${creditDisplay} credits refunded.`\n : '';\n\n toast.success(`Support Ticket reverted to PENDING.${refundMessage}`);\n\n emit('update', response);\n } catch (e) {\n const errorMessage = extractRpcErrorMessage(e, 'Failed to revert');\n error.value = errorMessage;\n toast.error(errorMessage);\n }\n};\n\n// Expose methods for external triggering (e.g., from StaffActionBanner)\ndefineExpose({\n showApproveModal,\n showRejectModal,\n});\n</script>\n","<template>\n <!-- Cancel Internal Task Section (INTERNAL only, not CANCELLED) -->\n <ZiniaContainer\n v-if=\"\n props.support_ticket.approval_status === 'INTERNAL' &&\n props.support_ticket.dev_lifecycle !== 'CANCELLED'\n \"\n >\n <h3 class=\"card-title text-base sm:text-lg\">Cancel Internal Task</h3>\n\n <div class=\"alert alert-warning py-2\">\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-semibold text-sm\">What happens when you cancel:</span>\n <ul class=\"text-xs sm:text-sm space-y-1 ml-4 list-disc\">\n <li>Sets dev lifecycle to CANCELLED</li>\n <li>Records completion timestamp</li>\n <li>Task is marked as terminal state</li>\n <li>No credit impact (internal tasks have no credits)</li>\n </ul>\n </div>\n </div>\n\n <div class=\"flex justify-end mt-4\">\n <button\n class=\"btn btn-error w-full sm:w-auto\"\n @click.prevent=\"showCancelModal\"\n :disabled=\"isCancelling\"\n >\n <span v-if=\"isCancelling\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isCancelling ? 'Cancelling...' : 'Cancel Internal Task' }}\n </button>\n </div>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2 py-2\">\n <span class=\"text-sm\">{{ error }}</span>\n </div>\n </ZiniaContainer>\n\n <!-- Confirmation Modal -->\n <dialog ref=\"confirmModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">{{ modalTitle }}</h3>\n <p class=\"py-4 whitespace-pre-line\">{{ modalMessage }}</p>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeModal\">Cancel</button>\n <button class=\"btn btn-error\" @click=\"() => modalCallback?.()\">\n {{ modalButtonText }}\n </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 ZiniaContainer from '../../../../components/ui/ZiniaContainer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { toast } from 'vue3-toastify';\n\ntype SupportTicket = StaffSupportTicketReadDto;\n\nconst props = defineProps<{ support_ticket: SupportTicket }>();\nconst emit = defineEmits(['update']);\n\nconst error = ref<string | null>(null);\nconst confirmModal = ref<HTMLDialogElement | null>(null);\nconst modalTitle = ref('');\nconst modalMessage = ref('');\nconst modalButtonText = ref('');\nconst modalCallback = ref<(() => Promise<void>) | null>(null);\n\nconst { mutate: cancelInternalTask, loading: isCancelling } = useMutation(\n (api, input: { id: string }) => api.supportTickets.cancelInternalTask(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst showCancelModal = () => {\n modalTitle.value = 'Cancel Internal Task?';\n modalMessage.value =\n `This will:\\n\\n` +\n `• Set dev lifecycle to CANCELLED\\n` +\n `• Record completion timestamp\\n` +\n `• Mark task as complete (terminal state)\\n\\n` +\n `This action cannot be undone. The task will remain in the system as cancelled.`;\n modalButtonText.value = 'Cancel Task';\n modalCallback.value = handleCancel;\n confirmModal.value?.showModal();\n};\n\nconst handleCancel = async () => {\n error.value = null;\n try {\n const result = await cancelInternalTask({ id: props.support_ticket.id });\n\n toast.success('✅ Internal task cancelled successfully');\n closeModal();\n emit('update', result);\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to cancel task';\n toast.error(`❌ ${error.value}`);\n }\n};\n\nconst closeModal = () => {\n confirmModal.value?.close();\n};\n</script>\n","<template>\n <ZiniaForm\n v-if=\"\n ['APPROVED', 'INTERNAL'].includes(props.support_ticket.approval_status) && !isCompleted\n \"\n @handleSubmit=\"handleComplete\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n >\n <h3 class=\"card-title text-base sm:text-lg\">Complete Support Ticket</h3>\n <p class=\"text-xs sm:text-sm text-base-content/70 mb-4\">\n Customer was charged\n <span class=\"font-semibold\">{{\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n )\n }}</span>\n credits\n </p>\n\n <!-- Delivered Value Field -->\n <zinia.DeliveredValueField\n label=\"Actual Effort Delivered\"\n placeholder=\"100.00\"\n hint=\"How much effort did it actually take?\"\n />\n\n <!-- Variance Indicator -->\n <div\n v-if=\"\n form.values.delivered_value &&\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ) !== 'TBD' &&\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ) !== 'N/A'\n \"\n class=\"alert py-2\"\n :class=\"getComparisonClass()\"\n >\n <span class=\"text-xs sm:text-sm\">{{ getComparisonMessage() }}</span>\n </div>\n\n <ZiniaSubmitButton submitText=\"Mark as Completed\" submittingText=\"Completing...\" />\n </ZiniaForm>\n\n <ZiniaContainer v-else-if=\"isCompleted\">\n <h3 class=\"card-title text-success text-base sm:text-lg\">✅ Completed</h3>\n\n <div class=\"grid grid-cols-2 gap-2 sm:gap-4 mt-2\">\n <div class=\"bg-base-100 p-3 rounded-lg\">\n <div class=\"text-xs text-base-content/70\">Customer Charged</div>\n <div class=\"text-lg sm:text-xl font-bold text-primary\">\n {{\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n )\n }}\n </div>\n <div class=\"text-xs text-base-content/60\">Fixed price</div>\n </div>\n\n <div class=\"bg-base-100 p-3 rounded-lg\">\n <div class=\"text-xs text-base-content/70\">Actual Effort</div>\n <div class=\"text-lg sm:text-xl font-bold\" :class=\"getActualClass()\">\n {{ props.support_ticket.delivered_value ?? 'N/A' }}\n </div>\n <div class=\"text-xs text-base-content/60\">\n {{ getVarianceLabel() }}\n </div>\n </div>\n </div>\n </ZiniaContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport {\n CompleteSupportTicketSchema,\n type StaffSupportTicketReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport ZiniaContainer from '../../../../components/ui/ZiniaContainer.vue';\nimport { useForm, withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { computed } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\n\ntype SupportTicket = StaffSupportTicketReadDto;\n\nconst props = defineProps<{ support_ticket: SupportTicket }>();\nconst emit = defineEmits(['update']);\n\n// Use shared schema for completing support_ticket\n// Note: We only need delivered_value field (id is handled by mutation)\nconst completeSupportTicketFormSchema = CompleteSupportTicketSchema.pick({\n delivered_value: true,\n});\n\nconst completeSupportTicketSchemaWithMetadata = withMetadata(\n completeSupportTicketFormSchema,\n 'completeSupportTicketSchema',\n {\n delivered_value: {\n inputType: 'text',\n placeholder: '100.00',\n },\n },\n);\n\n// Initialize form with estimate as default\nconst { form, zinia, ZiniaSubmitButton, ZiniaForm } = useForm(\n completeSupportTicketSchemaWithMetadata,\n {\n storeName: `complete-support_ticket-${props.support_ticket.id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n initialValues: {\n delivered_value:\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ) === 'TBD' ||\n formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ) === 'N/A'\n ? '0.00'\n : formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n ),\n },\n },\n);\n\nconst { mutate: completeSupportTicket } = useMutation(\n (api, input: { id: string; delivered_value: string }) =>\n api.supportTickets.completeTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst isCompleted = computed(() => props.support_ticket.status === 'COMPLETED');\n\nconst getComparisonClass = () => {\n const creditDisplay = formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n );\n if (!form.values.delivered_value || creditDisplay === 'TBD' || creditDisplay === 'N/A')\n return '';\n const actual = parseFloat(form.values.delivered_value);\n const final = parseFloat(creditDisplay);\n if (isNaN(actual) || isNaN(final)) return '';\n\n if (actual > final) return 'alert-warning';\n if (actual === final) return 'alert-success';\n return 'alert-info';\n};\n\nconst getComparisonMessage = () => {\n const creditDisplay = formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n );\n if (!form.values.delivered_value || creditDisplay === 'TBD' || creditDisplay === 'N/A')\n return '';\n const actual = parseFloat(form.values.delivered_value);\n const final = parseFloat(creditDisplay);\n if (isNaN(actual) || isNaN(final)) return '';\n\n const variance = (((actual - final) / final) * 100).toFixed(1);\n\n if (actual > final) {\n return `📈 Took ${(actual - final).toFixed(2)} more effort (+${variance}%)`;\n } else if (actual === final) {\n return '🎯 Exactly on estimate!';\n } else {\n return `📉 Took ${(final - actual).toFixed(2)} less effort (${variance}%)`;\n }\n};\n\nconst getActualClass = () => {\n const creditDisplay = formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n );\n if (\n !props.support_ticket.delivered_value ||\n creditDisplay === 'TBD' ||\n creditDisplay === 'N/A'\n )\n return '';\n const actual = parseFloat(props.support_ticket.delivered_value);\n const final = parseFloat(creditDisplay);\n if (isNaN(actual) || isNaN(final)) return '';\n\n if (actual > final) return 'text-warning';\n if (actual === final) return 'text-success';\n return 'text-info';\n};\n\nconst getVarianceLabel = () => {\n const creditDisplay = formatStaffCreditValue(\n props.support_ticket.credit_value,\n props.support_ticket.approval_status,\n );\n if (\n !props.support_ticket.delivered_value ||\n creditDisplay === 'TBD' ||\n creditDisplay === 'N/A'\n )\n return 'Work performed';\n const actual = parseFloat(props.support_ticket.delivered_value);\n const final = parseFloat(creditDisplay);\n if (isNaN(actual) || isNaN(final)) return 'Work performed';\n\n const diff = actual - final;\n const variance = ((diff / final) * 100).toFixed(1);\n\n if (diff > 0) return `+${variance}% over estimate`;\n if (diff < 0) return `${variance}% under estimate`;\n return 'On target';\n};\n\n// Handle form submission\nconst handleComplete = async (formData: { delivered_value: string }) => {\n const response = await completeSupportTicket({\n id: props.support_ticket.id,\n delivered_value: formData.delivered_value,\n });\n\n if (!response) {\n throw new Error('Failed to complete support ticket');\n }\n\n return response;\n};\n\n// Handle successful submission\nconst handleSuccess = () => {\n toast.success('SupportTicket marked as completed!', {});\n emit('update');\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n const errorMessage = error instanceof Error ? error.message : 'An unknown error occurred.';\n toast.error(errorMessage);\n};\n</script>\n","<template>\n <!-- Convert to Customer SupportTicket Section (INTERNAL only) -->\n <ZiniaContainer v-if=\"props.support_ticket.approval_status === 'INTERNAL'\">\n <h3 class=\"card-title text-base sm:text-lg\">Convert to Customer SupportTicket</h3>\n\n <div class=\"alert alert-info py-2\">\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-semibold text-sm\">What happens when you convert:</span>\n <ul class=\"text-xs sm:text-sm space-y-1 ml-4 list-disc\">\n <li>Changes status from internal task to customer support_ticket</li>\n <li>Requires approval workflow (goes to PENDING)</li>\n <li>Clears dev lifecycle (back to planning)</li>\n <li>Staff must set credit estimate before approval</li>\n </ul>\n </div>\n </div>\n\n <div class=\"flex justify-end mt-4\">\n <button\n class=\"btn btn-primary w-full sm:w-auto\"\n @click.prevent=\"showConvertModal\"\n :disabled=\"isConverting\"\n >\n <span v-if=\"isConverting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isConverting ? 'Converting...' : 'Convert to Customer SupportTicket' }}\n </button>\n </div>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2 py-2\">\n <span class=\"text-sm\">{{ error }}</span>\n </div>\n </ZiniaContainer>\n\n <!-- Confirmation Modal -->\n <dialog ref=\"confirmModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">{{ modalTitle }}</h3>\n <p class=\"py-4 whitespace-pre-line\">{{ modalMessage }}</p>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeModal\">Cancel</button>\n <button class=\"btn btn-primary\" @click=\"() => modalCallback?.()\">\n {{ modalButtonText }}\n </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 ZiniaContainer from '../../../../components/ui/ZiniaContainer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { toast } from 'vue3-toastify';\n\nconst props = defineProps<{ support_ticket: StaffSupportTicketReadDto }>();\nconst emit = defineEmits(['update']);\n\nconst error = ref<string | null>(null);\nconst confirmModal = ref<HTMLDialogElement | null>(null);\nconst modalTitle = ref('');\nconst modalMessage = ref('');\nconst modalButtonText = ref('');\nconst modalCallback = ref<(() => Promise<void>) | null>(null);\n\nconst { mutate: convertToCustomer, loading: isConverting } = useMutation(\n (api, input: { id: string }) => api.supportTickets.convertToCustomer(input.id),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst showConvertModal = () => {\n modalTitle.value = 'Convert to Customer Support Ticket?';\n modalMessage.value =\n `This will:\\n\\n` +\n `• Change status to PENDING\\n` +\n `• Require approval workflow\\n` +\n `• Clear dev lifecycle stage\\n` +\n `• Reset to planning phase\\n\\n` +\n `You'll need to set a credit estimate before the support ticket can be approved.`;\n modalButtonText.value = 'Convert to Customer Support Ticket';\n modalCallback.value = handleConvert;\n confirmModal.value?.showModal();\n};\n\nconst handleConvert = async () => {\n error.value = null;\n try {\n const result = await convertToCustomer({ id: props.support_ticket.id });\n\n toast.success('✅ Converted to customer support ticket successfully');\n closeModal();\n emit('update', result);\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to convert';\n toast.error(`❌ ${error.value}`);\n }\n};\n\nconst closeModal = () => {\n confirmModal.value?.close();\n};\n</script>\n","<template>\n <!-- Convert to Internal Section (PENDING only) -->\n <ZiniaContainer v-if=\"props.support_ticket.approval_status === 'PENDING'\">\n <h3 class=\"card-title text-base sm:text-lg\">Convert to Internal Task</h3>\n\n <div class=\"alert alert-info py-2\">\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-semibold text-sm\">What happens when you convert:</span>\n <ul class=\"text-xs sm:text-sm space-y-1 ml-4 list-disc\">\n <li>Changes status from customer support_ticket to internal task</li>\n <li>Bypasses approval workflow entirely</li>\n <li>Automatically clears any credit estimates (internal tasks = no credits)</li>\n <li>Can start development immediately</li>\n </ul>\n </div>\n </div>\n\n <div class=\"flex justify-end mt-4\">\n <button\n class=\"btn btn-primary w-full sm:w-auto\"\n @click.prevent=\"showConvertModal\"\n :disabled=\"isConverting\"\n >\n <span v-if=\"isConverting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isConverting ? 'Converting...' : 'Convert to Internal Task' }}\n </button>\n </div>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2 py-2\">\n <span class=\"text-sm\">{{ error }}</span>\n </div>\n </ZiniaContainer>\n\n <!-- Confirmation Modal -->\n <dialog ref=\"confirmModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">{{ modalTitle }}</h3>\n <p class=\"py-4 whitespace-pre-line\">{{ modalMessage }}</p>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeModal\">Cancel</button>\n <button class=\"btn btn-primary\" @click=\"() => modalCallback?.()\">\n {{ modalButtonText }}\n </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 ZiniaContainer from '../../../../components/ui/ZiniaContainer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { toast } from 'vue3-toastify';\n\ntype SupportTicket = StaffSupportTicketReadDto;\n\nconst props = defineProps<{ support_ticket: SupportTicket }>();\nconst emit = defineEmits(['update']);\n\nconst error = ref<string | null>(null);\nconst confirmModal = ref<HTMLDialogElement | null>(null);\nconst modalTitle = ref('');\nconst modalMessage = ref('');\nconst modalButtonText = ref('');\nconst modalCallback = ref<(() => Promise<void>) | null>(null);\n\nconst { mutate: convertToInternal, loading: isConverting } = useMutation(\n (api, input: { id: string }) => api.supportTickets.convertToInternal(input.id),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst showConvertModal = () => {\n const hasCredits =\n props.support_ticket.credit_value && parseFloat(props.support_ticket.credit_value) > 0;\n\n modalTitle.value = 'Convert to Internal Task?';\n modalMessage.value =\n `This will:\\n\\n` +\n `• Change status to INTERNAL\\n` +\n `• Bypass customer approval workflow\\n` +\n (hasCredits ? `• Clear ${props.support_ticket.credit_value} credit estimate\\n` : '') +\n `• Set dev lifecycle to BACKLOG\\n` +\n `• Allow immediate development start\\n\\n` +\n `This change can be useful for converting customer ideas into internal improvements.`;\n modalButtonText.value = 'Convert to Internal';\n modalCallback.value = handleConvert;\n confirmModal.value?.showModal();\n};\n\nconst handleConvert = async () => {\n error.value = null;\n try {\n const result = await convertToInternal({ id: props.support_ticket.id });\n\n toast.success('✅ Converted to internal task successfully');\n closeModal();\n emit('update', result);\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to convert';\n toast.error(`❌ ${error.value}`);\n }\n};\n\nconst closeModal = () => {\n confirmModal.value?.close();\n};\n</script>\n","<template>\n <!-- Reactivate Terminal Internal Task Section (INTERNAL + CANCELLED or DEPLOYED) -->\n <ZiniaContainer\n v-if=\"\n props.support_ticket.approval_status === 'INTERNAL' &&\n (props.support_ticket.dev_lifecycle === 'CANCELLED' ||\n props.support_ticket.dev_lifecycle === 'DEPLOYED')\n \"\n >\n <h3 class=\"card-title text-base sm:text-lg\">Reopen Internal Task</h3>\n\n <div class=\"alert alert-info py-2\">\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-semibold text-sm\">What happens when you reopen:</span>\n <ul class=\"text-xs sm:text-sm space-y-1 ml-4 list-disc\">\n <li v-if=\"props.support_ticket.dev_lifecycle === 'CANCELLED'\">\n Sets dev lifecycle to BACKLOG (fresh start)\n </li>\n <li v-else>Sets dev lifecycle to PO_APPROVAL (ready for review/fixes)</li>\n <li>Clears completion timestamp</li>\n <li>Task becomes active again</li>\n <li>You can resume work or make additional changes</li>\n </ul>\n </div>\n </div>\n\n <div class=\"flex justify-end mt-4\">\n <button\n class=\"btn btn-success w-full sm:w-auto\"\n @click.prevent=\"showReactivateModal\"\n :disabled=\"isReactivating\"\n >\n <span v-if=\"isReactivating\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isReactivating ? 'Reopening...' : 'Reopen Task' }}\n </button>\n </div>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2 py-2\">\n <span class=\"text-sm\">{{ error }}</span>\n </div>\n </ZiniaContainer>\n\n <!-- Confirmation Modal -->\n <dialog ref=\"confirmModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">{{ modalTitle }}</h3>\n <p class=\"py-4 whitespace-pre-line\">{{ modalMessage }}</p>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeModal\">Cancel</button>\n <button class=\"btn btn-success\" @click=\"() => modalCallback?.()\">\n {{ modalButtonText }}\n </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 ZiniaContainer from '../../../../components/ui/ZiniaContainer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { toast } from 'vue3-toastify';\n\ntype SupportTicket = StaffSupportTicketReadDto;\n\nconst props = defineProps<{ support_ticket: SupportTicket }>();\nconst emit = defineEmits(['update']);\n\nconst error = ref<string | null>(null);\nconst confirmModal = ref<HTMLDialogElement | null>(null);\nconst modalTitle = ref('');\nconst modalMessage = ref('');\nconst modalButtonText = ref('');\nconst modalCallback = ref<(() => Promise<void>) | null>(null);\n\nconst { mutate: reactivateInternalTask, loading: isReactivating } = useMutation(\n (api, input: { id: string }) => api.supportTickets.reactivateInternalTask(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst showReactivateModal = () => {\n const isCancelled = props.support_ticket.dev_lifecycle === 'CANCELLED';\n const targetState = isCancelled ? 'BACKLOG' : 'PO_APPROVAL';\n\n modalTitle.value = `Reopen ${isCancelled ? 'Cancelled' : 'Deployed'} Task?`;\n modalMessage.value =\n `This will:\\n\\n` +\n `• Set dev lifecycle to ${targetState}\\n` +\n `• Clear completion timestamp\\n` +\n `• Resume task as active\\n\\n` +\n (isCancelled\n ? `Task will restart from backlog for fresh planning.`\n : `Task will go to PO approval stage for review/fixes.`);\n modalButtonText.value = 'Reopen Task';\n modalCallback.value = handleReactivate;\n confirmModal.value?.showModal();\n};\n\nconst handleReactivate = async () => {\n error.value = null;\n try {\n const result = await reactivateInternalTask({ id: props.support_ticket.id });\n\n toast.success('✅ Internal task reopened successfully');\n closeModal();\n emit('update', result);\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to reactivate task';\n toast.error(`❌ ${error.value}`);\n }\n};\n\nconst closeModal = () => {\n confirmModal.value?.close();\n};\n</script>\n","import {\n StaffSupportTicketCreateSchema,\n StaffSupportTicketUpdateSchema,\n SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { inject } from 'vue';\n\n// Create schema (no ID)\nexport const adminSupportTicketCreateSchemaWithMetadata = withMetadata(\n StaffSupportTicketCreateSchema,\n 'adminSupportTicketCreateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n credit_value: {\n inputType: 'currency',\n step: 0.01,\n placeholder: 'Enter credit value',\n },\n start_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n target_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n completed_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n priority: {\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n assigned_to: {\n label: 'Assignee',\n inputType: 'select',\n placeholder: 'Auto-assign (round-robin)',\n },\n },\n);\n\n// Update schema (with ID)\nexport const adminSupportTicketUpdateSchemaWithMetadata = withMetadata(\n StaffSupportTicketUpdateSchema,\n 'adminSupportTicketUpdateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n credit_value: {\n inputType: 'currency',\n step: 0.01,\n placeholder: 'Enter credit value',\n },\n start_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n target_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n completed_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n priority: {\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n },\n);\n\nexport type AdminSupportTicketCreateFormDto = UseFormTyped<\n typeof StaffSupportTicketCreateSchema\n>;\nexport type AdminSupportTicketUpdateFormDto = UseFormTyped<\n typeof StaffSupportTicketUpdateSchema\n>;\n\nexport const injectAdminSupportTicketCreateForm = () =>\n inject<AdminSupportTicketCreateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectAdminSupportTicketUpdateForm = () =>\n inject<AdminSupportTicketUpdateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectAdminSupportTicketZinia = () =>\n inject<AdminSupportTicketCreateFormDto['zinia'] | AdminSupportTicketUpdateFormDto['zinia']>(\n ZINIA_FIELDS_KEY,\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=\"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 class=\"w-full\" 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 <zinia.AssignedToField :select-options=\"form.extraData.enriched?.triageUsers || []\" />\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 { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatToISODate } from '../../../utils/convertToLocalDateTime';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport {\n SUPPORT_TICKET_PRIORITY_TO_NUMBER,\n type StaffSupportTicketCreateDto,\n type 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 loadAssigneeOptions = async () => {\n try {\n const users = await executeWithAuth(\n (api) => api.users.getTriageUsers(),\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n return {\n triageUsers: [\n { value: '', label: 'Auto-assign (round-robin)' },\n ...(users ?? []).map((u) => ({ value: u.id, label: u.email })),\n ],\n };\n } catch (error) {\n console.error('Error fetching triage users', error);\n return { triageUsers: [{ value: '', label: 'Auto-assign (round-robin)' }] };\n }\n};\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 dataLoaders: {\n enriched: loadAssigneeOptions,\n },\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: SUPPORT_TICKET_PRIORITY_TO_NUMBER.MEDIUM,\n is_internal: false, // Default to customer support ticket\n assigned_to: null as string | null, // Empty = round-robin auto-assign\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 'VERIFICATION',\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","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 <div class=\"flex items-center gap-2\">\n <SavedFilterPresets\n :presets=\"savedFilters.presets.value\"\n :presets-loading=\"savedFilters.presetsLoading.value\"\n :creating=\"savedFilters.creating.value\"\n :deleting=\"savedFilters.deleting.value\"\n :renaming=\"savedFilters.updating.value\"\n :has-filters=\"hasSupportFilters\"\n :active-preset=\"savedFilters.activePreset.value\"\n :apply-preset=\"savedFilters.applyPreset\"\n :clear-preset=\"savedFilters.clearPreset\"\n :save-current-filters=\"savedFilters.saveCurrentFilters\"\n :rename-preset=\"savedFilters.renamePreset\"\n :remove-preset=\"savedFilters.removePreset\"\n />\n <h1 class=\"text-xl sm:text-2xl font-bold\">Manage Support Tickets</h1>\n </div>\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 <select\n v-if=\"canEditDevLifecycle(row)\"\n :value=\"row.dev_lifecycle\"\n class=\"select select-sm select-bordered min-w-[7rem]\"\n :disabled=\"updatingDevLifecycleId === row.id\"\n @change=\"handleDevLifecycleChange(row, ($event.target as HTMLSelectElement).value)\"\n >\n <option\n v-for=\"opt in devLifecycleUpdateOptions\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n >\n {{ opt.label }}\n </option>\n </select>\n <SupportTicketDevLifecycleBadge\n v-else\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-created_by=\"{ row }\">\n {{ row.created_by_display_name }}\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 {\n OPERATORS,\n SUPPORT_TICKET_APPROVAL_FILTER_OPTIONS,\n SUPPORT_TICKET_DEV_LIFECYCLE_FILTER_OPTIONS,\n SUPPORT_TICKET_PRIORITY_FILTER_OPTIONS,\n SUPPORT_TICKET_TYPE_FILTER_OPTIONS,\n SupportTicketDevLifecycleUpdateEnum,\n supportTicketPriorityToNumber,\n type StaffSupportTicketUpdateDto,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n buildQueryWithFilters,\n extractFiltersFromQuery,\n SavedFilterPresets,\n useSavedFilters,\n} from '@dragonmastery/dragoncore-vue';\nimport { useMutation } from '../../../composables/useMutation';\nimport {\n ActionIcons,\n useCursorDataTable,\n useDataTableUrlSync,\n} from '@dragonmastery/zinia-forms-core';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp, formatUserDate } from '../../../utils/convertToLocalDateTime';\nimport SupportTicketApprovalBadge from '../shared/SupportTicketApprovalBadge.vue';\nimport SupportTicketDevLifecycleBadge from '../shared/SupportTicketDevLifecycleBadge.vue';\nimport SupportTicketPriorityBadge from '../shared/SupportTicketPriorityBadge.vue';\nimport SupportTicketTypeBadge from '../shared/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\nconst route = useRoute();\nconst router = useRouter();\n\n// Saved filter presets\nconst savedFiltersConfig = {\n context: 'support_ticket_staff',\n routePath: '/staff/support',\n getFiltersFromTable: () => extractFiltersFromQuery(route.query),\n applyFiltersToTable: (filters: Record<string, string | string[]>) => {\n router.push({ query: buildQueryWithFilters(route.query, filters) });\n },\n};\nconst savedFilters = useSavedFilters(savedFiltersConfig);\nconst hasSupportFilters = computed(() => {\n const filters = extractFiltersFromQuery(route.query);\n return Object.keys(filters).length > 0;\n});\n\n// Store pagination token for breadcrumb state\nconst currentPaginationToken = ref<string | undefined | null>();\n\n// Dev lifecycle options for inline edit (only editable stages)\nconst devLifecycleUpdateOptions = SUPPORT_TICKET_DEV_LIFECYCLE_FILTER_OPTIONS.filter((opt) =>\n (SupportTicketDevLifecycleUpdateEnum as readonly string[]).includes(opt.value),\n);\n\nconst updatingDevLifecycleId = ref<string | null>(null);\nconst { mutate: updateTicket } = useMutation(\n (api, input: StaffSupportTicketUpdateDto) => api.supportTickets.staffUpdateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nfunction canEditDevLifecycle(row: AdminSupportTicketRow): boolean {\n if (!row.approval_status) return false;\n if (!['APPROVED', 'INTERNAL'].includes(row.approval_status)) return false;\n const dl = row.dev_lifecycle;\n if (dl === 'DEPLOYED' || dl === 'CANCELLED') return false;\n return true;\n}\n\n// Set up data table with cursor breadcrumb pagination\nconst cursorTable = 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 filterType: 'select',\n filterOptions: [...SUPPORT_TICKET_TYPE_FILTER_OPTIONS],\n },\n priority: {\n label: 'Priority',\n field: 'priority',\n sortable: true,\n filterable: true,\n filterType: 'select',\n filterOptions: [...SUPPORT_TICKET_PRIORITY_FILTER_OPTIONS],\n },\n approval_status: {\n label: 'Approval',\n field: 'approval_status',\n sortable: true,\n filterable: true,\n filterType: 'select',\n filterOptions: [...SUPPORT_TICKET_APPROVAL_FILTER_OPTIONS],\n },\n dev_lifecycle: {\n label: 'Dev Stage',\n field: 'dev_lifecycle',\n sortable: true,\n filterable: true,\n filterType: 'select',\n filterOptions: [...SUPPORT_TICKET_DEV_LIFECYCLE_FILTER_OPTIONS],\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 created_by: {\n label: 'Requester',\n field: 'created_by',\n sortable: false,\n filterable: true,\n filterType: 'select',\n filterOptionsLoader: async () => {\n const users = await executeWithAuth(\n (api) => api.supportTickets.staffGetRequestorsForActiveTickets(),\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n return (users || []).map((u) => ({ value: u.id, label: u.email }));\n },\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 autoLoad: false,\n});\n\nconst { ZiniaDataTable, refresh } = cursorTable;\n\nasync function handleDevLifecycleChange(\n row: AdminSupportTicketRow,\n newDevLifecycle: string,\n): Promise<void> {\n if (!(SupportTicketDevLifecycleUpdateEnum as readonly string[]).includes(newDevLifecycle)) return;\n updatingDevLifecycleId.value = row.id;\n try {\n const priority =\n typeof row.priority === 'number'\n ? row.priority\n : supportTicketPriorityToNumber(row.priority as 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL');\n await updateTicket({\n id: row.id,\n title: row.title,\n type: row.type,\n priority,\n dev_lifecycle: newDevLifecycle as StaffSupportTicketUpdateDto['dev_lifecycle'],\n });\n await refresh();\n } catch {\n await refresh();\n } finally {\n updatingDevLifecycleId.value = null;\n }\n}\n\n// Sync filters with URL (handles back/forward, loads from URL on mount)\nuseDataTableUrlSync(cursorTable.table, router);\n\n// When user explicitly clears all filters, clear the last-used preset\nconst previousFilters = ref<Record<string, string | string[]>>({});\nonMounted(() => {\n previousFilters.value = extractFiltersFromQuery(route.query);\n});\nwatch(\n () => route.query,\n (query) => {\n const filters = extractFiltersFromQuery(query);\n const hadPrevious = Object.keys(previousFilters.value).length > 0;\n const hasCurrent = Object.keys(filters).length > 0;\n if (!hasCurrent && hadPrevious) {\n savedFilters.clearLastUsed();\n }\n previousFilters.value = filters;\n },\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 <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","<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","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 case 'VERIFICATION':\n return false; // Can add comments via followups, but not edit ticket fields\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 =\n status !== 'COMPLETED' && status !== 'VERIFICATION';\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 'VERIFICATION':\n sectionTitle = 'Verify & Confirm';\n limitationMessage =\n 'The work has been deployed. Please verify it meets your expectations and leave a comment below to confirm completion.';\n submitText = 'Update SupportTicket';\n submittingText = 'Updating SupportTicket...';\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 | 'VERIFICATION'\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 'VERIFICATION':\n return {\n icon: '🔍',\n label: 'Verification',\n description: 'The work has been deployed. Please verify it meets your expectations and leave a comment.',\n alertClass: 'alert-warning',\n whatsNext:\n 'Please verify the implementation and leave a comment to confirm completion. Once verified, our team will mark this ticket as complete.',\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' && status !== 'VERIFICATION';\n };\n\n const isApproved = (status: string): boolean => {\n return ['FOLLOWUP', 'IN_PROGRESS', 'VERIFICATION', '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 { useUserSessionStore } from '../composables/useUserSessionStore';\nimport { getValidReturnUrl } from '../utils/useReturnUrl';\nimport type { NavigationGuard } from 'vue-router';\n\n/**\n * Redirects away from the verify-email page when the user is already logged in and verified.\n * Use as beforeEnter on the verify-email route.\n */\nexport const skipVerifyEmailIfAlreadyVerified: NavigationGuard = (to, _from, next) => {\n const sessionStore = useUserSessionStore();\n const session = sessionStore.currentSession;\n\n if (session?.user?.email_verified) {\n next(getValidReturnUrl(to, '/'));\n } else {\n next();\n }\n};\n","import type { NavigationGuard } from 'vue-router';\nimport { useSignupPendingData } from './useSignupPendingData';\n\n/**\n * Route guard for /auth/signup-consents.\n * Redirects to signup if there is no pending signup data (e.g. direct URL, refresh).\n * Runs only when entering the route, so it does not interfere with handleDecline or\n * completeSignup when they clear data and navigate elsewhere.\n */\nexport const signupConsentsGuard: NavigationGuard = (to, _from, next) => {\n const { get } = useSignupPendingData();\n const data = get();\n\n if (data == null) {\n const returnUrl = to.query.returnUrl as string | undefined;\n next({\n path: '/auth/signup',\n query: returnUrl ? { returnUrl } : {},\n });\n } else {\n next();\n }\n};\n","import { useEnv } from '../../composables/useEnv';\nimport { skipVerifyEmailIfAlreadyVerified } from '../../middleware/skipVerifyEmailIfAlreadyVerified';\nimport { userAlreadyLoggedIn } from '../../middleware/userAlreadyLoggedIn';\nimport type { ExtendedRouteRecordRaw } from '../../types/ExtendedRoute';\nimport { signupConsentsGuard } from './signupConsentsGuard';\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 mfa_setup: {\n path: 'mfa/setup',\n full_path: '/auth/mfa/setup',\n name: 'MFA Setup',\n },\n mfa_verify: {\n path: 'mfa/verify',\n full_path: '/auth/mfa/verify',\n name: 'MFA Verify',\n },\n verify_email: {\n path: 'verify-email',\n full_path: '/auth/verify-email',\n name: 'Verify Email',\n },\n consent_required: {\n path: 'consent-required',\n full_path: '/auth/consent-required',\n name: 'Consent Required',\n },\n signup_consents: {\n path: 'signup-consents',\n full_path: '/auth/signup-consents',\n name: 'Signup Consents',\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 path: authPaths.mfa_setup.path,\n name: authPaths.mfa_setup.name,\n component: () => import('./features/mfa/MfaSetup.vue'),\n meta: {\n title: 'Set Up Two-Factor Authentication',\n description: 'Enable MFA for your account',\n },\n },\n {\n path: authPaths.mfa_verify.path,\n name: authPaths.mfa_verify.name,\n component: () => import('./features/mfa/MfaVerify.vue'),\n meta: {\n title: 'Verify Two-Factor Authentication',\n description: 'Enter your MFA code to complete sign in',\n },\n },\n {\n path: authPaths.verify_email.path,\n name: authPaths.verify_email.name,\n component: () => import('./features/verify_email/VerifyEmail.vue'),\n meta: {\n title: 'Verify Email',\n description: 'Verify your email address',\n },\n beforeEnter: [skipVerifyEmailIfAlreadyVerified],\n },\n {\n path: 'verify-email-required',\n redirect: (to) => ({\n path: '/auth/verify-email',\n query: to.query,\n }),\n },\n {\n path: authPaths.consent_required.path,\n name: authPaths.consent_required.name,\n component: () => import('./features/consent_required/ConsentRequired.vue'),\n meta: {\n title: 'Consent Required',\n description: 'Accept updated terms to continue',\n },\n },\n {\n path: authPaths.signup_consents.path,\n name: authPaths.signup_consents.name,\n component: () => import('./features/signup_consents/SignupConsentFlow.vue'),\n meta: {\n title: 'Review and accept',\n description: 'Review and accept terms to complete signup',\n },\n beforeEnter: [userAlreadyLoggedIn, signupConsentsGuard],\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","<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: 'support-staff',\n label: 'Support Staff',\n to: { name: 'SupportStaff' },\n },\n {\n id: 'credit-management',\n label: 'Credit Management',\n to: { name: 'CreditManagement' },\n },\n {\n id: 'support-ticket-maintenance',\n label: 'Support Ticket Maintenance',\n to: { name: 'SupportTicketMaintenance' },\n },\n {\n id: 'signup-requirements',\n label: 'Signup Requirements',\n to: { name: 'SignupRequirements' },\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: 'support-staff',\n name: 'SupportStaff',\n component: () => import('./features/support_staff/SupportStaffPage.vue'),\n meta: {\n title: 'Support Staff',\n description: 'Manage users who can triage support tickets',\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: 'support-ticket-maintenance',\n name: 'SupportTicketMaintenance',\n component: () =>\n import('./features/support_ticket_maintenance/SupportTicketMaintenancePage.vue'),\n meta: {\n title: 'Support Ticket Maintenance',\n description: 'Admin utilities for fixing support ticket data',\n side_bar: {\n section: ' Admin',\n visible_to: ['super_admin'],\n },\n },\n },\n {\n path: 'signup-requirements',\n name: 'SignupRequirements',\n component: () =>\n import('./features/signup_requirements/SignupRequirementsPage.vue'),\n meta: {\n title: 'Signup Requirements',\n description: 'Configure consent checkboxes shown on signup and consent-required flows',\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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"}