@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-DVe_0RO9.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>","userAlreadyLoggedIn: NavigationGuard","userRoutes: 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>"],"sources":["../src/plugin.ts","../src/components/AppTabNavigation.vue","../src/components/AppHeader.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/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/utils/timezones.ts","../src/middleware/userAlreadyLoggedIn.ts","../src/slices/user/userRoutes.ts","../src/slices/team/components/TeamAttachments.vue","../src/slices/team/TeamAttachmentsTab.vue","../src/slices/team/teamFiltersMetadata.ts","../src/slices/team/team_member/teamMemberFiltersMetadata.ts","../src/slices/support_ticket/customer/components/SupportTicketTimeline.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/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/StaffSupportTicketRowSchema.ts","../src/slices/support_ticket/staff/StaffSupportTicketList.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"],"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 <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","<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 { 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 { 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 /**\n * Text before the legal links. Default: \"By signing up you agree to these terms:\"\n */\n signupConsentBeforeText?: string;\n /**\n * Text after the legal links. Default: \"After you click Sign Up, we'll show you each document to review and accept.\"\n * Use empty string to hide.\n */\n signupConsentAfterText?: string;\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\nconst DEFAULT_SIGNUP_CONSENT_BEFORE =\n \"By signing up you agree to these terms:\";\nconst DEFAULT_SIGNUP_CONSENT_AFTER =\n \"After you click Sign Up, we'll show you each document to review and accept.\";\n\nprovide(\n 'signupConsentBeforeText',\n props.signupConsentBeforeText ?? DEFAULT_SIGNUP_CONSENT_BEFORE,\n);\nprovide(\n 'signupConsentAfterText',\n props.signupConsentAfterText ?? DEFAULT_SIGNUP_CONSENT_AFTER,\n);\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","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 { 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","<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 { 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","<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","<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>\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 { 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=\"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';\n\n/**\n * Route guard for /auth/signup-consents.\n * Redirects to signup if there is no token in the query (e.g. direct URL, refresh).\n * The token is set when redirecting from Signup.vue after signupInitiate returns consents.\n */\nexport const signupConsentsGuard: NavigationGuard = (to, _from, next) => {\n const token = to.query.token as string | undefined;\n\n if (!token || token.trim() === '') {\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"],"mappings":"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"}