@dragonmastery/dragoncore-vue 0.0.30 → 0.0.31

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 (119) hide show
  1. package/dist/{ConsentFlowStep-DsVhXa91.js → ConsentRequired-Bhkxu0rv.js} +119 -11
  2. package/dist/ConsentRequired-Bhkxu0rv.js.map +1 -0
  3. package/dist/{CreateTeamForm-5V_ks5Ie.js → CreateTeamForm-BHgTTHAk.js} +2 -2
  4. package/dist/{CreateTeamForm-B7MsOsiV.js → CreateTeamForm-bpLbK18g.js} +2 -2
  5. package/dist/{CreateTeamForm-B7MsOsiV.js.map → CreateTeamForm-bpLbK18g.js.map} +1 -1
  6. package/dist/{CreateUserPage-DNi45YF4.js → CreateUserPage-C9uOeYDJ.js} +1 -1
  7. package/dist/{CreateUserPage-1WiLNGr_.js → CreateUserPage-CqKcY7_X.js} +1 -1
  8. package/dist/{CreateUserPage-1WiLNGr_.js.map → CreateUserPage-CqKcY7_X.js.map} +1 -1
  9. package/dist/{CreditBalanceDashboard-CoIEyZWh.js → CreditBalanceDashboard-BEsOr0Rw.js} +2 -2
  10. package/dist/{CreditBalanceDashboard-CoIEyZWh.js.map → CreditBalanceDashboard-BEsOr0Rw.js.map} +1 -1
  11. package/dist/{CreditBalanceDashboard-D_TsFlTp.js → CreditBalanceDashboard-DZQqekKa.js} +4 -4
  12. package/dist/{CreditManagement-CdkqQM7F.js → CreditManagement-ByFH6IHV.js} +4 -4
  13. package/dist/{CreditManagement-CCyU_yja.js → CreditManagement-DiVSMbWZ.js} +2 -2
  14. package/dist/{CreditManagement-CCyU_yja.js.map → CreditManagement-DiVSMbWZ.js.map} +1 -1
  15. package/dist/{CreditTransactionHistory-UPg9uDNy.js → CreditTransactionHistory-mcacl2xG.js} +2 -2
  16. package/dist/{CreditTransactionHistory-UPg9uDNy.js.map → CreditTransactionHistory-mcacl2xG.js.map} +1 -1
  17. package/dist/{CustomerCreateSupportTicketForm-CiTTUqtW.js → CustomerCreateSupportTicketForm-CroUyX15.js} +3 -3
  18. package/dist/{CustomerCreateSupportTicketForm-DFH1JtlA.js → CustomerCreateSupportTicketForm-IefplMnK.js} +2 -2
  19. package/dist/{CustomerCreateSupportTicketForm-DFH1JtlA.js.map → CustomerCreateSupportTicketForm-IefplMnK.js.map} +1 -1
  20. package/dist/{CustomerSupportTicketDetailPage-DAwiE2t6.js → CustomerSupportTicketDetailPage-Dengb4Zx.js} +2 -2
  21. package/dist/{CustomerSupportTicketDetailPage-DAwiE2t6.js.map → CustomerSupportTicketDetailPage-Dengb4Zx.js.map} +1 -1
  22. package/dist/{CustomerSupportTicketList-CKZl8jxx.js → CustomerSupportTicketList-CpOaBgNr.js} +30 -30
  23. package/dist/{CustomerSupportTicketSuccess-BJO2xsQR.js → CustomerSupportTicketSuccess-BPUwEn4h.js} +3 -3
  24. package/dist/{CustomerSupportTicketSuccess-BEhFZgtn.js → CustomerSupportTicketSuccess-RQskseXP.js} +2 -2
  25. package/dist/{CustomerSupportTicketSuccess-BEhFZgtn.js.map → CustomerSupportTicketSuccess-RQskseXP.js.map} +1 -1
  26. package/dist/{DefaultReferralTeamPage-D3UIrIZK.js → DefaultReferralTeamPage-Be7-RI3s.js} +1 -1
  27. package/dist/{DefaultReferralTeamPage-D3UIrIZK.js.map → DefaultReferralTeamPage-Be7-RI3s.js.map} +1 -1
  28. package/dist/{EditTeamForm-Bf4rSgQg.js → EditTeamForm-KX2cNn24.js} +2 -2
  29. package/dist/{EditTeamForm-C1_-p3lZ.js → EditTeamForm-RBO99ocN.js} +2 -2
  30. package/dist/{EditTeamForm-C1_-p3lZ.js.map → EditTeamForm-RBO99ocN.js.map} +1 -1
  31. package/dist/{EditUserPage-CQgp-08o.js → EditUserPage-AcRFhChk.js} +1 -1
  32. package/dist/{EditUserPage-CwsO8naT.js → EditUserPage-DGuV8pzp.js} +1 -1
  33. package/dist/{EditUserPage-CwsO8naT.js.map → EditUserPage-DGuV8pzp.js.map} +1 -1
  34. package/dist/{ForgotPassword-Dd-E3_o1.js → ForgotPassword-DZ-d8rWX.js} +2 -2
  35. package/dist/{ForgotPassword-Dd-E3_o1.js.map → ForgotPassword-DZ-d8rWX.js.map} +1 -1
  36. package/dist/{ForgotPassword-BhmO5Lfd.js → ForgotPassword-LnjRUIY7.js} +1 -1
  37. package/dist/{LoginForm-CFADKiln.js → LoginForm-D-gfB2hS.js} +1 -1
  38. package/dist/{LoginForm-CSMHsZrq.js → LoginForm-DEgTB9RF.js} +2 -2
  39. package/dist/{LoginForm-CSMHsZrq.js.map → LoginForm-DEgTB9RF.js.map} +1 -1
  40. package/dist/{Logout-Bdktl4NZ.js → Logout-Bb2xe5BM.js} +2 -2
  41. package/dist/{Logout-Bdktl4NZ.js.map → Logout-Bb2xe5BM.js.map} +1 -1
  42. package/dist/{Logout-CmKJK14I.js → Logout-Ctq-a1GS.js} +1 -1
  43. package/dist/{MfaSetup-BtfQXhLn.js → MfaSetup-6E6apXWC.js} +2 -2
  44. package/dist/{MfaSetup-Bjc3v0hs.js → MfaSetup-m080C6iX.js} +3 -3
  45. package/dist/{MfaSetup-Bjc3v0hs.js.map → MfaSetup-m080C6iX.js.map} +1 -1
  46. package/dist/{MfaVerify-SUfSRf4m.js → MfaVerify-C95WB9v2.js} +2 -2
  47. package/dist/{MfaVerify-uJlPz8xg.js → MfaVerify-D8Ch-8hN.js} +3 -3
  48. package/dist/{MfaVerify-uJlPz8xg.js.map → MfaVerify-D8Ch-8hN.js.map} +1 -1
  49. package/dist/{ResetPassword-Dz2N3pH4.js → ResetPassword-9DFz-Qt3.js} +1 -1
  50. package/dist/{ResetPassword-CyizBRob.js → ResetPassword-DflPd8Qg.js} +2 -2
  51. package/dist/{ResetPassword-CyizBRob.js.map → ResetPassword-DflPd8Qg.js.map} +1 -1
  52. package/dist/{SavedFiltersPage-Cz01ZeHx.js → SavedFiltersPage-ey8wOr0T.js} +31 -31
  53. package/dist/{SavedFiltersPage-Cz01ZeHx.js.map → SavedFiltersPage-ey8wOr0T.js.map} +1 -1
  54. package/dist/Signup-C052ykf5.js +9 -0
  55. package/dist/{Signup-CkhRQErA.js → Signup-KuiKHB4h.js} +22 -30
  56. package/dist/Signup-KuiKHB4h.js.map +1 -0
  57. package/dist/{SignupRequirementsPage-33z--rhH.js → SignupRequirementsPage-CwnsnQKb.js} +1 -1
  58. package/dist/{SignupRequirementsPage-33z--rhH.js.map → SignupRequirementsPage-CwnsnQKb.js.map} +1 -1
  59. package/dist/{StaffCreateSupportTicketForm-BtR-Aowv.js → StaffCreateSupportTicketForm-75Bo0jdz.js} +2 -2
  60. package/dist/{StaffCreateSupportTicketForm-BtR-Aowv.js.map → StaffCreateSupportTicketForm-75Bo0jdz.js.map} +1 -1
  61. package/dist/{StaffCreateSupportTicketForm-D7ctCaXe.js → StaffCreateSupportTicketForm-DYEddYii.js} +3 -3
  62. package/dist/{StaffSupportTicketDetailPage-LqnNfU34.js → StaffSupportTicketDetailPage-6VyPNdw7.js} +2 -2
  63. package/dist/{StaffSupportTicketDetailPage-LqnNfU34.js.map → StaffSupportTicketDetailPage-6VyPNdw7.js.map} +1 -1
  64. package/dist/{StaffSupportTicketList-GyzlONKe.js → StaffSupportTicketList-CxV6u2gF.js} +30 -30
  65. package/dist/{StaffSupportTicketSuccess-B3N-RMoT.js → StaffSupportTicketSuccess-BYoBXx1i.js} +2 -2
  66. package/dist/{StaffSupportTicketSuccess-B3N-RMoT.js.map → StaffSupportTicketSuccess-BYoBXx1i.js.map} +1 -1
  67. package/dist/{StaffSupportTicketSuccess-DvonYilY.js → StaffSupportTicketSuccess-FfnJXc_k.js} +3 -3
  68. package/dist/{SupportStaffPage-geoITTqt.js → SupportStaffPage-CLxWU628.js} +1 -1
  69. package/dist/{SupportStaffPage-geoITTqt.js.map → SupportStaffPage-CLxWU628.js.map} +1 -1
  70. package/dist/{SupportTicketMaintenancePage-CEKi8xQB.js → SupportTicketMaintenancePage-B07avInx.js} +1 -1
  71. package/dist/{SupportTicketMaintenancePage-CEKi8xQB.js.map → SupportTicketMaintenancePage-B07avInx.js.map} +1 -1
  72. package/dist/{TeamAttachmentsTab-ChP4DaUP.js → TeamAttachmentsTab-D0DOmdnr.js} +30 -30
  73. package/dist/{TeamList-_SsqJicG.js → TeamList-DXQj_Omo.js} +2 -2
  74. package/dist/{TeamList-_SsqJicG.js.map → TeamList-DXQj_Omo.js.map} +1 -1
  75. package/dist/{TeamList-cp8Pa2xg.js → TeamList-hmP44hfw.js} +2 -2
  76. package/dist/{TeamParent-BUnqP-dr.js → TeamParent-6JhqsYaO.js} +2 -2
  77. package/dist/{TeamParent-BUnqP-dr.js.map → TeamParent-6JhqsYaO.js.map} +1 -1
  78. package/dist/{TeamParent-BseZ6Zoi.js → TeamParent-BI9ItLoY.js} +2 -2
  79. package/dist/{TimelineNoteInput-BBZv3X4p.js → TimelineNoteInput-P3ycD18j.js} +1 -1
  80. package/dist/{TimelineNoteInput-BBZv3X4p.js.map → TimelineNoteInput-P3ycD18j.js.map} +1 -1
  81. package/dist/UserListPage-9jhUu3TH.js +5 -0
  82. package/dist/{UserListPage-CDMSZpXK.js → UserListPage-DelzxCID.js} +1 -1
  83. package/dist/{UserListPage-CDMSZpXK.js.map → UserListPage-DelzxCID.js.map} +1 -1
  84. package/dist/{VerifyEmail-CWUhRA1o.js → VerifyEmail-Cy2s4yP0.js} +3 -3
  85. package/dist/{VerifyEmail-CWUhRA1o.js.map → VerifyEmail-Cy2s4yP0.js.map} +1 -1
  86. package/dist/{VerifyEmail-CLDngljq.js → VerifyEmail-DBKMZJMx.js} +2 -2
  87. package/dist/{ViewTeam-ttqX2In8.js → ViewTeam-ByZdYEJG.js} +2 -2
  88. package/dist/{ViewTeam-ttqX2In8.js.map → ViewTeam-ByZdYEJG.js.map} +1 -1
  89. package/dist/{ViewTeam-rLNxVgS2.js → ViewTeam-DEOe7wqT.js} +2 -2
  90. package/dist/{customerSupportTicketRoutes-C-DKBy5g.js → customerSupportTicketRoutes-DvfXGaSC.js} +6 -6
  91. package/dist/{customerSupportTicketRoutes-C-DKBy5g.js.map → customerSupportTicketRoutes-DvfXGaSC.js.map} +1 -1
  92. package/dist/index.d.ts +889 -894
  93. package/dist/index.js +31 -32
  94. package/dist/{mfaSchema-C6PatIbY.js → mfaSchema-Ukqzdyck.js} +1 -1
  95. package/dist/{mfaSchema-C6PatIbY.js.map → mfaSchema-Ukqzdyck.js.map} +1 -1
  96. package/dist/{saved_filter-C2N9l_a9.js → saved_filter-erjEgsdK.js} +2 -2
  97. package/dist/{saved_filter-C2N9l_a9.js.map → saved_filter-erjEgsdK.js.map} +1 -1
  98. package/dist/{src-C8B9TJiH.js → src-DSF_hIBe.js} +23 -56
  99. package/dist/src-DSF_hIBe.js.map +1 -0
  100. package/dist/{staffSupportTicketRoutes-CyMecWpC.js → staffSupportTicketRoutes-73ceKhL-.js} +6 -6
  101. package/dist/{staffSupportTicketRoutes-CyMecWpC.js.map → staffSupportTicketRoutes-73ceKhL-.js.map} +1 -1
  102. package/dist/{teamRoutes-CFDsHPkd.js → teamRoutes-CSBq1DNq.js} +7 -7
  103. package/dist/{teamRoutes-CFDsHPkd.js.map → teamRoutes-CSBq1DNq.js.map} +1 -1
  104. package/dist/{useEmailVerificationChannel-QuMSgzzM.js → useEmailVerificationChannel-C76Gnyi1.js} +2 -2
  105. package/dist/{useEmailVerificationChannel-QuMSgzzM.js.map → useEmailVerificationChannel-C76Gnyi1.js.map} +1 -1
  106. package/dist/{useReturnUrl-B5V3SJf5.js → useReturnUrl-DnezAxBA.js} +2 -10
  107. package/dist/{useReturnUrl-B5V3SJf5.js.map → useReturnUrl-DnezAxBA.js.map} +1 -1
  108. package/package.json +2 -2
  109. package/dist/ConsentFlowStep-DsVhXa91.js.map +0 -1
  110. package/dist/ConsentRequired-B3eLxJgx.js +0 -114
  111. package/dist/ConsentRequired-B3eLxJgx.js.map +0 -1
  112. package/dist/Signup-CkhRQErA.js.map +0 -1
  113. package/dist/Signup-cOvXCtJj.js +0 -9
  114. package/dist/SignupConsentFlow-CKMFsnf5.js +0 -223
  115. package/dist/SignupConsentFlow-CKMFsnf5.js.map +0 -1
  116. package/dist/UserListPage-BABli3QG.js +0 -5
  117. package/dist/signupConsentStorage-pWSoHuhO.js +0 -35
  118. package/dist/signupConsentStorage-pWSoHuhO.js.map +0 -1
  119. package/dist/src-C8B9TJiH.js.map +0 -1
@@ -1,12 +1,20 @@
1
+ import { o as useUserSessionStore } from "./useRpcAuth-CJtq1dqM.js";
2
+ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
+ import "./useQueryCache-alzaRWEb.js";
4
+ import { t as useMutation } from "./useMutation-BLNuJoYl.js";
5
+ import { t as useQuery } from "./useQuery-BzUGEOj0.js";
6
+ import { r as getValidReturnUrl } from "./useReturnUrl-DnezAxBA.js";
1
7
  import { t as ExternalLinkIcon_default } from "./ExternalLinkIcon-BKVV5Gjm.js";
2
- import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, renderSlot, toDisplayString, watch } from "vue";
8
+ import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, renderSlot, toDisplayString, unref, watch } from "vue";
9
+ import { useRoute, useRouter } from "vue-router";
10
+ import { toast } from "vue3-toastify";
3
11
  import DOMPurify from "dompurify";
4
12
  import { marked } from "marked";
5
13
 
6
14
  //#region src/slices/auth/features/shared/ConsentFlowStep.vue
7
- const _hoisted_1 = { class: "space-y-6" };
8
- const _hoisted_2 = { class: "text-center space-y-1" };
9
- const _hoisted_3 = { class: "text-2xl font-bold" };
15
+ const _hoisted_1$1 = { class: "space-y-6" };
16
+ const _hoisted_2$1 = { class: "text-center space-y-1" };
17
+ const _hoisted_3$1 = { class: "text-2xl font-bold" };
10
18
  const _hoisted_4 = { class: "text-base-content/80" };
11
19
  const _hoisted_5 = {
12
20
  key: 0,
@@ -22,7 +30,7 @@ const _hoisted_9 = ["href"];
22
30
  const _hoisted_10 = { class: "flex flex-col gap-5" };
23
31
  const _hoisted_11 = ["disabled"];
24
32
  const _hoisted_12 = ["disabled"];
25
- const _sfc_main = /* @__PURE__ */ defineComponent({
33
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
26
34
  __name: "ConsentFlowStep",
27
35
  props: {
28
36
  config: {},
@@ -108,9 +116,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
108
116
  checkScrolledToBottom();
109
117
  }
110
118
  return (_ctx, _cache) => {
111
- return openBlock(), createElementBlock("div", _hoisted_1, [
112
- createElementVNode("div", _hoisted_2, [
113
- createElementVNode("h1", _hoisted_3, toDisplayString(__props.config.label), 1),
119
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
120
+ createElementVNode("div", _hoisted_2$1, [
121
+ createElementVNode("h1", _hoisted_3$1, toDisplayString(__props.config.label), 1),
114
122
  createElementVNode("p", _hoisted_4, "Step " + toDisplayString(__props.currentStep) + " of " + toDisplayString(__props.totalSteps), 1),
115
123
  _cache[2] || (_cache[2] = createElementVNode("p", { class: "text-base-content/70 text-sm" }, "Review and accept", -1))
116
124
  ]),
@@ -150,8 +158,108 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
150
158
  };
151
159
  }
152
160
  });
153
- var ConsentFlowStep_default = _sfc_main;
161
+ var ConsentFlowStep_default = _sfc_main$1;
162
+
163
+ //#endregion
164
+ //#region src/slices/auth/features/consent_required/ConsentRequired.vue
165
+ const _hoisted_1 = { class: "w-full max-w-md mx-auto mb-8 sm:mb-10 bg-base-200 px-3 py-4 sm:px-6 sm:py-6 rounded-xl shadow-md container min-w-0" };
166
+ const _hoisted_2 = {
167
+ key: 0,
168
+ class: "text-center"
169
+ };
170
+ const _hoisted_3 = {
171
+ key: 1,
172
+ class: "space-y-6"
173
+ };
174
+ const _sfc_main = /* @__PURE__ */ defineComponent({
175
+ __name: "ConsentRequired",
176
+ setup(__props) {
177
+ const sessionStore = useUserSessionStore();
178
+ const router = useRouter();
179
+ const route = useRoute();
180
+ const { data: pendingConsents, loading } = useQuery((api) => api.users.getPendingConsents(), { skipAuthCheck: false });
181
+ const currentStep = ref(1);
182
+ const totalSteps = computed(() => (pendingConsents.value ?? []).length);
183
+ const currentConfig = computed(() => (pendingConsents.value ?? [])[currentStep.value - 1] ?? null);
184
+ const declining = ref(false);
185
+ const submitting = ref(false);
186
+ const submitError = ref(null);
187
+ function getErrorMessage(error) {
188
+ if (error instanceof Error && error.message) return error.message;
189
+ if (error && typeof error === "object" && "message" in error && typeof error.message === "string") return error.message;
190
+ return "Failed to record consents. Please try again.";
191
+ }
192
+ const { mutate: recordConsentsMutate } = useMutation((api, input) => api.users.recordConsents(input), { skipAuthCheck: false });
193
+ async function handleAccept() {
194
+ const config = currentConfig.value;
195
+ const consents = pendingConsents.value ?? [];
196
+ if (!config || consents.length === 0) return;
197
+ submitError.value = null;
198
+ const acceptancesSoFar = {};
199
+ for (let i = 0; i < currentStep.value; i++) {
200
+ const c = consents[i];
201
+ if (c) acceptancesSoFar[c.type] = true;
202
+ }
203
+ if (currentStep.value >= totalSteps.value) {
204
+ submitting.value = true;
205
+ try {
206
+ await recordConsentsMutate({ acceptances: acceptancesSoFar });
207
+ await sessionStore.refreshToken();
208
+ window.scrollTo(0, 0);
209
+ const targetUrl = getValidReturnUrl(route, "/");
210
+ await router.push(targetUrl);
211
+ toast.success("Consents recorded. You can now continue.");
212
+ } catch (err) {
213
+ submitError.value = getErrorMessage(err);
214
+ } finally {
215
+ submitting.value = false;
216
+ }
217
+ return;
218
+ }
219
+ currentStep.value++;
220
+ nextTick();
221
+ }
222
+ async function handleDecline() {
223
+ declining.value = true;
224
+ try {
225
+ sessionStore.clearSession();
226
+ await router.push("/auth/login");
227
+ toast.info("You have declined. You have been logged out.");
228
+ } finally {
229
+ declining.value = false;
230
+ }
231
+ }
232
+ watch([pendingConsents, loading], ([consents, isLoading]) => {
233
+ if (!isLoading && Array.isArray(consents) && consents.length === 0) router.push(getValidReturnUrl(route, "/"));
234
+ }, { immediate: true });
235
+ return (_ctx, _cache) => {
236
+ return openBlock(), createElementBlock("div", _hoisted_1, [unref(loading) ? (openBlock(), createElementBlock("div", _hoisted_2, [..._cache[0] || (_cache[0] = [createElementVNode("p", { class: "text-base-content/80" }, "Loading...", -1)])])) : currentConfig.value ? (openBlock(), createElementBlock("div", _hoisted_3, [createVNode(ConsentFlowStep_default, {
237
+ config: currentConfig.value,
238
+ "current-step": currentStep.value,
239
+ "total-steps": totalSteps.value,
240
+ submitting: submitting.value,
241
+ "submit-error": submitError.value,
242
+ declining: declining.value,
243
+ "accept-label": "Accept and continue",
244
+ "submit-accept-label": "Saving...",
245
+ "decline-label": "Decline and log out",
246
+ "decline-submitting-label": "Logging out...",
247
+ "intro-text": "Please read the full document before accepting. Scroll to the bottom when you've finished reading. You can decline at any time; if you decline, you will not have access to the application and will be logged out.",
248
+ onAccept: handleAccept,
249
+ onDecline: handleDecline
250
+ }, null, 8, [
251
+ "config",
252
+ "current-step",
253
+ "total-steps",
254
+ "submitting",
255
+ "submit-error",
256
+ "declining"
257
+ ])])) : createCommentVNode("v-if", true)]);
258
+ };
259
+ }
260
+ });
261
+ var ConsentRequired_default = _sfc_main;
154
262
 
155
263
  //#endregion
156
- export { ConsentFlowStep_default as t };
157
- //# sourceMappingURL=ConsentFlowStep-DsVhXa91.js.map
264
+ export { ConsentRequired_default as default };
265
+ //# sourceMappingURL=ConsentRequired-Bhkxu0rv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsentRequired-Bhkxu0rv.js","names":["$emit","acceptancesSoFar: Record<string, boolean>"],"sources":["../src/slices/auth/features/shared/ConsentFlowStep.vue","../src/slices/auth/features/consent_required/ConsentRequired.vue"],"sourcesContent":["<template>\n <div class=\"space-y-6\">\n <div class=\"text-center space-y-1\">\n <h1 class=\"text-2xl font-bold\">{{ config.label }}</h1>\n <p class=\"text-base-content/80\">Step {{ currentStep }} of {{ totalSteps }}</p>\n <p class=\"text-base-content/70 text-sm\">Review and accept</p>\n </div>\n\n <div\n v-if=\"submitError\"\n class=\"alert alert-error flex flex-col gap-2\"\n >\n <slot\n name=\"error-recovery\"\n :retry=\"retry\"\n :submitting=\"submitting\"\n >\n <span>{{ submitError }}</span>\n <p class=\"text-sm opacity-90\">You can try again using the buttons below.</p>\n </slot>\n </div>\n\n <p\n v-if=\"displayContent\"\n class=\"text-sm text-base-content/70 mb-2\"\n >\n {{ introText }}\n </p>\n\n <!-- Scrollable terms box when admin provides inline content -->\n <div\n v-if=\"displayContent\"\n :key=\"config.type\"\n :ref=\"(el) => setScrollRef(el)\"\n class=\"border border-base-300 rounded-lg px-3 py-4 sm:p-4 bg-base-100 overflow-y-auto overflow-x-hidden min-h-80 max-h-[min(32rem,70vh)] w-full min-w-0\"\n :data-consent-type=\"config.type\"\n @scroll=\"onScroll\"\n >\n <div\n class=\"prose prose-sm prose-max-w-none max-w-full min-w-0 text-sm prose-headings:font-semibold prose-p:my-2\"\n v-html=\"renderMarkdown(displayContent)\"\n />\n </div>\n\n <!-- Link-only when admin does not provide content -->\n <div v-else-if=\"config.url\">\n <a\n :href=\"config.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"link link-accent inline-flex items-center gap-1.5\"\n >\n View {{ config.label }}\n <ExternalLinkIcon />\n </a>\n </div>\n\n <div class=\"flex flex-col gap-5\">\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n :disabled=\"(needsScroll ? !hasScrolledToBottom : false) || submitting\"\n @click=\"$emit('accept')\"\n >\n {{ submitting ? submitAcceptLabel : acceptLabel }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-outline btn-sm btn-error\"\n :disabled=\"declining || submitting\"\n @click=\"$emit('decline')\"\n >\n {{ declining ? declineSubmittingLabel : declineLabel }}\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupConsentConfigDto } from '@dragonmastery/dragoncore-shared';\nimport ExternalLinkIcon from '../../../../components/ui/ExternalLinkIcon.vue';\nimport DOMPurify from 'dompurify';\nimport { marked } from 'marked';\nimport { computed, nextTick, ref, watch } from 'vue';\n\nconst props = withDefaults(\n defineProps<{\n config: SignupConsentConfigDto;\n currentStep: number;\n totalSteps: number;\n submitting?: boolean;\n submitError?: string | null;\n declining?: boolean;\n /** e.g. \"Accept and continue\" */\n acceptLabel?: string;\n /** e.g. \"Submitting...\" or \"Saving...\" */\n submitAcceptLabel?: string;\n /** e.g. \"Decline\" or \"Decline and log out\" */\n declineLabel?: string;\n /** e.g. \"Returning...\" or \"Logging out...\" */\n declineSubmittingLabel?: string;\n /** Intro text when content is shown, e.g. \"Please read the full document before accepting...\" */\n introText?: string;\n }>(),\n {\n submitting: false,\n submitError: null,\n declining: false,\n acceptLabel: 'Accept and continue',\n submitAcceptLabel: 'Submitting...',\n declineLabel: 'Decline',\n declineSubmittingLabel: 'Returning...',\n introText:\n \"Please read the full document before accepting. Scroll to the bottom when you've finished reading.\",\n },\n);\n\nconst emit = defineEmits<{\n accept: [];\n decline: [];\n}>();\n\nfunction retry() {\n emit('accept');\n}\n\nconst displayContent = computed(() => props.config.content ?? null);\n\nconst needsScroll = computed(() => Boolean(displayContent.value));\n\nconst hasScrolledToBottom = ref(!needsScroll.value);\nconst scrollEl = ref<HTMLElement | null>(null);\n\nfunction setScrollRef(el: unknown) {\n scrollEl.value = el instanceof HTMLElement ? el : null;\n}\n\nwatch(\n () => props.config,\n (config) => {\n hasScrolledToBottom.value = !(config?.content ?? null);\n nextTick(() => {\n scrollEl.value?.scrollTo(0, 0);\n });\n },\n { immediate: true },\n);\n\nwatch(displayContent, (content) => {\n hasScrolledToBottom.value = !content;\n nextTick(() => {\n scrollEl.value?.scrollTo(0, 0);\n });\n});\n\nfunction renderMarkdown(content: string): string {\n const html = marked.parse(content) as string;\n return DOMPurify.sanitize(html, {\n ALLOWED_TAGS: [\n 'p',\n 'br',\n 'strong',\n 'em',\n 'u',\n 'a',\n 'ul',\n 'ol',\n 'li',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'blockquote',\n 'code',\n 'pre',\n 'hr',\n ],\n ALLOWED_ATTR: ['href', 'target', 'rel'],\n });\n}\n\nfunction checkScrolledToBottom() {\n const el = scrollEl.value;\n if (!el) return;\n const { scrollTop, scrollHeight, clientHeight } = el;\n const atBottom = scrollHeight - scrollTop - clientHeight < 10;\n if (atBottom) {\n hasScrolledToBottom.value = true;\n }\n}\n\nfunction onScroll() {\n checkScrolledToBottom();\n}\n</script>\n","<template>\n <div class=\"w-full max-w-md mx-auto mb-8 sm:mb-10 bg-base-200 px-3 py-4 sm:px-6 sm:py-6 rounded-xl shadow-md container min-w-0\">\n <div v-if=\"loading\" class=\"text-center\">\n <p class=\"text-base-content/80\">Loading...</p>\n </div>\n\n <div v-else-if=\"currentConfig\" class=\"space-y-6\">\n <ConsentFlowStep\n :config=\"currentConfig\"\n :current-step=\"currentStep\"\n :total-steps=\"totalSteps\"\n :submitting=\"submitting\"\n :submit-error=\"submitError\"\n :declining=\"declining\"\n accept-label=\"Accept and continue\"\n submit-accept-label=\"Saving...\"\n decline-label=\"Decline and log out\"\n decline-submitting-label=\"Logging out...\"\n intro-text=\"Please read the full document before accepting. Scroll to the bottom when you've finished reading. You can decline at any time; if you decline, you will not have access to the application and will be logged out.\"\n @accept=\"handleAccept\"\n @decline=\"handleDecline\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { RecordConsentsInputDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, nextTick, ref, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport ConsentFlowStep from '../shared/ConsentFlowStep.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl } from '../../../../utils/useReturnUrl';\n\nconst sessionStore = useUserSessionStore();\nconst router = useRouter();\nconst route = useRoute();\n\nconst { data: pendingConsents, loading } = useQuery(\n (api) => api.users.getPendingConsents(),\n { skipAuthCheck: false },\n);\n\nconst currentStep = ref(1);\nconst totalSteps = computed(() => (pendingConsents.value ?? []).length);\nconst currentConfig = computed(\n () => (pendingConsents.value ?? [])[currentStep.value - 1] ?? null,\n);\n\nconst declining = ref(false);\nconst submitting = ref(false);\nconst submitError = ref<string | null>(null);\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) return error.message;\n if (error && typeof error === 'object' && 'message' in error && typeof (error as { message: unknown }).message === 'string') {\n return (error as { message: string }).message;\n }\n return 'Failed to record consents. Please try again.';\n}\n\nconst { mutate: recordConsentsMutate } = useMutation(\n (api, input: RecordConsentsInputDto) => api.users.recordConsents(input),\n { skipAuthCheck: false },\n);\n\nasync function handleAccept() {\n const config = currentConfig.value;\n const consents = pendingConsents.value ?? [];\n if (!config || consents.length === 0) return;\n\n submitError.value = null;\n\n const acceptancesSoFar: Record<string, boolean> = {};\n for (let i = 0; i < currentStep.value; i++) {\n const c = consents[i];\n if (c) acceptancesSoFar[c.type] = true;\n }\n\n if (currentStep.value >= totalSteps.value) {\n submitting.value = true;\n try {\n await recordConsentsMutate({ acceptances: acceptancesSoFar });\n await sessionStore.refreshToken();\n window.scrollTo(0, 0);\n const targetUrl = getValidReturnUrl(route, '/');\n await router.push(targetUrl);\n toast.success('Consents recorded. You can now continue.');\n } catch (err) {\n submitError.value = getErrorMessage(err);\n } finally {\n submitting.value = false;\n }\n return;\n }\n\n currentStep.value++;\n nextTick();\n}\n\nasync function handleDecline() {\n declining.value = true;\n try {\n sessionStore.clearSession();\n await router.push('/auth/login');\n toast.info('You have declined. You have been logged out.');\n } finally {\n declining.value = false;\n }\n}\n\n// If no pending consents (e.g. already completed or consent disabled), redirect\nwatch(\n [pendingConsents, loading],\n ([consents, isLoading]) => {\n if (!isLoading && Array.isArray(consents) && consents.length === 0) {\n router.push(getValidReturnUrl(route, '/'));\n }\n },\n { immediate: true },\n);\n</script>\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import "./FieldsetSection-Br_sygWW.js";
6
6
  import "./userAuthorized-3RiCDXxr.js";
7
7
  import "./teamMetadata-NTjPt89L.js";
8
8
  import "./team_memberRoutes-BgjY9Kwq.js";
9
- import "./teamRoutes-CFDsHPkd.js";
10
- import { t as CreateTeamForm_default } from "./CreateTeamForm-B7MsOsiV.js";
9
+ import "./teamRoutes-CSBq1DNq.js";
10
+ import { t as CreateTeamForm_default } from "./CreateTeamForm-bpLbK18g.js";
11
11
 
12
12
  export { CreateTeamForm_default as default };
@@ -1,7 +1,7 @@
1
1
  import { t as useMutation } from "./useMutation-BLNuJoYl.js";
2
2
  import { t as FieldsetSection_default } from "./FieldsetSection-Br_sygWW.js";
3
3
  import { t as teamCreateSchemaWithMetadata } from "./teamMetadata-NTjPt89L.js";
4
- import { t as teamPaths } from "./teamRoutes-CFDsHPkd.js";
4
+ import { t as teamPaths } from "./teamRoutes-CSBq1DNq.js";
5
5
  import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, toDisplayString, unref, withCtx } from "vue";
6
6
  import { useRouter } from "vue-router";
7
7
  import { toast } from "vue3-toastify";
@@ -139,4 +139,4 @@ var CreateTeamForm_default = _sfc_main;
139
139
 
140
140
  //#endregion
141
141
  export { CreateTeamForm_default as t };
142
- //# sourceMappingURL=CreateTeamForm-B7MsOsiV.js.map
142
+ //# sourceMappingURL=CreateTeamForm-bpLbK18g.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateTeamForm-B7MsOsiV.js","names":[],"sources":["../src/slices/team/CreateTeamForm.vue"],"sourcesContent":["<template>\n <div v-if=\"form.isLoading\" class=\"flex flex-col items-center justify-center p-8\">\n <div class=\"loading loading-spinner loading-lg\"></div>\n <p class=\"mt-4 text-lg\">Loading...</p>\n </div>\n <div v-else-if=\"form.loadError\" class=\"flex flex-col items-center justify-center p-8\">\n <p class=\"mt-4 text-lg\">{{ form.loadError }}</p>\n </div>\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Create Team\"\n subtitle=\"Create a new team\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Team Details\">\n <zinia.UniqueNameField placeholder=\"Enter unique name\" />\n <zinia.DisplayNameField placeholder=\"Enter display name\" />\n <zinia.LegalNameField placeholder=\"Enter legal name (optional)\" />\n </FieldsetSection>\n\n <FieldsetSection title=\"Description\">\n <zinia.DescriptionField placeholder=\"Enter team description\" />\n </FieldsetSection>\n\n <!-- Contact Information -->\n <FieldsetSection title=\"Contact Information\">\n <zinia.ContactNameField placeholder=\"Enter contact name\" />\n <zinia.ContactEmailField placeholder=\"Enter contact email\" />\n <zinia.ContactBusinessPhoneField placeholder=\"Enter business phone\" />\n <zinia.ContactMobilePhoneField placeholder=\"Enter mobile phone\" />\n <zinia.ContactTimeZoneField placeholder=\"Enter time zone\" />\n </FieldsetSection>\n\n <!-- Address Information -->\n <FieldsetSection title=\"Address\">\n <zinia.AddressFullField placeholder=\"Enter address\" />\n <zinia.AddressCityField placeholder=\"Enter city\" />\n <zinia.AddressZipField placeholder=\"Enter zip code\" />\n </FieldsetSection>\n\n <!-- Web Presence -->\n <FieldsetSection title=\"Web Presence\">\n <zinia.TwitterUsernameField placeholder=\"Enter Twitter username\" />\n <zinia.UrlField placeholder=\"Enter URL\" />\n </FieldsetSection>\n\n <!-- Branding -->\n <FieldsetSection title=\"Branding\">\n <zinia.LogoField placeholder=\"Enter logo URL\" />\n </FieldsetSection>\n\n <!-- Email Settings -->\n <FieldsetSection title=\"Email Settings\">\n <zinia.EmailSentFromField placeholder=\"Enter sent from email\" />\n <zinia.EmailReplyToField placeholder=\"Enter reply to email\" />\n </FieldsetSection>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Create Team\" submittingText=\"Creating Team...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamCreateDto, TeamReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport FieldsetSection from '../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../composables/useMutation';\nimport { teamCreateSchemaWithMetadata } from './teamMetadata';\nimport { teamPaths } from './teamRoutes';\n\nconst router = useRouter();\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamCreateSchemaWithMetadata, {\n storeName: `create-team`,\n persistToLocalStorage: true,\n renderStyle: 'daisy_ui',\n initialValues: {\n unique_name: '',\n display_name: '',\n },\n});\n\n// Setup mutation for creating team\nconst { mutate: createTeam } = useMutation(\n (api, input: TeamCreateDto) => api.teams.createTeam(input),\n { invalidate: /^teams?:/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: TeamCreateDto) => {\n const createdTeam = await createTeam(formData);\n if (!createdTeam) {\n throw new Error('Failed to create team');\n }\n return createdTeam;\n};\n\n// Handle successful submission\nconst handleSuccess = async (createdTeam: TeamReadDto) => {\n clearSavedFormState();\n await router.push({\n name: teamPaths.view.name,\n params: { id: createdTeam.id },\n });\n toast.success(`Team \"${createdTeam.display_name}\" created successfully!`);\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CreateTeamForm-bpLbK18g.js","names":[],"sources":["../src/slices/team/CreateTeamForm.vue"],"sourcesContent":["<template>\n <div v-if=\"form.isLoading\" class=\"flex flex-col items-center justify-center p-8\">\n <div class=\"loading loading-spinner loading-lg\"></div>\n <p class=\"mt-4 text-lg\">Loading...</p>\n </div>\n <div v-else-if=\"form.loadError\" class=\"flex flex-col items-center justify-center p-8\">\n <p class=\"mt-4 text-lg\">{{ form.loadError }}</p>\n </div>\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Create Team\"\n subtitle=\"Create a new team\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Team Details\">\n <zinia.UniqueNameField placeholder=\"Enter unique name\" />\n <zinia.DisplayNameField placeholder=\"Enter display name\" />\n <zinia.LegalNameField placeholder=\"Enter legal name (optional)\" />\n </FieldsetSection>\n\n <FieldsetSection title=\"Description\">\n <zinia.DescriptionField placeholder=\"Enter team description\" />\n </FieldsetSection>\n\n <!-- Contact Information -->\n <FieldsetSection title=\"Contact Information\">\n <zinia.ContactNameField placeholder=\"Enter contact name\" />\n <zinia.ContactEmailField placeholder=\"Enter contact email\" />\n <zinia.ContactBusinessPhoneField placeholder=\"Enter business phone\" />\n <zinia.ContactMobilePhoneField placeholder=\"Enter mobile phone\" />\n <zinia.ContactTimeZoneField placeholder=\"Enter time zone\" />\n </FieldsetSection>\n\n <!-- Address Information -->\n <FieldsetSection title=\"Address\">\n <zinia.AddressFullField placeholder=\"Enter address\" />\n <zinia.AddressCityField placeholder=\"Enter city\" />\n <zinia.AddressZipField placeholder=\"Enter zip code\" />\n </FieldsetSection>\n\n <!-- Web Presence -->\n <FieldsetSection title=\"Web Presence\">\n <zinia.TwitterUsernameField placeholder=\"Enter Twitter username\" />\n <zinia.UrlField placeholder=\"Enter URL\" />\n </FieldsetSection>\n\n <!-- Branding -->\n <FieldsetSection title=\"Branding\">\n <zinia.LogoField placeholder=\"Enter logo URL\" />\n </FieldsetSection>\n\n <!-- Email Settings -->\n <FieldsetSection title=\"Email Settings\">\n <zinia.EmailSentFromField placeholder=\"Enter sent from email\" />\n <zinia.EmailReplyToField placeholder=\"Enter reply to email\" />\n </FieldsetSection>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Create Team\" submittingText=\"Creating Team...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamCreateDto, TeamReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport FieldsetSection from '../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../composables/useMutation';\nimport { teamCreateSchemaWithMetadata } from './teamMetadata';\nimport { teamPaths } from './teamRoutes';\n\nconst router = useRouter();\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamCreateSchemaWithMetadata, {\n storeName: `create-team`,\n persistToLocalStorage: true,\n renderStyle: 'daisy_ui',\n initialValues: {\n unique_name: '',\n display_name: '',\n },\n});\n\n// Setup mutation for creating team\nconst { mutate: createTeam } = useMutation(\n (api, input: TeamCreateDto) => api.teams.createTeam(input),\n { invalidate: /^teams?:/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: TeamCreateDto) => {\n const createdTeam = await createTeam(formData);\n if (!createdTeam) {\n throw new Error('Failed to create team');\n }\n return createdTeam;\n};\n\n// Handle successful submission\nconst handleSuccess = async (createdTeam: TeamReadDto) => {\n clearSavedFormState();\n await router.push({\n name: teamPaths.view.name,\n params: { id: createdTeam.id },\n });\n toast.success(`Team \"${createdTeam.display_name}\" created successfully!`);\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n"],"mappings":"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"}
@@ -2,6 +2,6 @@ import "./useRpcAuth-CJtq1dqM.js";
2
2
  import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import "./useMutation-BLNuJoYl.js";
5
- import { t as CreateUserPage_default } from "./CreateUserPage-1WiLNGr_.js";
5
+ import { t as CreateUserPage_default } from "./CreateUserPage-CqKcY7_X.js";
6
6
 
7
7
  export { CreateUserPage_default as default };
@@ -73,4 +73,4 @@ var CreateUserPage_default = _sfc_main;
73
73
 
74
74
  //#endregion
75
75
  export { createUserSchemaWithMetadata as n, CreateUserPage_default as t };
76
- //# sourceMappingURL=CreateUserPage-1WiLNGr_.js.map
76
+ //# sourceMappingURL=CreateUserPage-CqKcY7_X.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateUserPage-1WiLNGr_.js","names":[],"sources":["../src/slices/admin/features/create_user/create_user_schema.ts","../src/slices/admin/features/create_user/CreateUserPage.vue"],"sourcesContent":["import { createUserSchema } from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type CreateUserForm = z.infer<typeof createUserSchema>;\n\n// Enhance the schema with metadata\nexport const createUserSchemaWithMetadata = withMetadata(\n createUserSchema,\n 'createUserSchema',\n {\n email: {\n inputType: 'email',\n placeholder: 'Enter email',\n helpText: 'Enter your email',\n autocomplete: 'email',\n },\n\n user_type: {\n inputType: 'select',\n placeholder: 'Select user type',\n helpText: 'Select your user type',\n },\n\n password: {\n inputType: 'password',\n placeholder: 'Enter password (optional)',\n helpText:\n 'If not provided, a random password will be generated and the user will need to use forgot password to set it',\n autocomplete: 'new-password',\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\">Create User</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.EmailField />\n <zinia.UserTypeField />\n <zinia.PasswordField />\n\n <ZiniaSubmitButton submitText=\"Create User\" submittingText=\"Creating User...\" />\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport { createUserSchemaWithMetadata } from './create_user_schema';\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(createUserSchemaWithMetadata, {\n storeName: 'create-user-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst { mutate: createUser } = useMutation(\n (api, input: z.infer<typeof createUserSchemaWithMetadata>) => api.users.createUser(input),\n { invalidate: /^users?:/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof createUserSchemaWithMetadata>) => {\n const result = await createUser(data);\n if (!result) throw new Error('Failed to create user');\n return result;\n};\n\n// Handle success\nconst handleSuccess = async (_data: any) => {\n form.reset();\n toast.success('User created successfully!');\n};\n\n// Handle error\nconst handleError = (error: any) => {\n toast.error(error.message || 'Failed to create user');\n};\n</script>\n"],"mappings":";;;;;;;AAQA,MAAa,+BAA+B,aAC1C,kBACA,oBACA;CACE,OAAO;EACL,WAAW;EACX,aAAa;EACb,UAAU;EACV,cAAc;EACf;CAED,WAAW;EACT,WAAW;EACX,aAAa;EACb,UAAU;EACX;CAED,UAAU;EACR,WAAW;EACX,aAAa;EACb,UACE;EACF,cAAc;EACf;CACF,CACF;;;;;;;;ECXD,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QAAQ,8BAA8B;GAC1F,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CAAC;EAEF,MAAM,EAAE,QAAQ,eAAe,aAC5B,KAAK,UAAwD,IAAI,MAAM,WAAW,MAAM,EACzF,EAAE,YAAY,YAAY,CAC3B;EAGD,MAAM,eAAe,OAAO,SAAuD;GACjF,MAAM,SAAS,MAAM,WAAW,KAAK;AACrC,OAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,wBAAwB;AACrD,UAAO;;EAIT,MAAM,gBAAgB,OAAO,UAAe;AAC1C,QAAK,OAAO;AACZ,SAAM,QAAQ,6BAA6B;;EAI7C,MAAM,eAAe,UAAe;AAClC,SAAM,MAAM,MAAM,WAAW,wBAAwB;;;uBA/CrD,mBAUM,OAVN,YAUM,CAAA,OAAA,OAAA,OAAA,KATJ,mBAAgE,MAAA,EAA5D,OAAM,uCAAqC,EAAC,eAAW,GAAA,GAE3D,YAMY,MAAA,UAAA,EAAA;IANA,gBAAe;IAAe,WAAS;IAAgB,SAAO;;2BACpD;KAApB,YAAoB,MAAA,MAAA,CAAA,WAAA;KACpB,YAAuB,MAAA,MAAA,CAAA,cAAA;KACvB,YAAuB,MAAA,MAAA,CAAA,cAAA;KAEvB,YAAgF,MAAA,kBAAA,EAAA;MAA7D,YAAW;MAAc,gBAAe"}
1
+ {"version":3,"file":"CreateUserPage-CqKcY7_X.js","names":[],"sources":["../src/slices/admin/features/create_user/create_user_schema.ts","../src/slices/admin/features/create_user/CreateUserPage.vue"],"sourcesContent":["import { createUserSchema } from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type CreateUserForm = z.infer<typeof createUserSchema>;\n\n// Enhance the schema with metadata\nexport const createUserSchemaWithMetadata = withMetadata(\n createUserSchema,\n 'createUserSchema',\n {\n email: {\n inputType: 'email',\n placeholder: 'Enter email',\n helpText: 'Enter your email',\n autocomplete: 'email',\n },\n\n user_type: {\n inputType: 'select',\n placeholder: 'Select user type',\n helpText: 'Select your user type',\n },\n\n password: {\n inputType: 'password',\n placeholder: 'Enter password (optional)',\n helpText:\n 'If not provided, a random password will be generated and the user will need to use forgot password to set it',\n autocomplete: 'new-password',\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\">Create User</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.EmailField />\n <zinia.UserTypeField />\n <zinia.PasswordField />\n\n <ZiniaSubmitButton submitText=\"Create User\" submittingText=\"Creating User...\" />\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport { createUserSchemaWithMetadata } from './create_user_schema';\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(createUserSchemaWithMetadata, {\n storeName: 'create-user-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst { mutate: createUser } = useMutation(\n (api, input: z.infer<typeof createUserSchemaWithMetadata>) => api.users.createUser(input),\n { invalidate: /^users?:/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof createUserSchemaWithMetadata>) => {\n const result = await createUser(data);\n if (!result) throw new Error('Failed to create user');\n return result;\n};\n\n// Handle success\nconst handleSuccess = async (_data: any) => {\n form.reset();\n toast.success('User created successfully!');\n};\n\n// Handle error\nconst handleError = (error: any) => {\n toast.error(error.message || 'Failed to create user');\n};\n</script>\n"],"mappings":";;;;;;;AAQA,MAAa,+BAA+B,aAC1C,kBACA,oBACA;CACE,OAAO;EACL,WAAW;EACX,aAAa;EACb,UAAU;EACV,cAAc;EACf;CAED,WAAW;EACT,WAAW;EACX,aAAa;EACb,UAAU;EACX;CAED,UAAU;EACR,WAAW;EACX,aAAa;EACb,UACE;EACF,cAAc;EACf;CACF,CACF;;;;;;;;ECXD,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QAAQ,8BAA8B;GAC1F,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CAAC;EAEF,MAAM,EAAE,QAAQ,eAAe,aAC5B,KAAK,UAAwD,IAAI,MAAM,WAAW,MAAM,EACzF,EAAE,YAAY,YAAY,CAC3B;EAGD,MAAM,eAAe,OAAO,SAAuD;GACjF,MAAM,SAAS,MAAM,WAAW,KAAK;AACrC,OAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,wBAAwB;AACrD,UAAO;;EAIT,MAAM,gBAAgB,OAAO,UAAe;AAC1C,QAAK,OAAO;AACZ,SAAM,QAAQ,6BAA6B;;EAI7C,MAAM,eAAe,UAAe;AAClC,SAAM,MAAM,MAAM,WAAW,wBAAwB;;;uBA/CrD,mBAUM,OAVN,YAUM,CAAA,OAAA,OAAA,OAAA,KATJ,mBAAgE,MAAA,EAA5D,OAAM,uCAAqC,EAAC,eAAW,GAAA,GAE3D,YAMY,MAAA,UAAA,EAAA;IANA,gBAAe;IAAe,WAAS;IAAgB,SAAO;;2BACpD;KAApB,YAAoB,MAAA,MAAA,CAAA,WAAA;KACpB,YAAuB,MAAA,MAAA,CAAA,cAAA;KACvB,YAAuB,MAAA,MAAA,CAAA,cAAA;KAEvB,YAAgF,MAAA,kBAAA,EAAA;MAA7D,YAAW;MAAc,gBAAe"}
@@ -1,4 +1,4 @@
1
- import { i as CreditBalanceOverview_default, t as CreditTransactionHistory_default } from "./CreditTransactionHistory-UPg9uDNy.js";
1
+ import { i as CreditBalanceOverview_default, t as CreditTransactionHistory_default } from "./CreditTransactionHistory-mcacl2xG.js";
2
2
  import { createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock } from "vue";
3
3
 
4
4
  //#region src/slices/customer/CreditBalanceDashboard.vue
@@ -25,4 +25,4 @@ var CreditBalanceDashboard_default = _sfc_main;
25
25
 
26
26
  //#endregion
27
27
  export { CreditBalanceDashboard_default as t };
28
- //# sourceMappingURL=CreditBalanceDashboard-CoIEyZWh.js.map
28
+ //# sourceMappingURL=CreditBalanceDashboard-BEsOr0Rw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreditBalanceDashboard-CoIEyZWh.js","names":[],"sources":["../src/slices/customer/CreditBalanceDashboard.vue"],"sourcesContent":["<template>\n <div class=\"container mx-auto py-6\">\n <div class=\"flex justify-between items-center mb-6\">\n <h1 class=\"text-2xl font-bold\">Credit Balance</h1>\n </div>\n\n <!-- Credit balance display -->\n <div class=\"space-y-6\">\n <!-- Credit Balance Overview -->\n <CreditBalanceOverview />\n\n <!-- Transaction History -->\n <CreditTransactionHistory />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport CreditBalanceOverview from './components/CreditBalanceOverview.vue';\nimport CreditTransactionHistory from './components/CreditTransactionHistory.vue';\n</script>\n"],"mappings":";;;;;;;;;;uBACE,mBAaM,OAbN,YAaM;8BAZJ,mBAEM,OAAA,EAFD,OAAM,0CAAwC,EAAA,CACjD,mBAAkD,MAAA,EAA9C,OAAM,sBAAoB,EAAC,iBAAc,CAAA;IAG/C,mBAAA,2BAA+B;IAC/B,mBAMM,OANN,YAMM;KALJ,mBAAA,4BAAgC;KAChC,YAAyB,8BAAA;KAEzB,mBAAA,wBAA4B;KAC5B,YAA4B,iCAAA"}
1
+ {"version":3,"file":"CreditBalanceDashboard-BEsOr0Rw.js","names":[],"sources":["../src/slices/customer/CreditBalanceDashboard.vue"],"sourcesContent":["<template>\n <div class=\"container mx-auto py-6\">\n <div class=\"flex justify-between items-center mb-6\">\n <h1 class=\"text-2xl font-bold\">Credit Balance</h1>\n </div>\n\n <!-- Credit balance display -->\n <div class=\"space-y-6\">\n <!-- Credit Balance Overview -->\n <CreditBalanceOverview />\n\n <!-- Transaction History -->\n <CreditTransactionHistory />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport CreditBalanceOverview from './components/CreditBalanceOverview.vue';\nimport CreditTransactionHistory from './components/CreditTransactionHistory.vue';\n</script>\n"],"mappings":";;;;;;;;;;uBACE,mBAaM,OAbN,YAaM;8BAZJ,mBAEM,OAAA,EAFD,OAAM,0CAAwC,EAAA,CACjD,mBAAkD,MAAA,EAA9C,OAAM,sBAAoB,EAAC,iBAAc,CAAA;IAG/C,mBAAA,2BAA+B;IAC/B,mBAMM,OANN,YAMM;KALJ,mBAAA,4BAAgC;KAChC,YAAyB,8BAAA;KAEzB,mBAAA,wBAA4B;KAC5B,YAA4B,iCAAA"}
@@ -3,11 +3,11 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import "./useMutation-BLNuJoYl.js";
5
5
  import "./useQuery-BzUGEOj0.js";
6
- import "./saved_filter-C2N9l_a9.js";
6
+ import "./saved_filter-erjEgsdK.js";
7
7
  import "./ConfirmDialog-DjthOYU6.js";
8
8
  import "./userAuthorized-3RiCDXxr.js";
9
- import "./customerSupportTicketRoutes-C-DKBy5g.js";
10
- import "./CreditTransactionHistory-UPg9uDNy.js";
11
- import { t as CreditBalanceDashboard_default } from "./CreditBalanceDashboard-CoIEyZWh.js";
9
+ import "./customerSupportTicketRoutes-DvfXGaSC.js";
10
+ import "./CreditTransactionHistory-mcacl2xG.js";
11
+ import { t as CreditBalanceDashboard_default } from "./CreditBalanceDashboard-BEsOr0Rw.js";
12
12
 
13
13
  export { CreditBalanceDashboard_default as default };
@@ -3,11 +3,11 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import "./useMutation-BLNuJoYl.js";
5
5
  import "./useQuery-BzUGEOj0.js";
6
- import "./saved_filter-C2N9l_a9.js";
6
+ import "./saved_filter-erjEgsdK.js";
7
7
  import "./ConfirmDialog-DjthOYU6.js";
8
8
  import "./userAuthorized-3RiCDXxr.js";
9
- import "./customerSupportTicketRoutes-C-DKBy5g.js";
10
- import "./CreditTransactionHistory-UPg9uDNy.js";
11
- import { t as CreditManagement_default } from "./CreditManagement-CCyU_yja.js";
9
+ import "./customerSupportTicketRoutes-DvfXGaSC.js";
10
+ import "./CreditTransactionHistory-mcacl2xG.js";
11
+ import { t as CreditManagement_default } from "./CreditManagement-DiVSMbWZ.js";
12
12
 
13
13
  export { CreditManagement_default as default };
@@ -1,5 +1,5 @@
1
1
  import { t as useMutation } from "./useMutation-BLNuJoYl.js";
2
- import { i as CreditBalanceOverview_default, t as CreditTransactionHistory_default } from "./CreditTransactionHistory-UPg9uDNy.js";
2
+ import { i as CreditBalanceOverview_default, t as CreditTransactionHistory_default } from "./CreditTransactionHistory-mcacl2xG.js";
3
3
  import { Fragment, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, openBlock, provide, ref, toDisplayString, unref, withCtx } from "vue";
4
4
  import { toast } from "vue3-toastify";
5
5
  import { AddCreditsSchema, SetMonthlyAllocationSchema, formatDollar } from "@dragonmastery/dragoncore-shared";
@@ -353,4 +353,4 @@ var CreditManagement_default = _sfc_main;
353
353
 
354
354
  //#endregion
355
355
  export { addCreditsSchemaWithMetadata as a, AddCredits_default as i, SetMonthlyAllocation_default as n, setMonthlyAllocationSchemaWithMetadata as o, ResetMonthlyBalance_default as r, CreditManagement_default as t };
356
- //# sourceMappingURL=CreditManagement-CCyU_yja.js.map
356
+ //# sourceMappingURL=CreditManagement-DiVSMbWZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreditManagement-CCyU_yja.js","names":[],"sources":["../src/slices/customer/features/credit-management/creditFormMetadata.ts","../src/slices/customer/features/credit-management/AddCredits.vue","../src/slices/customer/features/credit-management/ResetMonthlyBalance.vue","../src/slices/customer/features/credit-management/SetMonthlyAllocation.vue","../src/slices/customer/features/credit-management/CreditManagement.vue"],"sourcesContent":["import {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { AddCreditsSchema, SetMonthlyAllocationSchema } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\n\n// Add Credits Form Metadata\nexport const addCreditsSchemaWithMetadata = withMetadata(\n AddCreditsSchema,\n 'addCreditsSchema',\n {\n amount: {\n label: 'Amount',\n placeholder: 'e.g., 100.00',\n helpText: 'Enter the amount to add to rollover credits',\n },\n reason: {\n label: 'Reason',\n inputType: 'textarea',\n placeholder: 'e.g., Purchase, Bonus, Refund',\n helpText: 'Optional reason for adding credits',\n },\n },\n);\n\n// Set Monthly Allocation Form Metadata\nexport const setMonthlyAllocationSchemaWithMetadata = withMetadata(\n SetMonthlyAllocationSchema,\n 'setMonthlyAllocationSchema',\n {\n amount: {\n label: 'Monthly Allocation Amount',\n placeholder: 'e.g., 200.00',\n helpText: 'This amount will be reset monthly',\n },\n },\n);\n\n// Form types\nexport type AddCreditsFormData = UseFormTyped<typeof AddCreditsSchema>;\nexport type SetMonthlyAllocationFormData = UseFormTyped<typeof SetMonthlyAllocationSchema>;\n\n// Injection functions\nexport const injectAddCreditsForm = () => inject<AddCreditsFormData['form']>(ZINIA_FORM_KEY);\nexport const injectSetMonthlyAllocationForm = () =>\n inject<SetMonthlyAllocationFormData['form']>(ZINIA_FORM_KEY);\nexport const injectAddCreditsZinia = () =>\n inject<AddCreditsFormData['zinia']>(ZINIA_FIELDS_KEY);\nexport const injectSetMonthlyAllocationZinia = () =>\n inject<SetMonthlyAllocationFormData['zinia']>(ZINIA_FIELDS_KEY);\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Add Credits</h3>\n <p class=\"text-sm text-base-content/70\">One-time credit addition (goes to rollover)</p>\n\n <ZiniaForm\n @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Add Credits\"\n subtitle=\"Add one-time credits to rollover balance\"\n >\n <zinia.AmountField />\n <zinia.ReasonField />\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Add Credits\" submittingText=\"Adding Credits...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { AddCreditsDto } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { addCreditsSchemaWithMetadata } from './creditFormMetadata';\n\n// Props\ninterface Props {\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n onSuccess: () => {},\n});\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n refreshFormData,\n} = useForm(addCreditsSchemaWithMetadata, {\n storeName: `add-credits-form`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n return {\n amount: '',\n reason: '',\n } satisfies AddCreditsDto;\n },\n});\n\n// Setup mutation for adding credits\nconst { mutate: addCredits } = useMutation(\n (api, input: AddCreditsDto) => api.customer.addCredits(input),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst beforeValidate = () => {\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: AddCreditsDto) => {\n const result = await addCredits({\n amount: formData.amount,\n reason: formData.reason || undefined,\n });\n\n if (!result) {\n throw new Error('Failed to add credits');\n }\n\n return result;\n};\n\n// Handle successful submission\nconst handleSuccess = async (_: any) => {\n refreshFormData();\n toast.success(`Added ${form.values.amount} credits!`);\n refreshCredits();\n props.onSuccess();\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Reset Monthly Balance</h3>\n <p class=\"text-sm text-base-content/70\">Manually trigger monthly reset</p>\n\n <div class=\"alert alert-warning mt-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <span class=\"text-xs\"\n >This will move current monthly balance ({{ currentMonthlyBalance }}) to rollover and\n reset to allocation amount</span\n >\n </div>\n\n <button class=\"btn btn-warning mt-4\" @click=\"showResetModal\" :disabled=\"isResetting\">\n <span v-if=\"isResetting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isResetting ? 'Resetting...' : 'Reset Now' }}\n </button>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2\">\n <span class=\"text-xs\">{{ error }}</span>\n </div>\n </div>\n </div>\n\n <!-- Confirmation Modal -->\n <dialog ref=\"confirmModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Reset Monthly Balance?</h3>\n <p class=\"py-4\">\n This will move the current monthly balance ({{ currentMonthlyBalance }}) to rollover\n and reset monthly credits to the allocation amount.\n </p>\n <p class=\"text-warning font-medium\">This action cannot be undone.</p>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeModal\">Cancel</button>\n <button class=\"btn btn-warning\" @click=\"handleReset\">Confirm Reset</button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button @click=\"closeModal\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { inject, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\n\n// Props\ninterface Props {\n currentMonthlyBalance?: string;\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n currentMonthlyBalance: '0.00',\n onSuccess: () => {},\n});\n\n// Component state\nconst confirmModal = ref<HTMLDialogElement | null>(null);\nconst error = ref('');\nconst { mutate: resetBalance, loading: isResetting } = useMutation(\n (api, _input?: void) => api.customer.resetMonthlyBalance(),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst showResetModal = () => {\n confirmModal.value?.showModal();\n};\n\nconst closeModal = () => {\n confirmModal.value?.close();\n};\n\nconst handleReset = async () => {\n error.value = '';\n closeModal();\n\n try {\n await resetBalance(undefined);\n\n toast.success('Monthly balance reset successfully!');\n\n refreshCredits();\n // Call success callback\n props.onSuccess();\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : 'Failed to reset balance';\n error.value = errorMessage;\n toast.error(errorMessage);\n }\n};\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Monthly Allocation</h3>\n <p class=\"text-sm text-base-content/70\">Set recurring monthly credit amount</p>\n\n <ZiniaForm\n @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Set Monthly Allocation\"\n subtitle=\"Set the recurring monthly credit amount\"\n >\n <zinia.AmountField />\n\n <!-- Information Notice -->\n <div class=\"alert alert-info mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <div class=\"font-semibold\">Monthly Reset</div>\n <div class=\"text-sm\">\n This amount will be automatically reset each month. Any unused credits will roll\n over to the rollover balance.\n </div>\n </div>\n </div>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton\n submitText=\"Set Monthly Allocation\"\n submittingText=\"Setting Allocation...\"\n />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { formatDollar, type SetMonthlyAllocationDto } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { setMonthlyAllocationSchemaWithMetadata } from './creditFormMetadata';\n\n// Props\ninterface Props {\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n onSuccess: () => {},\n});\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(setMonthlyAllocationSchemaWithMetadata, {\n storeName: `set-monthly-allocation-form`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n return {\n amount: '',\n } satisfies SetMonthlyAllocationDto;\n },\n});\n\n// Setup mutation for setting monthly allocation\nconst { mutate: setAllocation } = useMutation(\n (api, input: SetMonthlyAllocationDto) => api.customer.setMonthlyAllocation(input),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst beforeValidate = () => {\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: SetMonthlyAllocationDto) => {\n const result = await setAllocation({\n amount: formData.amount,\n });\n\n if (!result) {\n throw new Error('Failed to set monthly allocation');\n }\n\n return result;\n};\n\n// Handle successful submission\nconst handleSuccess = async (data: any) => {\n clearSavedFormState();\n toast.success(`Monthly allocation set to ${formatDollar(data.monthly)}!`);\n refreshCredits();\n props.onSuccess();\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div class=\"container mx-auto py-6\">\n <h1 class=\"text-3xl font-bold mb-6\">Credit Management</h1>\n\n <!-- Current Balance Overview -->\n <div class=\"mb-6\">\n <CreditBalanceOverview />\n </div>\n\n <!-- Management Actions -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <AddCredits />\n <SetMonthlyAllocation />\n <ResetMonthlyBalance />\n </div>\n\n <!-- Recent Transactions -->\n <div class=\"mt-6\">\n <CreditTransactionHistory />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, ref } from 'vue';\nimport CreditBalanceOverview from '../../components/CreditBalanceOverview.vue';\nimport CreditTransactionHistory from '../../components/CreditTransactionHistory.vue';\nimport AddCredits from './AddCredits.vue';\nimport ResetMonthlyBalance from './ResetMonthlyBalance.vue';\nimport SetMonthlyAllocation from './SetMonthlyAllocation.vue';\n\n// Create a reactive trigger that child components can watch\nconst refreshTrigger = ref(0);\n\n// Provide the trigger function to child components\nprovide('refreshCredits', () => {\n refreshTrigger.value++;\n});\n\n// Provide the trigger value for components to watch\nprovide('refreshTrigger', refreshTrigger);\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CreditManagement-DiVSMbWZ.js","names":[],"sources":["../src/slices/customer/features/credit-management/creditFormMetadata.ts","../src/slices/customer/features/credit-management/AddCredits.vue","../src/slices/customer/features/credit-management/ResetMonthlyBalance.vue","../src/slices/customer/features/credit-management/SetMonthlyAllocation.vue","../src/slices/customer/features/credit-management/CreditManagement.vue"],"sourcesContent":["import {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { AddCreditsSchema, SetMonthlyAllocationSchema } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\n\n// Add Credits Form Metadata\nexport const addCreditsSchemaWithMetadata = withMetadata(\n AddCreditsSchema,\n 'addCreditsSchema',\n {\n amount: {\n label: 'Amount',\n placeholder: 'e.g., 100.00',\n helpText: 'Enter the amount to add to rollover credits',\n },\n reason: {\n label: 'Reason',\n inputType: 'textarea',\n placeholder: 'e.g., Purchase, Bonus, Refund',\n helpText: 'Optional reason for adding credits',\n },\n },\n);\n\n// Set Monthly Allocation Form Metadata\nexport const setMonthlyAllocationSchemaWithMetadata = withMetadata(\n SetMonthlyAllocationSchema,\n 'setMonthlyAllocationSchema',\n {\n amount: {\n label: 'Monthly Allocation Amount',\n placeholder: 'e.g., 200.00',\n helpText: 'This amount will be reset monthly',\n },\n },\n);\n\n// Form types\nexport type AddCreditsFormData = UseFormTyped<typeof AddCreditsSchema>;\nexport type SetMonthlyAllocationFormData = UseFormTyped<typeof SetMonthlyAllocationSchema>;\n\n// Injection functions\nexport const injectAddCreditsForm = () => inject<AddCreditsFormData['form']>(ZINIA_FORM_KEY);\nexport const injectSetMonthlyAllocationForm = () =>\n inject<SetMonthlyAllocationFormData['form']>(ZINIA_FORM_KEY);\nexport const injectAddCreditsZinia = () =>\n inject<AddCreditsFormData['zinia']>(ZINIA_FIELDS_KEY);\nexport const injectSetMonthlyAllocationZinia = () =>\n inject<SetMonthlyAllocationFormData['zinia']>(ZINIA_FIELDS_KEY);\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Add Credits</h3>\n <p class=\"text-sm text-base-content/70\">One-time credit addition (goes to rollover)</p>\n\n <ZiniaForm\n @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Add Credits\"\n subtitle=\"Add one-time credits to rollover balance\"\n >\n <zinia.AmountField />\n <zinia.ReasonField />\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Add Credits\" submittingText=\"Adding Credits...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { AddCreditsDto } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { addCreditsSchemaWithMetadata } from './creditFormMetadata';\n\n// Props\ninterface Props {\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n onSuccess: () => {},\n});\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n refreshFormData,\n} = useForm(addCreditsSchemaWithMetadata, {\n storeName: `add-credits-form`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n return {\n amount: '',\n reason: '',\n } satisfies AddCreditsDto;\n },\n});\n\n// Setup mutation for adding credits\nconst { mutate: addCredits } = useMutation(\n (api, input: AddCreditsDto) => api.customer.addCredits(input),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst beforeValidate = () => {\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: AddCreditsDto) => {\n const result = await addCredits({\n amount: formData.amount,\n reason: formData.reason || undefined,\n });\n\n if (!result) {\n throw new Error('Failed to add credits');\n }\n\n return result;\n};\n\n// Handle successful submission\nconst handleSuccess = async (_: any) => {\n refreshFormData();\n toast.success(`Added ${form.values.amount} credits!`);\n refreshCredits();\n props.onSuccess();\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Reset Monthly Balance</h3>\n <p class=\"text-sm text-base-content/70\">Manually trigger monthly reset</p>\n\n <div class=\"alert alert-warning mt-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <span class=\"text-xs\"\n >This will move current monthly balance ({{ currentMonthlyBalance }}) to rollover and\n reset to allocation amount</span\n >\n </div>\n\n <button class=\"btn btn-warning mt-4\" @click=\"showResetModal\" :disabled=\"isResetting\">\n <span v-if=\"isResetting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isResetting ? 'Resetting...' : 'Reset Now' }}\n </button>\n\n <div v-if=\"error\" class=\"alert alert-error mt-2\">\n <span class=\"text-xs\">{{ error }}</span>\n </div>\n </div>\n </div>\n\n <!-- Confirmation Modal -->\n <dialog ref=\"confirmModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Reset Monthly Balance?</h3>\n <p class=\"py-4\">\n This will move the current monthly balance ({{ currentMonthlyBalance }}) to rollover\n and reset monthly credits to the allocation amount.\n </p>\n <p class=\"text-warning font-medium\">This action cannot be undone.</p>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeModal\">Cancel</button>\n <button class=\"btn btn-warning\" @click=\"handleReset\">Confirm Reset</button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button @click=\"closeModal\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { inject, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\n\n// Props\ninterface Props {\n currentMonthlyBalance?: string;\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n currentMonthlyBalance: '0.00',\n onSuccess: () => {},\n});\n\n// Component state\nconst confirmModal = ref<HTMLDialogElement | null>(null);\nconst error = ref('');\nconst { mutate: resetBalance, loading: isResetting } = useMutation(\n (api, _input?: void) => api.customer.resetMonthlyBalance(),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst showResetModal = () => {\n confirmModal.value?.showModal();\n};\n\nconst closeModal = () => {\n confirmModal.value?.close();\n};\n\nconst handleReset = async () => {\n error.value = '';\n closeModal();\n\n try {\n await resetBalance(undefined);\n\n toast.success('Monthly balance reset successfully!');\n\n refreshCredits();\n // Call success callback\n props.onSuccess();\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : 'Failed to reset balance';\n error.value = errorMessage;\n toast.error(errorMessage);\n }\n};\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-lg\">Monthly Allocation</h3>\n <p class=\"text-sm text-base-content/70\">Set recurring monthly credit amount</p>\n\n <ZiniaForm\n @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Set Monthly Allocation\"\n subtitle=\"Set the recurring monthly credit amount\"\n >\n <zinia.AmountField />\n\n <!-- Information Notice -->\n <div class=\"alert alert-info mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <div class=\"font-semibold\">Monthly Reset</div>\n <div class=\"text-sm\">\n This amount will be automatically reset each month. Any unused credits will roll\n over to the rollover balance.\n </div>\n </div>\n </div>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton\n submitText=\"Set Monthly Allocation\"\n submittingText=\"Setting Allocation...\"\n />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { formatDollar, type SetMonthlyAllocationDto } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { setMonthlyAllocationSchemaWithMetadata } from './creditFormMetadata';\n\n// Props\ninterface Props {\n onSuccess?: () => void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n onSuccess: () => {},\n});\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(setMonthlyAllocationSchemaWithMetadata, {\n storeName: `set-monthly-allocation-form`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n return {\n amount: '',\n } satisfies SetMonthlyAllocationDto;\n },\n});\n\n// Setup mutation for setting monthly allocation\nconst { mutate: setAllocation } = useMutation(\n (api, input: SetMonthlyAllocationDto) => api.customer.setMonthlyAllocation(input),\n { invalidate: /^customer:credit/ },\n);\n\n// Inject the refresh function\nconst refreshCredits = inject<() => void>('refreshCredits', () => {});\n\nconst beforeValidate = () => {\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: SetMonthlyAllocationDto) => {\n const result = await setAllocation({\n amount: formData.amount,\n });\n\n if (!result) {\n throw new Error('Failed to set monthly allocation');\n }\n\n return result;\n};\n\n// Handle successful submission\nconst handleSuccess = async (data: any) => {\n clearSavedFormState();\n toast.success(`Monthly allocation set to ${formatDollar(data.monthly)}!`);\n refreshCredits();\n props.onSuccess();\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n","<template>\n <div class=\"container mx-auto py-6\">\n <h1 class=\"text-3xl font-bold mb-6\">Credit Management</h1>\n\n <!-- Current Balance Overview -->\n <div class=\"mb-6\">\n <CreditBalanceOverview />\n </div>\n\n <!-- Management Actions -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <AddCredits />\n <SetMonthlyAllocation />\n <ResetMonthlyBalance />\n </div>\n\n <!-- Recent Transactions -->\n <div class=\"mt-6\">\n <CreditTransactionHistory />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, ref } from 'vue';\nimport CreditBalanceOverview from '../../components/CreditBalanceOverview.vue';\nimport CreditTransactionHistory from '../../components/CreditTransactionHistory.vue';\nimport AddCredits from './AddCredits.vue';\nimport ResetMonthlyBalance from './ResetMonthlyBalance.vue';\nimport SetMonthlyAllocation from './SetMonthlyAllocation.vue';\n\n// Create a reactive trigger that child components can watch\nconst refreshTrigger = ref(0);\n\n// Provide the trigger function to child components\nprovide('refreshCredits', () => {\n refreshTrigger.value++;\n});\n\n// Provide the trigger value for components to watch\nprovide('refreshTrigger', refreshTrigger);\n</script>\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { r as executeWithAuth } from "./useRpcAuth-CJtq1dqM.js";
2
2
  import { r as getRefreshTokenHandler } from "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import { t as useQuery } from "./useQuery-BzUGEOj0.js";
4
4
  import { t as formatSystemTimestamp } from "./convertToLocalDateTime-BKBxm2Rc.js";
5
- import { t as customerSupportPaths } from "./customerSupportTicketRoutes-C-DKBy5g.js";
5
+ import { t as customerSupportPaths } from "./customerSupportTicketRoutes-DvfXGaSC.js";
6
6
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, normalizeClass, openBlock, ref, resolveComponent, toDisplayString, unref, watch, withCtx } from "vue";
7
7
  import { CreditTransactionReadSchema } from "@dragonmastery/dragoncore-shared";
8
8
  import { useCursorDataTable, withMetadata } from "@dragonmastery/zinia-forms-core";
@@ -226,4 +226,4 @@ var CreditTransactionHistory_default = _sfc_main;
226
226
 
227
227
  //#endregion
228
228
  export { CreditBalanceOverview_default as i, CreditTransactionTypeBadge_default as n, creditTransactionRowSchemaWithMetadata as r, CreditTransactionHistory_default as t };
229
- //# sourceMappingURL=CreditTransactionHistory-UPg9uDNy.js.map
229
+ //# sourceMappingURL=CreditTransactionHistory-mcacl2xG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreditTransactionHistory-UPg9uDNy.js","names":["variables: any"],"sources":["../src/slices/customer/components/CreditBalanceOverview.vue","../src/slices/customer/creditTransactionRowSchema.ts","../src/slices/customer/components/CreditTransactionTypeBadge.vue","../src/slices/customer/components/CreditTransactionHistory.vue"],"sourcesContent":["<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h2 class=\"card-title\">Current Balance</h2>\n\n <div v-if=\"loading\" class=\"flex items-center gap-2\">\n <span class=\"loading loading-spinner loading-sm\"></span>\n <span>Loading balance...</span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error\">\n <span>Failed to load credit balance</span>\n </div>\n\n <div v-else-if=\"data\" class=\"grid grid-cols-1 md:grid-cols-3 gap-4 mt-4\">\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Monthly Credits</div>\n <div class=\"stat-value text-primary\">\n {{ data.monthly }}\n </div>\n <div class=\"stat-desc\">Resets each month</div>\n </div>\n\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Rollover Credits</div>\n <div class=\"stat-value text-secondary\">\n {{ data.rollover }}\n </div>\n <div class=\"stat-desc\">Accumulated balance</div>\n </div>\n\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Total Available</div>\n <div class=\"stat-value text-accent\">{{ totalAvailable }}</div>\n <div class=\"stat-desc\">Ready to use</div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useQuery } from '../../../composables/useQuery';\nimport { computed, inject, ref, watch, type Ref } from 'vue';\n\n// Fetch credit balance\nconst {\n data,\n loading,\n error,\n refetch: executeQuery,\n} = useQuery((api) => api.customer.getCreditBalance(), {\n staleTime: 2 * 60 * 1000,\n});\n\nconst totalAvailable = computed(() => {\n if (!data.value) return '0.00';\n const monthly = parseFloat(data.value.monthly) || 0;\n const rollover = parseFloat(data.value.rollover) || 0;\n return (monthly + rollover).toFixed(2);\n});\n\n// Inject the refresh trigger\nconst refreshTrigger = inject<Ref<number>>('refreshTrigger', ref(0));\n\n// Watch for changes and refetch\nwatch(refreshTrigger, () => {\n executeQuery();\n});\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { CreditTransactionReadSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\nexport const creditTransactionRowSchemaWithMetadata = withMetadata(\n CreditTransactionReadSchema,\n 'creditTransactionRowSchema',\n {\n id: { label: 'ID' },\n support_ticket_id: { label: 'Support Ticket' },\n amount: { label: 'Amount' },\n type: { label: 'Type', sortable: true, filterable: true },\n description: { label: 'Description' },\n balance_after: { label: 'Balance After' },\n created_at: { label: 'Created At', sortable: true },\n created_by: { label: 'Created By', sortable: true },\n },\n);\n\nexport type CreditTransactionRow = z.infer<typeof CreditTransactionReadSchema>;\n","<template>\n <span class=\"badge badge-sm\" :class=\"typeClasses\">\n {{ typeLabel }}\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ninterface Props {\n type: string;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'sm',\n});\n\nconst typeClasses = computed(() => {\n const baseClasses = `badge-${props.size}`;\n switch (props.type) {\n case 'DEDUCTION':\n return `${baseClasses} badge-error`;\n case 'REFUND':\n return `${baseClasses} badge-success`;\n case 'PURCHASE_ONETIME':\n return `${baseClasses} badge-info`;\n case 'PURCHASE_RECURRING':\n return `${baseClasses} badge-primary`;\n case 'ADJUSTMENT':\n return `${baseClasses} badge-warning`;\n default:\n return `${baseClasses} badge-ghost`;\n }\n});\n\nconst typeLabel = computed(() => {\n switch (props.type) {\n case 'DEDUCTION':\n return 'DEDUCTION';\n case 'REFUND':\n return 'REFUND';\n case 'PURCHASE_ONETIME':\n return 'ONE-TIME PURCHASE';\n case 'PURCHASE_RECURRING':\n return 'RECURRING PURCHASE';\n case 'ADJUSTMENT':\n return 'ADJUSTMENT';\n default:\n return props.type.replace('_', ' ').toUpperCase();\n }\n});\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h2 class=\"card-title\">Transaction History</h2>\n\n <ZiniaDataTable>\n <template #cell-type=\"{ row }\">\n <CreditTransactionTypeBadge :type=\"row.type\" size=\"sm\" />\n </template>\n\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n\n <template #cell-amount=\"{ row }\">\n <span class=\"font-mono\" :class=\"getAmountClass(row.type)\">\n {{ formatAmount(row.amount, row.type) }}\n </span>\n </template>\n\n <template #cell-balance_after=\"{ row }\">\n <span class=\"font-mono font-bold\">\n {{ formatCredits(row.balance_after) }}\n </span>\n </template>\n\n <template #cell-description=\"{ row }\">\n <div class=\"flex flex-col\">\n <span>{{ row.description || 'No description' }}</span>\n <router-link\n v-if=\"row.support_ticket_id\"\n :to=\"{\n name: customerSupportPaths.customer_view.name,\n params: { id: row.support_ticket_id },\n }\"\n class=\"text-xs text-primary hover:underline\"\n >\n View Support Ticket →\n </router-link>\n </div>\n </template>\n </ZiniaDataTable>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../../utils/convertToLocalDateTime';\nimport { useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { inject, ref, watch, type Ref } from 'vue';\nimport { customerSupportPaths } from '../../support_ticket/customer/customerSupportTicketRoutes';\nimport { creditTransactionRowSchemaWithMetadata } from '../creditTransactionRowSchema';\nimport CreditTransactionTypeBadge from './CreditTransactionTypeBadge.vue';\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable, refresh } = useCursorDataTable(\n creditTransactionRowSchemaWithMetadata,\n {\n fetchData: async ({ cursor, pageSize, filters, search }) => {\n const variables: any = {\n first: pageSize,\n ...(cursor ? { after: cursor } : {}),\n ...(search ? { search } : {}),\n ...filters,\n };\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.customer.getCreditTransactions(variables);\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n created_at: {\n label: 'Date',\n field: 'created_at',\n sortable: true,\n },\n type: {\n label: 'Type',\n field: 'type',\n sortable: true,\n filterable: true,\n },\n description: {\n label: 'Description',\n field: 'description',\n sortable: false,\n },\n amount: {\n label: 'Amount',\n field: 'amount',\n sortable: true,\n },\n balance_after: {\n label: 'Balance After',\n field: 'balance_after',\n },\n },\n pagination: { pageSize: 25 },\n },\n);\n\n// Utility functions for formatting\nconst formatCredits = (value: string) => {\n const num = parseFloat(value);\n return isNaN(num) ? '0.00' : num.toFixed(2);\n};\n\nconst formatAmount = (amount: string, type: string) => {\n const num = parseFloat(amount);\n const formatted = isNaN(num) ? '0.00' : Math.abs(num).toFixed(2);\n\n if (type === 'DEDUCTION') {\n return `-${formatted}`;\n }\n return `+${formatted}`;\n};\n\nconst getAmountClass = (type: string) => {\n return type === 'DEDUCTION' ? 'text-error' : 'text-success';\n};\n\n// Inject the refresh trigger\nconst refreshTrigger = inject<Ref<number>>('refreshTrigger', ref(0));\n\n// Watch for changes and refetch\nwatch(refreshTrigger, () => {\n refresh();\n});\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CreditTransactionHistory-mcacl2xG.js","names":["variables: any"],"sources":["../src/slices/customer/components/CreditBalanceOverview.vue","../src/slices/customer/creditTransactionRowSchema.ts","../src/slices/customer/components/CreditTransactionTypeBadge.vue","../src/slices/customer/components/CreditTransactionHistory.vue"],"sourcesContent":["<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h2 class=\"card-title\">Current Balance</h2>\n\n <div v-if=\"loading\" class=\"flex items-center gap-2\">\n <span class=\"loading loading-spinner loading-sm\"></span>\n <span>Loading balance...</span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error\">\n <span>Failed to load credit balance</span>\n </div>\n\n <div v-else-if=\"data\" class=\"grid grid-cols-1 md:grid-cols-3 gap-4 mt-4\">\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Monthly Credits</div>\n <div class=\"stat-value text-primary\">\n {{ data.monthly }}\n </div>\n <div class=\"stat-desc\">Resets each month</div>\n </div>\n\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Rollover Credits</div>\n <div class=\"stat-value text-secondary\">\n {{ data.rollover }}\n </div>\n <div class=\"stat-desc\">Accumulated balance</div>\n </div>\n\n <div class=\"stat bg-base-200 rounded-box\">\n <div class=\"stat-title\">Total Available</div>\n <div class=\"stat-value text-accent\">{{ totalAvailable }}</div>\n <div class=\"stat-desc\">Ready to use</div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useQuery } from '../../../composables/useQuery';\nimport { computed, inject, ref, watch, type Ref } from 'vue';\n\n// Fetch credit balance\nconst {\n data,\n loading,\n error,\n refetch: executeQuery,\n} = useQuery((api) => api.customer.getCreditBalance(), {\n staleTime: 2 * 60 * 1000,\n});\n\nconst totalAvailable = computed(() => {\n if (!data.value) return '0.00';\n const monthly = parseFloat(data.value.monthly) || 0;\n const rollover = parseFloat(data.value.rollover) || 0;\n return (monthly + rollover).toFixed(2);\n});\n\n// Inject the refresh trigger\nconst refreshTrigger = inject<Ref<number>>('refreshTrigger', ref(0));\n\n// Watch for changes and refetch\nwatch(refreshTrigger, () => {\n executeQuery();\n});\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { CreditTransactionReadSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\nexport const creditTransactionRowSchemaWithMetadata = withMetadata(\n CreditTransactionReadSchema,\n 'creditTransactionRowSchema',\n {\n id: { label: 'ID' },\n support_ticket_id: { label: 'Support Ticket' },\n amount: { label: 'Amount' },\n type: { label: 'Type', sortable: true, filterable: true },\n description: { label: 'Description' },\n balance_after: { label: 'Balance After' },\n created_at: { label: 'Created At', sortable: true },\n created_by: { label: 'Created By', sortable: true },\n },\n);\n\nexport type CreditTransactionRow = z.infer<typeof CreditTransactionReadSchema>;\n","<template>\n <span class=\"badge badge-sm\" :class=\"typeClasses\">\n {{ typeLabel }}\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ninterface Props {\n type: string;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'sm',\n});\n\nconst typeClasses = computed(() => {\n const baseClasses = `badge-${props.size}`;\n switch (props.type) {\n case 'DEDUCTION':\n return `${baseClasses} badge-error`;\n case 'REFUND':\n return `${baseClasses} badge-success`;\n case 'PURCHASE_ONETIME':\n return `${baseClasses} badge-info`;\n case 'PURCHASE_RECURRING':\n return `${baseClasses} badge-primary`;\n case 'ADJUSTMENT':\n return `${baseClasses} badge-warning`;\n default:\n return `${baseClasses} badge-ghost`;\n }\n});\n\nconst typeLabel = computed(() => {\n switch (props.type) {\n case 'DEDUCTION':\n return 'DEDUCTION';\n case 'REFUND':\n return 'REFUND';\n case 'PURCHASE_ONETIME':\n return 'ONE-TIME PURCHASE';\n case 'PURCHASE_RECURRING':\n return 'RECURRING PURCHASE';\n case 'ADJUSTMENT':\n return 'ADJUSTMENT';\n default:\n return props.type.replace('_', ' ').toUpperCase();\n }\n});\n</script>\n","<template>\n <div class=\"card bg-base-100 shadow-xl\">\n <div class=\"card-body\">\n <h2 class=\"card-title\">Transaction History</h2>\n\n <ZiniaDataTable>\n <template #cell-type=\"{ row }\">\n <CreditTransactionTypeBadge :type=\"row.type\" size=\"sm\" />\n </template>\n\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n\n <template #cell-amount=\"{ row }\">\n <span class=\"font-mono\" :class=\"getAmountClass(row.type)\">\n {{ formatAmount(row.amount, row.type) }}\n </span>\n </template>\n\n <template #cell-balance_after=\"{ row }\">\n <span class=\"font-mono font-bold\">\n {{ formatCredits(row.balance_after) }}\n </span>\n </template>\n\n <template #cell-description=\"{ row }\">\n <div class=\"flex flex-col\">\n <span>{{ row.description || 'No description' }}</span>\n <router-link\n v-if=\"row.support_ticket_id\"\n :to=\"{\n name: customerSupportPaths.customer_view.name,\n params: { id: row.support_ticket_id },\n }\"\n class=\"text-xs text-primary hover:underline\"\n >\n View Support Ticket →\n </router-link>\n </div>\n </template>\n </ZiniaDataTable>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../../utils/convertToLocalDateTime';\nimport { useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { inject, ref, watch, type Ref } from 'vue';\nimport { customerSupportPaths } from '../../support_ticket/customer/customerSupportTicketRoutes';\nimport { creditTransactionRowSchemaWithMetadata } from '../creditTransactionRowSchema';\nimport CreditTransactionTypeBadge from './CreditTransactionTypeBadge.vue';\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable, refresh } = useCursorDataTable(\n creditTransactionRowSchemaWithMetadata,\n {\n fetchData: async ({ cursor, pageSize, filters, search }) => {\n const variables: any = {\n first: pageSize,\n ...(cursor ? { after: cursor } : {}),\n ...(search ? { search } : {}),\n ...filters,\n };\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.customer.getCreditTransactions(variables);\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n created_at: {\n label: 'Date',\n field: 'created_at',\n sortable: true,\n },\n type: {\n label: 'Type',\n field: 'type',\n sortable: true,\n filterable: true,\n },\n description: {\n label: 'Description',\n field: 'description',\n sortable: false,\n },\n amount: {\n label: 'Amount',\n field: 'amount',\n sortable: true,\n },\n balance_after: {\n label: 'Balance After',\n field: 'balance_after',\n },\n },\n pagination: { pageSize: 25 },\n },\n);\n\n// Utility functions for formatting\nconst formatCredits = (value: string) => {\n const num = parseFloat(value);\n return isNaN(num) ? '0.00' : num.toFixed(2);\n};\n\nconst formatAmount = (amount: string, type: string) => {\n const num = parseFloat(amount);\n const formatted = isNaN(num) ? '0.00' : Math.abs(num).toFixed(2);\n\n if (type === 'DEDUCTION') {\n return `-${formatted}`;\n }\n return `+${formatted}`;\n};\n\nconst getAmountClass = (type: string) => {\n return type === 'DEDUCTION' ? 'text-error' : 'text-success';\n};\n\n// Inject the refresh trigger\nconst refreshTrigger = inject<Ref<number>>('refreshTrigger', ref(0));\n\n// Watch for changes and refetch\nwatch(refreshTrigger, () => {\n refresh();\n});\n</script>\n"],"mappings":"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"}
@@ -3,12 +3,12 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import "./useMutation-BLNuJoYl.js";
5
5
  import "./useQuery-BzUGEOj0.js";
6
- import "./saved_filter-C2N9l_a9.js";
6
+ import "./saved_filter-erjEgsdK.js";
7
7
  import "./ConfirmDialog-DjthOYU6.js";
8
8
  import "./InlineAttachments-DAn_QknY.js";
9
9
  import "./FieldsetSection-Br_sygWW.js";
10
10
  import "./userAuthorized-3RiCDXxr.js";
11
- import "./customerSupportTicketRoutes-C-DKBy5g.js";
12
- import { t as CustomerCreateSupportTicketForm_default } from "./CustomerCreateSupportTicketForm-DFH1JtlA.js";
11
+ import "./customerSupportTicketRoutes-DvfXGaSC.js";
12
+ import { t as CustomerCreateSupportTicketForm_default } from "./CustomerCreateSupportTicketForm-IefplMnK.js";
13
13
 
14
14
  export { CustomerCreateSupportTicketForm_default as default };