@dragonmastery/dragoncore-vue 0.0.18 → 0.0.19

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 (162) hide show
  1. package/dist/ChangePasswordPage-BuVNYC_G.js +6 -0
  2. package/dist/{ChangePasswordPage-D2Ci00Sh.js → ChangePasswordPage-DXzU3NI9.js} +2 -2
  3. package/dist/{ChangePasswordPage-D2Ci00Sh.js.map → ChangePasswordPage-DXzU3NI9.js.map} +1 -1
  4. package/dist/CreateTeamForm-BuMrZ169.js +32 -0
  5. package/dist/CreateTeamMemberForm-D0xqR9me.js +32 -0
  6. package/dist/CreateUserPage-BWIvFF-4.js +6 -0
  7. package/dist/{CreateUserPage-DbT_l32W.js → CreateUserPage-bwR6fq5C.js} +2 -2
  8. package/dist/{CreateUserPage-DbT_l32W.js.map → CreateUserPage-bwR6fq5C.js.map} +1 -1
  9. package/dist/CreditBalanceDashboard-BR-er7gs.js +32 -0
  10. package/dist/CreditManagement-CyjrE1ep.js +32 -0
  11. package/dist/CustomerCreateSupportTicketForm-C9-CLRRQ.js +32 -0
  12. package/dist/{CustomerSupportTicketDetailPage-CthS9akm.js → CustomerSupportTicketDetailPage-D_1t2EpN.js} +9 -9
  13. package/dist/{CustomerSupportTicketDetailPage-CthS9akm.js.map → CustomerSupportTicketDetailPage-D_1t2EpN.js.map} +1 -1
  14. package/dist/CustomerSupportTicketList-B0dC7lgD.js +32 -0
  15. package/dist/{CustomerSupportTicketParent-iBV1KRKL.js → CustomerSupportTicketParent-B09_iFpJ.js} +4 -4
  16. package/dist/{CustomerSupportTicketParent-iBV1KRKL.js.map → CustomerSupportTicketParent-B09_iFpJ.js.map} +1 -1
  17. package/dist/CustomerSupportTicketParent-D0wLnKXf.js +7 -0
  18. package/dist/CustomerSupportTicketSuccess-BvuBglg8.js +32 -0
  19. package/dist/EditTeamForm-BJlOKEkI.js +32 -0
  20. package/dist/EditTeamMemberForm-CbDvTLXI.js +6 -0
  21. package/dist/{EditTeamMemberForm-Cy8nzoUb.js → EditTeamMemberForm-DJW7yRQW.js} +2 -2
  22. package/dist/{EditTeamMemberForm-Cy8nzoUb.js.map → EditTeamMemberForm-DJW7yRQW.js.map} +1 -1
  23. package/dist/EditUserPage-CsHl1h_g.js +7 -0
  24. package/dist/{EditUserPage-CIRqNko-.js → EditUserPage-aDygGmfD.js} +4 -4
  25. package/dist/{EditUserPage-CIRqNko-.js.map → EditUserPage-aDygGmfD.js.map} +1 -1
  26. package/dist/{ForgotPassword-CJg_buPl.js → ForgotPassword-CJjzm9GK.js} +3 -4
  27. package/dist/{ForgotPassword-CJg_buPl.js.map → ForgotPassword-CJjzm9GK.js.map} +1 -1
  28. package/dist/ForgotPassword-DJjmzU_m.js +7 -0
  29. package/dist/LoginForm-BeiI_y3E.js +7 -0
  30. package/dist/{LoginForm-DyHmiC1I.js → LoginForm-IEP-hEh0.js} +4 -5
  31. package/dist/{LoginForm-DyHmiC1I.js.map → LoginForm-IEP-hEh0.js.map} +1 -1
  32. package/dist/Logout-Cm9kEzgH.js +70 -0
  33. package/dist/Logout-Cm9kEzgH.js.map +1 -0
  34. package/dist/Logout-DmZTNQDP.js +7 -0
  35. package/dist/MfaSetup-BwkenBRD.js +8 -0
  36. package/dist/{MfaSetup-D80HhwEz.js → MfaSetup-Ch0w-gTN.js} +4 -5
  37. package/dist/{MfaSetup-D80HhwEz.js.map → MfaSetup-Ch0w-gTN.js.map} +1 -1
  38. package/dist/MfaVerify-BaUROEol.js +8 -0
  39. package/dist/{MfaVerify-BEd-f6oV.js → MfaVerify-BwzjVrTj.js} +5 -6
  40. package/dist/{MfaVerify-BEd-f6oV.js.map → MfaVerify-BwzjVrTj.js.map} +1 -1
  41. package/dist/ResetPassword-DEFj1pgV.js +7 -0
  42. package/dist/{ResetPassword-4HLdgM7s.js → ResetPassword-DuLuXaNp.js} +3 -4
  43. package/dist/{ResetPassword-4HLdgM7s.js.map → ResetPassword-DuLuXaNp.js.map} +1 -1
  44. package/dist/{SavedFiltersPage-p0qGRIuN.js → SavedFiltersPage-CawED9Oz.js} +29 -29
  45. package/dist/{SavedFiltersPage-p0qGRIuN.js.map → SavedFiltersPage-CawED9Oz.js.map} +1 -1
  46. package/dist/{Signup-Ct0m0x78.js → Signup-C94alv87.js} +41 -12
  47. package/dist/Signup-C94alv87.js.map +1 -0
  48. package/dist/Signup-CFUbdrYs.js +7 -0
  49. package/dist/StaffCreateSupportTicketForm-AxprwWRv.js +32 -0
  50. package/dist/{StaffSupportTicketDetailPage-TaAPQARa.js → StaffSupportTicketDetailPage-DZZN3jmt.js} +11 -11
  51. package/dist/{StaffSupportTicketDetailPage-TaAPQARa.js.map → StaffSupportTicketDetailPage-DZZN3jmt.js.map} +1 -1
  52. package/dist/StaffSupportTicketList-DYKysNs3.js +32 -0
  53. package/dist/{StaffSupportTicketParent-KYzy4eb4.js → StaffSupportTicketParent-BYxQPuhI.js} +4 -4
  54. package/dist/{StaffSupportTicketParent-KYzy4eb4.js.map → StaffSupportTicketParent-BYxQPuhI.js.map} +1 -1
  55. package/dist/StaffSupportTicketParent-CT8oYFd6.js +7 -0
  56. package/dist/StaffSupportTicketSuccess-zWEagE4E.js +32 -0
  57. package/dist/{SupportStaffPage-D_YsHZZa.js → SupportStaffPage-B05UR5LK.js} +7 -7
  58. package/dist/{SupportStaffPage-D_YsHZZa.js.map → SupportStaffPage-B05UR5LK.js.map} +1 -1
  59. package/dist/{SupportTicketDevLifecycleBadge-B2NysMAj.js → SupportTicketDevLifecycleBadge-Ba-Rm6QW.js} +1 -1
  60. package/dist/{SupportTicketDevLifecycleBadge-B2NysMAj.js.map → SupportTicketDevLifecycleBadge-Ba-Rm6QW.js.map} +1 -1
  61. package/dist/{SupportTicketMaintenancePage-CpK1esq2.js → SupportTicketMaintenancePage-BoZpjcAF.js} +4 -4
  62. package/dist/{SupportTicketMaintenancePage-CpK1esq2.js.map → SupportTicketMaintenancePage-BoZpjcAF.js.map} +1 -1
  63. package/dist/TeamAttachmentsTab-BFRMbPlZ.js +32 -0
  64. package/dist/{TeamHistoryTab-BQ-eXtiw.js → TeamHistoryTab-BrC6FFIw.js} +3 -3
  65. package/dist/{TeamHistoryTab-BQ-eXtiw.js.map → TeamHistoryTab-BrC6FFIw.js.map} +1 -1
  66. package/dist/TeamHistoryTab-CYrt5KnE.js +4 -0
  67. package/dist/TeamList-CF5BQhfx.js +32 -0
  68. package/dist/TeamMemberList-Dfi2iKOH.js +32 -0
  69. package/dist/TeamMemberParent-DXcumR-Q.js +32 -0
  70. package/dist/{TeamNotesTab-Dj12Q2gD.js → TeamNotesTab-B2eETkAz.js} +5 -5
  71. package/dist/{TeamNotesTab-Dj12Q2gD.js.map → TeamNotesTab-B2eETkAz.js.map} +1 -1
  72. package/dist/TeamNotesTab-Bv_HPC6f.js +7 -0
  73. package/dist/TeamParent-DLoNn-mW.js +32 -0
  74. package/dist/{TimelineNoteInput-DGDgyGe-.js → TimelineNoteInput-C0a0WRQC.js} +2 -2
  75. package/dist/{TimelineNoteInput-DGDgyGe-.js.map → TimelineNoteInput-C0a0WRQC.js.map} +1 -1
  76. package/dist/{TimelineSystemEvent-CBwUl5G8.js → TimelineSystemEvent-Dj2TMOF6.js} +4 -4
  77. package/dist/{TimelineSystemEvent-CBwUl5G8.js.map → TimelineSystemEvent-Dj2TMOF6.js.map} +1 -1
  78. package/dist/UserListPage-CBwfXo15.js +4 -0
  79. package/dist/{UserListPage-D-IdlsHK.js → UserListPage-QSdxrJT6.js} +3 -3
  80. package/dist/{UserListPage-D-IdlsHK.js.map → UserListPage-QSdxrJT6.js.map} +1 -1
  81. package/dist/{UserProfilePage-DMwDVgXa.js → UserProfilePage-X4z2lG-J.js} +4 -4
  82. package/dist/{UserProfilePage-DMwDVgXa.js.map → UserProfilePage-X4z2lG-J.js.map} +1 -1
  83. package/dist/UserProfilePage-cTrZuwOT.js +7 -0
  84. package/dist/{VerifyEmail-CHfTzrHg.js → VerifyEmail-8bsvoDdM.js} +57 -22
  85. package/dist/VerifyEmail-8bsvoDdM.js.map +1 -0
  86. package/dist/VerifyEmail-Cpc0umIu.js +7 -0
  87. package/dist/{VerifyEmailRequired-BCKREd_C.js → VerifyEmailRequired-CN1FU1AE.js} +6 -7
  88. package/dist/{VerifyEmailRequired-BCKREd_C.js.map → VerifyEmailRequired-CN1FU1AE.js.map} +1 -1
  89. package/dist/ViewTeam-DpjnoTwo.js +32 -0
  90. package/dist/ViewTeamMember-CRb2oBHG.js +32 -0
  91. package/dist/{convertToLocalDateTime-mKs5eC9T.js → convertToLocalDateTime-DOSGtMn8.js} +1 -1
  92. package/dist/{convertToLocalDateTime-mKs5eC9T.js.map → convertToLocalDateTime-DOSGtMn8.js.map} +1 -1
  93. package/dist/{displayIdFormatter-rSbbsHIX.js → displayIdFormatter-B1ZKgofu.js} +1 -1
  94. package/dist/{displayIdFormatter-rSbbsHIX.js.map → displayIdFormatter-B1ZKgofu.js.map} +1 -1
  95. package/dist/{extractRpcErrorMessage-pP3v8kKE.js → extractRpcErrorMessage-C_UbKgHL.js} +1 -1
  96. package/dist/{extractRpcErrorMessage-pP3v8kKE.js.map → extractRpcErrorMessage-C_UbKgHL.js.map} +1 -1
  97. package/dist/index.d.ts +785 -776
  98. package/dist/index.js +31 -32
  99. package/dist/{mfaSchema-_vbG9jiT.js → mfaSchema-nfNCcEhM.js} +1 -1
  100. package/dist/{mfaSchema-_vbG9jiT.js.map → mfaSchema-nfNCcEhM.js.map} +1 -1
  101. package/dist/{src-B5eswi_J.js → src-CkgUIye9.js} +66 -60
  102. package/dist/src-CkgUIye9.js.map +1 -0
  103. package/dist/{useBreadcrumbs-B-W-miq6.js → useBreadcrumbs-DmgSucoe.js} +1 -1
  104. package/dist/{useBreadcrumbs-B-W-miq6.js.map → useBreadcrumbs-DmgSucoe.js.map} +1 -1
  105. package/dist/{useMutation-DzRSXPB1.js → useMutation-DbzXtqf1.js} +3 -3
  106. package/dist/{useMutation-DzRSXPB1.js.map → useMutation-DbzXtqf1.js.map} +1 -1
  107. package/dist/{useQuery-bvJabe9Q.js → useQuery-BKb5JXVS.js} +3 -3
  108. package/dist/{useQuery-bvJabe9Q.js.map → useQuery-BKb5JXVS.js.map} +1 -1
  109. package/dist/{useQueryCache-DIGf3fCM.js → useQueryCache-CHG4-HGF.js} +2 -2
  110. package/dist/{useQueryCache-DIGf3fCM.js.map → useQueryCache-CHG4-HGF.js.map} +1 -1
  111. package/dist/useReturnUrl-Da8PpLb9.js +118 -0
  112. package/dist/useReturnUrl-Da8PpLb9.js.map +1 -0
  113. package/dist/{useRpcAuth-SgNzCAPa.js → useRpcAuth-8Byr6SSI.js} +21 -9
  114. package/dist/{useRpcAuth-SgNzCAPa.js.map → useRpcAuth-8Byr6SSI.js.map} +1 -1
  115. package/package.json +2 -2
  116. package/dist/AppLink-CHMMrSFI.js +0 -54
  117. package/dist/AppLink-CHMMrSFI.js.map +0 -1
  118. package/dist/ChangePasswordPage-DqnWhaUa.js +0 -6
  119. package/dist/CreateTeamForm-LadKAxsM.js +0 -32
  120. package/dist/CreateTeamMemberForm-eWL__TEt.js +0 -32
  121. package/dist/CreateUserPage-cduuWl9g.js +0 -6
  122. package/dist/CreditBalanceDashboard-CgRRO6MD.js +0 -32
  123. package/dist/CreditManagement-BBb_Xumq.js +0 -32
  124. package/dist/CustomerCreateSupportTicketForm-yfyeXr0V.js +0 -32
  125. package/dist/CustomerSupportTicketList-Zzsg1FtO.js +0 -32
  126. package/dist/CustomerSupportTicketParent-CqR8lF7r.js +0 -7
  127. package/dist/CustomerSupportTicketSuccess-BPyydSLQ.js +0 -32
  128. package/dist/EditTeamForm-D0wZKYm2.js +0 -32
  129. package/dist/EditTeamMemberForm-JuRGiWOn.js +0 -6
  130. package/dist/EditUserPage-Dl6d3Cuh.js +0 -7
  131. package/dist/ForgotPassword-rSN-8EC4.js +0 -7
  132. package/dist/LoginForm-YCzdrekw.js +0 -7
  133. package/dist/Logout-C6pWyTIm.js +0 -41
  134. package/dist/Logout-C6pWyTIm.js.map +0 -1
  135. package/dist/Logout-Ctc8b-B0.js +0 -6
  136. package/dist/MfaSetup-xNmNjSh1.js +0 -8
  137. package/dist/MfaVerify-C0COXH_W.js +0 -8
  138. package/dist/ResetPassword-BCzMTXpT.js +0 -7
  139. package/dist/Signup-Ct0m0x78.js.map +0 -1
  140. package/dist/Signup-DNEklGpK.js +0 -7
  141. package/dist/StaffCreateSupportTicketForm-CxpKnqCq.js +0 -32
  142. package/dist/StaffSupportTicketList-BuKBTk2v.js +0 -32
  143. package/dist/StaffSupportTicketParent-Lkn-5u7C.js +0 -7
  144. package/dist/StaffSupportTicketSuccess-BD1Xsnx1.js +0 -32
  145. package/dist/TeamAttachmentsTab-DA_MBYj8.js +0 -32
  146. package/dist/TeamHistoryTab-lz2ouNyP.js +0 -4
  147. package/dist/TeamList-T3mZJTzq.js +0 -32
  148. package/dist/TeamMemberList-BW4qqzC1.js +0 -32
  149. package/dist/TeamMemberParent-Wcht0pIz.js +0 -32
  150. package/dist/TeamNotesTab-aGD8O49y.js +0 -7
  151. package/dist/TeamParent-BkhaJwud.js +0 -32
  152. package/dist/UserListPage-C9zUjaOK.js +0 -4
  153. package/dist/UserProfilePage-D52_Q5yf.js +0 -7
  154. package/dist/VerifyEmail-5thal4d_.js +0 -7
  155. package/dist/VerifyEmail-CHfTzrHg.js.map +0 -1
  156. package/dist/ViewTeam-g7WhYvsR.js +0 -32
  157. package/dist/ViewTeamMember-ByCSsl5k.js +0 -32
  158. package/dist/src-B5eswi_J.js.map +0 -1
  159. package/dist/useReturnUrl-BBoPnDR3.js +0 -51
  160. package/dist/useReturnUrl-BBoPnDR3.js.map +0 -1
  161. /package/dist/{Appearance-CohgRf-_.js → Appearance-C3WguxT-.js} +0 -0
  162. /package/dist/{TeamMembersTab-CpE9BaCi.js → TeamMembersTab-DTJxmb-M.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ResetPassword-4HLdgM7s.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-DuLuXaNp.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,33 +1,33 @@
1
- import "./useRpcAuth-SgNzCAPa.js";
2
- import "./useQueryCache-DIGf3fCM.js";
3
- import { t as useMutation } from "./useMutation-DzRSXPB1.js";
4
- import { t as useQuery } from "./useQuery-bvJabe9Q.js";
5
- import { tn as useInjectedPinnedPresets } from "./src-B5eswi_J.js";
6
- import "./AppLink-CHMMrSFI.js";
7
- import { d as ConfirmDialog_default } from "./TimelineSystemEvent-CBwUl5G8.js";
1
+ import "./useRpcAuth-8Byr6SSI.js";
2
+ import "./useQueryCache-CHG4-HGF.js";
3
+ import { t as useMutation } from "./useMutation-DbzXtqf1.js";
4
+ import { t as useQuery } from "./useQuery-BKb5JXVS.js";
5
+ import { tn as useInjectedPinnedPresets } from "./src-CkgUIye9.js";
6
+ import "./useReturnUrl-Da8PpLb9.js";
7
+ import { d as ConfirmDialog_default } from "./TimelineSystemEvent-Dj2TMOF6.js";
8
8
  import "./TeamMembersTab-4gmnP9sD.js";
9
9
  import "./Appearance-BfPdKMXw.js";
10
- import "./useBreadcrumbs-B-W-miq6.js";
11
- import "./EditTeamMemberForm-Cy8nzoUb.js";
12
- import "./TeamHistoryTab-BQ-eXtiw.js";
13
- import "./UserProfilePage-DMwDVgXa.js";
14
- import "./ChangePasswordPage-D2Ci00Sh.js";
15
- import "./TeamNotesTab-Dj12Q2gD.js";
16
- import "./CustomerSupportTicketParent-iBV1KRKL.js";
17
- import "./SupportTicketDevLifecycleBadge-B2NysMAj.js";
18
- import "./StaffSupportTicketParent-KYzy4eb4.js";
19
- import "./LoginForm-DyHmiC1I.js";
20
- import "./Signup-Ct0m0x78.js";
21
- import "./ForgotPassword-CJg_buPl.js";
22
- import "./ResetPassword-4HLdgM7s.js";
23
- import "./Logout-C6pWyTIm.js";
24
- import "./mfaSchema-_vbG9jiT.js";
25
- import "./MfaSetup-D80HhwEz.js";
26
- import "./MfaVerify-BEd-f6oV.js";
27
- import "./VerifyEmail-CHfTzrHg.js";
28
- import "./UserListPage-D-IdlsHK.js";
29
- import "./CreateUserPage-DbT_l32W.js";
30
- import "./EditUserPage-CIRqNko-.js";
10
+ import "./useBreadcrumbs-DmgSucoe.js";
11
+ import "./EditTeamMemberForm-DJW7yRQW.js";
12
+ import "./TeamHistoryTab-BrC6FFIw.js";
13
+ import "./UserProfilePage-X4z2lG-J.js";
14
+ import "./ChangePasswordPage-DXzU3NI9.js";
15
+ import "./TeamNotesTab-B2eETkAz.js";
16
+ import "./CustomerSupportTicketParent-B09_iFpJ.js";
17
+ import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
+ import "./StaffSupportTicketParent-BYxQPuhI.js";
19
+ import "./LoginForm-IEP-hEh0.js";
20
+ import "./Signup-C94alv87.js";
21
+ import "./ForgotPassword-CJjzm9GK.js";
22
+ import "./ResetPassword-DuLuXaNp.js";
23
+ import "./Logout-Cm9kEzgH.js";
24
+ import "./mfaSchema-nfNCcEhM.js";
25
+ import "./MfaSetup-Ch0w-gTN.js";
26
+ import "./MfaVerify-BwzjVrTj.js";
27
+ import "./VerifyEmail-8bsvoDdM.js";
28
+ import "./UserListPage-QSdxrJT6.js";
29
+ import "./CreateUserPage-bwR6fq5C.js";
30
+ import "./EditUserPage-aDygGmfD.js";
31
31
  import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, renderList, resolveComponent, toDisplayString, unref, vModelText, withCtx, withDirectives, withKeys } from "vue";
32
32
 
33
33
  //#region src/slices/saved_filter/SavedFiltersPage.vue
@@ -421,4 +421,4 @@ var SavedFiltersPage_default = _sfc_main;
421
421
 
422
422
  //#endregion
423
423
  export { SavedFiltersPage_default as default };
424
- //# sourceMappingURL=SavedFiltersPage-p0qGRIuN.js.map
424
+ //# sourceMappingURL=SavedFiltersPage-CawED9Oz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SavedFiltersPage-p0qGRIuN.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-CawED9Oz.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,8 +1,7 @@
1
- import { l as useUserSessionStore, m as useEnv } from "./useRpcAuth-SgNzCAPa.js";
2
- import { t as useMutation } from "./useMutation-DzRSXPB1.js";
3
- import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
4
- import { i as withReturnUrl, n as getValidReturnUrl } from "./useReturnUrl-BBoPnDR3.js";
5
- import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
1
+ import { l as useUserSessionStore, m as useEnv } from "./useRpcAuth-8Byr6SSI.js";
2
+ import { t as useMutation } from "./useMutation-DbzXtqf1.js";
3
+ import { i as setEmailVerificationReturnUrl, o as withReturnUrl, r as getValidReturnUrl, s as AppLink_default, t as getAndClearEmailVerificationReturnUrl } from "./useReturnUrl-Da8PpLb9.js";
4
+ import { computed, createBlock, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, onUnmounted, openBlock, ref, unref, watch, withCtx } from "vue";
6
5
  import { jwtDecode } from "jwt-decode";
7
6
  import { useRoute, useRouter } from "vue-router";
8
7
  import { toast } from "vue3-toastify";
@@ -38,14 +37,20 @@ const signupSchemaWithMetadata = withMetadata(signupSchema, "signupSchema", {
38
37
  //#endregion
39
38
  //#region src/slices/auth/features/signup/Signup.vue
40
39
  const _hoisted_1 = { class: "max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container" };
41
- const _hoisted_2 = { class: "text-center mt-2" };
40
+ const _hoisted_2 = {
41
+ key: 0,
42
+ class: "space-y-4 text-center"
43
+ };
44
+ const _hoisted_3 = { class: "text-center mt-2" };
45
+ const AUTH_CHANNEL = "auth";
42
46
  const _sfc_main = /* @__PURE__ */ defineComponent({
43
47
  __name: "Signup",
44
48
  setup(__props) {
45
49
  function isEmailVerificationRequiredError(error) {
46
50
  if (!error || typeof error !== "object") return false;
47
51
  const e = error;
48
- return e.error_type === "EmailVerificationRequiredError" || e.name === "EmailVerificationRequiredError";
52
+ if (e.error_type === "EmailVerificationRequiredError" || e.error_name === "EmailVerificationRequiredError" || e.name === "EmailVerificationRequiredError") return true;
53
+ return (typeof e.message === "string" ? e.message : "").includes("Please verify your email before logging in");
49
54
  }
50
55
  const { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(signupSchemaWithMetadata, {
51
56
  storeName: "signup-form",
@@ -58,6 +63,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
58
63
  const { emailVerificationMode } = useEnv();
59
64
  const returnUrl = computed(() => route.query.returnUrl);
60
65
  const loginLink = computed(() => withReturnUrl("/auth/login", returnUrl.value));
66
+ const awaitingVerification = ref(false);
61
67
  const { mutate: signupMutate } = useMutation((api, input) => api.users.signupUser(input), { skipAuthCheck: true });
62
68
  const { mutate: loginMutate } = useMutation((api, input) => api.userSessions.login(input), { credentials: "include" });
63
69
  const handleSubmit = async (data) => {
@@ -75,6 +81,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
75
81
  } catch (loginError) {
76
82
  if (isEmailVerificationRequiredError(loginError)) {
77
83
  form.reset();
84
+ if (emailVerificationMode === "strict") {
85
+ awaitingVerification.value = true;
86
+ setEmailVerificationReturnUrl(getValidReturnUrl(route, "/"));
87
+ throw loginError;
88
+ }
78
89
  const verifyPath = withReturnUrl("/auth/verify-email-required", returnUrl.value);
79
90
  await router.push(verifyPath);
80
91
  throw loginError;
@@ -103,8 +114,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
103
114
  const message = error instanceof Error ? error.message : "Registration failed";
104
115
  toast.error(message);
105
116
  };
117
+ let authChannel = null;
118
+ watch(awaitingVerification, (isAwaiting) => {
119
+ authChannel?.close();
120
+ authChannel = null;
121
+ if (!isAwaiting) return;
122
+ authChannel = new BroadcastChannel(AUTH_CHANNEL);
123
+ authChannel.onmessage = (event) => {
124
+ if (event.data?.type === "email_verified") {
125
+ const targetUrl = getAndClearEmailVerificationReturnUrl() ?? getValidReturnUrl(route, "/");
126
+ router.push(targetUrl);
127
+ }
128
+ };
129
+ }, { immediate: true });
130
+ onUnmounted(() => {
131
+ authChannel?.close();
132
+ authChannel = null;
133
+ });
106
134
  return (_ctx, _cache) => {
107
- return openBlock(), createElementBlock("div", _hoisted_1, [_cache[2] || (_cache[2] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Sign Up", -1)), createVNode(unref(ZiniaForm), {
135
+ return openBlock(), createElementBlock("div", _hoisted_1, [_cache[3] || (_cache[3] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Sign Up", -1)), awaitingVerification.value ? (openBlock(), createElementBlock("div", _hoisted_2, [..._cache[0] || (_cache[0] = [createElementVNode("p", { class: "text-base-content/80" }, " We sent a verification link to your email address. Click the link to verify your account, then you can continue. ", -1), createElementVNode("p", { class: "text-sm text-base-content/60" }, " If you opened the link in another tab, we'll redirect you automatically when verification completes. ", -1)])])) : (openBlock(), createBlock(unref(ZiniaForm), {
136
+ key: 1,
108
137
  onHandleSubmit: handleSubmit,
109
138
  onSuccess: handleSuccess,
110
139
  onError: handleError
@@ -117,16 +146,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
117
146
  submitText: "Sign Up",
118
147
  submittingText: "Signing up..."
119
148
  }),
120
- createElementVNode("div", _hoisted_2, [createElementVNode("p", null, [_cache[1] || (_cache[1] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
149
+ createElementVNode("div", _hoisted_3, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
121
150
  class: "link-accent link",
122
151
  to: loginLink.value
123
152
  }, {
124
- default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode("Login", -1)])]),
153
+ default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("Login", -1)])]),
125
154
  _: 1
126
155
  }, 8, ["to"])])])
127
156
  ]),
128
157
  _: 1
129
- })]);
158
+ }))]);
130
159
  };
131
160
  }
132
161
  });
@@ -134,4 +163,4 @@ var Signup_default = _sfc_main;
134
163
 
135
164
  //#endregion
136
165
  export { signupSchemaWithMetadata as n, Signup_default as t };
137
- //# sourceMappingURL=Signup-Ct0m0x78.js.map
166
+ //# sourceMappingURL=Signup-C94alv87.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signup-C94alv87.js","names":["authChannel: BroadcastChannel | null"],"sources":["../src/slices/auth/features/signup/signupSchema.ts","../src/slices/auth/features/signup/Signup.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { signupSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type SignupForm = z.infer<typeof signupSchema>;\n\n// Enhance the schema with metadata\nexport const signupSchemaWithMetadata = withMetadata(signupSchema, 'signupSchema', {\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 <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n >\n <zinia.EmailField />\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\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 { UserDetailsTokenPayload } from '../../../../lib/models/userSession';\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport {\n getValidReturnUrl,\n setEmailVerificationReturnUrl,\n getAndClearEmailVerificationReturnUrl,\n withReturnUrl,\n} from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { SignupInputDto } from '@dragonmastery/dragoncore-shared';\nimport { jwtDecode } from 'jwt-decode';\nimport { computed, ref, watch, onUnmounted } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { signupSchemaWithMetadata } from './signupSchema';\n\nfunction isEmailVerificationRequiredError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const e = error as { error_type?: string; error_name?: string; name?: string; message?: string };\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\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 { emailVerificationMode } = useEnv();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst awaitingVerification = ref(false);\nconst { mutate: signupMutate } = useMutation(\n (api, input: SignupInputDto) => api.users.signupUser(input),\n { skipAuthCheck: true }, // Signup is a public endpoint\n);\nconst { mutate: loginMutate } = useMutation(\n (api, input: { email: string; password: string }) => api.userSessions.login(input),\n { credentials: 'include' }, // Include credentials to allow cookies\n);\n\n// Handle form submission\nconst handleSubmit = async (data: SignupInputDto) => {\n const result = await signupMutate(data);\n if (!result) throw new Error('Signup failed');\n\n try {\n const loginResult = await loginMutate({\n email: data.email,\n password: data.passwords.password,\n });\n\n if (!loginResult?.access_token || !loginResult?.user_details_token) {\n throw new Error('Failed to login after signup');\n }\n\n return {\n access_token: loginResult.access_token,\n user_details_token: loginResult.user_details_token,\n };\n } catch (loginError) {\n if (isEmailVerificationRequiredError(loginError)) {\n form.reset();\n if (emailVerificationMode === 'strict') {\n awaitingVerification.value = true;\n const targetUrl = getValidReturnUrl(route, '/');\n setEmailVerificationReturnUrl(targetUrl);\n throw loginError;\n }\n const verifyPath = withReturnUrl('/auth/verify-email-required', returnUrl.value);\n await router.push(verifyPath);\n throw loginError;\n }\n throw loginError;\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 const defaultRedirect = getValidReturnUrl(route, '/');\n const redirectTo =\n emailVerificationMode !== 'disabled'\n ? (() => {\n try {\n const payload = jwtDecode<UserDetailsTokenPayload>(data.user_details_token);\n const emailVerified = payload.details?.user?.email_verified ?? true;\n return emailVerified ? defaultRedirect : withReturnUrl('/auth/verify-email-required', returnUrl.value);\n } catch {\n return defaultRedirect;\n }\n })()\n : defaultRedirect;\n\n await router.push(redirectTo);\n const wentToVerify = typeof redirectTo === 'string' && redirectTo.startsWith('/auth/verify-email');\n toast.success(\n !wentToVerify\n ? 'Registration successful! You are now logged in.'\n : 'Registration successful! Please check your email to verify your account.',\n );\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\nconst AUTH_CHANNEL = 'auth';\nlet authChannel: BroadcastChannel | null = null;\n\nwatch(\n awaitingVerification,\n (isAwaiting) => {\n authChannel?.close();\n authChannel = null;\n if (!isAwaiting) return;\n authChannel = new BroadcastChannel(AUTH_CHANNEL);\n authChannel.onmessage = (event: MessageEvent<{ type: string }>) => {\n if (event.data?.type === 'email_verified') {\n const targetUrl = getAndClearEmailVerificationReturnUrl() ?? getValidReturnUrl(route, '/');\n router.push(targetUrl);\n }\n };\n },\n { immediate: true },\n);\n\nonUnmounted(() => {\n authChannel?.close();\n authChannel = null;\n});\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import "./useRpcAuth-8Byr6SSI.js";
2
+ import "./useQueryCache-CHG4-HGF.js";
3
+ import "./useMutation-DbzXtqf1.js";
4
+ import "./useReturnUrl-Da8PpLb9.js";
5
+ import { t as Signup_default } from "./Signup-C94alv87.js";
6
+
7
+ export { Signup_default as default };
@@ -0,0 +1,32 @@
1
+ import "./useRpcAuth-8Byr6SSI.js";
2
+ import "./useQueryCache-CHG4-HGF.js";
3
+ import "./useMutation-DbzXtqf1.js";
4
+ import "./useQuery-BKb5JXVS.js";
5
+ import { E as StaffCreateSupportTicketForm_default } from "./src-CkgUIye9.js";
6
+ import "./useReturnUrl-Da8PpLb9.js";
7
+ import "./TimelineSystemEvent-Dj2TMOF6.js";
8
+ import "./TeamMembersTab-4gmnP9sD.js";
9
+ import "./Appearance-BfPdKMXw.js";
10
+ import "./useBreadcrumbs-DmgSucoe.js";
11
+ import "./EditTeamMemberForm-DJW7yRQW.js";
12
+ import "./TeamHistoryTab-BrC6FFIw.js";
13
+ import "./UserProfilePage-X4z2lG-J.js";
14
+ import "./ChangePasswordPage-DXzU3NI9.js";
15
+ import "./TeamNotesTab-B2eETkAz.js";
16
+ import "./CustomerSupportTicketParent-B09_iFpJ.js";
17
+ import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
+ import "./StaffSupportTicketParent-BYxQPuhI.js";
19
+ import "./LoginForm-IEP-hEh0.js";
20
+ import "./Signup-C94alv87.js";
21
+ import "./ForgotPassword-CJjzm9GK.js";
22
+ import "./ResetPassword-DuLuXaNp.js";
23
+ import "./Logout-Cm9kEzgH.js";
24
+ import "./mfaSchema-nfNCcEhM.js";
25
+ import "./MfaSetup-Ch0w-gTN.js";
26
+ import "./MfaVerify-BwzjVrTj.js";
27
+ import "./VerifyEmail-8bsvoDdM.js";
28
+ import "./UserListPage-QSdxrJT6.js";
29
+ import "./CreateUserPage-bwR6fq5C.js";
30
+ import "./EditUserPage-aDygGmfD.js";
31
+
32
+ export { StaffCreateSupportTicketForm_default as default };
@@ -1,13 +1,13 @@
1
- import { t as BATCH_MODE } from "./useRpcAuth-SgNzCAPa.js";
2
- import "./useQueryCache-DIGf3fCM.js";
3
- import { t as useMutation } from "./useMutation-DzRSXPB1.js";
4
- import { t as useQuery } from "./useQuery-bvJabe9Q.js";
5
- import { a as SupportTicketTypeBadge_default, i as SupportTicketApprovalBadge_default, l as formatStaffCreditValue, n as TimelineItem_default, o as SupportTicketPriorityBadge_default, r as formatTicketDate, t as TimelineSystemEvent_default } from "./TimelineSystemEvent-CBwUl5G8.js";
6
- import { n as formatToISODate } from "./convertToLocalDateTime-mKs5eC9T.js";
7
- import { t as extractRpcErrorMessage } from "./extractRpcErrorMessage-pP3v8kKE.js";
8
- import { t as formatTicketDisplayId } from "./displayIdFormatter-rSbbsHIX.js";
9
- import { t as SupportTicketDevLifecycleBadge_default } from "./SupportTicketDevLifecycleBadge-B2NysMAj.js";
10
- import { a as SupportTicketAttachmentsCollapsible_default, i as parseRecordVersions, n as MetadataField_default, r as ActionBannerAlert_default, t as TimelineNoteInput_default } from "./TimelineNoteInput-DGDgyGe-.js";
1
+ import { t as BATCH_MODE } from "./useRpcAuth-8Byr6SSI.js";
2
+ import "./useQueryCache-CHG4-HGF.js";
3
+ import { t as useMutation } from "./useMutation-DbzXtqf1.js";
4
+ import { t as useQuery } from "./useQuery-BKb5JXVS.js";
5
+ import { a as SupportTicketTypeBadge_default, i as SupportTicketApprovalBadge_default, l as formatStaffCreditValue, n as TimelineItem_default, o as SupportTicketPriorityBadge_default, r as formatTicketDate, t as TimelineSystemEvent_default } from "./TimelineSystemEvent-Dj2TMOF6.js";
6
+ import { n as formatToISODate } from "./convertToLocalDateTime-DOSGtMn8.js";
7
+ import { t as extractRpcErrorMessage } from "./extractRpcErrorMessage-C_UbKgHL.js";
8
+ import { t as formatTicketDisplayId } from "./displayIdFormatter-B1ZKgofu.js";
9
+ import { t as SupportTicketDevLifecycleBadge_default } from "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
10
+ import { a as SupportTicketAttachmentsCollapsible_default, i as parseRecordVersions, n as MetadataField_default, r as ActionBannerAlert_default, t as TimelineNoteInput_default } from "./TimelineNoteInput-C0a0WRQC.js";
11
11
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, nextTick, normalizeClass, openBlock, ref, renderList, resolveComponent, toDisplayString, unref, vModelCheckbox, vModelSelect, vModelText, watch, withCtx, withDirectives } from "vue";
12
12
  import { useRoute, useRouter } from "vue-router";
13
13
  import { toast } from "vue3-toastify";
@@ -1925,4 +1925,4 @@ var StaffSupportTicketDetailPage_default = _sfc_main;
1925
1925
 
1926
1926
  //#endregion
1927
1927
  export { StaffSupportTicketDetailPage_default as default };
1928
- //# sourceMappingURL=StaffSupportTicketDetailPage-TaAPQARa.js.map
1928
+ //# sourceMappingURL=StaffSupportTicketDetailPage-DZZN3jmt.js.map