@dragonmastery/dragoncore-vue 0.0.15 → 0.0.17

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 (151) hide show
  1. package/dist/{ChangePasswordPage-DCews8GU.js → ChangePasswordPage-D2Ci00Sh.js} +3 -3
  2. package/dist/{ChangePasswordPage-DCews8GU.js.map → ChangePasswordPage-D2Ci00Sh.js.map} +1 -1
  3. package/dist/ChangePasswordPage-DqnWhaUa.js +6 -0
  4. package/dist/CreateTeamForm-DH0k3ra-.js +32 -0
  5. package/dist/CreateTeamMemberForm-DR0krDAy.js +32 -0
  6. package/dist/{CreateUserPage-B8qeBZij.js → CreateUserPage-DbT_l32W.js} +3 -3
  7. package/dist/{CreateUserPage-B8qeBZij.js.map → CreateUserPage-DbT_l32W.js.map} +1 -1
  8. package/dist/CreateUserPage-cduuWl9g.js +6 -0
  9. package/dist/CreditBalanceDashboard-Bh6G7DdM.js +32 -0
  10. package/dist/CreditManagement-BGqIkJf8.js +32 -0
  11. package/dist/CustomerCreateSupportTicketForm-DROOc8QU.js +32 -0
  12. package/dist/{CustomerSupportTicketDetailPage-ryM1_h1-.js → CustomerSupportTicketDetailPage-CPnNMJRz.js} +9 -9
  13. package/dist/{CustomerSupportTicketDetailPage-ryM1_h1-.js.map → CustomerSupportTicketDetailPage-CPnNMJRz.js.map} +1 -1
  14. package/dist/CustomerSupportTicketList-BdCyjYTK.js +32 -0
  15. package/dist/{CustomerSupportTicketParent-BzY4pmBk.js → CustomerSupportTicketParent-C_vgUq3B.js} +3 -3
  16. package/dist/{CustomerSupportTicketParent-BzY4pmBk.js.map → CustomerSupportTicketParent-C_vgUq3B.js.map} +1 -1
  17. package/dist/CustomerSupportTicketParent-Ex-sumQ_.js +7 -0
  18. package/dist/CustomerSupportTicketSuccess-BiccWyEb.js +32 -0
  19. package/dist/EditTeamForm-COtlNY2k.js +32 -0
  20. package/dist/EditTeamMemberForm-8CNRrEIT.js +6 -0
  21. package/dist/{EditTeamMemberForm-CKbKomrL.js → EditTeamMemberForm-y4Klbm2x.js} +3 -3
  22. package/dist/{EditTeamMemberForm-CKbKomrL.js.map → EditTeamMemberForm-y4Klbm2x.js.map} +1 -1
  23. package/dist/{EditUserPage-XqF25iwz.js → EditUserPage-0lqrgP5T.js} +4 -4
  24. package/dist/{EditUserPage-XqF25iwz.js.map → EditUserPage-0lqrgP5T.js.map} +1 -1
  25. package/dist/EditUserPage-BgMNOa8G.js +7 -0
  26. package/dist/{ForgotPassword-D3bjL48L.js → ForgotPassword-CiEfdVT-.js} +12 -8
  27. package/dist/ForgotPassword-CiEfdVT-.js.map +1 -0
  28. package/dist/ForgotPassword-DTqvZE3S.js +7 -0
  29. package/dist/LoginForm-INwjqMmZ.js +7 -0
  30. package/dist/{LoginForm-C85U2E2r.js → LoginForm-o4gJ0QwA.js} +17 -17
  31. package/dist/LoginForm-o4gJ0QwA.js.map +1 -0
  32. package/dist/{Logout-DZuWLh0O.js → Logout-D8Ql8-OY.js} +11 -8
  33. package/dist/Logout-D8Ql8-OY.js.map +1 -0
  34. package/dist/Logout-KA5WB93_.js +6 -0
  35. package/dist/MfaSetup-B3-QSuKe.js +8 -0
  36. package/dist/MfaSetup-DzaJLZtx.js +113 -0
  37. package/dist/MfaSetup-DzaJLZtx.js.map +1 -0
  38. package/dist/MfaVerify-5DOMPhdq.js +8 -0
  39. package/dist/MfaVerify-C04XD4r3.js +86 -0
  40. package/dist/MfaVerify-C04XD4r3.js.map +1 -0
  41. package/dist/ResetPassword-DcVvfMU3.js +92 -0
  42. package/dist/ResetPassword-DcVvfMU3.js.map +1 -0
  43. package/dist/ResetPassword-rtEJreLv.js +7 -0
  44. package/dist/{SavedFiltersPage-rG33pF5X.js → SavedFiltersPage-PfwukNXV.js} +27 -22
  45. package/dist/{SavedFiltersPage-rG33pF5X.js.map → SavedFiltersPage-PfwukNXV.js.map} +1 -1
  46. package/dist/Signup-DWFxpoGA.js +7 -0
  47. package/dist/{Signup-hpV8J5cM.js → Signup-Wz2h_ayt.js} +52 -21
  48. package/dist/Signup-Wz2h_ayt.js.map +1 -0
  49. package/dist/StaffCreateSupportTicketForm-Cs3puA0j.js +32 -0
  50. package/dist/{StaffSupportTicketDetailPage-_ZOQgWv0.js → StaffSupportTicketDetailPage-DDkJcKVC.js} +10 -10
  51. package/dist/{StaffSupportTicketDetailPage-_ZOQgWv0.js.map → StaffSupportTicketDetailPage-DDkJcKVC.js.map} +1 -1
  52. package/dist/StaffSupportTicketList-B3HBQJ9r.js +32 -0
  53. package/dist/StaffSupportTicketParent-BiyZAW5w.js +7 -0
  54. package/dist/{StaffSupportTicketParent-CWWhaM37.js → StaffSupportTicketParent-Bp5pNF45.js} +3 -3
  55. package/dist/{StaffSupportTicketParent-CWWhaM37.js.map → StaffSupportTicketParent-Bp5pNF45.js.map} +1 -1
  56. package/dist/StaffSupportTicketSuccess-CegCdk-v.js +32 -0
  57. package/dist/{SupportStaffPage-nd0HowtH.js → SupportStaffPage-DwILSSas.js} +5 -5
  58. package/dist/{SupportStaffPage-nd0HowtH.js.map → SupportStaffPage-DwILSSas.js.map} +1 -1
  59. package/dist/{SupportTicketDevLifecycleBadge-Ba-Rm6QW.js → SupportTicketDevLifecycleBadge-B2NysMAj.js} +1 -1
  60. package/dist/{SupportTicketDevLifecycleBadge-Ba-Rm6QW.js.map → SupportTicketDevLifecycleBadge-B2NysMAj.js.map} +1 -1
  61. package/dist/{SupportTicketMaintenancePage-rcJ7EfDj.js → SupportTicketMaintenancePage-CpK1esq2.js} +4 -4
  62. package/dist/{SupportTicketMaintenancePage-rcJ7EfDj.js.map → SupportTicketMaintenancePage-CpK1esq2.js.map} +1 -1
  63. package/dist/TeamAttachmentsTab-B6_qHPKJ.js +32 -0
  64. package/dist/{TeamHistoryTab-CNelXR3Q.js → TeamHistoryTab-B3DvaIzC.js} +2 -2
  65. package/dist/{TeamHistoryTab-CNelXR3Q.js.map → TeamHistoryTab-B3DvaIzC.js.map} +1 -1
  66. package/dist/TeamHistoryTab-HXc3zqhQ.js +4 -0
  67. package/dist/TeamList-DrMqaMvI.js +32 -0
  68. package/dist/TeamMemberList-CEV6-g3t.js +32 -0
  69. package/dist/TeamMemberParent-D-MnEdRq.js +32 -0
  70. package/dist/TeamNotesTab-BlmZQfCR.js +7 -0
  71. package/dist/{TeamNotesTab-BhVRLG8h.js → TeamNotesTab-DBrJGCIe.js} +5 -5
  72. package/dist/{TeamNotesTab-BhVRLG8h.js.map → TeamNotesTab-DBrJGCIe.js.map} +1 -1
  73. package/dist/TeamParent-Dw6Njuup.js +32 -0
  74. package/dist/{TimelineNoteInput-CdfuzIeI.js → TimelineNoteInput-DGDgyGe-.js} +2 -2
  75. package/dist/{TimelineNoteInput-CdfuzIeI.js.map → TimelineNoteInput-DGDgyGe-.js.map} +1 -1
  76. package/dist/{TimelineSystemEvent-D58zN850.js → TimelineSystemEvent-CBwUl5G8.js} +4 -4
  77. package/dist/{TimelineSystemEvent-D58zN850.js.map → TimelineSystemEvent-CBwUl5G8.js.map} +1 -1
  78. package/dist/{UserListPage-OGYOLwlw.js → UserListPage-BGDgsd_S.js} +2 -2
  79. package/dist/{UserListPage-OGYOLwlw.js.map → UserListPage-BGDgsd_S.js.map} +1 -1
  80. package/dist/UserListPage-BZp9fGeT.js +4 -0
  81. package/dist/UserProfilePage-D52_Q5yf.js +7 -0
  82. package/dist/{UserProfilePage-uAIfC_NW.js → UserProfilePage-DMwDVgXa.js} +67 -22
  83. package/dist/UserProfilePage-DMwDVgXa.js.map +1 -0
  84. package/dist/VerifyEmail-CG1BHGSh.js +7 -0
  85. package/dist/VerifyEmail-CUexC8mg.js +140 -0
  86. package/dist/VerifyEmail-CUexC8mg.js.map +1 -0
  87. package/dist/VerifyEmailRequired-C35bkaXZ.js +75 -0
  88. package/dist/VerifyEmailRequired-C35bkaXZ.js.map +1 -0
  89. package/dist/ViewTeam-D9PDDpY6.js +32 -0
  90. package/dist/ViewTeamMember-sJb79wUy.js +32 -0
  91. package/dist/{displayIdFormatter-B1ZKgofu.js → displayIdFormatter-rSbbsHIX.js} +1 -1
  92. package/dist/{displayIdFormatter-B1ZKgofu.js.map → displayIdFormatter-rSbbsHIX.js.map} +1 -1
  93. package/dist/index.d.ts +306 -210
  94. package/dist/index.js +29 -23
  95. package/dist/mfaSchema-_vbG9jiT.js +30 -0
  96. package/dist/mfaSchema-_vbG9jiT.js.map +1 -0
  97. package/dist/{src-BUN-mdXa.js → src-DYBi81fS.js} +473 -400
  98. package/dist/src-DYBi81fS.js.map +1 -0
  99. package/dist/{useMutation-B4_S4Xoa.js → useMutation-DzRSXPB1.js} +3 -3
  100. package/dist/{useMutation-B4_S4Xoa.js.map → useMutation-DzRSXPB1.js.map} +1 -1
  101. package/dist/{useQuery-B7ndu5_P.js → useQuery-bvJabe9Q.js} +3 -3
  102. package/dist/{useQuery-B7ndu5_P.js.map → useQuery-bvJabe9Q.js.map} +1 -1
  103. package/dist/{useQueryCache-DqcDMsxb.js → useQueryCache-DIGf3fCM.js} +2 -2
  104. package/dist/{useQueryCache-DqcDMsxb.js.map → useQueryCache-DIGf3fCM.js.map} +1 -1
  105. package/dist/useReturnUrl-DobHOKp3.js +23 -0
  106. package/dist/useReturnUrl-DobHOKp3.js.map +1 -0
  107. package/dist/{useRpcAuth-Dp2sec-X.js → useRpcAuth-SgNzCAPa.js} +2 -1
  108. package/dist/useRpcAuth-SgNzCAPa.js.map +1 -0
  109. package/package.json +2 -2
  110. package/dist/ChangePasswordPage-Dm5vW0nl.js +0 -6
  111. package/dist/CreateTeamForm-Cm8DOOXF.js +0 -27
  112. package/dist/CreateTeamMemberForm-CcdQys0C.js +0 -27
  113. package/dist/CreateUserPage-WjYDkwpb.js +0 -6
  114. package/dist/CreditBalanceDashboard-RLAnIiVN.js +0 -27
  115. package/dist/CreditManagement-DGLhDOO5.js +0 -27
  116. package/dist/CustomerCreateSupportTicketForm-Dv0ZMYrw.js +0 -27
  117. package/dist/CustomerSupportTicketList-Cfe8gqiX.js +0 -27
  118. package/dist/CustomerSupportTicketParent-BnmTFigo.js +0 -7
  119. package/dist/CustomerSupportTicketSuccess-DnnRkxsI.js +0 -27
  120. package/dist/EditTeamForm-DzEAqBhc.js +0 -27
  121. package/dist/EditTeamMemberForm-B8-pI6Xm.js +0 -6
  122. package/dist/EditUserPage-BG-Fkx_c.js +0 -7
  123. package/dist/ForgotPassword-CjWv2V7p.js +0 -7
  124. package/dist/ForgotPassword-D3bjL48L.js.map +0 -1
  125. package/dist/LoginForm--br4Il85.js +0 -7
  126. package/dist/LoginForm-C85U2E2r.js.map +0 -1
  127. package/dist/Logout-DHT-5Qz3.js +0 -6
  128. package/dist/Logout-DZuWLh0O.js.map +0 -1
  129. package/dist/ResetPassword-COmnbNlg.js +0 -27
  130. package/dist/Signup-VZa7U-Ur.js +0 -7
  131. package/dist/Signup-hpV8J5cM.js.map +0 -1
  132. package/dist/StaffCreateSupportTicketForm-CIDdUNcs.js +0 -27
  133. package/dist/StaffSupportTicketList-DPIu3W50.js +0 -27
  134. package/dist/StaffSupportTicketParent-Dp1G85wc.js +0 -7
  135. package/dist/StaffSupportTicketSuccess-8lYa8_Sm.js +0 -27
  136. package/dist/TeamAttachmentsTab-VUrIDPW6.js +0 -27
  137. package/dist/TeamHistoryTab-siesF93u.js +0 -4
  138. package/dist/TeamList-BOXFY4cO.js +0 -27
  139. package/dist/TeamMemberList-BwqpVaNc.js +0 -27
  140. package/dist/TeamMemberParent-DIxwJ6EP.js +0 -27
  141. package/dist/TeamNotesTab-Crp-afAe.js +0 -7
  142. package/dist/TeamParent-pEhBNWqh.js +0 -27
  143. package/dist/UserListPage-D68AjrjM.js +0 -4
  144. package/dist/UserProfilePage-Q68NAGQQ.js +0 -7
  145. package/dist/UserProfilePage-uAIfC_NW.js.map +0 -1
  146. package/dist/ViewTeam-Cexcjy9c.js +0 -27
  147. package/dist/ViewTeamMember-DKBKSsAc.js +0 -27
  148. package/dist/src-BUN-mdXa.js.map +0 -1
  149. package/dist/useRpcAuth-Dp2sec-X.js.map +0 -1
  150. /package/dist/{Appearance-C3WguxT-.js → Appearance-CohgRf-_.js} +0 -0
  151. /package/dist/{TeamMembersTab-DTJxmb-M.js → TeamMembersTab-CpE9BaCi.js} +0 -0
@@ -0,0 +1,8 @@
1
+ import "./useRpcAuth-SgNzCAPa.js";
2
+ import "./useQueryCache-DIGf3fCM.js";
3
+ import "./useMutation-DzRSXPB1.js";
4
+ import "./AppLink-CHMMrSFI.js";
5
+ import "./mfaSchema-_vbG9jiT.js";
6
+ import { t as MfaVerify_default } from "./MfaVerify-C04XD4r3.js";
7
+
8
+ export { MfaVerify_default as default };
@@ -0,0 +1,86 @@
1
+ import { l as useUserSessionStore } 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 { n as withReturnUrl, t as getValidReturnUrl } from "./useReturnUrl-DobHOKp3.js";
5
+ import { n as mfaVerifySchemaWithMetadata } from "./mfaSchema-_vbG9jiT.js";
6
+ import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
7
+ import { useRoute, useRouter } from "vue-router";
8
+ import { toast } from "vue3-toastify";
9
+ import { useForm } from "@dragonmastery/zinia-forms-core";
10
+
11
+ //#region src/slices/auth/features/mfa/MfaVerify.vue
12
+ const _hoisted_1 = { class: "max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container" };
13
+ const _hoisted_2 = { class: "text-center mt-2" };
14
+ const _sfc_main = /* @__PURE__ */ defineComponent({
15
+ __name: "MfaVerify",
16
+ setup(__props) {
17
+ const router = useRouter();
18
+ const route = useRoute();
19
+ const sessionStore = useUserSessionStore();
20
+ const returnUrl = computed(() => route.query.returnUrl);
21
+ const loginLink = computed(() => withReturnUrl("/auth/login", returnUrl.value));
22
+ const mfaSessionId = route.query.mfaSessionId;
23
+ const { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(mfaVerifySchemaWithMetadata, {
24
+ storeName: "mfa-verify-form",
25
+ persistToLocalStorage: false,
26
+ renderStyle: "daisy_ui"
27
+ });
28
+ const { mutate: verifyMutate } = useMutation((api, input) => {
29
+ const mfa = api.mfa;
30
+ if (!mfa) throw new Error("MFA is not configured for this application");
31
+ return mfa.verify(input.mfaSessionId, input.code);
32
+ }, { credentials: "include" });
33
+ const handleSubmit = async (data) => {
34
+ if (!mfaSessionId) throw new Error("Invalid MFA session. Please try logging in again.");
35
+ const result = await verifyMutate({
36
+ mfaSessionId,
37
+ code: data.code
38
+ });
39
+ if (!result?.access_token || !result?.user_details_token) throw new Error("Verification failed");
40
+ return result;
41
+ };
42
+ const handleSuccess = async (data) => {
43
+ sessionStore.setSession(data.user_details_token);
44
+ sessionStore.setAccessToken(data.access_token);
45
+ form.reset();
46
+ const targetPath = getValidReturnUrl(route, "/");
47
+ await router.push(targetPath);
48
+ toast.success("You are now logged in!");
49
+ };
50
+ const handleError = (error) => {
51
+ toast.error(error.message || "Verification failed");
52
+ };
53
+ return (_ctx, _cache) => {
54
+ return openBlock(), createElementBlock("div", _hoisted_1, [
55
+ _cache[1] || (_cache[1] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Two-Factor Authentication", -1)),
56
+ _cache[2] || (_cache[2] = createElementVNode("p", { class: "text-base-content/80 mb-4" }, " Enter the 6-digit code from your authenticator app to complete sign in. ", -1)),
57
+ createVNode(unref(ZiniaForm), {
58
+ onHandleSubmit: handleSubmit,
59
+ onSuccess: handleSuccess,
60
+ onError: handleError
61
+ }, {
62
+ default: withCtx(() => [
63
+ createVNode(unref(zinia).CodeField),
64
+ createVNode(unref(ZiniaSubmitButton), {
65
+ submitText: "Verify",
66
+ submittingText: "Verifying..."
67
+ }),
68
+ createElementVNode("div", _hoisted_2, [createVNode(AppLink_default, {
69
+ class: "link-accent link",
70
+ to: loginLink.value
71
+ }, {
72
+ default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode("Back to Login", -1)])]),
73
+ _: 1
74
+ }, 8, ["to"])])
75
+ ]),
76
+ _: 1
77
+ })
78
+ ]);
79
+ };
80
+ }
81
+ });
82
+ var MfaVerify_default = _sfc_main;
83
+
84
+ //#endregion
85
+ export { MfaVerify_default as t };
86
+ //# sourceMappingURL=MfaVerify-C04XD4r3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MfaVerify-C04XD4r3.js","names":[],"sources":["../src/slices/auth/features/mfa/MfaVerify.vue"],"sourcesContent":["<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\">Two-Factor Authentication</h1>\n\n <p class=\"text-base-content/80 mb-4\">\n Enter the 6-digit code from your authenticator app to complete sign in.\n </p>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.CodeField />\n <ZiniaSubmitButton submitText=\"Verify\" submittingText=\"Verifying...\" />\n\n <div class=\"text-center mt-2\">\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Back to Login</AppLink>\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 { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport type { MfaApi } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\nimport { mfaVerifySchemaWithMetadata } from './mfaSchema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst sessionStore = useUserSessionStore();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst mfaSessionId = route.query.mfaSessionId as string;\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(mfaVerifySchemaWithMetadata, {\n storeName: 'mfa-verify-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst { mutate: verifyMutate } = useMutation(\n (api, input: { mfaSessionId: string; code: string }) => {\n const mfa = (api as DragoncoreApi).mfa;\n if (!mfa) throw new Error('MFA is not configured for this application');\n return (mfa as MfaApi).verify(input.mfaSessionId, input.code);\n },\n { credentials: 'include' },\n);\n\nconst handleSubmit = async (data: z.infer<typeof mfaVerifySchemaWithMetadata>) => {\n if (!mfaSessionId) throw new Error('Invalid MFA session. Please try logging in again.');\n const result = await verifyMutate({ mfaSessionId, code: data.code });\n if (!result?.access_token || !result?.user_details_token) throw new Error('Verification failed');\n return result;\n};\n\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 form.reset();\n\n const targetPath = getValidReturnUrl(route, '/');\n await router.push(targetPath);\n toast.success('You are now logged in!');\n};\n\nconst handleError = (error: Error) => {\n toast.error(error.message || 'Verification failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;EAiCA,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,UAAU;EACxB,MAAM,eAAe,qBAAqB;EAE1C,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAC/E,MAAM,eAAe,MAAM,MAAM;EAEjC,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QAAQ,6BAA6B;GACzF,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CAAC;EAEF,MAAM,EAAE,QAAQ,iBAAiB,aAC9B,KAAK,UAAkD;GACtD,MAAM,MAAO,IAAsB;AACnC,OAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,UAAQ,IAAe,OAAO,MAAM,cAAc,MAAM,KAAK;KAE/D,EAAE,aAAa,WAAW,CAC3B;EAED,MAAM,eAAe,OAAO,SAAsD;AAChF,OAAI,CAAC,aAAc,OAAM,IAAI,MAAM,oDAAoD;GACvF,MAAM,SAAS,MAAM,aAAa;IAAE;IAAc,MAAM,KAAK;IAAM,CAAC;AACpE,OAAI,CAAC,QAAQ,gBAAgB,CAAC,QAAQ,mBAAoB,OAAM,IAAI,MAAM,sBAAsB;AAChG,UAAO;;EAGT,MAAM,gBAAgB,OAAO,SAA+D;AAC1F,gBAAa,WAAW,KAAK,mBAAmB;AAChD,gBAAa,eAAe,KAAK,aAAa;AAC9C,QAAK,OAAO;GAEZ,MAAM,aAAa,kBAAkB,OAAO,IAAI;AAChD,SAAM,OAAO,KAAK,WAAW;AAC7B,SAAM,QAAQ,yBAAyB;;EAGzC,MAAM,eAAe,UAAiB;AACpC,SAAM,MAAM,MAAM,WAAW,sBAAsB;;;uBAzEnD,mBAeM,OAfN,YAeM;8BAdJ,mBAA8E,MAAA,EAA1E,OAAM,uCAAqC,EAAC,6BAAyB,GAAA;8BAEzE,mBAEI,KAAA,EAFD,OAAM,6BAA2B,EAAC,6EAErC,GAAA;IAEA,YAOY,MAAA,UAAA,EAAA;KAPA,gBAAe;KAAe,WAAS;KAAgB,SAAO;;4BACrD;MAAnB,YAAmB,MAAA,MAAA,CAAA,UAAA;MACnB,YAAuE,MAAA,kBAAA,EAAA;OAApD,YAAW;OAAS,gBAAe;;MAEtD,mBAEM,OAFN,YAEM,CADJ,YAAyE,iBAAA;OAAhE,OAAM;OAAoB,IAAI,UAAA;;8BAAwB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAb,iBAAa,GAAA,CAAA,EAAA,CAAA"}
@@ -0,0 +1,92 @@
1
+ import { t as useMutation } from "./useMutation-DzRSXPB1.js";
2
+ import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
3
+ import { n as withReturnUrl } from "./useReturnUrl-DobHOKp3.js";
4
+ import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
5
+ import { useRoute, useRouter } from "vue-router";
6
+ import { toast } from "vue3-toastify";
7
+ import { resetPasswordInputSchema } from "@dragonmastery/dragoncore-shared";
8
+ import { useForm, withMetadata } from "@dragonmastery/zinia-forms-core";
9
+
10
+ //#region src/slices/auth/features/reset_password/reset_password_schema.ts
11
+ const resetPasswordSchemaWithMetadata = withMetadata(resetPasswordInputSchema, "resetPasswordSchema", {
12
+ "passwords.password": {
13
+ inputType: "password",
14
+ placeholder: "••••••••",
15
+ helpText: "Must be at least 8 characters",
16
+ autocomplete: "new-password",
17
+ className: "login-field"
18
+ },
19
+ "passwords.password_confirm": {
20
+ inputType: "password",
21
+ placeholder: "••••••••",
22
+ helpText: "Must be at least 8 characters",
23
+ autocomplete: "new-password",
24
+ className: "login-field"
25
+ }
26
+ });
27
+
28
+ //#endregion
29
+ //#region src/slices/auth/features/reset_password/ResetPassword.vue
30
+ const _hoisted_1 = { class: "max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container" };
31
+ const _hoisted_2 = { class: "text-center mt-2" };
32
+ const _sfc_main = /* @__PURE__ */ defineComponent({
33
+ __name: "ResetPassword",
34
+ setup(__props) {
35
+ const router = useRouter();
36
+ const route = useRoute();
37
+ const token = route.params.token;
38
+ const returnUrl = computed(() => route.query.returnUrl);
39
+ const loginLink = computed(() => withReturnUrl("/auth/login", returnUrl.value));
40
+ const { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(resetPasswordSchemaWithMetadata, {
41
+ storeName: "reset-password-form",
42
+ persistToLocalStorage: false,
43
+ renderStyle: "daisy_ui"
44
+ });
45
+ const { mutate: resetPasswordMutate } = useMutation((api, input) => api.passwordReset.resetPassword(input), { skipAuthCheck: true });
46
+ const handleSubmit = async (data) => {
47
+ const result = await resetPasswordMutate({
48
+ ...data,
49
+ token
50
+ });
51
+ if (!result?.ok) throw new Error("Reset password failed");
52
+ return result;
53
+ };
54
+ const handleSuccess = async (_data) => {
55
+ form.reset();
56
+ await router.push(loginLink.value);
57
+ toast.success("Password reset successful!");
58
+ };
59
+ const handleError = (error) => {
60
+ toast.error(error instanceof Error ? error.message : "Reset password failed");
61
+ };
62
+ return (_ctx, _cache) => {
63
+ return openBlock(), createElementBlock("div", _hoisted_1, [_cache[2] || (_cache[2] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Reset Password", -1)), createVNode(unref(ZiniaForm), {
64
+ onHandleSubmit: handleSubmit,
65
+ onSuccess: handleSuccess,
66
+ onError: handleError
67
+ }, {
68
+ default: withCtx(() => [
69
+ createVNode(unref(zinia).PasswordsPasswordField),
70
+ createVNode(unref(zinia).PasswordsPasswordConfirmField),
71
+ createVNode(unref(ZiniaSubmitButton), {
72
+ submitText: "Reset Password",
73
+ submittingText: "Resetting Password..."
74
+ }),
75
+ createElementVNode("div", _hoisted_2, [createElementVNode("p", null, [_cache[1] || (_cache[1] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
76
+ class: "link-accent link",
77
+ to: loginLink.value
78
+ }, {
79
+ default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode("Login", -1)])]),
80
+ _: 1
81
+ }, 8, ["to"])])])
82
+ ]),
83
+ _: 1
84
+ })]);
85
+ };
86
+ }
87
+ });
88
+ var ResetPassword_default = _sfc_main;
89
+
90
+ //#endregion
91
+ export { resetPasswordSchemaWithMetadata as n, ResetPassword_default as t };
92
+ //# sourceMappingURL=ResetPassword-DcVvfMU3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResetPassword-DcVvfMU3.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,7 @@
1
+ import "./useRpcAuth-SgNzCAPa.js";
2
+ import "./useQueryCache-DIGf3fCM.js";
3
+ import "./useMutation-DzRSXPB1.js";
4
+ import "./AppLink-CHMMrSFI.js";
5
+ import { t as ResetPassword_default } from "./ResetPassword-DcVvfMU3.js";
6
+
7
+ export { ResetPassword_default as default };
@@ -1,28 +1,33 @@
1
- import "./useRpcAuth-Dp2sec-X.js";
2
- import "./useQueryCache-DqcDMsxb.js";
3
- import { t as useMutation } from "./useMutation-B4_S4Xoa.js";
4
- import { t as useQuery } from "./useQuery-B7ndu5_P.js";
5
- import { tn as useInjectedPinnedPresets } from "./src-BUN-mdXa.js";
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-DYBi81fS.js";
6
6
  import "./AppLink-CHMMrSFI.js";
7
- import { d as ConfirmDialog_default } from "./TimelineSystemEvent-D58zN850.js";
7
+ import { d as ConfirmDialog_default } from "./TimelineSystemEvent-CBwUl5G8.js";
8
8
  import "./TeamMembersTab-4gmnP9sD.js";
9
9
  import "./Appearance-BfPdKMXw.js";
10
10
  import "./useBreadcrumbs-DmgSucoe.js";
11
- import "./EditTeamMemberForm-CKbKomrL.js";
12
- import "./TeamHistoryTab-CNelXR3Q.js";
13
- import "./UserProfilePage-uAIfC_NW.js";
14
- import "./ChangePasswordPage-DCews8GU.js";
15
- import "./TeamNotesTab-BhVRLG8h.js";
16
- import "./CustomerSupportTicketParent-BzY4pmBk.js";
17
- import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
- import "./StaffSupportTicketParent-CWWhaM37.js";
19
- import "./LoginForm-C85U2E2r.js";
20
- import "./Signup-hpV8J5cM.js";
21
- import "./ForgotPassword-D3bjL48L.js";
22
- import "./Logout-DZuWLh0O.js";
23
- import "./UserListPage-OGYOLwlw.js";
24
- import "./CreateUserPage-B8qeBZij.js";
25
- import "./EditUserPage-XqF25iwz.js";
11
+ import "./EditTeamMemberForm-y4Klbm2x.js";
12
+ import "./TeamHistoryTab-B3DvaIzC.js";
13
+ import "./UserProfilePage-DMwDVgXa.js";
14
+ import "./ChangePasswordPage-D2Ci00Sh.js";
15
+ import "./TeamNotesTab-DBrJGCIe.js";
16
+ import "./CustomerSupportTicketParent-C_vgUq3B.js";
17
+ import "./SupportTicketDevLifecycleBadge-B2NysMAj.js";
18
+ import "./StaffSupportTicketParent-Bp5pNF45.js";
19
+ import "./LoginForm-o4gJ0QwA.js";
20
+ import "./Signup-Wz2h_ayt.js";
21
+ import "./ForgotPassword-CiEfdVT-.js";
22
+ import "./ResetPassword-DcVvfMU3.js";
23
+ import "./Logout-D8Ql8-OY.js";
24
+ import "./mfaSchema-_vbG9jiT.js";
25
+ import "./MfaSetup-DzaJLZtx.js";
26
+ import "./MfaVerify-C04XD4r3.js";
27
+ import "./VerifyEmail-CUexC8mg.js";
28
+ import "./UserListPage-BGDgsd_S.js";
29
+ import "./CreateUserPage-DbT_l32W.js";
30
+ import "./EditUserPage-0lqrgP5T.js";
26
31
  import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, renderList, resolveComponent, toDisplayString, unref, vModelText, withCtx, withDirectives, withKeys } from "vue";
27
32
 
28
33
  //#region src/slices/saved_filter/SavedFiltersPage.vue
@@ -416,4 +421,4 @@ var SavedFiltersPage_default = _sfc_main;
416
421
 
417
422
  //#endregion
418
423
  export { SavedFiltersPage_default as default };
419
- //# sourceMappingURL=SavedFiltersPage-rG33pF5X.js.map
424
+ //# sourceMappingURL=SavedFiltersPage-PfwukNXV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SavedFiltersPage-rG33pF5X.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-PfwukNXV.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,7 @@
1
+ import "./useRpcAuth-SgNzCAPa.js";
2
+ import "./useQueryCache-DIGf3fCM.js";
3
+ import "./useMutation-DzRSXPB1.js";
4
+ import "./AppLink-CHMMrSFI.js";
5
+ import { t as Signup_default } from "./Signup-Wz2h_ayt.js";
6
+
7
+ export { Signup_default as default };
@@ -1,11 +1,13 @@
1
- import { l as useUserSessionStore } from "./useRpcAuth-Dp2sec-X.js";
2
- import { t as useMutation } from "./useMutation-B4_S4Xoa.js";
1
+ import { l as useUserSessionStore, m as useEnv } from "./useRpcAuth-SgNzCAPa.js";
2
+ import { t as useMutation } from "./useMutation-DzRSXPB1.js";
3
3
  import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
4
- import { createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
5
- import { useRouter } from "vue-router";
4
+ import { n as withReturnUrl, t as getValidReturnUrl } from "./useReturnUrl-DobHOKp3.js";
5
+ import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
6
+ import { jwtDecode } from "jwt-decode";
7
+ import { useRoute, useRouter } from "vue-router";
8
+ import { toast } from "vue3-toastify";
6
9
  import { signupSchema } from "@dragonmastery/dragoncore-shared";
7
10
  import { useForm, withMetadata } from "@dragonmastery/zinia-forms-core";
8
- import { toast } from "vue3-toastify";
9
11
 
10
12
  //#region src/slices/auth/features/signup/signupSchema.ts
11
13
  const signupSchemaWithMetadata = withMetadata(signupSchema, "signupSchema", {
@@ -40,37 +42,66 @@ const _hoisted_2 = { class: "text-center mt-2" };
40
42
  const _sfc_main = /* @__PURE__ */ defineComponent({
41
43
  __name: "Signup",
42
44
  setup(__props) {
45
+ function isEmailVerificationRequiredError(error) {
46
+ if (!error || typeof error !== "object") return false;
47
+ const e = error;
48
+ return e.error_type === "EmailVerificationRequiredError" || e.name === "EmailVerificationRequiredError";
49
+ }
43
50
  const { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(signupSchemaWithMetadata, {
44
51
  storeName: "signup-form",
45
52
  persistToLocalStorage: false,
46
53
  renderStyle: "daisy_ui"
47
54
  });
48
55
  const sessionStore = useUserSessionStore();
56
+ const route = useRoute();
49
57
  const router = useRouter();
58
+ const { emailVerificationMode } = useEnv();
59
+ const returnUrl = computed(() => route.query.returnUrl);
60
+ const loginLink = computed(() => withReturnUrl("/auth/login", returnUrl.value));
50
61
  const { mutate: signupMutate } = useMutation((api, input) => api.users.signupUser(input), { skipAuthCheck: true });
51
62
  const { mutate: loginMutate } = useMutation((api, input) => api.userSessions.login(input), { credentials: "include" });
52
63
  const handleSubmit = async (data) => {
53
64
  if (!await signupMutate(data)) throw new Error("Signup failed");
54
- const loginResult = await loginMutate({
55
- email: data.email,
56
- password: data.passwords.password
57
- });
58
- if (!loginResult?.access_token || !loginResult?.user_details_token) throw new Error("Failed to login after signup");
59
- return {
60
- access_token: loginResult.access_token,
61
- user_details_token: loginResult.user_details_token
62
- };
65
+ try {
66
+ const loginResult = await loginMutate({
67
+ email: data.email,
68
+ password: data.passwords.password
69
+ });
70
+ if (!loginResult?.access_token || !loginResult?.user_details_token) throw new Error("Failed to login after signup");
71
+ return {
72
+ access_token: loginResult.access_token,
73
+ user_details_token: loginResult.user_details_token
74
+ };
75
+ } catch (loginError) {
76
+ if (isEmailVerificationRequiredError(loginError)) {
77
+ form.reset();
78
+ const verifyPath = withReturnUrl("/auth/verify-email-required", returnUrl.value);
79
+ await router.push(verifyPath);
80
+ throw loginError;
81
+ }
82
+ throw loginError;
83
+ }
63
84
  };
64
85
  const handleSuccess = async (data) => {
65
86
  sessionStore.setSession(data.user_details_token);
66
87
  sessionStore.setAccessToken(data.access_token);
67
88
  form.reset();
68
- await router.push("/");
69
- toast.success("Registration successful! You are now logged in.");
89
+ const defaultRedirect = getValidReturnUrl(route, "/");
90
+ const redirectTo = emailVerificationMode !== "disabled" ? (() => {
91
+ try {
92
+ return jwtDecode(data.user_details_token).details?.user?.email_verified ?? true ? defaultRedirect : withReturnUrl("/auth/verify-email-required", returnUrl.value);
93
+ } catch {
94
+ return defaultRedirect;
95
+ }
96
+ })() : defaultRedirect;
97
+ await router.push(redirectTo);
98
+ const wentToVerify = typeof redirectTo === "string" && redirectTo.startsWith("/auth/verify-email");
99
+ toast.success(!wentToVerify ? "Registration successful! You are now logged in." : "Registration successful! Please check your email to verify your account.");
70
100
  };
71
101
  const handleError = (error) => {
72
- console.log("Signup failed", error);
73
- toast.error(error.message || "Registration failed");
102
+ if (isEmailVerificationRequiredError(error)) return;
103
+ const message = error instanceof Error ? error.message : "Registration failed";
104
+ toast.error(message);
74
105
  };
75
106
  return (_ctx, _cache) => {
76
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), {
@@ -88,11 +119,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
88
119
  }),
89
120
  createElementVNode("div", _hoisted_2, [createElementVNode("p", null, [_cache[1] || (_cache[1] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
90
121
  class: "link-accent link",
91
- to: "/auth/login"
122
+ to: loginLink.value
92
123
  }, {
93
124
  default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode("Login", -1)])]),
94
125
  _: 1
95
- })])])
126
+ }, 8, ["to"])])])
96
127
  ]),
97
128
  _: 1
98
129
  })]);
@@ -103,4 +134,4 @@ var Signup_default = _sfc_main;
103
134
 
104
135
  //#endregion
105
136
  export { signupSchemaWithMetadata as n, Signup_default as t };
106
- //# sourceMappingURL=Signup-hpV8J5cM.js.map
137
+ //# sourceMappingURL=Signup-Wz2h_ayt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signup-Wz2h_ayt.js","names":[],"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 <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\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 { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { SignupInputDto } from '@dragonmastery/dragoncore-shared';\nimport { jwtDecode } from 'jwt-decode';\nimport { computed } 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; name?: string };\n return (\n e.error_type === 'EmailVerificationRequiredError' ||\n e.name === 'EmailVerificationRequiredError'\n );\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 { 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 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</script>\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import "./useRpcAuth-SgNzCAPa.js";
2
+ import "./useQueryCache-DIGf3fCM.js";
3
+ import "./useMutation-DzRSXPB1.js";
4
+ import "./useQuery-bvJabe9Q.js";
5
+ import { E as StaffCreateSupportTicketForm_default } from "./src-DYBi81fS.js";
6
+ import "./AppLink-CHMMrSFI.js";
7
+ import "./TimelineSystemEvent-CBwUl5G8.js";
8
+ import "./TeamMembersTab-4gmnP9sD.js";
9
+ import "./Appearance-BfPdKMXw.js";
10
+ import "./useBreadcrumbs-DmgSucoe.js";
11
+ import "./EditTeamMemberForm-y4Klbm2x.js";
12
+ import "./TeamHistoryTab-B3DvaIzC.js";
13
+ import "./UserProfilePage-DMwDVgXa.js";
14
+ import "./ChangePasswordPage-D2Ci00Sh.js";
15
+ import "./TeamNotesTab-DBrJGCIe.js";
16
+ import "./CustomerSupportTicketParent-C_vgUq3B.js";
17
+ import "./SupportTicketDevLifecycleBadge-B2NysMAj.js";
18
+ import "./StaffSupportTicketParent-Bp5pNF45.js";
19
+ import "./LoginForm-o4gJ0QwA.js";
20
+ import "./Signup-Wz2h_ayt.js";
21
+ import "./ForgotPassword-CiEfdVT-.js";
22
+ import "./ResetPassword-DcVvfMU3.js";
23
+ import "./Logout-D8Ql8-OY.js";
24
+ import "./mfaSchema-_vbG9jiT.js";
25
+ import "./MfaSetup-DzaJLZtx.js";
26
+ import "./MfaVerify-C04XD4r3.js";
27
+ import "./VerifyEmail-CUexC8mg.js";
28
+ import "./UserListPage-BGDgsd_S.js";
29
+ import "./CreateUserPage-DbT_l32W.js";
30
+ import "./EditUserPage-0lqrgP5T.js";
31
+
32
+ export { StaffCreateSupportTicketForm_default as default };