@dragonmastery/dragoncore-vue 0.0.31 → 0.0.33

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 (199) hide show
  1. package/dist/{ChangePasswordPage-Dy8lFUcI.js → ChangePasswordPage-CR91NZP4.js} +2 -2
  2. package/dist/{ChangePasswordPage-Dy8lFUcI.js.map → ChangePasswordPage-CR91NZP4.js.map} +1 -1
  3. package/dist/ChangePasswordPage-qLd6YZVO.js +7 -0
  4. package/dist/{ConsentRequired-Bhkxu0rv.js → ConsentRequired-DtUwfpk0.js} +36 -27
  5. package/dist/ConsentRequired-DtUwfpk0.js.map +1 -0
  6. package/dist/{CreateTeamForm-bpLbK18g.js → CreateTeamForm-ClisfzsU.js} +3 -3
  7. package/dist/{CreateTeamForm-bpLbK18g.js.map → CreateTeamForm-ClisfzsU.js.map} +1 -1
  8. package/dist/CreateTeamForm-DWAeq_Xd.js +12 -0
  9. package/dist/{CreateTeamMemberForm-DeUyXnVa.js → CreateTeamMemberForm-B3jxlAsC.js} +4 -4
  10. package/dist/{CreateTeamMemberForm-DeUyXnVa.js.map → CreateTeamMemberForm-B3jxlAsC.js.map} +1 -1
  11. package/dist/CreateTeamMemberForm-BYsZNxTq.js +12 -0
  12. package/dist/{CreateUserPage-CqKcY7_X.js → CreateUserPage-BcCIat_l.js} +2 -2
  13. package/dist/{CreateUserPage-CqKcY7_X.js.map → CreateUserPage-BcCIat_l.js.map} +1 -1
  14. package/dist/CreateUserPage-D0oMJnGd.js +7 -0
  15. package/dist/{CreditBalanceDashboard-BEsOr0Rw.js → CreditBalanceDashboard-CJr1yOjW.js} +2 -2
  16. package/dist/{CreditBalanceDashboard-BEsOr0Rw.js.map → CreditBalanceDashboard-CJr1yOjW.js.map} +1 -1
  17. package/dist/CreditBalanceDashboard-D370HlpF.js +13 -0
  18. package/dist/CreditManagement-B4aHJfOo.js +13 -0
  19. package/dist/{CreditManagement-DiVSMbWZ.js → CreditManagement-BbDEviZx.js} +3 -3
  20. package/dist/{CreditManagement-DiVSMbWZ.js.map → CreditManagement-BbDEviZx.js.map} +1 -1
  21. package/dist/{CreditTransactionHistory-mcacl2xG.js → CreditTransactionHistory-mz-QIKUG.js} +5 -5
  22. package/dist/{CreditTransactionHistory-mcacl2xG.js.map → CreditTransactionHistory-mz-QIKUG.js.map} +1 -1
  23. package/dist/{CustomerCreateSupportTicketForm-IefplMnK.js → CustomerCreateSupportTicketForm-Cul4aVjB.js} +4 -4
  24. package/dist/{CustomerCreateSupportTicketForm-IefplMnK.js.map → CustomerCreateSupportTicketForm-Cul4aVjB.js.map} +1 -1
  25. package/dist/CustomerCreateSupportTicketForm-DCPjvzyF.js +14 -0
  26. package/dist/{CustomerSupportTicketDetailPage-Dengb4Zx.js → CustomerSupportTicketDetailPage-DflGaKvk.js} +8 -8
  27. package/dist/{CustomerSupportTicketDetailPage-Dengb4Zx.js.map → CustomerSupportTicketDetailPage-DflGaKvk.js.map} +1 -1
  28. package/dist/CustomerSupportTicketList-BPWQ8WjH.js +64 -0
  29. package/dist/CustomerSupportTicketParent-C0uMeN09.js +8 -0
  30. package/dist/{CustomerSupportTicketParent-rl4Ym8oa.js → CustomerSupportTicketParent-D9FuZjPz.js} +2 -2
  31. package/dist/{CustomerSupportTicketParent-rl4Ym8oa.js.map → CustomerSupportTicketParent-D9FuZjPz.js.map} +1 -1
  32. package/dist/{CustomerSupportTicketSuccess-RQskseXP.js → CustomerSupportTicketSuccess-B4WR8Zfn.js} +2 -2
  33. package/dist/{CustomerSupportTicketSuccess-RQskseXP.js.map → CustomerSupportTicketSuccess-B4WR8Zfn.js.map} +1 -1
  34. package/dist/CustomerSupportTicketSuccess-Bsp1d0oF.js +12 -0
  35. package/dist/{DefaultReferralTeamPage-Be7-RI3s.js → DefaultReferralTeamPage-fS1SlVow.js} +6 -6
  36. package/dist/{DefaultReferralTeamPage-Be7-RI3s.js.map → DefaultReferralTeamPage-fS1SlVow.js.map} +1 -1
  37. package/dist/{EditTeamForm-RBO99ocN.js → EditTeamForm-B4p-C-8i.js} +3 -3
  38. package/dist/{EditTeamForm-RBO99ocN.js.map → EditTeamForm-B4p-C-8i.js.map} +1 -1
  39. package/dist/EditTeamForm-ucwkw2eL.js +12 -0
  40. package/dist/EditTeamMemberForm-BKbWq88S.js +9 -0
  41. package/dist/{EditTeamMemberForm-D9cofrUM.js → EditTeamMemberForm-D6vf9hp-.js} +2 -2
  42. package/dist/{EditTeamMemberForm-D9cofrUM.js.map → EditTeamMemberForm-D6vf9hp-.js.map} +1 -1
  43. package/dist/EditUserPage-DCdj6EYd.js +8 -0
  44. package/dist/{EditUserPage-DGuV8pzp.js → EditUserPage-Dy61CCle.js} +3 -3
  45. package/dist/{EditUserPage-DGuV8pzp.js.map → EditUserPage-Dy61CCle.js.map} +1 -1
  46. package/dist/{EnhancedRefreshTokenHandler-C6tZCcfX.js → EnhancedRefreshTokenHandler-s8wUXtB5.js} +2 -2
  47. package/dist/{EnhancedRefreshTokenHandler-C6tZCcfX.js.map → EnhancedRefreshTokenHandler-s8wUXtB5.js.map} +1 -1
  48. package/dist/{ForgotPassword-DZ-d8rWX.js → ForgotPassword-BykH9B9R.js} +2 -2
  49. package/dist/{ForgotPassword-DZ-d8rWX.js.map → ForgotPassword-BykH9B9R.js.map} +1 -1
  50. package/dist/ForgotPassword-Xb1yVZ6C.js +8 -0
  51. package/dist/{InlineAttachments-DAn_QknY.js → InlineAttachments-DvqCOd6U.js} +22 -12
  52. package/dist/InlineAttachments-DvqCOd6U.js.map +1 -0
  53. package/dist/LoginForm-B5wYdKhY.js +8 -0
  54. package/dist/{LoginForm-DEgTB9RF.js → LoginForm-CjF4NSgM.js} +3 -3
  55. package/dist/{LoginForm-DEgTB9RF.js.map → LoginForm-CjF4NSgM.js.map} +1 -1
  56. package/dist/{Logout-Bb2xe5BM.js → Logout-DmpC8Rwh.js} +3 -3
  57. package/dist/{Logout-Bb2xe5BM.js.map → Logout-DmpC8Rwh.js.map} +1 -1
  58. package/dist/Logout-qyH2t-1a.js +8 -0
  59. package/dist/{MfaSetup-m080C6iX.js → MfaSetup-DCLKIMaS.js} +2 -2
  60. package/dist/{MfaSetup-m080C6iX.js.map → MfaSetup-DCLKIMaS.js.map} +1 -1
  61. package/dist/MfaSetup-DMLXL9fk.js +9 -0
  62. package/dist/MfaVerify-C4xGQZlQ.js +9 -0
  63. package/dist/{MfaVerify-D8Ch-8hN.js → MfaVerify-Dm2Yc0Da.js} +3 -3
  64. package/dist/{MfaVerify-D8Ch-8hN.js.map → MfaVerify-Dm2Yc0Da.js.map} +1 -1
  65. package/dist/{ResetPassword-DflPd8Qg.js → ResetPassword-iVcY7eBY.js} +2 -2
  66. package/dist/{ResetPassword-DflPd8Qg.js.map → ResetPassword-iVcY7eBY.js.map} +1 -1
  67. package/dist/ResetPassword-ulR2HviU.js +8 -0
  68. package/dist/{SavedFiltersPage-ey8wOr0T.js → SavedFiltersPage-Y1T18UAH.js} +50 -50
  69. package/dist/{SavedFiltersPage-ey8wOr0T.js.map → SavedFiltersPage-Y1T18UAH.js.map} +1 -1
  70. package/dist/Signup-D4xILUym.js +10 -0
  71. package/dist/{Signup-KuiKHB4h.js → Signup-D6vnyS4w.js} +28 -28
  72. package/dist/Signup-D6vnyS4w.js.map +1 -0
  73. package/dist/{SignupRequirementsPage-CwnsnQKb.js → SignupRequirementsPage-BnOkXd7w.js} +6 -6
  74. package/dist/{SignupRequirementsPage-CwnsnQKb.js.map → SignupRequirementsPage-BnOkXd7w.js.map} +1 -1
  75. package/dist/{StaffCreateSupportTicketForm-75Bo0jdz.js → StaffCreateSupportTicketForm-B1YioWlS.js} +6 -6
  76. package/dist/{StaffCreateSupportTicketForm-75Bo0jdz.js.map → StaffCreateSupportTicketForm-B1YioWlS.js.map} +1 -1
  77. package/dist/StaffCreateSupportTicketForm-UkE9YVWE.js +14 -0
  78. package/dist/{StaffSupportTicketDetailPage-6VyPNdw7.js → StaffSupportTicketDetailPage-CMxsVxjf.js} +8 -8
  79. package/dist/{StaffSupportTicketDetailPage-6VyPNdw7.js.map → StaffSupportTicketDetailPage-CMxsVxjf.js.map} +1 -1
  80. package/dist/StaffSupportTicketList-BlGTtE1R.js +64 -0
  81. package/dist/{StaffSupportTicketParent-DPvdLUii.js → StaffSupportTicketParent-CZllER18.js} +2 -2
  82. package/dist/{StaffSupportTicketParent-DPvdLUii.js.map → StaffSupportTicketParent-CZllER18.js.map} +1 -1
  83. package/dist/StaffSupportTicketParent-D4FKQAmp.js +8 -0
  84. package/dist/StaffSupportTicketSuccess-CzS9uS2h.js +12 -0
  85. package/dist/{StaffSupportTicketSuccess-BYoBXx1i.js → StaffSupportTicketSuccess-DTMToAq2.js} +2 -2
  86. package/dist/{StaffSupportTicketSuccess-BYoBXx1i.js.map → StaffSupportTicketSuccess-DTMToAq2.js.map} +1 -1
  87. package/dist/{SupportStaffPage-CLxWU628.js → SupportStaffPage--vinFIlV.js} +6 -6
  88. package/dist/{SupportStaffPage-CLxWU628.js.map → SupportStaffPage--vinFIlV.js.map} +1 -1
  89. package/dist/{SupportTicketMaintenancePage-B07avInx.js → SupportTicketMaintenancePage-C-BWD49g.js} +5 -5
  90. package/dist/{SupportTicketMaintenancePage-B07avInx.js.map → SupportTicketMaintenancePage-C-BWD49g.js.map} +1 -1
  91. package/dist/TeamAttachmentsTab-BgtXRohH.js +64 -0
  92. package/dist/{TeamHistoryTab-CxzA4u_G.js → TeamHistoryTab-5kNQ_XAq.js} +3 -3
  93. package/dist/{TeamHistoryTab-CxzA4u_G.js.map → TeamHistoryTab-5kNQ_XAq.js.map} +1 -1
  94. package/dist/TeamHistoryTab-CBWeRKXM.js +6 -0
  95. package/dist/TeamList-D3NqS5DL.js +8 -0
  96. package/dist/{TeamList-DXQj_Omo.js → TeamList-P7rVlBuQ.js} +4 -4
  97. package/dist/{TeamList-DXQj_Omo.js.map → TeamList-P7rVlBuQ.js.map} +1 -1
  98. package/dist/{TeamMemberList-BYUANoBg.js → TeamMemberList-DyfXcR6F.js} +4 -4
  99. package/dist/{TeamMemberList-BYUANoBg.js.map → TeamMemberList-DyfXcR6F.js.map} +1 -1
  100. package/dist/TeamMemberList-X2hzYZFT.js +7 -0
  101. package/dist/{TeamMemberParent-DmYcHU3n.js → TeamMemberParent-2zISixbT.js} +3 -3
  102. package/dist/{TeamMemberParent-DmYcHU3n.js.map → TeamMemberParent-2zISixbT.js.map} +1 -1
  103. package/dist/TeamMemberParent-DKxE1ziP.js +10 -0
  104. package/dist/{TeamNotesTab-Cego-QT3.js → TeamNotesTab-BREl3Vr0.js} +5 -5
  105. package/dist/{TeamNotesTab-Cego-QT3.js.map → TeamNotesTab-BREl3Vr0.js.map} +1 -1
  106. package/dist/TeamNotesTab-DxMN3WZo.js +8 -0
  107. package/dist/TeamParent-CuoVw7Yk.js +11 -0
  108. package/dist/{TeamParent-6JhqsYaO.js → TeamParent-D35VUiio.js} +3 -3
  109. package/dist/{TeamParent-6JhqsYaO.js.map → TeamParent-D35VUiio.js.map} +1 -1
  110. package/dist/{TimelineNoteInput-P3ycD18j.js → TimelineNoteInput-D6AbJMx5.js} +2 -2
  111. package/dist/{TimelineNoteInput-P3ycD18j.js.map → TimelineNoteInput-D6AbJMx5.js.map} +1 -1
  112. package/dist/{UserListPage-DelzxCID.js → UserListPage-CCl0K7Gk.js} +3 -3
  113. package/dist/{UserListPage-DelzxCID.js.map → UserListPage-CCl0K7Gk.js.map} +1 -1
  114. package/dist/UserListPage-CYkvaHwL.js +5 -0
  115. package/dist/UserProfilePage-BMmz7SGl.js +8 -0
  116. package/dist/{UserProfilePage-BYitd7QV.js → UserProfilePage-D7FNmca1.js} +4 -4
  117. package/dist/{UserProfilePage-BYitd7QV.js.map → UserProfilePage-D7FNmca1.js.map} +1 -1
  118. package/dist/{VerifyEmail-Cy2s4yP0.js → VerifyEmail-KCti4rzf.js} +5 -5
  119. package/dist/{VerifyEmail-Cy2s4yP0.js.map → VerifyEmail-KCti4rzf.js.map} +1 -1
  120. package/dist/VerifyEmail-Xd31Com7.js +10 -0
  121. package/dist/ViewTeam-7YvvwcXd.js +8 -0
  122. package/dist/{ViewTeam-ByZdYEJG.js → ViewTeam-BbsTsjAy.js} +2 -2
  123. package/dist/{ViewTeam-ByZdYEJG.js.map → ViewTeam-BbsTsjAy.js.map} +1 -1
  124. package/dist/{ViewTeamMember-DqWZ3F_h.js → ViewTeamMember-Dsl2GKI1.js} +2 -2
  125. package/dist/{ViewTeamMember-DqWZ3F_h.js.map → ViewTeamMember-Dsl2GKI1.js.map} +1 -1
  126. package/dist/ViewTeamMember-bmry5QZ0.js +7 -0
  127. package/dist/{customerSupportTicketRoutes-DvfXGaSC.js → customerSupportTicketRoutes-38JuLJGP.js} +8 -8
  128. package/dist/{customerSupportTicketRoutes-DvfXGaSC.js.map → customerSupportTicketRoutes-38JuLJGP.js.map} +1 -1
  129. package/dist/index.d.ts +250 -215
  130. package/dist/index.js +50 -50
  131. package/dist/{saved_filter-erjEgsdK.js → saved_filter-YIncsdws.js} +5 -5
  132. package/dist/{saved_filter-erjEgsdK.js.map → saved_filter-YIncsdws.js.map} +1 -1
  133. package/dist/{src-DSF_hIBe.js → src-BXO0PrFd.js} +486 -303
  134. package/dist/src-BXO0PrFd.js.map +1 -0
  135. package/dist/{staffSupportTicketRoutes-73ceKhL-.js → staffSupportTicketRoutes-BZrj4aMG.js} +8 -8
  136. package/dist/{staffSupportTicketRoutes-73ceKhL-.js.map → staffSupportTicketRoutes-BZrj4aMG.js.map} +1 -1
  137. package/dist/{teamRoutes-CSBq1DNq.js → teamRoutes-Aa9aBVCa.js} +11 -11
  138. package/dist/{teamRoutes-CSBq1DNq.js.map → teamRoutes-Aa9aBVCa.js.map} +1 -1
  139. package/dist/{team_memberRoutes-BgjY9Kwq.js → team_memberRoutes-mO1f-Y4o.js} +7 -7
  140. package/dist/{team_memberRoutes-BgjY9Kwq.js.map → team_memberRoutes-mO1f-Y4o.js.map} +1 -1
  141. package/dist/useAuthFlowNextStep-zlvxflBZ.js +64 -0
  142. package/dist/useAuthFlowNextStep-zlvxflBZ.js.map +1 -0
  143. package/dist/{useEmailVerificationChannel-C76Gnyi1.js → useEmailVerificationChannel-DYiMSAES.js} +2 -2
  144. package/dist/{useEmailVerificationChannel-C76Gnyi1.js.map → useEmailVerificationChannel-DYiMSAES.js.map} +1 -1
  145. package/dist/{useMutation-BLNuJoYl.js → useMutation-BXSu7_-s.js} +6 -4
  146. package/dist/useMutation-BXSu7_-s.js.map +1 -0
  147. package/dist/{useQuery-BzUGEOj0.js → useQuery-DownvLRA.js} +4 -4
  148. package/dist/{useQuery-BzUGEOj0.js.map → useQuery-DownvLRA.js.map} +1 -1
  149. package/dist/{useQueryCache-alzaRWEb.js → useQueryCache-CUTrwJWX.js} +2 -2
  150. package/dist/{useQueryCache-alzaRWEb.js.map → useQueryCache-CUTrwJWX.js.map} +1 -1
  151. package/dist/{useRpcAuth-CJtq1dqM.js → useRpcAuth-BFdprNWb.js} +5 -7
  152. package/dist/useRpcAuth-BFdprNWb.js.map +1 -0
  153. package/dist/{userAuthorized-3RiCDXxr.js → userAuthorized-qmzUYDa-.js} +2 -2
  154. package/dist/{userAuthorized-3RiCDXxr.js.map → userAuthorized-qmzUYDa-.js.map} +1 -1
  155. package/package.json +2 -2
  156. package/dist/ChangePasswordPage-D1LGJ02W.js +0 -7
  157. package/dist/ConsentRequired-Bhkxu0rv.js.map +0 -1
  158. package/dist/CreateTeamForm-BHgTTHAk.js +0 -12
  159. package/dist/CreateTeamMemberForm-CayF2tIJ.js +0 -12
  160. package/dist/CreateUserPage-C9uOeYDJ.js +0 -7
  161. package/dist/CreditBalanceDashboard-DZQqekKa.js +0 -13
  162. package/dist/CreditManagement-ByFH6IHV.js +0 -13
  163. package/dist/CustomerCreateSupportTicketForm-CroUyX15.js +0 -14
  164. package/dist/CustomerSupportTicketList-CpOaBgNr.js +0 -64
  165. package/dist/CustomerSupportTicketParent-D3Gj4Hel.js +0 -8
  166. package/dist/CustomerSupportTicketSuccess-BPUwEn4h.js +0 -12
  167. package/dist/EditTeamForm-KX2cNn24.js +0 -12
  168. package/dist/EditTeamMemberForm-Bh6zVNyJ.js +0 -9
  169. package/dist/EditUserPage-AcRFhChk.js +0 -8
  170. package/dist/ExternalLinkIcon-BKVV5Gjm.js +0 -34
  171. package/dist/ExternalLinkIcon-BKVV5Gjm.js.map +0 -1
  172. package/dist/ForgotPassword-LnjRUIY7.js +0 -8
  173. package/dist/InlineAttachments-DAn_QknY.js.map +0 -1
  174. package/dist/LoginForm-D-gfB2hS.js +0 -8
  175. package/dist/Logout-Ctq-a1GS.js +0 -8
  176. package/dist/MfaSetup-6E6apXWC.js +0 -9
  177. package/dist/MfaVerify-C95WB9v2.js +0 -9
  178. package/dist/ResetPassword-9DFz-Qt3.js +0 -8
  179. package/dist/Signup-C052ykf5.js +0 -9
  180. package/dist/Signup-KuiKHB4h.js.map +0 -1
  181. package/dist/StaffCreateSupportTicketForm-DYEddYii.js +0 -14
  182. package/dist/StaffSupportTicketList-CxV6u2gF.js +0 -64
  183. package/dist/StaffSupportTicketParent-Dyybqx74.js +0 -8
  184. package/dist/StaffSupportTicketSuccess-FfnJXc_k.js +0 -12
  185. package/dist/TeamAttachmentsTab-D0DOmdnr.js +0 -64
  186. package/dist/TeamHistoryTab-wRpRizDE.js +0 -6
  187. package/dist/TeamList-hmP44hfw.js +0 -8
  188. package/dist/TeamMemberList-B16SuLwM.js +0 -7
  189. package/dist/TeamMemberParent-BJl8nBmP.js +0 -10
  190. package/dist/TeamNotesTab-BQN9niw-.js +0 -8
  191. package/dist/TeamParent-BI9ItLoY.js +0 -11
  192. package/dist/UserListPage-9jhUu3TH.js +0 -5
  193. package/dist/UserProfilePage-Dmxp7oqP.js +0 -8
  194. package/dist/VerifyEmail-DBKMZJMx.js +0 -10
  195. package/dist/ViewTeam-DEOe7wqT.js +0 -8
  196. package/dist/ViewTeamMember-B5U8kZBw.js +0 -7
  197. package/dist/src-DSF_hIBe.js.map +0 -1
  198. package/dist/useMutation-BLNuJoYl.js.map +0 -1
  199. package/dist/useRpcAuth-CJtq1dqM.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ResetPassword-DflPd8Qg.js","names":[],"sources":["../src/slices/auth/features/reset_password/reset_password_schema.ts","../src/slices/auth/features/reset_password/ResetPassword.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { resetPasswordInputSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type ResetPasswordForm = z.infer<typeof resetPasswordInputSchema>;\n\n// Enhance the schema with metadata\nexport const resetPasswordSchemaWithMetadata = withMetadata(\n resetPasswordInputSchema,\n 'resetPasswordSchema',\n {\n 'passwords.password': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'new-password',\n className: 'login-field',\n },\n 'passwords.password_confirm': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'new-password',\n className: 'login-field',\n },\n },\n);\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Reset Password</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\n\n <ZiniaSubmitButton submitText=\"Reset Password\" submittingText=\"Resetting Password...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport { resetPasswordSchemaWithMetadata } from './reset_password_schema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst token = route.params.token as string;\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(\n resetPasswordSchemaWithMetadata,\n {\n storeName: 'reset-password-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n },\n);\n\nconst { mutate: resetPasswordMutate } = useMutation(\n (api, input: z.infer<typeof resetPasswordSchemaWithMetadata> & { token: string }) =>\n api.passwordReset.resetPassword(input),\n {\n skipAuthCheck: true, // Reset password should work without authentication\n },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof resetPasswordSchemaWithMetadata>) => {\n const result = await resetPasswordMutate({\n ...data,\n token,\n });\n if (!result?.ok) throw new Error('Reset password failed');\n return result;\n};\n\n// Handle success\nconst handleSuccess = async (_data: { ok: boolean }) => {\n form.reset();\n await router.push(loginLink.value);\n toast.success('Password reset successful!');\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n toast.error(error instanceof Error ? error.message : 'Reset password failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;AAQA,MAAa,kCAAkC,aAC7C,0BACA,uBACA;CACE,sBAAsB;EACpB,WAAW;EACX,aAAa;EACb,UAAU;EACV,cAAc;EACd,WAAW;EACZ;CACD,8BAA8B;EAC5B,WAAW;EACX,aAAa;EACb,UAAU;EACV,cAAc;EACd,WAAW;EACZ;CACF,CACF;;;;;;;;;ECID,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,MAAM,OAAO;EAE3B,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAG/E,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QACpD,iCACA;GACE,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CACF;EAED,MAAM,EAAE,QAAQ,wBAAwB,aACrC,KAAK,UACJ,IAAI,cAAc,cAAc,MAAM,EACxC,EACE,eAAe,MAChB,CACF;EAGD,MAAM,eAAe,OAAO,SAA0D;GACpF,MAAM,SAAS,MAAM,oBAAoB;IACvC,GAAG;IACH;IACD,CAAC;AACF,OAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,wBAAwB;AACzD,UAAO;;EAIT,MAAM,gBAAgB,OAAO,UAA2B;AACtD,QAAK,OAAO;AACZ,SAAM,OAAO,KAAK,UAAU,MAAM;AAClC,SAAM,QAAQ,6BAA6B;;EAI7C,MAAM,eAAe,UAAmB;AACtC,SAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB;;;uBA1E7E,mBAgBM,OAhBN,YAgBM,CAAA,OAAA,OAAA,OAAA,KAfJ,mBAAmE,MAAA,EAA/D,OAAM,uCAAqC,EAAC,kBAAc,GAAA,GAE9D,YAYY,MAAA,UAAA,EAAA;IAZA,gBAAe;IAAe,WAAS;IAAgB,SAAO;;2BACxC;KAAhC,YAAgC,MAAA,MAAA,CAAA,uBAAA;KAChC,YAAuC,MAAA,MAAA,CAAA,8BAAA;KAEvC,YAAwF,MAAA,kBAAA,EAAA;MAArE,YAAW;MAAiB,gBAAe;;KAE9D,mBAKM,OALN,YAKM,CAJJ,mBAGI,KAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAAA,gBAHD,8BAED,GAAA,GAAA,YAAiE,iBAAA;MAAxD,OAAM;MAAoB,IAAI,UAAA;;6BAAgB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAL,SAAK,GAAA,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"ResetPassword-iVcY7eBY.js","names":[],"sources":["../src/slices/auth/features/reset_password/reset_password_schema.ts","../src/slices/auth/features/reset_password/ResetPassword.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { resetPasswordInputSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type ResetPasswordForm = z.infer<typeof resetPasswordInputSchema>;\n\n// Enhance the schema with metadata\nexport const resetPasswordSchemaWithMetadata = withMetadata(\n resetPasswordInputSchema,\n 'resetPasswordSchema',\n {\n 'passwords.password': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'new-password',\n className: 'login-field',\n },\n 'passwords.password_confirm': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'new-password',\n className: 'login-field',\n },\n },\n);\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Reset Password</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\n\n <ZiniaSubmitButton submitText=\"Reset Password\" submittingText=\"Resetting Password...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport { resetPasswordSchemaWithMetadata } from './reset_password_schema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst token = route.params.token as string;\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(\n resetPasswordSchemaWithMetadata,\n {\n storeName: 'reset-password-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n },\n);\n\nconst { mutate: resetPasswordMutate } = useMutation(\n (api, input: z.infer<typeof resetPasswordSchemaWithMetadata> & { token: string }) =>\n api.passwordReset.resetPassword(input),\n {\n skipAuthCheck: true, // Reset password should work without authentication\n },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof resetPasswordSchemaWithMetadata>) => {\n const result = await resetPasswordMutate({\n ...data,\n token,\n });\n if (!result?.ok) throw new Error('Reset password failed');\n return result;\n};\n\n// Handle success\nconst handleSuccess = async (_data: { ok: boolean }) => {\n form.reset();\n await router.push(loginLink.value);\n toast.success('Password reset successful!');\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n toast.error(error instanceof Error ? error.message : 'Reset password failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;AAQA,MAAa,kCAAkC,aAC7C,0BACA,uBACA;CACE,sBAAsB;EACpB,WAAW;EACX,aAAa;EACb,UAAU;EACV,cAAc;EACd,WAAW;EACZ;CACD,8BAA8B;EAC5B,WAAW;EACX,aAAa;EACb,UAAU;EACV,cAAc;EACd,WAAW;EACZ;CACF,CACF;;;;;;;;;ECID,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,MAAM,OAAO;EAE3B,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAG/E,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QACpD,iCACA;GACE,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CACF;EAED,MAAM,EAAE,QAAQ,wBAAwB,aACrC,KAAK,UACJ,IAAI,cAAc,cAAc,MAAM,EACxC,EACE,eAAe,MAChB,CACF;EAGD,MAAM,eAAe,OAAO,SAA0D;GACpF,MAAM,SAAS,MAAM,oBAAoB;IACvC,GAAG;IACH;IACD,CAAC;AACF,OAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,wBAAwB;AACzD,UAAO;;EAIT,MAAM,gBAAgB,OAAO,UAA2B;AACtD,QAAK,OAAO;AACZ,SAAM,OAAO,KAAK,UAAU,MAAM;AAClC,SAAM,QAAQ,6BAA6B;;EAI7C,MAAM,eAAe,UAAmB;AACtC,SAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB;;;uBA1E7E,mBAgBM,OAhBN,YAgBM,CAAA,OAAA,OAAA,OAAA,KAfJ,mBAAmE,MAAA,EAA/D,OAAM,uCAAqC,EAAC,kBAAc,GAAA,GAE9D,YAYY,MAAA,UAAA,EAAA;IAZA,gBAAe;IAAe,WAAS;IAAgB,SAAO;;2BACxC;KAAhC,YAAgC,MAAA,MAAA,CAAA,uBAAA;KAChC,YAAuC,MAAA,MAAA,CAAA,8BAAA;KAEvC,YAAwF,MAAA,kBAAA,EAAA;MAArE,YAAW;MAAiB,gBAAe;;KAE9D,mBAKM,OALN,YAKM,CAJJ,mBAGI,KAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAAA,gBAHD,8BAED,GAAA,GAAA,YAAiE,iBAAA;MAAxD,OAAM;MAAoB,IAAI,UAAA;;6BAAgB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAL,SAAK,GAAA,CAAA,EAAA,CAAA"}
@@ -0,0 +1,8 @@
1
+ import "./useRpcAuth-BFdprNWb.js";
2
+ import "./EnhancedRefreshTokenHandler-s8wUXtB5.js";
3
+ import "./useQueryCache-CUTrwJWX.js";
4
+ import "./useMutation-BXSu7_-s.js";
5
+ import "./AppLink-FcNGKgvG.js";
6
+ import { t as ResetPassword_default } from "./ResetPassword-iVcY7eBY.js";
7
+
8
+ export { ResetPassword_default as default };
@@ -1,65 +1,65 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import { t as useMutation } from "./useMutation-BLNuJoYl.js";
5
- import { t as useQuery } from "./useQuery-BzUGEOj0.js";
6
- import "./src-DSF_hIBe.js";
1
+ import "./useRpcAuth-BFdprNWb.js";
2
+ import "./EnhancedRefreshTokenHandler-s8wUXtB5.js";
3
+ import "./useQueryCache-CUTrwJWX.js";
4
+ import { t as useMutation } from "./useMutation-BXSu7_-s.js";
5
+ import { t as useQuery } from "./useQuery-DownvLRA.js";
6
+ import "./src-BXO0PrFd.js";
7
7
  import "./AppLink-FcNGKgvG.js";
8
- import { p as useInjectedPinnedPresets } from "./saved_filter-erjEgsdK.js";
8
+ import { p as useInjectedPinnedPresets } from "./saved_filter-YIncsdws.js";
9
9
  import { t as ConfirmDialog_default } from "./ConfirmDialog-DjthOYU6.js";
10
- import "./InlineAttachments-DAn_QknY.js";
10
+ import "./InlineAttachments-DvqCOd6U.js";
11
11
  import "./TeamMembersTab-BigqpBDH.js";
12
12
  import "./Appearance-shr0Aql0.js";
13
- import "./Signup-KuiKHB4h.js";
13
+ import "./Signup-D6vnyS4w.js";
14
14
  import "./useBreadcrumbs-CPWXm0hm.js";
15
- import "./ExternalLinkIcon-BKVV5Gjm.js";
15
+ import "./useAuthFlowNextStep-zlvxflBZ.js";
16
16
  import "./FieldsetSection-Br_sygWW.js";
17
17
  import "./RecordVersionViewer-DKIdX_BX.js";
18
18
  import "./ZiniaContainer-BPIfQOc7.js";
19
- import "./userAuthorized-3RiCDXxr.js";
20
- import "./UserProfilePage-BYitd7QV.js";
21
- import "./ChangePasswordPage-Dy8lFUcI.js";
19
+ import "./userAuthorized-qmzUYDa-.js";
20
+ import "./UserProfilePage-D7FNmca1.js";
21
+ import "./ChangePasswordPage-CR91NZP4.js";
22
22
  import "./teamMetadata-NTjPt89L.js";
23
- import "./team_memberRoutes-BgjY9Kwq.js";
24
- import "./teamRoutes-CSBq1DNq.js";
25
- import "./CreateTeamForm-bpLbK18g.js";
26
- import "./EditTeamForm-RBO99ocN.js";
27
- import "./TeamHistoryTab-CxzA4u_G.js";
28
- import "./TeamList-DXQj_Omo.js";
29
- import "./TeamNotesTab-Cego-QT3.js";
30
- import "./TeamParent-6JhqsYaO.js";
31
- import "./ViewTeam-ByZdYEJG.js";
23
+ import "./team_memberRoutes-mO1f-Y4o.js";
24
+ import "./teamRoutes-Aa9aBVCa.js";
25
+ import "./CreateTeamForm-ClisfzsU.js";
26
+ import "./EditTeamForm-B4p-C-8i.js";
27
+ import "./TeamHistoryTab-5kNQ_XAq.js";
28
+ import "./TeamList-P7rVlBuQ.js";
29
+ import "./TeamNotesTab-BREl3Vr0.js";
30
+ import "./TeamParent-D35VUiio.js";
31
+ import "./ViewTeam-BbsTsjAy.js";
32
32
  import "./teamMemberMetadata-C4urCwBU.js";
33
- import "./CreateTeamMemberForm-DeUyXnVa.js";
34
- import "./EditTeamMemberForm-D9cofrUM.js";
35
- import "./TeamMemberList-BYUANoBg.js";
36
- import "./TeamMemberParent-DmYcHU3n.js";
37
- import "./ViewTeamMember-DqWZ3F_h.js";
38
- import "./customerSupportTicketRoutes-DvfXGaSC.js";
39
- import "./staffSupportTicketRoutes-73ceKhL-.js";
33
+ import "./CreateTeamMemberForm-B3jxlAsC.js";
34
+ import "./EditTeamMemberForm-D6vf9hp-.js";
35
+ import "./TeamMemberList-DyfXcR6F.js";
36
+ import "./TeamMemberParent-2zISixbT.js";
37
+ import "./ViewTeamMember-Dsl2GKI1.js";
38
+ import "./customerSupportTicketRoutes-38JuLJGP.js";
39
+ import "./staffSupportTicketRoutes-BZrj4aMG.js";
40
40
  import "./TimelineSystemEvent-D5fkhkZT.js";
41
- import "./CustomerCreateSupportTicketForm-IefplMnK.js";
42
- import "./CustomerSupportTicketParent-rl4Ym8oa.js";
43
- import "./CustomerSupportTicketSuccess-RQskseXP.js";
44
- import "./StaffCreateSupportTicketForm-75Bo0jdz.js";
41
+ import "./CustomerCreateSupportTicketForm-Cul4aVjB.js";
42
+ import "./CustomerSupportTicketParent-D9FuZjPz.js";
43
+ import "./CustomerSupportTicketSuccess-B4WR8Zfn.js";
44
+ import "./StaffCreateSupportTicketForm-B1YioWlS.js";
45
45
  import "./SupportTicketDevLifecycleBadge-D8-Cv1Np.js";
46
- import "./StaffSupportTicketParent-DPvdLUii.js";
47
- import "./StaffSupportTicketSuccess-BYoBXx1i.js";
48
- import "./LoginForm-DEgTB9RF.js";
49
- import "./useEmailVerificationChannel-C76Gnyi1.js";
50
- import "./ForgotPassword-DZ-d8rWX.js";
51
- import "./ResetPassword-DflPd8Qg.js";
52
- import "./Logout-Bb2xe5BM.js";
46
+ import "./StaffSupportTicketParent-CZllER18.js";
47
+ import "./StaffSupportTicketSuccess-DTMToAq2.js";
48
+ import "./LoginForm-CjF4NSgM.js";
49
+ import "./useEmailVerificationChannel-DYiMSAES.js";
50
+ import "./ForgotPassword-BykH9B9R.js";
51
+ import "./ResetPassword-iVcY7eBY.js";
52
+ import "./Logout-DmpC8Rwh.js";
53
53
  import "./mfaSchema-Ukqzdyck.js";
54
- import "./MfaSetup-m080C6iX.js";
55
- import "./MfaVerify-D8Ch-8hN.js";
56
- import "./VerifyEmail-Cy2s4yP0.js";
57
- import "./UserListPage-DelzxCID.js";
58
- import "./CreateUserPage-CqKcY7_X.js";
59
- import "./EditUserPage-DGuV8pzp.js";
60
- import "./CreditTransactionHistory-mcacl2xG.js";
61
- import "./CreditBalanceDashboard-BEsOr0Rw.js";
62
- import "./CreditManagement-DiVSMbWZ.js";
54
+ import "./MfaSetup-DCLKIMaS.js";
55
+ import "./MfaVerify-Dm2Yc0Da.js";
56
+ import "./VerifyEmail-KCti4rzf.js";
57
+ import "./UserListPage-CCl0K7Gk.js";
58
+ import "./CreateUserPage-BcCIat_l.js";
59
+ import "./EditUserPage-Dy61CCle.js";
60
+ import "./CreditTransactionHistory-mz-QIKUG.js";
61
+ import "./CreditBalanceDashboard-CJr1yOjW.js";
62
+ import "./CreditManagement-BbDEviZx.js";
63
63
  import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, renderList, resolveComponent, toDisplayString, unref, vModelText, withCtx, withDirectives, withKeys } from "vue";
64
64
 
65
65
  //#region src/slices/saved_filter/SavedFiltersPage.vue
@@ -453,4 +453,4 @@ var SavedFiltersPage_default = _sfc_main;
453
453
 
454
454
  //#endregion
455
455
  export { SavedFiltersPage_default as default };
456
- //# sourceMappingURL=SavedFiltersPage-ey8wOr0T.js.map
456
+ //# sourceMappingURL=SavedFiltersPage-Y1T18UAH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SavedFiltersPage-ey8wOr0T.js","names":["CONTEXT_LABELS: Record<string, string>"],"sources":["../src/slices/saved_filter/SavedFiltersPage.vue"],"sourcesContent":["<template>\n <div class=\"max-w-4xl mx-auto\">\n <h1 class=\"text-2xl font-bold mb-6\">Saved Filters</h1>\n\n <div v-if=\"loading\" class=\"flex justify-center py-12\">\n <span class=\"loading loading-spinner loading-lg\" />\n </div>\n\n <template v-else>\n <!-- Favorites (pinned) section with reorder -->\n <section v-if=\"pinnedPresets.length > 0\" class=\"mb-8\">\n <h2 class=\"text-lg font-semibold mb-3 flex items-center gap-2\">\n <svg\n class=\"w-5 h-5 text-primary\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n Favorites\n </h2>\n <p class=\"text-sm text-base-content/70 mb-3\">\n Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder.\n </p>\n <ul class=\"space-y-2\">\n <li\n v-for=\"(preset, idx) in pinnedPresets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <div class=\"flex flex-col gap-0.5 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === 0\"\n title=\"Move up\"\n @click=\"movePinned(idx, -1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === pinnedPresets.length - 1\"\n title=\"Move down\"\n @click=\"movePinned(idx, 1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <span class=\"text-xs text-base-content/60 shrink-0\">\n {{ contextLabel(preset.context) }}\n </span>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-primary\"\n title=\"Unpin\"\n :disabled=\"unpinning\"\n @click=\"handleUnpin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </li>\n </ul>\n </section>\n\n <!-- All presets grouped by path -->\n <section>\n <h2 class=\"text-lg font-semibold mb-3\">All Presets</h2>\n <p v-if=\"groupedPresets.length === 0\" class=\"text-base-content/70 text-sm\">\n No saved presets yet. Use the Presets button on any list page to save your filters.\n </p>\n <div v-else class=\"space-y-6\">\n <div\n v-for=\"[routePath, presets] in groupedPresets\"\n :key=\"routePath\"\n class=\"space-y-2\"\n >\n <h3 class=\"text-sm font-medium text-base-content/80 uppercase tracking-wide\">\n {{ contextLabelFromPath(routePath) }}\n </h3>\n <ul class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <div class=\"flex gap-1 shrink-0\">\n <button\n v-if=\"!isPinned(preset.id)\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n :title=\"canPinMore ? 'Pin to favorites' : 'Maximum 5 pinned'\"\n :disabled=\"!canPinMore || pinning\"\n @click=\"handlePin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n </div>\n </div>\n </section>\n </template>\n\n <!-- Delete confirmation modal -->\n <ConfirmDialog\n v-model=\"showDeleteConfirm\"\n title=\"Delete preset?\"\n confirm-text=\"Delete\"\n cancel-text=\"Cancel\"\n processing-text=\"Deleting...\"\n confirm-button-class=\"btn-error\"\n :is-processing=\"deleting\"\n @confirm=\"confirmDelete\"\n @cancel=\"presetToDelete = null\"\n >\n <template #message>\n <p>\n Are you sure you want to delete \"{{ presetToDelete?.name }}\"?\n This cannot be undone.\n </p>\n </template>\n </ConfirmDialog>\n\n <!-- Rename modal / inline could stay as is -->\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useMutation, useQuery } from '@dragonmastery/dragoncore-vue';\nimport { computed, nextTick, ref } from 'vue';\nimport ConfirmDialog from '../../components/ConfirmDialog.vue';\nimport { useInjectedPinnedPresets } from './usePinnedPresets';\n\nconst CACHE_KEY_ALL = 'saved-filters:all';\n\nconst { data: allPresets, loading, refetch: refetchAllPresets } = useQuery(\n (api) => api.savedFilters.listAllSavedFilters(),\n { cacheKey: CACHE_KEY_ALL, staleTime: 24 * 60 * 60 * 1000 },\n);\n\nconst injectedPinned = useInjectedPinnedPresets();\nconst pinnedPresets = computed(() => injectedPinned.pinned.value ?? []);\n\nconst groupedPresets = computed(() => {\n const groups = new Map<string, SavedFilterReadDto[]>();\n for (const preset of allPresets.value ?? []) {\n const key = preset.route_path || preset.context || 'other';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(preset);\n }\n return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst pinnedIdsSet = computed(() => new Set(pinnedPresets.value.map((p) => p.id)));\nconst canPinMore = computed(() => pinnedPresets.value.length < 5);\n\nfunction isPinned(id: string) {\n return pinnedIdsSet.value.has(id);\n}\n\nfunction getPresetLink(preset: SavedFilterReadDto) {\n return {\n path: preset.route_path,\n query: preset.filters ?? {},\n };\n}\n\nconst CONTEXT_LABELS: Record<string, string> = {\n tracker: 'Trackers',\n followup: 'Followups',\n support_ticket_staff: 'Staff Support Tickets',\n support_ticket_customer: 'Customer Support Tickets',\n};\n\nfunction contextLabel(context: string): string {\n return CONTEXT_LABELS[context] ?? context;\n}\n\nfunction contextLabelFromPath(routePath: string): string {\n if (routePath.startsWith('/trackers')) return 'Trackers';\n if (routePath.startsWith('/followups')) return 'Followups';\n if (routePath.startsWith('/support-tickets/staff')) return 'Staff Support Tickets';\n if (routePath.startsWith('/support-tickets')) return 'Customer Support Tickets';\n return routePath || 'Other';\n}\n\nconst { mutate: reorderPins, loading: reordering } = useMutation(\n (api, ids: string[]) => api.savedFilters.reorderPinnedPresets(ids),\n { invalidate: 'pinned-presets' },\n);\n\nconst { mutate: updatePreset, loading: renaming } = useMutation(\n (api, input: { id: string; name: string }) =>\n api.savedFilters.updateSavedFilter({ id: input.id, name: input.name }),\n { invalidate: /^saved-filters:/ },\n);\n\nconst { mutate: deletePreset, loading: deleting } = useMutation(\n (api, id: string) => api.savedFilters.deleteSavedFilter(id),\n { invalidate: /^saved-filters:|^pinned-presets/ },\n);\n\nconst pinning = ref(false);\nconst unpinning = ref(false);\n\nasync function handlePin(preset: SavedFilterReadDto) {\n pinning.value = true;\n try {\n await injectedPinned.pinPreset(preset);\n } finally {\n pinning.value = false;\n }\n}\n\nasync function handleUnpin(preset: SavedFilterReadDto) {\n unpinning.value = true;\n try {\n await injectedPinned.unpinPreset(preset.id);\n } finally {\n unpinning.value = false;\n }\n}\n\nasync function movePinned(idx: number, delta: number) {\n const list = [...pinnedPresets.value];\n const newIdx = idx + delta;\n if (newIdx < 0 || newIdx >= list.length) return;\n [list[idx], list[newIdx]] = [list[newIdx]!, list[idx]!];\n try {\n await reorderPins(list.map((p) => p.id));\n await injectedPinned.refetchPinned();\n } catch {\n // Error handled by mutation\n }\n}\n\nconst showDeleteConfirm = ref(false);\nconst presetToDelete = ref<SavedFilterReadDto | null>(null);\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n presetToDelete.value = preset;\n showDeleteConfirm.value = true;\n}\n\nasync function confirmDelete() {\n if (!presetToDelete.value) return;\n try {\n await deletePreset(presetToDelete.value.id);\n if (isPinned(presetToDelete.value.id)) {\n await injectedPinned.unpinPreset(presetToDelete.value.id);\n }\n await refetchAllPresets();\n presetToDelete.value = null;\n showDeleteConfirm.value = false;\n } catch {\n // Error handled by mutation\n }\n}\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n try {\n await updatePreset({ id: presetId, name });\n cancelRename();\n await refetchAllPresets();\n if (isPinned(presetId)) {\n await injectedPinned.refetchPinned();\n }\n } catch {\n // Error handled by mutation\n }\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"SavedFiltersPage-Y1T18UAH.js","names":["CONTEXT_LABELS: Record<string, string>"],"sources":["../src/slices/saved_filter/SavedFiltersPage.vue"],"sourcesContent":["<template>\n <div class=\"max-w-4xl mx-auto\">\n <h1 class=\"text-2xl font-bold mb-6\">Saved Filters</h1>\n\n <div v-if=\"loading\" class=\"flex justify-center py-12\">\n <span class=\"loading loading-spinner loading-lg\" />\n </div>\n\n <template v-else>\n <!-- Favorites (pinned) section with reorder -->\n <section v-if=\"pinnedPresets.length > 0\" class=\"mb-8\">\n <h2 class=\"text-lg font-semibold mb-3 flex items-center gap-2\">\n <svg\n class=\"w-5 h-5 text-primary\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n Favorites\n </h2>\n <p class=\"text-sm text-base-content/70 mb-3\">\n Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder.\n </p>\n <ul class=\"space-y-2\">\n <li\n v-for=\"(preset, idx) in pinnedPresets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <div class=\"flex flex-col gap-0.5 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === 0\"\n title=\"Move up\"\n @click=\"movePinned(idx, -1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === pinnedPresets.length - 1\"\n title=\"Move down\"\n @click=\"movePinned(idx, 1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <span class=\"text-xs text-base-content/60 shrink-0\">\n {{ contextLabel(preset.context) }}\n </span>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-primary\"\n title=\"Unpin\"\n :disabled=\"unpinning\"\n @click=\"handleUnpin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </li>\n </ul>\n </section>\n\n <!-- All presets grouped by path -->\n <section>\n <h2 class=\"text-lg font-semibold mb-3\">All Presets</h2>\n <p v-if=\"groupedPresets.length === 0\" class=\"text-base-content/70 text-sm\">\n No saved presets yet. Use the Presets button on any list page to save your filters.\n </p>\n <div v-else class=\"space-y-6\">\n <div\n v-for=\"[routePath, presets] in groupedPresets\"\n :key=\"routePath\"\n class=\"space-y-2\"\n >\n <h3 class=\"text-sm font-medium text-base-content/80 uppercase tracking-wide\">\n {{ contextLabelFromPath(routePath) }}\n </h3>\n <ul class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <div class=\"flex gap-1 shrink-0\">\n <button\n v-if=\"!isPinned(preset.id)\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n :title=\"canPinMore ? 'Pin to favorites' : 'Maximum 5 pinned'\"\n :disabled=\"!canPinMore || pinning\"\n @click=\"handlePin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n </div>\n </div>\n </section>\n </template>\n\n <!-- Delete confirmation modal -->\n <ConfirmDialog\n v-model=\"showDeleteConfirm\"\n title=\"Delete preset?\"\n confirm-text=\"Delete\"\n cancel-text=\"Cancel\"\n processing-text=\"Deleting...\"\n confirm-button-class=\"btn-error\"\n :is-processing=\"deleting\"\n @confirm=\"confirmDelete\"\n @cancel=\"presetToDelete = null\"\n >\n <template #message>\n <p>\n Are you sure you want to delete \"{{ presetToDelete?.name }}\"?\n This cannot be undone.\n </p>\n </template>\n </ConfirmDialog>\n\n <!-- Rename modal / inline could stay as is -->\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useMutation, useQuery } from '@dragonmastery/dragoncore-vue';\nimport { computed, nextTick, ref } from 'vue';\nimport ConfirmDialog from '../../components/ConfirmDialog.vue';\nimport { useInjectedPinnedPresets } from './usePinnedPresets';\n\nconst CACHE_KEY_ALL = 'saved-filters:all';\n\nconst { data: allPresets, loading, refetch: refetchAllPresets } = useQuery(\n (api) => api.savedFilters.listAllSavedFilters(),\n { cacheKey: CACHE_KEY_ALL, staleTime: 24 * 60 * 60 * 1000 },\n);\n\nconst injectedPinned = useInjectedPinnedPresets();\nconst pinnedPresets = computed(() => injectedPinned.pinned.value ?? []);\n\nconst groupedPresets = computed(() => {\n const groups = new Map<string, SavedFilterReadDto[]>();\n for (const preset of allPresets.value ?? []) {\n const key = preset.route_path || preset.context || 'other';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(preset);\n }\n return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst pinnedIdsSet = computed(() => new Set(pinnedPresets.value.map((p) => p.id)));\nconst canPinMore = computed(() => pinnedPresets.value.length < 5);\n\nfunction isPinned(id: string) {\n return pinnedIdsSet.value.has(id);\n}\n\nfunction getPresetLink(preset: SavedFilterReadDto) {\n return {\n path: preset.route_path,\n query: preset.filters ?? {},\n };\n}\n\nconst CONTEXT_LABELS: Record<string, string> = {\n tracker: 'Trackers',\n followup: 'Followups',\n support_ticket_staff: 'Staff Support Tickets',\n support_ticket_customer: 'Customer Support Tickets',\n};\n\nfunction contextLabel(context: string): string {\n return CONTEXT_LABELS[context] ?? context;\n}\n\nfunction contextLabelFromPath(routePath: string): string {\n if (routePath.startsWith('/trackers')) return 'Trackers';\n if (routePath.startsWith('/followups')) return 'Followups';\n if (routePath.startsWith('/support-tickets/staff')) return 'Staff Support Tickets';\n if (routePath.startsWith('/support-tickets')) return 'Customer Support Tickets';\n return routePath || 'Other';\n}\n\nconst { mutate: reorderPins, loading: reordering } = useMutation(\n (api, ids: string[]) => api.savedFilters.reorderPinnedPresets(ids),\n { invalidate: 'pinned-presets' },\n);\n\nconst { mutate: updatePreset, loading: renaming } = useMutation(\n (api, input: { id: string; name: string }) =>\n api.savedFilters.updateSavedFilter({ id: input.id, name: input.name }),\n { invalidate: /^saved-filters:/ },\n);\n\nconst { mutate: deletePreset, loading: deleting } = useMutation(\n (api, id: string) => api.savedFilters.deleteSavedFilter(id),\n { invalidate: /^saved-filters:|^pinned-presets/ },\n);\n\nconst pinning = ref(false);\nconst unpinning = ref(false);\n\nasync function handlePin(preset: SavedFilterReadDto) {\n pinning.value = true;\n try {\n await injectedPinned.pinPreset(preset);\n } finally {\n pinning.value = false;\n }\n}\n\nasync function handleUnpin(preset: SavedFilterReadDto) {\n unpinning.value = true;\n try {\n await injectedPinned.unpinPreset(preset.id);\n } finally {\n unpinning.value = false;\n }\n}\n\nasync function movePinned(idx: number, delta: number) {\n const list = [...pinnedPresets.value];\n const newIdx = idx + delta;\n if (newIdx < 0 || newIdx >= list.length) return;\n [list[idx], list[newIdx]] = [list[newIdx]!, list[idx]!];\n try {\n await reorderPins(list.map((p) => p.id));\n await injectedPinned.refetchPinned();\n } catch {\n // Error handled by mutation\n }\n}\n\nconst showDeleteConfirm = ref(false);\nconst presetToDelete = ref<SavedFilterReadDto | null>(null);\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n presetToDelete.value = preset;\n showDeleteConfirm.value = true;\n}\n\nasync function confirmDelete() {\n if (!presetToDelete.value) return;\n try {\n await deletePreset(presetToDelete.value.id);\n if (isPinned(presetToDelete.value.id)) {\n await injectedPinned.unpinPreset(presetToDelete.value.id);\n }\n await refetchAllPresets();\n presetToDelete.value = null;\n showDeleteConfirm.value = false;\n } catch {\n // Error handled by mutation\n }\n}\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n try {\n await updatePreset({ id: presetId, name });\n cancelRename();\n await refetchAllPresets();\n if (isPinned(presetId)) {\n await injectedPinned.refetchPinned();\n }\n } catch {\n // Error handled by mutation\n }\n}\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import "./useRpcAuth-BFdprNWb.js";
2
+ import "./EnhancedRefreshTokenHandler-s8wUXtB5.js";
3
+ import "./useQueryCache-CUTrwJWX.js";
4
+ import "./useMutation-BXSu7_-s.js";
5
+ import "./AppLink-FcNGKgvG.js";
6
+ import { t as Signup_default } from "./Signup-D6vnyS4w.js";
7
+ import "./useAuthFlowNextStep-zlvxflBZ.js";
8
+ import "./useEmailVerificationChannel-DYiMSAES.js";
9
+
10
+ export { Signup_default as default };
@@ -1,8 +1,9 @@
1
- import { d as useEnv, o as useUserSessionStore } from "./useRpcAuth-CJtq1dqM.js";
2
- import { t as useMutation } from "./useMutation-BLNuJoYl.js";
1
+ import { o as useUserSessionStore } from "./useRpcAuth-BFdprNWb.js";
2
+ import { t as useMutation } from "./useMutation-BXSu7_-s.js";
3
3
  import { t as AppLink_default } from "./AppLink-FcNGKgvG.js";
4
4
  import { a as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-DnezAxBA.js";
5
- import { t as useEmailVerificationChannel } from "./useEmailVerificationChannel-C76Gnyi1.js";
5
+ import { n as ExternalLinkIcon_default, t as useAuthFlowNextStep } from "./useAuthFlowNextStep-zlvxflBZ.js";
6
+ import { t as useEmailVerificationChannel } from "./useEmailVerificationChannel-DYiMSAES.js";
6
7
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, openBlock, ref, renderList, toDisplayString, unref, withCtx } from "vue";
7
8
  import { jwtDecode } from "jwt-decode";
8
9
  import { useRoute, useRouter } from "vue-router";
@@ -75,11 +76,12 @@ const _hoisted_5 = {
75
76
  };
76
77
  const _hoisted_6 = { class: "font-medium mb-2" };
77
78
  const _hoisted_7 = { class: "list-disc list-inside space-y-1 text-sm text-base-content/80" };
78
- const _hoisted_8 = {
79
+ const _hoisted_8 = ["href"];
80
+ const _hoisted_9 = {
79
81
  key: 0,
80
82
  class: "mt-2 text-sm text-base-content/70"
81
83
  };
82
- const _hoisted_9 = { class: "text-center mt-2" };
84
+ const _hoisted_10 = { class: "text-center mt-2" };
83
85
  const _sfc_main = /* @__PURE__ */ defineComponent({
84
86
  __name: "Signup",
85
87
  setup(__props) {
@@ -91,11 +93,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
91
93
  const sessionStore = useUserSessionStore();
92
94
  const route = useRoute();
93
95
  const router = useRouter();
94
- const { emailVerificationMode } = useEnv();
96
+ const { getNextStep } = useAuthFlowNextStep();
95
97
  const returnUrl = computed(() => route.query.returnUrl);
96
98
  const loginLink = computed(() => withReturnUrl("/auth/login", returnUrl.value));
97
99
  const awaitingVerification = ref(false);
98
- const getSignupMetadata = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupMetadata);
100
+ const getSignupMetadata = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupMetadata, () => ({}));
101
+ const getSignupHeaders = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupHeaders, () => ({}));
99
102
  const signupConsentBeforeText = inject("signupConsentBeforeText", "By signing up you agree to these terms:");
100
103
  const signupConsentAfterText = inject("signupConsentAfterText", "After you click Sign Up, we'll show you each document to review and accept.");
101
104
  const legalLinks = computed(() => {
@@ -114,7 +117,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
114
117
  });
115
118
  const { mutate: signupInitiateMutate } = useMutation((api, input) => api.users.signupInitiate(input), {
116
119
  skipAuthCheck: true,
117
- credentials: "include"
120
+ credentials: "include",
121
+ extraHeaders: () => getSignupHeaders?.() ?? {}
118
122
  });
119
123
  const handleSubmit = async (data) => {
120
124
  const metadata = {
@@ -136,17 +140,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
136
140
  sessionStore.setSession(data.user_details_token);
137
141
  sessionStore.setAccessToken(data.access_token);
138
142
  form.reset();
139
- const defaultRedirect = getValidReturnUrl(route, "/");
140
- const redirectTo = emailVerificationMode !== "disabled" ? (() => {
141
- try {
142
- return jwtDecode(data.user_details_token).details?.user?.email_verified ?? true ? defaultRedirect : withReturnUrl("/auth/verify-email", returnUrl.value);
143
- } catch {
144
- return defaultRedirect;
145
- }
146
- })() : defaultRedirect;
143
+ let redirectTo;
144
+ try {
145
+ const user = jwtDecode(data.user_details_token).details?.user;
146
+ redirectTo = getNextStep(user);
147
+ } catch {
148
+ redirectTo = getValidReturnUrl(route, "/");
149
+ }
147
150
  await router.push(redirectTo);
148
- const wentToVerify = typeof redirectTo === "string" && redirectTo.startsWith("/auth/verify-email");
149
- toast.success(!wentToVerify ? "Registration successful! You are now logged in." : "Registration successful! Please check your email to verify your account.");
150
151
  };
151
152
  const handleError = (error) => {
152
153
  if (isEmailVerificationRequiredError(error)) return;
@@ -171,21 +172,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
171
172
  showConsentSection.value ? (openBlock(), createElementBlock("div", _hoisted_5, [
172
173
  createElementVNode("p", _hoisted_6, toDisplayString(unref(signupConsentBeforeText)), 1),
173
174
  createElementVNode("ul", _hoisted_7, [(openBlock(true), createElementBlock(Fragment, null, renderList(legalLinks.value, (link) => {
174
- return openBlock(), createElementBlock("li", { key: link.path }, [createVNode(AppLink_default, {
175
- to: link.path,
176
- class: "link link-accent"
177
- }, {
178
- default: withCtx(() => [createTextVNode(toDisplayString(link.label), 1)]),
179
- _: 2
180
- }, 1032, ["to"])]);
175
+ return openBlock(), createElementBlock("li", { key: link.path }, [createElementVNode("a", {
176
+ href: unref(router).resolve(link.path).href,
177
+ target: "_blank",
178
+ rel: "noopener noreferrer",
179
+ class: "link link-accent inline-flex items-center gap-1.5"
180
+ }, [createTextVNode(toDisplayString(link.label) + " ", 1), createVNode(ExternalLinkIcon_default, { size: "sm" })], 8, _hoisted_8)]);
181
181
  }), 128))]),
182
- unref(signupConsentAfterText) ? (openBlock(), createElementBlock("p", _hoisted_8, toDisplayString(unref(signupConsentAfterText)), 1)) : createCommentVNode("v-if", true)
182
+ unref(signupConsentAfterText) ? (openBlock(), createElementBlock("p", _hoisted_9, toDisplayString(unref(signupConsentAfterText)), 1)) : createCommentVNode("v-if", true)
183
183
  ])) : createCommentVNode("v-if", true),
184
184
  createVNode(unref(ZiniaSubmitButton), {
185
185
  submitText: "Sign Up",
186
186
  submittingText: "Signing up..."
187
187
  }),
188
- createElementVNode("div", _hoisted_9, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
188
+ createElementVNode("div", _hoisted_10, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
189
189
  class: "link-accent link",
190
190
  to: loginLink.value
191
191
  }, {
@@ -203,4 +203,4 @@ var Signup_default = _sfc_main;
203
203
 
204
204
  //#endregion
205
205
  export { signupSchemaWithMetadata as n, SIGNUP_EXTENSIBILITY_KEYS as r, Signup_default as t };
206
- //# sourceMappingURL=Signup-KuiKHB4h.js.map
206
+ //# sourceMappingURL=Signup-D6vnyS4w.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signup-D6vnyS4w.js","names":["payload: SignupInitiateInputDto","redirectTo: string"],"sources":["../src/slices/auth/signupExtensibilityKeys.ts","../src/slices/auth/utils/isEmailVerificationRequiredError.ts","../src/slices/auth/features/signup/signupSchema.ts","../src/slices/auth/features/signup/Signup.vue"],"sourcesContent":["import type { InjectionKey } from 'vue';\n\n/** Injection keys for signup extensibility. Consumer can provide these to supply metadata/headers from their app. */\nexport const SIGNUP_EXTENSIBILITY_KEYS = {\n /** Returns metadata to merge into signupInitiate payload (e.g. { referral_tag: route.query.ref }). */\n getSignupMetadata: Symbol('getSignupMetadata') as InjectionKey<\n () => Record<string, unknown>\n >,\n /** Returns headers to send with signup requests (e.g. { 'X-Referral-Tag': route.query.ref }). */\n getSignupHeaders: Symbol('getSignupHeaders') as InjectionKey<() => HeadersInit>,\n};\n","/**\n * Detects if an error indicates that email verification is required before login.\n * Used in signup flow when auto-login after signup fails due to unverified email.\n */\nexport function isEmailVerificationRequiredError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const e = error as {\n error_type?: string;\n error_name?: string;\n name?: string;\n message?: string;\n };\n if (\n e.error_type === 'EmailVerificationRequiredError' ||\n e.error_name === 'EmailVerificationRequiredError' ||\n e.name === 'EmailVerificationRequiredError'\n ) {\n return true;\n }\n const msg = typeof e.message === 'string' ? e.message : '';\n return msg.includes('Please verify your email before logging in');\n}\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { signupInitiateSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the signup form type (signupInitiate: email + passwords only)\nexport type SignupForm = z.infer<typeof signupInitiateSchema>;\n\n// Enhance the schema with metadata\nexport const signupSchemaWithMetadata = withMetadata(signupInitiateSchema, 'signupInitiateSchema', {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'email',\n className: 'login-field',\n autofocus: true,\n },\n 'passwords.password': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n 'passwords.password_confirm': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n});\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Sign Up</h1>\n\n <div\n v-if=\"awaitingVerification\"\n class=\"space-y-4 text-center\"\n >\n <p class=\"text-base-content/80\">\n We sent a verification link to your email address. Click the link to verify your account,\n then you can continue.\n </p>\n <p class=\"text-sm text-base-content/60\">\n If you opened the link in another tab, we'll redirect you automatically when verification\n completes.\n </p>\n </div>\n\n <div v-else-if=\"declinedMessage\" class=\"mb-4\">\n <div class=\"alert alert-warning\">\n <span>{{ declinedMessage }}</span>\n </div>\n </div>\n\n <ZiniaForm\n v-if=\"!awaitingVerification\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n >\n <zinia.EmailField />\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\n\n <div\n v-if=\"showConsentSection\"\n class=\"mb-6 p-4 rounded-lg bg-base-100 border border-base-300\"\n >\n <p class=\"font-medium mb-2\">{{ signupConsentBeforeText }}</p>\n <ul class=\"list-disc list-inside space-y-1 text-sm text-base-content/80\">\n <li\n v-for=\"link in legalLinks\"\n :key=\"link.path\"\n >\n <a\n :href=\"router.resolve(link.path).href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"link link-accent inline-flex items-center gap-1.5\"\n >\n {{ link.label }}\n <ExternalLinkIcon size=\"sm\" />\n </a>\n </li>\n </ul>\n <p\n v-if=\"signupConsentAfterText\"\n class=\"mt-2 text-sm text-base-content/70\"\n >\n {{ signupConsentAfterText }}\n </p>\n </div>\n\n <ZiniaSubmitButton submitText=\"Sign Up\" submittingText=\"Signing up...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n SignupInitiateInputDto,\n SignupInitiateResponseDto,\n} from '@dragonmastery/dragoncore-shared';\nimport type { UserDetailsTokenPayload } from '../../../../lib/models/userSession';\nimport AppLink from '../../../../components/AppLink.vue';\nimport ExternalLinkIcon from '../../../../components/ui/ExternalLinkIcon.vue';\nimport { SIGNUP_EXTENSIBILITY_KEYS } from '../../signupExtensibilityKeys';\nimport { useAuthFlowNextStep } from '../../../../composables/useAuthFlowNextStep';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useEmailVerificationChannel } from '../../useEmailVerificationChannel';\nimport { isEmailVerificationRequiredError } from '../../utils/isEmailVerificationRequiredError';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { jwtDecode } from 'jwt-decode';\nimport { computed, inject, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { signupSchemaWithMetadata } from './signupSchema';\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(signupSchemaWithMetadata, {\n storeName: 'signup-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst sessionStore = useUserSessionStore();\nconst route = useRoute();\nconst router = useRouter();\nconst { getNextStep } = useAuthFlowNextStep();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst awaitingVerification = ref(false);\n\nconst getSignupMetadata = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupMetadata, () => ({}));\nconst getSignupHeaders = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupHeaders, () => ({}));\nconst signupConsentBeforeText = inject<string>(\n 'signupConsentBeforeText',\n 'By signing up you agree to these terms:',\n);\nconst signupConsentAfterText = inject<string>(\n 'signupConsentAfterText',\n \"After you click Sign Up, we'll show you each document to review and accept.\",\n);\n\n// Legal routes - auto-collected from router (meta.legal: true) for the consent preview\nconst legalLinks = computed(() => {\n const routes = router.getRoutes();\n return routes\n .filter((r) => r.meta?.legal === true)\n .map((r) => {\n const resolved = router.resolve({ name: r.name as string });\n return {\n path: resolved.path,\n label: (r.meta?.title as string) ?? (r.name as string) ?? r.path,\n };\n })\n .sort((a, b) => a.path.localeCompare(b.path));\n});\n\nconst showConsentSection = computed(() => legalLinks.value.length > 0);\n\n// Show declined message when returning from consent flow\nconst declinedMessage = computed(() => {\n const declined = route.query.declined;\n if (declined === '1' || declined === 'true') {\n return 'You declined the consent. Your account was not created.';\n }\n return null;\n});\n\nconst { mutate: signupInitiateMutate } = useMutation<\n import('@dragonmastery/dragoncore-shared').DragoncoreApi,\n SignupInitiateInputDto,\n SignupInitiateResponseDto\n>(\n (api, input: SignupInitiateInputDto) => api.users.signupInitiate(input),\n {\n skipAuthCheck: true,\n credentials: 'include',\n extraHeaders: () => getSignupHeaders?.() ?? {},\n },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: SignupInitiateInputDto) => {\n const metadata = {\n ...(getSignupMetadata?.() ?? {}),\n ...(data.metadata ?? {}),\n };\n const payload: SignupInitiateInputDto = {\n ...data,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n const result = await signupInitiateMutate(payload);\n if (!result) throw new Error('Signup failed');\n\n if (!result.session?.access_token || !result.session?.user_details_token) {\n throw new Error('Failed to get session after signup');\n }\n return {\n access_token: result.session.access_token,\n user_details_token: result.session.user_details_token,\n };\n};\n\n// Handle success\nconst handleSuccess = async (data: { access_token: string; user_details_token: string }) => {\n sessionStore.setSession(data.user_details_token);\n sessionStore.setAccessToken(data.access_token);\n\n form.reset();\n\n let redirectTo: string;\n try {\n const tokenPayload = jwtDecode<UserDetailsTokenPayload>(data.user_details_token);\n const user = tokenPayload.details?.user;\n redirectTo = getNextStep(user);\n } catch {\n redirectTo = getValidReturnUrl(route, '/');\n }\n\n await router.push(redirectTo);\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n if (isEmailVerificationRequiredError(error)) {\n return;\n }\n const message = error instanceof Error ? error.message : 'Registration failed';\n toast.error(message);\n};\n\nuseEmailVerificationChannel(\n awaitingVerification,\n (targetUrl) => router.push(targetUrl),\n () => getValidReturnUrl(route, '/'),\n);\n</script>\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import { t as useMutation } from "./useMutation-BLNuJoYl.js";
5
- import { t as useQuery } from "./useQuery-BzUGEOj0.js";
1
+ import "./useRpcAuth-BFdprNWb.js";
2
+ import "./EnhancedRefreshTokenHandler-s8wUXtB5.js";
3
+ import "./useQueryCache-CUTrwJWX.js";
4
+ import { t as useMutation } from "./useMutation-BXSu7_-s.js";
5
+ import { t as useQuery } from "./useQuery-DownvLRA.js";
6
6
  import { n as RecordVersionList_default, t as RecordVersionViewer_default } from "./RecordVersionViewer-DKIdX_BX.js";
7
7
  import { r as formatToISODatetime } from "./convertToLocalDateTime-BKBxm2Rc.js";
8
8
  import { t as extractRpcErrorMessage } from "./extractRpcErrorMessage-Df8-CJGV.js";
@@ -358,4 +358,4 @@ var SignupRequirementsPage_default = _sfc_main;
358
358
 
359
359
  //#endregion
360
360
  export { SignupRequirementsPage_default as default };
361
- //# sourceMappingURL=SignupRequirementsPage-CwnsnQKb.js.map
361
+ //# sourceMappingURL=SignupRequirementsPage-BnOkXd7w.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SignupRequirementsPage-CwnsnQKb.js","names":["consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n}","config: SignupRequirementsDto"],"sources":["../src/slices/admin/features/signup_requirements/signupRequirementsFormMetadata.ts","../src/slices/admin/features/signup_requirements/SignupRequirementsPage.vue"],"sourcesContent":["import {\n SignupConsentItemFormSchema,\n type SignupConsentItemFormDto,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n withMetadata,\n type PathsOf,\n type SchemaFieldMetadata,\n} from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/** Field metadata for consent item form — keys must match schema paths */\nexport const consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n} = {\n type: {\n label: 'Type',\n helpText: 'Type (e.g. terms_of_service, privacy_policy)',\n placeholder: 'terms_of_service',\n },\n version: {\n label: 'Version',\n helpText: 'Version (e.g. 2025.1)',\n placeholder: '2025.1',\n },\n label: {\n label: 'Label',\n placeholder: 'Terms of Service',\n },\n effective_at: {\n label: 'Effective at',\n inputType: 'datetime-local',\n helpText:\n 'When this version becomes enforceable for existing users. Set to now for immediate effect.',\n },\n url: {\n label: 'URL',\n helpText: 'Link to document — shown when content is empty',\n placeholder: '/legal/terms',\n },\n required: {\n label: 'Required',\n helpText: 'User must accept to sign up',\n inputType: 'checkbox' as const,\n },\n content: {\n label: 'Content',\n helpText: 'Optional, Markdown — when set, shown in scroll box; user must scroll to bottom',\n placeholder: '# Terms of Service\\n\\nYour markdown content here...',\n inputType: 'textarea',\n },\n};\n\n/** Item schema with metadata - used as array element (like followupCreateMetadata in tracker) */\nexport const signupConsentItemFormMetadata = withMetadata(\n SignupConsentItemFormSchema,\n 'signupConsentItemForm',\n consentItemFieldMetadata,\n);\n\n/** Full form schema with items array using metadata-wrapped item schema */\nexport const signupRequirementsFormMetadata = withMetadata(\n z.object({\n items: z.array(signupConsentItemFormMetadata).default([]),\n }),\n 'signupRequirementsForm',\n {},\n);\n\nexport function createEmptyConsentItem(): SignupConsentItemFormDto {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const effectiveAt = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}:${pad(now.getMinutes())}`;\n return {\n type: '',\n required: true,\n url: '',\n label: '',\n version: '1',\n effective_at: effectiveAt,\n content: '',\n };\n}\n","<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Signup Requirements</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Configure consent checkboxes shown on signup and consent-required flows. Each item can be\n required or optional. When <strong>content</strong> is provided, terms are shown in a\n scroll box (Markdown supported) and the user must scroll to bottom before accepting. When\n content is omitted, only a link is shown.\n </p>\n\n <div v-if=\"isLoading\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else class=\"space-y-6\">\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.ItemsField label=\"Consent Items\" :create-item=\"createEmptyConsentItem\">\n <template #itemPreview=\"{ item }\">\n <div class=\"font-medium text-sm\">\n {{ item.label || item.type || 'Item' }}\n <span v-if=\"item.type\" class=\"text-base-content/60\">({{ item.type }})</span>\n </div>\n </template>\n <template #itemRenderer=\"{ fields }\">\n <div class=\"space-y-3\">\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n <ziniaGeneric.TextField\n :name=\"fields.type\"\n :label=\"consentItemFieldMetadata.type.label\"\n :placeholder=\"consentItemFieldMetadata.type.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.version\"\n :label=\"consentItemFieldMetadata.version.label\"\n :placeholder=\"consentItemFieldMetadata.version.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.label\"\n :label=\"consentItemFieldMetadata.label.label\"\n :placeholder=\"consentItemFieldMetadata.label.placeholder\"\n required\n />\n </div>\n <ziniaGeneric.DateField\n :name=\"fields.effective_at\"\n :label=\"consentItemFieldMetadata.effective_at.label\"\n :formatter=\"formatToISODatetime\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.url\"\n :label=\"consentItemFieldMetadata.url.label\"\n :placeholder=\"consentItemFieldMetadata.url.placeholder\"\n type=\"url\"\n />\n <ziniaGeneric.CheckboxField\n :name=\"fields.required\"\n :label=\"consentItemFieldMetadata.required.label\"\n />\n <ziniaGeneric.TextareaField\n :name=\"fields.content\"\n :label=\"consentItemFieldMetadata.content.label\"\n :placeholder=\"consentItemFieldMetadata.content.placeholder\"\n :rows=\"5\"\n class=\"font-mono text-sm\"\n />\n </div>\n </template>\n </zinia.ItemsField>\n\n <div v-if=\"form.submitError\" class=\"alert alert-error mt-2\">\n <span>{{ form.submitError }}</span>\n </div>\n\n <div class=\"mt-4 flex justify-end\">\n <ZiniaSubmitButton\n submitText=\"Save\"\n submittingText=\"Saving...\"\n :disabled=\"!hasChanges\"\n />\n </div>\n </ZiniaForm>\n\n <!-- Version History -->\n <div class=\"card bg-base-200\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Version History</h2>\n <p class=\"text-sm text-base-content/70\">\n Past changes to signup requirements. Each save creates a new version.\n </p>\n <RecordVersionList\n :versions=\"versionHistoryItems\"\n :loading=\"versionHistoryLoading\"\n :error=\"versionHistoryError\"\n :has-next-page=\"versionHistoryPageInfo?.hasNextPage ?? false\"\n :loading-more=\"versionHistoryLoadingMore\"\n :config=\"versionListConfig\"\n exclude-latest\n @retry=\"refetchVersionHistory\"\n @load-more=\"loadMoreVersions\"\n />\n <dialog ref=\"versionModalRef\" class=\"modal\">\n <div class=\"modal-box max-w-4xl max-h-[90vh] overflow-auto\">\n <RecordVersionViewer\n v-if=\"selectedVersion\"\n :version=\"selectedVersion\"\n :record-data=\"selectedVersionRecordData\"\n :config=\"versionViewerConfig\"\n >\n <template #content=\"{ recordData }\">\n <div v-if=\"recordData?.items?.length\" class=\"space-y-4\">\n <h3 class=\"font-semibold\">Consent items at this version</h3>\n <div\n v-for=\"(item, idx) in recordData.items\"\n :key=\"idx\"\n class=\"border border-base-300 rounded p-3 text-sm space-y-1\"\n >\n <div><strong>Type:</strong> {{ item.type }}</div>\n <div><strong>Version:</strong> {{ item.version }}</div>\n <div><strong>Label:</strong> {{ item.label }}</div>\n <div><strong>Effective at:</strong> {{ item.effective_at }}</div>\n <div><strong>Required:</strong> {{ item.required ? 'Yes' : 'No' }}</div>\n <div v-if=\"item.url\"><strong>URL:</strong> {{ item.url }}</div>\n </div>\n </div>\n <pre v-else class=\"text-xs bg-base-200 p-3 rounded overflow-auto max-h-96\">{{\n JSON.stringify(recordData, null, 2)\n }}</pre>\n </template>\n </RecordVersionViewer>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"closeVersionModal\">close</button>\n </form>\n </dialog>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport { RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport RecordVersionList from '../../../../components/ui/RecordVersionList.vue';\nimport RecordVersionViewer from '../../../../components/ui/RecordVersionViewer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatToISODatetime } from '../../../../utils/convertToLocalDateTime';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport {\n consentItemFieldMetadata,\n createEmptyConsentItem,\n signupRequirementsFormMetadata,\n} from './signupRequirementsFormMetadata';\n\nconst {\n data: _signupRequirements,\n loading: isLoading,\n refetch,\n} = useQuery((api) => api.appSettings.getSignupRequirements(), {\n // cacheKey: 'admin-signup-requirements',\n // staleTime: 30 * 1000,\n});\n\nconst { form, zinia, ziniaGeneric, ZiniaForm, ZiniaSubmitButton } = useForm(\n signupRequirementsFormMetadata,\n {\n storeName: 'admin-signup-requirements-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n // wait for signup requirements to load\n fetchData: async () => {\n while (isLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return { items: _signupRequirements.value ?? [] };\n },\n },\n);\n\nconst initialSnapshot = ref<string>('');\n\nconst hasChanges = computed(() => {\n const current = form.values?.items ?? [];\n return JSON.stringify(current) !== initialSnapshot.value;\n});\n\nconst { mutate: updateSignupRequirements } = useMutation(\n (api, config: SignupRequirementsDto) => api.appSettings.updateSignupRequirements(config),\n { invalidate: /admin-signup-requirements/ },\n);\n\nasync function handleSubmit(formData: {\n items: Array<{\n type: string;\n required: boolean;\n url: string;\n label: string;\n version: string;\n effective_at: string;\n content?: string | null;\n }>;\n}) {\n const config: SignupRequirementsDto = formData.items.map((c) => ({\n type: c.type.trim() || 'unknown',\n required: c.required,\n url: c.url.trim(),\n label: c.label.trim() || c.type.trim() || 'Consent',\n version: c.version.trim() || '1',\n effective_at:\n (c.effective_at?.trim()\n ? formatToISODatetime(c.effective_at.trim())\n : formatToISODatetime(new Date().toISOString())) ?? new Date().toISOString(),\n content: c.content?.trim() ? c.content.trim() : undefined,\n }));\n await updateSignupRequirements(config);\n}\n\nasync function handleSuccess() {\n toast.success('Signup requirements saved');\n initialSnapshot.value = JSON.stringify(form.values?.items ?? []);\n await refetch();\n await refetchVersionHistory();\n}\n\nfunction handleError(error: Error | unknown) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n form.setSubmitError(extractRpcErrorMessage(error, message));\n toast.error(form.submitError ?? 'Failed to save signup requirements');\n}\n\n// Version history\nconst VERSION_HISTORY_KEY = 'admin-signup-requirements-history';\n\nconst {\n data: versionHistoryData,\n loading: versionHistoryLoading,\n error: versionHistoryError,\n refetch: refetchVersionHistory,\n} = useQuery(\n async (api) =>\n api.recordVersions.listRecordVersionsPaginated(\n 'signup_requirements',\n RecordConst.APP_SETTING,\n {\n first: 50,\n sortBy: 'recorded_at',\n sortDirection: 'desc',\n },\n ),\n {\n cacheKey: VERSION_HISTORY_KEY,\n staleTime: 60 * 1000,\n },\n);\n\nconst versionHistoryItems = computed(() => versionHistoryData.value?.items ?? []);\nconst versionHistoryPageInfo = computed(() => versionHistoryData.value?.pageInfo);\nconst versionHistoryLoadingMore = ref(false);\n\nfunction loadMoreVersions() {\n // Pagination: could add cursor-based load more if needed\n}\n\nconst versionListConfig = {\n recordDisplayName: 'signup requirements',\n noVersionsText: 'No previous versions. Save changes to create the first version.',\n viewAction: (version: { id: string }) => openVersionModal(version),\n viewActionText: 'View',\n};\n\nconst versionModalRef = ref<HTMLDialogElement | null>(null);\nconst selectedVersion = ref<{\n id: string;\n operation: string;\n recorded_at: string;\n auth_username?: string | null;\n record?: unknown;\n old_record?: unknown;\n} | null>(null);\n\nconst selectedVersionRecordData = computed(() => {\n if (!selectedVersion.value) return null;\n const v = selectedVersion.value;\n const record = v.record;\n if (Array.isArray(record)) return { items: record };\n if (typeof record === 'object' && record !== null) return record;\n if (typeof record === 'string') {\n try {\n const parsed = JSON.parse(record);\n return Array.isArray(parsed) ? { items: parsed } : parsed;\n } catch {\n return { raw: record };\n }\n }\n return null;\n});\n\nconst versionViewerConfig = {\n recordDisplayName: 'signup requirements',\n title: 'Signup Requirements Version',\n onBack: () => closeVersionModal(),\n excludeFields: ['raw'],\n};\n\nfunction openVersionModal(version: { id: string; record?: unknown; old_record?: unknown }) {\n selectedVersion.value = version as typeof selectedVersion.value;\n versionModalRef.value?.showModal();\n}\n\nfunction closeVersionModal() {\n selectedVersion.value = null;\n versionModalRef.value?.close();\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"SignupRequirementsPage-BnOkXd7w.js","names":["consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n}","config: SignupRequirementsDto"],"sources":["../src/slices/admin/features/signup_requirements/signupRequirementsFormMetadata.ts","../src/slices/admin/features/signup_requirements/SignupRequirementsPage.vue"],"sourcesContent":["import {\n SignupConsentItemFormSchema,\n type SignupConsentItemFormDto,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n withMetadata,\n type PathsOf,\n type SchemaFieldMetadata,\n} from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/** Field metadata for consent item form — keys must match schema paths */\nexport const consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n} = {\n type: {\n label: 'Type',\n helpText: 'Type (e.g. terms_of_service, privacy_policy)',\n placeholder: 'terms_of_service',\n },\n version: {\n label: 'Version',\n helpText: 'Version (e.g. 2025.1)',\n placeholder: '2025.1',\n },\n label: {\n label: 'Label',\n placeholder: 'Terms of Service',\n },\n effective_at: {\n label: 'Effective at',\n inputType: 'datetime-local',\n helpText:\n 'When this version becomes enforceable for existing users. Set to now for immediate effect.',\n },\n url: {\n label: 'URL',\n helpText: 'Link to document — shown when content is empty',\n placeholder: '/legal/terms',\n },\n required: {\n label: 'Required',\n helpText: 'User must accept to sign up',\n inputType: 'checkbox' as const,\n },\n content: {\n label: 'Content',\n helpText: 'Optional, Markdown — when set, shown in scroll box; user must scroll to bottom',\n placeholder: '# Terms of Service\\n\\nYour markdown content here...',\n inputType: 'textarea',\n },\n};\n\n/** Item schema with metadata - used as array element (like followupCreateMetadata in tracker) */\nexport const signupConsentItemFormMetadata = withMetadata(\n SignupConsentItemFormSchema,\n 'signupConsentItemForm',\n consentItemFieldMetadata,\n);\n\n/** Full form schema with items array using metadata-wrapped item schema */\nexport const signupRequirementsFormMetadata = withMetadata(\n z.object({\n items: z.array(signupConsentItemFormMetadata).default([]),\n }),\n 'signupRequirementsForm',\n {},\n);\n\nexport function createEmptyConsentItem(): SignupConsentItemFormDto {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const effectiveAt = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}:${pad(now.getMinutes())}`;\n return {\n type: '',\n required: true,\n url: '',\n label: '',\n version: '1',\n effective_at: effectiveAt,\n content: '',\n };\n}\n","<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Signup Requirements</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Configure consent checkboxes shown on signup and consent-required flows. Each item can be\n required or optional. When <strong>content</strong> is provided, terms are shown in a\n scroll box (Markdown supported) and the user must scroll to bottom before accepting. When\n content is omitted, only a link is shown.\n </p>\n\n <div v-if=\"isLoading\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else class=\"space-y-6\">\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.ItemsField label=\"Consent Items\" :create-item=\"createEmptyConsentItem\">\n <template #itemPreview=\"{ item }\">\n <div class=\"font-medium text-sm\">\n {{ item.label || item.type || 'Item' }}\n <span v-if=\"item.type\" class=\"text-base-content/60\">({{ item.type }})</span>\n </div>\n </template>\n <template #itemRenderer=\"{ fields }\">\n <div class=\"space-y-3\">\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n <ziniaGeneric.TextField\n :name=\"fields.type\"\n :label=\"consentItemFieldMetadata.type.label\"\n :placeholder=\"consentItemFieldMetadata.type.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.version\"\n :label=\"consentItemFieldMetadata.version.label\"\n :placeholder=\"consentItemFieldMetadata.version.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.label\"\n :label=\"consentItemFieldMetadata.label.label\"\n :placeholder=\"consentItemFieldMetadata.label.placeholder\"\n required\n />\n </div>\n <ziniaGeneric.DateField\n :name=\"fields.effective_at\"\n :label=\"consentItemFieldMetadata.effective_at.label\"\n :formatter=\"formatToISODatetime\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.url\"\n :label=\"consentItemFieldMetadata.url.label\"\n :placeholder=\"consentItemFieldMetadata.url.placeholder\"\n type=\"url\"\n />\n <ziniaGeneric.CheckboxField\n :name=\"fields.required\"\n :label=\"consentItemFieldMetadata.required.label\"\n />\n <ziniaGeneric.TextareaField\n :name=\"fields.content\"\n :label=\"consentItemFieldMetadata.content.label\"\n :placeholder=\"consentItemFieldMetadata.content.placeholder\"\n :rows=\"5\"\n class=\"font-mono text-sm\"\n />\n </div>\n </template>\n </zinia.ItemsField>\n\n <div v-if=\"form.submitError\" class=\"alert alert-error mt-2\">\n <span>{{ form.submitError }}</span>\n </div>\n\n <div class=\"mt-4 flex justify-end\">\n <ZiniaSubmitButton\n submitText=\"Save\"\n submittingText=\"Saving...\"\n :disabled=\"!hasChanges\"\n />\n </div>\n </ZiniaForm>\n\n <!-- Version History -->\n <div class=\"card bg-base-200\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Version History</h2>\n <p class=\"text-sm text-base-content/70\">\n Past changes to signup requirements. Each save creates a new version.\n </p>\n <RecordVersionList\n :versions=\"versionHistoryItems\"\n :loading=\"versionHistoryLoading\"\n :error=\"versionHistoryError\"\n :has-next-page=\"versionHistoryPageInfo?.hasNextPage ?? false\"\n :loading-more=\"versionHistoryLoadingMore\"\n :config=\"versionListConfig\"\n exclude-latest\n @retry=\"refetchVersionHistory\"\n @load-more=\"loadMoreVersions\"\n />\n <dialog ref=\"versionModalRef\" class=\"modal\">\n <div class=\"modal-box max-w-4xl max-h-[90vh] overflow-auto\">\n <RecordVersionViewer\n v-if=\"selectedVersion\"\n :version=\"selectedVersion\"\n :record-data=\"selectedVersionRecordData\"\n :config=\"versionViewerConfig\"\n >\n <template #content=\"{ recordData }\">\n <div v-if=\"recordData?.items?.length\" class=\"space-y-4\">\n <h3 class=\"font-semibold\">Consent items at this version</h3>\n <div\n v-for=\"(item, idx) in recordData.items\"\n :key=\"idx\"\n class=\"border border-base-300 rounded p-3 text-sm space-y-1\"\n >\n <div><strong>Type:</strong> {{ item.type }}</div>\n <div><strong>Version:</strong> {{ item.version }}</div>\n <div><strong>Label:</strong> {{ item.label }}</div>\n <div><strong>Effective at:</strong> {{ item.effective_at }}</div>\n <div><strong>Required:</strong> {{ item.required ? 'Yes' : 'No' }}</div>\n <div v-if=\"item.url\"><strong>URL:</strong> {{ item.url }}</div>\n </div>\n </div>\n <pre v-else class=\"text-xs bg-base-200 p-3 rounded overflow-auto max-h-96\">{{\n JSON.stringify(recordData, null, 2)\n }}</pre>\n </template>\n </RecordVersionViewer>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"closeVersionModal\">close</button>\n </form>\n </dialog>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport { RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport RecordVersionList from '../../../../components/ui/RecordVersionList.vue';\nimport RecordVersionViewer from '../../../../components/ui/RecordVersionViewer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatToISODatetime } from '../../../../utils/convertToLocalDateTime';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport {\n consentItemFieldMetadata,\n createEmptyConsentItem,\n signupRequirementsFormMetadata,\n} from './signupRequirementsFormMetadata';\n\nconst {\n data: _signupRequirements,\n loading: isLoading,\n refetch,\n} = useQuery((api) => api.appSettings.getSignupRequirements(), {\n // cacheKey: 'admin-signup-requirements',\n // staleTime: 30 * 1000,\n});\n\nconst { form, zinia, ziniaGeneric, ZiniaForm, ZiniaSubmitButton } = useForm(\n signupRequirementsFormMetadata,\n {\n storeName: 'admin-signup-requirements-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n // wait for signup requirements to load\n fetchData: async () => {\n while (isLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return { items: _signupRequirements.value ?? [] };\n },\n },\n);\n\nconst initialSnapshot = ref<string>('');\n\nconst hasChanges = computed(() => {\n const current = form.values?.items ?? [];\n return JSON.stringify(current) !== initialSnapshot.value;\n});\n\nconst { mutate: updateSignupRequirements } = useMutation(\n (api, config: SignupRequirementsDto) => api.appSettings.updateSignupRequirements(config),\n { invalidate: /admin-signup-requirements/ },\n);\n\nasync function handleSubmit(formData: {\n items: Array<{\n type: string;\n required: boolean;\n url: string;\n label: string;\n version: string;\n effective_at: string;\n content?: string | null;\n }>;\n}) {\n const config: SignupRequirementsDto = formData.items.map((c) => ({\n type: c.type.trim() || 'unknown',\n required: c.required,\n url: c.url.trim(),\n label: c.label.trim() || c.type.trim() || 'Consent',\n version: c.version.trim() || '1',\n effective_at:\n (c.effective_at?.trim()\n ? formatToISODatetime(c.effective_at.trim())\n : formatToISODatetime(new Date().toISOString())) ?? new Date().toISOString(),\n content: c.content?.trim() ? c.content.trim() : undefined,\n }));\n await updateSignupRequirements(config);\n}\n\nasync function handleSuccess() {\n toast.success('Signup requirements saved');\n initialSnapshot.value = JSON.stringify(form.values?.items ?? []);\n await refetch();\n await refetchVersionHistory();\n}\n\nfunction handleError(error: Error | unknown) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n form.setSubmitError(extractRpcErrorMessage(error, message));\n toast.error(form.submitError ?? 'Failed to save signup requirements');\n}\n\n// Version history\nconst VERSION_HISTORY_KEY = 'admin-signup-requirements-history';\n\nconst {\n data: versionHistoryData,\n loading: versionHistoryLoading,\n error: versionHistoryError,\n refetch: refetchVersionHistory,\n} = useQuery(\n async (api) =>\n api.recordVersions.listRecordVersionsPaginated(\n 'signup_requirements',\n RecordConst.APP_SETTING,\n {\n first: 50,\n sortBy: 'recorded_at',\n sortDirection: 'desc',\n },\n ),\n {\n cacheKey: VERSION_HISTORY_KEY,\n staleTime: 60 * 1000,\n },\n);\n\nconst versionHistoryItems = computed(() => versionHistoryData.value?.items ?? []);\nconst versionHistoryPageInfo = computed(() => versionHistoryData.value?.pageInfo);\nconst versionHistoryLoadingMore = ref(false);\n\nfunction loadMoreVersions() {\n // Pagination: could add cursor-based load more if needed\n}\n\nconst versionListConfig = {\n recordDisplayName: 'signup requirements',\n noVersionsText: 'No previous versions. Save changes to create the first version.',\n viewAction: (version: { id: string }) => openVersionModal(version),\n viewActionText: 'View',\n};\n\nconst versionModalRef = ref<HTMLDialogElement | null>(null);\nconst selectedVersion = ref<{\n id: string;\n operation: string;\n recorded_at: string;\n auth_username?: string | null;\n record?: unknown;\n old_record?: unknown;\n} | null>(null);\n\nconst selectedVersionRecordData = computed(() => {\n if (!selectedVersion.value) return null;\n const v = selectedVersion.value;\n const record = v.record;\n if (Array.isArray(record)) return { items: record };\n if (typeof record === 'object' && record !== null) return record;\n if (typeof record === 'string') {\n try {\n const parsed = JSON.parse(record);\n return Array.isArray(parsed) ? { items: parsed } : parsed;\n } catch {\n return { raw: record };\n }\n }\n return null;\n});\n\nconst versionViewerConfig = {\n recordDisplayName: 'signup requirements',\n title: 'Signup Requirements Version',\n onBack: () => closeVersionModal(),\n excludeFields: ['raw'],\n};\n\nfunction openVersionModal(version: { id: string; record?: unknown; old_record?: unknown }) {\n selectedVersion.value = version as typeof selectedVersion.value;\n versionModalRef.value?.showModal();\n}\n\nfunction closeVersionModal() {\n selectedVersion.value = null;\n versionModalRef.value?.close();\n}\n</script>\n"],"mappings":"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"}