@dragonmastery/dragoncore-vue 0.0.30 → 0.0.32
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.
- package/dist/{ChangePasswordPage-Dy8lFUcI.js → ChangePasswordPage-CR91NZP4.js} +2 -2
- package/dist/{ChangePasswordPage-Dy8lFUcI.js.map → ChangePasswordPage-CR91NZP4.js.map} +1 -1
- package/dist/ChangePasswordPage-qLd6YZVO.js +7 -0
- package/dist/ConsentRequired-DtUwfpk0.js +274 -0
- package/dist/ConsentRequired-DtUwfpk0.js.map +1 -0
- package/dist/CreateTeamForm-BK8PJeXz.js +12 -0
- package/dist/{CreateTeamForm-B7MsOsiV.js → CreateTeamForm-BQewI0Gn.js} +3 -3
- package/dist/{CreateTeamForm-B7MsOsiV.js.map → CreateTeamForm-BQewI0Gn.js.map} +1 -1
- package/dist/{CreateTeamMemberForm-DeUyXnVa.js → CreateTeamMemberForm-B3jxlAsC.js} +4 -4
- package/dist/{CreateTeamMemberForm-DeUyXnVa.js.map → CreateTeamMemberForm-B3jxlAsC.js.map} +1 -1
- package/dist/CreateTeamMemberForm-BYsZNxTq.js +12 -0
- package/dist/{CreateUserPage-1WiLNGr_.js → CreateUserPage-BcCIat_l.js} +2 -2
- package/dist/{CreateUserPage-1WiLNGr_.js.map → CreateUserPage-BcCIat_l.js.map} +1 -1
- package/dist/CreateUserPage-D0oMJnGd.js +7 -0
- package/dist/CreditBalanceDashboard-C2QnVfjU.js +13 -0
- package/dist/{CreditBalanceDashboard-CoIEyZWh.js → CreditBalanceDashboard-CRHrhlSZ.js} +2 -2
- package/dist/{CreditBalanceDashboard-CoIEyZWh.js.map → CreditBalanceDashboard-CRHrhlSZ.js.map} +1 -1
- package/dist/{CreditManagement-CCyU_yja.js → CreditManagement-7xiygPYj.js} +3 -3
- package/dist/{CreditManagement-CCyU_yja.js.map → CreditManagement-7xiygPYj.js.map} +1 -1
- package/dist/CreditManagement-CAaf_rVj.js +13 -0
- package/dist/{CreditTransactionHistory-UPg9uDNy.js → CreditTransactionHistory-CP7ufh7Z.js} +5 -5
- package/dist/{CreditTransactionHistory-UPg9uDNy.js.map → CreditTransactionHistory-CP7ufh7Z.js.map} +1 -1
- package/dist/CustomerCreateSupportTicketForm-C3DSzhJR.js +14 -0
- package/dist/{CustomerCreateSupportTicketForm-DFH1JtlA.js → CustomerCreateSupportTicketForm-Cd3ijzWy.js} +4 -4
- package/dist/{CustomerCreateSupportTicketForm-DFH1JtlA.js.map → CustomerCreateSupportTicketForm-Cd3ijzWy.js.map} +1 -1
- package/dist/{CustomerSupportTicketDetailPage-DAwiE2t6.js → CustomerSupportTicketDetailPage-DwpkxpYV.js} +8 -8
- package/dist/{CustomerSupportTicketDetailPage-DAwiE2t6.js.map → CustomerSupportTicketDetailPage-DwpkxpYV.js.map} +1 -1
- package/dist/CustomerSupportTicketList-BrTX8SUV.js +64 -0
- package/dist/CustomerSupportTicketParent-C0uMeN09.js +8 -0
- package/dist/{CustomerSupportTicketParent-rl4Ym8oa.js → CustomerSupportTicketParent-D9FuZjPz.js} +2 -2
- package/dist/{CustomerSupportTicketParent-rl4Ym8oa.js.map → CustomerSupportTicketParent-D9FuZjPz.js.map} +1 -1
- package/dist/CustomerSupportTicketSuccess-BLSMAjQN.js +12 -0
- package/dist/{CustomerSupportTicketSuccess-BEhFZgtn.js → CustomerSupportTicketSuccess-k3DX9NhV.js} +2 -2
- package/dist/{CustomerSupportTicketSuccess-BEhFZgtn.js.map → CustomerSupportTicketSuccess-k3DX9NhV.js.map} +1 -1
- package/dist/{DefaultReferralTeamPage-D3UIrIZK.js → DefaultReferralTeamPage-fS1SlVow.js} +6 -6
- package/dist/{DefaultReferralTeamPage-D3UIrIZK.js.map → DefaultReferralTeamPage-fS1SlVow.js.map} +1 -1
- package/dist/{EditTeamForm-C1_-p3lZ.js → EditTeamForm-CETmPEZ7.js} +3 -3
- package/dist/{EditTeamForm-C1_-p3lZ.js.map → EditTeamForm-CETmPEZ7.js.map} +1 -1
- package/dist/EditTeamForm-DiZXp6vh.js +12 -0
- package/dist/EditTeamMemberForm-BKbWq88S.js +9 -0
- package/dist/{EditTeamMemberForm-D9cofrUM.js → EditTeamMemberForm-D6vf9hp-.js} +2 -2
- package/dist/{EditTeamMemberForm-D9cofrUM.js.map → EditTeamMemberForm-D6vf9hp-.js.map} +1 -1
- package/dist/EditUserPage-DCdj6EYd.js +8 -0
- package/dist/{EditUserPage-CwsO8naT.js → EditUserPage-Dy61CCle.js} +3 -3
- package/dist/{EditUserPage-CwsO8naT.js.map → EditUserPage-Dy61CCle.js.map} +1 -1
- package/dist/{EnhancedRefreshTokenHandler-C6tZCcfX.js → EnhancedRefreshTokenHandler-s8wUXtB5.js} +2 -2
- package/dist/{EnhancedRefreshTokenHandler-C6tZCcfX.js.map → EnhancedRefreshTokenHandler-s8wUXtB5.js.map} +1 -1
- package/dist/{ForgotPassword-Dd-E3_o1.js → ForgotPassword-BykH9B9R.js} +3 -3
- package/dist/{ForgotPassword-Dd-E3_o1.js.map → ForgotPassword-BykH9B9R.js.map} +1 -1
- package/dist/ForgotPassword-Xb1yVZ6C.js +8 -0
- package/dist/{InlineAttachments-DAn_QknY.js → InlineAttachments-Ywf9r3jd.js} +4 -4
- package/dist/{InlineAttachments-DAn_QknY.js.map → InlineAttachments-Ywf9r3jd.js.map} +1 -1
- package/dist/LoginForm-B5wYdKhY.js +8 -0
- package/dist/{LoginForm-CSMHsZrq.js → LoginForm-CjF4NSgM.js} +4 -4
- package/dist/{LoginForm-CSMHsZrq.js.map → LoginForm-CjF4NSgM.js.map} +1 -1
- package/dist/{Logout-Bdktl4NZ.js → Logout-DmpC8Rwh.js} +4 -4
- package/dist/{Logout-Bdktl4NZ.js.map → Logout-DmpC8Rwh.js.map} +1 -1
- package/dist/Logout-qyH2t-1a.js +8 -0
- package/dist/{MfaSetup-Bjc3v0hs.js → MfaSetup-DCLKIMaS.js} +4 -4
- package/dist/{MfaSetup-Bjc3v0hs.js.map → MfaSetup-DCLKIMaS.js.map} +1 -1
- package/dist/MfaSetup-DMLXL9fk.js +9 -0
- package/dist/MfaVerify-C4xGQZlQ.js +9 -0
- package/dist/{MfaVerify-uJlPz8xg.js → MfaVerify-Dm2Yc0Da.js} +5 -5
- package/dist/{MfaVerify-uJlPz8xg.js.map → MfaVerify-Dm2Yc0Da.js.map} +1 -1
- package/dist/{ResetPassword-CyizBRob.js → ResetPassword-iVcY7eBY.js} +3 -3
- package/dist/{ResetPassword-CyizBRob.js.map → ResetPassword-iVcY7eBY.js.map} +1 -1
- package/dist/ResetPassword-ulR2HviU.js +8 -0
- package/dist/{SavedFiltersPage-Cz01ZeHx.js → SavedFiltersPage-CTLpYU2c.js} +51 -51
- package/dist/{SavedFiltersPage-Cz01ZeHx.js.map → SavedFiltersPage-CTLpYU2c.js.map} +1 -1
- package/dist/Signup-D4xILUym.js +10 -0
- package/dist/{Signup-CkhRQErA.js → Signup-D6vnyS4w.js} +47 -55
- package/dist/Signup-D6vnyS4w.js.map +1 -0
- package/dist/{SignupRequirementsPage-33z--rhH.js → SignupRequirementsPage-BnOkXd7w.js} +6 -6
- package/dist/{SignupRequirementsPage-33z--rhH.js.map → SignupRequirementsPage-BnOkXd7w.js.map} +1 -1
- package/dist/StaffCreateSupportTicketForm-BnpxlQaG.js +14 -0
- package/dist/{StaffCreateSupportTicketForm-BtR-Aowv.js → StaffCreateSupportTicketForm-gPZizMKW.js} +6 -6
- package/dist/{StaffCreateSupportTicketForm-BtR-Aowv.js.map → StaffCreateSupportTicketForm-gPZizMKW.js.map} +1 -1
- package/dist/{StaffSupportTicketDetailPage-LqnNfU34.js → StaffSupportTicketDetailPage-DUqLTHVT.js} +8 -8
- package/dist/{StaffSupportTicketDetailPage-LqnNfU34.js.map → StaffSupportTicketDetailPage-DUqLTHVT.js.map} +1 -1
- package/dist/StaffSupportTicketList-Qp0vQw8X.js +64 -0
- package/dist/{StaffSupportTicketParent-DPvdLUii.js → StaffSupportTicketParent-CZllER18.js} +2 -2
- package/dist/{StaffSupportTicketParent-DPvdLUii.js.map → StaffSupportTicketParent-CZllER18.js.map} +1 -1
- package/dist/StaffSupportTicketParent-D4FKQAmp.js +8 -0
- package/dist/StaffSupportTicketSuccess-BvwrpoAb.js +12 -0
- package/dist/{StaffSupportTicketSuccess-B3N-RMoT.js → StaffSupportTicketSuccess-C9vqsC51.js} +2 -2
- package/dist/{StaffSupportTicketSuccess-B3N-RMoT.js.map → StaffSupportTicketSuccess-C9vqsC51.js.map} +1 -1
- package/dist/{SupportStaffPage-geoITTqt.js → SupportStaffPage--vinFIlV.js} +6 -6
- package/dist/{SupportStaffPage-geoITTqt.js.map → SupportStaffPage--vinFIlV.js.map} +1 -1
- package/dist/{SupportTicketMaintenancePage-CEKi8xQB.js → SupportTicketMaintenancePage-C-BWD49g.js} +5 -5
- package/dist/{SupportTicketMaintenancePage-CEKi8xQB.js.map → SupportTicketMaintenancePage-C-BWD49g.js.map} +1 -1
- package/dist/TeamAttachmentsTab-CnAvlIbn.js +64 -0
- package/dist/{TeamHistoryTab-CxzA4u_G.js → TeamHistoryTab-5kNQ_XAq.js} +3 -3
- package/dist/{TeamHistoryTab-CxzA4u_G.js.map → TeamHistoryTab-5kNQ_XAq.js.map} +1 -1
- package/dist/TeamHistoryTab-CBWeRKXM.js +6 -0
- package/dist/{TeamList-_SsqJicG.js → TeamList-C0Mbkbja.js} +4 -4
- package/dist/{TeamList-_SsqJicG.js.map → TeamList-C0Mbkbja.js.map} +1 -1
- package/dist/TeamList-Fb6EfybL.js +8 -0
- package/dist/{TeamMemberList-BYUANoBg.js → TeamMemberList-DyfXcR6F.js} +4 -4
- package/dist/{TeamMemberList-BYUANoBg.js.map → TeamMemberList-DyfXcR6F.js.map} +1 -1
- package/dist/TeamMemberList-X2hzYZFT.js +7 -0
- package/dist/{TeamMemberParent-DmYcHU3n.js → TeamMemberParent-2zISixbT.js} +3 -3
- package/dist/{TeamMemberParent-DmYcHU3n.js.map → TeamMemberParent-2zISixbT.js.map} +1 -1
- package/dist/TeamMemberParent-DKxE1ziP.js +10 -0
- package/dist/{TeamNotesTab-Cego-QT3.js → TeamNotesTab-BREl3Vr0.js} +5 -5
- package/dist/{TeamNotesTab-Cego-QT3.js.map → TeamNotesTab-BREl3Vr0.js.map} +1 -1
- package/dist/TeamNotesTab-DxMN3WZo.js +8 -0
- package/dist/{TeamParent-BUnqP-dr.js → TeamParent-COSOJ-ZZ.js} +3 -3
- package/dist/{TeamParent-BUnqP-dr.js.map → TeamParent-COSOJ-ZZ.js.map} +1 -1
- package/dist/TeamParent-XgBD3twV.js +11 -0
- package/dist/{TimelineNoteInput-BBZv3X4p.js → TimelineNoteInput-CrivEMUP.js} +2 -2
- package/dist/{TimelineNoteInput-BBZv3X4p.js.map → TimelineNoteInput-CrivEMUP.js.map} +1 -1
- package/dist/{UserListPage-CDMSZpXK.js → UserListPage-CCl0K7Gk.js} +3 -3
- package/dist/{UserListPage-CDMSZpXK.js.map → UserListPage-CCl0K7Gk.js.map} +1 -1
- package/dist/UserListPage-CYkvaHwL.js +5 -0
- package/dist/UserProfilePage-BMmz7SGl.js +8 -0
- package/dist/{UserProfilePage-BYitd7QV.js → UserProfilePage-D7FNmca1.js} +4 -4
- package/dist/{UserProfilePage-BYitd7QV.js.map → UserProfilePage-D7FNmca1.js.map} +1 -1
- package/dist/{VerifyEmail-CWUhRA1o.js → VerifyEmail-KCti4rzf.js} +6 -6
- package/dist/{VerifyEmail-CWUhRA1o.js.map → VerifyEmail-KCti4rzf.js.map} +1 -1
- package/dist/VerifyEmail-Xd31Com7.js +10 -0
- package/dist/ViewTeam-BXSq4M0V.js +8 -0
- package/dist/{ViewTeam-ttqX2In8.js → ViewTeam-DGaNNd8N.js} +2 -2
- package/dist/{ViewTeam-ttqX2In8.js.map → ViewTeam-DGaNNd8N.js.map} +1 -1
- package/dist/{ViewTeamMember-DqWZ3F_h.js → ViewTeamMember-Dsl2GKI1.js} +2 -2
- package/dist/{ViewTeamMember-DqWZ3F_h.js.map → ViewTeamMember-Dsl2GKI1.js.map} +1 -1
- package/dist/ViewTeamMember-bmry5QZ0.js +7 -0
- package/dist/{customerSupportTicketRoutes-C-DKBy5g.js → customerSupportTicketRoutes-BjqjQc9A.js} +8 -8
- package/dist/{customerSupportTicketRoutes-C-DKBy5g.js.map → customerSupportTicketRoutes-BjqjQc9A.js.map} +1 -1
- package/dist/index.d.ts +254 -224
- package/dist/index.js +52 -53
- package/dist/{mfaSchema-C6PatIbY.js → mfaSchema-Ukqzdyck.js} +1 -1
- package/dist/{mfaSchema-C6PatIbY.js.map → mfaSchema-Ukqzdyck.js.map} +1 -1
- package/dist/{saved_filter-C2N9l_a9.js → saved_filter-DXWnU4Zb.js} +5 -5
- package/dist/{saved_filter-C2N9l_a9.js.map → saved_filter-DXWnU4Zb.js.map} +1 -1
- package/dist/{src-C8B9TJiH.js → src-B7oHTH_y.js} +216 -197
- package/dist/src-B7oHTH_y.js.map +1 -0
- package/dist/{staffSupportTicketRoutes-CyMecWpC.js → staffSupportTicketRoutes-CeuduGmG.js} +8 -8
- package/dist/{staffSupportTicketRoutes-CyMecWpC.js.map → staffSupportTicketRoutes-CeuduGmG.js.map} +1 -1
- package/dist/{teamRoutes-CFDsHPkd.js → teamRoutes-A7plQKi0.js} +11 -11
- package/dist/{teamRoutes-CFDsHPkd.js.map → teamRoutes-A7plQKi0.js.map} +1 -1
- package/dist/{team_memberRoutes-BgjY9Kwq.js → team_memberRoutes-mO1f-Y4o.js} +7 -7
- package/dist/{team_memberRoutes-BgjY9Kwq.js.map → team_memberRoutes-mO1f-Y4o.js.map} +1 -1
- package/dist/useAuthFlowNextStep-zlvxflBZ.js +64 -0
- package/dist/useAuthFlowNextStep-zlvxflBZ.js.map +1 -0
- package/dist/{useEmailVerificationChannel-QuMSgzzM.js → useEmailVerificationChannel-DYiMSAES.js} +3 -3
- package/dist/{useEmailVerificationChannel-QuMSgzzM.js.map → useEmailVerificationChannel-DYiMSAES.js.map} +1 -1
- package/dist/{useMutation-BLNuJoYl.js → useMutation-BXSu7_-s.js} +6 -4
- package/dist/useMutation-BXSu7_-s.js.map +1 -0
- package/dist/{useQuery-BzUGEOj0.js → useQuery-DownvLRA.js} +4 -4
- package/dist/{useQuery-BzUGEOj0.js.map → useQuery-DownvLRA.js.map} +1 -1
- package/dist/{useQueryCache-alzaRWEb.js → useQueryCache-CUTrwJWX.js} +2 -2
- package/dist/{useQueryCache-alzaRWEb.js.map → useQueryCache-CUTrwJWX.js.map} +1 -1
- package/dist/{useReturnUrl-B5V3SJf5.js → useReturnUrl-DnezAxBA.js} +2 -10
- package/dist/{useReturnUrl-B5V3SJf5.js.map → useReturnUrl-DnezAxBA.js.map} +1 -1
- package/dist/{useRpcAuth-CJtq1dqM.js → useRpcAuth-BFdprNWb.js} +5 -7
- package/dist/useRpcAuth-BFdprNWb.js.map +1 -0
- package/dist/{userAuthorized-3RiCDXxr.js → userAuthorized-qmzUYDa-.js} +2 -2
- package/dist/{userAuthorized-3RiCDXxr.js.map → userAuthorized-qmzUYDa-.js.map} +1 -1
- package/package.json +2 -2
- package/dist/ChangePasswordPage-D1LGJ02W.js +0 -7
- package/dist/ConsentFlowStep-DsVhXa91.js +0 -157
- package/dist/ConsentFlowStep-DsVhXa91.js.map +0 -1
- package/dist/ConsentRequired-B3eLxJgx.js +0 -114
- package/dist/ConsentRequired-B3eLxJgx.js.map +0 -1
- package/dist/CreateTeamForm-5V_ks5Ie.js +0 -12
- package/dist/CreateTeamMemberForm-CayF2tIJ.js +0 -12
- package/dist/CreateUserPage-DNi45YF4.js +0 -7
- package/dist/CreditBalanceDashboard-D_TsFlTp.js +0 -13
- package/dist/CreditManagement-CdkqQM7F.js +0 -13
- package/dist/CustomerCreateSupportTicketForm-CiTTUqtW.js +0 -14
- package/dist/CustomerSupportTicketList-CKZl8jxx.js +0 -64
- package/dist/CustomerSupportTicketParent-D3Gj4Hel.js +0 -8
- package/dist/CustomerSupportTicketSuccess-BJO2xsQR.js +0 -12
- package/dist/EditTeamForm-Bf4rSgQg.js +0 -12
- package/dist/EditTeamMemberForm-Bh6zVNyJ.js +0 -9
- package/dist/EditUserPage-CQgp-08o.js +0 -8
- package/dist/ExternalLinkIcon-BKVV5Gjm.js +0 -34
- package/dist/ExternalLinkIcon-BKVV5Gjm.js.map +0 -1
- package/dist/ForgotPassword-BhmO5Lfd.js +0 -8
- package/dist/LoginForm-CFADKiln.js +0 -8
- package/dist/Logout-CmKJK14I.js +0 -8
- package/dist/MfaSetup-BtfQXhLn.js +0 -9
- package/dist/MfaVerify-SUfSRf4m.js +0 -9
- package/dist/ResetPassword-Dz2N3pH4.js +0 -8
- package/dist/Signup-CkhRQErA.js.map +0 -1
- package/dist/Signup-cOvXCtJj.js +0 -9
- package/dist/SignupConsentFlow-CKMFsnf5.js +0 -223
- package/dist/SignupConsentFlow-CKMFsnf5.js.map +0 -1
- package/dist/StaffCreateSupportTicketForm-D7ctCaXe.js +0 -14
- package/dist/StaffSupportTicketList-GyzlONKe.js +0 -64
- package/dist/StaffSupportTicketParent-Dyybqx74.js +0 -8
- package/dist/StaffSupportTicketSuccess-DvonYilY.js +0 -12
- package/dist/TeamAttachmentsTab-ChP4DaUP.js +0 -64
- package/dist/TeamHistoryTab-wRpRizDE.js +0 -6
- package/dist/TeamList-cp8Pa2xg.js +0 -8
- package/dist/TeamMemberList-B16SuLwM.js +0 -7
- package/dist/TeamMemberParent-BJl8nBmP.js +0 -10
- package/dist/TeamNotesTab-BQN9niw-.js +0 -8
- package/dist/TeamParent-BseZ6Zoi.js +0 -11
- package/dist/UserListPage-BABli3QG.js +0 -5
- package/dist/UserProfilePage-Dmxp7oqP.js +0 -8
- package/dist/VerifyEmail-CLDngljq.js +0 -10
- package/dist/ViewTeam-rLNxVgS2.js +0 -8
- package/dist/ViewTeamMember-B5U8kZBw.js +0 -7
- package/dist/signupConsentStorage-pWSoHuhO.js +0 -35
- package/dist/signupConsentStorage-pWSoHuhO.js.map +0 -1
- package/dist/src-C8B9TJiH.js.map +0 -1
- package/dist/useMutation-BLNuJoYl.js.map +0 -1
- package/dist/useRpcAuth-CJtq1dqM.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as useMutation } from "./useMutation-
|
|
1
|
+
import { o as useUserSessionStore } from "./useRpcAuth-BFdprNWb.js";
|
|
2
|
+
import { t as useMutation } from "./useMutation-BXSu7_-s.js";
|
|
3
3
|
import { t as AppLink_default } from "./AppLink-FcNGKgvG.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { t as useEmailVerificationChannel } from "./useEmailVerificationChannel-
|
|
4
|
+
import { a as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-DnezAxBA.js";
|
|
5
|
+
import { n as ExternalLinkIcon_default, t as useAuthFlowNextStep } from "./useAuthFlowNextStep-zlvxflBZ.js";
|
|
6
|
+
import { t as useEmailVerificationChannel } from "./useEmailVerificationChannel-DYiMSAES.js";
|
|
7
7
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, openBlock, ref, renderList, toDisplayString, unref, withCtx } from "vue";
|
|
8
8
|
import { jwtDecode } from "jwt-decode";
|
|
9
9
|
import { useRoute, useRouter } from "vue-router";
|
|
@@ -11,6 +11,14 @@ import { toast } from "vue3-toastify";
|
|
|
11
11
|
import { signupInitiateSchema } from "@dragonmastery/dragoncore-shared";
|
|
12
12
|
import { useForm, withMetadata } from "@dragonmastery/zinia-forms-core";
|
|
13
13
|
|
|
14
|
+
//#region src/slices/auth/signupExtensibilityKeys.ts
|
|
15
|
+
/** Injection keys for signup extensibility. Consumer can provide these to supply metadata/headers from their app. */
|
|
16
|
+
const SIGNUP_EXTENSIBILITY_KEYS = {
|
|
17
|
+
getSignupMetadata: Symbol("getSignupMetadata"),
|
|
18
|
+
getSignupHeaders: Symbol("getSignupHeaders")
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
14
22
|
//#region src/slices/auth/utils/isEmailVerificationRequiredError.ts
|
|
15
23
|
/**
|
|
16
24
|
* Detects if an error indicates that email verification is required before login.
|
|
@@ -68,15 +76,15 @@ const _hoisted_5 = {
|
|
|
68
76
|
};
|
|
69
77
|
const _hoisted_6 = { class: "font-medium mb-2" };
|
|
70
78
|
const _hoisted_7 = { class: "list-disc list-inside space-y-1 text-sm text-base-content/80" };
|
|
71
|
-
const _hoisted_8 =
|
|
79
|
+
const _hoisted_8 = ["href"];
|
|
80
|
+
const _hoisted_9 = {
|
|
72
81
|
key: 0,
|
|
73
82
|
class: "mt-2 text-sm text-base-content/70"
|
|
74
83
|
};
|
|
75
|
-
const
|
|
84
|
+
const _hoisted_10 = { class: "text-center mt-2" };
|
|
76
85
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
77
86
|
__name: "Signup",
|
|
78
87
|
setup(__props) {
|
|
79
|
-
const REDIRECTED_TO_CONSENTS = Symbol("redirected-to-consents");
|
|
80
88
|
const { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(signupSchemaWithMetadata, {
|
|
81
89
|
storeName: "signup-form",
|
|
82
90
|
persistToLocalStorage: false,
|
|
@@ -85,11 +93,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
85
93
|
const sessionStore = useUserSessionStore();
|
|
86
94
|
const route = useRoute();
|
|
87
95
|
const router = useRouter();
|
|
88
|
-
const {
|
|
96
|
+
const { getNextStep } = useAuthFlowNextStep();
|
|
89
97
|
const returnUrl = computed(() => route.query.returnUrl);
|
|
90
98
|
const loginLink = computed(() => withReturnUrl("/auth/login", returnUrl.value));
|
|
91
99
|
const awaitingVerification = ref(false);
|
|
92
|
-
const getSignupMetadata = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupMetadata);
|
|
100
|
+
const getSignupMetadata = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupMetadata, () => ({}));
|
|
101
|
+
const getSignupHeaders = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupHeaders, () => ({}));
|
|
93
102
|
const signupConsentBeforeText = inject("signupConsentBeforeText", "By signing up you agree to these terms:");
|
|
94
103
|
const signupConsentAfterText = inject("signupConsentAfterText", "After you click Sign Up, we'll show you each document to review and accept.");
|
|
95
104
|
const legalLinks = computed(() => {
|
|
@@ -108,53 +117,37 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
108
117
|
});
|
|
109
118
|
const { mutate: signupInitiateMutate } = useMutation((api, input) => api.users.signupInitiate(input), {
|
|
110
119
|
skipAuthCheck: true,
|
|
111
|
-
credentials: "include"
|
|
120
|
+
credentials: "include",
|
|
121
|
+
extraHeaders: () => getSignupHeaders?.() ?? {}
|
|
112
122
|
});
|
|
113
123
|
const handleSubmit = async (data) => {
|
|
114
124
|
const metadata = {
|
|
115
125
|
...getSignupMetadata?.() ?? {},
|
|
116
126
|
...data.metadata ?? {}
|
|
117
127
|
};
|
|
118
|
-
const
|
|
128
|
+
const result = await signupInitiateMutate({
|
|
119
129
|
...data,
|
|
120
130
|
metadata: Object.keys(metadata).length > 0 ? metadata : void 0
|
|
121
|
-
};
|
|
122
|
-
const result = await signupInitiateMutate(payload);
|
|
123
|
-
if (!result) throw new Error("Signup failed");
|
|
124
|
-
if (result.created) {
|
|
125
|
-
if (!result.session?.access_token || !result.session?.user_details_token) throw new Error("Failed to get session after signup");
|
|
126
|
-
return {
|
|
127
|
-
access_token: result.session.access_token,
|
|
128
|
-
user_details_token: result.session.user_details_token
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
setSignupConsentFlowData({
|
|
132
|
-
token: result.signup_consent_token,
|
|
133
|
-
consents: result.consents,
|
|
134
|
-
metadata: payload.metadata
|
|
135
131
|
});
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
132
|
+
if (!result) throw new Error("Signup failed");
|
|
133
|
+
if (!result.session?.access_token || !result.session?.user_details_token) throw new Error("Failed to get session after signup");
|
|
134
|
+
return {
|
|
135
|
+
access_token: result.session.access_token,
|
|
136
|
+
user_details_token: result.session.user_details_token
|
|
137
|
+
};
|
|
140
138
|
};
|
|
141
139
|
const handleSuccess = async (data) => {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
sessionStore.setSession(payload.user_details_token);
|
|
145
|
-
sessionStore.setAccessToken(payload.access_token);
|
|
140
|
+
sessionStore.setSession(data.user_details_token);
|
|
141
|
+
sessionStore.setAccessToken(data.access_token);
|
|
146
142
|
form.reset();
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
})() : defaultRedirect;
|
|
143
|
+
let redirectTo;
|
|
144
|
+
try {
|
|
145
|
+
const user = jwtDecode(data.user_details_token).details?.user;
|
|
146
|
+
redirectTo = getNextStep(user);
|
|
147
|
+
} catch {
|
|
148
|
+
redirectTo = getValidReturnUrl(route, "/");
|
|
149
|
+
}
|
|
155
150
|
await router.push(redirectTo);
|
|
156
|
-
const wentToVerify = typeof redirectTo === "string" && redirectTo.startsWith("/auth/verify-email");
|
|
157
|
-
toast.success(!wentToVerify ? "Registration successful! You are now logged in." : "Registration successful! Please check your email to verify your account.");
|
|
158
151
|
};
|
|
159
152
|
const handleError = (error) => {
|
|
160
153
|
if (isEmailVerificationRequiredError(error)) return;
|
|
@@ -179,21 +172,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
179
172
|
showConsentSection.value ? (openBlock(), createElementBlock("div", _hoisted_5, [
|
|
180
173
|
createElementVNode("p", _hoisted_6, toDisplayString(unref(signupConsentBeforeText)), 1),
|
|
181
174
|
createElementVNode("ul", _hoisted_7, [(openBlock(true), createElementBlock(Fragment, null, renderList(legalLinks.value, (link) => {
|
|
182
|
-
return openBlock(), createElementBlock("li", { key: link.path }, [
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}, 1032, ["to"])]);
|
|
175
|
+
return openBlock(), createElementBlock("li", { key: link.path }, [createElementVNode("a", {
|
|
176
|
+
href: unref(router).resolve(link.path).href,
|
|
177
|
+
target: "_blank",
|
|
178
|
+
rel: "noopener noreferrer",
|
|
179
|
+
class: "link link-accent inline-flex items-center gap-1.5"
|
|
180
|
+
}, [createTextVNode(toDisplayString(link.label) + " ", 1), createVNode(ExternalLinkIcon_default, { size: "sm" })], 8, _hoisted_8)]);
|
|
189
181
|
}), 128))]),
|
|
190
|
-
unref(signupConsentAfterText) ? (openBlock(), createElementBlock("p",
|
|
182
|
+
unref(signupConsentAfterText) ? (openBlock(), createElementBlock("p", _hoisted_9, toDisplayString(unref(signupConsentAfterText)), 1)) : createCommentVNode("v-if", true)
|
|
191
183
|
])) : createCommentVNode("v-if", true),
|
|
192
184
|
createVNode(unref(ZiniaSubmitButton), {
|
|
193
185
|
submitText: "Sign Up",
|
|
194
186
|
submittingText: "Signing up..."
|
|
195
187
|
}),
|
|
196
|
-
createElementVNode("div",
|
|
188
|
+
createElementVNode("div", _hoisted_10, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Already have an account? ", -1)), createVNode(AppLink_default, {
|
|
197
189
|
class: "link-accent link",
|
|
198
190
|
to: loginLink.value
|
|
199
191
|
}, {
|
|
@@ -210,5 +202,5 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
210
202
|
var Signup_default = _sfc_main;
|
|
211
203
|
|
|
212
204
|
//#endregion
|
|
213
|
-
export { signupSchemaWithMetadata as n, Signup_default as t };
|
|
214
|
-
//# sourceMappingURL=Signup-
|
|
205
|
+
export { signupSchemaWithMetadata as n, SIGNUP_EXTENSIBILITY_KEYS as r, Signup_default as t };
|
|
206
|
+
//# sourceMappingURL=Signup-D6vnyS4w.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Signup-D6vnyS4w.js","names":["payload: SignupInitiateInputDto","redirectTo: string"],"sources":["../src/slices/auth/signupExtensibilityKeys.ts","../src/slices/auth/utils/isEmailVerificationRequiredError.ts","../src/slices/auth/features/signup/signupSchema.ts","../src/slices/auth/features/signup/Signup.vue"],"sourcesContent":["import type { InjectionKey } from 'vue';\n\n/** Injection keys for signup extensibility. Consumer can provide these to supply metadata/headers from their app. */\nexport const SIGNUP_EXTENSIBILITY_KEYS = {\n /** Returns metadata to merge into signupInitiate payload (e.g. { referral_tag: route.query.ref }). */\n getSignupMetadata: Symbol('getSignupMetadata') as InjectionKey<\n () => Record<string, unknown>\n >,\n /** Returns headers to send with signup requests (e.g. { 'X-Referral-Tag': route.query.ref }). */\n getSignupHeaders: Symbol('getSignupHeaders') as InjectionKey<() => HeadersInit>,\n};\n","/**\n * Detects if an error indicates that email verification is required before login.\n * Used in signup flow when auto-login after signup fails due to unverified email.\n */\nexport function isEmailVerificationRequiredError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const e = error as {\n error_type?: string;\n error_name?: string;\n name?: string;\n message?: string;\n };\n if (\n e.error_type === 'EmailVerificationRequiredError' ||\n e.error_name === 'EmailVerificationRequiredError' ||\n e.name === 'EmailVerificationRequiredError'\n ) {\n return true;\n }\n const msg = typeof e.message === 'string' ? e.message : '';\n return msg.includes('Please verify your email before logging in');\n}\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { signupInitiateSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the signup form type (signupInitiate: email + passwords only)\nexport type SignupForm = z.infer<typeof signupInitiateSchema>;\n\n// Enhance the schema with metadata\nexport const signupSchemaWithMetadata = withMetadata(signupInitiateSchema, 'signupInitiateSchema', {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'email',\n className: 'login-field',\n autofocus: true,\n },\n 'passwords.password': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n 'passwords.password_confirm': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n});\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Sign Up</h1>\n\n <div\n v-if=\"awaitingVerification\"\n class=\"space-y-4 text-center\"\n >\n <p class=\"text-base-content/80\">\n We sent a verification link to your email address. Click the link to verify your account,\n then you can continue.\n </p>\n <p class=\"text-sm text-base-content/60\">\n If you opened the link in another tab, we'll redirect you automatically when verification\n completes.\n </p>\n </div>\n\n <div v-else-if=\"declinedMessage\" class=\"mb-4\">\n <div class=\"alert alert-warning\">\n <span>{{ declinedMessage }}</span>\n </div>\n </div>\n\n <ZiniaForm\n v-if=\"!awaitingVerification\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n >\n <zinia.EmailField />\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\n\n <div\n v-if=\"showConsentSection\"\n class=\"mb-6 p-4 rounded-lg bg-base-100 border border-base-300\"\n >\n <p class=\"font-medium mb-2\">{{ signupConsentBeforeText }}</p>\n <ul class=\"list-disc list-inside space-y-1 text-sm text-base-content/80\">\n <li\n v-for=\"link in legalLinks\"\n :key=\"link.path\"\n >\n <a\n :href=\"router.resolve(link.path).href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"link link-accent inline-flex items-center gap-1.5\"\n >\n {{ link.label }}\n <ExternalLinkIcon size=\"sm\" />\n </a>\n </li>\n </ul>\n <p\n v-if=\"signupConsentAfterText\"\n class=\"mt-2 text-sm text-base-content/70\"\n >\n {{ signupConsentAfterText }}\n </p>\n </div>\n\n <ZiniaSubmitButton submitText=\"Sign Up\" submittingText=\"Signing up...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n SignupInitiateInputDto,\n SignupInitiateResponseDto,\n} from '@dragonmastery/dragoncore-shared';\nimport type { UserDetailsTokenPayload } from '../../../../lib/models/userSession';\nimport AppLink from '../../../../components/AppLink.vue';\nimport ExternalLinkIcon from '../../../../components/ui/ExternalLinkIcon.vue';\nimport { SIGNUP_EXTENSIBILITY_KEYS } from '../../signupExtensibilityKeys';\nimport { useAuthFlowNextStep } from '../../../../composables/useAuthFlowNextStep';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useEmailVerificationChannel } from '../../useEmailVerificationChannel';\nimport { isEmailVerificationRequiredError } from '../../utils/isEmailVerificationRequiredError';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { jwtDecode } from 'jwt-decode';\nimport { computed, inject, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { signupSchemaWithMetadata } from './signupSchema';\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(signupSchemaWithMetadata, {\n storeName: 'signup-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst sessionStore = useUserSessionStore();\nconst route = useRoute();\nconst router = useRouter();\nconst { getNextStep } = useAuthFlowNextStep();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst awaitingVerification = ref(false);\n\nconst getSignupMetadata = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupMetadata, () => ({}));\nconst getSignupHeaders = inject(SIGNUP_EXTENSIBILITY_KEYS.getSignupHeaders, () => ({}));\nconst signupConsentBeforeText = inject<string>(\n 'signupConsentBeforeText',\n 'By signing up you agree to these terms:',\n);\nconst signupConsentAfterText = inject<string>(\n 'signupConsentAfterText',\n \"After you click Sign Up, we'll show you each document to review and accept.\",\n);\n\n// Legal routes - auto-collected from router (meta.legal: true) for the consent preview\nconst legalLinks = computed(() => {\n const routes = router.getRoutes();\n return routes\n .filter((r) => r.meta?.legal === true)\n .map((r) => {\n const resolved = router.resolve({ name: r.name as string });\n return {\n path: resolved.path,\n label: (r.meta?.title as string) ?? (r.name as string) ?? r.path,\n };\n })\n .sort((a, b) => a.path.localeCompare(b.path));\n});\n\nconst showConsentSection = computed(() => legalLinks.value.length > 0);\n\n// Show declined message when returning from consent flow\nconst declinedMessage = computed(() => {\n const declined = route.query.declined;\n if (declined === '1' || declined === 'true') {\n return 'You declined the consent. Your account was not created.';\n }\n return null;\n});\n\nconst { mutate: signupInitiateMutate } = useMutation<\n import('@dragonmastery/dragoncore-shared').DragoncoreApi,\n SignupInitiateInputDto,\n SignupInitiateResponseDto\n>(\n (api, input: SignupInitiateInputDto) => api.users.signupInitiate(input),\n {\n skipAuthCheck: true,\n credentials: 'include',\n extraHeaders: () => getSignupHeaders?.() ?? {},\n },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: SignupInitiateInputDto) => {\n const metadata = {\n ...(getSignupMetadata?.() ?? {}),\n ...(data.metadata ?? {}),\n };\n const payload: SignupInitiateInputDto = {\n ...data,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n const result = await signupInitiateMutate(payload);\n if (!result) throw new Error('Signup failed');\n\n if (!result.session?.access_token || !result.session?.user_details_token) {\n throw new Error('Failed to get session after signup');\n }\n return {\n access_token: result.session.access_token,\n user_details_token: result.session.user_details_token,\n };\n};\n\n// Handle success\nconst handleSuccess = async (data: { access_token: string; user_details_token: string }) => {\n sessionStore.setSession(data.user_details_token);\n sessionStore.setAccessToken(data.access_token);\n\n form.reset();\n\n let redirectTo: string;\n try {\n const tokenPayload = jwtDecode<UserDetailsTokenPayload>(data.user_details_token);\n const user = tokenPayload.details?.user;\n redirectTo = getNextStep(user);\n } catch {\n redirectTo = getValidReturnUrl(route, '/');\n }\n\n await router.push(redirectTo);\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n if (isEmailVerificationRequiredError(error)) {\n return;\n }\n const message = error instanceof Error ? error.message : 'Registration failed';\n toast.error(message);\n};\n\nuseEmailVerificationChannel(\n awaitingVerification,\n (targetUrl) => router.push(targetUrl),\n () => getValidReturnUrl(route, '/'),\n);\n</script>\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import "./useRpcAuth-
|
|
2
|
-
import "./EnhancedRefreshTokenHandler-
|
|
3
|
-
import "./useQueryCache-
|
|
4
|
-
import { t as useMutation } from "./useMutation-
|
|
5
|
-
import { t as useQuery } from "./useQuery-
|
|
1
|
+
import "./useRpcAuth-BFdprNWb.js";
|
|
2
|
+
import "./EnhancedRefreshTokenHandler-s8wUXtB5.js";
|
|
3
|
+
import "./useQueryCache-CUTrwJWX.js";
|
|
4
|
+
import { t as useMutation } from "./useMutation-BXSu7_-s.js";
|
|
5
|
+
import { t as useQuery } from "./useQuery-DownvLRA.js";
|
|
6
6
|
import { n as RecordVersionList_default, t as RecordVersionViewer_default } from "./RecordVersionViewer-DKIdX_BX.js";
|
|
7
7
|
import { r as formatToISODatetime } from "./convertToLocalDateTime-BKBxm2Rc.js";
|
|
8
8
|
import { t as extractRpcErrorMessage } from "./extractRpcErrorMessage-Df8-CJGV.js";
|
|
@@ -358,4 +358,4 @@ var SignupRequirementsPage_default = _sfc_main;
|
|
|
358
358
|
|
|
359
359
|
//#endregion
|
|
360
360
|
export { SignupRequirementsPage_default as default };
|
|
361
|
-
//# sourceMappingURL=SignupRequirementsPage-
|
|
361
|
+
//# sourceMappingURL=SignupRequirementsPage-BnOkXd7w.js.map
|
package/dist/{SignupRequirementsPage-33z--rhH.js.map → SignupRequirementsPage-BnOkXd7w.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignupRequirementsPage-33z--rhH.js","names":["consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n}","config: SignupRequirementsDto"],"sources":["../src/slices/admin/features/signup_requirements/signupRequirementsFormMetadata.ts","../src/slices/admin/features/signup_requirements/SignupRequirementsPage.vue"],"sourcesContent":["import {\n SignupConsentItemFormSchema,\n type SignupConsentItemFormDto,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n withMetadata,\n type PathsOf,\n type SchemaFieldMetadata,\n} from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/** Field metadata for consent item form — keys must match schema paths */\nexport const consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n} = {\n type: {\n label: 'Type',\n helpText: 'Type (e.g. terms_of_service, privacy_policy)',\n placeholder: 'terms_of_service',\n },\n version: {\n label: 'Version',\n helpText: 'Version (e.g. 2025.1)',\n placeholder: '2025.1',\n },\n label: {\n label: 'Label',\n placeholder: 'Terms of Service',\n },\n effective_at: {\n label: 'Effective at',\n inputType: 'datetime-local',\n helpText:\n 'When this version becomes enforceable for existing users. Set to now for immediate effect.',\n },\n url: {\n label: 'URL',\n helpText: 'Link to document — shown when content is empty',\n placeholder: '/legal/terms',\n },\n required: {\n label: 'Required',\n helpText: 'User must accept to sign up',\n inputType: 'checkbox' as const,\n },\n content: {\n label: 'Content',\n helpText: 'Optional, Markdown — when set, shown in scroll box; user must scroll to bottom',\n placeholder: '# Terms of Service\\n\\nYour markdown content here...',\n inputType: 'textarea',\n },\n};\n\n/** Item schema with metadata - used as array element (like followupCreateMetadata in tracker) */\nexport const signupConsentItemFormMetadata = withMetadata(\n SignupConsentItemFormSchema,\n 'signupConsentItemForm',\n consentItemFieldMetadata,\n);\n\n/** Full form schema with items array using metadata-wrapped item schema */\nexport const signupRequirementsFormMetadata = withMetadata(\n z.object({\n items: z.array(signupConsentItemFormMetadata).default([]),\n }),\n 'signupRequirementsForm',\n {},\n);\n\nexport function createEmptyConsentItem(): SignupConsentItemFormDto {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const effectiveAt = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}:${pad(now.getMinutes())}`;\n return {\n type: '',\n required: true,\n url: '',\n label: '',\n version: '1',\n effective_at: effectiveAt,\n content: '',\n };\n}\n","<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Signup Requirements</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Configure consent checkboxes shown on signup and consent-required flows. Each item can be\n required or optional. When <strong>content</strong> is provided, terms are shown in a\n scroll box (Markdown supported) and the user must scroll to bottom before accepting. When\n content is omitted, only a link is shown.\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 <div v-else class=\"space-y-6\">\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.ItemsField label=\"Consent Items\" :create-item=\"createEmptyConsentItem\">\n <template #itemPreview=\"{ item }\">\n <div class=\"font-medium text-sm\">\n {{ item.label || item.type || 'Item' }}\n <span v-if=\"item.type\" class=\"text-base-content/60\">({{ item.type }})</span>\n </div>\n </template>\n <template #itemRenderer=\"{ fields }\">\n <div class=\"space-y-3\">\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n <ziniaGeneric.TextField\n :name=\"fields.type\"\n :label=\"consentItemFieldMetadata.type.label\"\n :placeholder=\"consentItemFieldMetadata.type.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.version\"\n :label=\"consentItemFieldMetadata.version.label\"\n :placeholder=\"consentItemFieldMetadata.version.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.label\"\n :label=\"consentItemFieldMetadata.label.label\"\n :placeholder=\"consentItemFieldMetadata.label.placeholder\"\n required\n />\n </div>\n <ziniaGeneric.DateField\n :name=\"fields.effective_at\"\n :label=\"consentItemFieldMetadata.effective_at.label\"\n :formatter=\"formatToISODatetime\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.url\"\n :label=\"consentItemFieldMetadata.url.label\"\n :placeholder=\"consentItemFieldMetadata.url.placeholder\"\n type=\"url\"\n />\n <ziniaGeneric.CheckboxField\n :name=\"fields.required\"\n :label=\"consentItemFieldMetadata.required.label\"\n />\n <ziniaGeneric.TextareaField\n :name=\"fields.content\"\n :label=\"consentItemFieldMetadata.content.label\"\n :placeholder=\"consentItemFieldMetadata.content.placeholder\"\n :rows=\"5\"\n class=\"font-mono text-sm\"\n />\n </div>\n </template>\n </zinia.ItemsField>\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 :disabled=\"!hasChanges\"\n />\n </div>\n </ZiniaForm>\n\n <!-- Version History -->\n <div class=\"card bg-base-200\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Version History</h2>\n <p class=\"text-sm text-base-content/70\">\n Past changes to signup requirements. Each save creates a new version.\n </p>\n <RecordVersionList\n :versions=\"versionHistoryItems\"\n :loading=\"versionHistoryLoading\"\n :error=\"versionHistoryError\"\n :has-next-page=\"versionHistoryPageInfo?.hasNextPage ?? false\"\n :loading-more=\"versionHistoryLoadingMore\"\n :config=\"versionListConfig\"\n exclude-latest\n @retry=\"refetchVersionHistory\"\n @load-more=\"loadMoreVersions\"\n />\n <dialog ref=\"versionModalRef\" class=\"modal\">\n <div class=\"modal-box max-w-4xl max-h-[90vh] overflow-auto\">\n <RecordVersionViewer\n v-if=\"selectedVersion\"\n :version=\"selectedVersion\"\n :record-data=\"selectedVersionRecordData\"\n :config=\"versionViewerConfig\"\n >\n <template #content=\"{ recordData }\">\n <div v-if=\"recordData?.items?.length\" class=\"space-y-4\">\n <h3 class=\"font-semibold\">Consent items at this version</h3>\n <div\n v-for=\"(item, idx) in recordData.items\"\n :key=\"idx\"\n class=\"border border-base-300 rounded p-3 text-sm space-y-1\"\n >\n <div><strong>Type:</strong> {{ item.type }}</div>\n <div><strong>Version:</strong> {{ item.version }}</div>\n <div><strong>Label:</strong> {{ item.label }}</div>\n <div><strong>Effective at:</strong> {{ item.effective_at }}</div>\n <div><strong>Required:</strong> {{ item.required ? 'Yes' : 'No' }}</div>\n <div v-if=\"item.url\"><strong>URL:</strong> {{ item.url }}</div>\n </div>\n </div>\n <pre v-else class=\"text-xs bg-base-200 p-3 rounded overflow-auto max-h-96\">{{\n JSON.stringify(recordData, null, 2)\n }}</pre>\n </template>\n </RecordVersionViewer>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"closeVersionModal\">close</button>\n </form>\n </dialog>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport { RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport RecordVersionList from '../../../../components/ui/RecordVersionList.vue';\nimport RecordVersionViewer from '../../../../components/ui/RecordVersionViewer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatToISODatetime } from '../../../../utils/convertToLocalDateTime';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport {\n consentItemFieldMetadata,\n createEmptyConsentItem,\n signupRequirementsFormMetadata,\n} from './signupRequirementsFormMetadata';\n\nconst {\n data: _signupRequirements,\n loading: isLoading,\n refetch,\n} = useQuery((api) => api.appSettings.getSignupRequirements(), {\n // cacheKey: 'admin-signup-requirements',\n // staleTime: 30 * 1000,\n});\n\nconst { form, zinia, ziniaGeneric, ZiniaForm, ZiniaSubmitButton } = useForm(\n signupRequirementsFormMetadata,\n {\n storeName: 'admin-signup-requirements-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n // wait for signup requirements to load\n fetchData: async () => {\n while (isLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return { items: _signupRequirements.value ?? [] };\n },\n },\n);\n\nconst initialSnapshot = ref<string>('');\n\nconst hasChanges = computed(() => {\n const current = form.values?.items ?? [];\n return JSON.stringify(current) !== initialSnapshot.value;\n});\n\nconst { mutate: updateSignupRequirements } = useMutation(\n (api, config: SignupRequirementsDto) => api.appSettings.updateSignupRequirements(config),\n { invalidate: /admin-signup-requirements/ },\n);\n\nasync function handleSubmit(formData: {\n items: Array<{\n type: string;\n required: boolean;\n url: string;\n label: string;\n version: string;\n effective_at: string;\n content?: string | null;\n }>;\n}) {\n const config: SignupRequirementsDto = formData.items.map((c) => ({\n type: c.type.trim() || 'unknown',\n required: c.required,\n url: c.url.trim(),\n label: c.label.trim() || c.type.trim() || 'Consent',\n version: c.version.trim() || '1',\n effective_at:\n (c.effective_at?.trim()\n ? formatToISODatetime(c.effective_at.trim())\n : formatToISODatetime(new Date().toISOString())) ?? new Date().toISOString(),\n content: c.content?.trim() ? c.content.trim() : undefined,\n }));\n await updateSignupRequirements(config);\n}\n\nasync function handleSuccess() {\n toast.success('Signup requirements saved');\n initialSnapshot.value = JSON.stringify(form.values?.items ?? []);\n await refetch();\n await refetchVersionHistory();\n}\n\nfunction handleError(error: Error | unknown) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n form.setSubmitError(extractRpcErrorMessage(error, message));\n toast.error(form.submitError ?? 'Failed to save signup requirements');\n}\n\n// Version history\nconst VERSION_HISTORY_KEY = 'admin-signup-requirements-history';\n\nconst {\n data: versionHistoryData,\n loading: versionHistoryLoading,\n error: versionHistoryError,\n refetch: refetchVersionHistory,\n} = useQuery(\n async (api) =>\n api.recordVersions.listRecordVersionsPaginated(\n 'signup_requirements',\n RecordConst.APP_SETTING,\n {\n first: 50,\n sortBy: 'recorded_at',\n sortDirection: 'desc',\n },\n ),\n {\n cacheKey: VERSION_HISTORY_KEY,\n staleTime: 60 * 1000,\n },\n);\n\nconst versionHistoryItems = computed(() => versionHistoryData.value?.items ?? []);\nconst versionHistoryPageInfo = computed(() => versionHistoryData.value?.pageInfo);\nconst versionHistoryLoadingMore = ref(false);\n\nfunction loadMoreVersions() {\n // Pagination: could add cursor-based load more if needed\n}\n\nconst versionListConfig = {\n recordDisplayName: 'signup requirements',\n noVersionsText: 'No previous versions. Save changes to create the first version.',\n viewAction: (version: { id: string }) => openVersionModal(version),\n viewActionText: 'View',\n};\n\nconst versionModalRef = ref<HTMLDialogElement | null>(null);\nconst selectedVersion = ref<{\n id: string;\n operation: string;\n recorded_at: string;\n auth_username?: string | null;\n record?: unknown;\n old_record?: unknown;\n} | null>(null);\n\nconst selectedVersionRecordData = computed(() => {\n if (!selectedVersion.value) return null;\n const v = selectedVersion.value;\n const record = v.record;\n if (Array.isArray(record)) return { items: record };\n if (typeof record === 'object' && record !== null) return record;\n if (typeof record === 'string') {\n try {\n const parsed = JSON.parse(record);\n return Array.isArray(parsed) ? { items: parsed } : parsed;\n } catch {\n return { raw: record };\n }\n }\n return null;\n});\n\nconst versionViewerConfig = {\n recordDisplayName: 'signup requirements',\n title: 'Signup Requirements Version',\n onBack: () => closeVersionModal(),\n excludeFields: ['raw'],\n};\n\nfunction openVersionModal(version: { id: string; record?: unknown; old_record?: unknown }) {\n selectedVersion.value = version as typeof selectedVersion.value;\n versionModalRef.value?.showModal();\n}\n\nfunction closeVersionModal() {\n selectedVersion.value = null;\n versionModalRef.value?.close();\n}\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SignupRequirementsPage-BnOkXd7w.js","names":["consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n}","config: SignupRequirementsDto"],"sources":["../src/slices/admin/features/signup_requirements/signupRequirementsFormMetadata.ts","../src/slices/admin/features/signup_requirements/SignupRequirementsPage.vue"],"sourcesContent":["import {\n SignupConsentItemFormSchema,\n type SignupConsentItemFormDto,\n} from '@dragonmastery/dragoncore-shared';\nimport {\n withMetadata,\n type PathsOf,\n type SchemaFieldMetadata,\n} from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/** Field metadata for consent item form — keys must match schema paths */\nexport const consentItemFieldMetadata: {\n [K in PathsOf<typeof SignupConsentItemFormSchema>]: SchemaFieldMetadata;\n} = {\n type: {\n label: 'Type',\n helpText: 'Type (e.g. terms_of_service, privacy_policy)',\n placeholder: 'terms_of_service',\n },\n version: {\n label: 'Version',\n helpText: 'Version (e.g. 2025.1)',\n placeholder: '2025.1',\n },\n label: {\n label: 'Label',\n placeholder: 'Terms of Service',\n },\n effective_at: {\n label: 'Effective at',\n inputType: 'datetime-local',\n helpText:\n 'When this version becomes enforceable for existing users. Set to now for immediate effect.',\n },\n url: {\n label: 'URL',\n helpText: 'Link to document — shown when content is empty',\n placeholder: '/legal/terms',\n },\n required: {\n label: 'Required',\n helpText: 'User must accept to sign up',\n inputType: 'checkbox' as const,\n },\n content: {\n label: 'Content',\n helpText: 'Optional, Markdown — when set, shown in scroll box; user must scroll to bottom',\n placeholder: '# Terms of Service\\n\\nYour markdown content here...',\n inputType: 'textarea',\n },\n};\n\n/** Item schema with metadata - used as array element (like followupCreateMetadata in tracker) */\nexport const signupConsentItemFormMetadata = withMetadata(\n SignupConsentItemFormSchema,\n 'signupConsentItemForm',\n consentItemFieldMetadata,\n);\n\n/** Full form schema with items array using metadata-wrapped item schema */\nexport const signupRequirementsFormMetadata = withMetadata(\n z.object({\n items: z.array(signupConsentItemFormMetadata).default([]),\n }),\n 'signupRequirementsForm',\n {},\n);\n\nexport function createEmptyConsentItem(): SignupConsentItemFormDto {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const effectiveAt = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}:${pad(now.getMinutes())}`;\n return {\n type: '',\n required: true,\n url: '',\n label: '',\n version: '1',\n effective_at: effectiveAt,\n content: '',\n };\n}\n","<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Signup Requirements</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Configure consent checkboxes shown on signup and consent-required flows. Each item can be\n required or optional. When <strong>content</strong> is provided, terms are shown in a\n scroll box (Markdown supported) and the user must scroll to bottom before accepting. When\n content is omitted, only a link is shown.\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 <div v-else class=\"space-y-6\">\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.ItemsField label=\"Consent Items\" :create-item=\"createEmptyConsentItem\">\n <template #itemPreview=\"{ item }\">\n <div class=\"font-medium text-sm\">\n {{ item.label || item.type || 'Item' }}\n <span v-if=\"item.type\" class=\"text-base-content/60\">({{ item.type }})</span>\n </div>\n </template>\n <template #itemRenderer=\"{ fields }\">\n <div class=\"space-y-3\">\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n <ziniaGeneric.TextField\n :name=\"fields.type\"\n :label=\"consentItemFieldMetadata.type.label\"\n :placeholder=\"consentItemFieldMetadata.type.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.version\"\n :label=\"consentItemFieldMetadata.version.label\"\n :placeholder=\"consentItemFieldMetadata.version.placeholder\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.label\"\n :label=\"consentItemFieldMetadata.label.label\"\n :placeholder=\"consentItemFieldMetadata.label.placeholder\"\n required\n />\n </div>\n <ziniaGeneric.DateField\n :name=\"fields.effective_at\"\n :label=\"consentItemFieldMetadata.effective_at.label\"\n :formatter=\"formatToISODatetime\"\n required\n />\n <ziniaGeneric.TextField\n :name=\"fields.url\"\n :label=\"consentItemFieldMetadata.url.label\"\n :placeholder=\"consentItemFieldMetadata.url.placeholder\"\n type=\"url\"\n />\n <ziniaGeneric.CheckboxField\n :name=\"fields.required\"\n :label=\"consentItemFieldMetadata.required.label\"\n />\n <ziniaGeneric.TextareaField\n :name=\"fields.content\"\n :label=\"consentItemFieldMetadata.content.label\"\n :placeholder=\"consentItemFieldMetadata.content.placeholder\"\n :rows=\"5\"\n class=\"font-mono text-sm\"\n />\n </div>\n </template>\n </zinia.ItemsField>\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 :disabled=\"!hasChanges\"\n />\n </div>\n </ZiniaForm>\n\n <!-- Version History -->\n <div class=\"card bg-base-200\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Version History</h2>\n <p class=\"text-sm text-base-content/70\">\n Past changes to signup requirements. Each save creates a new version.\n </p>\n <RecordVersionList\n :versions=\"versionHistoryItems\"\n :loading=\"versionHistoryLoading\"\n :error=\"versionHistoryError\"\n :has-next-page=\"versionHistoryPageInfo?.hasNextPage ?? false\"\n :loading-more=\"versionHistoryLoadingMore\"\n :config=\"versionListConfig\"\n exclude-latest\n @retry=\"refetchVersionHistory\"\n @load-more=\"loadMoreVersions\"\n />\n <dialog ref=\"versionModalRef\" class=\"modal\">\n <div class=\"modal-box max-w-4xl max-h-[90vh] overflow-auto\">\n <RecordVersionViewer\n v-if=\"selectedVersion\"\n :version=\"selectedVersion\"\n :record-data=\"selectedVersionRecordData\"\n :config=\"versionViewerConfig\"\n >\n <template #content=\"{ recordData }\">\n <div v-if=\"recordData?.items?.length\" class=\"space-y-4\">\n <h3 class=\"font-semibold\">Consent items at this version</h3>\n <div\n v-for=\"(item, idx) in recordData.items\"\n :key=\"idx\"\n class=\"border border-base-300 rounded p-3 text-sm space-y-1\"\n >\n <div><strong>Type:</strong> {{ item.type }}</div>\n <div><strong>Version:</strong> {{ item.version }}</div>\n <div><strong>Label:</strong> {{ item.label }}</div>\n <div><strong>Effective at:</strong> {{ item.effective_at }}</div>\n <div><strong>Required:</strong> {{ item.required ? 'Yes' : 'No' }}</div>\n <div v-if=\"item.url\"><strong>URL:</strong> {{ item.url }}</div>\n </div>\n </div>\n <pre v-else class=\"text-xs bg-base-200 p-3 rounded overflow-auto max-h-96\">{{\n JSON.stringify(recordData, null, 2)\n }}</pre>\n </template>\n </RecordVersionViewer>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"closeVersionModal\">close</button>\n </form>\n </dialog>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport { RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport RecordVersionList from '../../../../components/ui/RecordVersionList.vue';\nimport RecordVersionViewer from '../../../../components/ui/RecordVersionViewer.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatToISODatetime } from '../../../../utils/convertToLocalDateTime';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport {\n consentItemFieldMetadata,\n createEmptyConsentItem,\n signupRequirementsFormMetadata,\n} from './signupRequirementsFormMetadata';\n\nconst {\n data: _signupRequirements,\n loading: isLoading,\n refetch,\n} = useQuery((api) => api.appSettings.getSignupRequirements(), {\n // cacheKey: 'admin-signup-requirements',\n // staleTime: 30 * 1000,\n});\n\nconst { form, zinia, ziniaGeneric, ZiniaForm, ZiniaSubmitButton } = useForm(\n signupRequirementsFormMetadata,\n {\n storeName: 'admin-signup-requirements-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n // wait for signup requirements to load\n fetchData: async () => {\n while (isLoading.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return { items: _signupRequirements.value ?? [] };\n },\n },\n);\n\nconst initialSnapshot = ref<string>('');\n\nconst hasChanges = computed(() => {\n const current = form.values?.items ?? [];\n return JSON.stringify(current) !== initialSnapshot.value;\n});\n\nconst { mutate: updateSignupRequirements } = useMutation(\n (api, config: SignupRequirementsDto) => api.appSettings.updateSignupRequirements(config),\n { invalidate: /admin-signup-requirements/ },\n);\n\nasync function handleSubmit(formData: {\n items: Array<{\n type: string;\n required: boolean;\n url: string;\n label: string;\n version: string;\n effective_at: string;\n content?: string | null;\n }>;\n}) {\n const config: SignupRequirementsDto = formData.items.map((c) => ({\n type: c.type.trim() || 'unknown',\n required: c.required,\n url: c.url.trim(),\n label: c.label.trim() || c.type.trim() || 'Consent',\n version: c.version.trim() || '1',\n effective_at:\n (c.effective_at?.trim()\n ? formatToISODatetime(c.effective_at.trim())\n : formatToISODatetime(new Date().toISOString())) ?? new Date().toISOString(),\n content: c.content?.trim() ? c.content.trim() : undefined,\n }));\n await updateSignupRequirements(config);\n}\n\nasync function handleSuccess() {\n toast.success('Signup requirements saved');\n initialSnapshot.value = JSON.stringify(form.values?.items ?? []);\n await refetch();\n await refetchVersionHistory();\n}\n\nfunction handleError(error: Error | unknown) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n form.setSubmitError(extractRpcErrorMessage(error, message));\n toast.error(form.submitError ?? 'Failed to save signup requirements');\n}\n\n// Version history\nconst VERSION_HISTORY_KEY = 'admin-signup-requirements-history';\n\nconst {\n data: versionHistoryData,\n loading: versionHistoryLoading,\n error: versionHistoryError,\n refetch: refetchVersionHistory,\n} = useQuery(\n async (api) =>\n api.recordVersions.listRecordVersionsPaginated(\n 'signup_requirements',\n RecordConst.APP_SETTING,\n {\n first: 50,\n sortBy: 'recorded_at',\n sortDirection: 'desc',\n },\n ),\n {\n cacheKey: VERSION_HISTORY_KEY,\n staleTime: 60 * 1000,\n },\n);\n\nconst versionHistoryItems = computed(() => versionHistoryData.value?.items ?? []);\nconst versionHistoryPageInfo = computed(() => versionHistoryData.value?.pageInfo);\nconst versionHistoryLoadingMore = ref(false);\n\nfunction loadMoreVersions() {\n // Pagination: could add cursor-based load more if needed\n}\n\nconst versionListConfig = {\n recordDisplayName: 'signup requirements',\n noVersionsText: 'No previous versions. Save changes to create the first version.',\n viewAction: (version: { id: string }) => openVersionModal(version),\n viewActionText: 'View',\n};\n\nconst versionModalRef = ref<HTMLDialogElement | null>(null);\nconst selectedVersion = ref<{\n id: string;\n operation: string;\n recorded_at: string;\n auth_username?: string | null;\n record?: unknown;\n old_record?: unknown;\n} | null>(null);\n\nconst selectedVersionRecordData = computed(() => {\n if (!selectedVersion.value) return null;\n const v = selectedVersion.value;\n const record = v.record;\n if (Array.isArray(record)) return { items: record };\n if (typeof record === 'object' && record !== null) return record;\n if (typeof record === 'string') {\n try {\n const parsed = JSON.parse(record);\n return Array.isArray(parsed) ? { items: parsed } : parsed;\n } catch {\n return { raw: record };\n }\n }\n return null;\n});\n\nconst versionViewerConfig = {\n recordDisplayName: 'signup requirements',\n title: 'Signup Requirements Version',\n onBack: () => closeVersionModal(),\n excludeFields: ['raw'],\n};\n\nfunction openVersionModal(version: { id: string; record?: unknown; old_record?: unknown }) {\n selectedVersion.value = version as typeof selectedVersion.value;\n versionModalRef.value?.showModal();\n}\n\nfunction closeVersionModal() {\n selectedVersion.value = null;\n versionModalRef.value?.close();\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "./useRpcAuth-BFdprNWb.js";
|
|
2
|
+
import "./EnhancedRefreshTokenHandler-s8wUXtB5.js";
|
|
3
|
+
import "./useQueryCache-CUTrwJWX.js";
|
|
4
|
+
import "./useMutation-BXSu7_-s.js";
|
|
5
|
+
import "./useQuery-DownvLRA.js";
|
|
6
|
+
import "./saved_filter-DXWnU4Zb.js";
|
|
7
|
+
import "./ConfirmDialog-DjthOYU6.js";
|
|
8
|
+
import "./InlineAttachments-Ywf9r3jd.js";
|
|
9
|
+
import "./FieldsetSection-Br_sygWW.js";
|
|
10
|
+
import "./userAuthorized-qmzUYDa-.js";
|
|
11
|
+
import "./staffSupportTicketRoutes-CeuduGmG.js";
|
|
12
|
+
import { t as StaffCreateSupportTicketForm_default } from "./StaffCreateSupportTicketForm-gPZizMKW.js";
|
|
13
|
+
|
|
14
|
+
export { StaffCreateSupportTicketForm_default as default };
|
package/dist/{StaffCreateSupportTicketForm-BtR-Aowv.js → StaffCreateSupportTicketForm-gPZizMKW.js}
RENAMED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { r as executeWithAuth } from "./useRpcAuth-
|
|
2
|
-
import { r as getRefreshTokenHandler } from "./EnhancedRefreshTokenHandler-
|
|
3
|
-
import { t as useMutation } from "./useMutation-
|
|
4
|
-
import { t as InlineAttachments_default } from "./InlineAttachments-
|
|
1
|
+
import { r as executeWithAuth } from "./useRpcAuth-BFdprNWb.js";
|
|
2
|
+
import { r as getRefreshTokenHandler } from "./EnhancedRefreshTokenHandler-s8wUXtB5.js";
|
|
3
|
+
import { t as useMutation } from "./useMutation-BXSu7_-s.js";
|
|
4
|
+
import { t as InlineAttachments_default } from "./InlineAttachments-Ywf9r3jd.js";
|
|
5
5
|
import { t as FieldsetSection_default } from "./FieldsetSection-Br_sygWW.js";
|
|
6
6
|
import { n as formatToISODate } from "./convertToLocalDateTime-BKBxm2Rc.js";
|
|
7
|
-
import { t as staffSupportPaths } from "./staffSupportTicketRoutes-
|
|
7
|
+
import { t as staffSupportPaths } from "./staffSupportTicketRoutes-CeuduGmG.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-
|
|
255
|
+
//# sourceMappingURL=StaffCreateSupportTicketForm-gPZizMKW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StaffCreateSupportTicketForm-BtR-Aowv.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-gPZizMKW.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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"}
|
package/dist/{StaffSupportTicketDetailPage-LqnNfU34.js → StaffSupportTicketDetailPage-DUqLTHVT.js}
RENAMED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { t as BATCH_MODE } from "./useRpcAuth-
|
|
2
|
-
import "./EnhancedRefreshTokenHandler-
|
|
3
|
-
import "./useQueryCache-
|
|
4
|
-
import { t as useMutation } from "./useMutation-
|
|
5
|
-
import { t as useQuery } from "./useQuery-
|
|
1
|
+
import { t as BATCH_MODE } from "./useRpcAuth-BFdprNWb.js";
|
|
2
|
+
import "./EnhancedRefreshTokenHandler-s8wUXtB5.js";
|
|
3
|
+
import "./useQueryCache-CUTrwJWX.js";
|
|
4
|
+
import { t as useMutation } from "./useMutation-BXSu7_-s.js";
|
|
5
|
+
import { t as useQuery } from "./useQuery-DownvLRA.js";
|
|
6
6
|
import "./ConfirmDialog-DjthOYU6.js";
|
|
7
|
-
import "./InlineAttachments-
|
|
7
|
+
import "./InlineAttachments-Ywf9r3jd.js";
|
|
8
8
|
import { n as formatToISODate } from "./convertToLocalDateTime-BKBxm2Rc.js";
|
|
9
9
|
import { t as extractRpcErrorMessage } from "./extractRpcErrorMessage-Df8-CJGV.js";
|
|
10
10
|
import { a as SupportTicketTypeBadge_default, c as formatStaffCreditValue, i as SupportTicketApprovalBadge_default, n as TimelineItem_default, o as SupportTicketPriorityBadge_default, r as formatTicketDate, t as TimelineSystemEvent_default } from "./TimelineSystemEvent-D5fkhkZT.js";
|
|
11
11
|
import { t as formatTicketDisplayId } from "./displayIdFormatter-Ca4Al9iB.js";
|
|
12
12
|
import { t as SupportTicketDevLifecycleBadge_default } from "./SupportTicketDevLifecycleBadge-D8-Cv1Np.js";
|
|
13
|
-
import { a as SupportTicketAttachmentsCollapsible_default, i as parseRecordVersions, n as MetadataField_default, r as ActionBannerAlert_default, t as TimelineNoteInput_default } from "./TimelineNoteInput-
|
|
13
|
+
import { a as SupportTicketAttachmentsCollapsible_default, i as parseRecordVersions, n as MetadataField_default, r as ActionBannerAlert_default, t as TimelineNoteInput_default } from "./TimelineNoteInput-CrivEMUP.js";
|
|
14
14
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, nextTick, normalizeClass, openBlock, ref, renderList, resolveComponent, toDisplayString, unref, vModelCheckbox, vModelSelect, vModelText, watch, withCtx, withDirectives } from "vue";
|
|
15
15
|
import { useRoute, useRouter } from "vue-router";
|
|
16
16
|
import { toast } from "vue3-toastify";
|
|
@@ -1928,4 +1928,4 @@ var StaffSupportTicketDetailPage_default = _sfc_main;
|
|
|
1928
1928
|
|
|
1929
1929
|
//#endregion
|
|
1930
1930
|
export { StaffSupportTicketDetailPage_default as default };
|
|
1931
|
-
//# sourceMappingURL=StaffSupportTicketDetailPage-
|
|
1931
|
+
//# sourceMappingURL=StaffSupportTicketDetailPage-DUqLTHVT.js.map
|