@dragonmastery/dragoncore-vue 0.0.23 → 0.0.25
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-CYuCCosx.js → ChangePasswordPage-C7rqJfii.js} +1 -1
- package/dist/{ChangePasswordPage-C633yQiU.js → ChangePasswordPage-nr0B06HB.js} +1 -1
- package/dist/{ChangePasswordPage-C633yQiU.js.map → ChangePasswordPage-nr0B06HB.js.map} +1 -1
- package/dist/ConsentFlowStep-Dwg2HpnI.js +157 -0
- package/dist/ConsentFlowStep-Dwg2HpnI.js.map +1 -0
- package/dist/ConsentRequired-Cp9QGWiV.js +114 -0
- package/dist/ConsentRequired-Cp9QGWiV.js.map +1 -0
- package/dist/{CreateTeamForm-CeaC41VY.js → CreateTeamForm-DmBiBqC0.js} +5 -5
- package/dist/{CreateTeamForm-CeaC41VY.js.map → CreateTeamForm-DmBiBqC0.js.map} +1 -1
- package/dist/CreateTeamForm-DoMkefS8.js +12 -0
- package/dist/{CreateTeamMemberForm-CnHfpob_.js → CreateTeamMemberForm-CSF-tD6B.js} +5 -5
- package/dist/{CreateTeamMemberForm-Bv9gNG4z.js → CreateTeamMemberForm-ITp4XFn9.js} +5 -5
- package/dist/{CreateTeamMemberForm-Bv9gNG4z.js.map → CreateTeamMemberForm-ITp4XFn9.js.map} +1 -1
- package/dist/{CreateUserPage-CqKcY7_X.js → CreateUserPage-1WiLNGr_.js} +1 -1
- package/dist/{CreateUserPage-CqKcY7_X.js.map → CreateUserPage-1WiLNGr_.js.map} +1 -1
- package/dist/{CreateUserPage-C9uOeYDJ.js → CreateUserPage-DNi45YF4.js} +1 -1
- package/dist/{CreditBalanceDashboard-k_orNn4h.js → CreditBalanceDashboard-B-CQpNNH.js} +2 -2
- package/dist/{CreditBalanceDashboard-k_orNn4h.js.map → CreditBalanceDashboard-B-CQpNNH.js.map} +1 -1
- package/dist/{CreditBalanceDashboard-0HiJE_OS.js → CreditBalanceDashboard-C9aofnmG.js} +5 -5
- package/dist/{CreditManagement-DXdIN-0d.js → CreditManagement-BqwuCfPL.js} +5 -5
- package/dist/{CreditManagement-BVBZQDI4.js → CreditManagement-DC-v2lmd.js} +2 -2
- package/dist/{CreditManagement-BVBZQDI4.js.map → CreditManagement-DC-v2lmd.js.map} +1 -1
- package/dist/{CreditTransactionHistory-DSu-6aDi.js → CreditTransactionHistory-Cnf23BQr.js} +3 -3
- package/dist/{CreditTransactionHistory-DSu-6aDi.js.map → CreditTransactionHistory-Cnf23BQr.js.map} +1 -1
- package/dist/{CustomerCreateSupportTicketForm-BsjX8Pja.js → CustomerCreateSupportTicketForm-BglXTkKj.js} +5 -5
- package/dist/{CustomerCreateSupportTicketForm-kf8YIGjx.js → CustomerCreateSupportTicketForm-DpMy7RN3.js} +3 -3
- package/dist/{CustomerCreateSupportTicketForm-kf8YIGjx.js.map → CustomerCreateSupportTicketForm-DpMy7RN3.js.map} +1 -1
- package/dist/{CustomerSupportTicketDetailPage-C_-YoAaP.js → CustomerSupportTicketDetailPage-CI0UmP2U.js} +5 -5
- package/dist/{CustomerSupportTicketDetailPage-C_-YoAaP.js.map → CustomerSupportTicketDetailPage-CI0UmP2U.js.map} +1 -1
- package/dist/CustomerSupportTicketList-DgXBedwz.js +64 -0
- package/dist/{CustomerSupportTicketParent-BpBuYCrP.js → CustomerSupportTicketParent-BaKfkSlU.js} +2 -2
- package/dist/{CustomerSupportTicketParent-BpBuYCrP.js.map → CustomerSupportTicketParent-BaKfkSlU.js.map} +1 -1
- package/dist/{CustomerSupportTicketParent-Djy7pNqO.js → CustomerSupportTicketParent-D19kei4H.js} +1 -1
- package/dist/{CustomerSupportTicketSuccess-cumNSGdx.js → CustomerSupportTicketSuccess-BQ_a8BPV.js} +2 -2
- package/dist/{CustomerSupportTicketSuccess-cumNSGdx.js.map → CustomerSupportTicketSuccess-BQ_a8BPV.js.map} +1 -1
- package/dist/{CustomerSupportTicketSuccess-DsFzpJFU.js → CustomerSupportTicketSuccess-DToQdwdr.js} +4 -4
- package/dist/EditTeamForm-BKnTz2F4.js +12 -0
- package/dist/{EditTeamForm-BxRN338L.js → EditTeamForm-Cgi1EghV.js} +4 -4
- package/dist/{EditTeamForm-BxRN338L.js.map → EditTeamForm-Cgi1EghV.js.map} +1 -1
- package/dist/{EditTeamMemberForm-D7D1Zddh.js → EditTeamMemberForm-CIqEjFF8.js} +3 -3
- package/dist/{EditTeamMemberForm-DfgJr5Cy.js → EditTeamMemberForm-Fyf8Zxfh.js} +3 -3
- package/dist/{EditTeamMemberForm-DfgJr5Cy.js.map → EditTeamMemberForm-Fyf8Zxfh.js.map} +1 -1
- package/dist/{EditUserPage-CI_jtU8P.js → EditUserPage-BBzGmOrx.js} +2 -2
- package/dist/{EditUserPage-CI_jtU8P.js.map → EditUserPage-BBzGmOrx.js.map} +1 -1
- package/dist/{TeamNotesTab-o7glfjoY.js → EditUserPage-D3AWaHT2.js} +2 -2
- package/dist/ExternalLinkIcon-FidcmNOa.js +34 -0
- package/dist/ExternalLinkIcon-FidcmNOa.js.map +1 -0
- package/dist/{FieldsetSection-Cd4B8Ad7.js → FieldsetSection-CH1jAwcc.js} +1 -1
- package/dist/{FieldsetSection-Cd4B8Ad7.js.map → FieldsetSection-CH1jAwcc.js.map} +1 -1
- package/dist/{ForgotPassword-tJVSg7PB.js → ForgotPassword-BhmO5Lfd.js} +1 -1
- package/dist/{ForgotPassword-Ckb9Z-wb.js → ForgotPassword-Dd-E3_o1.js} +1 -1
- package/dist/{ForgotPassword-Ckb9Z-wb.js.map → ForgotPassword-Dd-E3_o1.js.map} +1 -1
- package/dist/{LoginForm-QFJ8NHww.js → LoginForm-By2I6TuV.js} +1 -1
- package/dist/{LoginForm-CMN2T1fA.js → LoginForm-DPmrJ_wm.js} +1 -1
- package/dist/{LoginForm-CMN2T1fA.js.map → LoginForm-DPmrJ_wm.js.map} +1 -1
- package/dist/{Logout-CjDBff3W.js → Logout-DZD4gSWp.js} +1 -1
- package/dist/{Logout-CFLYHlLr.js → Logout-DnkdqN78.js} +1 -1
- package/dist/{Logout-CFLYHlLr.js.map → Logout-DnkdqN78.js.map} +1 -1
- package/dist/{MfaSetup-XqoAwBXx.js → MfaSetup-Bjc3v0hs.js} +4 -4
- package/dist/{MfaSetup-XqoAwBXx.js.map → MfaSetup-Bjc3v0hs.js.map} +1 -1
- package/dist/{MfaSetup-BZcoxJx-.js → MfaSetup-BtfQXhLn.js} +2 -2
- package/dist/{MfaVerify-Dy2aV5Gk.js → MfaVerify-SUfSRf4m.js} +2 -2
- package/dist/{MfaVerify-C-A75TFZ.js → MfaVerify-uJlPz8xg.js} +2 -2
- package/dist/{MfaVerify-C-A75TFZ.js.map → MfaVerify-uJlPz8xg.js.map} +1 -1
- package/dist/{RecordVersionViewer-D2j10HdK.js → RecordVersionViewer-NLn1gVys.js} +1 -1
- package/dist/{RecordVersionViewer-D2j10HdK.js.map → RecordVersionViewer-NLn1gVys.js.map} +1 -1
- package/dist/{ResetPassword-Cd-Yxp8E.js → ResetPassword-CyizBRob.js} +1 -1
- package/dist/{ResetPassword-Cd-Yxp8E.js.map → ResetPassword-CyizBRob.js.map} +1 -1
- package/dist/{ResetPassword-D6to3G6a.js → ResetPassword-Dz2N3pH4.js} +1 -1
- package/dist/{SavedFiltersPage-DM5DvAFa.js → SavedFiltersPage-CQl3CThS.js} +52 -51
- package/dist/{SavedFiltersPage-DM5DvAFa.js.map → SavedFiltersPage-CQl3CThS.js.map} +1 -1
- package/dist/{Signup-2pqvJiVt.js → Signup-BCVZZCR_.js} +3 -3
- package/dist/{Signup-2pqvJiVt.js.map → Signup-BCVZZCR_.js.map} +1 -1
- package/dist/Signup-CJrY4IK-.js +9 -0
- package/dist/{SignupConsentFlow-X3kXuviv.js → SignupConsentFlow-Dd3QAkVF.js} +37 -127
- package/dist/SignupConsentFlow-Dd3QAkVF.js.map +1 -0
- package/dist/{SignupRequirementsPage-Cf-ElkEq.js → SignupRequirementsPage-DUQ63ZuW.js} +6 -6
- package/dist/SignupRequirementsPage-DUQ63ZuW.js.map +1 -0
- package/dist/{StaffCreateSupportTicketForm-D2nn4rTU.js → StaffCreateSupportTicketForm-BlXd0-fF.js} +4 -4
- package/dist/{StaffCreateSupportTicketForm-D2nn4rTU.js.map → StaffCreateSupportTicketForm-BlXd0-fF.js.map} +1 -1
- package/dist/{StaffCreateSupportTicketForm-BlUP2XXy.js → StaffCreateSupportTicketForm-DZLB4g3g.js} +5 -5
- package/dist/{StaffSupportTicketDetailPage-MFtm06BE.js → StaffSupportTicketDetailPage--idGVu5P.js} +10 -10
- package/dist/StaffSupportTicketDetailPage--idGVu5P.js.map +1 -0
- package/dist/StaffSupportTicketList-qPI92eBV.js +64 -0
- package/dist/{StaffSupportTicketParent-B7mEN1oD.js → StaffSupportTicketParent-ByUwsYGx.js} +1 -1
- package/dist/{StaffSupportTicketParent-BvPwgOqH.js → StaffSupportTicketParent-yoC-_Lku.js} +2 -2
- package/dist/{StaffSupportTicketParent-BvPwgOqH.js.map → StaffSupportTicketParent-yoC-_Lku.js.map} +1 -1
- package/dist/{StaffSupportTicketSuccess-Ca2WrcRg.js → StaffSupportTicketSuccess-D9ZUkc88.js} +2 -2
- package/dist/{StaffSupportTicketSuccess-Ca2WrcRg.js.map → StaffSupportTicketSuccess-D9ZUkc88.js.map} +1 -1
- package/dist/{StaffSupportTicketSuccess-BMCOP3ko.js → StaffSupportTicketSuccess-DSKqZFmV.js} +4 -4
- package/dist/{SupportStaffPage-B69-kuvg.js → SupportStaffPage-c2ouJwJk.js} +3 -3
- package/dist/{SupportStaffPage-B69-kuvg.js.map → SupportStaffPage-c2ouJwJk.js.map} +1 -1
- package/dist/{SupportTicketDevLifecycleBadge-BoAjMb08.js → SupportTicketDevLifecycleBadge-BYKZjEv6.js} +1 -1
- package/dist/{SupportTicketDevLifecycleBadge-BoAjMb08.js.map → SupportTicketDevLifecycleBadge-BYKZjEv6.js.map} +1 -1
- package/dist/{SupportTicketMaintenancePage-Bptja-xb.js → SupportTicketMaintenancePage-B07avInx.js} +1 -1
- package/dist/{SupportTicketMaintenancePage-Bptja-xb.js.map → SupportTicketMaintenancePage-B07avInx.js.map} +1 -1
- package/dist/TeamAttachmentsTab-BmypKYXr.js +64 -0
- package/dist/TeamHistoryTab-BSEOYC_5.js +6 -0
- package/dist/{TeamHistoryTab-DM8KBEG1.js → TeamHistoryTab-p3hDxCc3.js} +3 -3
- package/dist/{TeamHistoryTab-DM8KBEG1.js.map → TeamHistoryTab-p3hDxCc3.js.map} +1 -1
- package/dist/{TeamList-qdwlMuJv.js → TeamList-BlwTWVnP.js} +3 -3
- package/dist/{TeamList-qdwlMuJv.js.map → TeamList-BlwTWVnP.js.map} +1 -1
- package/dist/TeamList-DlHGLlmO.js +8 -0
- package/dist/{TeamMemberList-DyI1U1t_.js → TeamMemberList-D0-dM5kI.js} +3 -3
- package/dist/{TeamMemberList-DyI1U1t_.js.map → TeamMemberList-D0-dM5kI.js.map} +1 -1
- package/dist/TeamMemberList-uwSe9zdv.js +7 -0
- package/dist/{TeamMemberParent-B63pRfI6.js → TeamMemberParent-C9OEziOK.js} +3 -3
- package/dist/{TeamMemberParent-D9Fxu7GD.js → TeamMemberParent-CJGWXjuM.js} +2 -2
- package/dist/{TeamMemberParent-D9Fxu7GD.js.map → TeamMemberParent-CJGWXjuM.js.map} +1 -1
- package/dist/{EditUserPage-C0K7EGjM.js → TeamNotesTab-BnkgZd-5.js} +2 -2
- package/dist/{TeamNotesTab-BgxleidZ.js → TeamNotesTab-DPw9YEwK.js} +2 -2
- package/dist/{TeamNotesTab-BgxleidZ.js.map → TeamNotesTab-DPw9YEwK.js.map} +1 -1
- package/dist/{TeamParent-BwXqA3rj.js → TeamParent-EPbNiMmg.js} +2 -2
- package/dist/{TeamParent-BwXqA3rj.js.map → TeamParent-EPbNiMmg.js.map} +1 -1
- package/dist/TeamParent-pt8XxZpt.js +11 -0
- package/dist/{TimelineNoteInput-DXaodm43.js → TimelineNoteInput--q4ENAgu.js} +2 -2
- package/dist/{TimelineNoteInput-DXaodm43.js.map → TimelineNoteInput--q4ENAgu.js.map} +1 -1
- package/dist/{TimelineSystemEvent-zCMUx5Zz.js → TimelineSystemEvent-Ch1sZiyO.js} +1 -1
- package/dist/{TimelineSystemEvent-zCMUx5Zz.js.map → TimelineSystemEvent-Ch1sZiyO.js.map} +1 -1
- package/dist/{UserListPage-DtA8tLff.js → UserListPage-A0_eNpQ1.js} +2 -2
- package/dist/{UserListPage-DtA8tLff.js.map → UserListPage-A0_eNpQ1.js.map} +1 -1
- package/dist/UserListPage-CjpxiETO.js +5 -0
- package/dist/{UserProfilePage-DRbCAr9H.js → UserProfilePage-BWK97ODt.js} +1 -1
- package/dist/{UserProfilePage-g4-VEDXo.js → UserProfilePage-FNLYK9kj.js} +1 -1
- package/dist/{UserProfilePage-g4-VEDXo.js.map → UserProfilePage-FNLYK9kj.js.map} +1 -1
- package/dist/{VerifyEmail-CM5ehFB8.js → VerifyEmail-CEbvnWLl.js} +2 -2
- package/dist/{VerifyEmail-CM5ehFB8.js.map → VerifyEmail-CEbvnWLl.js.map} +1 -1
- package/dist/{VerifyEmail-DMHczC9f.js → VerifyEmail-DdUKxJnk.js} +2 -2
- package/dist/{ViewTeam-DSbKV60o.js → ViewTeam-BeSKgVYp.js} +4 -4
- package/dist/{ViewTeam-DSbKV60o.js.map → ViewTeam-BeSKgVYp.js.map} +1 -1
- package/dist/ViewTeam-tBi95Q7D.js +8 -0
- package/dist/{ViewTeamMember-BB0nvPOe.js → ViewTeamMember-Cf5yXdv6.js} +4 -4
- package/dist/{ViewTeamMember-BB0nvPOe.js.map → ViewTeamMember-Cf5yXdv6.js.map} +1 -1
- package/dist/ViewTeamMember-DtQCZU-X.js +7 -0
- package/dist/{ZiniaContainer-CjVhCnGB.js → ZiniaContainer-BV6sojLa.js} +1 -1
- package/dist/{ZiniaContainer-CjVhCnGB.js.map → ZiniaContainer-BV6sojLa.js.map} +1 -1
- package/dist/{convertToLocalDateTime-BF25N4xd.js → convertToLocalDateTime-C13-PrSA.js} +1 -1
- package/dist/{convertToLocalDateTime-BF25N4xd.js.map → convertToLocalDateTime-C13-PrSA.js.map} +1 -1
- package/dist/{customerSupportTicketRoutes-C7OxGAGl.js → customerSupportTicketRoutes-aXOZjl41.js} +8 -8
- package/dist/{customerSupportTicketRoutes-C7OxGAGl.js.map → customerSupportTicketRoutes-aXOZjl41.js.map} +1 -1
- package/dist/{displayIdFormatter-B-_WQHOr.js → displayIdFormatter-Cr-QaEk1.js} +1 -1
- package/dist/{displayIdFormatter-B-_WQHOr.js.map → displayIdFormatter-Cr-QaEk1.js.map} +1 -1
- package/dist/{extractRpcErrorMessage-diUBl6Ij.js → extractRpcErrorMessage-CAaeVysa.js} +1 -1
- package/dist/{extractRpcErrorMessage-diUBl6Ij.js.map → extractRpcErrorMessage-CAaeVysa.js.map} +1 -1
- package/dist/index.d.ts +1093 -1081
- package/dist/index.js +55 -54
- package/dist/{mfaSchema-Ukqzdyck.js → mfaSchema-C6PatIbY.js} +1 -1
- package/dist/{mfaSchema-Ukqzdyck.js.map → mfaSchema-C6PatIbY.js.map} +1 -1
- package/dist/{saved_filter-CfzH0BzK.js → saved_filter-DMUiaPSP.js} +3 -3
- package/dist/{saved_filter-CfzH0BzK.js.map → saved_filter-DMUiaPSP.js.map} +1 -1
- package/dist/{signupConsentStorage-DS9vCUuC.js → signupConsentStorage-Ct4ZuKi-.js} +1 -1
- package/dist/{signupConsentStorage-DS9vCUuC.js.map → signupConsentStorage-Ct4ZuKi-.js.map} +1 -1
- package/dist/{src-DVe_0RO9.js → src-DJeB_pSK.js} +32 -31
- package/dist/src-DJeB_pSK.js.map +1 -0
- package/dist/{staffSupportTicketRoutes-CWutoQWp.js → staffSupportTicketRoutes-bHqYUfii.js} +8 -8
- package/dist/{staffSupportTicketRoutes-CWutoQWp.js.map → staffSupportTicketRoutes-bHqYUfii.js.map} +1 -1
- package/dist/{teamMemberMetadata-CQnbVepq.js → teamMemberMetadata-DX0W-B7p.js} +1 -1
- package/dist/{teamMemberMetadata-CQnbVepq.js.map → teamMemberMetadata-DX0W-B7p.js.map} +1 -1
- package/dist/{teamMetadata-DlvwO5V0.js → teamMetadata-26Mwjb2i.js} +1 -1
- package/dist/{teamMetadata-DlvwO5V0.js.map → teamMetadata-26Mwjb2i.js.map} +1 -1
- package/dist/{teamRoutes-KFgnsdDP.js → teamRoutes-CbCuofgD.js} +12 -12
- package/dist/{teamRoutes-KFgnsdDP.js.map → teamRoutes-CbCuofgD.js.map} +1 -1
- package/dist/{team_memberRoutes-Cjpw_ql6.js → team_memberRoutes-Cxgte_vj.js} +7 -7
- package/dist/{team_memberRoutes-Cjpw_ql6.js.map → team_memberRoutes-Cxgte_vj.js.map} +1 -1
- package/dist/{useEmailVerificationChannel-B51z65PN.js → useEmailVerificationChannel-QuMSgzzM.js} +1 -1
- package/dist/{useEmailVerificationChannel-B51z65PN.js.map → useEmailVerificationChannel-QuMSgzzM.js.map} +1 -1
- package/dist/{userAuthorized-C09FHWGL.js → userAuthorized-klLUHGxT.js} +5 -1
- package/dist/userAuthorized-klLUHGxT.js.map +1 -0
- package/package.json +2 -2
- package/dist/ConsentRequired-BPjsZoPY.js +0 -211
- package/dist/ConsentRequired-BPjsZoPY.js.map +0 -1
- package/dist/CreateTeamForm-DfgCaUwX.js +0 -12
- package/dist/CustomerSupportTicketList-DdACn3ug.js +0 -63
- package/dist/EditTeamForm-BE3iX2x3.js +0 -12
- package/dist/Signup-XdImA1os.js +0 -9
- package/dist/SignupConsentFlow-X3kXuviv.js.map +0 -1
- package/dist/SignupRequirementsPage-Cf-ElkEq.js.map +0 -1
- package/dist/StaffSupportTicketDetailPage-MFtm06BE.js.map +0 -1
- package/dist/StaffSupportTicketList-LfLx0pYP.js +0 -63
- package/dist/TeamAttachmentsTab-Dk3LxX3n.js +0 -63
- package/dist/TeamHistoryTab-CRONdHcL.js +0 -6
- package/dist/TeamList-DYm_vQ2z.js +0 -8
- package/dist/TeamMemberList-4LRLT_7Z.js +0 -7
- package/dist/TeamParent-CFOmyKPz.js +0 -11
- package/dist/UserListPage-Bmwg0an5.js +0 -5
- package/dist/ViewTeam-CXyABxE6.js +0 -8
- package/dist/ViewTeamMember-jrOnBaDh.js +0 -7
- package/dist/src-DVe_0RO9.js.map +0 -1
- package/dist/userAuthorized-C09FHWGL.js.map +0 -1
- /package/dist/{Appearance-Ch4zfWZ3.js → Appearance-CHCv4Fd1.js} +0 -0
- /package/dist/{TeamMembersTab-BGcdyEE8.js → TeamMembersTab-CeOJAhhR.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserListPage-
|
|
1
|
+
{"version":3,"file":"UserListPage-A0_eNpQ1.js","names":["mappedUsers: UserRow[]"],"sources":["../src/slices/admin/components/UserTypeBadge.vue","../src/slices/admin/features/user_management/userRowSchema.ts","../src/slices/admin/features/user_management/UserListPage.vue"],"sourcesContent":["<template>\n <span class=\"badge badge-sm\" :class=\"badgeClasses\">\n {{ typeLabel }}\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ninterface Props {\n userType: 'consumer' | 'lead' | 'staff' | 'super_admin';\n size?: 'xs' | 'sm' | 'md' | 'lg';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'sm',\n});\n\nconst typeConfig = {\n consumer: {\n label: 'Consumer',\n variant: 'neutral',\n },\n lead: {\n label: 'Lead',\n variant: 'info',\n },\n staff: {\n label: 'Staff',\n variant: 'warning',\n },\n super_admin: {\n label: 'Admin',\n variant: 'error',\n },\n};\n\nconst typeLabel = computed(() => {\n return typeConfig[props.userType]?.label || props.userType;\n});\n\nconst badgeClasses = computed(() => {\n const config = typeConfig[props.userType];\n const baseClasses = `badge-${props.size}`;\n\n if (!config) {\n return `${baseClasses} badge-neutral`;\n }\n\n return `${baseClasses} badge-${config.variant}`;\n});\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { UserReadSchema } from '@dragonmastery/dragoncore-shared';\nimport type { z } from 'zod';\n\nexport const userRowSchemaWithMetadata = withMetadata(UserReadSchema, 'userRowSchema', {\n username: { label: 'Username' },\n email: { label: 'Email' },\n user_type: { label: 'Role' },\n email_verified: { label: 'Verified' },\n created_at: { label: 'Created' },\n});\n\nexport type UserRow = z.infer<typeof UserReadSchema>;\n","<template>\n <div class=\"mt-2\">\n <!-- Header with title and actions -->\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">User Management</h1>\n </div>\n\n <!-- Zinia Data Table -->\n <ZiniaDataTable>\n <!-- Custom cell templates -->\n <template #cell-user_type=\"{ row }\">\n <UserTypeBadge :user-type=\"row.user_type\" />\n </template>\n\n <template #cell-email_verified=\"{ row }\">\n <span\n class=\"badge badge-sm\"\n :class=\"row.email_verified ? 'badge-success' : 'badge-error'\"\n >\n {{ row.email_verified ? 'Verified' : 'Not Verified' }}\n </span>\n </template>\n\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n\n <template #cell-actions=\"{ row }\">\n <router-link\n :to=\"{ name: 'EditUser', params: { id: row.id } }\"\n class=\"btn btn-sm btn-primary\"\n >\n Edit\n </router-link>\n </template>\n </ZiniaDataTable>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { executeWithAuth } from '../../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../../../utils/convertToLocalDateTime';\nimport { useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport UserTypeBadge from '../../components/UserTypeBadge.vue';\nimport { userRowSchemaWithMetadata, type UserRow } from './userRowSchema';\n\n// Set up data table\nconst { ZiniaDataTable } = useCursorDataTable(userRowSchemaWithMetadata, {\n fetchData: async () => {\n const users = await executeWithAuth(\n async (api) => {\n return await api.users.listUsers();\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n // Map response to UserRow format\n const mappedUsers: UserRow[] = users.map((user) => ({\n id: user.id,\n username: user.username,\n email: user.email,\n email_verified: user.email_verified,\n user_type: user.user_type,\n created_at: user.created_at,\n updated_at: user.updated_at ?? null,\n }));\n\n return {\n data: mappedUsers,\n hasNextPage: false,\n hasPreviousPage: false,\n prevPageCursor: undefined,\n nextPageCursor: undefined,\n };\n },\n\n // Column configuration\n columns: {\n username: { label: 'Username', field: 'username', sortable: true },\n email: { label: 'Email', field: 'email', sortable: true },\n user_type: { label: 'Role', field: 'user_type', sortable: true },\n email_verified: {\n label: 'Verified',\n field: 'email_verified',\n sortable: true,\n },\n created_at: { label: 'Created', field: 'created_at', sortable: true },\n },\n\n // Action buttons\n actions: {\n items: [\n {\n key: 'edit',\n icon: 'edit',\n size: 'xs',\n variant: 'primary',\n type: 'link',\n href: (row: UserRow) => `/admin/users/${row.id}/edit`,\n },\n ],\n },\n\n pagination: {\n pageSize: 100,\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 "./useQuery-BzUGEOj0.js";
|
|
6
|
-
import { t as UserProfilePage_default } from "./UserProfilePage-
|
|
6
|
+
import { t as UserProfilePage_default } from "./UserProfilePage-FNLYK9kj.js";
|
|
7
7
|
|
|
8
8
|
export { UserProfilePage_default as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserProfilePage-g4-VEDXo.js","names":[],"sources":["../src/slices/user/features/user_profile/userProfileSchema.ts","../src/slices/user/features/user_profile/UserProfilePage.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { UserProfileBaseSchema, UserProfileUpdateSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type UserProfileForm = z.infer<typeof UserProfileBaseSchema>;\n\n// Enhance the schema with metadata\nexport const userProfileSchemaWithMetadata = withMetadata(\n UserProfileUpdateSchema,\n 'userProfileSchema',\n {\n first_name: {\n inputType: 'text',\n placeholder: 'Enter first name',\n helpText: 'Enter the first name',\n autocomplete: 'first-name',\n autofocus: true,\n },\n\n last_name: {\n inputType: 'text',\n placeholder: 'Enter last name',\n helpText: 'Enter the last name',\n autocomplete: 'last-name',\n },\n\n bio: {\n inputType: 'textarea',\n placeholder: 'Enter bio',\n helpText: 'Enter a short bio',\n },\n },\n);\n","<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 <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 <div v-else 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\">Update User Profile</h1>\n\n <!-- Email & verification status -->\n <div v-if=\"session.userSession?.user.email\" class=\"mb-6 p-4 rounded-lg bg-base-300\">\n <div class=\"flex items-center justify-between gap-2\">\n <div>\n <p class=\"text-sm text-base-content/70\">Email</p>\n <p class=\"font-medium\">{{ session.userSession.user.email }}</p>\n <p\n v-if=\"emailVerificationMode !== 'disabled'\"\n class=\"text-sm mt-1\"\n :class=\"session.userSession.user.email_verified ? 'text-success' : 'text-warning'\"\n >\n {{ session.userSession.user.email_verified ? 'Verified' : 'Not verified' }}\n </p>\n </div>\n <button\n v-if=\"\n emailVerificationMode !== 'disabled' &&\n !session.userSession.user.email_verified\n \"\n type=\"button\"\n class=\"btn btn-outline btn-sm\"\n :disabled=\"resendLoading\"\n @click=\"resendVerification\"\n >\n {{ resendLoading ? 'Sending...' : 'Resend verification' }}\n </button>\n </div>\n </div>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.FirstNameField />\n <zinia.LastNameField />\n <zinia.BioField />\n\n <ZiniaSubmitButton submitText=\"Update\" submittingText=\"Updating...\" />\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport type { EmailVerificationApi } from '@dragonmastery/dragoncore-shared';\nimport type { UserProfileUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { userProfileSchemaWithMetadata } from './userProfileSchema';\n\n//user session\nconst session = useUserSessionStore();\nconst { emailVerificationMode } = useEnv();\nconst resendLoading = ref(false);\n\nconst { mutate: resendMutate } = useMutation(\n (api, _input?: unknown) => {\n const verifyEmail = (api as DragoncoreApi).verifyEmail;\n if (!verifyEmail) throw new Error('Email verification is not configured');\n return (verifyEmail as EmailVerificationApi).resendVerificationEmail();\n },\n { skipAuthCheck: false },\n);\n\nconst resendVerification = async () => {\n try {\n resendLoading.value = true;\n const result = await resendMutate(undefined);\n if (result?.ok) {\n toast.success('Verification email sent. Please check your inbox.');\n await session.refreshToken();\n } else {\n toast.error('Failed to resend verification email.');\n }\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Failed to resend');\n } finally {\n resendLoading.value = false;\n }\n};\n\n// fetch user profile data\nconst { data: userProfileData, loading: userProfileFetching } = useQuery(\n (api) => api.userProfiles.getCurrentUserProfile(),\n {\n enabled: !!session.userSession?.user.userId,\n staleTime: 5 * 60 * 1000,\n },\n);\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(userProfileSchemaWithMetadata, {\n storeName: 'user-profile-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n while (userProfileFetching.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n if (!userProfileData.value) {\n return {\n user_id: session.userSession?.user.userId || '',\n bio: '',\n first_name: '',\n last_name: '',\n };\n }\n\n return {\n user_id: userProfileData.value.user_id,\n bio: userProfileData.value.bio || '',\n first_name: userProfileData.value.first_name || '',\n last_name: userProfileData.value.last_name || '',\n };\n },\n});\n\nconst { mutate: updateUserProfile } = useMutation(\n (api, input: UserProfileUpdateDto) => api.userProfiles.updateUserProfile(input),\n { invalidate: /^user:profile/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: UserProfileUpdateDto) => {\n if (!session.userSession?.user.userId) {\n throw new Error('User session not found');\n }\n\n const result = await updateUserProfile({\n user_id: session.userSession?.user.userId,\n first_name: data.first_name,\n last_name: data.last_name,\n bio: data.bio,\n });\n if (!result) throw new Error('Update user profile failed');\n\n return result;\n};\n\n// Handle success\nconst handleSuccess = (_data: any) => {\n toast.success('User profile updated successfully!');\n};\n\n// Handle error\nconst handleError = (error: any) => {\n toast.error(error.message || 'Update user profile failed');\n};\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserProfilePage-FNLYK9kj.js","names":[],"sources":["../src/slices/user/features/user_profile/userProfileSchema.ts","../src/slices/user/features/user_profile/UserProfilePage.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { UserProfileBaseSchema, UserProfileUpdateSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type UserProfileForm = z.infer<typeof UserProfileBaseSchema>;\n\n// Enhance the schema with metadata\nexport const userProfileSchemaWithMetadata = withMetadata(\n UserProfileUpdateSchema,\n 'userProfileSchema',\n {\n first_name: {\n inputType: 'text',\n placeholder: 'Enter first name',\n helpText: 'Enter the first name',\n autocomplete: 'first-name',\n autofocus: true,\n },\n\n last_name: {\n inputType: 'text',\n placeholder: 'Enter last name',\n helpText: 'Enter the last name',\n autocomplete: 'last-name',\n },\n\n bio: {\n inputType: 'textarea',\n placeholder: 'Enter bio',\n helpText: 'Enter a short bio',\n },\n },\n);\n","<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 <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 <div v-else 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\">Update User Profile</h1>\n\n <!-- Email & verification status -->\n <div v-if=\"session.userSession?.user.email\" class=\"mb-6 p-4 rounded-lg bg-base-300\">\n <div class=\"flex items-center justify-between gap-2\">\n <div>\n <p class=\"text-sm text-base-content/70\">Email</p>\n <p class=\"font-medium\">{{ session.userSession.user.email }}</p>\n <p\n v-if=\"emailVerificationMode !== 'disabled'\"\n class=\"text-sm mt-1\"\n :class=\"session.userSession.user.email_verified ? 'text-success' : 'text-warning'\"\n >\n {{ session.userSession.user.email_verified ? 'Verified' : 'Not verified' }}\n </p>\n </div>\n <button\n v-if=\"\n emailVerificationMode !== 'disabled' &&\n !session.userSession.user.email_verified\n \"\n type=\"button\"\n class=\"btn btn-outline btn-sm\"\n :disabled=\"resendLoading\"\n @click=\"resendVerification\"\n >\n {{ resendLoading ? 'Sending...' : 'Resend verification' }}\n </button>\n </div>\n </div>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.FirstNameField />\n <zinia.LastNameField />\n <zinia.BioField />\n\n <ZiniaSubmitButton submitText=\"Update\" submittingText=\"Updating...\" />\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport type { EmailVerificationApi } from '@dragonmastery/dragoncore-shared';\nimport type { UserProfileUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { ref } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { userProfileSchemaWithMetadata } from './userProfileSchema';\n\n//user session\nconst session = useUserSessionStore();\nconst { emailVerificationMode } = useEnv();\nconst resendLoading = ref(false);\n\nconst { mutate: resendMutate } = useMutation(\n (api, _input?: unknown) => {\n const verifyEmail = (api as DragoncoreApi).verifyEmail;\n if (!verifyEmail) throw new Error('Email verification is not configured');\n return (verifyEmail as EmailVerificationApi).resendVerificationEmail();\n },\n { skipAuthCheck: false },\n);\n\nconst resendVerification = async () => {\n try {\n resendLoading.value = true;\n const result = await resendMutate(undefined);\n if (result?.ok) {\n toast.success('Verification email sent. Please check your inbox.');\n await session.refreshToken();\n } else {\n toast.error('Failed to resend verification email.');\n }\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Failed to resend');\n } finally {\n resendLoading.value = false;\n }\n};\n\n// fetch user profile data\nconst { data: userProfileData, loading: userProfileFetching } = useQuery(\n (api) => api.userProfiles.getCurrentUserProfile(),\n {\n enabled: !!session.userSession?.user.userId,\n staleTime: 5 * 60 * 1000,\n },\n);\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(userProfileSchemaWithMetadata, {\n storeName: 'user-profile-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n while (userProfileFetching.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n if (!userProfileData.value) {\n return {\n user_id: session.userSession?.user.userId || '',\n bio: '',\n first_name: '',\n last_name: '',\n };\n }\n\n return {\n user_id: userProfileData.value.user_id,\n bio: userProfileData.value.bio || '',\n first_name: userProfileData.value.first_name || '',\n last_name: userProfileData.value.last_name || '',\n };\n },\n});\n\nconst { mutate: updateUserProfile } = useMutation(\n (api, input: UserProfileUpdateDto) => api.userProfiles.updateUserProfile(input),\n { invalidate: /^user:profile/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: UserProfileUpdateDto) => {\n if (!session.userSession?.user.userId) {\n throw new Error('User session not found');\n }\n\n const result = await updateUserProfile({\n user_id: session.userSession?.user.userId,\n first_name: data.first_name,\n last_name: data.last_name,\n bio: data.bio,\n });\n if (!result) throw new Error('Update user profile failed');\n\n return result;\n};\n\n// Handle success\nconst handleSuccess = (_data: any) => {\n toast.success('User profile updated successfully!');\n};\n\n// Handle error\nconst handleError = (error: any) => {\n toast.error(error.message || 'Update user profile failed');\n};\n</script>\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { t as useMutation } from "./useMutation-BLNuJoYl.js";
|
|
|
3
3
|
import { t as useQuery } from "./useQuery-BzUGEOj0.js";
|
|
4
4
|
import { t as AppLink_default } from "./AppLink-FcNGKgvG.js";
|
|
5
5
|
import { o as withReturnUrl, r as getValidReturnUrl, t as getAndClearEmailVerificationReturnUrl } from "./useReturnUrl-B5V3SJf5.js";
|
|
6
|
-
import { t as useEmailVerificationChannel } from "./useEmailVerificationChannel-
|
|
6
|
+
import { t as useEmailVerificationChannel } from "./useEmailVerificationChannel-QuMSgzzM.js";
|
|
7
7
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, onUnmounted, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
|
|
8
8
|
import { useRoute, useRouter } from "vue-router";
|
|
9
9
|
import { toast } from "vue3-toastify";
|
|
@@ -254,4 +254,4 @@ var VerifyEmail_default = _sfc_main;
|
|
|
254
254
|
|
|
255
255
|
//#endregion
|
|
256
256
|
export { VerifyEmail_default as t };
|
|
257
|
-
//# sourceMappingURL=VerifyEmail-
|
|
257
|
+
//# sourceMappingURL=VerifyEmail-CEbvnWLl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VerifyEmail-CM5ehFB8.js","names":["resendCountdownInterval: ReturnType<typeof setInterval> | null"],"sources":["../src/slices/auth/features/verify_email/VerifyEmail.vue"],"sourcesContent":["<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <div class=\"text-center\">\n <!-- State A: No token (after signup, waiting for email) -->\n <div v-if=\"!token && status !== 'loading' && status !== 'success'\" class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold\">Check your email</h3>\n <p class=\"text-sm text-base-content/70 text-left\">\n We've sent a verification email to your inbox. It may take a couple of minutes to\n arrive. Be sure to check your junk or spam folder if you don't see it.\n </p>\n <p class=\"text-sm text-base-content/70 text-left\">\n When you receive the email, click the link inside. You'll land on a page where you\n need to click the \"Verify email\" button to complete verification.\n </p>\n <p\n v-if=\"emailVerificationMode === 'strict'\"\n class=\"text-sm text-base-content/80 text-left font-medium\"\n >\n Application access is restricted until email verification is completed.\n </p>\n <div class=\"flex flex-col gap-2 items-center pt-2\">\n <AppLink\n v-if=\"emailVerificationMode !== 'strict'\"\n :to=\"appLink\"\n class=\"btn btn-outline btn-sm\"\n >\n Continue to app\n </AppLink>\n <button\n v-if=\"isLoggedIn && verifyEmailApi\"\n type=\"button\"\n class=\"btn btn-outline btn-sm\"\n :disabled=\"resendLoading || resendCountdown > 0\"\n @click=\"resendVerification\"\n >\n {{\n resendLoading\n ? 'Sending...'\n : resendCountdown > 0\n ? `Try again in ${resendCountdown}`\n : 'Resend verification email'\n }}\n </button>\n </div>\n </div>\n\n <!-- State B: Token present, waiting for user to click verify -->\n <div\n v-else-if=\"token && status !== 'loading' && status !== 'success' && status !== 'error'\"\n class=\"space-y-4\"\n >\n <h3 class=\"text-lg font-semibold\">Verify your email</h3>\n <p class=\"text-sm text-base-content/70\">\n Click the button below to complete verification. You'll be redirected once it's done.\n </p>\n <p\n v-if=\"emailVerificationMode === 'strict'\"\n class=\"text-sm text-base-content/80 font-medium\"\n >\n Application access is restricted until email verification is completed.\n </p>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n :disabled=\"verifyLoading\"\n @click=\"handleVerify\"\n >\n {{ verifyLoading ? 'Verifying...' : 'Verify email' }}\n </button>\n </div>\n\n <!-- Loading (after clicking verify) -->\n <div v-else-if=\"status === 'loading'\" class=\"space-y-4\">\n <span class=\"loading loading-spinner loading-lg text-primary\"></span>\n <p class=\"text-sm text-base-content/70\">Verifying your email...</p>\n </div>\n\n <!-- Success -->\n <div v-else-if=\"status === 'success'\" class=\"space-y-4\">\n <div\n class=\"w-14 h-14 rounded-full bg-success/20 flex items-center justify-center mx-auto\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-7 h-7 text-success\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold\">Email verified!</h3>\n <p v-if=\"redirectTarget\" class=\"text-sm text-base-content/70\">Redirecting you...</p>\n <p v-else class=\"text-sm text-base-content/70\">\n Your email has been verified. Switch back to your other tab to continue, or\n <AppLink :to=\"appLink\" class=\"link link-primary\">continue to the app</AppLink>.\n </p>\n <p v-if=\"redirectTarget\" class=\"text-sm text-base-content/60\">\n If you aren't redirected automatically,\n <AppLink :to=\"redirectTarget\" class=\"link link-primary\">click here</AppLink>.\n </p>\n </div>\n\n <!-- Error -->\n <div v-else class=\"space-y-4\">\n <div\n class=\"w-14 h-14 rounded-full bg-error/20 flex items-center justify-center mx-auto\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-7 h-7 text-error\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold\">Verification failed</h3>\n <p class=\"text-sm text-base-content/70\">{{ errorMessage }}</p>\n <div class=\"flex flex-col gap-2 items-center\">\n <AppLink :to=\"loginLink\" class=\"btn btn-outline btn-sm\">Back to login</AppLink>\n <button\n v-if=\"verifyEmailApi\"\n type=\"button\"\n class=\"btn btn-outline btn-sm\"\n :disabled=\"resendLoading || resendCountdown > 0\"\n @click=\"resendVerification\"\n >\n {{\n resendLoading\n ? 'Sending...'\n : resendCountdown > 0\n ? `Try again in ${resendCountdown}`\n : 'Resend verification email'\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { DragoncoreApi, EmailVerificationApi } from '@dragonmastery/dragoncore-shared';\nimport { computed, onUnmounted, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport {\n getAndClearEmailVerificationReturnUrl,\n getValidReturnUrl,\n withReturnUrl,\n} from '../../../../utils/useReturnUrl';\nimport { useEmailVerificationChannel } from '../../useEmailVerificationChannel';\n\nconst AUTH_CHANNEL = 'auth';\n\nconst route = useRoute();\nconst router = useRouter();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst appLink = computed(() => getValidReturnUrl(route, '/'));\nconst sessionStore = useUserSessionStore();\nconst { emailVerificationMode } = useEnv();\n\n// Support token from query (?token=xxx) or params (/verify-email/:token)\nconst token = (route.query.token ?? route.params.token) as string;\n\nconst status = ref<'idle' | 'loading' | 'success' | 'error'>('idle');\nconst errorMessage = ref('');\nconst verifyEmailApi = ref(false);\nconst resendLoading = ref(false);\nconst resendCountdown = ref(0);\nlet resendCountdownInterval: ReturnType<typeof setInterval> | null = null;\nconst verifyLoading = ref(false);\nconst redirectTarget = ref<string | null>(null);\n\nconst isLoggedIn = computed(() => !!sessionStore.userSession?.user.userId);\n\n// When on \"Check your email\" (no token), listen for verification in another tab\nconst isAwaitingVerification = computed(\n () => !token && status.value !== 'loading' && status.value !== 'success',\n);\nuseEmailVerificationChannel(\n isAwaitingVerification,\n (targetUrl) => router.push(targetUrl),\n () => getValidReturnUrl(route, '/'),\n);\n\nconst { mutate: verifyMutate } = useMutation(\n (api, tokenToVerify: string) => {\n const verifyEmail = (api as DragoncoreApi).verifyEmail;\n if (!verifyEmail) throw new Error('Email verification is not configured');\n return (verifyEmail as EmailVerificationApi).verifyEmail(tokenToVerify);\n },\n { skipAuthCheck: true, credentials: 'include' },\n);\n\nconst { mutate: resendMutate } = useMutation(\n (api, _input?: unknown) => {\n const verifyEmail = (api as DragoncoreApi).verifyEmail;\n if (!verifyEmail) throw new Error('Email verification is not configured');\n return (verifyEmail as EmailVerificationApi).resendVerificationEmail();\n },\n { skipAuthCheck: false },\n);\n\nasync function handleVerify() {\n if (!token) return;\n\n if (emailVerificationMode === 'disabled') {\n status.value = 'error';\n errorMessage.value = 'Email verification is not enabled for this application.';\n return;\n }\n\n try {\n status.value = 'loading';\n verifyLoading.value = true;\n errorMessage.value = '';\n const result = await verifyMutate(token);\n verifyEmailApi.value = true;\n if (result?.ok) {\n status.value = 'success';\n const hadSession = !!(\n result.session?.access_token && result.session?.user_details_token\n );\n if (hadSession) {\n sessionStore.setSession(result.session!.user_details_token);\n sessionStore.setAccessToken(result.session!.access_token);\n } else {\n try {\n await sessionStore.refreshToken();\n } catch {\n // User may need to log in again; that's ok\n }\n }\n const channel = new BroadcastChannel(AUTH_CHANNEL);\n channel.postMessage({ type: 'email_verified' });\n channel.close();\n const storedReturnUrl = getAndClearEmailVerificationReturnUrl();\n const target = storedReturnUrl ?? (hadSession ? '/' : null);\n if (target) {\n redirectTarget.value = target;\n setTimeout(() => router.push(target), 1000);\n }\n } else {\n status.value = 'error';\n errorMessage.value =\n 'The link may have expired. Please try again or resend the verification email.';\n }\n } catch (error) {\n status.value = 'error';\n errorMessage.value =\n error instanceof Error\n ? error.message\n : 'Something went wrong. The link may have expired.';\n verifyEmailApi.value = true;\n } finally {\n verifyLoading.value = false;\n }\n}\n\nfunction startResendCountdown(seconds: number) {\n if (resendCountdownInterval) {\n clearInterval(resendCountdownInterval);\n resendCountdownInterval = null;\n }\n resendCountdown.value = seconds;\n resendCountdownInterval = setInterval(() => {\n resendCountdown.value = Math.max(0, resendCountdown.value - 1);\n if (resendCountdown.value <= 0 && resendCountdownInterval) {\n clearInterval(resendCountdownInterval);\n resendCountdownInterval = null;\n }\n }, 1000);\n}\n\nconst resendVerification = async () => {\n try {\n resendLoading.value = true;\n const result = await resendMutate(undefined);\n if (result?.ok) {\n if (result.sent) {\n toast.success('Verification email sent. Please check your inbox.');\n startResendCountdown(60);\n } else if (result.seconds_until_next_send != null) {\n toast.info(`Please wait ${result.seconds_until_next_send} seconds before resending.`);\n startResendCountdown(result.seconds_until_next_send);\n } else {\n toast.success('Verification email sent. Please check your inbox.');\n startResendCountdown(60);\n }\n } else {\n toast.error('Failed to resend verification email.');\n }\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Failed to resend');\n } finally {\n resendLoading.value = false;\n }\n};\n\nonUnmounted(() => {\n resendCountdownInterval && clearInterval(resendCountdownInterval);\n});\n\n// Detect if verifyEmail API is available (for resend button)\nuseQuery(\n (api) => {\n verifyEmailApi.value = !!(api as DragoncoreApi).verifyEmail;\n return Promise.resolve(true);\n },\n { enabled: isLoggedIn, staleTime: 60 * 60 * 1000 },\n);\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VerifyEmail-CEbvnWLl.js","names":["resendCountdownInterval: ReturnType<typeof setInterval> | null"],"sources":["../src/slices/auth/features/verify_email/VerifyEmail.vue"],"sourcesContent":["<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <div class=\"text-center\">\n <!-- State A: No token (after signup, waiting for email) -->\n <div v-if=\"!token && status !== 'loading' && status !== 'success'\" class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold\">Check your email</h3>\n <p class=\"text-sm text-base-content/70 text-left\">\n We've sent a verification email to your inbox. It may take a couple of minutes to\n arrive. Be sure to check your junk or spam folder if you don't see it.\n </p>\n <p class=\"text-sm text-base-content/70 text-left\">\n When you receive the email, click the link inside. You'll land on a page where you\n need to click the \"Verify email\" button to complete verification.\n </p>\n <p\n v-if=\"emailVerificationMode === 'strict'\"\n class=\"text-sm text-base-content/80 text-left font-medium\"\n >\n Application access is restricted until email verification is completed.\n </p>\n <div class=\"flex flex-col gap-2 items-center pt-2\">\n <AppLink\n v-if=\"emailVerificationMode !== 'strict'\"\n :to=\"appLink\"\n class=\"btn btn-outline btn-sm\"\n >\n Continue to app\n </AppLink>\n <button\n v-if=\"isLoggedIn && verifyEmailApi\"\n type=\"button\"\n class=\"btn btn-outline btn-sm\"\n :disabled=\"resendLoading || resendCountdown > 0\"\n @click=\"resendVerification\"\n >\n {{\n resendLoading\n ? 'Sending...'\n : resendCountdown > 0\n ? `Try again in ${resendCountdown}`\n : 'Resend verification email'\n }}\n </button>\n </div>\n </div>\n\n <!-- State B: Token present, waiting for user to click verify -->\n <div\n v-else-if=\"token && status !== 'loading' && status !== 'success' && status !== 'error'\"\n class=\"space-y-4\"\n >\n <h3 class=\"text-lg font-semibold\">Verify your email</h3>\n <p class=\"text-sm text-base-content/70\">\n Click the button below to complete verification. You'll be redirected once it's done.\n </p>\n <p\n v-if=\"emailVerificationMode === 'strict'\"\n class=\"text-sm text-base-content/80 font-medium\"\n >\n Application access is restricted until email verification is completed.\n </p>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n :disabled=\"verifyLoading\"\n @click=\"handleVerify\"\n >\n {{ verifyLoading ? 'Verifying...' : 'Verify email' }}\n </button>\n </div>\n\n <!-- Loading (after clicking verify) -->\n <div v-else-if=\"status === 'loading'\" class=\"space-y-4\">\n <span class=\"loading loading-spinner loading-lg text-primary\"></span>\n <p class=\"text-sm text-base-content/70\">Verifying your email...</p>\n </div>\n\n <!-- Success -->\n <div v-else-if=\"status === 'success'\" class=\"space-y-4\">\n <div\n class=\"w-14 h-14 rounded-full bg-success/20 flex items-center justify-center mx-auto\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-7 h-7 text-success\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold\">Email verified!</h3>\n <p v-if=\"redirectTarget\" class=\"text-sm text-base-content/70\">Redirecting you...</p>\n <p v-else class=\"text-sm text-base-content/70\">\n Your email has been verified. Switch back to your other tab to continue, or\n <AppLink :to=\"appLink\" class=\"link link-primary\">continue to the app</AppLink>.\n </p>\n <p v-if=\"redirectTarget\" class=\"text-sm text-base-content/60\">\n If you aren't redirected automatically,\n <AppLink :to=\"redirectTarget\" class=\"link link-primary\">click here</AppLink>.\n </p>\n </div>\n\n <!-- Error -->\n <div v-else class=\"space-y-4\">\n <div\n class=\"w-14 h-14 rounded-full bg-error/20 flex items-center justify-center mx-auto\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-7 h-7 text-error\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold\">Verification failed</h3>\n <p class=\"text-sm text-base-content/70\">{{ errorMessage }}</p>\n <div class=\"flex flex-col gap-2 items-center\">\n <AppLink :to=\"loginLink\" class=\"btn btn-outline btn-sm\">Back to login</AppLink>\n <button\n v-if=\"verifyEmailApi\"\n type=\"button\"\n class=\"btn btn-outline btn-sm\"\n :disabled=\"resendLoading || resendCountdown > 0\"\n @click=\"resendVerification\"\n >\n {{\n resendLoading\n ? 'Sending...'\n : resendCountdown > 0\n ? `Try again in ${resendCountdown}`\n : 'Resend verification email'\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { DragoncoreApi, EmailVerificationApi } from '@dragonmastery/dragoncore-shared';\nimport { computed, onUnmounted, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport {\n getAndClearEmailVerificationReturnUrl,\n getValidReturnUrl,\n withReturnUrl,\n} from '../../../../utils/useReturnUrl';\nimport { useEmailVerificationChannel } from '../../useEmailVerificationChannel';\n\nconst AUTH_CHANNEL = 'auth';\n\nconst route = useRoute();\nconst router = useRouter();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst appLink = computed(() => getValidReturnUrl(route, '/'));\nconst sessionStore = useUserSessionStore();\nconst { emailVerificationMode } = useEnv();\n\n// Support token from query (?token=xxx) or params (/verify-email/:token)\nconst token = (route.query.token ?? route.params.token) as string;\n\nconst status = ref<'idle' | 'loading' | 'success' | 'error'>('idle');\nconst errorMessage = ref('');\nconst verifyEmailApi = ref(false);\nconst resendLoading = ref(false);\nconst resendCountdown = ref(0);\nlet resendCountdownInterval: ReturnType<typeof setInterval> | null = null;\nconst verifyLoading = ref(false);\nconst redirectTarget = ref<string | null>(null);\n\nconst isLoggedIn = computed(() => !!sessionStore.userSession?.user.userId);\n\n// When on \"Check your email\" (no token), listen for verification in another tab\nconst isAwaitingVerification = computed(\n () => !token && status.value !== 'loading' && status.value !== 'success',\n);\nuseEmailVerificationChannel(\n isAwaitingVerification,\n (targetUrl) => router.push(targetUrl),\n () => getValidReturnUrl(route, '/'),\n);\n\nconst { mutate: verifyMutate } = useMutation(\n (api, tokenToVerify: string) => {\n const verifyEmail = (api as DragoncoreApi).verifyEmail;\n if (!verifyEmail) throw new Error('Email verification is not configured');\n return (verifyEmail as EmailVerificationApi).verifyEmail(tokenToVerify);\n },\n { skipAuthCheck: true, credentials: 'include' },\n);\n\nconst { mutate: resendMutate } = useMutation(\n (api, _input?: unknown) => {\n const verifyEmail = (api as DragoncoreApi).verifyEmail;\n if (!verifyEmail) throw new Error('Email verification is not configured');\n return (verifyEmail as EmailVerificationApi).resendVerificationEmail();\n },\n { skipAuthCheck: false },\n);\n\nasync function handleVerify() {\n if (!token) return;\n\n if (emailVerificationMode === 'disabled') {\n status.value = 'error';\n errorMessage.value = 'Email verification is not enabled for this application.';\n return;\n }\n\n try {\n status.value = 'loading';\n verifyLoading.value = true;\n errorMessage.value = '';\n const result = await verifyMutate(token);\n verifyEmailApi.value = true;\n if (result?.ok) {\n status.value = 'success';\n const hadSession = !!(\n result.session?.access_token && result.session?.user_details_token\n );\n if (hadSession) {\n sessionStore.setSession(result.session!.user_details_token);\n sessionStore.setAccessToken(result.session!.access_token);\n } else {\n try {\n await sessionStore.refreshToken();\n } catch {\n // User may need to log in again; that's ok\n }\n }\n const channel = new BroadcastChannel(AUTH_CHANNEL);\n channel.postMessage({ type: 'email_verified' });\n channel.close();\n const storedReturnUrl = getAndClearEmailVerificationReturnUrl();\n const target = storedReturnUrl ?? (hadSession ? '/' : null);\n if (target) {\n redirectTarget.value = target;\n setTimeout(() => router.push(target), 1000);\n }\n } else {\n status.value = 'error';\n errorMessage.value =\n 'The link may have expired. Please try again or resend the verification email.';\n }\n } catch (error) {\n status.value = 'error';\n errorMessage.value =\n error instanceof Error\n ? error.message\n : 'Something went wrong. The link may have expired.';\n verifyEmailApi.value = true;\n } finally {\n verifyLoading.value = false;\n }\n}\n\nfunction startResendCountdown(seconds: number) {\n if (resendCountdownInterval) {\n clearInterval(resendCountdownInterval);\n resendCountdownInterval = null;\n }\n resendCountdown.value = seconds;\n resendCountdownInterval = setInterval(() => {\n resendCountdown.value = Math.max(0, resendCountdown.value - 1);\n if (resendCountdown.value <= 0 && resendCountdownInterval) {\n clearInterval(resendCountdownInterval);\n resendCountdownInterval = null;\n }\n }, 1000);\n}\n\nconst resendVerification = async () => {\n try {\n resendLoading.value = true;\n const result = await resendMutate(undefined);\n if (result?.ok) {\n if (result.sent) {\n toast.success('Verification email sent. Please check your inbox.');\n startResendCountdown(60);\n } else if (result.seconds_until_next_send != null) {\n toast.info(`Please wait ${result.seconds_until_next_send} seconds before resending.`);\n startResendCountdown(result.seconds_until_next_send);\n } else {\n toast.success('Verification email sent. Please check your inbox.');\n startResendCountdown(60);\n }\n } else {\n toast.error('Failed to resend verification email.');\n }\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Failed to resend');\n } finally {\n resendLoading.value = false;\n }\n};\n\nonUnmounted(() => {\n resendCountdownInterval && clearInterval(resendCountdownInterval);\n});\n\n// Detect if verifyEmail API is available (for resend button)\nuseQuery(\n (api) => {\n verifyEmailApi.value = !!(api as DragoncoreApi).verifyEmail;\n return Promise.resolve(true);\n },\n { enabled: isLoggedIn, staleTime: 60 * 60 * 1000 },\n);\n</script>\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import "./useQueryCache-alzaRWEb.js";
|
|
|
4
4
|
import "./useMutation-BLNuJoYl.js";
|
|
5
5
|
import "./useQuery-BzUGEOj0.js";
|
|
6
6
|
import "./AppLink-FcNGKgvG.js";
|
|
7
|
-
import "./useEmailVerificationChannel-
|
|
8
|
-
import { t as VerifyEmail_default } from "./VerifyEmail-
|
|
7
|
+
import "./useEmailVerificationChannel-QuMSgzzM.js";
|
|
8
|
+
import { t as VerifyEmail_default } from "./VerifyEmail-CEbvnWLl.js";
|
|
9
9
|
|
|
10
10
|
export { VerifyEmail_default as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as ZiniaContainer_default } from "./ZiniaContainer-
|
|
2
|
-
import { t as formatSystemTimestamp } from "./convertToLocalDateTime-
|
|
3
|
-
import { t as teamPaths } from "./teamRoutes-
|
|
1
|
+
import { t as ZiniaContainer_default } from "./ZiniaContainer-BV6sojLa.js";
|
|
2
|
+
import { t as formatSystemTimestamp } from "./convertToLocalDateTime-C13-PrSA.js";
|
|
3
|
+
import { t as teamPaths } from "./teamRoutes-CbCuofgD.js";
|
|
4
4
|
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, resolveComponent, toDisplayString, unref, withCtx } from "vue";
|
|
5
5
|
import { useRoute } from "vue-router";
|
|
6
6
|
|
|
@@ -217,4 +217,4 @@ var ViewTeam_default = _sfc_main;
|
|
|
217
217
|
|
|
218
218
|
//#endregion
|
|
219
219
|
export { ViewTeam_default as t };
|
|
220
|
-
//# sourceMappingURL=ViewTeam-
|
|
220
|
+
//# sourceMappingURL=ViewTeam-BeSKgVYp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewTeam-DSbKV60o.js","names":[],"sources":["../src/slices/team/ViewTeam.vue"],"sourcesContent":["<template>\n <div v-if=\"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=\"error\" 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>{{ error.message }}</span>\n </div>\n\n <ZiniaContainer v-else-if=\"teamData\">\n <!-- Header with Title -->\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold text-base-content break-words leading-tight\">\n {{ teamData.display_name }}\n </h1>\n <div class=\"flex flex-wrap items-center gap-2 mt-2\">\n <span class=\"badge badge-sm badge-primary\">{{ teamData.unique_name }}</span>\n <span v-if=\"teamData.archived_at\" class=\"badge badge-sm badge-error\">Archived</span>\n <span v-else class=\"badge badge-sm badge-success\">Active</span>\n </div>\n </div>\n\n <!-- Description -->\n <div v-if=\"teamData.description\" class=\"prose prose-sm sm:prose-base max-w-none mb-4\">\n <p class=\"text-base-content/80 whitespace-pre-wrap text-sm sm:text-base leading-relaxed\">\n {{ teamData.description }}\n </p>\n </div>\n\n <!-- Team Information Grid -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-6\">\n <!-- Basic Information -->\n <div v-if=\"teamData.legal_name\" class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Basic Information</h3>\n <div v-if=\"teamData.legal_name\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Legal Name:</span>\n <span class=\"ml-2\">{{ teamData.legal_name }}</span>\n </div>\n </div>\n </div>\n\n <!-- Contact Information -->\n <div\n v-if=\"\n teamData.contact_name ||\n teamData.contact_email ||\n teamData.contact_business_phone ||\n teamData.contact_mobile_phone\n \"\n class=\"card bg-base-100 shadow-sm\"\n >\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Contact Information</h3>\n <div v-if=\"teamData.contact_name\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Name:</span>\n <span class=\"ml-2\">{{ teamData.contact_name }}</span>\n </div>\n <div v-if=\"teamData.contact_email\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Email:</span>\n <a :href=\"`mailto:${teamData.contact_email}`\" class=\"ml-2 link link-primary\">\n {{ teamData.contact_email }}\n </a>\n </div>\n <div v-if=\"teamData.contact_business_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Business Phone:</span>\n <span class=\"ml-2\">{{ teamData.contact_business_phone }}</span>\n </div>\n <div v-if=\"teamData.contact_mobile_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Mobile Phone:</span>\n <span class=\"ml-2\">{{ teamData.contact_mobile_phone }}</span>\n </div>\n <div v-if=\"teamData.contact_time_zone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Time Zone:</span>\n <span class=\"ml-2\">{{ teamData.contact_time_zone }}</span>\n </div>\n </div>\n </div>\n\n <!-- Address Information -->\n <div\n v-if=\"teamData.address_full || teamData.address_city || teamData.address_zip\"\n class=\"card bg-base-100 shadow-sm\"\n >\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Address</h3>\n <div v-if=\"teamData.address_full\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Address:</span>\n <span class=\"ml-2\">{{ teamData.address_full }}</span>\n </div>\n <div v-if=\"teamData.address_city\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">City:</span>\n <span class=\"ml-2\">{{ teamData.address_city }}</span>\n </div>\n <div v-if=\"teamData.address_zip\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Zip:</span>\n <span class=\"ml-2\">{{ teamData.address_zip }}</span>\n </div>\n </div>\n </div>\n\n <!-- Web Presence -->\n <div v-if=\"teamData.twitter_username || teamData.url\" class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Web Presence</h3>\n <div v-if=\"teamData.twitter_username\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Twitter:</span>\n <span class=\"ml-2\">@{{ teamData.twitter_username }}</span>\n </div>\n <div v-if=\"teamData.url\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">URL:</span>\n <a\n :href=\"teamData.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ml-2 link link-primary\"\n >\n {{ teamData.url }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Metadata -->\n <div class=\"mt-4 pt-4 border-t border-base-300 text-xs sm:text-sm text-base-content/50\">\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-4\">\n <span v-if=\"teamData.created_by\"\n >Created by {{ teamData.created_by_display_name ?? teamData.created_by }}</span\n >\n <span v-if=\"teamData.created_at\">\n Created {{ formatSystemTimestamp(teamData.created_at) }}\n </span>\n <span\n v-if=\"teamData.updated_at && teamData.updated_at !== teamData.created_at\"\n class=\"text-xs\"\n >\n Updated {{ formatSystemTimestamp(teamData.updated_at) }}\n </span>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 justify-center mt-6\">\n <router-link\n :to=\"{\n name: teamPaths.edit.name,\n params: { id: team_id },\n }\"\n class=\"btn btn-primary\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit Team\n </router-link>\n </div>\n </ZiniaContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\nimport { useRoute } from 'vue-router';\nimport ZiniaContainer from '../../components/ui/ZiniaContainer.vue';\nimport { formatSystemTimestamp } from '../../utils/convertToLocalDateTime';\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 team_id = route.params.id as string;\n\nconst teamData = computed(() => props.team);\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ViewTeam-BeSKgVYp.js","names":[],"sources":["../src/slices/team/ViewTeam.vue"],"sourcesContent":["<template>\n <div v-if=\"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=\"error\" 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>{{ error.message }}</span>\n </div>\n\n <ZiniaContainer v-else-if=\"teamData\">\n <!-- Header with Title -->\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold text-base-content break-words leading-tight\">\n {{ teamData.display_name }}\n </h1>\n <div class=\"flex flex-wrap items-center gap-2 mt-2\">\n <span class=\"badge badge-sm badge-primary\">{{ teamData.unique_name }}</span>\n <span v-if=\"teamData.archived_at\" class=\"badge badge-sm badge-error\">Archived</span>\n <span v-else class=\"badge badge-sm badge-success\">Active</span>\n </div>\n </div>\n\n <!-- Description -->\n <div v-if=\"teamData.description\" class=\"prose prose-sm sm:prose-base max-w-none mb-4\">\n <p class=\"text-base-content/80 whitespace-pre-wrap text-sm sm:text-base leading-relaxed\">\n {{ teamData.description }}\n </p>\n </div>\n\n <!-- Team Information Grid -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-6\">\n <!-- Basic Information -->\n <div v-if=\"teamData.legal_name\" class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Basic Information</h3>\n <div v-if=\"teamData.legal_name\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Legal Name:</span>\n <span class=\"ml-2\">{{ teamData.legal_name }}</span>\n </div>\n </div>\n </div>\n\n <!-- Contact Information -->\n <div\n v-if=\"\n teamData.contact_name ||\n teamData.contact_email ||\n teamData.contact_business_phone ||\n teamData.contact_mobile_phone\n \"\n class=\"card bg-base-100 shadow-sm\"\n >\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Contact Information</h3>\n <div v-if=\"teamData.contact_name\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Name:</span>\n <span class=\"ml-2\">{{ teamData.contact_name }}</span>\n </div>\n <div v-if=\"teamData.contact_email\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Email:</span>\n <a :href=\"`mailto:${teamData.contact_email}`\" class=\"ml-2 link link-primary\">\n {{ teamData.contact_email }}\n </a>\n </div>\n <div v-if=\"teamData.contact_business_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Business Phone:</span>\n <span class=\"ml-2\">{{ teamData.contact_business_phone }}</span>\n </div>\n <div v-if=\"teamData.contact_mobile_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Mobile Phone:</span>\n <span class=\"ml-2\">{{ teamData.contact_mobile_phone }}</span>\n </div>\n <div v-if=\"teamData.contact_time_zone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Time Zone:</span>\n <span class=\"ml-2\">{{ teamData.contact_time_zone }}</span>\n </div>\n </div>\n </div>\n\n <!-- Address Information -->\n <div\n v-if=\"teamData.address_full || teamData.address_city || teamData.address_zip\"\n class=\"card bg-base-100 shadow-sm\"\n >\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Address</h3>\n <div v-if=\"teamData.address_full\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Address:</span>\n <span class=\"ml-2\">{{ teamData.address_full }}</span>\n </div>\n <div v-if=\"teamData.address_city\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">City:</span>\n <span class=\"ml-2\">{{ teamData.address_city }}</span>\n </div>\n <div v-if=\"teamData.address_zip\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Zip:</span>\n <span class=\"ml-2\">{{ teamData.address_zip }}</span>\n </div>\n </div>\n </div>\n\n <!-- Web Presence -->\n <div v-if=\"teamData.twitter_username || teamData.url\" class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Web Presence</h3>\n <div v-if=\"teamData.twitter_username\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Twitter:</span>\n <span class=\"ml-2\">@{{ teamData.twitter_username }}</span>\n </div>\n <div v-if=\"teamData.url\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">URL:</span>\n <a\n :href=\"teamData.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ml-2 link link-primary\"\n >\n {{ teamData.url }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Metadata -->\n <div class=\"mt-4 pt-4 border-t border-base-300 text-xs sm:text-sm text-base-content/50\">\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-4\">\n <span v-if=\"teamData.created_by\"\n >Created by {{ teamData.created_by_display_name ?? teamData.created_by }}</span\n >\n <span v-if=\"teamData.created_at\">\n Created {{ formatSystemTimestamp(teamData.created_at) }}\n </span>\n <span\n v-if=\"teamData.updated_at && teamData.updated_at !== teamData.created_at\"\n class=\"text-xs\"\n >\n Updated {{ formatSystemTimestamp(teamData.updated_at) }}\n </span>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 justify-center mt-6\">\n <router-link\n :to=\"{\n name: teamPaths.edit.name,\n params: { id: team_id },\n }\"\n class=\"btn btn-primary\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit Team\n </router-link>\n </div>\n </ZiniaContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\nimport { useRoute } from 'vue-router';\nimport ZiniaContainer from '../../components/ui/ZiniaContainer.vue';\nimport { formatSystemTimestamp } from '../../utils/convertToLocalDateTime';\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 team_id = route.params.id as string;\n\nconst teamData = computed(() => props.team);\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsMA,MAAM,QAAQ;EAGd,MAAM,UADQ,UAAU,CACF,OAAO;EAE7B,MAAM,WAAW,eAAe,MAAM,KAAK;;;UA1M9B,QAAA,aAAA,WAAA,EAAX,mBAEM,OAFN,YAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAGlC,QAAA,SAAA,WAAA,EAAhB,mBAeM,OAfN,YAeM,CAAA,OAAA,OAAA,OAAA,KAdJ,mBAYM,OAAA;IAXJ,OAAM;IACN,OAAM;IACN,MAAK;IACL,SAAQ;OAER,mBAKE,QAAA;IAJA,kBAAe;IACf,mBAAgB;IAChB,gBAAa;IACb,GAAE;cAGN,mBAAgC,QAAA,MAAA,gBAAvB,QAAA,MAAM,QAAO,EAAA,EAAA,CAAA,CAAA,IAGG,SAAA,SAAA,WAAA,EAA3B,YA+JiB,wBAAA,EAAA,KAAA,GAAA,EAAA;2BA9JW;KAA1B,mBAAA,sBAA0B;KAC1B,mBASM,OATN,YASM,CARJ,mBAEK,MAFL,YAEK,gBADA,SAAA,MAAS,aAAY,EAAA,EAAA,EAE1B,mBAIM,OAJN,YAIM,CAHJ,mBAA4E,QAA5E,YAA4E,gBAA9B,SAAA,MAAS,YAAW,EAAA,EAAA,EACtD,SAAA,MAAS,eAAA,WAAA,EAArB,mBAAoF,QAApF,YAAqE,WAAQ,KAAA,WAAA,EAC7E,mBAA+D,QAA/D,YAAkD,SAAM,EAAA,CAAA,CAAA,CAAA;KAI5D,mBAAA,gBAAoB;KACT,SAAA,MAAS,eAAA,WAAA,EAApB,mBAIM,OAJN,YAIM,CAHJ,mBAEI,KAFJ,aAEI,gBADC,SAAA,MAAS,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;KAI3B,mBAAA,0BAA8B;KAC9B,mBA4FM,OA5FN,aA4FM;MA3FJ,mBAAA,sBAA0B;MACf,SAAA,MAAS,cAAA,WAAA,EAApB,mBAQM,OARN,aAQM,CAPJ,mBAMM,OANN,aAMM,CAAA,OAAA,OAAA,OAAA,KALJ,mBAA4D,MAAA,EAAxD,OAAM,6BAA2B,EAAC,qBAAiB,GAAA,GAC5C,SAAA,MAAS,cAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,OAAA,OAAA,KAFJ,mBAAiE,QAAA,EAA3D,OAAM,oCAAkC,EAAC,eAAW,GAAA,GAC1D,mBAAmD,QAAnD,aAAmD,gBAA7B,SAAA,MAAS,WAAU,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAK/C,mBAAA,wBAA4B;MAET,SAAA,MAAS,gBAA0B,SAAA,MAAS,iBAA2B,SAAA,MAAS,0BAAoC,SAAA,MAAS,wBAAA,WAAA,EADhJ,mBAkCM,OAlCN,aAkCM,CAzBJ,mBAwBM,OAxBN,aAwBM;iCAvBJ,mBAA8D,MAAA,EAA1D,OAAM,6BAA2B,EAAC,uBAAmB,GAAA;OAC9C,SAAA,MAAS,gBAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,OAAA,OAAA,KAFJ,mBAA2D,QAAA,EAArD,OAAM,oCAAkC,EAAC,SAAK,GAAA,GACpD,mBAAqD,QAArD,aAAqD,gBAA/B,SAAA,MAAS,aAAY,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;OAElC,SAAA,MAAS,iBAAA,WAAA,EAApB,mBAKM,OALN,aAKM,CAAA,OAAA,OAAA,OAAA,KAJJ,mBAA4D,QAAA,EAAtD,OAAM,oCAAkC,EAAC,UAAM,GAAA,GACrD,mBAEI,KAAA;QAFA,MAAI,UAAY,SAAA,MAAS;QAAiB,OAAM;0BAC/C,SAAA,MAAS,cAAa,EAAA,GAAA,YAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;OAGlB,SAAA,MAAS,0BAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,OAAA,OAAA,KAFJ,mBAAqE,QAAA,EAA/D,OAAM,oCAAkC,EAAC,mBAAe,GAAA,GAC9D,mBAA+D,QAA/D,aAA+D,gBAAzC,SAAA,MAAS,uBAAsB,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;OAE5C,SAAA,MAAS,wBAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,OAAA,OAAA,KAFJ,mBAAmE,QAAA,EAA7D,OAAM,oCAAkC,EAAC,iBAAa,GAAA,GAC5D,mBAA6D,QAA7D,aAA6D,gBAAvC,SAAA,MAAS,qBAAoB,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;OAE1C,SAAA,MAAS,qBAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,OAAA,OAAA,KAFJ,mBAAgE,QAAA,EAA1D,OAAM,oCAAkC,EAAC,cAAU,GAAA,GACzD,mBAA0D,QAA1D,aAA0D,gBAApC,SAAA,MAAS,kBAAiB,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;;MAKtD,mBAAA,wBAA4B;MAEpB,SAAA,MAAS,gBAAgB,SAAA,MAAS,gBAAgB,SAAA,MAAS,eAAA,WAAA,EADnE,mBAmBM,OAnBN,aAmBM,CAfJ,mBAcM,OAdN,aAcM;mCAbJ,mBAAkD,MAAA,EAA9C,OAAM,6BAA2B,EAAC,WAAO,GAAA;OAClC,SAAA,MAAS,gBAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,QAAA,OAAA,MAFJ,mBAA8D,QAAA,EAAxD,OAAM,oCAAkC,EAAC,YAAQ,GAAA,GACvD,mBAAqD,QAArD,aAAqD,gBAA/B,SAAA,MAAS,aAAY,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;OAElC,SAAA,MAAS,gBAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,QAAA,OAAA,MAFJ,mBAA2D,QAAA,EAArD,OAAM,oCAAkC,EAAC,SAAK,GAAA,GACpD,mBAAqD,QAArD,aAAqD,gBAA/B,SAAA,MAAS,aAAY,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;OAElC,SAAA,MAAS,eAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,QAAA,OAAA,MAFJ,mBAA0D,QAAA,EAApD,OAAM,oCAAkC,EAAC,QAAI,GAAA,GACnD,mBAAoD,QAApD,aAAoD,gBAA9B,SAAA,MAAS,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;;MAKhD,mBAAA,iBAAqB;MACV,SAAA,MAAS,oBAAoB,SAAA,MAAS,OAAA,WAAA,EAAjD,mBAmBM,OAnBN,aAmBM,CAlBJ,mBAiBM,OAjBN,aAiBM;mCAhBJ,mBAAuD,MAAA,EAAnD,OAAM,6BAA2B,EAAC,gBAAY,GAAA;OACvC,SAAA,MAAS,oBAAA,WAAA,EAApB,mBAGM,OAHN,aAGM,CAAA,OAAA,QAAA,OAAA,MAFJ,mBAA8D,QAAA,EAAxD,OAAM,oCAAkC,EAAC,YAAQ,GAAA,GACvD,mBAA0D,QAA1D,aAAmB,MAAC,gBAAG,SAAA,MAAS,iBAAgB,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;OAEvC,SAAA,MAAS,OAAA,WAAA,EAApB,mBAUM,OAVN,aAUM,CAAA,OAAA,QAAA,OAAA,MATJ,mBAA0D,QAAA,EAApD,OAAM,oCAAkC,EAAC,QAAI,GAAA,GACnD,mBAOI,KAAA;QAND,MAAM,SAAA,MAAS;QAChB,QAAO;QACP,KAAI;QACJ,OAAM;0BAEH,SAAA,MAAS,IAAG,EAAA,GAAA,YAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;;;KAOzB,mBAAA,aAAiB;KACjB,mBAeM,OAfN,aAeM,CAdJ,mBAaM,OAbN,aAaM;MAZQ,SAAA,MAAS,cAAA,WAAA,EAArB,mBAEC,QAAA,aADE,gBAAW,gBAAG,SAAA,MAAS,2BAA2B,SAAA,MAAS,WAAU,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA;MAE5D,SAAA,MAAS,cAAA,WAAA,EAArB,mBAEO,QAAA,aAF0B,cACvB,gBAAG,MAAA,sBAAqB,CAAC,SAAA,MAAS,WAAU,CAAA,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA;MAG9C,SAAA,MAAS,cAAc,SAAA,MAAS,eAAe,SAAA,MAAS,cAAA,WAAA,EADhE,mBAKO,QALP,aAGC,cACS,gBAAG,MAAA,sBAAqB,CAAC,SAAA,MAAS,WAAU,CAAA,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA;;KAK1D,mBAAA,mBAAuB;KACvB,mBAwBM,OAxBN,aAwBM,CAvBJ,YAsBc,wBAAA;MArBX,IAAE;aAAoB,MAAA,UAAS,CAAC,KAAK;qBAA8B,MAAA,QAAO,EAAA;;MAI3E,OAAM;;6BAeA,CAAA,GAAA,OAAA,QAAA,OAAA,MAAA,CAbN,mBAaM,OAAA;OAZJ,OAAM;OACN,MAAK;OACL,SAAQ;OACR,gBAAa;OACb,QAAO;OACP,OAAM;UAEN,mBAIE,QAAA;OAHA,kBAAe;OACf,mBAAgB;OAChB,GAAE;gCAEA,eAER,GAAA,CAAA,EAAA,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "./useRpcAuth-CJtq1dqM.js";
|
|
2
|
+
import "./ZiniaContainer-BV6sojLa.js";
|
|
3
|
+
import "./userAuthorized-klLUHGxT.js";
|
|
4
|
+
import "./team_memberRoutes-Cxgte_vj.js";
|
|
5
|
+
import "./teamRoutes-CbCuofgD.js";
|
|
6
|
+
import { t as ViewTeam_default } from "./ViewTeam-BeSKgVYp.js";
|
|
7
|
+
|
|
8
|
+
export { ViewTeam_default as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as ZiniaContainer_default } from "./ZiniaContainer-
|
|
2
|
-
import { t as formatSystemTimestamp } from "./convertToLocalDateTime-
|
|
3
|
-
import { t as teamMemberPaths } from "./team_memberRoutes-
|
|
1
|
+
import { t as ZiniaContainer_default } from "./ZiniaContainer-BV6sojLa.js";
|
|
2
|
+
import { t as formatSystemTimestamp } from "./convertToLocalDateTime-C13-PrSA.js";
|
|
3
|
+
import { t as teamMemberPaths } from "./team_memberRoutes-Cxgte_vj.js";
|
|
4
4
|
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, resolveComponent, toDisplayString, unref, withCtx } from "vue";
|
|
5
5
|
import { useRoute } from "vue-router";
|
|
6
6
|
|
|
@@ -164,4 +164,4 @@ var ViewTeamMember_default = _sfc_main;
|
|
|
164
164
|
|
|
165
165
|
//#endregion
|
|
166
166
|
export { ViewTeamMember_default as t };
|
|
167
|
-
//# sourceMappingURL=ViewTeamMember-
|
|
167
|
+
//# sourceMappingURL=ViewTeamMember-Cf5yXdv6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewTeamMember-
|
|
1
|
+
{"version":3,"file":"ViewTeamMember-Cf5yXdv6.js","names":[],"sources":["../src/slices/team/team_member/ViewTeamMember.vue"],"sourcesContent":["<template>\n <div v-if=\"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=\"error\" 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>{{ error.message }}</span>\n </div>\n\n <ZiniaContainer v-else-if=\"teamMemberData\">\n <!-- Header with Title -->\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold text-base-content break-words leading-tight\">\n {{ teamMemberData.display_name || 'Team Member' }}\n </h1>\n <div class=\"flex flex-wrap items-center gap-2 mt-2\">\n <span v-if=\"teamMemberData.role\" class=\"badge badge-sm badge-primary\">{{\n teamMemberData.role\n }}</span>\n <span v-if=\"teamMemberData.deleted_at\" class=\"badge badge-sm badge-error\">\n Deleted\n </span>\n <span v-else class=\"badge badge-sm badge-success\">Active</span>\n </div>\n </div>\n\n <!-- Team Member Information Grid -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-6\">\n <!-- Contact Information -->\n <div\n v-if=\"\n teamMemberData.email_address ||\n teamMemberData.business_phone ||\n teamMemberData.mobile_phone\n \"\n class=\"card bg-base-100 shadow-sm\"\n >\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Contact Information</h3>\n <div v-if=\"teamMemberData.email_address\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Email:</span>\n <a :href=\"`mailto:${teamMemberData.email_address}`\" class=\"ml-2 link link-primary\">\n {{ teamMemberData.email_address }}\n </a>\n </div>\n <div v-if=\"teamMemberData.business_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Business Phone:</span>\n <span class=\"ml-2\">{{ teamMemberData.business_phone }}</span>\n </div>\n <div v-if=\"teamMemberData.mobile_phone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Mobile Phone:</span>\n <span class=\"ml-2\">{{ teamMemberData.mobile_phone }}</span>\n </div>\n <div v-if=\"teamMemberData.time_zone\" class=\"text-sm mt-2\">\n <span class=\"font-medium text-base-content/70\">Time Zone:</span>\n <span class=\"ml-2\">{{ teamMemberData.time_zone }}</span>\n </div>\n </div>\n </div>\n\n <!-- Web Presence -->\n <div v-if=\"teamMemberData.website_address\" class=\"card bg-base-100 shadow-sm\">\n <div class=\"card-body\">\n <h3 class=\"card-title text-base mb-3\">Web Presence</h3>\n <div v-if=\"teamMemberData.website_address\" class=\"text-sm\">\n <span class=\"font-medium text-base-content/70\">Website:</span>\n <a\n :href=\"teamMemberData.website_address\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ml-2 link link-primary\"\n >\n {{ teamMemberData.website_address }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Metadata -->\n <div class=\"mt-4 pt-4 border-t border-base-300 text-xs sm:text-sm text-base-content/50\">\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-4\">\n <span v-if=\"teamMemberData.created_by\"\n >Created by {{ teamMemberData.created_by_display_name ?? teamMemberData.created_by }}</span\n >\n <span v-if=\"teamMemberData.created_at\">\n Created {{ formatSystemTimestamp(teamMemberData.created_at) }}\n </span>\n <span\n v-if=\"\n teamMemberData.updated_at &&\n teamMemberData.updated_at !== teamMemberData.created_at\n \"\n class=\"text-xs\"\n >\n Updated {{ formatSystemTimestamp(teamMemberData.updated_at) }}\n </span>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 justify-center mt-6\">\n <router-link\n :to=\"{\n name: teamMemberPaths.edit.name,\n params: { id: team_id, member_id: member_id },\n }\"\n class=\"btn btn-primary\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit Team Member\n </router-link>\n </div>\n </ZiniaContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { formatSystemTimestamp } from '../../../utils/convertToLocalDateTime';\nimport ZiniaContainer from '../../../components/ui/ZiniaContainer.vue';\nimport type { TeamMemberReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { teamMemberPaths } from './team_memberRoutes';\n\ninterface Props {\n teamMember: TeamMemberReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst team_id = route.params.id as string;\nconst member_id = route.params.member_id as string;\n\nconst teamMemberData = computed(() => props.teamMember);\n</script>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import "./useRpcAuth-CJtq1dqM.js";
|
|
2
|
+
import "./ZiniaContainer-BV6sojLa.js";
|
|
3
|
+
import "./userAuthorized-klLUHGxT.js";
|
|
4
|
+
import "./team_memberRoutes-Cxgte_vj.js";
|
|
5
|
+
import { t as ViewTeamMember_default } from "./ViewTeamMember-Cf5yXdv6.js";
|
|
6
|
+
|
|
7
|
+
export { ViewTeamMember_default as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZiniaContainer-
|
|
1
|
+
{"version":3,"file":"ZiniaContainer-BV6sojLa.js","names":[],"sources":["../src/components/ui/ZiniaContainer.vue"],"sourcesContent":["<template>\n <div class=\"p-0 md:p-4 max-w-4xl mx-auto bg-base-200 card\">\n <div class=\"card-body p-4\">\n <slot />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// Reusable container that matches ZiniaForm styling\n// Use this for cards/sections that should visually match forms\n</script>\n"],"mappings":";;;;;;;;;uBACE,mBAIM,OAJN,YAIM,CAHJ,mBAEM,OAFN,YAEM,CADJ,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA,CAAA,CAAA"}
|
|
@@ -127,4 +127,4 @@ function getTimezoneOffsetString(date) {
|
|
|
127
127
|
|
|
128
128
|
//#endregion
|
|
129
129
|
export { getTimezoneOffsetString as a, formatUserDate as i, formatToISODate as n, toStringWithLocalTimeZoneOffSet as o, formatToISODatetime as r, formatSystemTimestamp as t };
|
|
130
|
-
//# sourceMappingURL=convertToLocalDateTime-
|
|
130
|
+
//# sourceMappingURL=convertToLocalDateTime-C13-PrSA.js.map
|
package/dist/{convertToLocalDateTime-BF25N4xd.js.map → convertToLocalDateTime-C13-PrSA.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertToLocalDateTime-
|
|
1
|
+
{"version":3,"file":"convertToLocalDateTime-C13-PrSA.js","names":["date: Date"],"sources":["../src/utils/convertToLocalDateTime.ts"],"sourcesContent":["/**\n * Format a date value to ISO date string (YYYY-MM-DD)\n * Used as formatter for date input fields to ensure consistent ISO format\n * @param date - Date string or Date object\n * @returns ISO date string (YYYY-MM-DD) or null if invalid\n */\nexport function formatToISODate(date: string | Date | null): string | null {\n if (!date) {\n return null;\n }\n try {\n return new Date(date).toISOString().split('T')[0] ?? null;\n } catch (e) {\n console.error('Invalid date format:', e);\n return null;\n }\n}\n\nexport function formatToISODatetime(date: string | Date | null): string | null {\n if (!date) {\n return null;\n }\n try {\n return new Date(date).toISOString();\n } catch (e) {\n console.error('Invalid date format:', e);\n return null;\n }\n}\n\n/**\n * Extracts YYYY-MM-DD from a date string (handles both date-only and ISO format)\n * Used to avoid timezone issues: ISO strings like \"2024-02-02T00:00:00.000Z\" are\n * interpreted as UTC by Date(), which shows wrong date in western timezones\n */\nfunction extractDateOnly(dateString: string): string | null {\n const match = dateString.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n const datePart = match?.[1];\n return datePart != null ? datePart : null;\n}\n\n/**\n * Formats user-inputted date-only fields (YYYY-MM-DD format) or ISO timestamps\n * These represent calendar dates in the user's local context, not precise timestamps\n * @param dateString - Date string in YYYY-MM-DD format or ISO timestamp\n * @param dateOnly - If true, returns only the date portion without time (default: true)\n * @returns Formatted date string or empty string if no date provided\n */\nexport function formatUserDate(\n dateString: string | null | undefined,\n dateOnly: boolean = true,\n): string {\n if (!dateString) return '';\n\n try {\n let date: Date;\n\n // For date-only fields, extract YYYY-MM-DD and parse as local to avoid timezone issues.\n // ISO strings like \"2024-02-02T00:00:00.000Z\" would otherwise be parsed as UTC midnight,\n // showing the wrong day (e.g. Feb 1 instead of Feb 2) in western timezones.\n const dateOnlyPart = extractDateOnly(dateString);\n if (dateOnlyPart) {\n const [year, month, day] = dateOnlyPart.split('-').map(Number);\n date = new Date(year!, month! - 1, day!); // month is 0-indexed\n } else {\n // Fallback for non-standard formats\n date = new Date(dateString);\n }\n\n // Check if date is valid (e.g., catches invalid dates like 2023-02-31)\n if (isNaN(date.getTime())) {\n console.warn('formatUserDate received invalid date:', dateString);\n return dateString;\n }\n\n if (dateOnly) {\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n }\n\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n timeZoneName: 'short',\n });\n } catch (error) {\n console.error('Error formatting user date:', error);\n return dateString;\n }\n}\n\n/**\n * Formats system-generated timestamps (ISO format with time)\n * These represent precise moments in time, typically in UTC\n * @param timestamp - ISO timestamp string or YYYY-MM-DD date string\n * @param dateOnly - If true, returns only the date portion without time (default: false)\n * @returns Formatted timestamp string or empty string if no timestamp provided\n */\nexport function formatSystemTimestamp(\n timestamp: string | null | undefined,\n dateOnly: boolean = false,\n): string {\n if (!timestamp) return '';\n\n try {\n let date: Date;\n\n // Handle YYYY-MM-DD format specially to avoid timezone issues\n if (dateOnly && /^\\d{4}-\\d{2}-\\d{2}$/.test(timestamp)) {\n // For date-only strings, parse as local date to avoid UTC interpretation\n const [year, month, day] = timestamp.split('-').map(Number);\n date = new Date(year!, month! - 1, day!); // month is 0-indexed\n } else {\n // Handle ISO timestamp or other formats\n date = new Date(timestamp);\n }\n\n // Check if date is valid\n if (isNaN(date.getTime())) {\n console.warn('formatSystemTimestamp received invalid timestamp:', timestamp);\n return timestamp;\n }\n\n if (dateOnly) {\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n }\n\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n timeZoneName: 'short',\n });\n } catch (error) {\n console.error('Error formatting system timestamp:', error);\n return timestamp;\n }\n}\n\nexport const toStringWithLocalTimeZoneOffSet = (date?: string | null) => {\n if (!date) return null;\n date = date.split('Z')[0];\n if (!date) return null;\n if (date.includes('T')) {\n return date + getTimezoneOffsetString(date);\n } else {\n return date + 'T12:00:00.000' + getTimezoneOffsetString(date);\n }\n};\n\nexport function getTimezoneOffsetString(date: string) {\n let offset = -new Date(date).getTimezoneOffset();\n let sign = offset < 0 ? '-' : '+';\n let hours = Math.floor(Math.abs(offset / 60));\n let minutes = Math.abs(offset % 60);\n return sign + pad(hours) + ':' + pad(minutes);\n\n function pad(n: number) {\n return n < 10 ? '0' + n : '' + n;\n }\n}\n"],"mappings":"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"}
|
package/dist/{customerSupportTicketRoutes-C7OxGAGl.js → customerSupportTicketRoutes-aXOZjl41.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { o as createLastUsedPresetGuard } from "./saved_filter-
|
|
2
|
-
import { c as userAuthenticated } from "./userAuthorized-
|
|
1
|
+
import { o as createLastUsedPresetGuard } from "./saved_filter-DMUiaPSP.js";
|
|
2
|
+
import { c as userAuthenticated } from "./userAuthorized-klLUHGxT.js";
|
|
3
3
|
|
|
4
4
|
//#region src/slices/support_ticket/customer/customerSupportTicketRoutes.ts
|
|
5
5
|
const customerListPresetGuard = createLastUsedPresetGuard("support_ticket_customer", "CustomerSupportTicketList");
|
|
@@ -55,7 +55,7 @@ const customerSupportTicketRoutes = [{
|
|
|
55
55
|
{
|
|
56
56
|
path: customerSupportPaths.customer_list.path,
|
|
57
57
|
name: customerSupportPaths.customer_list.name,
|
|
58
|
-
component: () => import("./CustomerSupportTicketList-
|
|
58
|
+
component: () => import("./CustomerSupportTicketList-DgXBedwz.js"),
|
|
59
59
|
beforeEnter: (to) => customerListPresetGuard(to),
|
|
60
60
|
meta: {
|
|
61
61
|
title: "Tickets",
|
|
@@ -74,7 +74,7 @@ const customerSupportTicketRoutes = [{
|
|
|
74
74
|
{
|
|
75
75
|
path: customerSupportPaths.customer_create.path,
|
|
76
76
|
name: customerSupportPaths.customer_create.name,
|
|
77
|
-
component: () => import("./CustomerCreateSupportTicketForm-
|
|
77
|
+
component: () => import("./CustomerCreateSupportTicketForm-BglXTkKj.js"),
|
|
78
78
|
meta: {
|
|
79
79
|
title: "Create Support Ticket",
|
|
80
80
|
description: "Create new support ticket",
|
|
@@ -90,7 +90,7 @@ const customerSupportTicketRoutes = [{
|
|
|
90
90
|
{
|
|
91
91
|
path: customerSupportPaths.customer_create_success.path,
|
|
92
92
|
name: customerSupportPaths.customer_create_success.name,
|
|
93
|
-
component: () => import("./CustomerSupportTicketSuccess-
|
|
93
|
+
component: () => import("./CustomerSupportTicketSuccess-DToQdwdr.js"),
|
|
94
94
|
meta: {
|
|
95
95
|
title: "Support Ticket Submitted",
|
|
96
96
|
description: "Support ticket submitted successfully",
|
|
@@ -112,7 +112,7 @@ const customerSupportTicketRoutes = [{
|
|
|
112
112
|
},
|
|
113
113
|
{
|
|
114
114
|
path: customerSupportPaths.customer_view.path,
|
|
115
|
-
component: () => import("./CustomerSupportTicketParent-
|
|
115
|
+
component: () => import("./CustomerSupportTicketParent-D19kei4H.js"),
|
|
116
116
|
meta: {
|
|
117
117
|
title: "View Support Ticket",
|
|
118
118
|
description: "View support ticket details"
|
|
@@ -120,7 +120,7 @@ const customerSupportTicketRoutes = [{
|
|
|
120
120
|
children: [{
|
|
121
121
|
path: "",
|
|
122
122
|
name: customerSupportPaths.customer_view.name,
|
|
123
|
-
component: () => import("./CustomerSupportTicketDetailPage-
|
|
123
|
+
component: () => import("./CustomerSupportTicketDetailPage-CI0UmP2U.js"),
|
|
124
124
|
meta: {
|
|
125
125
|
title: "View Support Ticket",
|
|
126
126
|
description: "View support ticket details"
|
|
@@ -139,4 +139,4 @@ const customerSupportTicketRoutes = [{
|
|
|
139
139
|
|
|
140
140
|
//#endregion
|
|
141
141
|
export { customerSupportTicketRoutes as n, customerSupportPaths as t };
|
|
142
|
-
//# sourceMappingURL=customerSupportTicketRoutes-
|
|
142
|
+
//# sourceMappingURL=customerSupportTicketRoutes-aXOZjl41.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customerSupportTicketRoutes-
|
|
1
|
+
{"version":3,"file":"customerSupportTicketRoutes-aXOZjl41.js","names":["customerSupportTicketRoutes: Array<ExtendedRouteRecordRaw>"],"sources":["../src/slices/support_ticket/customer/customerSupportTicketRoutes.ts"],"sourcesContent":["import { createLastUsedPresetGuard } from '../../../slices/saved_filter';\nimport { userAuthenticated } from '../../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../../types/ExtendedRoute';\n\nconst customerListPresetGuard = createLastUsedPresetGuard('support_ticket_customer', 'CustomerSupportTicketList');\n\nexport const customerSupportPaths = {\n customer_list: {\n path: '',\n full_path: '/support',\n name: 'CustomerSupportTicketList',\n },\n customer_create: {\n path: 'create',\n full_path: '/support/create',\n name: 'CustomerCreateSupportTicket',\n },\n customer_create_success: {\n path: 'create/success',\n full_path: '/support/create/success',\n name: 'CustomerSupportTicketSuccess',\n },\n customer_view: {\n path: ':id',\n full_path: '/support/:id',\n name: 'CustomerViewSupportTicket',\n },\n customer_edit: {\n path: 'edit',\n full_path: '/support/:id/edit',\n name: 'CustomerEditSupportTicket',\n },\n customer_customer_notes: {\n path: 'customer-notes',\n full_path: '/support/:id/customer-notes',\n name: 'CustomerSupportTicketCustomerNotes',\n },\n customer_history: {\n path: 'history',\n full_path: '/support/:id/history',\n name: 'CustomerSupportTicketHistory',\n },\n customer_attachments: {\n path: 'attachments',\n full_path: '/support/:id/attachments',\n name: 'CustomerSupportTicketAttachments',\n },\n} as const;\n\nexport const customerSupportTicketRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/support',\n name: 'CustomerSupportTicket',\n redirect: { name: customerSupportPaths.customer_list.name },\n beforeEnter: [userAuthenticated],\n meta: {},\n children: [\n {\n path: customerSupportPaths.customer_list.path,\n name: customerSupportPaths.customer_list.name,\n component: () => import('./CustomerSupportTicketList.vue'),\n beforeEnter: (to) => customerListPresetGuard(to),\n meta: {\n title: 'Tickets',\n description: 'Support tickets',\n side_bar: {\n section: 'Support',\n visible_to: ['consumer', 'lead', 'staff', 'super_admin'],\n },\n },\n },\n {\n path: customerSupportPaths.customer_create.path,\n name: customerSupportPaths.customer_create.name,\n component: () => import('./CustomerCreateSupportTicketForm.vue'),\n meta: {\n title: 'Create Support Ticket',\n description: 'Create new support ticket',\n breadcrumbs: [\n {\n label: 'Support',\n to: { name: customerSupportPaths.customer_list.name },\n },\n {\n label: 'Create',\n to: { name: customerSupportPaths.customer_create.name },\n },\n ],\n },\n },\n {\n path: customerSupportPaths.customer_create_success.path,\n name: customerSupportPaths.customer_create_success.name,\n component: () => import('./CustomerSupportTicketSuccess.vue'),\n meta: {\n title: 'Support Ticket Submitted',\n description: 'Support ticket submitted successfully',\n breadcrumbs: [\n {\n label: 'Support',\n to: { name: customerSupportPaths.customer_list.name },\n },\n {\n label: 'Create',\n to: { name: customerSupportPaths.customer_create.name },\n },\n {\n label: 'Success',\n to: { name: customerSupportPaths.customer_create_success.name },\n },\n ],\n },\n },\n {\n path: customerSupportPaths.customer_view.path,\n component: () => import('./CustomerSupportTicketParent.vue'),\n meta: {\n title: 'View Support Ticket',\n description: 'View support ticket details',\n },\n children: [\n {\n path: '',\n name: customerSupportPaths.customer_view.name,\n component: () => import('./CustomerSupportTicketDetailPage.vue'),\n meta: {\n title: 'View Support Ticket',\n description: 'View support ticket details',\n },\n },\n {\n path: customerSupportPaths.customer_edit.path,\n redirect: (to) => ({\n name: customerSupportPaths.customer_view.name,\n params: { id: to.params.id },\n query: { mode: 'edit' },\n }),\n },\n ],\n },\n ],\n },\n];\n"],"mappings":";;;;AAIA,MAAM,0BAA0B,0BAA0B,2BAA2B,4BAA4B;AAEjH,MAAa,uBAAuB;CAClC,eAAe;EACb,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,iBAAiB;EACf,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,yBAAyB;EACvB,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,yBAAyB;EACvB,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,kBAAkB;EAChB,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,sBAAsB;EACpB,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACF;AAED,MAAaA,8BAA6D,CACxE;CACE,MAAM;CACN,MAAM;CACN,UAAU,EAAE,MAAM,qBAAqB,cAAc,MAAM;CAC3D,aAAa,CAAC,kBAAkB;CAChC,MAAM,EAAE;CACR,UAAU;EACR;GACE,MAAM,qBAAqB,cAAc;GACzC,MAAM,qBAAqB,cAAc;GACzC,iBAAiB,OAAO;GACxB,cAAc,OAAO,wBAAwB,GAAG;GAChD,MAAM;IACJ,OAAO;IACP,aAAa;IACb,UAAU;KACR,SAAS;KACT,YAAY;MAAC;MAAY;MAAQ;MAAS;MAAc;KACzD;IACF;GACF;EACD;GACE,MAAM,qBAAqB,gBAAgB;GAC3C,MAAM,qBAAqB,gBAAgB;GAC3C,iBAAiB,OAAO;GACxB,MAAM;IACJ,OAAO;IACP,aAAa;IACb,aAAa,CACX;KACE,OAAO;KACP,IAAI,EAAE,MAAM,qBAAqB,cAAc,MAAM;KACtD,EACD;KACE,OAAO;KACP,IAAI,EAAE,MAAM,qBAAqB,gBAAgB,MAAM;KACxD,CACF;IACF;GACF;EACD;GACE,MAAM,qBAAqB,wBAAwB;GACnD,MAAM,qBAAqB,wBAAwB;GACnD,iBAAiB,OAAO;GACxB,MAAM;IACJ,OAAO;IACP,aAAa;IACb,aAAa;KACX;MACE,OAAO;MACP,IAAI,EAAE,MAAM,qBAAqB,cAAc,MAAM;MACtD;KACD;MACE,OAAO;MACP,IAAI,EAAE,MAAM,qBAAqB,gBAAgB,MAAM;MACxD;KACD;MACE,OAAO;MACP,IAAI,EAAE,MAAM,qBAAqB,wBAAwB,MAAM;MAChE;KACF;IACF;GACF;EACD;GACE,MAAM,qBAAqB,cAAc;GACzC,iBAAiB,OAAO;GACxB,MAAM;IACJ,OAAO;IACP,aAAa;IACd;GACD,UAAU,CACR;IACE,MAAM;IACN,MAAM,qBAAqB,cAAc;IACzC,iBAAiB,OAAO;IACxB,MAAM;KACJ,OAAO;KACP,aAAa;KACd;IACF,EACD;IACE,MAAM,qBAAqB,cAAc;IACzC,WAAW,QAAQ;KACjB,MAAM,qBAAqB,cAAc;KACzC,QAAQ,EAAE,IAAI,GAAG,OAAO,IAAI;KAC5B,OAAO,EAAE,MAAM,QAAQ;KACxB;IACF,CACF;GACF;EACF;CACF,CACF"}
|