@dragonmastery/dragoncore-vue 0.0.26 → 0.0.27

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 (57) hide show
  1. package/dist/{CreateTeamForm-CZRTmCOx.js → CreateTeamForm-BuplRIXl.js} +2 -2
  2. package/dist/{CreateTeamForm-CZRTmCOx.js.map → CreateTeamForm-BuplRIXl.js.map} +1 -1
  3. package/dist/{CreateTeamForm-C-ktK6hn.js → CreateTeamForm-Cy29yHqJ.js} +2 -2
  4. package/dist/{CreditBalanceDashboard-BHLCoCbK.js → CreditBalanceDashboard-DzWc30u_.js} +2 -2
  5. package/dist/{CreditBalanceDashboard-BHLCoCbK.js.map → CreditBalanceDashboard-DzWc30u_.js.map} +1 -1
  6. package/dist/{CreditBalanceDashboard-Bzxo_Rhr.js → CreditBalanceDashboard-rN0W4Dxv.js} +4 -4
  7. package/dist/{CreditManagement-Ds6bCB1y.js → CreditManagement-2dBjtV5Q.js} +4 -4
  8. package/dist/{CreditManagement-C_Va9qmV.js → CreditManagement-Bs4gqN11.js} +2 -2
  9. package/dist/{CreditManagement-C_Va9qmV.js.map → CreditManagement-Bs4gqN11.js.map} +1 -1
  10. package/dist/{CreditTransactionHistory-JVPQPiLB.js → CreditTransactionHistory-D_fy5d3l.js} +2 -2
  11. package/dist/{CreditTransactionHistory-JVPQPiLB.js.map → CreditTransactionHistory-D_fy5d3l.js.map} +1 -1
  12. package/dist/{CustomerCreateSupportTicketForm-BI5LQ9sF.js → CustomerCreateSupportTicketForm-B9bxGTOX.js} +3 -3
  13. package/dist/{CustomerCreateSupportTicketForm-BfEiv6I8.js → CustomerCreateSupportTicketForm-e8cIzSS6.js} +2 -2
  14. package/dist/{CustomerCreateSupportTicketForm-BfEiv6I8.js.map → CustomerCreateSupportTicketForm-e8cIzSS6.js.map} +1 -1
  15. package/dist/{CustomerSupportTicketList-Bf9ImaIe.js → CustomerSupportTicketList-CJIV2v6_.js} +18 -18
  16. package/dist/{CustomerSupportTicketSuccess-CmXVwmtE.js → CustomerSupportTicketSuccess-B5E7Mr0R.js} +2 -2
  17. package/dist/{CustomerSupportTicketSuccess-CmXVwmtE.js.map → CustomerSupportTicketSuccess-B5E7Mr0R.js.map} +1 -1
  18. package/dist/{CustomerSupportTicketSuccess-QgmDYuA_.js → CustomerSupportTicketSuccess-iLsr2cWy.js} +3 -3
  19. package/dist/{EditTeamForm-BLqalA9l.js → EditTeamForm-BJBTHghU.js} +2 -2
  20. package/dist/{EditTeamForm-DYvHGBRF.js → EditTeamForm-BbSQ8cdm.js} +2 -2
  21. package/dist/{EditTeamForm-DYvHGBRF.js.map → EditTeamForm-BbSQ8cdm.js.map} +1 -1
  22. package/dist/{LoginForm-DPmrJ_wm.js → LoginForm-D1Mx2vAY.js} +59 -37
  23. package/dist/LoginForm-D1Mx2vAY.js.map +1 -0
  24. package/dist/{LoginForm-By2I6TuV.js → LoginForm-p2fJiTtw.js} +1 -1
  25. package/dist/{SavedFiltersPage-bB4jbQgI.js → SavedFiltersPage-BViMOhvn.js} +19 -19
  26. package/dist/{SavedFiltersPage-bB4jbQgI.js.map → SavedFiltersPage-BViMOhvn.js.map} +1 -1
  27. package/dist/{StaffCreateSupportTicketForm-ByvHC20-.js → StaffCreateSupportTicketForm-BmqqHlqp.js} +3 -3
  28. package/dist/{StaffCreateSupportTicketForm-LuHzqt2w.js → StaffCreateSupportTicketForm-C-UWBdA6.js} +2 -2
  29. package/dist/{StaffCreateSupportTicketForm-LuHzqt2w.js.map → StaffCreateSupportTicketForm-C-UWBdA6.js.map} +1 -1
  30. package/dist/{StaffSupportTicketList-irgGqZUp.js → StaffSupportTicketList-90I_ljzX.js} +18 -18
  31. package/dist/{StaffSupportTicketSuccess-C6PI7mxk.js → StaffSupportTicketSuccess-CW1yJhtp.js} +3 -3
  32. package/dist/{StaffSupportTicketSuccess-BoQZY9Qt.js → StaffSupportTicketSuccess-TEtJGyaZ.js} +2 -2
  33. package/dist/{StaffSupportTicketSuccess-BoQZY9Qt.js.map → StaffSupportTicketSuccess-TEtJGyaZ.js.map} +1 -1
  34. package/dist/{TeamAttachmentsTab-B9fDWDrw.js → TeamAttachmentsTab-BgnU0y6j.js} +18 -18
  35. package/dist/{TeamList-lMtyRe75.js → TeamList-Y5FzwNeV.js} +2 -2
  36. package/dist/{TeamList-CBJOtPQR.js → TeamList-ggZEivO2.js} +2 -2
  37. package/dist/{TeamList-CBJOtPQR.js.map → TeamList-ggZEivO2.js.map} +1 -1
  38. package/dist/{TeamParent-Ckbc8M17.js → TeamParent-C1pHDWY1.js} +2 -2
  39. package/dist/{TeamParent-CYKznys5.js → TeamParent-CObyDkrL.js} +2 -2
  40. package/dist/{TeamParent-CYKznys5.js.map → TeamParent-CObyDkrL.js.map} +1 -1
  41. package/dist/{ViewTeam-zP_Jah0c.js → ViewTeam-Dj0JSLzE.js} +2 -2
  42. package/dist/{ViewTeam-BgZzH7lK.js → ViewTeam-RXno7OPV.js} +2 -2
  43. package/dist/{ViewTeam-BgZzH7lK.js.map → ViewTeam-RXno7OPV.js.map} +1 -1
  44. package/dist/{customerSupportTicketRoutes-DZ6mSNIQ.js → customerSupportTicketRoutes-Cmva-eXn.js} +5 -5
  45. package/dist/{customerSupportTicketRoutes-DZ6mSNIQ.js.map → customerSupportTicketRoutes-Cmva-eXn.js.map} +1 -1
  46. package/dist/index.d.ts +180 -136
  47. package/dist/index.js +19 -19
  48. package/dist/{saved_filter-B0MGrzy2.js → saved_filter-C1pXMOJZ.js} +2 -2
  49. package/dist/{saved_filter-B0MGrzy2.js.map → saved_filter-C1pXMOJZ.js.map} +1 -1
  50. package/dist/{src-Bx44Vnfl.js → src-qjXj41gp.js} +27 -7
  51. package/dist/{src-Bx44Vnfl.js.map → src-qjXj41gp.js.map} +1 -1
  52. package/dist/{staffSupportTicketRoutes-CKdCYj3S.js → staffSupportTicketRoutes-BUa3oCVP.js} +5 -5
  53. package/dist/{staffSupportTicketRoutes-CKdCYj3S.js.map → staffSupportTicketRoutes-BUa3oCVP.js.map} +1 -1
  54. package/dist/{teamRoutes-BYpld9yI.js → teamRoutes-DxVWQDWU.js} +7 -7
  55. package/dist/{teamRoutes-BYpld9yI.js.map → teamRoutes-DxVWQDWU.js.map} +1 -1
  56. package/package.json +2 -2
  57. package/dist/LoginForm-DPmrJ_wm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"EditTeamForm-DYvHGBRF.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-BbSQ8cdm.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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"}
@@ -2,7 +2,7 @@ import { d as useEnv, o as useUserSessionStore } from "./useRpcAuth-CJtq1dqM.js"
2
2
  import { t as useMutation } from "./useMutation-BLNuJoYl.js";
3
3
  import { t as AppLink_default } from "./AppLink-FcNGKgvG.js";
4
4
  import { o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-B5V3SJf5.js";
5
- import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
5
+ import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, renderSlot, toDisplayString, unref, withCtx } from "vue";
6
6
  import { useRoute, useRouter } from "vue-router";
7
7
  import { loginSchema } from "@dragonmastery/dragoncore-shared";
8
8
  import { useForm, withMetadata } from "@dragonmastery/zinia-forms-core";
@@ -36,12 +36,18 @@ const _hoisted_2 = {
36
36
  const _hoisted_3 = { class: "text-sm" };
37
37
  const _hoisted_4 = { class: "mt-2" };
38
38
  const _hoisted_5 = {
39
- key: 1,
39
+ key: 0,
40
40
  class: "text-center mt-2"
41
41
  };
42
42
  const _sfc_main = /* @__PURE__ */ defineComponent({
43
43
  __name: "LoginForm",
44
+ props: {
45
+ onHandleSubmit: {},
46
+ onSuccess: {},
47
+ onError: {}
48
+ },
44
49
  setup(__props) {
50
+ const props = __props;
45
51
  const { allowUserSignup, emailVerificationMode } = useEnv();
46
52
  const route = useRoute();
47
53
  const returnUrl = computed(() => route.query.returnUrl);
@@ -56,7 +62,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
56
62
  const sessionStore = useUserSessionStore();
57
63
  const router = useRouter();
58
64
  const { mutate: loginMutate } = useMutation((api, input) => api.userSessions.login(input), { credentials: "include" });
59
- const handleSubmit = async (data) => {
65
+ const clearBanner = () => {
66
+ loginBannerMessage.value = null;
67
+ };
68
+ const defaultHandleSubmit = async (data) => {
60
69
  loginBannerMessage.value = null;
61
70
  const loginData = await loginMutate(data);
62
71
  if (!loginData) throw new Error("Login failed");
@@ -64,7 +73,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
64
73
  if (!access_token || !user_details_token) throw new Error("Invalid login response");
65
74
  return loginData;
66
75
  };
67
- const handleSuccess = async (data) => {
76
+ const defaultHandleSuccess = async (data) => {
68
77
  sessionStore.setSession(data.user_details_token);
69
78
  sessionStore.setAccessToken(data.access_token);
70
79
  form.reset();
@@ -73,41 +82,54 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
73
82
  const targetPath = emailVerificationMode === "strict" && !emailVerified ? withReturnUrl("/auth/verify-email", returnUrl.value) : getValidReturnUrl(router.currentRoute.value, "/");
74
83
  await router.push(targetPath);
75
84
  };
76
- const handleError = (error) => {
85
+ const defaultHandleError = (error) => {
77
86
  loginBannerMessage.value = error instanceof Error ? error.message : "Invalid username or password was entered.";
78
87
  };
88
+ const effectiveHandleSubmit = props.onHandleSubmit ?? defaultHandleSubmit;
89
+ const effectiveHandleSuccess = props.onSuccess ?? defaultHandleSuccess;
90
+ const effectiveHandleError = (error) => {
91
+ if (props.onError) props.onError(error, () => defaultHandleError(error));
92
+ else defaultHandleError(error);
93
+ };
79
94
  return (_ctx, _cache) => {
80
- return openBlock(), createElementBlock("div", _hoisted_1, [_cache[3] || (_cache[3] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Login", -1)), createVNode(unref(ZiniaForm), {
81
- onHandleSubmit: handleSubmit,
82
- onSuccess: handleSuccess,
83
- onError: handleError
84
- }, {
85
- default: withCtx(() => [
86
- createVNode(unref(zinia).EmailField),
87
- createVNode(unref(zinia).PasswordField),
88
- createVNode(unref(ZiniaSubmitButton), {
89
- submitText: "Login",
90
- submittingText: "Logging in..."
91
- }),
92
- createCommentVNode(" Error banner underneath login button - backend owns the message "),
93
- loginBannerMessage.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("p", _hoisted_3, toDisplayString(loginBannerMessage.value), 1)])) : createCommentVNode("v-if", true),
94
- createElementVNode("div", _hoisted_4, [createVNode(AppLink_default, {
95
- to: forgotPasswordLink.value,
96
- class: "link-accent link"
97
- }, {
98
- default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode(" Forgot your password? ", -1)])]),
99
- _: 1
100
- }, 8, ["to"])]),
101
- unref(allowUserSignup) ? (openBlock(), createElementBlock("div", _hoisted_5, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Don't have an account? ", -1)), createVNode(AppLink_default, {
102
- class: "link-accent link",
103
- to: signupLink.value
104
- }, {
105
- default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("Sign up", -1)])]),
106
- _: 1
107
- }, 8, ["to"])])])) : createCommentVNode("v-if", true)
108
- ]),
109
- _: 1
110
- })]);
95
+ return openBlock(), createElementBlock("div", _hoisted_1, [
96
+ renderSlot(_ctx.$slots, "above-form"),
97
+ _cache[3] || (_cache[3] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Login", -1)),
98
+ createVNode(unref(ZiniaForm), {
99
+ onHandleSubmit: unref(effectiveHandleSubmit),
100
+ onSuccess: unref(effectiveHandleSuccess),
101
+ onError: effectiveHandleError
102
+ }, {
103
+ default: withCtx(() => [
104
+ createVNode(unref(zinia).EmailField),
105
+ createVNode(unref(zinia).PasswordField),
106
+ createVNode(unref(ZiniaSubmitButton), {
107
+ submitText: "Login",
108
+ submittingText: "Logging in..."
109
+ }),
110
+ createCommentVNode(" Error banner - app can override via slot "),
111
+ renderSlot(_ctx.$slots, "error-banner", {
112
+ error: loginBannerMessage.value,
113
+ clear: clearBanner
114
+ }, () => [loginBannerMessage.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("p", _hoisted_3, toDisplayString(loginBannerMessage.value), 1)])) : createCommentVNode("v-if", true)]),
115
+ createElementVNode("div", _hoisted_4, [createVNode(AppLink_default, {
116
+ to: forgotPasswordLink.value,
117
+ class: "link-accent link"
118
+ }, {
119
+ default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode(" Forgot your password? ", -1)])]),
120
+ _: 1
121
+ }, 8, ["to"])]),
122
+ unref(allowUserSignup) ? (openBlock(), createElementBlock("div", _hoisted_5, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Don't have an account? ", -1)), createVNode(AppLink_default, {
123
+ class: "link-accent link",
124
+ to: signupLink.value
125
+ }, {
126
+ default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("Sign up", -1)])]),
127
+ _: 1
128
+ }, 8, ["to"])])])) : createCommentVNode("v-if", true)
129
+ ]),
130
+ _: 3
131
+ }, 8, ["onHandleSubmit", "onSuccess"])
132
+ ]);
111
133
  };
112
134
  }
113
135
  });
@@ -115,4 +137,4 @@ var LoginForm_default = _sfc_main;
115
137
 
116
138
  //#endregion
117
139
  export { loginSchemaWithMetadata as n, LoginForm_default as t };
118
- //# sourceMappingURL=LoginForm-DPmrJ_wm.js.map
140
+ //# sourceMappingURL=LoginForm-D1Mx2vAY.js.map
@@ -0,0 +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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"}
@@ -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-DPmrJ_wm.js";
6
+ import { t as LoginForm_default } from "./LoginForm-D1Mx2vAY.js";
7
7
 
8
8
  export { LoginForm_default as default };
@@ -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-Bx44Vnfl.js";
6
+ import "./src-qjXj41gp.js";
7
7
  import "./AppLink-FcNGKgvG.js";
8
- import { p as useInjectedPinnedPresets } from "./saved_filter-B0MGrzy2.js";
8
+ import { p as useInjectedPinnedPresets } from "./saved_filter-C1pXMOJZ.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,31 +20,31 @@ 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-BYpld9yI.js";
24
- import "./CreateTeamForm-CZRTmCOx.js";
25
- import "./EditTeamForm-DYvHGBRF.js";
23
+ import "./teamRoutes-DxVWQDWU.js";
24
+ import "./CreateTeamForm-BuplRIXl.js";
25
+ import "./EditTeamForm-BbSQ8cdm.js";
26
26
  import "./TeamHistoryTab-p3hDxCc3.js";
27
- import "./TeamList-CBJOtPQR.js";
27
+ import "./TeamList-ggZEivO2.js";
28
28
  import "./TeamNotesTab-DPw9YEwK.js";
29
- import "./TeamParent-CYKznys5.js";
30
- import "./ViewTeam-BgZzH7lK.js";
29
+ import "./TeamParent-CObyDkrL.js";
30
+ import "./ViewTeam-RXno7OPV.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-DZ6mSNIQ.js";
38
- import "./staffSupportTicketRoutes-CKdCYj3S.js";
37
+ import "./customerSupportTicketRoutes-Cmva-eXn.js";
38
+ import "./staffSupportTicketRoutes-BUa3oCVP.js";
39
39
  import "./TimelineSystemEvent-Ch1sZiyO.js";
40
- import "./CustomerCreateSupportTicketForm-BfEiv6I8.js";
40
+ import "./CustomerCreateSupportTicketForm-e8cIzSS6.js";
41
41
  import "./CustomerSupportTicketParent-BaKfkSlU.js";
42
- import "./CustomerSupportTicketSuccess-CmXVwmtE.js";
43
- import "./StaffCreateSupportTicketForm-LuHzqt2w.js";
42
+ import "./CustomerSupportTicketSuccess-B5E7Mr0R.js";
43
+ import "./StaffCreateSupportTicketForm-C-UWBdA6.js";
44
44
  import "./SupportTicketDevLifecycleBadge-BYKZjEv6.js";
45
45
  import "./StaffSupportTicketParent-yoC-_Lku.js";
46
- import "./StaffSupportTicketSuccess-BoQZY9Qt.js";
47
- import "./LoginForm-DPmrJ_wm.js";
46
+ import "./StaffSupportTicketSuccess-TEtJGyaZ.js";
47
+ import "./LoginForm-D1Mx2vAY.js";
48
48
  import "./useEmailVerificationChannel-QuMSgzzM.js";
49
49
  import "./Signup-BCVZZCR_.js";
50
50
  import "./ForgotPassword-Dd-E3_o1.js";
@@ -57,9 +57,9 @@ import "./VerifyEmail-CEbvnWLl.js";
57
57
  import "./UserListPage-A0_eNpQ1.js";
58
58
  import "./CreateUserPage-1WiLNGr_.js";
59
59
  import "./EditUserPage-BBzGmOrx.js";
60
- import "./CreditTransactionHistory-JVPQPiLB.js";
61
- import "./CreditBalanceDashboard-BHLCoCbK.js";
62
- import "./CreditManagement-C_Va9qmV.js";
60
+ import "./CreditTransactionHistory-D_fy5d3l.js";
61
+ import "./CreditBalanceDashboard-DzWc30u_.js";
62
+ import "./CreditManagement-Bs4gqN11.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-bB4jbQgI.js.map
456
+ //# sourceMappingURL=SavedFiltersPage-BViMOhvn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SavedFiltersPage-bB4jbQgI.js","names":["CONTEXT_LABELS: Record<string, string>"],"sources":["../src/slices/saved_filter/SavedFiltersPage.vue"],"sourcesContent":["<template>\n <div class=\"max-w-4xl mx-auto\">\n <h1 class=\"text-2xl font-bold mb-6\">Saved Filters</h1>\n\n <div v-if=\"loading\" class=\"flex justify-center py-12\">\n <span class=\"loading loading-spinner loading-lg\" />\n </div>\n\n <template v-else>\n <!-- Favorites (pinned) section with reorder -->\n <section v-if=\"pinnedPresets.length > 0\" class=\"mb-8\">\n <h2 class=\"text-lg font-semibold mb-3 flex items-center gap-2\">\n <svg\n class=\"w-5 h-5 text-primary\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n Favorites\n </h2>\n <p class=\"text-sm text-base-content/70 mb-3\">\n Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder.\n </p>\n <ul class=\"space-y-2\">\n <li\n v-for=\"(preset, idx) in pinnedPresets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <div class=\"flex flex-col gap-0.5 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === 0\"\n title=\"Move up\"\n @click=\"movePinned(idx, -1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === pinnedPresets.length - 1\"\n title=\"Move down\"\n @click=\"movePinned(idx, 1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <span class=\"text-xs text-base-content/60 shrink-0\">\n {{ contextLabel(preset.context) }}\n </span>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-primary\"\n title=\"Unpin\"\n :disabled=\"unpinning\"\n @click=\"handleUnpin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </li>\n </ul>\n </section>\n\n <!-- All presets grouped by path -->\n <section>\n <h2 class=\"text-lg font-semibold mb-3\">All Presets</h2>\n <p v-if=\"groupedPresets.length === 0\" class=\"text-base-content/70 text-sm\">\n No saved presets yet. Use the Presets button on any list page to save your filters.\n </p>\n <div v-else class=\"space-y-6\">\n <div\n v-for=\"[routePath, presets] in groupedPresets\"\n :key=\"routePath\"\n class=\"space-y-2\"\n >\n <h3 class=\"text-sm font-medium text-base-content/80 uppercase tracking-wide\">\n {{ contextLabelFromPath(routePath) }}\n </h3>\n <ul class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <div class=\"flex gap-1 shrink-0\">\n <button\n v-if=\"!isPinned(preset.id)\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n :title=\"canPinMore ? 'Pin to favorites' : 'Maximum 5 pinned'\"\n :disabled=\"!canPinMore || pinning\"\n @click=\"handlePin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n </div>\n </div>\n </section>\n </template>\n\n <!-- Delete confirmation modal -->\n <ConfirmDialog\n v-model=\"showDeleteConfirm\"\n title=\"Delete preset?\"\n confirm-text=\"Delete\"\n cancel-text=\"Cancel\"\n processing-text=\"Deleting...\"\n confirm-button-class=\"btn-error\"\n :is-processing=\"deleting\"\n @confirm=\"confirmDelete\"\n @cancel=\"presetToDelete = null\"\n >\n <template #message>\n <p>\n Are you sure you want to delete \"{{ presetToDelete?.name }}\"?\n This cannot be undone.\n </p>\n </template>\n </ConfirmDialog>\n\n <!-- Rename modal / inline could stay as is -->\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useMutation, useQuery } from '@dragonmastery/dragoncore-vue';\nimport { computed, nextTick, ref } from 'vue';\nimport ConfirmDialog from '../../components/ConfirmDialog.vue';\nimport { useInjectedPinnedPresets } from './usePinnedPresets';\n\nconst CACHE_KEY_ALL = 'saved-filters:all';\n\nconst { data: allPresets, loading, refetch: refetchAllPresets } = useQuery(\n (api) => api.savedFilters.listAllSavedFilters(),\n { cacheKey: CACHE_KEY_ALL, staleTime: 24 * 60 * 60 * 1000 },\n);\n\nconst injectedPinned = useInjectedPinnedPresets();\nconst pinnedPresets = computed(() => injectedPinned.pinned.value ?? []);\n\nconst groupedPresets = computed(() => {\n const groups = new Map<string, SavedFilterReadDto[]>();\n for (const preset of allPresets.value ?? []) {\n const key = preset.route_path || preset.context || 'other';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(preset);\n }\n return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst pinnedIdsSet = computed(() => new Set(pinnedPresets.value.map((p) => p.id)));\nconst canPinMore = computed(() => pinnedPresets.value.length < 5);\n\nfunction isPinned(id: string) {\n return pinnedIdsSet.value.has(id);\n}\n\nfunction getPresetLink(preset: SavedFilterReadDto) {\n return {\n path: preset.route_path,\n query: preset.filters ?? {},\n };\n}\n\nconst CONTEXT_LABELS: Record<string, string> = {\n tracker: 'Trackers',\n followup: 'Followups',\n support_ticket_staff: 'Staff Support Tickets',\n support_ticket_customer: 'Customer Support Tickets',\n};\n\nfunction contextLabel(context: string): string {\n return CONTEXT_LABELS[context] ?? context;\n}\n\nfunction contextLabelFromPath(routePath: string): string {\n if (routePath.startsWith('/trackers')) return 'Trackers';\n if (routePath.startsWith('/followups')) return 'Followups';\n if (routePath.startsWith('/support-tickets/staff')) return 'Staff Support Tickets';\n if (routePath.startsWith('/support-tickets')) return 'Customer Support Tickets';\n return routePath || 'Other';\n}\n\nconst { mutate: reorderPins, loading: reordering } = useMutation(\n (api, ids: string[]) => api.savedFilters.reorderPinnedPresets(ids),\n { invalidate: 'pinned-presets' },\n);\n\nconst { mutate: updatePreset, loading: renaming } = useMutation(\n (api, input: { id: string; name: string }) =>\n api.savedFilters.updateSavedFilter({ id: input.id, name: input.name }),\n { invalidate: /^saved-filters:/ },\n);\n\nconst { mutate: deletePreset, loading: deleting } = useMutation(\n (api, id: string) => api.savedFilters.deleteSavedFilter(id),\n { invalidate: /^saved-filters:|^pinned-presets/ },\n);\n\nconst pinning = ref(false);\nconst unpinning = ref(false);\n\nasync function handlePin(preset: SavedFilterReadDto) {\n pinning.value = true;\n try {\n await injectedPinned.pinPreset(preset);\n } finally {\n pinning.value = false;\n }\n}\n\nasync function handleUnpin(preset: SavedFilterReadDto) {\n unpinning.value = true;\n try {\n await injectedPinned.unpinPreset(preset.id);\n } finally {\n unpinning.value = false;\n }\n}\n\nasync function movePinned(idx: number, delta: number) {\n const list = [...pinnedPresets.value];\n const newIdx = idx + delta;\n if (newIdx < 0 || newIdx >= list.length) return;\n [list[idx], list[newIdx]] = [list[newIdx]!, list[idx]!];\n try {\n await reorderPins(list.map((p) => p.id));\n await injectedPinned.refetchPinned();\n } catch {\n // Error handled by mutation\n }\n}\n\nconst showDeleteConfirm = ref(false);\nconst presetToDelete = ref<SavedFilterReadDto | null>(null);\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n presetToDelete.value = preset;\n showDeleteConfirm.value = true;\n}\n\nasync function confirmDelete() {\n if (!presetToDelete.value) return;\n try {\n await deletePreset(presetToDelete.value.id);\n if (isPinned(presetToDelete.value.id)) {\n await injectedPinned.unpinPreset(presetToDelete.value.id);\n }\n await refetchAllPresets();\n presetToDelete.value = null;\n showDeleteConfirm.value = false;\n } catch {\n // Error handled by mutation\n }\n}\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n try {\n await updatePreset({ id: presetId, name });\n cancelRename();\n await refetchAllPresets();\n if (isPinned(presetId)) {\n await injectedPinned.refetchPinned();\n }\n } catch {\n // Error handled by mutation\n }\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"SavedFiltersPage-BViMOhvn.js","names":["CONTEXT_LABELS: Record<string, string>"],"sources":["../src/slices/saved_filter/SavedFiltersPage.vue"],"sourcesContent":["<template>\n <div class=\"max-w-4xl mx-auto\">\n <h1 class=\"text-2xl font-bold mb-6\">Saved Filters</h1>\n\n <div v-if=\"loading\" class=\"flex justify-center py-12\">\n <span class=\"loading loading-spinner loading-lg\" />\n </div>\n\n <template v-else>\n <!-- Favorites (pinned) section with reorder -->\n <section v-if=\"pinnedPresets.length > 0\" class=\"mb-8\">\n <h2 class=\"text-lg font-semibold mb-3 flex items-center gap-2\">\n <svg\n class=\"w-5 h-5 text-primary\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n Favorites\n </h2>\n <p class=\"text-sm text-base-content/70 mb-3\">\n Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder.\n </p>\n <ul class=\"space-y-2\">\n <li\n v-for=\"(preset, idx) in pinnedPresets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <div class=\"flex flex-col gap-0.5 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === 0\"\n title=\"Move up\"\n @click=\"movePinned(idx, -1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === pinnedPresets.length - 1\"\n title=\"Move down\"\n @click=\"movePinned(idx, 1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <span class=\"text-xs text-base-content/60 shrink-0\">\n {{ contextLabel(preset.context) }}\n </span>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-primary\"\n title=\"Unpin\"\n :disabled=\"unpinning\"\n @click=\"handleUnpin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </li>\n </ul>\n </section>\n\n <!-- All presets grouped by path -->\n <section>\n <h2 class=\"text-lg font-semibold mb-3\">All Presets</h2>\n <p v-if=\"groupedPresets.length === 0\" class=\"text-base-content/70 text-sm\">\n No saved presets yet. Use the Presets button on any list page to save your filters.\n </p>\n <div v-else class=\"space-y-6\">\n <div\n v-for=\"[routePath, presets] in groupedPresets\"\n :key=\"routePath\"\n class=\"space-y-2\"\n >\n <h3 class=\"text-sm font-medium text-base-content/80 uppercase tracking-wide\">\n {{ contextLabelFromPath(routePath) }}\n </h3>\n <ul class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <div class=\"flex gap-1 shrink-0\">\n <button\n v-if=\"!isPinned(preset.id)\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n :title=\"canPinMore ? 'Pin to favorites' : 'Maximum 5 pinned'\"\n :disabled=\"!canPinMore || pinning\"\n @click=\"handlePin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n </div>\n </div>\n </section>\n </template>\n\n <!-- Delete confirmation modal -->\n <ConfirmDialog\n v-model=\"showDeleteConfirm\"\n title=\"Delete preset?\"\n confirm-text=\"Delete\"\n cancel-text=\"Cancel\"\n processing-text=\"Deleting...\"\n confirm-button-class=\"btn-error\"\n :is-processing=\"deleting\"\n @confirm=\"confirmDelete\"\n @cancel=\"presetToDelete = null\"\n >\n <template #message>\n <p>\n Are you sure you want to delete \"{{ presetToDelete?.name }}\"?\n This cannot be undone.\n </p>\n </template>\n </ConfirmDialog>\n\n <!-- Rename modal / inline could stay as is -->\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useMutation, useQuery } from '@dragonmastery/dragoncore-vue';\nimport { computed, nextTick, ref } from 'vue';\nimport ConfirmDialog from '../../components/ConfirmDialog.vue';\nimport { useInjectedPinnedPresets } from './usePinnedPresets';\n\nconst CACHE_KEY_ALL = 'saved-filters:all';\n\nconst { data: allPresets, loading, refetch: refetchAllPresets } = useQuery(\n (api) => api.savedFilters.listAllSavedFilters(),\n { cacheKey: CACHE_KEY_ALL, staleTime: 24 * 60 * 60 * 1000 },\n);\n\nconst injectedPinned = useInjectedPinnedPresets();\nconst pinnedPresets = computed(() => injectedPinned.pinned.value ?? []);\n\nconst groupedPresets = computed(() => {\n const groups = new Map<string, SavedFilterReadDto[]>();\n for (const preset of allPresets.value ?? []) {\n const key = preset.route_path || preset.context || 'other';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(preset);\n }\n return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst pinnedIdsSet = computed(() => new Set(pinnedPresets.value.map((p) => p.id)));\nconst canPinMore = computed(() => pinnedPresets.value.length < 5);\n\nfunction isPinned(id: string) {\n return pinnedIdsSet.value.has(id);\n}\n\nfunction getPresetLink(preset: SavedFilterReadDto) {\n return {\n path: preset.route_path,\n query: preset.filters ?? {},\n };\n}\n\nconst CONTEXT_LABELS: Record<string, string> = {\n tracker: 'Trackers',\n followup: 'Followups',\n support_ticket_staff: 'Staff Support Tickets',\n support_ticket_customer: 'Customer Support Tickets',\n};\n\nfunction contextLabel(context: string): string {\n return CONTEXT_LABELS[context] ?? context;\n}\n\nfunction contextLabelFromPath(routePath: string): string {\n if (routePath.startsWith('/trackers')) return 'Trackers';\n if (routePath.startsWith('/followups')) return 'Followups';\n if (routePath.startsWith('/support-tickets/staff')) return 'Staff Support Tickets';\n if (routePath.startsWith('/support-tickets')) return 'Customer Support Tickets';\n return routePath || 'Other';\n}\n\nconst { mutate: reorderPins, loading: reordering } = useMutation(\n (api, ids: string[]) => api.savedFilters.reorderPinnedPresets(ids),\n { invalidate: 'pinned-presets' },\n);\n\nconst { mutate: updatePreset, loading: renaming } = useMutation(\n (api, input: { id: string; name: string }) =>\n api.savedFilters.updateSavedFilter({ id: input.id, name: input.name }),\n { invalidate: /^saved-filters:/ },\n);\n\nconst { mutate: deletePreset, loading: deleting } = useMutation(\n (api, id: string) => api.savedFilters.deleteSavedFilter(id),\n { invalidate: /^saved-filters:|^pinned-presets/ },\n);\n\nconst pinning = ref(false);\nconst unpinning = ref(false);\n\nasync function handlePin(preset: SavedFilterReadDto) {\n pinning.value = true;\n try {\n await injectedPinned.pinPreset(preset);\n } finally {\n pinning.value = false;\n }\n}\n\nasync function handleUnpin(preset: SavedFilterReadDto) {\n unpinning.value = true;\n try {\n await injectedPinned.unpinPreset(preset.id);\n } finally {\n unpinning.value = false;\n }\n}\n\nasync function movePinned(idx: number, delta: number) {\n const list = [...pinnedPresets.value];\n const newIdx = idx + delta;\n if (newIdx < 0 || newIdx >= list.length) return;\n [list[idx], list[newIdx]] = [list[newIdx]!, list[idx]!];\n try {\n await reorderPins(list.map((p) => p.id));\n await injectedPinned.refetchPinned();\n } catch {\n // Error handled by mutation\n }\n}\n\nconst showDeleteConfirm = ref(false);\nconst presetToDelete = ref<SavedFilterReadDto | null>(null);\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n presetToDelete.value = preset;\n showDeleteConfirm.value = true;\n}\n\nasync function confirmDelete() {\n if (!presetToDelete.value) return;\n try {\n await deletePreset(presetToDelete.value.id);\n if (isPinned(presetToDelete.value.id)) {\n await injectedPinned.unpinPreset(presetToDelete.value.id);\n }\n await refetchAllPresets();\n presetToDelete.value = null;\n showDeleteConfirm.value = false;\n } catch {\n // Error handled by mutation\n }\n}\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n try {\n await updatePreset({ id: presetId, name });\n cancelRename();\n await refetchAllPresets();\n if (isPinned(presetId)) {\n await injectedPinned.refetchPinned();\n }\n } catch {\n // Error handled by mutation\n }\n}\n</script>\n"],"mappings":"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"}
@@ -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-B0MGrzy2.js";
6
+ import "./saved_filter-C1pXMOJZ.js";
7
7
  import "./ConfirmDialog-DjthOYU6.js";
8
8
  import "./InlineAttachments-DAn_QknY.js";
9
9
  import "./FieldsetSection-CH1jAwcc.js";
10
10
  import "./userAuthorized-klLUHGxT.js";
11
- import "./staffSupportTicketRoutes-CKdCYj3S.js";
12
- import { t as StaffCreateSupportTicketForm_default } from "./StaffCreateSupportTicketForm-LuHzqt2w.js";
11
+ import "./staffSupportTicketRoutes-BUa3oCVP.js";
12
+ import { t as StaffCreateSupportTicketForm_default } from "./StaffCreateSupportTicketForm-C-UWBdA6.js";
13
13
 
14
14
  export { StaffCreateSupportTicketForm_default as default };
@@ -4,7 +4,7 @@ import { t as useMutation } from "./useMutation-BLNuJoYl.js";
4
4
  import { t as InlineAttachments_default } from "./InlineAttachments-DAn_QknY.js";
5
5
  import { t as FieldsetSection_default } from "./FieldsetSection-CH1jAwcc.js";
6
6
  import { n as formatToISODate } from "./convertToLocalDateTime-C13-PrSA.js";
7
- import { t as staffSupportPaths } from "./staffSupportTicketRoutes-CKdCYj3S.js";
7
+ import { t as staffSupportPaths } from "./staffSupportTicketRoutes-BUa3oCVP.js";
8
8
  import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, inject, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
9
9
  import { useRouter } from "vue-router";
10
10
  import { toast } from "vue3-toastify";
@@ -252,4 +252,4 @@ var StaffCreateSupportTicketForm_default = _sfc_main;
252
252
 
253
253
  //#endregion
254
254
  export { adminSupportTicketCreateSchemaWithMetadata as n, adminSupportTicketUpdateSchemaWithMetadata as r, StaffCreateSupportTicketForm_default as t };
255
- //# sourceMappingURL=StaffCreateSupportTicketForm-LuHzqt2w.js.map
255
+ //# sourceMappingURL=StaffCreateSupportTicketForm-C-UWBdA6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StaffCreateSupportTicketForm-LuHzqt2w.js","names":[],"sources":["../src/slices/support_ticket/staff/StaffSupportTicketMetadata.ts","../src/slices/support_ticket/staff/StaffCreateSupportTicketForm.vue"],"sourcesContent":["import {\n StaffSupportTicketCreateSchema,\n StaffSupportTicketUpdateSchema,\n SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { inject } from 'vue';\n\n// Create schema (no ID)\nexport const adminSupportTicketCreateSchemaWithMetadata = withMetadata(\n StaffSupportTicketCreateSchema,\n 'adminSupportTicketCreateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n credit_value: {\n inputType: 'currency',\n step: 0.01,\n placeholder: 'Enter credit value',\n },\n start_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n target_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n completed_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n priority: {\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n assigned_to: {\n label: 'Assignee',\n inputType: 'select',\n placeholder: 'Auto-assign (round-robin)',\n },\n },\n);\n\n// Update schema (with ID)\nexport const adminSupportTicketUpdateSchemaWithMetadata = withMetadata(\n StaffSupportTicketUpdateSchema,\n 'adminSupportTicketUpdateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n credit_value: {\n inputType: 'currency',\n step: 0.01,\n placeholder: 'Enter credit value',\n },\n start_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n target_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n completed_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n priority: {\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n },\n);\n\nexport type AdminSupportTicketCreateFormDto = UseFormTyped<\n typeof StaffSupportTicketCreateSchema\n>;\nexport type AdminSupportTicketUpdateFormDto = UseFormTyped<\n typeof StaffSupportTicketUpdateSchema\n>;\n\nexport const injectAdminSupportTicketCreateForm = () =>\n inject<AdminSupportTicketCreateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectAdminSupportTicketUpdateForm = () =>\n inject<AdminSupportTicketUpdateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectAdminSupportTicketZinia = () =>\n inject<AdminSupportTicketCreateFormDto['zinia'] | AdminSupportTicketUpdateFormDto['zinia']>(\n ZINIA_FIELDS_KEY,\n );\n","<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 @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Create Support Ticket\"\n subtitle=\"Create new ticket or internal task\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Support Ticket Details\">\n <zinia.TitleField placeholder=\"Enter ticket title\" />\n <zinia.TypeField />\n <zinia.PriorityField />\n </FieldsetSection>\n <FieldsetSection title=\"Description\">\n <zinia.DescriptionField class=\"w-full\" placeholder=\"Describe the ticket in detail\" />\n </FieldsetSection>\n\n <!-- Attachments (Jira-style inline) - Files will be uploaded after ticket creation -->\n <div class=\"mt-6\">\n <InlineAttachments\n :can-upload=\"true\"\n :can-delete=\"false\"\n @files-queued=\"handleFilesQueued\"\n ref=\"attachmentsRef\"\n />\n </div>\n\n <!-- Staff Options -->\n <FieldsetSection title=\"Staff Options\">\n <zinia.IsInternalField label=\"Internal Staff Task\" />\n <zinia.AssignedToField :select-options=\"form.extraData.enriched?.triageUsers || []\" />\n <!-- Show devLifecycle only for internal tasks -->\n <zinia.DevLifecycleField v-if=\"form.values.is_internal\" />\n </FieldsetSection>\n\n <!-- Credits (only for customer support ticket) -->\n <FieldsetSection v-if=\"!form.values.is_internal\" title=\"Credits (Optional)\">\n <zinia.CreditValueField placeholder=\"0.00\" />\n </FieldsetSection>\n\n <!-- Timeline (Optional) -->\n <FieldsetSection title=\"Timeline (Optional)\">\n <zinia.StartAtField :formatter=\"formatToISODate\" />\n <zinia.TargetAtField :formatter=\"formatToISODate\" />\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\n submitText=\"Create Support Ticket\"\n submittingText=\"Creating Support Ticket...\"\n />\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 { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatToISODate } from '../../../utils/convertToLocalDateTime';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport {\n SUPPORT_TICKET_PRIORITY_TO_NUMBER,\n type StaffSupportTicketCreateDto,\n type StaffSupportTicketReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport InlineAttachments from '../shared/InlineAttachments.vue';\nimport { adminSupportTicketCreateSchemaWithMetadata } from './StaffSupportTicketMetadata';\nimport { staffSupportPaths } from './staffSupportTicketRoutes';\n\nconst router = useRouter();\nconst attachmentsRef = ref<InstanceType<typeof InlineAttachments> | null>(null);\n\nconst loadAssigneeOptions = async () => {\n try {\n const users = await executeWithAuth(\n (api) => api.users.getTriageUsers(),\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n return {\n triageUsers: [\n { value: '', label: 'Auto-assign (round-robin)' },\n ...(users ?? []).map((u) => ({ value: u.id, label: u.email })),\n ],\n };\n } catch (error) {\n console.error('Error fetching triage users', error);\n return { triageUsers: [{ value: '', label: 'Auto-assign (round-robin)' }] };\n }\n};\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(adminSupportTicketCreateSchemaWithMetadata, {\n storeName: `create-admin-support-ticket`,\n persistToLocalStorage: true,\n renderStyle: 'daisy_ui',\n dataLoaders: {\n enriched: loadAssigneeOptions,\n },\n fetchData: async () => {\n // Return default values for new support ticket (all required fields)\n return {\n title: '',\n type: 'IMPROVEMENT' as const,\n priority: SUPPORT_TICKET_PRIORITY_TO_NUMBER.MEDIUM,\n is_internal: false, // Default to customer support ticket\n assigned_to: null as string | null, // Empty = round-robin auto-assign\n };\n },\n});\n\n// Setup mutation for creating support ticket with staff fields\nconst { mutate: createSupportTicket } = useMutation(\n (api, input: StaffSupportTicketCreateDto) => api.supportTickets.staffCreateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst beforeValidate = () => {\n // Clear credit_value if internal task (can't have credits)\n if (form.values.is_internal) {\n form.values.credit_value = null;\n\n // Set dev_lifecycle to BACKLOG for internal tasks if not valid\n const validDevLifecycleValues = [\n 'BACKLOG',\n 'CODE_REVIEW',\n 'DEVELOPMENT',\n 'PLANNING',\n 'PO_APPROVAL',\n 'STAGING',\n 'TESTING',\n 'VERIFICATION',\n ];\n if (\n !form.values.dev_lifecycle ||\n !validDevLifecycleValues.includes(form.values.dev_lifecycle)\n ) {\n form.values.dev_lifecycle = 'BACKLOG';\n }\n }\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: StaffSupportTicketCreateDto) => {\n const createdSupportTicket = await createSupportTicket(formData);\n if (!createdSupportTicket) {\n throw new Error('Failed to create support ticket');\n }\n return createdSupportTicket;\n};\n\n// Handle files queued during form filling\nconst handleFilesQueued = (_files: File[]) => {\n // Files are queued and will be uploaded after ticket creation\n};\n\n// Handle successful submission\nconst handleSuccess = async (createdSupportTicket: StaffSupportTicketReadDto) => {\n // Upload any queued files after ticket creation\n if (attachmentsRef.value) {\n try {\n await attachmentsRef.value.uploadQueuedFiles(createdSupportTicket.id);\n } catch (error) {\n console.error('Failed to upload attachments:', error);\n // Don't block success - attachments can be added later\n toast.warning(\n 'Ticket created, but some attachments failed to upload. You can add them later.',\n );\n }\n }\n\n clearSavedFormState();\n await router.push({ name: staffSupportPaths.staff_create_success.name });\n toast.success(`Support Ticket \"${createdSupportTicket.title}\" 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":"StaffCreateSupportTicketForm-C-UWBdA6.js","names":[],"sources":["../src/slices/support_ticket/staff/StaffSupportTicketMetadata.ts","../src/slices/support_ticket/staff/StaffCreateSupportTicketForm.vue"],"sourcesContent":["import {\n StaffSupportTicketCreateSchema,\n StaffSupportTicketUpdateSchema,\n SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { inject } from 'vue';\n\n// Create schema (no ID)\nexport const adminSupportTicketCreateSchemaWithMetadata = withMetadata(\n StaffSupportTicketCreateSchema,\n 'adminSupportTicketCreateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n credit_value: {\n inputType: 'currency',\n step: 0.01,\n placeholder: 'Enter credit value',\n },\n start_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n target_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n completed_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n priority: {\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n assigned_to: {\n label: 'Assignee',\n inputType: 'select',\n placeholder: 'Auto-assign (round-robin)',\n },\n },\n);\n\n// Update schema (with ID)\nexport const adminSupportTicketUpdateSchemaWithMetadata = withMetadata(\n StaffSupportTicketUpdateSchema,\n 'adminSupportTicketUpdateSchema',\n {\n description: {\n inputType: 'textarea',\n placeholder: 'Enter description',\n },\n credit_value: {\n inputType: 'currency',\n step: 0.01,\n placeholder: 'Enter credit value',\n },\n start_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n target_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n completed_at: {\n inputType: 'date',\n placeholder: 'Enter date',\n },\n priority: {\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n },\n);\n\nexport type AdminSupportTicketCreateFormDto = UseFormTyped<\n typeof StaffSupportTicketCreateSchema\n>;\nexport type AdminSupportTicketUpdateFormDto = UseFormTyped<\n typeof StaffSupportTicketUpdateSchema\n>;\n\nexport const injectAdminSupportTicketCreateForm = () =>\n inject<AdminSupportTicketCreateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectAdminSupportTicketUpdateForm = () =>\n inject<AdminSupportTicketUpdateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectAdminSupportTicketZinia = () =>\n inject<AdminSupportTicketCreateFormDto['zinia'] | AdminSupportTicketUpdateFormDto['zinia']>(\n ZINIA_FIELDS_KEY,\n );\n","<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 @before-validate=\"beforeValidate\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Create Support Ticket\"\n subtitle=\"Create new ticket or internal task\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Support Ticket Details\">\n <zinia.TitleField placeholder=\"Enter ticket title\" />\n <zinia.TypeField />\n <zinia.PriorityField />\n </FieldsetSection>\n <FieldsetSection title=\"Description\">\n <zinia.DescriptionField class=\"w-full\" placeholder=\"Describe the ticket in detail\" />\n </FieldsetSection>\n\n <!-- Attachments (Jira-style inline) - Files will be uploaded after ticket creation -->\n <div class=\"mt-6\">\n <InlineAttachments\n :can-upload=\"true\"\n :can-delete=\"false\"\n @files-queued=\"handleFilesQueued\"\n ref=\"attachmentsRef\"\n />\n </div>\n\n <!-- Staff Options -->\n <FieldsetSection title=\"Staff Options\">\n <zinia.IsInternalField label=\"Internal Staff Task\" />\n <zinia.AssignedToField :select-options=\"form.extraData.enriched?.triageUsers || []\" />\n <!-- Show devLifecycle only for internal tasks -->\n <zinia.DevLifecycleField v-if=\"form.values.is_internal\" />\n </FieldsetSection>\n\n <!-- Credits (only for customer support ticket) -->\n <FieldsetSection v-if=\"!form.values.is_internal\" title=\"Credits (Optional)\">\n <zinia.CreditValueField placeholder=\"0.00\" />\n </FieldsetSection>\n\n <!-- Timeline (Optional) -->\n <FieldsetSection title=\"Timeline (Optional)\">\n <zinia.StartAtField :formatter=\"formatToISODate\" />\n <zinia.TargetAtField :formatter=\"formatToISODate\" />\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\n submitText=\"Create Support Ticket\"\n submittingText=\"Creating Support Ticket...\"\n />\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 { executeWithAuth } from '../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../utils/EnhancedRefreshTokenHandler';\nimport { formatToISODate } from '../../../utils/convertToLocalDateTime';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport {\n SUPPORT_TICKET_PRIORITY_TO_NUMBER,\n type StaffSupportTicketCreateDto,\n type StaffSupportTicketReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport InlineAttachments from '../shared/InlineAttachments.vue';\nimport { adminSupportTicketCreateSchemaWithMetadata } from './StaffSupportTicketMetadata';\nimport { staffSupportPaths } from './staffSupportTicketRoutes';\n\nconst router = useRouter();\nconst attachmentsRef = ref<InstanceType<typeof InlineAttachments> | null>(null);\n\nconst loadAssigneeOptions = async () => {\n try {\n const users = await executeWithAuth(\n (api) => api.users.getTriageUsers(),\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n return {\n triageUsers: [\n { value: '', label: 'Auto-assign (round-robin)' },\n ...(users ?? []).map((u) => ({ value: u.id, label: u.email })),\n ],\n };\n } catch (error) {\n console.error('Error fetching triage users', error);\n return { triageUsers: [{ value: '', label: 'Auto-assign (round-robin)' }] };\n }\n};\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(adminSupportTicketCreateSchemaWithMetadata, {\n storeName: `create-admin-support-ticket`,\n persistToLocalStorage: true,\n renderStyle: 'daisy_ui',\n dataLoaders: {\n enriched: loadAssigneeOptions,\n },\n fetchData: async () => {\n // Return default values for new support ticket (all required fields)\n return {\n title: '',\n type: 'IMPROVEMENT' as const,\n priority: SUPPORT_TICKET_PRIORITY_TO_NUMBER.MEDIUM,\n is_internal: false, // Default to customer support ticket\n assigned_to: null as string | null, // Empty = round-robin auto-assign\n };\n },\n});\n\n// Setup mutation for creating support ticket with staff fields\nconst { mutate: createSupportTicket } = useMutation(\n (api, input: StaffSupportTicketCreateDto) => api.supportTickets.staffCreateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst beforeValidate = () => {\n // Clear credit_value if internal task (can't have credits)\n if (form.values.is_internal) {\n form.values.credit_value = null;\n\n // Set dev_lifecycle to BACKLOG for internal tasks if not valid\n const validDevLifecycleValues = [\n 'BACKLOG',\n 'CODE_REVIEW',\n 'DEVELOPMENT',\n 'PLANNING',\n 'PO_APPROVAL',\n 'STAGING',\n 'TESTING',\n 'VERIFICATION',\n ];\n if (\n !form.values.dev_lifecycle ||\n !validDevLifecycleValues.includes(form.values.dev_lifecycle)\n ) {\n form.values.dev_lifecycle = 'BACKLOG';\n }\n }\n return true;\n};\n\n// Handle form submission\nconst handleSubmit = async (formData: StaffSupportTicketCreateDto) => {\n const createdSupportTicket = await createSupportTicket(formData);\n if (!createdSupportTicket) {\n throw new Error('Failed to create support ticket');\n }\n return createdSupportTicket;\n};\n\n// Handle files queued during form filling\nconst handleFilesQueued = (_files: File[]) => {\n // Files are queued and will be uploaded after ticket creation\n};\n\n// Handle successful submission\nconst handleSuccess = async (createdSupportTicket: StaffSupportTicketReadDto) => {\n // Upload any queued files after ticket creation\n if (attachmentsRef.value) {\n try {\n await attachmentsRef.value.uploadQueuedFiles(createdSupportTicket.id);\n } catch (error) {\n console.error('Failed to upload attachments:', error);\n // Don't block success - attachments can be added later\n toast.warning(\n 'Ticket created, but some attachments failed to upload. You can add them later.',\n );\n }\n }\n\n clearSavedFormState();\n await router.push({ name: staffSupportPaths.staff_create_success.name });\n toast.success(`Support Ticket \"${createdSupportTicket.title}\" 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":";;;;;;;;;;;;;;AAcA,MAAa,6CAA6C,aACxD,gCACA,kCACA;CACE,aAAa;EACX,WAAW;EACX,aAAa;EACd;CACD,cAAc;EACZ,WAAW;EACX,MAAM;EACN,aAAa;EACd;CACD,UAAU;EACR,WAAW;EACX,aAAa;EACd;CACD,WAAW;EACT,WAAW;EACX,aAAa;EACd;CACD,cAAc;EACZ,WAAW;EACX,aAAa;EACd;CACD,UAAU;EACR,WAAW;EACX,cAAc;EACd,WAAW;EACZ;CACD,aAAa;EACX,OAAO;EACP,WAAW;EACX,aAAa;EACd;CACF,CACF;AAGD,MAAa,6CAA6C,aACxD,gCACA,kCACA;CACE,aAAa;EACX,WAAW;EACX,aAAa;EACd;CACD,cAAc;EACZ,WAAW;EACX,MAAM;EACN,aAAa;EACd;CACD,UAAU;EACR,WAAW;EACX,aAAa;EACd;CACD,WAAW;EACT,WAAW;EACX,aAAa;EACd;CACD,cAAc;EACZ,WAAW;EACX,aAAa;EACd;CACD,UAAU;EACR,WAAW;EACX,cAAc;EACd,WAAW;EACZ;CACF,CACF;;;;;;;;;;;;;;;;;;;;;;ECqBD,MAAM,SAAS,WAAW;EAC1B,MAAM,iBAAiB,IAAmD,KAAK;EAE/E,MAAM,sBAAsB,YAAY;AACtC,OAAI;AAKF,WAAO,EACL,aAAa,CACX;KAAE,OAAO;KAAI,OAAO;KAA6B,EACjD,IAPU,MAAM,iBACjB,QAAQ,IAAI,MAAM,gBAAgB,EACnC,EAAE,qBAAqB,wBAAwB,EAAE,CAClD,IAIgB,EAAE,EAAE,KAAK,OAAO;KAAE,OAAO,EAAE;KAAI,OAAO,EAAE;KAAO,EAAE,CAC/D,EACF;YACM,OAAO;AACd,YAAQ,MAAM,+BAA+B,MAAM;AACnD,WAAO,EAAE,aAAa,CAAC;KAAE,OAAO;KAAI,OAAO;KAA6B,CAAC,EAAE;;;EAI/E,MAAM,EACJ,MACA,OACA,WACA,mBACA,kBACA,wBACA,wBACE,QAAQ,4CAA4C;GACtD,WAAW;GACX,uBAAuB;GACvB,aAAa;GACb,aAAa,EACX,UAAU,qBACX;GACD,WAAW,YAAY;AAErB,WAAO;KACL,OAAO;KACP,MAAM;KACN,UAAU,kCAAkC;KAC5C,aAAa;KACb,aAAa;KACd;;GAEJ,CAAC;EAGF,MAAM,EAAE,QAAQ,wBAAwB,aACrC,KAAK,UAAuC,IAAI,eAAe,kBAAkB,MAAM,EACxF,EAAE,YAAY,sBAAsB,CACrC;EAED,MAAM,uBAAuB;AAE3B,OAAI,KAAK,OAAO,aAAa;AAC3B,SAAK,OAAO,eAAe;AAa3B,QACE,CAAC,KAAK,OAAO,iBACb,CAZ8B;KAC9B;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD,CAG0B,SAAS,KAAK,OAAO,cAAa,CAE3D,MAAK,OAAO,gBAAgB;;AAGhC,UAAO;;EAIT,MAAM,eAAe,OAAO,aAA0C;GACpE,MAAM,uBAAuB,MAAM,oBAAoB,SAAS;AAChE,OAAI,CAAC,qBACH,OAAM,IAAI,MAAM,kCAAkC;AAEpD,UAAO;;EAIT,MAAM,qBAAqB,WAAmB;EAK9C,MAAM,gBAAgB,OAAO,yBAAoD;AAE/E,OAAI,eAAe,MACjB,KAAI;AACF,UAAM,eAAe,MAAM,kBAAkB,qBAAqB,GAAG;YAC9D,OAAO;AACd,YAAQ,MAAM,iCAAiC,MAAM;AAErD,UAAM,QACJ,iFACD;;AAIL,wBAAqB;AACrB,SAAM,OAAO,KAAK,EAAE,MAAM,kBAAkB,qBAAqB,MAAM,CAAC;AACxE,SAAM,QAAQ,mBAAmB,qBAAqB,MAAM,yBAAyB;;EAIvF,MAAM,eAAe,UAA2B;AAC9C,QAAK,eAAe,iBAAiB,QAAQ,MAAM,UAAU,4BAA4B;;;UA5N9E,MAAA,KAAI,CAAC,aAAA,WAAA,EAAhB,mBAGM,OAHN,YAGM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAFJ,mBAAsD,OAAA,EAAjD,OAAM,sCAAoC,EAAA,MAAA,GAAA,EAC/C,mBAAsC,KAAA,EAAnC,OAAM,gBAAc,EAAC,cAAU,GAAA,CAAA,EAAA,CAAA,IAEpB,MAAA,KAAI,CAAC,aAAA,WAAA,EAArB,mBAEM,OAFN,YAEM,CADJ,mBAAgD,KAAhD,YAAgD,gBAArB,MAAA,KAAI,CAAC,UAAS,EAAA,EAAA,CAAA,CAAA,KAAA,WAAA,EAE3C,YA2EY,MAAA,UAAA,EAAA;;IAzET,kBAAiB;IACjB,gBAAe;IACf,WAAS;IACT,SAAO;IACR,OAAM;IACN,UAAS;;2BAEiB;KAA1B,mBAAA,sBAA0B;KAC1B,YAIkB,yBAAA,EAJD,OAAM,0BAAwB,EAAA;6BACQ;OAArD,YAAqD,MAAA,MAAA,CAAA,YAAA,EAAnC,aAAY,sBAAoB,CAAA;OAClD,YAAmB,MAAA,MAAA,CAAA,UAAA;OACnB,YAAuB,MAAA,MAAA,CAAA,cAAA;;;;KAEzB,YAEkB,yBAAA,EAFD,OAAM,eAAa,EAAA;6BACmD,CAArF,YAAqF,MAAA,MAAA,CAAA,kBAAA;OAA7D,OAAM;OAAS,aAAY;;;;KAGrD,mBAAA,mFAAuF;KACvF,mBAOM,OAPN,YAOM,CANJ,YAKE,2BAAA;MAJC,cAAY;MACZ,cAAY;MACZ,eAAc;eACX;MAAJ,KAAI;;KAIR,mBAAA,kBAAsB;KACtB,YAKkB,yBAAA,EALD,OAAM,iBAAe,EAAA;6BACiB;OAArD,YAAqD,MAAA,MAAA,CAAA,iBAAA,EAA9B,OAAM,uBAAqB,CAAA;OAClD,YAAsF,MAAA,MAAA,CAAA,iBAAA,EAA9D,kBAAgB,MAAA,KAAI,CAAC,UAAU,UAAU,eAAW,EAAA,EAAA,EAAA,MAAA,GAAA,CAAA,iBAAA,CAAA;OAC5E,mBAAA,8CAAkD;OACnB,MAAA,KAAI,CAAC,OAAO,eAAA,WAAA,EAA3C,YAA0D,MAAA,MAAA,CAAA,mBAAA,EAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;;;;KAG5D,mBAAA,+CAAmD;MAC3B,MAAA,KAAI,CAAC,OAAO,eAAA,WAAA,EAApC,YAEkB,yBAAA;;MAF+B,OAAM;;6BACR,CAA7C,YAA6C,MAAA,MAAA,CAAA,kBAAA,EAArB,aAAY,QAAM,CAAA,CAAA,CAAA;;;KAG5C,mBAAA,wBAA4B;KAC5B,YAGkB,yBAAA,EAHD,OAAM,uBAAqB,EAAA;6BACS,CAAnD,YAAmD,MAAA,MAAA,CAAA,cAAA,EAA9B,WAAW,MAAA,gBAAe,EAAA,EAAA,MAAA,GAAA,CAAA,YAAA,CAAA,EAC/C,YAAoD,MAAA,MAAA,CAAA,eAAA,EAA9B,WAAW,MAAA,gBAAe,EAAA,EAAA,MAAA,GAAA,CAAA,YAAA,CAAA,CAAA,CAAA;;;KAGlD,mBAAA,yBAA6B;KAClB,MAAA,KAAI,CAAC,eAAA,WAAA,EAAhB,mBAeM,OAfN,YAeM,CAAA,OAAA,OAAA,OAAA,KAdJ,mBAYM,OAAA;MAXJ,OAAM;MACN,OAAM;MACN,MAAK;MACL,SAAQ;SAER,mBAKE,QAAA;MAJA,kBAAe;MACf,mBAAgB;MAChB,gBAAa;MACb,GAAE;gBAGN,mBAAmC,QAAA,MAAA,gBAA1B,MAAA,KAAI,CAAC,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;KAG3B,mBAAA,kBAAsB;KACtB,mBAKM,OALN,YAKM,CAJJ,YAGE,MAAA,kBAAA,EAAA;MAFA,YAAW;MACX,gBAAe;;KAGnB,YAAmE,MAAA,uBAAA,EAAA,EAA3C,OAAM,oCAAkC,CAAA;KAChE,YAAoB,MAAA,iBAAA,CAAA"}