@dragonmastery/dragoncore-vue 0.0.27 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ConsentFlowStep-Dwg2HpnI.js → ConsentFlowStep-DstxorHZ.js} +1 -1
- package/dist/{ConsentFlowStep-Dwg2HpnI.js.map → ConsentFlowStep-DstxorHZ.js.map} +1 -1
- package/dist/{ConsentRequired-Cp9QGWiV.js → ConsentRequired-ELUidmNv.js} +2 -2
- package/dist/{ConsentRequired-Cp9QGWiV.js.map → ConsentRequired-ELUidmNv.js.map} +1 -1
- package/dist/{CreateTeamForm-Cy29yHqJ.js → CreateTeamForm-CCfgSWUA.js} +2 -2
- package/dist/{CreateTeamForm-BuplRIXl.js → CreateTeamForm-DNkueBzR.js} +2 -2
- package/dist/{CreateTeamForm-BuplRIXl.js.map → CreateTeamForm-DNkueBzR.js.map} +1 -1
- package/dist/{CreditBalanceDashboard-DzWc30u_.js → CreditBalanceDashboard-CLQ8NZnY.js} +2 -2
- package/dist/{CreditBalanceDashboard-DzWc30u_.js.map → CreditBalanceDashboard-CLQ8NZnY.js.map} +1 -1
- package/dist/{CreditBalanceDashboard-rN0W4Dxv.js → CreditBalanceDashboard-jdvZa-ZT.js} +4 -4
- package/dist/{CreditManagement-Bs4gqN11.js → CreditManagement-Dus4O1BY.js} +2 -2
- package/dist/{CreditManagement-Bs4gqN11.js.map → CreditManagement-Dus4O1BY.js.map} +1 -1
- package/dist/{CreditManagement-2dBjtV5Q.js → CreditManagement-DvGikLLe.js} +4 -4
- package/dist/{CreditTransactionHistory-D_fy5d3l.js → CreditTransactionHistory-BZZGQxTV.js} +2 -2
- package/dist/{CreditTransactionHistory-D_fy5d3l.js.map → CreditTransactionHistory-BZZGQxTV.js.map} +1 -1
- package/dist/{CustomerCreateSupportTicketForm-B9bxGTOX.js → CustomerCreateSupportTicketForm-C3CgjqXg.js} +3 -3
- package/dist/{CustomerCreateSupportTicketForm-e8cIzSS6.js → CustomerCreateSupportTicketForm-CeG8IKA1.js} +2 -2
- package/dist/{CustomerCreateSupportTicketForm-e8cIzSS6.js.map → CustomerCreateSupportTicketForm-CeG8IKA1.js.map} +1 -1
- package/dist/{CustomerSupportTicketDetailPage-CI0UmP2U.js → CustomerSupportTicketDetailPage-CUkf9swo.js} +2 -2
- package/dist/{CustomerSupportTicketDetailPage-CI0UmP2U.js.map → CustomerSupportTicketDetailPage-CUkf9swo.js.map} +1 -1
- package/dist/{CustomerSupportTicketList-CJIV2v6_.js → CustomerSupportTicketList-D1pcZzcX.js} +21 -21
- package/dist/{CustomerSupportTicketSuccess-B5E7Mr0R.js → CustomerSupportTicketSuccess-Cc75m_p-.js} +2 -2
- package/dist/{CustomerSupportTicketSuccess-B5E7Mr0R.js.map → CustomerSupportTicketSuccess-Cc75m_p-.js.map} +1 -1
- package/dist/{CustomerSupportTicketSuccess-iLsr2cWy.js → CustomerSupportTicketSuccess-ca10puM-.js} +3 -3
- package/dist/DefaultReferralTeamPage-fO3tmwOb.js +247 -0
- package/dist/DefaultReferralTeamPage-fO3tmwOb.js.map +1 -0
- package/dist/{EditTeamForm-BJBTHghU.js → EditTeamForm-BzTAypZT.js} +2 -2
- package/dist/{EditTeamForm-BbSQ8cdm.js → EditTeamForm-DdvKHlNj.js} +2 -2
- package/dist/{EditTeamForm-BbSQ8cdm.js.map → EditTeamForm-DdvKHlNj.js.map} +1 -1
- package/dist/{LoginForm-p2fJiTtw.js → LoginForm-CFADKiln.js} +1 -1
- package/dist/{LoginForm-D1Mx2vAY.js → LoginForm-CSMHsZrq.js} +1 -1
- package/dist/{LoginForm-D1Mx2vAY.js.map → LoginForm-CSMHsZrq.js.map} +1 -1
- package/dist/{SavedFiltersPage-BViMOhvn.js → SavedFiltersPage-B9aQYpwf.js} +22 -22
- package/dist/{SavedFiltersPage-BViMOhvn.js.map → SavedFiltersPage-B9aQYpwf.js.map} +1 -1
- package/dist/{Signup-CJrY4IK-.js → Signup-Ceh7XSea.js} +2 -2
- package/dist/{Signup-BCVZZCR_.js → Signup-EykiX-bQ.js} +24 -6
- package/dist/Signup-EykiX-bQ.js.map +1 -0
- package/dist/{SignupConsentFlow-Dd3QAkVF.js → SignupConsentFlow-CRtiMpcS.js} +10 -5
- package/dist/SignupConsentFlow-CRtiMpcS.js.map +1 -0
- package/dist/{SignupRequirementsPage-DUQ63ZuW.js → SignupRequirementsPage-CohJluxQ.js} +1 -1
- package/dist/{SignupRequirementsPage-DUQ63ZuW.js.map → SignupRequirementsPage-CohJluxQ.js.map} +1 -1
- package/dist/{StaffCreateSupportTicketForm-C-UWBdA6.js → StaffCreateSupportTicketForm-ANtaO4pe.js} +2 -2
- package/dist/{StaffCreateSupportTicketForm-C-UWBdA6.js.map → StaffCreateSupportTicketForm-ANtaO4pe.js.map} +1 -1
- package/dist/{StaffCreateSupportTicketForm-BmqqHlqp.js → StaffCreateSupportTicketForm-CtU12OGq.js} +3 -3
- package/dist/{StaffSupportTicketDetailPage--idGVu5P.js → StaffSupportTicketDetailPage-B63QXyum.js} +2 -2
- package/dist/{StaffSupportTicketDetailPage--idGVu5P.js.map → StaffSupportTicketDetailPage-B63QXyum.js.map} +1 -1
- package/dist/{StaffSupportTicketList-90I_ljzX.js → StaffSupportTicketList-CqK8PVq4.js} +21 -21
- package/dist/{StaffSupportTicketSuccess-CW1yJhtp.js → StaffSupportTicketSuccess-BMh5amWI.js} +3 -3
- package/dist/{StaffSupportTicketSuccess-TEtJGyaZ.js → StaffSupportTicketSuccess-CB4Oa_2J.js} +2 -2
- package/dist/{StaffSupportTicketSuccess-TEtJGyaZ.js.map → StaffSupportTicketSuccess-CB4Oa_2J.js.map} +1 -1
- package/dist/{SupportStaffPage-c2ouJwJk.js → SupportStaffPage-CkFLlle4.js} +1 -1
- package/dist/{SupportStaffPage-c2ouJwJk.js.map → SupportStaffPage-CkFLlle4.js.map} +1 -1
- package/dist/{SupportTicketMaintenancePage-B07avInx.js → SupportTicketMaintenancePage-CEKi8xQB.js} +1 -1
- package/dist/{SupportTicketMaintenancePage-B07avInx.js.map → SupportTicketMaintenancePage-CEKi8xQB.js.map} +1 -1
- package/dist/{TeamAttachmentsTab-BgnU0y6j.js → TeamAttachmentsTab-BG_K7uwG.js} +21 -21
- package/dist/{TeamList-ggZEivO2.js → TeamList-B4gWPzce.js} +2 -2
- package/dist/{TeamList-ggZEivO2.js.map → TeamList-B4gWPzce.js.map} +1 -1
- package/dist/{TeamList-Y5FzwNeV.js → TeamList-iAH9mOdd.js} +2 -2
- package/dist/{TeamParent-C1pHDWY1.js → TeamParent-D_IbzH8B.js} +2 -2
- package/dist/{TeamParent-CObyDkrL.js → TeamParent-KQmJgJ9x.js} +2 -2
- package/dist/{TeamParent-CObyDkrL.js.map → TeamParent-KQmJgJ9x.js.map} +1 -1
- package/dist/{TimelineNoteInput--q4ENAgu.js → TimelineNoteInput-DXZhcUkH.js} +1 -1
- package/dist/{TimelineNoteInput--q4ENAgu.js.map → TimelineNoteInput-DXZhcUkH.js.map} +1 -1
- package/dist/{VerifyEmail-CEbvnWLl.js → VerifyEmail-BVwHQpbw.js} +10 -5
- package/dist/VerifyEmail-BVwHQpbw.js.map +1 -0
- package/dist/{VerifyEmail-DdUKxJnk.js → VerifyEmail-BYYsE-M_.js} +2 -2
- package/dist/{ViewTeam-RXno7OPV.js → ViewTeam-BV7SjH8R.js} +129 -30
- package/dist/ViewTeam-BV7SjH8R.js.map +1 -0
- package/dist/{ViewTeam-Dj0JSLzE.js → ViewTeam-BvLIv9Dd.js} +2 -2
- package/dist/{customerSupportTicketRoutes-Cmva-eXn.js → customerSupportTicketRoutes-_HjQcEAD.js} +6 -6
- package/dist/{customerSupportTicketRoutes-Cmva-eXn.js.map → customerSupportTicketRoutes-_HjQcEAD.js.map} +1 -1
- package/dist/index.d.ts +677 -662
- package/dist/index.js +22 -22
- package/dist/{saved_filter-C1pXMOJZ.js → saved_filter-C6YHkEMV.js} +2 -2
- package/dist/{saved_filter-C1pXMOJZ.js.map → saved_filter-C6YHkEMV.js.map} +1 -1
- package/dist/{signupConsentStorage-Ct4ZuKi-.js → signupConsentStorage-foqtLkIk.js} +1 -1
- package/dist/signupConsentStorage-foqtLkIk.js.map +1 -0
- package/dist/{src-qjXj41gp.js → src-BIX3mMjo.js} +31 -13
- package/dist/{src-qjXj41gp.js.map → src-BIX3mMjo.js.map} +1 -1
- package/dist/{staffSupportTicketRoutes-BUa3oCVP.js → staffSupportTicketRoutes-WPaItK5S.js} +6 -6
- package/dist/{staffSupportTicketRoutes-BUa3oCVP.js.map → staffSupportTicketRoutes-WPaItK5S.js.map} +1 -1
- package/dist/{teamRoutes-DxVWQDWU.js → teamRoutes-CQWRPy3J.js} +7 -7
- package/dist/{teamRoutes-DxVWQDWU.js.map → teamRoutes-CQWRPy3J.js.map} +1 -1
- package/dist/{useEmailVerificationChannel-QuMSgzzM.js → useEmailVerificationChannel-C4bvvG2b.js} +1 -1
- package/dist/{useEmailVerificationChannel-QuMSgzzM.js.map → useEmailVerificationChannel-C4bvvG2b.js.map} +1 -1
- package/package.json +2 -2
- package/dist/Signup-BCVZZCR_.js.map +0 -1
- package/dist/SignupConsentFlow-Dd3QAkVF.js.map +0 -1
- package/dist/VerifyEmail-CEbvnWLl.js.map +0 -1
- package/dist/ViewTeam-RXno7OPV.js.map +0 -1
- package/dist/signupConsentStorage-Ct4ZuKi-.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as createLastUsedPresetGuard } from "./saved_filter-
|
|
1
|
+
import { o as createLastUsedPresetGuard } from "./saved_filter-C6YHkEMV.js";
|
|
2
2
|
import { c as userAuthenticated, s as staffOnly } from "./userAuthorized-klLUHGxT.js";
|
|
3
3
|
|
|
4
4
|
//#region src/slices/support_ticket/staff/staffSupportTicketRoutes.ts
|
|
@@ -60,7 +60,7 @@ const staffSupportTicketRoutes = [{
|
|
|
60
60
|
{
|
|
61
61
|
path: staffSupportPaths.staff_list.path,
|
|
62
62
|
name: staffSupportPaths.staff_list.name,
|
|
63
|
-
component: () => import("./StaffSupportTicketList-
|
|
63
|
+
component: () => import("./StaffSupportTicketList-CqK8PVq4.js"),
|
|
64
64
|
beforeEnter: (to) => staffListPresetGuard(to),
|
|
65
65
|
meta: {
|
|
66
66
|
title: "Manage Support",
|
|
@@ -74,7 +74,7 @@ const staffSupportTicketRoutes = [{
|
|
|
74
74
|
{
|
|
75
75
|
path: staffSupportPaths.staff_create.path,
|
|
76
76
|
name: staffSupportPaths.staff_create.name,
|
|
77
|
-
component: () => import("./StaffCreateSupportTicketForm-
|
|
77
|
+
component: () => import("./StaffCreateSupportTicketForm-CtU12OGq.js"),
|
|
78
78
|
meta: {
|
|
79
79
|
title: "Create Support Ticket",
|
|
80
80
|
description: "Create new support ticket item",
|
|
@@ -90,7 +90,7 @@ const staffSupportTicketRoutes = [{
|
|
|
90
90
|
{
|
|
91
91
|
path: staffSupportPaths.staff_create_success.path,
|
|
92
92
|
name: staffSupportPaths.staff_create_success.name,
|
|
93
|
-
component: () => import("./StaffSupportTicketSuccess-
|
|
93
|
+
component: () => import("./StaffSupportTicketSuccess-BMh5amWI.js"),
|
|
94
94
|
meta: {
|
|
95
95
|
title: "Support Ticket Created",
|
|
96
96
|
description: "Support ticket created successfully",
|
|
@@ -120,7 +120,7 @@ const staffSupportTicketRoutes = [{
|
|
|
120
120
|
children: [{
|
|
121
121
|
path: "",
|
|
122
122
|
name: staffSupportPaths.staff_edit.name,
|
|
123
|
-
component: () => import("./StaffSupportTicketDetailPage
|
|
123
|
+
component: () => import("./StaffSupportTicketDetailPage-B63QXyum.js"),
|
|
124
124
|
meta: {
|
|
125
125
|
title: "View Support Ticket",
|
|
126
126
|
description: "View support ticket details"
|
|
@@ -132,4 +132,4 @@ const staffSupportTicketRoutes = [{
|
|
|
132
132
|
|
|
133
133
|
//#endregion
|
|
134
134
|
export { staffSupportTicketRoutes as n, staffSupportPaths as t };
|
|
135
|
-
//# sourceMappingURL=staffSupportTicketRoutes-
|
|
135
|
+
//# sourceMappingURL=staffSupportTicketRoutes-WPaItK5S.js.map
|
package/dist/{staffSupportTicketRoutes-BUa3oCVP.js.map → staffSupportTicketRoutes-WPaItK5S.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staffSupportTicketRoutes-
|
|
1
|
+
{"version":3,"file":"staffSupportTicketRoutes-WPaItK5S.js","names":["staffSupportTicketRoutes: Array<ExtendedRouteRecordRaw>"],"sources":["../src/slices/support_ticket/staff/staffSupportTicketRoutes.ts"],"sourcesContent":["import { createLastUsedPresetGuard } from '../../../slices/saved_filter';\nimport { staffOnly, userAuthenticated } from '../../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../../types/ExtendedRoute';\n\nconst staffListPresetGuard = createLastUsedPresetGuard('support_ticket_staff', 'StaffSupportTicketList');\n\nexport const staffSupportPaths = {\n staff_list: {\n path: '',\n full_path: '/staff/support',\n name: 'StaffSupportTicketList',\n },\n staff_create: {\n path: 'create',\n full_path: '/staff/support/create',\n name: 'StaffCreateSupportTicket',\n },\n staff_create_success: {\n path: 'create/success',\n full_path: '/staff/support/create/success',\n name: 'StaffSupportTicketSuccess',\n },\n staff_edit: {\n path: ':id',\n full_path: '/staff/support/:id',\n name: 'StaffEditSupportTicket',\n },\n staff_workflow: {\n path: 'workflow',\n full_path: '/staff/support/:id/workflow',\n name: 'StaffSupportTicketWorkflow',\n },\n staff_customer_notes: {\n path: 'customer-notes',\n full_path: '/staff/support/:id/customer-notes',\n name: 'StaffSupportTicketCustomerNotes',\n },\n staff_internal_notes: {\n path: 'internal-notes',\n full_path: '/staff/support/:id/internal-notes',\n name: 'StaffSupportTicketInternalNotes',\n },\n staff_history: {\n path: 'history',\n full_path: '/staff/support/:id/history',\n name: 'StaffSupportTicketHistory',\n },\n staff_attachments: {\n path: 'attachments',\n full_path: '/staff/support/:id/attachments',\n name: 'StaffSupportTicketAttachments',\n },\n} as const;\n\nexport const staffSupportTicketRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/staff/support',\n name: 'StaffSupportTicket',\n redirect: { name: staffSupportPaths.staff_list.name },\n beforeEnter: [userAuthenticated, staffOnly],\n meta: {},\n children: [\n {\n path: staffSupportPaths.staff_list.path,\n name: staffSupportPaths.staff_list.name,\n component: () => import('./StaffSupportTicketList.vue'),\n beforeEnter: (to) => staffListPresetGuard(to),\n meta: {\n title: 'Manage Support',\n description: 'Admin support ticket management',\n side_bar: {\n section: ' Staff',\n visible_to: ['staff', 'super_admin'],\n },\n },\n },\n {\n path: staffSupportPaths.staff_create.path,\n name: staffSupportPaths.staff_create.name,\n component: () => import('./StaffCreateSupportTicketForm.vue'),\n meta: {\n title: 'Create Support Ticket',\n description: 'Create new support ticket item',\n breadcrumbs: [\n {\n label: 'Staff Support Ticket',\n to: { name: staffSupportPaths.staff_list.name },\n },\n {\n label: 'Create',\n to: { name: staffSupportPaths.staff_create.name },\n },\n ],\n },\n },\n {\n path: staffSupportPaths.staff_create_success.path,\n name: staffSupportPaths.staff_create_success.name,\n component: () => import('./StaffSupportTicketSuccess.vue'),\n meta: {\n title: 'Support Ticket Created',\n description: 'Support ticket created successfully',\n breadcrumbs: [\n {\n label: 'Staff Support Ticket',\n to: { name: staffSupportPaths.staff_list.name },\n },\n {\n label: 'Create',\n to: { name: staffSupportPaths.staff_create.name },\n },\n {\n label: 'Success',\n to: { name: staffSupportPaths.staff_create_success.name },\n },\n ],\n },\n },\n {\n path: staffSupportPaths.staff_edit.path,\n component: () => import('./StaffSupportTicketParent.vue'),\n meta: {\n title: 'View Support Ticket',\n description: 'View support ticket details',\n },\n children: [\n {\n path: '',\n name: staffSupportPaths.staff_edit.name,\n component: () => import('./StaffSupportTicketDetailPage.vue'),\n meta: {\n title: 'View Support Ticket',\n description: 'View support ticket details',\n },\n },\n ],\n },\n ],\n },\n];\n"],"mappings":";;;;AAIA,MAAM,uBAAuB,0BAA0B,wBAAwB,yBAAyB;AAExG,MAAa,oBAAoB;CAC/B,YAAY;EACV,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,cAAc;EACZ,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,sBAAsB;EACpB,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,YAAY;EACV,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,gBAAgB;EACd,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,sBAAsB;EACpB,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,sBAAsB;EACpB,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,eAAe;EACb,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,mBAAmB;EACjB,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACF;AAED,MAAaA,2BAA0D,CACrE;CACE,MAAM;CACN,MAAM;CACN,UAAU,EAAE,MAAM,kBAAkB,WAAW,MAAM;CACrD,aAAa,CAAC,mBAAmB,UAAU;CAC3C,MAAM,EAAE;CACR,UAAU;EACR;GACE,MAAM,kBAAkB,WAAW;GACnC,MAAM,kBAAkB,WAAW;GACnC,iBAAiB,OAAO;GACxB,cAAc,OAAO,qBAAqB,GAAG;GAC7C,MAAM;IACJ,OAAO;IACP,aAAa;IACb,UAAU;KACR,SAAS;KACT,YAAY,CAAC,SAAS,cAAc;KACrC;IACF;GACF;EACD;GACE,MAAM,kBAAkB,aAAa;GACrC,MAAM,kBAAkB,aAAa;GACrC,iBAAiB,OAAO;GACxB,MAAM;IACJ,OAAO;IACP,aAAa;IACb,aAAa,CACX;KACE,OAAO;KACP,IAAI,EAAE,MAAM,kBAAkB,WAAW,MAAM;KAChD,EACD;KACE,OAAO;KACP,IAAI,EAAE,MAAM,kBAAkB,aAAa,MAAM;KAClD,CACF;IACF;GACF;EACD;GACE,MAAM,kBAAkB,qBAAqB;GAC7C,MAAM,kBAAkB,qBAAqB;GAC7C,iBAAiB,OAAO;GACxB,MAAM;IACJ,OAAO;IACP,aAAa;IACb,aAAa;KACX;MACE,OAAO;MACP,IAAI,EAAE,MAAM,kBAAkB,WAAW,MAAM;MAChD;KACD;MACE,OAAO;MACP,IAAI,EAAE,MAAM,kBAAkB,aAAa,MAAM;MAClD;KACD;MACE,OAAO;MACP,IAAI,EAAE,MAAM,kBAAkB,qBAAqB,MAAM;MAC1D;KACF;IACF;GACF;EACD;GACE,MAAM,kBAAkB,WAAW;GACnC,iBAAiB,OAAO;GACxB,MAAM;IACJ,OAAO;IACP,aAAa;IACd;GACD,UAAU,CACR;IACE,MAAM;IACN,MAAM,kBAAkB,WAAW;IACnC,iBAAiB,OAAO;IACxB,MAAM;KACJ,OAAO;KACP,aAAa;KACd;IACF,CACF;GACF;EACF;CACF,CACF"}
|
|
@@ -54,7 +54,7 @@ const teamRoutes = [{
|
|
|
54
54
|
{
|
|
55
55
|
path: teamPaths.list.path,
|
|
56
56
|
name: teamPaths.list.name,
|
|
57
|
-
component: () => import("./TeamList-
|
|
57
|
+
component: () => import("./TeamList-iAH9mOdd.js"),
|
|
58
58
|
meta: {
|
|
59
59
|
title: "Teams",
|
|
60
60
|
description: "Manage teams",
|
|
@@ -72,7 +72,7 @@ const teamRoutes = [{
|
|
|
72
72
|
{
|
|
73
73
|
path: teamPaths.create.path,
|
|
74
74
|
name: teamPaths.create.name,
|
|
75
|
-
component: () => import("./CreateTeamForm-
|
|
75
|
+
component: () => import("./CreateTeamForm-CCfgSWUA.js"),
|
|
76
76
|
meta: {
|
|
77
77
|
title: "Create Team",
|
|
78
78
|
description: "Create new team",
|
|
@@ -87,7 +87,7 @@ const teamRoutes = [{
|
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
89
|
path: teamPaths.view.path,
|
|
90
|
-
component: () => import("./TeamParent-
|
|
90
|
+
component: () => import("./TeamParent-D_IbzH8B.js"),
|
|
91
91
|
meta: { sectionTabs: [
|
|
92
92
|
{
|
|
93
93
|
id: "view",
|
|
@@ -124,7 +124,7 @@ const teamRoutes = [{
|
|
|
124
124
|
{
|
|
125
125
|
path: "",
|
|
126
126
|
name: teamPaths.view.name,
|
|
127
|
-
component: () => import("./ViewTeam-
|
|
127
|
+
component: () => import("./ViewTeam-BvLIv9Dd.js"),
|
|
128
128
|
meta: {
|
|
129
129
|
title: "View Team",
|
|
130
130
|
description: "View team details",
|
|
@@ -134,7 +134,7 @@ const teamRoutes = [{
|
|
|
134
134
|
{
|
|
135
135
|
path: teamPaths.edit.path,
|
|
136
136
|
name: teamPaths.edit.name,
|
|
137
|
-
component: () => import("./EditTeamForm-
|
|
137
|
+
component: () => import("./EditTeamForm-BzTAypZT.js"),
|
|
138
138
|
meta: {
|
|
139
139
|
title: "Edit Team",
|
|
140
140
|
description: "Edit team details",
|
|
@@ -154,7 +154,7 @@ const teamRoutes = [{
|
|
|
154
154
|
{
|
|
155
155
|
path: teamPaths.attachments.path,
|
|
156
156
|
name: teamPaths.attachments.name,
|
|
157
|
-
component: () => import("./TeamAttachmentsTab-
|
|
157
|
+
component: () => import("./TeamAttachmentsTab-BG_K7uwG.js"),
|
|
158
158
|
meta: {
|
|
159
159
|
title: "Team Attachments",
|
|
160
160
|
description: "View and manage attachments",
|
|
@@ -189,4 +189,4 @@ const teamRoutes = [{
|
|
|
189
189
|
|
|
190
190
|
//#endregion
|
|
191
191
|
export { teamRoutes as n, teamPaths as t };
|
|
192
|
-
//# sourceMappingURL=teamRoutes-
|
|
192
|
+
//# sourceMappingURL=teamRoutes-CQWRPy3J.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teamRoutes-
|
|
1
|
+
{"version":3,"file":"teamRoutes-CQWRPy3J.js","names":["teamRoutes: Array<ExtendedRouteRecordRaw>"],"sources":["../src/slices/team/teamRoutes.ts"],"sourcesContent":["import { userAuthenticated } from '../../middleware/userAuthorized';\nimport type { ExtendedRouteRecordRaw } from '../../types/ExtendedRoute';\nimport { teamMemberPaths, teamMemberRoutes } from './team_member/team_memberRoutes';\n\nexport const teamPaths = {\n list: {\n path: '',\n full_path: '/teams',\n name: 'TeamList',\n },\n create: {\n path: 'create',\n full_path: '/teams/create',\n name: 'CreateTeam',\n },\n view: {\n path: ':id',\n full_path: '/teams/:id',\n name: 'ViewTeam',\n },\n edit: {\n path: 'edit',\n full_path: '/teams/:id/edit',\n name: 'EditTeam',\n },\n notes: {\n path: 'notes',\n full_path: '/teams/:id/notes',\n name: 'TeamNotes',\n },\n attachments: {\n path: 'attachments',\n full_path: '/teams/:id/attachments',\n name: 'TeamAttachments',\n },\n history: {\n path: 'history',\n full_path: '/teams/:id/history',\n name: 'TeamHistory',\n },\n members: {\n path: 'members',\n full_path: '/teams/:id/members',\n name: 'TeamMembers',\n },\n} as const;\n\nexport const teamRoutes: Array<ExtendedRouteRecordRaw> = [\n {\n path: '/teams',\n name: 'Team',\n redirect: { name: teamPaths.list.name },\n beforeEnter: [userAuthenticated],\n meta: {},\n children: [\n {\n path: teamPaths.list.path,\n name: teamPaths.list.name,\n component: () => import('./TeamList.vue'),\n meta: {\n title: 'Teams',\n description: 'Manage teams',\n side_bar: {\n section: 'Teams',\n visible_to: ['consumer', 'lead', 'staff', 'super_admin'],\n },\n },\n },\n {\n path: teamPaths.create.path,\n name: teamPaths.create.name,\n component: () => import('./CreateTeamForm.vue'),\n meta: {\n title: 'Create Team',\n description: 'Create new team',\n breadcrumbs: [\n {\n label: 'Teams',\n to: { name: teamPaths.list.name },\n },\n {\n label: 'Create',\n to: { name: teamPaths.create.name },\n },\n ],\n },\n },\n {\n path: teamPaths.view.path,\n component: () => import('./TeamParent.vue'),\n meta: {\n // Define team detail tabs\n sectionTabs: [\n {\n id: 'view',\n label: 'View',\n to: { name: teamPaths.view.name },\n },\n {\n id: 'edit',\n label: 'Edit',\n to: { name: teamPaths.edit.name },\n },\n {\n id: 'notes',\n label: 'Notes',\n to: { name: teamPaths.notes.name },\n },\n {\n id: 'attachments',\n label: 'Attachments',\n to: { name: teamPaths.attachments.name },\n },\n {\n id: 'history',\n label: 'History',\n to: { name: teamPaths.history.name },\n },\n {\n id: 'members',\n label: 'Members',\n to: { name: teamMemberPaths.list.name },\n },\n ],\n },\n children: [\n {\n path: '',\n name: teamPaths.view.name,\n component: () => import('./ViewTeam.vue'),\n meta: {\n title: 'View Team',\n description: 'View team details',\n currentTab: 'view',\n },\n },\n {\n path: teamPaths.edit.path,\n name: teamPaths.edit.name,\n component: () => import('./EditTeamForm.vue'),\n meta: {\n title: 'Edit Team',\n description: 'Edit team details',\n currentTab: 'edit',\n },\n },\n {\n path: teamPaths.notes.path,\n name: teamPaths.notes.name,\n component: () => import('./TeamNotesTab.vue'),\n meta: {\n title: 'Team Notes',\n description: 'View and manage notes',\n currentTab: 'notes',\n },\n },\n {\n path: teamPaths.attachments.path,\n name: teamPaths.attachments.name,\n component: () => import('./TeamAttachmentsTab.vue'),\n meta: {\n title: 'Team Attachments',\n description: 'View and manage attachments',\n currentTab: 'attachments',\n },\n },\n {\n path: teamPaths.history.path,\n name: teamPaths.history.name,\n component: () => import('./TeamHistoryTab.vue'),\n meta: {\n title: 'Team History',\n description: 'View audit trail and changes',\n currentTab: 'history',\n },\n },\n {\n path: teamPaths.members.path,\n name: teamPaths.members.name,\n component: () => import('./TeamMembersTab.vue'),\n meta: {\n title: 'Team Members',\n description: 'View and manage team members',\n currentTab: 'members',\n },\n children: teamMemberRoutes,\n },\n ],\n },\n ],\n },\n];\n"],"mappings":"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"}
|
package/dist/{useEmailVerificationChannel-QuMSgzzM.js → useEmailVerificationChannel-C4bvvG2b.js}
RENAMED
|
@@ -34,4 +34,4 @@ function useEmailVerificationChannel(awaitingVerification, onRedirect, getDefaul
|
|
|
34
34
|
|
|
35
35
|
//#endregion
|
|
36
36
|
export { useEmailVerificationChannel as t };
|
|
37
|
-
//# sourceMappingURL=useEmailVerificationChannel-
|
|
37
|
+
//# sourceMappingURL=useEmailVerificationChannel-C4bvvG2b.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEmailVerificationChannel-
|
|
1
|
+
{"version":3,"file":"useEmailVerificationChannel-C4bvvG2b.js","names":["authChannel: BroadcastChannel | null"],"sources":["../src/slices/auth/useEmailVerificationChannel.ts"],"sourcesContent":["import { useUserSessionStore } from '../../composables/useUserSessionStore';\nimport { getAndClearEmailVerificationReturnUrl } from '../../utils/useReturnUrl';\nimport { onUnmounted, watch } from 'vue';\nimport type { Ref } from 'vue';\n\nconst AUTH_CHANNEL = 'auth';\n\n/**\n * Listens for cross-tab email verification completion via BroadcastChannel.\n * When the user verifies their email in another tab, refreshes the session so this tab\n * has the updated email_verified state, then redirects to the stored return URL.\n * Call this when the signup form is showing \"awaiting verification\" state.\n */\nexport function useEmailVerificationChannel(\n awaitingVerification: Ref<boolean>,\n onRedirect: (targetUrl: string) => void,\n getDefaultRedirect: () => string,\n) {\n const sessionStore = useUserSessionStore();\n let authChannel: BroadcastChannel | null = null;\n\n watch(\n awaitingVerification,\n (isAwaiting) => {\n authChannel?.close();\n authChannel = null;\n if (!isAwaiting) return;\n authChannel = new BroadcastChannel(AUTH_CHANNEL);\n authChannel.onmessage = (event: MessageEvent<{ type: string }>) => {\n if (event.data?.type === 'email_verified') {\n const targetUrl =\n getAndClearEmailVerificationReturnUrl() ?? getDefaultRedirect();\n // Sync from localStorage so this tab has email_verified: true before redirect.\n // Tab B already wrote the new tokens; we just need to read them.\n sessionStore.syncFromStorage();\n onRedirect(targetUrl);\n }\n };\n },\n { immediate: true },\n );\n\n onUnmounted(() => {\n authChannel?.close();\n authChannel = null;\n });\n}\n"],"mappings":";;;;;AAKA,MAAM,eAAe;;;;;;;AAQrB,SAAgB,4BACd,sBACA,YACA,oBACA;CACA,MAAM,eAAe,qBAAqB;CAC1C,IAAIA,cAAuC;AAE3C,OACE,uBACC,eAAe;AACd,eAAa,OAAO;AACpB,gBAAc;AACd,MAAI,CAAC,WAAY;AACjB,gBAAc,IAAI,iBAAiB,aAAa;AAChD,cAAY,aAAa,UAA0C;AACjE,OAAI,MAAM,MAAM,SAAS,kBAAkB;IACzC,MAAM,YACJ,uCAAuC,IAAI,oBAAoB;AAGjE,iBAAa,iBAAiB;AAC9B,eAAW,UAAU;;;IAI3B,EAAE,WAAW,MAAM,CACpB;AAED,mBAAkB;AAChB,eAAa,OAAO;AACpB,gBAAc;GACd"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dragonmastery/dragoncore-vue",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.29",
|
|
4
4
|
"description": "Vue 3 components and composables for dragoncore",
|
|
5
5
|
"author": "DragonMastery",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"vue3-toastify": "0.2.8"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@dragonmastery/dragoncore-shared": "^0.0.
|
|
44
|
+
"@dragonmastery/dragoncore-shared": "^0.0.29",
|
|
45
45
|
"@dragonmastery/zinia-forms-core": ">=0.5.11",
|
|
46
46
|
"@vueuse/core": ">=14.0.0",
|
|
47
47
|
"pinia": ">=3.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Signup-BCVZZCR_.js","names":[],"sources":["../src/slices/auth/utils/isEmailVerificationRequiredError.ts","../src/slices/auth/features/signup/signupSchema.ts","../src/slices/auth/features/signup/Signup.vue"],"sourcesContent":["/**\n * Detects if an error indicates that email verification is required before login.\n * Used in signup flow when auto-login after signup fails due to unverified email.\n */\nexport function isEmailVerificationRequiredError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const e = error as {\n error_type?: string;\n error_name?: string;\n name?: string;\n message?: string;\n };\n if (\n e.error_type === 'EmailVerificationRequiredError' ||\n e.error_name === 'EmailVerificationRequiredError' ||\n e.name === 'EmailVerificationRequiredError'\n ) {\n return true;\n }\n const msg = typeof e.message === 'string' ? e.message : '';\n return msg.includes('Please verify your email before logging in');\n}\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { signupInitiateSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the signup form type (signupInitiate: email + passwords only)\nexport type SignupForm = z.infer<typeof signupInitiateSchema>;\n\n// Enhance the schema with metadata\nexport const signupSchemaWithMetadata = withMetadata(signupInitiateSchema, 'signupInitiateSchema', {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'email',\n className: 'login-field',\n autofocus: true,\n },\n 'passwords.password': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n 'passwords.password_confirm': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n});\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Sign Up</h1>\n\n <div\n v-if=\"awaitingVerification\"\n class=\"space-y-4 text-center\"\n >\n <p class=\"text-base-content/80\">\n We sent a verification link to your email address. Click the link to verify your account,\n then you can continue.\n </p>\n <p class=\"text-sm text-base-content/60\">\n If you opened the link in another tab, we'll redirect you automatically when verification\n completes.\n </p>\n </div>\n\n <div v-else-if=\"declinedMessage\" class=\"mb-4\">\n <div class=\"alert alert-warning\">\n <span>{{ declinedMessage }}</span>\n </div>\n </div>\n\n <ZiniaForm\n v-if=\"!awaitingVerification\"\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n >\n <zinia.EmailField />\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\n\n <div\n v-if=\"showConsentSection\"\n class=\"mb-6 p-4 rounded-lg bg-base-100 border border-base-300\"\n >\n <p class=\"font-medium mb-2\">{{ signupConsentBeforeText }}</p>\n <ul class=\"list-disc list-inside space-y-1 text-sm text-base-content/80\">\n <li\n v-for=\"link in legalLinks\"\n :key=\"link.path\"\n >\n <AppLink\n :to=\"link.path\"\n class=\"link link-accent\"\n >\n {{ link.label }}\n </AppLink>\n </li>\n </ul>\n <p\n v-if=\"signupConsentAfterText\"\n class=\"mt-2 text-sm text-base-content/70\"\n >\n {{ signupConsentAfterText }}\n </p>\n </div>\n\n <ZiniaSubmitButton submitText=\"Sign Up\" submittingText=\"Signing up...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n SignupInitiateInputDto,\n SignupInitiateResponseDto,\n} from '@dragonmastery/dragoncore-shared';\nimport type { UserDetailsTokenPayload } from '../../../../lib/models/userSession';\nimport AppLink from '../../../../components/AppLink.vue';\nimport { setSignupConsentFlowData } from '../../signupConsentStorage';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useEmailVerificationChannel } from '../../useEmailVerificationChannel';\nimport { isEmailVerificationRequiredError } from '../../utils/isEmailVerificationRequiredError';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { jwtDecode } from 'jwt-decode';\nimport { computed, inject, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { signupSchemaWithMetadata } from './signupSchema';\n\nconst REDIRECTED_TO_CONSENTS = Symbol('redirected-to-consents');\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(signupSchemaWithMetadata, {\n storeName: 'signup-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst sessionStore = useUserSessionStore();\nconst route = useRoute();\nconst router = useRouter();\nconst { emailVerificationMode } = useEnv();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst awaitingVerification = ref(false);\n\nconst signupConsentBeforeText = inject<string>(\n 'signupConsentBeforeText',\n 'By signing up you agree to these terms:',\n);\nconst signupConsentAfterText = inject<string>(\n 'signupConsentAfterText',\n \"After you click Sign Up, we'll show you each document to review and accept.\",\n);\n\n// Legal routes - auto-collected from router (meta.legal: true) for the consent preview\nconst legalLinks = computed(() => {\n const routes = router.getRoutes();\n return routes\n .filter((r) => r.meta?.legal === true)\n .map((r) => {\n const resolved = router.resolve({ name: r.name as string });\n return {\n path: resolved.path,\n label: (r.meta?.title as string) ?? (r.name as string) ?? r.path,\n };\n })\n .sort((a, b) => a.path.localeCompare(b.path));\n});\n\nconst showConsentSection = computed(() => legalLinks.value.length > 0);\n\n// Show declined message when returning from consent flow\nconst declinedMessage = computed(() => {\n const declined = route.query.declined;\n if (declined === '1' || declined === 'true') {\n return 'You declined the consent. Your account was not created.';\n }\n return null;\n});\n\nconst { mutate: signupInitiateMutate } = useMutation<\n import('@dragonmastery/dragoncore-shared').DragoncoreApi,\n SignupInitiateInputDto,\n SignupInitiateResponseDto\n>(\n (api, input: SignupInitiateInputDto) => api.users.signupInitiate(input),\n { skipAuthCheck: true, credentials: 'include' },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: SignupInitiateInputDto) => {\n const result = await signupInitiateMutate(data);\n if (!result) throw new Error('Signup failed');\n\n if (result.created) {\n if (!result.session?.access_token || !result.session?.user_details_token) {\n throw new Error('Failed to get session after signup');\n }\n return {\n access_token: result.session.access_token,\n user_details_token: result.session.user_details_token,\n };\n }\n\n setSignupConsentFlowData({\n token: result.signup_consent_token,\n consents: result.consents,\n });\n const basePath = withReturnUrl('/auth/signup-consents', returnUrl.value);\n const sep = basePath.includes('?') ? '&' : '?';\n await router.push(`${basePath}${sep}token=${encodeURIComponent(result.signup_consent_token)}`);\n return REDIRECTED_TO_CONSENTS;\n};\n\n// Handle success (not called when we redirect to consent flow)\nconst handleSuccess = async (data: { access_token: string; user_details_token: string } | symbol) => {\n if (data === REDIRECTED_TO_CONSENTS) return;\n\n const payload = data as { access_token: string; user_details_token: string };\n sessionStore.setSession(payload.user_details_token);\n sessionStore.setAccessToken(payload.access_token);\n\n form.reset();\n\n const defaultRedirect = getValidReturnUrl(route, '/');\n const redirectTo =\n emailVerificationMode !== 'disabled'\n ? (() => {\n try {\n const tokenPayload = jwtDecode<UserDetailsTokenPayload>(payload.user_details_token);\n const emailVerified = tokenPayload.details?.user?.email_verified ?? true;\n return emailVerified ? defaultRedirect : withReturnUrl('/auth/verify-email', returnUrl.value);\n } catch {\n return defaultRedirect;\n }\n })()\n : defaultRedirect;\n\n await router.push(redirectTo);\n const wentToVerify = typeof redirectTo === 'string' && redirectTo.startsWith('/auth/verify-email');\n toast.success(\n !wentToVerify\n ? 'Registration successful! You are now logged in.'\n : 'Registration successful! Please check your email to verify your account.',\n );\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n if (isEmailVerificationRequiredError(error)) {\n return;\n }\n const message = error instanceof Error ? error.message : 'Registration failed';\n toast.error(message);\n};\n\nuseEmailVerificationChannel(\n awaitingVerification,\n (targetUrl) => router.push(targetUrl),\n () => getValidReturnUrl(route, '/'),\n);\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SignupConsentFlow-Dd3QAkVF.js","names":["acceptancesSoFar: Record<string, boolean>"],"sources":["../src/slices/auth/features/signup_consents/SignupConsentFlow.vue"],"sourcesContent":["<template>\n <div class=\"w-full max-w-md mx-auto mb-8 sm:mb-10 bg-base-200 px-3 py-4 sm:px-6 sm:py-6 rounded-xl shadow-md container min-w-0\">\n <div v-if=\"loading\" class=\"text-center\">\n <p class=\"text-base-content/80\">Loading...</p>\n </div>\n\n <div v-else-if=\"!token || !consents.length\" class=\"text-center\">\n <p class=\"text-base-content/80\">Invalid or expired signup link. Please start over.</p>\n <AppLink :to=\"signupLink\" class=\"btn btn-primary btn-sm mt-4\">Back to sign up</AppLink>\n </div>\n\n <div v-else-if=\"currentConfig\" class=\"space-y-6\">\n <ConsentFlowStep\n :config=\"currentConfig\"\n :current-step=\"currentStep\"\n :total-steps=\"totalSteps\"\n :submitting=\"submitting\"\n :submit-error=\"submitError\"\n :declining=\"declining\"\n accept-label=\"Accept and continue\"\n submit-accept-label=\"Submitting...\"\n decline-label=\"Decline\"\n decline-submitting-label=\"Returning...\"\n intro-text=\"Please read the full document before accepting. Scroll to the bottom when you've finished reading. You can decline at any time; if you decline, your account will not be created and you will return to sign up.\"\n @accept=\"handleAccept\"\n @decline=\"handleDecline\"\n >\n <template #error-recovery>\n <span>{{ submitError }}</span>\n <p class=\"text-sm opacity-90\">\n You can try again below or go back to sign up.\n </p>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm mt-1\"\n :disabled=\"goingBack || submitting\"\n @click=\"goBackToSignup\"\n >\n {{ goingBack ? 'Returning...' : 'Back to sign up' }}\n </button>\n </template>\n </ConsentFlowStep>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\nimport AppLink from '../../../../components/AppLink.vue';\nimport ConsentFlowStep from '../shared/ConsentFlowStep.vue';\nimport {\n clearSignupConsentFlowData,\n getSignupConsentFlowData,\n} from '../../signupConsentStorage';\nimport { computed, nextTick, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport {\n getValidReturnUrl,\n setEmailVerificationReturnUrl,\n withReturnUrl,\n} from '../../../../utils/useReturnUrl';\n\nconst sessionStore = useUserSessionStore();\nconst router = useRouter();\nconst route = useRoute();\nconst { emailVerificationMode } = useEnv();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst signupLink = computed(() => withReturnUrl('/auth/signup', returnUrl.value));\n\nconst token = computed(() => (route.query.token as string) ?? '');\nconst storedData = ref<{ token: string; consents: SignupRequirementsDto } | null>(null);\nconst loading = ref(true);\n\n// Load consents from sessionStorage (must match token from URL)\nconst consents = computed(() => {\n const t = token.value;\n const data = storedData.value;\n if (!t || !data || data.token !== t) return [];\n return data.consents;\n});\n\n// Fallback: if no stored data, fetch consents with token (e.g. user opened link in new tab)\nconst { mutate: fetchConsentsForToken } = useMutation(\n (api, _t: string) => api.users.getSignupConsentsForToken(),\n {\n skipAuthCheck: true,\n credentials: 'include',\n customAuthToken: (t) => t,\n },\n);\n\nasync function loadConsents() {\n loading.value = true;\n const t = token.value;\n if (!t) {\n loading.value = false;\n return;\n }\n const data = getSignupConsentFlowData();\n if (data && data.token === t) {\n storedData.value = data;\n loading.value = false;\n return;\n }\n try {\n const reqs = await fetchConsentsForToken(t);\n if (reqs && Array.isArray(reqs) && reqs.length > 0) {\n storedData.value = { token: t, consents: reqs };\n }\n } catch {\n // Token invalid/expired - consents stay empty, user sees \"Invalid or expired\" message\n }\n loading.value = false;\n}\n\nloadConsents();\n\nconst currentStep = ref(1);\nconst totalSteps = computed(() => consents.value.length);\nconst currentConfig = computed(\n () => consents.value[currentStep.value - 1] ?? null,\n);\n\nconst declining = ref(false);\nconst goingBack = ref(false);\nconst submitting = ref(false);\nconst submitError = ref<string | null>(null);\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) return error.message;\n if (error && typeof error === 'object' && 'message' in error && typeof (error as { message: unknown }).message === 'string') {\n return (error as { message: string }).message;\n }\n return 'Registration failed. Please try again.';\n}\n\nconst { mutate: signupCompleteMutate } = useMutation(\n (api, input: { token: string; acceptances: Record<string, boolean> }) =>\n api.users.signupComplete({ acceptances: input.acceptances }),\n {\n skipAuthCheck: true,\n credentials: 'include',\n customAuthToken: (input) => input.token,\n },\n);\n\nasync function handleAccept() {\n const config = currentConfig.value;\n if (!config || !token.value || !consents.value.length) return;\n\n submitError.value = null;\n\n const acceptancesSoFar: Record<string, boolean> = {};\n for (let i = 0; i < currentStep.value; i++) {\n const c = consents.value[i];\n if (c) acceptancesSoFar[c.type] = true;\n }\n\n if (currentStep.value >= totalSteps.value) {\n submitting.value = true;\n try {\n await completeSignup(acceptancesSoFar);\n } catch (err) {\n submitError.value = getErrorMessage(err);\n } finally {\n submitting.value = false;\n }\n return;\n }\n\n currentStep.value++;\n nextTick();\n}\n\nasync function completeSignup(acceptances: Record<string, boolean>) {\n const t = token.value;\n if (!t) return;\n\n const session = await signupCompleteMutate({ token: t, acceptances });\n if (!session?.access_token || !session?.user_details_token) {\n throw new Error('Signup failed');\n }\n\n clearSignupConsentFlowData();\n\n sessionStore.setSession(session.user_details_token);\n sessionStore.setAccessToken(session.access_token);\n\n if (emailVerificationMode !== 'disabled') {\n if (emailVerificationMode === 'strict') {\n const targetUrl = getValidReturnUrl(route, '/');\n setEmailVerificationReturnUrl(targetUrl);\n }\n window.scrollTo(0, 0);\n const verifyPath = withReturnUrl('/auth/verify-email', returnUrl.value);\n await router.push(verifyPath);\n return;\n }\n\n window.scrollTo(0, 0);\n const defaultRedirect = getValidReturnUrl(route, '/');\n await router.push(defaultRedirect);\n toast.success('Registration successful! You are now logged in.');\n}\n\nasync function handleDecline() {\n declining.value = true;\n try {\n clearSignupConsentFlowData();\n const signupPath = withReturnUrl('/auth/signup', returnUrl.value);\n await router.push({ path: signupPath, query: { ...route.query, declined: '1' } });\n } finally {\n declining.value = false;\n }\n}\n\nasync function goBackToSignup() {\n goingBack.value = true;\n try {\n clearSignupConsentFlowData();\n const signupPath = withReturnUrl('/auth/signup', returnUrl.value);\n const { declined: _d, token: _t, ...rest } = route.query;\n await router.push({ path: signupPath, query: rest });\n } finally {\n goingBack.value = false;\n }\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ViewTeam-RXno7OPV.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signupConsentStorage-Ct4ZuKi-.js","names":[],"sources":["../src/slices/auth/signupConsentStorage.ts"],"sourcesContent":["import type { SignupRequirementsDto } from '@dragonmastery/dragoncore-shared';\n\nconst STORAGE_KEY = 'dragoncore-signup-consent-flow';\n\nexport interface SignupConsentFlowData {\n token: string;\n consents: SignupRequirementsDto;\n}\n\nexport function setSignupConsentFlowData(data: SignupConsentFlowData): void {\n try {\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n } catch {\n // Ignore storage errors\n }\n}\n\nexport function getSignupConsentFlowData(): SignupConsentFlowData | null {\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as SignupConsentFlowData;\n if (!parsed?.token || !Array.isArray(parsed.consents)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function clearSignupConsentFlowData(): void {\n try {\n sessionStorage.removeItem(STORAGE_KEY);\n } catch {\n // Ignore\n }\n}\n"],"mappings":";AAEA,MAAM,cAAc;AAOpB,SAAgB,yBAAyB,MAAmC;AAC1E,KAAI;AACF,iBAAe,QAAQ,aAAa,KAAK,UAAU,KAAK,CAAC;SACnD;;AAKV,SAAgB,2BAAyD;AACvE,KAAI;EACF,MAAM,MAAM,eAAe,QAAQ,YAAY;AAC/C,MAAI,CAAC,IAAK,QAAO;EACjB,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,CAAC,QAAQ,SAAS,CAAC,MAAM,QAAQ,OAAO,SAAS,CAAE,QAAO;AAC9D,SAAO;SACD;AACN,SAAO;;;AAIX,SAAgB,6BAAmC;AACjD,KAAI;AACF,iBAAe,WAAW,YAAY;SAChC"}
|