@dragonmastery/dragoncore-vue 0.0.28 → 0.0.29

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 (75) hide show
  1. package/dist/{CreateTeamForm-CmVZdqOQ.js → CreateTeamForm-CCfgSWUA.js} +2 -2
  2. package/dist/{CreateTeamForm-DRfZ74on.js → CreateTeamForm-DNkueBzR.js} +2 -2
  3. package/dist/{CreateTeamForm-DRfZ74on.js.map → CreateTeamForm-DNkueBzR.js.map} +1 -1
  4. package/dist/{CreditBalanceDashboard-BRY56-9w.js → CreditBalanceDashboard-CLQ8NZnY.js} +2 -2
  5. package/dist/{CreditBalanceDashboard-BRY56-9w.js.map → CreditBalanceDashboard-CLQ8NZnY.js.map} +1 -1
  6. package/dist/{CreditBalanceDashboard-CwXWREgJ.js → CreditBalanceDashboard-jdvZa-ZT.js} +4 -4
  7. package/dist/{CreditManagement-D-bsc1US.js → CreditManagement-Dus4O1BY.js} +2 -2
  8. package/dist/{CreditManagement-D-bsc1US.js.map → CreditManagement-Dus4O1BY.js.map} +1 -1
  9. package/dist/{CreditManagement-BAuzw-NE.js → CreditManagement-DvGikLLe.js} +4 -4
  10. package/dist/{CreditTransactionHistory-plIaRscn.js → CreditTransactionHistory-BZZGQxTV.js} +2 -2
  11. package/dist/{CreditTransactionHistory-plIaRscn.js.map → CreditTransactionHistory-BZZGQxTV.js.map} +1 -1
  12. package/dist/{CustomerCreateSupportTicketForm-D72blvMU.js → CustomerCreateSupportTicketForm-C3CgjqXg.js} +3 -3
  13. package/dist/{CustomerCreateSupportTicketForm-Co6C_P5o.js → CustomerCreateSupportTicketForm-CeG8IKA1.js} +2 -2
  14. package/dist/{CustomerCreateSupportTicketForm-Co6C_P5o.js.map → CustomerCreateSupportTicketForm-CeG8IKA1.js.map} +1 -1
  15. package/dist/{CustomerSupportTicketList-CB_Y1lVj.js → CustomerSupportTicketList-D1pcZzcX.js} +21 -21
  16. package/dist/{CustomerSupportTicketSuccess-DVqoR5-o.js → CustomerSupportTicketSuccess-Cc75m_p-.js} +2 -2
  17. package/dist/{CustomerSupportTicketSuccess-DVqoR5-o.js.map → CustomerSupportTicketSuccess-Cc75m_p-.js.map} +1 -1
  18. package/dist/{CustomerSupportTicketSuccess-B87Zth-g.js → CustomerSupportTicketSuccess-ca10puM-.js} +3 -3
  19. package/dist/{DefaultReferralTeamPage-BHail7YF.js → DefaultReferralTeamPage-fO3tmwOb.js} +102 -62
  20. package/dist/DefaultReferralTeamPage-fO3tmwOb.js.map +1 -0
  21. package/dist/{EditTeamForm-DhutyI9c.js → EditTeamForm-BzTAypZT.js} +2 -2
  22. package/dist/{EditTeamForm-BEOkUaKG.js → EditTeamForm-DdvKHlNj.js} +2 -2
  23. package/dist/{EditTeamForm-BEOkUaKG.js.map → EditTeamForm-DdvKHlNj.js.map} +1 -1
  24. package/dist/{LoginForm-p2fJiTtw.js → LoginForm-CFADKiln.js} +1 -1
  25. package/dist/{LoginForm-D1Mx2vAY.js → LoginForm-CSMHsZrq.js} +1 -1
  26. package/dist/{LoginForm-D1Mx2vAY.js.map → LoginForm-CSMHsZrq.js.map} +1 -1
  27. package/dist/{SavedFiltersPage-CvBKztlD.js → SavedFiltersPage-B9aQYpwf.js} +22 -22
  28. package/dist/{SavedFiltersPage-CvBKztlD.js.map → SavedFiltersPage-B9aQYpwf.js.map} +1 -1
  29. package/dist/{Signup-CJrY4IK-.js → Signup-Ceh7XSea.js} +2 -2
  30. package/dist/{Signup-BCVZZCR_.js → Signup-EykiX-bQ.js} +24 -6
  31. package/dist/Signup-EykiX-bQ.js.map +1 -0
  32. package/dist/{SignupConsentFlow-clxBjJlU.js → SignupConsentFlow-CRtiMpcS.js} +9 -4
  33. package/dist/SignupConsentFlow-CRtiMpcS.js.map +1 -0
  34. package/dist/{StaffCreateSupportTicketForm-Cm595v_4.js → StaffCreateSupportTicketForm-ANtaO4pe.js} +2 -2
  35. package/dist/{StaffCreateSupportTicketForm-Cm595v_4.js.map → StaffCreateSupportTicketForm-ANtaO4pe.js.map} +1 -1
  36. package/dist/{StaffCreateSupportTicketForm-DBhhJyXE.js → StaffCreateSupportTicketForm-CtU12OGq.js} +3 -3
  37. package/dist/{StaffSupportTicketList-2TbMweMK.js → StaffSupportTicketList-CqK8PVq4.js} +21 -21
  38. package/dist/{StaffSupportTicketSuccess-DKzJs74k.js → StaffSupportTicketSuccess-BMh5amWI.js} +3 -3
  39. package/dist/{StaffSupportTicketSuccess-DgULDGIj.js → StaffSupportTicketSuccess-CB4Oa_2J.js} +2 -2
  40. package/dist/{StaffSupportTicketSuccess-DgULDGIj.js.map → StaffSupportTicketSuccess-CB4Oa_2J.js.map} +1 -1
  41. package/dist/{TeamAttachmentsTab-D0SJplvU.js → TeamAttachmentsTab-BG_K7uwG.js} +21 -21
  42. package/dist/{TeamList-gppM0GOD.js → TeamList-B4gWPzce.js} +2 -2
  43. package/dist/{TeamList-gppM0GOD.js.map → TeamList-B4gWPzce.js.map} +1 -1
  44. package/dist/{TeamList-DU6CFPUY.js → TeamList-iAH9mOdd.js} +2 -2
  45. package/dist/{TeamParent-CuASTHKr.js → TeamParent-D_IbzH8B.js} +2 -2
  46. package/dist/{TeamParent-YPtenk3l.js → TeamParent-KQmJgJ9x.js} +2 -2
  47. package/dist/{TeamParent-YPtenk3l.js.map → TeamParent-KQmJgJ9x.js.map} +1 -1
  48. package/dist/{VerifyEmail-CWUhRA1o.js → VerifyEmail-BVwHQpbw.js} +2 -2
  49. package/dist/{VerifyEmail-CWUhRA1o.js.map → VerifyEmail-BVwHQpbw.js.map} +1 -1
  50. package/dist/{VerifyEmail-CLDngljq.js → VerifyEmail-BYYsE-M_.js} +2 -2
  51. package/dist/{ViewTeam-CRmIplCt.js → ViewTeam-BV7SjH8R.js} +129 -30
  52. package/dist/ViewTeam-BV7SjH8R.js.map +1 -0
  53. package/dist/{ViewTeam-Bvvfik4P.js → ViewTeam-BvLIv9Dd.js} +2 -2
  54. package/dist/{customerSupportTicketRoutes-Cy4fp4wx.js → customerSupportTicketRoutes-_HjQcEAD.js} +5 -5
  55. package/dist/{customerSupportTicketRoutes-Cy4fp4wx.js.map → customerSupportTicketRoutes-_HjQcEAD.js.map} +1 -1
  56. package/dist/index.d.ts +675 -663
  57. package/dist/index.js +22 -22
  58. package/dist/{saved_filter-jeZd2rlb.js → saved_filter-C6YHkEMV.js} +2 -2
  59. package/dist/{saved_filter-jeZd2rlb.js.map → saved_filter-C6YHkEMV.js.map} +1 -1
  60. package/dist/{signupConsentStorage-Ct4ZuKi-.js → signupConsentStorage-foqtLkIk.js} +1 -1
  61. package/dist/signupConsentStorage-foqtLkIk.js.map +1 -0
  62. package/dist/{src-zjaOyP9b.js → src-BIX3mMjo.js} +10 -10
  63. package/dist/{src-zjaOyP9b.js.map → src-BIX3mMjo.js.map} +1 -1
  64. package/dist/{staffSupportTicketRoutes-L4CU5dcu.js → staffSupportTicketRoutes-WPaItK5S.js} +5 -5
  65. package/dist/{staffSupportTicketRoutes-L4CU5dcu.js.map → staffSupportTicketRoutes-WPaItK5S.js.map} +1 -1
  66. package/dist/{teamRoutes-CtNcFZjR.js → teamRoutes-CQWRPy3J.js} +7 -7
  67. package/dist/{teamRoutes-CtNcFZjR.js.map → teamRoutes-CQWRPy3J.js.map} +1 -1
  68. package/dist/{useEmailVerificationChannel-QuMSgzzM.js → useEmailVerificationChannel-C4bvvG2b.js} +1 -1
  69. package/dist/{useEmailVerificationChannel-QuMSgzzM.js.map → useEmailVerificationChannel-C4bvvG2b.js.map} +1 -1
  70. package/package.json +2 -2
  71. package/dist/DefaultReferralTeamPage-BHail7YF.js.map +0 -1
  72. package/dist/Signup-BCVZZCR_.js.map +0 -1
  73. package/dist/SignupConsentFlow-clxBjJlU.js.map +0 -1
  74. package/dist/ViewTeam-CRmIplCt.js.map +0 -1
  75. package/dist/signupConsentStorage-Ct4ZuKi-.js.map +0 -1
@@ -4,9 +4,9 @@ import "./useQueryCache-alzaRWEb.js";
4
4
  import { t as useMutation } from "./useMutation-BLNuJoYl.js";
5
5
  import { t as useQuery } from "./useQuery-BzUGEOj0.js";
6
6
  import { t as extractRpcErrorMessage } from "./extractRpcErrorMessage-CAaeVysa.js";
7
- import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, reactive, ref, renderList, toDisplayString, unref, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
7
+ import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, reactive, ref, renderList, toDisplayString, unref, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
8
8
  import { toast } from "vue3-toastify";
9
- import { DefaultReferralTeamFormSchema } from "@dragonmastery/dragoncore-shared";
9
+ import { DefaultReferralTeamFormSchema, ReferralTagValueSchema, normalizeToReferralTag } from "@dragonmastery/dragoncore-shared";
10
10
  import { useForm, withMetadata } from "@dragonmastery/zinia-forms-core";
11
11
 
12
12
  //#region src/slices/admin/features/default_referral_team/defaultReferralTeamSchema.ts
@@ -19,7 +19,7 @@ const defaultReferralTeamSchemaWithMetadata = withMetadata(DefaultReferralTeamFo
19
19
 
20
20
  //#endregion
21
21
  //#region src/slices/admin/features/default_referral_team/DefaultReferralTeamPage.vue
22
- const _hoisted_1 = { class: "mt-2" };
22
+ const _hoisted_1 = { class: "mt-2 w-full max-w-2xl mx-auto px-4" };
23
23
  const _hoisted_2 = {
24
24
  key: 0,
25
25
  class: "flex justify-center py-8"
@@ -29,23 +29,31 @@ const _hoisted_3 = {
29
29
  class: "alert alert-error mt-2"
30
30
  };
31
31
  const _hoisted_4 = { class: "mt-4 flex justify-end" };
32
- const _hoisted_5 = { class: "mt-12" };
32
+ const _hoisted_5 = { class: "mt-8 md:mt-12 w-full" };
33
33
  const _hoisted_6 = {
34
34
  key: 0,
35
- class: "overflow-x-auto"
35
+ class: "flex flex-col gap-4"
36
36
  };
37
- const _hoisted_7 = { class: "table table-zebra" };
38
- const _hoisted_8 = { class: "flex items-center gap-1" };
39
- const _hoisted_9 = ["onUpdate:modelValue", "onKeydown"];
40
- const _hoisted_10 = ["onClick"];
41
- const _hoisted_11 = ["disabled", "onClick"];
42
- const _hoisted_12 = {
37
+ const _hoisted_7 = { class: "card-body p-4 md:p-5" };
38
+ const _hoisted_8 = { class: "card-title text-base md:text-lg mb-3" };
39
+ const _hoisted_9 = { class: "form-control w-full" };
40
+ const _hoisted_10 = { class: "flex flex-wrap gap-2" };
41
+ const _hoisted_11 = [
42
+ "onUpdate:modelValue",
43
+ "onKeydown",
44
+ "onInput"
45
+ ];
46
+ const _hoisted_12 = ["onClick"];
47
+ const _hoisted_13 = { class: "h-5 text-xs text-error leading-tight mt-1" };
48
+ const _hoisted_14 = { class: "card-actions justify-end mt-2" };
49
+ const _hoisted_15 = ["disabled", "onClick"];
50
+ const _hoisted_16 = {
43
51
  key: 0,
44
52
  class: "loading loading-spinner loading-sm"
45
53
  };
46
- const _hoisted_13 = {
54
+ const _hoisted_17 = {
47
55
  key: 1,
48
- class: "text-base-content/60"
56
+ class: "text-base-content/60 text-sm"
49
57
  };
50
58
  const _sfc_main = /* @__PURE__ */ defineComponent({
51
59
  __name: "DefaultReferralTeamPage",
@@ -59,9 +67,23 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
59
67
  staleTime: 60 * 1e3
60
68
  });
61
69
  const referralTagInputs = reactive({});
70
+ const referralTagErrors = reactive({});
62
71
  const savingTeamId = ref(null);
72
+ function validateReferralTagInput(teamId) {
73
+ const raw = referralTagInputs[teamId]?.trim() ?? "";
74
+ if (raw === "") {
75
+ delete referralTagErrors[teamId];
76
+ return;
77
+ }
78
+ const result = ReferralTagValueSchema.safeParse(raw);
79
+ if (result.success) delete referralTagErrors[teamId];
80
+ else referralTagErrors[teamId] = result.error.errors[0]?.message ?? "Invalid referral tag format";
81
+ }
63
82
  watch(() => teamsData.value?.items ?? [], (teams) => {
64
- for (const team of teams) referralTagInputs[team.id] = team.referral_tag ?? "";
83
+ for (const team of teams) {
84
+ referralTagInputs[team.id] = team.referral_tag ?? "";
85
+ delete referralTagErrors[team.id];
86
+ }
65
87
  }, { immediate: true });
66
88
  const loadTeams = async () => {
67
89
  while (teamsLoading.value) await new Promise((resolve) => setTimeout(resolve, 100));
@@ -83,22 +105,34 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
83
105
  },
84
106
  dataLoaders: { teams: loadTeams }
85
107
  });
86
- const isLoading = computed(() => defaultLoading.value || teamsLoading.value || form.isLoading);
108
+ const isLoading = computed(() => {
109
+ if (form.isLoading) return true;
110
+ if (defaultLoading.value && !defaultTeamIdData.value) return true;
111
+ if (teamsLoading.value && !teamsData.value?.items?.length) return true;
112
+ return false;
113
+ });
87
114
  const { mutate: updateDefaultTeam } = useMutation((api, input) => api.appSettings.updateDefaultTeamIdForUnknownReferrals(input), { invalidate: /admin-default-referral-team/ });
88
115
  const { mutate: setReferralTag } = useMutation((api, input) => api.teams.setReferralTag(input), { invalidate: /admin-teams-for-default-referral/ });
89
- /** Normalize a team name to a URL-friendly referral tag (e.g. "Acme Corp & Co." → "acme-corp-co") */
90
- function normalizeToReferralTag(name) {
91
- return name.toLowerCase().trim().replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
92
- }
93
116
  function normalizeReferralTag(team) {
94
117
  const normalized = normalizeToReferralTag(team.display_name || team.unique_name || team.id);
95
- if (normalized) referralTagInputs[team.id] = normalized;
118
+ if (normalized) {
119
+ referralTagInputs[team.id] = normalized;
120
+ validateReferralTagInput(team.id);
121
+ }
96
122
  }
97
123
  async function saveReferralTag(teamId) {
98
124
  const raw = referralTagInputs[teamId]?.trim() ?? "";
99
125
  const referral_tag = raw === "" ? null : raw;
100
126
  const team = teamsData.value?.items?.find((t) => t.id === teamId);
101
127
  if (team && referral_tag === (team.referral_tag ?? null)) return;
128
+ if (referral_tag !== null) {
129
+ const result = ReferralTagValueSchema.safeParse(referral_tag);
130
+ if (!result.success) {
131
+ referralTagErrors[teamId] = result.error.errors[0]?.message ?? "Invalid referral tag format";
132
+ return;
133
+ }
134
+ }
135
+ delete referralTagErrors[teamId];
102
136
  savingTeamId.value = teamId;
103
137
  try {
104
138
  await setReferralTag({
@@ -109,7 +143,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
109
143
  referralTagInputs[teamId] = referral_tag ?? "";
110
144
  await refetchTeams();
111
145
  } catch (err) {
112
- toast.error(extractRpcErrorMessage(err, "Failed to save referral tag"));
146
+ referralTagErrors[teamId] = extractRpcErrorMessage(err, "Failed to save referral tag");
113
147
  } finally {
114
148
  savingTeamId.value = null;
115
149
  }
@@ -129,8 +163,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
129
163
  }
130
164
  return (_ctx, _cache) => {
131
165
  return openBlock(), createElementBlock("div", _hoisted_1, [
132
- _cache[5] || (_cache[5] = createElementVNode("div", { class: "flex justify-between items-center mb-4" }, [createElementVNode("h1", { class: "text-2xl font-bold" }, "Default Team for Unknown Referrals")], -1)),
133
- _cache[6] || (_cache[6] = createElementVNode("p", { class: "text-base-content/70 mb-4" }, " When a referral event arrives with an unknown referral tag, it will be routed to this team. Select a team to use as the default, or clear to reject unknown tags. ", -1)),
166
+ _cache[5] || (_cache[5] = createElementVNode("h1", { class: "text-xl md:text-2xl font-bold mb-2" }, "Default Team for Unknown Referrals", -1)),
167
+ _cache[6] || (_cache[6] = createElementVNode("p", { class: "text-sm md:text-base text-base-content/70 mb-4" }, " When a referral event arrives with an unknown referral tag, it will be routed to this team. Select a team to use as the default, or clear to reject unknown tags. ", -1)),
134
168
  isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_2, [..._cache[0] || (_cache[0] = [createElementVNode("span", { class: "loading loading-spinner loading-lg" }, null, -1)])])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
135
169
  createVNode(unref(ZiniaForm), {
136
170
  onHandleSubmit: handleSubmit,
@@ -152,48 +186,54 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
152
186
  ]),
153
187
  _: 1
154
188
  }),
155
- createCommentVNode(" Referral tags per team "),
189
+ createCommentVNode(" Referral tags per team: mobile-first, DaisyUI "),
156
190
  createElementVNode("div", _hoisted_5, [
157
- _cache[3] || (_cache[3] = createElementVNode("h2", { class: "text-xl font-semibold mb-2" }, "Referral Tags per Team", -1)),
158
- _cache[4] || (_cache[4] = createElementVNode("p", { class: "text-base-content/70 mb-4" }, " Set a referral tag for each team. Other apps use this tag when pushing events. If empty, the team's unique name or path is used as fallback. ", -1)),
159
- unref(teamsData)?.items?.length ? (openBlock(), createElementBlock("div", _hoisted_6, [createElementVNode("table", _hoisted_7, [_cache[2] || (_cache[2] = createElementVNode("thead", null, [createElementVNode("tr", null, [
160
- createElementVNode("th", null, "Team"),
161
- createElementVNode("th", null, "Referral tag"),
162
- createElementVNode("th")
163
- ])], -1)), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(teamsData).items, (team) => {
164
- return openBlock(), createElementBlock("tr", { key: team.id }, [
165
- createElementVNode("td", null, toDisplayString(team.display_name || team.unique_name || team.id), 1),
166
- createElementVNode("td", null, [createElementVNode("div", _hoisted_8, [withDirectives(createElementVNode("input", {
167
- "onUpdate:modelValue": ($event) => referralTagInputs[team.id] = $event,
168
- type: "text",
169
- class: "input input-bordered input-sm w-full max-w-xs",
170
- placeholder: "e.g. my-team",
171
- onKeydown: withKeys(withModifiers(($event) => saveReferralTag(team.id), ["prevent"]), ["enter"])
172
- }, null, 40, _hoisted_9), [[vModelText, referralTagInputs[team.id]]]), createElementVNode("button", {
173
- type: "button",
174
- class: "btn btn-sm btn-ghost btn-square",
175
- title: "Normalize to URL-friendly tag from team name",
176
- onClick: ($event) => normalizeReferralTag(team)
177
- }, [..._cache[1] || (_cache[1] = [createElementVNode("svg", {
178
- xmlns: "http://www.w3.org/2000/svg",
179
- class: "h-4 w-4",
180
- fill: "none",
181
- viewBox: "0 0 24 24",
182
- stroke: "currentColor"
183
- }, [createElementVNode("path", {
184
- "stroke-linecap": "round",
185
- "stroke-linejoin": "round",
186
- "stroke-width": "2",
187
- d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
188
- })], -1)])], 8, _hoisted_10)])]),
189
- createElementVNode("td", null, [createElementVNode("button", {
191
+ _cache[3] || (_cache[3] = createElementVNode("h2", { class: "text-lg md:text-xl font-semibold mb-2" }, "Referral Tags per Team", -1)),
192
+ _cache[4] || (_cache[4] = createElementVNode("p", { class: "text-sm md:text-base text-base-content/70 mb-4" }, " Set a referral tag for each team. Other apps use this tag when pushing events. If empty, the team's unique name or path is used as fallback. ", -1)),
193
+ unref(teamsData)?.items?.length ? (openBlock(), createElementBlock("div", _hoisted_6, [createCommentVNode(" Mobile: stacked cards. md+: same, compact cards "), (openBlock(true), createElementBlock(Fragment, null, renderList(unref(teamsData).items, (team) => {
194
+ return openBlock(), createElementBlock("div", {
195
+ key: team.id,
196
+ class: "card bg-base-100 shadow-sm border border-base-300"
197
+ }, [createElementVNode("div", _hoisted_7, [
198
+ createElementVNode("h3", _hoisted_8, toDisplayString(team.display_name || team.unique_name || team.id), 1),
199
+ createElementVNode("div", _hoisted_9, [
200
+ _cache[2] || (_cache[2] = createElementVNode("label", { class: "label py-1" }, [createElementVNode("span", { class: "label-text text-sm" }, "Referral tag")], -1)),
201
+ createElementVNode("div", _hoisted_10, [withDirectives(createElementVNode("input", {
202
+ "onUpdate:modelValue": ($event) => referralTagInputs[team.id] = $event,
203
+ type: "text",
204
+ class: normalizeClass(["input input-bordered input-sm flex-1 min-w-0", referralTagErrors[team.id] && "input-error"]),
205
+ placeholder: "e.g. my-team",
206
+ onKeydown: withKeys(withModifiers(($event) => saveReferralTag(team.id), ["prevent"]), ["enter"]),
207
+ onInput: ($event) => validateReferralTagInput(team.id)
208
+ }, null, 42, _hoisted_11), [[vModelText, referralTagInputs[team.id]]]), createElementVNode("button", {
209
+ type: "button",
210
+ class: "btn btn-sm btn-ghost btn-square shrink-0",
211
+ title: "Normalize to URL-friendly tag from team name",
212
+ "aria-label": "Normalize tag",
213
+ onClick: ($event) => normalizeReferralTag(team)
214
+ }, [..._cache[1] || (_cache[1] = [createElementVNode("svg", {
215
+ xmlns: "http://www.w3.org/2000/svg",
216
+ class: "h-4 w-4",
217
+ fill: "none",
218
+ viewBox: "0 0 24 24",
219
+ stroke: "currentColor"
220
+ }, [createElementVNode("path", {
221
+ "stroke-linecap": "round",
222
+ "stroke-linejoin": "round",
223
+ "stroke-width": "2",
224
+ d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
225
+ })], -1)])], 8, _hoisted_12)]),
226
+ createCommentVNode(" Fixed-height error slot: no layout shift "),
227
+ createElementVNode("div", _hoisted_13, toDisplayString(referralTagErrors[team.id] ?? "\xA0"), 1)
228
+ ]),
229
+ createElementVNode("div", _hoisted_14, [createElementVNode("button", {
190
230
  type: "button",
191
- class: "btn btn-sm btn-primary",
231
+ class: "btn btn-primary btn-sm",
192
232
  disabled: savingTeamId.value === team.id || referralTagInputs[team.id] === (team.referral_tag ?? ""),
193
233
  onClick: ($event) => saveReferralTag(team.id)
194
- }, [savingTeamId.value === team.id ? (openBlock(), createElementBlock("span", _hoisted_12)) : createCommentVNode("v-if", true), createTextVNode(" " + toDisplayString(savingTeamId.value === team.id ? "Saving..." : "Save"), 1)], 8, _hoisted_11)])
195
- ]);
196
- }), 128))])])])) : (openBlock(), createElementBlock("p", _hoisted_13, "No teams found."))
234
+ }, [savingTeamId.value === team.id ? (openBlock(), createElementBlock("span", _hoisted_16)) : createCommentVNode("v-if", true), createTextVNode(" " + toDisplayString(savingTeamId.value === team.id ? "Saving..." : "Save"), 1)], 8, _hoisted_15)])
235
+ ])]);
236
+ }), 128))])) : (openBlock(), createElementBlock("p", _hoisted_17, "No teams found."))
197
237
  ])
198
238
  ], 64))
199
239
  ]);
@@ -204,4 +244,4 @@ var DefaultReferralTeamPage_default = _sfc_main;
204
244
 
205
245
  //#endregion
206
246
  export { DefaultReferralTeamPage_default as default };
207
- //# sourceMappingURL=DefaultReferralTeamPage-BHail7YF.js.map
247
+ //# sourceMappingURL=DefaultReferralTeamPage-fO3tmwOb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultReferralTeamPage-fO3tmwOb.js","names":[],"sources":["../src/slices/admin/features/default_referral_team/defaultReferralTeamSchema.ts","../src/slices/admin/features/default_referral_team/DefaultReferralTeamPage.vue"],"sourcesContent":["import type { DefaultReferralTeamFormDto } from '@dragonmastery/dragoncore-shared';\nimport { DefaultReferralTeamFormSchema } from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\n\nexport type { DefaultReferralTeamFormDto };\n\nexport const defaultReferralTeamSchemaWithMetadata = withMetadata(\n DefaultReferralTeamFormSchema,\n 'defaultReferralTeamSchema',\n {\n default_team_id: {\n inputType: 'select',\n label: 'Default team',\n placeholder: 'Select team',\n helpText:\n 'When a referral event arrives with an unknown tag, it will be routed to this team. Select \"None\" to reject unknown tags.',\n },\n },\n);\n","<template>\n <div class=\"mt-2 w-full max-w-2xl mx-auto px-4\">\n <h1 class=\"text-xl md:text-2xl font-bold mb-2\">Default Team for Unknown Referrals</h1>\n <p class=\"text-sm md:text-base text-base-content/70 mb-4\">\n When a referral event arrives with an unknown referral tag, it will be routed to this team.\n Select a team to use as the default, or clear to reject unknown tags.\n </p>\n\n <div v-if=\"isLoading\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <template v-else>\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.DefaultTeamIdField\n :select-options=\"form.extraData.teams ?? []\"\n placeholder=\"Select team\"\n />\n\n <div v-if=\"form.submitError\" class=\"alert alert-error mt-2\">\n <span>{{ form.submitError }}</span>\n </div>\n\n <div class=\"mt-4 flex justify-end\">\n <ZiniaSubmitButton\n submitText=\"Save\"\n submittingText=\"Saving...\"\n />\n </div>\n </ZiniaForm>\n\n <!-- Referral tags per team: mobile-first, DaisyUI -->\n <div class=\"mt-8 md:mt-12 w-full\">\n <h2 class=\"text-lg md:text-xl font-semibold mb-2\">Referral Tags per Team</h2>\n <p class=\"text-sm md:text-base text-base-content/70 mb-4\">\n Set a referral tag for each team. Other apps use this tag when pushing events.\n If empty, the team's unique name or path is used as fallback.\n </p>\n\n <div v-if=\"teamsData?.items?.length\" class=\"flex flex-col gap-4\">\n <!-- Mobile: stacked cards. md+: same, compact cards -->\n <div\n v-for=\"team in teamsData.items\"\n :key=\"team.id\"\n class=\"card bg-base-100 shadow-sm border border-base-300\"\n >\n <div class=\"card-body p-4 md:p-5\">\n <h3 class=\"card-title text-base md:text-lg mb-3\">\n {{ team.display_name || team.unique_name || team.id }}\n </h3>\n\n <div class=\"form-control w-full\">\n <label class=\"label py-1\">\n <span class=\"label-text text-sm\">Referral tag</span>\n </label>\n <div class=\"flex flex-wrap gap-2\">\n <input\n v-model=\"referralTagInputs[team.id]\"\n type=\"text\"\n :class=\"[\n 'input input-bordered input-sm flex-1 min-w-0',\n referralTagErrors[team.id] && 'input-error',\n ]\"\n placeholder=\"e.g. my-team\"\n @keydown.enter.prevent=\"saveReferralTag(team.id)\"\n @input=\"validateReferralTagInput(team.id)\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost btn-square shrink-0\"\n title=\"Normalize to URL-friendly tag from team name\"\n aria-label=\"Normalize tag\"\n @click=\"normalizeReferralTag(team)\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </button>\n </div>\n <!-- Fixed-height error slot: no layout shift -->\n <div class=\"h-5 text-xs text-error leading-tight mt-1\">\n {{ referralTagErrors[team.id] ?? '\\u00A0' }}\n </div>\n </div>\n\n <div class=\"card-actions justify-end mt-2\">\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n :disabled=\"savingTeamId === team.id || referralTagInputs[team.id] === (team.referral_tag ?? '')\"\n @click=\"saveReferralTag(team.id)\"\n >\n <span v-if=\"savingTeamId === team.id\" class=\"loading loading-spinner loading-sm\" />\n {{ savingTeamId === team.id ? 'Saving...' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <p v-else class=\"text-base-content/60 text-sm\">No teams found.</p>\n </div>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { normalizeToReferralTag, ReferralTagValueSchema } from '@dragonmastery/dragoncore-shared';\nimport type { DefaultReferralTeamFormDto } from './defaultReferralTeamSchema';\nimport { defaultReferralTeamSchemaWithMetadata } from './defaultReferralTeamSchema';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, reactive, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\nconst {\n data: defaultTeamIdData,\n loading: defaultLoading,\n refetch: refetchDefault,\n} = useQuery((api) => api.appSettings.getDefaultTeamIdForUnknownReferrals(), {\n cacheKey: 'admin-default-referral-team',\n staleTime: 30 * 1000,\n});\n\nconst {\n data: teamsData,\n loading: teamsLoading,\n refetch: refetchTeams,\n} = useQuery(\n (api) => api.teams.listTeams({ first: 100 }),\n {\n cacheKey: 'admin-teams-for-default-referral',\n staleTime: 60 * 1000,\n },\n);\n\nconst referralTagInputs = reactive<Record<string, string>>({});\nconst referralTagErrors = reactive<Record<string, string>>({});\nconst savingTeamId = ref<string | null>(null);\n\nfunction validateReferralTagInput(teamId: string) {\n const raw = referralTagInputs[teamId]?.trim() ?? '';\n if (raw === '') {\n delete referralTagErrors[teamId];\n return;\n }\n const result = ReferralTagValueSchema.safeParse(raw);\n if (result.success) {\n delete referralTagErrors[teamId];\n } else {\n referralTagErrors[teamId] =\n result.error.errors[0]?.message ?? 'Invalid referral tag format';\n }\n}\n\nwatch(\n () => teamsData.value?.items ?? [],\n (teams) => {\n for (const team of teams) {\n referralTagInputs[team.id] = team.referral_tag ?? '';\n delete referralTagErrors[team.id];\n }\n },\n { immediate: true },\n);\n\nconst loadTeams = async () => {\n while (teamsLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n const teams = teamsData.value?.items ?? [];\n const options = [\n { value: '', label: 'None (reject unknown tags)' },\n ...teams.map((team) => ({\n value: team.id,\n label: `${team.display_name || team.unique_name || team.id}${team.referral_tag ? ` (${team.referral_tag})` : ''}`,\n })),\n ];\n return options;\n};\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n} = useForm(defaultReferralTeamSchemaWithMetadata, {\n storeName: 'admin-default-referral-team-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n while (defaultLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n const data = defaultTeamIdData.value;\n return {\n default_team_id: data?.default_team_id ?? null,\n };\n },\n dataLoaders: {\n teams: loadTeams,\n },\n});\n\n// Only show full-page loading during initial load. When refetching teams after inline save,\n// we already have data—keep the table visible and show row-level \"Saving...\" instead.\nconst isLoading = computed(() => {\n if (form.isLoading) return true;\n if (defaultLoading.value && !defaultTeamIdData.value) return true;\n if (teamsLoading.value && !teamsData.value?.items?.length) return true;\n return false;\n});\n\nconst { mutate: updateDefaultTeam } = useMutation(\n (api, input: DefaultReferralTeamFormDto) =>\n api.appSettings.updateDefaultTeamIdForUnknownReferrals(input),\n { invalidate: /admin-default-referral-team/ },\n);\n\nconst { mutate: setReferralTag } = useMutation(\n (api, input: { team_id: string; referral_tag: string | null }) =>\n api.teams.setReferralTag(input),\n { invalidate: /admin-teams-for-default-referral/ },\n);\n\nfunction normalizeReferralTag(team: { id: string; display_name?: string | null; unique_name?: string | null }) {\n const name = team.display_name || team.unique_name || team.id;\n const normalized = normalizeToReferralTag(name);\n if (normalized) {\n referralTagInputs[team.id] = normalized;\n validateReferralTagInput(team.id);\n }\n}\n\nasync function saveReferralTag(teamId: string) {\n const raw = referralTagInputs[teamId]?.trim() ?? '';\n const referral_tag = raw === '' ? null : raw;\n const team = teamsData.value?.items?.find((t) => t.id === teamId);\n if (team && referral_tag === (team.referral_tag ?? null)) return;\n\n // Validate format before save—no transform, show error inline if invalid\n if (referral_tag !== null) {\n const result = ReferralTagValueSchema.safeParse(referral_tag);\n if (!result.success) {\n referralTagErrors[teamId] =\n result.error.errors[0]?.message ?? 'Invalid referral tag format';\n return;\n }\n }\n\n delete referralTagErrors[teamId];\n savingTeamId.value = teamId;\n try {\n await setReferralTag({ team_id: teamId, referral_tag });\n toast.success('Referral tag saved');\n referralTagInputs[teamId] = referral_tag ?? '';\n await refetchTeams();\n } catch (err) {\n referralTagErrors[teamId] = extractRpcErrorMessage(\n err,\n 'Failed to save referral tag',\n );\n } finally {\n savingTeamId.value = null;\n }\n}\n\nasync function handleSubmit(formData: DefaultReferralTeamFormDto) {\n const default_team_id = formData.default_team_id?.trim() || null;\n await updateDefaultTeam({ default_team_id });\n return { ok: true };\n}\n\nasync function handleSuccess() {\n toast.success('Default team saved');\n await refetchDefault();\n}\n\nfunction handleError(error: Error | unknown) {\n const message = error instanceof Error ? error.message : String(error);\n form.setSubmitError(extractRpcErrorMessage(error, message));\n toast.error(form.submitError ?? 'Failed to save');\n}\n</script>\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import "./FieldsetSection-CH1jAwcc.js";
6
6
  import "./userAuthorized-klLUHGxT.js";
7
7
  import "./teamMetadata-26Mwjb2i.js";
8
8
  import "./team_memberRoutes-Cxgte_vj.js";
9
- import "./teamRoutes-CtNcFZjR.js";
10
- import { t as EditTeamForm_default } from "./EditTeamForm-BEOkUaKG.js";
9
+ import "./teamRoutes-CQWRPy3J.js";
10
+ import { t as EditTeamForm_default } from "./EditTeamForm-DdvKHlNj.js";
11
11
 
12
12
  export { EditTeamForm_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-CH1jAwcc.js";
3
3
  import { n as teamUpdateSchemaWithMetadata } from "./teamMetadata-26Mwjb2i.js";
4
- import { t as teamPaths } from "./teamRoutes-CtNcFZjR.js";
4
+ import { t as teamPaths } from "./teamRoutes-CQWRPy3J.js";
5
5
  import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, inject, openBlock, toDisplayString, unref, watch, withCtx } from "vue";
6
6
  import { useRoute, useRouter } from "vue-router";
7
7
  import { toast } from "vue3-toastify";
@@ -160,4 +160,4 @@ var EditTeamForm_default = _sfc_main;
160
160
 
161
161
  //#endregion
162
162
  export { EditTeamForm_default as t };
163
- //# sourceMappingURL=EditTeamForm-BEOkUaKG.js.map
163
+ //# sourceMappingURL=EditTeamForm-DdvKHlNj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditTeamForm-BEOkUaKG.js","names":[],"sources":["../src/slices/team/EditTeamForm.vue"],"sourcesContent":["<template>\n <div v-if=\"form.isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"form.loadError\" 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.loadError }}</span>\n </div>\n\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Edit Team\"\n subtitle=\"Update team details\"\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=\"Update Team\" submittingText=\"Updating Team...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport FieldsetSection from '../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { TeamReadDto, TeamUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { inject, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { teamUpdateSchemaWithMetadata } from './teamMetadata';\nimport { teamPaths } from './teamRoutes';\n\ninterface Props {\n team: TeamReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\nconst team_id = route.params.id as string;\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamUpdateSchemaWithMetadata, {\n storeName: `edit-team-${team_id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n if (!props.team) {\n throw new Error('No team data found');\n }\n\n return props.team as TeamUpdateDto;\n },\n});\n\n// Get refresh function from parent\nconst refreshTeam = inject<(() => Promise<void>) | undefined>('refreshTeam');\n\n// Redirect to view if team is archived\nwatch(\n () => props.team,\n (team) => {\n if (team?.archived_at) {\n router.replace({\n name: teamPaths.view.name,\n params: { id: team_id },\n });\n }\n },\n);\n\n// Setup mutation for updating team\nconst { mutate: updateTeam } = useMutation(\n (api, input: TeamUpdateDto) => api.teams.updateTeam(input),\n { invalidate: /^teams?:/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: TeamUpdateDto) => {\n const updatedTeam = await updateTeam(formData);\n if (!updatedTeam) {\n throw new Error('Failed to update team');\n }\n return updatedTeam;\n};\n\n// Handle successful submission\nconst handleSuccess = async () => {\n clearSavedFormState();\n toast.success(`Team updated successfully!`);\n // Refresh team data via parent\n if (refreshTeam) {\n await refreshTeam();\n }\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":"EditTeamForm-DdvKHlNj.js","names":[],"sources":["../src/slices/team/EditTeamForm.vue"],"sourcesContent":["<template>\n <div v-if=\"form.isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"form.loadError\" 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.loadError }}</span>\n </div>\n\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Edit Team\"\n subtitle=\"Update team details\"\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=\"Update Team\" submittingText=\"Updating Team...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport FieldsetSection from '../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { TeamReadDto, TeamUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { inject, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { teamUpdateSchemaWithMetadata } from './teamMetadata';\nimport { teamPaths } from './teamRoutes';\n\ninterface Props {\n team: TeamReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\nconst team_id = route.params.id as string;\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamUpdateSchemaWithMetadata, {\n storeName: `edit-team-${team_id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n if (!props.team) {\n throw new Error('No team data found');\n }\n\n return props.team as TeamUpdateDto;\n },\n});\n\n// Get refresh function from parent\nconst refreshTeam = inject<(() => Promise<void>) | undefined>('refreshTeam');\n\n// Redirect to view if team is archived\nwatch(\n () => props.team,\n (team) => {\n if (team?.archived_at) {\n router.replace({\n name: teamPaths.view.name,\n params: { id: team_id },\n });\n }\n },\n);\n\n// Setup mutation for updating team\nconst { mutate: updateTeam } = useMutation(\n (api, input: TeamUpdateDto) => api.teams.updateTeam(input),\n { invalidate: /^teams?:/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: TeamUpdateDto) => {\n const updatedTeam = await updateTeam(formData);\n if (!updatedTeam) {\n throw new Error('Failed to update team');\n }\n return updatedTeam;\n};\n\n// Handle successful submission\nconst handleSuccess = async () => {\n clearSavedFormState();\n toast.success(`Team updated successfully!`);\n // Refresh team data via parent\n if (refreshTeam) {\n await refreshTeam();\n }\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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"}
@@ -3,6 +3,6 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import "./useMutation-BLNuJoYl.js";
5
5
  import "./AppLink-FcNGKgvG.js";
6
- import { t as LoginForm_default } from "./LoginForm-D1Mx2vAY.js";
6
+ import { t as LoginForm_default } from "./LoginForm-CSMHsZrq.js";
7
7
 
8
8
  export { LoginForm_default as default };
@@ -137,4 +137,4 @@ var LoginForm_default = _sfc_main;
137
137
 
138
138
  //#endregion
139
139
  export { loginSchemaWithMetadata as n, LoginForm_default as t };
140
- //# sourceMappingURL=LoginForm-D1Mx2vAY.js.map
140
+ //# sourceMappingURL=LoginForm-CSMHsZrq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginForm-D1Mx2vAY.js","names":[],"sources":["../src/slices/auth/features/login/loginSchema.ts","../src/slices/auth/features/login/LoginForm.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { loginSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type LoginForm = z.infer<typeof loginSchema>;\n\n// Enhance the schema with metadata\nexport const loginSchemaWithMetadata = withMetadata(loginSchema, 'loginSchema', {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'username',\n className: 'login-field',\n autofocus: true,\n },\n\n password: {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n});\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <slot name=\"above-form\" />\n\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Login</h1>\n\n <ZiniaForm\n @handle-submit=\"effectiveHandleSubmit\"\n @success=\"effectiveHandleSuccess\"\n @error=\"effectiveHandleError\"\n >\n <zinia.EmailField />\n <zinia.PasswordField />\n\n <ZiniaSubmitButton submitText=\"Login\" submittingText=\"Logging in...\" />\n\n <!-- Error banner - app can override via slot -->\n <slot name=\"error-banner\" :error=\"loginBannerMessage\" :clear=\"clearBanner\">\n <div\n v-if=\"loginBannerMessage\"\n class=\"mt-4 p-4 rounded-lg bg-error/15 text-error\"\n >\n <p class=\"text-sm\">{{ loginBannerMessage }}</p>\n </div>\n </slot>\n\n <div class=\"mt-2\">\n <AppLink :to=\"forgotPasswordLink\" class=\"link-accent link\">\n Forgot your password?\n </AppLink>\n </div>\n <div v-if=\"allowUserSignup\" class=\"text-center mt-2\">\n <p>\n Don't have an account?\n <AppLink class=\"link-accent link\" :to=\"signupLink\">Sign up</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { LoginResponse } from '@dragonmastery/dragoncore-shared';\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { z } from 'zod';\nimport { loginSchemaWithMetadata } from './loginSchema';\n\ntype LoginInput = z.infer<typeof loginSchemaWithMetadata>;\n\nconst props = withDefaults(\n defineProps<{\n /** Override submit handler (e.g. for pre-submit validation). Return login response or throw. */\n onHandleSubmit?: (data: LoginInput) => Promise<LoginResponse>;\n /** Override success handler (e.g. for custom redirect). */\n onSuccess?: (data: LoginResponse) => void | Promise<void>;\n /** Override error handler. Call defaultHandler() to show default banner for non-custom errors. */\n onError?: (error: unknown, defaultHandler: () => void) => void;\n }>(),\n {},\n);\n\nconst { allowUserSignup, emailVerificationMode } = useEnv();\nconst route = useRoute();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst forgotPasswordLink = computed(() => withReturnUrl('/auth/forgot-password', returnUrl.value));\nconst signupLink = computed(() => withReturnUrl('/auth/signup', returnUrl.value));\n\nconst loginBannerMessage = ref<string | null>(null);\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(loginSchemaWithMetadata, {\n storeName: 'login-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst sessionStore = useUserSessionStore();\nconst router = useRouter();\nconst { mutate: loginMutate } = useMutation(\n (api, input: LoginInput) => api.userSessions.login(input),\n { credentials: 'include' }, // Include credentials to allow cookies\n);\n\nconst clearBanner = () => {\n loginBannerMessage.value = null;\n};\n\n// Default handlers\nconst defaultHandleSubmit = async (data: LoginInput): Promise<LoginResponse> => {\n loginBannerMessage.value = null;\n\n const loginData = await loginMutate(data);\n if (!loginData) throw new Error('Login failed');\n const { access_token, user_details_token } = loginData;\n if (!access_token || !user_details_token) throw new Error('Invalid login response');\n\n return loginData;\n};\n\nconst defaultHandleSuccess = async (data: LoginResponse) => {\n sessionStore.setSession(data.user_details_token);\n sessionStore.setAccessToken(data.access_token);\n\n form.reset();\n loginBannerMessage.value = null;\n\n const emailVerified = data.frontend_session?.user?.email_verified ?? true;\n const needsVerification =\n emailVerificationMode === 'strict' && !emailVerified;\n\n const targetPath = needsVerification\n ? withReturnUrl('/auth/verify-email', returnUrl.value)\n : getValidReturnUrl(router.currentRoute.value, '/');\n\n await router.push(targetPath);\n};\n\nconst defaultHandleError = (error: unknown) => {\n loginBannerMessage.value =\n error instanceof Error ? error.message : 'Invalid username or password was entered.';\n};\n\n// Effective handlers: use prop override if provided, else default\nconst effectiveHandleSubmit = props.onHandleSubmit ?? defaultHandleSubmit;\nconst effectiveHandleSuccess = props.onSuccess ?? defaultHandleSuccess;\nconst effectiveHandleError = (error: unknown) => {\n if (props.onError) {\n props.onError(error, () => defaultHandleError(error));\n } else {\n defaultHandleError(error);\n }\n};\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"LoginForm-CSMHsZrq.js","names":[],"sources":["../src/slices/auth/features/login/loginSchema.ts","../src/slices/auth/features/login/LoginForm.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { loginSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type LoginForm = z.infer<typeof loginSchema>;\n\n// Enhance the schema with metadata\nexport const loginSchemaWithMetadata = withMetadata(loginSchema, 'loginSchema', {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'username',\n className: 'login-field',\n autofocus: true,\n },\n\n password: {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n});\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <slot name=\"above-form\" />\n\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Login</h1>\n\n <ZiniaForm\n @handle-submit=\"effectiveHandleSubmit\"\n @success=\"effectiveHandleSuccess\"\n @error=\"effectiveHandleError\"\n >\n <zinia.EmailField />\n <zinia.PasswordField />\n\n <ZiniaSubmitButton submitText=\"Login\" submittingText=\"Logging in...\" />\n\n <!-- Error banner - app can override via slot -->\n <slot name=\"error-banner\" :error=\"loginBannerMessage\" :clear=\"clearBanner\">\n <div\n v-if=\"loginBannerMessage\"\n class=\"mt-4 p-4 rounded-lg bg-error/15 text-error\"\n >\n <p class=\"text-sm\">{{ loginBannerMessage }}</p>\n </div>\n </slot>\n\n <div class=\"mt-2\">\n <AppLink :to=\"forgotPasswordLink\" class=\"link-accent link\">\n Forgot your password?\n </AppLink>\n </div>\n <div v-if=\"allowUserSignup\" class=\"text-center mt-2\">\n <p>\n Don't have an account?\n <AppLink class=\"link-accent link\" :to=\"signupLink\">Sign up</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { LoginResponse } from '@dragonmastery/dragoncore-shared';\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { z } from 'zod';\nimport { loginSchemaWithMetadata } from './loginSchema';\n\ntype LoginInput = z.infer<typeof loginSchemaWithMetadata>;\n\nconst props = withDefaults(\n defineProps<{\n /** Override submit handler (e.g. for pre-submit validation). Return login response or throw. */\n onHandleSubmit?: (data: LoginInput) => Promise<LoginResponse>;\n /** Override success handler (e.g. for custom redirect). */\n onSuccess?: (data: LoginResponse) => void | Promise<void>;\n /** Override error handler. Call defaultHandler() to show default banner for non-custom errors. */\n onError?: (error: unknown, defaultHandler: () => void) => void;\n }>(),\n {},\n);\n\nconst { allowUserSignup, emailVerificationMode } = useEnv();\nconst route = useRoute();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst forgotPasswordLink = computed(() => withReturnUrl('/auth/forgot-password', returnUrl.value));\nconst signupLink = computed(() => withReturnUrl('/auth/signup', returnUrl.value));\n\nconst loginBannerMessage = ref<string | null>(null);\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(loginSchemaWithMetadata, {\n storeName: 'login-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst sessionStore = useUserSessionStore();\nconst router = useRouter();\nconst { mutate: loginMutate } = useMutation(\n (api, input: LoginInput) => api.userSessions.login(input),\n { credentials: 'include' }, // Include credentials to allow cookies\n);\n\nconst clearBanner = () => {\n loginBannerMessage.value = null;\n};\n\n// Default handlers\nconst defaultHandleSubmit = async (data: LoginInput): Promise<LoginResponse> => {\n loginBannerMessage.value = null;\n\n const loginData = await loginMutate(data);\n if (!loginData) throw new Error('Login failed');\n const { access_token, user_details_token } = loginData;\n if (!access_token || !user_details_token) throw new Error('Invalid login response');\n\n return loginData;\n};\n\nconst defaultHandleSuccess = async (data: LoginResponse) => {\n sessionStore.setSession(data.user_details_token);\n sessionStore.setAccessToken(data.access_token);\n\n form.reset();\n loginBannerMessage.value = null;\n\n const emailVerified = data.frontend_session?.user?.email_verified ?? true;\n const needsVerification =\n emailVerificationMode === 'strict' && !emailVerified;\n\n const targetPath = needsVerification\n ? withReturnUrl('/auth/verify-email', returnUrl.value)\n : getValidReturnUrl(router.currentRoute.value, '/');\n\n await router.push(targetPath);\n};\n\nconst defaultHandleError = (error: unknown) => {\n loginBannerMessage.value =\n error instanceof Error ? error.message : 'Invalid username or password was entered.';\n};\n\n// Effective handlers: use prop override if provided, else default\nconst effectiveHandleSubmit = props.onHandleSubmit ?? defaultHandleSubmit;\nconst effectiveHandleSuccess = props.onSuccess ?? defaultHandleSuccess;\nconst effectiveHandleError = (error: unknown) => {\n if (props.onError) {\n props.onError(error, () => defaultHandleError(error));\n } else {\n defaultHandleError(error);\n }\n};\n</script>\n"],"mappings":"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"}
@@ -3,9 +3,9 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import { t as useMutation } from "./useMutation-BLNuJoYl.js";
5
5
  import { t as useQuery } from "./useQuery-BzUGEOj0.js";
6
- import "./src-zjaOyP9b.js";
6
+ import "./src-BIX3mMjo.js";
7
7
  import "./AppLink-FcNGKgvG.js";
8
- import { p as useInjectedPinnedPresets } from "./saved_filter-jeZd2rlb.js";
8
+ import { p as useInjectedPinnedPresets } from "./saved_filter-C6YHkEMV.js";
9
9
  import { t as ConfirmDialog_default } from "./ConfirmDialog-DjthOYU6.js";
10
10
  import "./InlineAttachments-DAn_QknY.js";
11
11
  import "./TeamMembersTab-BigqpBDH.js";
@@ -20,46 +20,46 @@ import "./UserProfilePage-FNLYK9kj.js";
20
20
  import "./ChangePasswordPage-nr0B06HB.js";
21
21
  import "./teamMetadata-26Mwjb2i.js";
22
22
  import "./team_memberRoutes-Cxgte_vj.js";
23
- import "./teamRoutes-CtNcFZjR.js";
24
- import "./CreateTeamForm-DRfZ74on.js";
25
- import "./EditTeamForm-BEOkUaKG.js";
23
+ import "./teamRoutes-CQWRPy3J.js";
24
+ import "./CreateTeamForm-DNkueBzR.js";
25
+ import "./EditTeamForm-DdvKHlNj.js";
26
26
  import "./TeamHistoryTab-p3hDxCc3.js";
27
- import "./TeamList-gppM0GOD.js";
27
+ import "./TeamList-B4gWPzce.js";
28
28
  import "./TeamNotesTab-DPw9YEwK.js";
29
- import "./TeamParent-YPtenk3l.js";
30
- import "./ViewTeam-CRmIplCt.js";
29
+ import "./TeamParent-KQmJgJ9x.js";
30
+ import "./ViewTeam-BV7SjH8R.js";
31
31
  import "./teamMemberMetadata-DX0W-B7p.js";
32
32
  import "./CreateTeamMemberForm-ITp4XFn9.js";
33
33
  import "./EditTeamMemberForm-Fyf8Zxfh.js";
34
34
  import "./TeamMemberList-D0-dM5kI.js";
35
35
  import "./TeamMemberParent-CJGWXjuM.js";
36
36
  import "./ViewTeamMember-Cf5yXdv6.js";
37
- import "./customerSupportTicketRoutes-Cy4fp4wx.js";
38
- import "./staffSupportTicketRoutes-L4CU5dcu.js";
37
+ import "./customerSupportTicketRoutes-_HjQcEAD.js";
38
+ import "./staffSupportTicketRoutes-WPaItK5S.js";
39
39
  import "./TimelineSystemEvent-Ch1sZiyO.js";
40
- import "./CustomerCreateSupportTicketForm-Co6C_P5o.js";
40
+ import "./CustomerCreateSupportTicketForm-CeG8IKA1.js";
41
41
  import "./CustomerSupportTicketParent-BaKfkSlU.js";
42
- import "./CustomerSupportTicketSuccess-DVqoR5-o.js";
43
- import "./StaffCreateSupportTicketForm-Cm595v_4.js";
42
+ import "./CustomerSupportTicketSuccess-Cc75m_p-.js";
43
+ import "./StaffCreateSupportTicketForm-ANtaO4pe.js";
44
44
  import "./SupportTicketDevLifecycleBadge-BYKZjEv6.js";
45
45
  import "./StaffSupportTicketParent-yoC-_Lku.js";
46
- import "./StaffSupportTicketSuccess-DgULDGIj.js";
47
- import "./LoginForm-D1Mx2vAY.js";
48
- import "./useEmailVerificationChannel-QuMSgzzM.js";
49
- import "./Signup-BCVZZCR_.js";
46
+ import "./StaffSupportTicketSuccess-CB4Oa_2J.js";
47
+ import "./Signup-EykiX-bQ.js";
48
+ import "./LoginForm-CSMHsZrq.js";
49
+ import "./useEmailVerificationChannel-C4bvvG2b.js";
50
50
  import "./ForgotPassword-Dd-E3_o1.js";
51
51
  import "./ResetPassword-CyizBRob.js";
52
52
  import "./Logout-Bdktl4NZ.js";
53
53
  import "./mfaSchema-C6PatIbY.js";
54
54
  import "./MfaSetup-Bjc3v0hs.js";
55
55
  import "./MfaVerify-uJlPz8xg.js";
56
- import "./VerifyEmail-CWUhRA1o.js";
56
+ import "./VerifyEmail-BVwHQpbw.js";
57
57
  import "./UserListPage-A0_eNpQ1.js";
58
58
  import "./CreateUserPage-1WiLNGr_.js";
59
59
  import "./EditUserPage-BBzGmOrx.js";
60
- import "./CreditTransactionHistory-plIaRscn.js";
61
- import "./CreditBalanceDashboard-BRY56-9w.js";
62
- import "./CreditManagement-D-bsc1US.js";
60
+ import "./CreditTransactionHistory-BZZGQxTV.js";
61
+ import "./CreditBalanceDashboard-CLQ8NZnY.js";
62
+ import "./CreditManagement-Dus4O1BY.js";
63
63
  import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, renderList, resolveComponent, toDisplayString, unref, vModelText, withCtx, withDirectives, withKeys } from "vue";
64
64
 
65
65
  //#region src/slices/saved_filter/SavedFiltersPage.vue
@@ -453,4 +453,4 @@ var SavedFiltersPage_default = _sfc_main;
453
453
 
454
454
  //#endregion
455
455
  export { SavedFiltersPage_default as default };
456
- //# sourceMappingURL=SavedFiltersPage-CvBKztlD.js.map
456
+ //# sourceMappingURL=SavedFiltersPage-B9aQYpwf.js.map