@dragonmastery/dragoncore-vue 0.0.28 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CreateTeamForm-CmVZdqOQ.js → CreateTeamForm-CCfgSWUA.js} +2 -2
- package/dist/{CreateTeamForm-DRfZ74on.js → CreateTeamForm-DNkueBzR.js} +2 -2
- package/dist/{CreateTeamForm-DRfZ74on.js.map → CreateTeamForm-DNkueBzR.js.map} +1 -1
- package/dist/{CreditBalanceDashboard-BRY56-9w.js → CreditBalanceDashboard-CLQ8NZnY.js} +2 -2
- package/dist/{CreditBalanceDashboard-BRY56-9w.js.map → CreditBalanceDashboard-CLQ8NZnY.js.map} +1 -1
- package/dist/{CreditBalanceDashboard-CwXWREgJ.js → CreditBalanceDashboard-jdvZa-ZT.js} +4 -4
- package/dist/{CreditManagement-D-bsc1US.js → CreditManagement-Dus4O1BY.js} +2 -2
- package/dist/{CreditManagement-D-bsc1US.js.map → CreditManagement-Dus4O1BY.js.map} +1 -1
- package/dist/{CreditManagement-BAuzw-NE.js → CreditManagement-DvGikLLe.js} +4 -4
- package/dist/{CreditTransactionHistory-plIaRscn.js → CreditTransactionHistory-BZZGQxTV.js} +2 -2
- package/dist/{CreditTransactionHistory-plIaRscn.js.map → CreditTransactionHistory-BZZGQxTV.js.map} +1 -1
- package/dist/{CustomerCreateSupportTicketForm-D72blvMU.js → CustomerCreateSupportTicketForm-C3CgjqXg.js} +3 -3
- package/dist/{CustomerCreateSupportTicketForm-Co6C_P5o.js → CustomerCreateSupportTicketForm-CeG8IKA1.js} +2 -2
- package/dist/{CustomerCreateSupportTicketForm-Co6C_P5o.js.map → CustomerCreateSupportTicketForm-CeG8IKA1.js.map} +1 -1
- package/dist/{CustomerSupportTicketList-CB_Y1lVj.js → CustomerSupportTicketList-D1pcZzcX.js} +21 -21
- package/dist/{CustomerSupportTicketSuccess-DVqoR5-o.js → CustomerSupportTicketSuccess-Cc75m_p-.js} +2 -2
- package/dist/{CustomerSupportTicketSuccess-DVqoR5-o.js.map → CustomerSupportTicketSuccess-Cc75m_p-.js.map} +1 -1
- package/dist/{CustomerSupportTicketSuccess-B87Zth-g.js → CustomerSupportTicketSuccess-ca10puM-.js} +3 -3
- package/dist/{DefaultReferralTeamPage-BHail7YF.js → DefaultReferralTeamPage-fO3tmwOb.js} +102 -62
- package/dist/DefaultReferralTeamPage-fO3tmwOb.js.map +1 -0
- package/dist/{EditTeamForm-DhutyI9c.js → EditTeamForm-BzTAypZT.js} +2 -2
- package/dist/{EditTeamForm-BEOkUaKG.js → EditTeamForm-DdvKHlNj.js} +2 -2
- package/dist/{EditTeamForm-BEOkUaKG.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-CvBKztlD.js → SavedFiltersPage-B9aQYpwf.js} +22 -22
- package/dist/{SavedFiltersPage-CvBKztlD.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-clxBjJlU.js → SignupConsentFlow-CRtiMpcS.js} +9 -4
- package/dist/SignupConsentFlow-CRtiMpcS.js.map +1 -0
- package/dist/{StaffCreateSupportTicketForm-Cm595v_4.js → StaffCreateSupportTicketForm-ANtaO4pe.js} +2 -2
- package/dist/{StaffCreateSupportTicketForm-Cm595v_4.js.map → StaffCreateSupportTicketForm-ANtaO4pe.js.map} +1 -1
- package/dist/{StaffCreateSupportTicketForm-DBhhJyXE.js → StaffCreateSupportTicketForm-CtU12OGq.js} +3 -3
- package/dist/{StaffSupportTicketList-2TbMweMK.js → StaffSupportTicketList-CqK8PVq4.js} +21 -21
- package/dist/{StaffSupportTicketSuccess-DKzJs74k.js → StaffSupportTicketSuccess-BMh5amWI.js} +3 -3
- package/dist/{StaffSupportTicketSuccess-DgULDGIj.js → StaffSupportTicketSuccess-CB4Oa_2J.js} +2 -2
- package/dist/{StaffSupportTicketSuccess-DgULDGIj.js.map → StaffSupportTicketSuccess-CB4Oa_2J.js.map} +1 -1
- package/dist/{TeamAttachmentsTab-D0SJplvU.js → TeamAttachmentsTab-BG_K7uwG.js} +21 -21
- package/dist/{TeamList-gppM0GOD.js → TeamList-B4gWPzce.js} +2 -2
- package/dist/{TeamList-gppM0GOD.js.map → TeamList-B4gWPzce.js.map} +1 -1
- package/dist/{TeamList-DU6CFPUY.js → TeamList-iAH9mOdd.js} +2 -2
- package/dist/{TeamParent-CuASTHKr.js → TeamParent-D_IbzH8B.js} +2 -2
- package/dist/{TeamParent-YPtenk3l.js → TeamParent-KQmJgJ9x.js} +2 -2
- package/dist/{TeamParent-YPtenk3l.js.map → TeamParent-KQmJgJ9x.js.map} +1 -1
- package/dist/{VerifyEmail-CWUhRA1o.js → VerifyEmail-BVwHQpbw.js} +2 -2
- package/dist/{VerifyEmail-CWUhRA1o.js.map → VerifyEmail-BVwHQpbw.js.map} +1 -1
- package/dist/{VerifyEmail-CLDngljq.js → VerifyEmail-BYYsE-M_.js} +2 -2
- package/dist/{ViewTeam-CRmIplCt.js → ViewTeam-BV7SjH8R.js} +129 -30
- package/dist/ViewTeam-BV7SjH8R.js.map +1 -0
- package/dist/{ViewTeam-Bvvfik4P.js → ViewTeam-BvLIv9Dd.js} +2 -2
- package/dist/{customerSupportTicketRoutes-Cy4fp4wx.js → customerSupportTicketRoutes-_HjQcEAD.js} +5 -5
- package/dist/{customerSupportTicketRoutes-Cy4fp4wx.js.map → customerSupportTicketRoutes-_HjQcEAD.js.map} +1 -1
- package/dist/index.d.ts +675 -663
- package/dist/index.js +22 -22
- package/dist/{saved_filter-jeZd2rlb.js → saved_filter-C6YHkEMV.js} +2 -2
- package/dist/{saved_filter-jeZd2rlb.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-zjaOyP9b.js → src-BIX3mMjo.js} +10 -10
- package/dist/{src-zjaOyP9b.js.map → src-BIX3mMjo.js.map} +1 -1
- package/dist/{staffSupportTicketRoutes-L4CU5dcu.js → staffSupportTicketRoutes-WPaItK5S.js} +5 -5
- package/dist/{staffSupportTicketRoutes-L4CU5dcu.js.map → staffSupportTicketRoutes-WPaItK5S.js.map} +1 -1
- package/dist/{teamRoutes-CtNcFZjR.js → teamRoutes-CQWRPy3J.js} +7 -7
- package/dist/{teamRoutes-CtNcFZjR.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/DefaultReferralTeamPage-BHail7YF.js.map +0 -1
- package/dist/Signup-BCVZZCR_.js.map +0 -1
- package/dist/SignupConsentFlow-clxBjJlU.js.map +0 -1
- package/dist/ViewTeam-CRmIplCt.js.map +0 -1
- package/dist/signupConsentStorage-Ct4ZuKi-.js.map +0 -1
|
@@ -3,9 +3,9 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
|
|
|
3
3
|
import "./useQueryCache-alzaRWEb.js";
|
|
4
4
|
import "./useMutation-BLNuJoYl.js";
|
|
5
5
|
import "./useQuery-BzUGEOj0.js";
|
|
6
|
-
import { O as TeamAttachmentsTab_default } from "./src-
|
|
6
|
+
import { O as TeamAttachmentsTab_default } from "./src-BIX3mMjo.js";
|
|
7
7
|
import "./AppLink-FcNGKgvG.js";
|
|
8
|
-
import "./saved_filter-
|
|
8
|
+
import "./saved_filter-C6YHkEMV.js";
|
|
9
9
|
import "./ConfirmDialog-DjthOYU6.js";
|
|
10
10
|
import "./InlineAttachments-DAn_QknY.js";
|
|
11
11
|
import "./TeamMembersTab-BigqpBDH.js";
|
|
@@ -20,45 +20,45 @@ import "./UserProfilePage-FNLYK9kj.js";
|
|
|
20
20
|
import "./ChangePasswordPage-nr0B06HB.js";
|
|
21
21
|
import "./teamMetadata-26Mwjb2i.js";
|
|
22
22
|
import "./team_memberRoutes-Cxgte_vj.js";
|
|
23
|
-
import "./teamRoutes-
|
|
24
|
-
import "./CreateTeamForm-
|
|
25
|
-
import "./EditTeamForm-
|
|
23
|
+
import "./teamRoutes-CQWRPy3J.js";
|
|
24
|
+
import "./CreateTeamForm-DNkueBzR.js";
|
|
25
|
+
import "./EditTeamForm-DdvKHlNj.js";
|
|
26
26
|
import "./TeamHistoryTab-p3hDxCc3.js";
|
|
27
|
-
import "./TeamList-
|
|
27
|
+
import "./TeamList-B4gWPzce.js";
|
|
28
28
|
import "./TeamNotesTab-DPw9YEwK.js";
|
|
29
|
-
import "./TeamParent-
|
|
30
|
-
import "./ViewTeam-
|
|
29
|
+
import "./TeamParent-KQmJgJ9x.js";
|
|
30
|
+
import "./ViewTeam-BV7SjH8R.js";
|
|
31
31
|
import "./teamMemberMetadata-DX0W-B7p.js";
|
|
32
32
|
import "./CreateTeamMemberForm-ITp4XFn9.js";
|
|
33
33
|
import "./EditTeamMemberForm-Fyf8Zxfh.js";
|
|
34
34
|
import "./TeamMemberList-D0-dM5kI.js";
|
|
35
35
|
import "./TeamMemberParent-CJGWXjuM.js";
|
|
36
36
|
import "./ViewTeamMember-Cf5yXdv6.js";
|
|
37
|
-
import "./customerSupportTicketRoutes-
|
|
38
|
-
import "./staffSupportTicketRoutes-
|
|
37
|
+
import "./customerSupportTicketRoutes-_HjQcEAD.js";
|
|
38
|
+
import "./staffSupportTicketRoutes-WPaItK5S.js";
|
|
39
39
|
import "./TimelineSystemEvent-Ch1sZiyO.js";
|
|
40
|
-
import "./CustomerCreateSupportTicketForm-
|
|
40
|
+
import "./CustomerCreateSupportTicketForm-CeG8IKA1.js";
|
|
41
41
|
import "./CustomerSupportTicketParent-BaKfkSlU.js";
|
|
42
|
-
import "./CustomerSupportTicketSuccess-
|
|
43
|
-
import "./StaffCreateSupportTicketForm-
|
|
42
|
+
import "./CustomerSupportTicketSuccess-Cc75m_p-.js";
|
|
43
|
+
import "./StaffCreateSupportTicketForm-ANtaO4pe.js";
|
|
44
44
|
import "./SupportTicketDevLifecycleBadge-BYKZjEv6.js";
|
|
45
45
|
import "./StaffSupportTicketParent-yoC-_Lku.js";
|
|
46
|
-
import "./StaffSupportTicketSuccess-
|
|
47
|
-
import "./
|
|
48
|
-
import "./
|
|
49
|
-
import "./
|
|
46
|
+
import "./StaffSupportTicketSuccess-CB4Oa_2J.js";
|
|
47
|
+
import "./Signup-EykiX-bQ.js";
|
|
48
|
+
import "./LoginForm-CSMHsZrq.js";
|
|
49
|
+
import "./useEmailVerificationChannel-C4bvvG2b.js";
|
|
50
50
|
import "./ForgotPassword-Dd-E3_o1.js";
|
|
51
51
|
import "./ResetPassword-CyizBRob.js";
|
|
52
52
|
import "./Logout-Bdktl4NZ.js";
|
|
53
53
|
import "./mfaSchema-C6PatIbY.js";
|
|
54
54
|
import "./MfaSetup-Bjc3v0hs.js";
|
|
55
55
|
import "./MfaVerify-uJlPz8xg.js";
|
|
56
|
-
import "./VerifyEmail-
|
|
56
|
+
import "./VerifyEmail-BVwHQpbw.js";
|
|
57
57
|
import "./UserListPage-A0_eNpQ1.js";
|
|
58
58
|
import "./CreateUserPage-1WiLNGr_.js";
|
|
59
59
|
import "./EditUserPage-BBzGmOrx.js";
|
|
60
|
-
import "./CreditTransactionHistory-
|
|
61
|
-
import "./CreditBalanceDashboard-
|
|
62
|
-
import "./CreditManagement-
|
|
60
|
+
import "./CreditTransactionHistory-BZZGQxTV.js";
|
|
61
|
+
import "./CreditBalanceDashboard-CLQ8NZnY.js";
|
|
62
|
+
import "./CreditManagement-Dus4O1BY.js";
|
|
63
63
|
|
|
64
64
|
export { TeamAttachmentsTab_default as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as executeWithAuth } from "./useRpcAuth-CJtq1dqM.js";
|
|
2
2
|
import { r as getRefreshTokenHandler } from "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
|
|
3
3
|
import { t as formatSystemTimestamp } from "./convertToLocalDateTime-C13-PrSA.js";
|
|
4
|
-
import { t as teamPaths } from "./teamRoutes-
|
|
4
|
+
import { t as teamPaths } from "./teamRoutes-CQWRPy3J.js";
|
|
5
5
|
import { createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, resolveComponent, toDisplayString, unref, withCtx } from "vue";
|
|
6
6
|
import { TeamReadSchema } from "@dragonmastery/dragoncore-shared";
|
|
7
7
|
import { ActionIcons, useCursorDataTable, withMetadata } from "@dragonmastery/zinia-forms-core";
|
|
@@ -138,4 +138,4 @@ var TeamList_default = _sfc_main;
|
|
|
138
138
|
|
|
139
139
|
//#endregion
|
|
140
140
|
export { teamRowSchemaWithMetadata as n, TeamList_default as t };
|
|
141
|
-
//# sourceMappingURL=TeamList-
|
|
141
|
+
//# sourceMappingURL=TeamList-B4gWPzce.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamList-
|
|
1
|
+
{"version":3,"file":"TeamList-B4gWPzce.js","names":["variables: TeamFiltersDto"],"sources":["../src/slices/team/TeamRowSchema.ts","../src/slices/team/TeamList.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { TeamReadSchema } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Reuse the existing TeamReadSchema from the validation library\n * for the data table rows - don't recreate it!\n */\nexport const teamRowSchemaWithMetadata = withMetadata(TeamReadSchema, 'teamRow', {});\n\nexport type TeamRow = typeof TeamReadSchema._type;\n","<template>\n <div>\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4 mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold\">Teams</h1>\n <router-link\n :to=\"{ name: teamPaths.create.name }\"\n class=\"btn btn-primary btn-sm sm:btn-md\"\n >\n Create\n </router-link>\n </div>\n <ZiniaDataTable>\n <template #cell-display_name=\"{ row }\">\n <router-link\n :to=\"{ name: teamPaths.view.name, params: { id: row.id } }\"\n class=\"link link-primary\"\n >\n {{ row.display_name }}\n </router-link>\n </template>\n <template #cell-archived_at=\"{ row }\">\n {{ row.archived_at ? 'Archived' : 'Active' }}\n </template>\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n <template #cell-updated_at=\"{ row }\">\n {{ formatSystemTimestamp(row.updated_at) }}\n </template>\n <template #cell-actions=\"{ row }\">\n <router-link\n :to=\"{\n name: teamPaths.view.name,\n params: { id: row.id },\n }\"\n class=\"btn btn-sm btn-primary\"\n >\n View\n </router-link>\n </template>\n </ZiniaDataTable>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamFiltersDto } from '@dragonmastery/dragoncore-shared';\nimport { ActionIcons, useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { ref } from 'vue';\nimport { executeWithAuth } from '../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../utils/convertToLocalDateTime';\nimport { teamRowSchemaWithMetadata, type TeamRow } from './TeamRowSchema';\nimport { teamPaths } from './teamRoutes';\n\n// Store pagination token for breadcrumb state\nconst currentPaginationToken = ref<string | undefined | null>();\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable } = useCursorDataTable(teamRowSchemaWithMetadata, {\n fetchData: async ({ cursor, pageSize, sort, filters, search }) => {\n const variables: TeamFiltersDto = {\n first: pageSize,\n sortBy: sort?.field ? (sort.field as string) : 'created_at',\n sortDirection: (sort?.direction === 'asc' ? 'asc' : 'desc') as 'asc' | 'desc',\n ...(cursor ? { after: cursor } : {}),\n ...(currentPaginationToken.value\n ? { paginationToken: currentPaginationToken.value }\n : {}),\n ...(search ? { search } : {}),\n ...filters,\n };\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.teams.listTeams(variables);\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n // Store the new pagination token for next request\n currentPaginationToken.value = result?.pageInfo?.paginationToken;\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n display_name: {\n label: 'Name',\n field: 'display_name',\n sortable: true,\n },\n unique_name: {\n label: 'Unique Name',\n field: 'unique_name',\n sortable: true,\n },\n contact_email: {\n label: 'Contact Email',\n field: 'contact_email',\n sortable: true,\n filterable: true,\n },\n address_city: {\n label: 'City',\n field: 'address_city',\n sortable: true,\n filterable: true,\n },\n archived_at: {\n label: 'Status',\n field: 'archived_at',\n sortable: true,\n },\n created_at: {\n label: 'Created',\n field: 'created_at',\n sortable: true,\n },\n updated_at: {\n label: 'Updated',\n field: 'updated_at',\n sortable: true,\n },\n },\n actions: {\n items: [\n {\n key: 'view',\n icon: ActionIcons.edit,\n size: 'xs',\n variant: 'primary',\n type: 'link',\n href: (row: TeamRow) => `/teams/${row.id}`,\n },\n ],\n },\n search: {\n searchableFields: ['display_name', 'unique_name', 'legal_name'],\n },\n pagination: { pageSize: 25 },\n});\n</script>\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import "./useRpcAuth-CJtq1dqM.js";
|
|
|
2
2
|
import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
|
|
3
3
|
import "./userAuthorized-klLUHGxT.js";
|
|
4
4
|
import "./team_memberRoutes-Cxgte_vj.js";
|
|
5
|
-
import "./teamRoutes-
|
|
6
|
-
import { t as TeamList_default } from "./TeamList-
|
|
5
|
+
import "./teamRoutes-CQWRPy3J.js";
|
|
6
|
+
import { t as TeamList_default } from "./TeamList-B4gWPzce.js";
|
|
7
7
|
|
|
8
8
|
export { TeamList_default as default };
|
|
@@ -5,7 +5,7 @@ import "./useQuery-BzUGEOj0.js";
|
|
|
5
5
|
import "./useBreadcrumbs-DIqU5AAp.js";
|
|
6
6
|
import "./userAuthorized-klLUHGxT.js";
|
|
7
7
|
import "./team_memberRoutes-Cxgte_vj.js";
|
|
8
|
-
import "./teamRoutes-
|
|
9
|
-
import { t as TeamParent_default } from "./TeamParent-
|
|
8
|
+
import "./teamRoutes-CQWRPy3J.js";
|
|
9
|
+
import { t as TeamParent_default } from "./TeamParent-KQmJgJ9x.js";
|
|
10
10
|
|
|
11
11
|
export { TeamParent_default as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as useQuery } from "./useQuery-BzUGEOj0.js";
|
|
2
2
|
import { n as useBreadcrumbs } from "./useBreadcrumbs-DIqU5AAp.js";
|
|
3
|
-
import { t as teamPaths } from "./teamRoutes-
|
|
3
|
+
import { t as teamPaths } from "./teamRoutes-CQWRPy3J.js";
|
|
4
4
|
import { computed, createBlock, createElementBlock, createElementVNode, defineComponent, openBlock, provide, resolveComponent, toDisplayString, unref } from "vue";
|
|
5
5
|
import { useRoute } from "vue-router";
|
|
6
6
|
|
|
@@ -80,4 +80,4 @@ var TeamParent_default = _sfc_main;
|
|
|
80
80
|
|
|
81
81
|
//#endregion
|
|
82
82
|
export { TeamParent_default as t };
|
|
83
|
-
//# sourceMappingURL=TeamParent-
|
|
83
|
+
//# sourceMappingURL=TeamParent-KQmJgJ9x.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamParent-
|
|
1
|
+
{"version":3,"file":"TeamParent-KQmJgJ9x.js","names":[],"sources":["../src/slices/team/TeamParent.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 <RouterView v-else :team=\"team\" :isLoading=\"isLoading\" :error=\"error\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { useBreadcrumbs } from '../../composables/useBreadcrumbs';\nimport { useQuery } from '../../composables/useQuery';\nimport { computed, provide } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { teamPaths } from './teamRoutes';\n\nconst route = useRoute();\nconst teamId = route.params.id as string;\n\n// Fetch team data once at parent level\nconst {\n data,\n loading: isLoading,\n error,\n refetch,\n} = useQuery((api) => api.teams.getTeam(teamId), {});\n\nconst team = computed(() => data.value ?? null);\n\n// Provide refresh function to child components\nconst refreshTeam = async () => {\n await refetch();\n};\n\nprovide('refreshTeam', refreshTeam);\n\n// Get current tab name from route meta\nconst currentTabLabel = computed(() => {\n const currentTab = route.meta.currentTab as string | undefined;\n if (!currentTab) return null;\n\n // Find the tab label from sectionTabs\n const sectionTabs = route.meta.sectionTabs as\n | Array<{ id: string; label: string }>\n | undefined;\n if (sectionTabs) {\n const tab = sectionTabs.find((t) => t.id === currentTab);\n return tab?.label || null;\n }\n return null;\n});\n\n// Manage breadcrumbs at parent level - watch route to ensure reactivity\n// Use segment mode to allow TeamMemberParent to append its own breadcrumbs\nuseBreadcrumbs(\n () => {\n // Access route params and meta to ensure reactivity to route changes\n const memberId = route.params.member_id;\n const currentTab = route.meta.currentTab as string | undefined;\n\n const breadcrumbs = [\n {\n label: 'Teams',\n to: { name: teamPaths.list.name },\n },\n {\n label:\n team.value?.display_name ||\n team.value?.unique_name ||\n team.value?.legal_name ||\n 'Team',\n loading: !team.value,\n to: {\n name: teamPaths.view.name,\n params: { id: teamId },\n },\n },\n ];\n\n // Add current tab if we're not on the main view tab and not viewing a member\n if (!memberId && currentTabLabel.value && currentTab !== 'view') {\n breadcrumbs.push({\n label: currentTabLabel.value,\n to: route as any, // Route object for current tab\n });\n }\n\n return breadcrumbs;\n },\n true, // Use segment mode for nested breadcrumbs\n);\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAgCA,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,MAAM,OAAO;EAG5B,MAAM,EACJ,MACA,SAAS,WACT,OACA,YACE,UAAU,QAAQ,IAAI,MAAM,QAAQ,OAAO,EAAE,EAAE,CAAC;EAEpD,MAAM,OAAO,eAAe,KAAK,SAAS,KAAK;EAG/C,MAAM,cAAc,YAAY;AAC9B,SAAM,SAAS;;AAGjB,UAAQ,eAAe,YAAY;EAGnC,MAAM,kBAAkB,eAAe;GACrC,MAAM,aAAa,MAAM,KAAK;AAC9B,OAAI,CAAC,WAAY,QAAO;GAGxB,MAAM,cAAc,MAAM,KAAK;AAG/B,OAAI,YAEF,QADY,YAAY,MAAM,MAAM,EAAE,OAAO,WAAW,EAC5C,SAAS;AAEvB,UAAO;IACP;AAIF,uBACQ;GAEJ,MAAM,WAAW,MAAM,OAAO;GAC9B,MAAM,aAAa,MAAM,KAAK;GAE9B,MAAM,cAAc,CAClB;IACE,OAAO;IACP,IAAI,EAAE,MAAM,UAAU,KAAK,MAAM;IAClC,EACD;IACE,OACE,KAAK,OAAO,gBACZ,KAAK,OAAO,eACZ,KAAK,OAAO,cACZ;IACF,SAAS,CAAC,KAAK;IACf,IAAI;KACF,MAAM,UAAU,KAAK;KACrB,QAAQ,EAAE,IAAI,QAAQ;KACvB;IACF,CACF;AAGD,OAAI,CAAC,YAAY,gBAAgB,SAAS,eAAe,OACvD,aAAY,KAAK;IACf,OAAO,gBAAgB;IACvB,IAAI;IACL,CAAC;AAGJ,UAAO;KAET,KACD;;;UAzGY,MAAA,UAAS,IAAA,WAAA,EAApB,mBAEM,OAFN,YAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAGlC,MAAA,MAAK,IAAA,WAAA,EAArB,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,MAAA,MAAK,CAAC,QAAO,EAAA,EAAA,CAAA,CAAA,KAAA,WAAA,EAGxB,YAAwE,uBAAA;;IAApD,MAAM,KAAA;IAAO,WAAW,MAAA,UAAS;IAAG,OAAO,MAAA,MAAK"}
|
|
@@ -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-C4bvvG2b.js";
|
|
7
7
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, onMounted, onUnmounted, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
|
|
8
8
|
import { useRoute, useRouter } from "vue-router";
|
|
9
9
|
import { toast } from "vue3-toastify";
|
|
@@ -259,4 +259,4 @@ var VerifyEmail_default = _sfc_main;
|
|
|
259
259
|
|
|
260
260
|
//#endregion
|
|
261
261
|
export { VerifyEmail_default as t };
|
|
262
|
-
//# sourceMappingURL=VerifyEmail-
|
|
262
|
+
//# sourceMappingURL=VerifyEmail-BVwHQpbw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VerifyEmail-CWUhRA1o.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, onMounted, 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/** Frontend countdown (60s). Backend uses 59s so it's ready when button enables. */\nconst RESEND_COOLDOWN_SECONDS = 60;\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(RESEND_COOLDOWN_SECONDS);\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(RESEND_COOLDOWN_SECONDS);\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\n// When landing on \"Check your email\" (no token), we just sent the email at signup.\n// Start resend button disabled with countdown to match backend cooldown.\nonMounted(() => {\n if (!token && status.value !== 'loading' && status.value !== 'success') {\n startResendCountdown(RESEND_COOLDOWN_SECONDS);\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-BVwHQpbw.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, onMounted, 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/** Frontend countdown (60s). Backend uses 59s so it's ready when button enables. */\nconst RESEND_COOLDOWN_SECONDS = 60;\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(RESEND_COOLDOWN_SECONDS);\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(RESEND_COOLDOWN_SECONDS);\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\n// When landing on \"Check your email\" (no token), we just sent the email at signup.\n// Start resend button disabled with countdown to match backend cooldown.\nonMounted(() => {\n if (!token && status.value !== 'loading' && status.value !== 'success') {\n startResendCountdown(RESEND_COOLDOWN_SECONDS);\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-C4bvvG2b.js";
|
|
8
|
+
import { t as VerifyEmail_default } from "./VerifyEmail-BVwHQpbw.js";
|
|
9
9
|
|
|
10
10
|
export { VerifyEmail_default as default };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { t as ZiniaContainer_default } from "./ZiniaContainer-BV6sojLa.js";
|
|
2
2
|
import { t as formatSystemTimestamp } from "./convertToLocalDateTime-C13-PrSA.js";
|
|
3
|
-
import { t as teamPaths } from "./teamRoutes-
|
|
4
|
-
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, resolveComponent, toDisplayString, unref, withCtx } from "vue";
|
|
3
|
+
import { t as teamPaths } from "./teamRoutes-CQWRPy3J.js";
|
|
4
|
+
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, openBlock, resolveComponent, toDisplayString, unref, withCtx } from "vue";
|
|
5
5
|
import { useRoute } from "vue-router";
|
|
6
|
+
import { toast } from "vue3-toastify";
|
|
6
7
|
|
|
7
8
|
//#region src/slices/team/ViewTeam.vue
|
|
8
9
|
const _hoisted_1 = {
|
|
@@ -106,15 +107,34 @@ const _hoisted_40 = {
|
|
|
106
107
|
class: "text-sm mt-2"
|
|
107
108
|
};
|
|
108
109
|
const _hoisted_41 = ["href"];
|
|
109
|
-
const _hoisted_42 = {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const
|
|
110
|
+
const _hoisted_42 = {
|
|
111
|
+
key: 4,
|
|
112
|
+
class: "card bg-base-100 shadow-sm"
|
|
113
|
+
};
|
|
114
|
+
const _hoisted_43 = { class: "card-body" };
|
|
115
|
+
const _hoisted_44 = {
|
|
116
|
+
key: 0,
|
|
117
|
+
class: "mb-3"
|
|
118
|
+
};
|
|
119
|
+
const _hoisted_45 = { class: "flex items-center gap-2" };
|
|
120
|
+
const _hoisted_46 = { class: "flex-1 px-3 py-2 bg-base-200 rounded-lg text-sm font-mono break-all" };
|
|
121
|
+
const _hoisted_47 = { key: 1 };
|
|
122
|
+
const _hoisted_48 = { class: "flex items-center gap-2" };
|
|
123
|
+
const _hoisted_49 = { class: "flex-1 px-3 py-2 bg-base-200 rounded-lg text-sm font-mono break-all" };
|
|
124
|
+
const _hoisted_50 = {
|
|
125
|
+
key: 2,
|
|
126
|
+
class: "flex items-center gap-2"
|
|
127
|
+
};
|
|
128
|
+
const _hoisted_51 = { class: "flex-1 px-3 py-2 bg-base-200 rounded-lg text-sm font-mono" };
|
|
129
|
+
const _hoisted_52 = { class: "mt-4 pt-4 border-t border-base-300 text-xs sm:text-sm text-base-content/50" };
|
|
130
|
+
const _hoisted_53 = { class: "flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-4" };
|
|
131
|
+
const _hoisted_54 = { key: 0 };
|
|
132
|
+
const _hoisted_55 = { key: 1 };
|
|
133
|
+
const _hoisted_56 = {
|
|
114
134
|
key: 2,
|
|
115
135
|
class: "text-xs"
|
|
116
136
|
};
|
|
117
|
-
const
|
|
137
|
+
const _hoisted_57 = { class: "flex flex-col sm:flex-row gap-3 justify-center mt-6" };
|
|
118
138
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
119
139
|
__name: "ViewTeam",
|
|
120
140
|
props: {
|
|
@@ -125,10 +145,29 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
125
145
|
setup(__props) {
|
|
126
146
|
const props = __props;
|
|
127
147
|
const team_id = useRoute().params.id;
|
|
148
|
+
const referralAppBaseUrl = inject("referralAppBaseUrl") ?? "";
|
|
149
|
+
const referralMarketingBaseUrl = inject("referralMarketingBaseUrl") ?? "";
|
|
128
150
|
const teamData = computed(() => props.team);
|
|
151
|
+
function buildRefLink(base) {
|
|
152
|
+
const tag = teamData.value?.referral_tag;
|
|
153
|
+
if (!tag) return "";
|
|
154
|
+
const b = base.trim().replace(/\/$/, "");
|
|
155
|
+
if (!b) return "";
|
|
156
|
+
return `${b}${b.includes("?") ? "&" : "?"}ref=${encodeURIComponent(tag)}`;
|
|
157
|
+
}
|
|
158
|
+
const referralAppLink = computed(() => buildRefLink(referralAppBaseUrl));
|
|
159
|
+
const referralMarketingLink = computed(() => buildRefLink(referralMarketingBaseUrl));
|
|
160
|
+
async function copyToClipboard(text, successMessage) {
|
|
161
|
+
try {
|
|
162
|
+
await navigator.clipboard.writeText(text);
|
|
163
|
+
toast.success(successMessage);
|
|
164
|
+
} catch {
|
|
165
|
+
toast.error("Failed to copy");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
129
168
|
return (_ctx, _cache) => {
|
|
130
169
|
const _component_router_link = resolveComponent("router-link");
|
|
131
|
-
return __props.isLoading ? (openBlock(), createElementBlock("div", _hoisted_1, [..._cache[
|
|
170
|
+
return __props.isLoading ? (openBlock(), createElementBlock("div", _hoisted_1, [..._cache[3] || (_cache[3] = [createElementVNode("span", { class: "loading loading-spinner loading-lg" }, null, -1)])])) : __props.error ? (openBlock(), createElementBlock("div", _hoisted_2, [_cache[4] || (_cache[4] = createElementVNode("svg", {
|
|
132
171
|
xmlns: "http://www.w3.org/2000/svg",
|
|
133
172
|
class: "stroke-current shrink-0 h-6 w-6",
|
|
134
173
|
fill: "none",
|
|
@@ -147,53 +186,113 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
147
186
|
createCommentVNode(" Team Information Grid "),
|
|
148
187
|
createElementVNode("div", _hoisted_11, [
|
|
149
188
|
createCommentVNode(" Basic Information "),
|
|
150
|
-
teamData.value.legal_name ? (openBlock(), createElementBlock("div", _hoisted_12, [createElementVNode("div", _hoisted_13, [_cache[
|
|
189
|
+
teamData.value.legal_name ? (openBlock(), createElementBlock("div", _hoisted_12, [createElementVNode("div", _hoisted_13, [_cache[6] || (_cache[6] = createElementVNode("h3", { class: "card-title text-base mb-3" }, "Basic Information", -1)), teamData.value.legal_name ? (openBlock(), createElementBlock("div", _hoisted_14, [_cache[5] || (_cache[5] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Legal Name:", -1)), createElementVNode("span", _hoisted_15, toDisplayString(teamData.value.legal_name), 1)])) : createCommentVNode("v-if", true)])])) : createCommentVNode("v-if", true),
|
|
151
190
|
createCommentVNode(" Contact Information "),
|
|
152
191
|
teamData.value.contact_name || teamData.value.contact_email || teamData.value.contact_business_phone || teamData.value.contact_mobile_phone ? (openBlock(), createElementBlock("div", _hoisted_16, [createElementVNode("div", _hoisted_17, [
|
|
153
|
-
_cache[
|
|
154
|
-
teamData.value.contact_name ? (openBlock(), createElementBlock("div", _hoisted_18, [_cache[
|
|
155
|
-
teamData.value.contact_email ? (openBlock(), createElementBlock("div", _hoisted_20, [_cache[
|
|
192
|
+
_cache[12] || (_cache[12] = createElementVNode("h3", { class: "card-title text-base mb-3" }, "Contact Information", -1)),
|
|
193
|
+
teamData.value.contact_name ? (openBlock(), createElementBlock("div", _hoisted_18, [_cache[7] || (_cache[7] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Name:", -1)), createElementVNode("span", _hoisted_19, toDisplayString(teamData.value.contact_name), 1)])) : createCommentVNode("v-if", true),
|
|
194
|
+
teamData.value.contact_email ? (openBlock(), createElementBlock("div", _hoisted_20, [_cache[8] || (_cache[8] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Email:", -1)), createElementVNode("a", {
|
|
156
195
|
href: `mailto:${teamData.value.contact_email}`,
|
|
157
196
|
class: "ml-2 link link-primary"
|
|
158
197
|
}, toDisplayString(teamData.value.contact_email), 9, _hoisted_21)])) : createCommentVNode("v-if", true),
|
|
159
|
-
teamData.value.contact_business_phone ? (openBlock(), createElementBlock("div", _hoisted_22, [_cache[
|
|
160
|
-
teamData.value.contact_mobile_phone ? (openBlock(), createElementBlock("div", _hoisted_24, [_cache[
|
|
161
|
-
teamData.value.contact_time_zone ? (openBlock(), createElementBlock("div", _hoisted_26, [_cache[
|
|
198
|
+
teamData.value.contact_business_phone ? (openBlock(), createElementBlock("div", _hoisted_22, [_cache[9] || (_cache[9] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Business Phone:", -1)), createElementVNode("span", _hoisted_23, toDisplayString(teamData.value.contact_business_phone), 1)])) : createCommentVNode("v-if", true),
|
|
199
|
+
teamData.value.contact_mobile_phone ? (openBlock(), createElementBlock("div", _hoisted_24, [_cache[10] || (_cache[10] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Mobile Phone:", -1)), createElementVNode("span", _hoisted_25, toDisplayString(teamData.value.contact_mobile_phone), 1)])) : createCommentVNode("v-if", true),
|
|
200
|
+
teamData.value.contact_time_zone ? (openBlock(), createElementBlock("div", _hoisted_26, [_cache[11] || (_cache[11] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Time Zone:", -1)), createElementVNode("span", _hoisted_27, toDisplayString(teamData.value.contact_time_zone), 1)])) : createCommentVNode("v-if", true)
|
|
162
201
|
])])) : createCommentVNode("v-if", true),
|
|
163
202
|
createCommentVNode(" Address Information "),
|
|
164
203
|
teamData.value.address_full || teamData.value.address_city || teamData.value.address_zip ? (openBlock(), createElementBlock("div", _hoisted_28, [createElementVNode("div", _hoisted_29, [
|
|
165
|
-
_cache[
|
|
166
|
-
teamData.value.address_full ? (openBlock(), createElementBlock("div", _hoisted_30, [_cache[
|
|
167
|
-
teamData.value.address_city ? (openBlock(), createElementBlock("div", _hoisted_32, [_cache[
|
|
168
|
-
teamData.value.address_zip ? (openBlock(), createElementBlock("div", _hoisted_34, [_cache[
|
|
204
|
+
_cache[16] || (_cache[16] = createElementVNode("h3", { class: "card-title text-base mb-3" }, "Address", -1)),
|
|
205
|
+
teamData.value.address_full ? (openBlock(), createElementBlock("div", _hoisted_30, [_cache[13] || (_cache[13] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Address:", -1)), createElementVNode("span", _hoisted_31, toDisplayString(teamData.value.address_full), 1)])) : createCommentVNode("v-if", true),
|
|
206
|
+
teamData.value.address_city ? (openBlock(), createElementBlock("div", _hoisted_32, [_cache[14] || (_cache[14] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "City:", -1)), createElementVNode("span", _hoisted_33, toDisplayString(teamData.value.address_city), 1)])) : createCommentVNode("v-if", true),
|
|
207
|
+
teamData.value.address_zip ? (openBlock(), createElementBlock("div", _hoisted_34, [_cache[15] || (_cache[15] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Zip:", -1)), createElementVNode("span", _hoisted_35, toDisplayString(teamData.value.address_zip), 1)])) : createCommentVNode("v-if", true)
|
|
169
208
|
])])) : createCommentVNode("v-if", true),
|
|
170
209
|
createCommentVNode(" Web Presence "),
|
|
171
210
|
teamData.value.twitter_username || teamData.value.url ? (openBlock(), createElementBlock("div", _hoisted_36, [createElementVNode("div", _hoisted_37, [
|
|
172
|
-
_cache[
|
|
173
|
-
teamData.value.twitter_username ? (openBlock(), createElementBlock("div", _hoisted_38, [_cache[
|
|
174
|
-
teamData.value.url ? (openBlock(), createElementBlock("div", _hoisted_40, [_cache[
|
|
211
|
+
_cache[19] || (_cache[19] = createElementVNode("h3", { class: "card-title text-base mb-3" }, "Web Presence", -1)),
|
|
212
|
+
teamData.value.twitter_username ? (openBlock(), createElementBlock("div", _hoisted_38, [_cache[17] || (_cache[17] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "Twitter:", -1)), createElementVNode("span", _hoisted_39, "@" + toDisplayString(teamData.value.twitter_username), 1)])) : createCommentVNode("v-if", true),
|
|
213
|
+
teamData.value.url ? (openBlock(), createElementBlock("div", _hoisted_40, [_cache[18] || (_cache[18] = createElementVNode("span", { class: "font-medium text-base-content/70" }, "URL:", -1)), createElementVNode("a", {
|
|
175
214
|
href: teamData.value.url,
|
|
176
215
|
target: "_blank",
|
|
177
216
|
rel: "noopener noreferrer",
|
|
178
217
|
class: "ml-2 link link-primary"
|
|
179
218
|
}, toDisplayString(teamData.value.url), 9, _hoisted_41)])) : createCommentVNode("v-if", true)
|
|
219
|
+
])])) : createCommentVNode("v-if", true),
|
|
220
|
+
createCommentVNode(" Referral Tag "),
|
|
221
|
+
teamData.value.referral_tag ? (openBlock(), createElementBlock("div", _hoisted_42, [createElementVNode("div", _hoisted_43, [
|
|
222
|
+
_cache[25] || (_cache[25] = createElementVNode("h3", { class: "card-title text-base mb-3" }, "Referral Tag", -1)),
|
|
223
|
+
_cache[26] || (_cache[26] = createElementVNode("p", { class: "text-sm text-base-content/70 mb-3" }, [
|
|
224
|
+
createTextVNode(" Share a link so referral events are routed to this team. The "),
|
|
225
|
+
createElementVNode("code", { class: "text-xs" }, "ref"),
|
|
226
|
+
createTextVNode(" parameter tags visitors for attribution. ")
|
|
227
|
+
], -1)),
|
|
228
|
+
referralAppLink.value ? (openBlock(), createElementBlock("div", _hoisted_44, [_cache[21] || (_cache[21] = createElementVNode("div", { class: "text-xs font-medium text-base-content/60 mb-1" }, "App link (direct)", -1)), createElementVNode("div", _hoisted_45, [createElementVNode("code", _hoisted_46, toDisplayString(referralAppLink.value), 1), createElementVNode("button", {
|
|
229
|
+
type: "button",
|
|
230
|
+
class: "btn btn-sm btn-ghost shrink-0",
|
|
231
|
+
title: "Copy app link",
|
|
232
|
+
onClick: _cache[0] || (_cache[0] = ($event) => copyToClipboard(referralAppLink.value, "App link copied"))
|
|
233
|
+
}, [..._cache[20] || (_cache[20] = [createElementVNode("svg", {
|
|
234
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
235
|
+
class: "h-4 w-4",
|
|
236
|
+
fill: "none",
|
|
237
|
+
viewBox: "0 0 24 24",
|
|
238
|
+
stroke: "currentColor"
|
|
239
|
+
}, [createElementVNode("path", {
|
|
240
|
+
"stroke-linecap": "round",
|
|
241
|
+
"stroke-linejoin": "round",
|
|
242
|
+
"stroke-width": "2",
|
|
243
|
+
d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
|
|
244
|
+
})], -1)])])])])) : createCommentVNode("v-if", true),
|
|
245
|
+
referralMarketingLink.value ? (openBlock(), createElementBlock("div", _hoisted_47, [_cache[23] || (_cache[23] = createElementVNode("div", { class: "text-xs font-medium text-base-content/60 mb-1" }, "Marketing link", -1)), createElementVNode("div", _hoisted_48, [createElementVNode("code", _hoisted_49, toDisplayString(referralMarketingLink.value), 1), createElementVNode("button", {
|
|
246
|
+
type: "button",
|
|
247
|
+
class: "btn btn-sm btn-ghost shrink-0",
|
|
248
|
+
title: "Copy marketing link",
|
|
249
|
+
onClick: _cache[1] || (_cache[1] = ($event) => copyToClipboard(referralMarketingLink.value, "Marketing link copied"))
|
|
250
|
+
}, [..._cache[22] || (_cache[22] = [createElementVNode("svg", {
|
|
251
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
252
|
+
class: "h-4 w-4",
|
|
253
|
+
fill: "none",
|
|
254
|
+
viewBox: "0 0 24 24",
|
|
255
|
+
stroke: "currentColor"
|
|
256
|
+
}, [createElementVNode("path", {
|
|
257
|
+
"stroke-linecap": "round",
|
|
258
|
+
"stroke-linejoin": "round",
|
|
259
|
+
"stroke-width": "2",
|
|
260
|
+
d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
|
|
261
|
+
})], -1)])])])])) : createCommentVNode("v-if", true),
|
|
262
|
+
!referralAppLink.value && !referralMarketingLink.value ? (openBlock(), createElementBlock("div", _hoisted_50, [createElementVNode("code", _hoisted_51, toDisplayString(teamData.value.referral_tag), 1), createElementVNode("button", {
|
|
263
|
+
type: "button",
|
|
264
|
+
class: "btn btn-sm btn-ghost shrink-0",
|
|
265
|
+
title: "Copy tag",
|
|
266
|
+
onClick: _cache[2] || (_cache[2] = ($event) => copyToClipboard(teamData.value.referral_tag, "Referral tag copied"))
|
|
267
|
+
}, [..._cache[24] || (_cache[24] = [createElementVNode("svg", {
|
|
268
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
269
|
+
class: "h-4 w-4",
|
|
270
|
+
fill: "none",
|
|
271
|
+
viewBox: "0 0 24 24",
|
|
272
|
+
stroke: "currentColor"
|
|
273
|
+
}, [createElementVNode("path", {
|
|
274
|
+
"stroke-linecap": "round",
|
|
275
|
+
"stroke-linejoin": "round",
|
|
276
|
+
"stroke-width": "2",
|
|
277
|
+
d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
|
|
278
|
+
})], -1)])])])) : createCommentVNode("v-if", true)
|
|
180
279
|
])])) : createCommentVNode("v-if", true)
|
|
181
280
|
]),
|
|
182
281
|
createCommentVNode(" Metadata "),
|
|
183
|
-
createElementVNode("div",
|
|
184
|
-
teamData.value.created_by ? (openBlock(), createElementBlock("span",
|
|
185
|
-
teamData.value.created_at ? (openBlock(), createElementBlock("span",
|
|
186
|
-
teamData.value.updated_at && teamData.value.updated_at !== teamData.value.created_at ? (openBlock(), createElementBlock("span",
|
|
282
|
+
createElementVNode("div", _hoisted_52, [createElementVNode("div", _hoisted_53, [
|
|
283
|
+
teamData.value.created_by ? (openBlock(), createElementBlock("span", _hoisted_54, "Created by " + toDisplayString(teamData.value.created_by_display_name ?? teamData.value.created_by), 1)) : createCommentVNode("v-if", true),
|
|
284
|
+
teamData.value.created_at ? (openBlock(), createElementBlock("span", _hoisted_55, " Created " + toDisplayString(unref(formatSystemTimestamp)(teamData.value.created_at)), 1)) : createCommentVNode("v-if", true),
|
|
285
|
+
teamData.value.updated_at && teamData.value.updated_at !== teamData.value.created_at ? (openBlock(), createElementBlock("span", _hoisted_56, " Updated " + toDisplayString(unref(formatSystemTimestamp)(teamData.value.updated_at)), 1)) : createCommentVNode("v-if", true)
|
|
187
286
|
])]),
|
|
188
287
|
createCommentVNode(" Action Buttons "),
|
|
189
|
-
createElementVNode("div",
|
|
288
|
+
createElementVNode("div", _hoisted_57, [createVNode(_component_router_link, {
|
|
190
289
|
to: {
|
|
191
290
|
name: unref(teamPaths).edit.name,
|
|
192
291
|
params: { id: unref(team_id) }
|
|
193
292
|
},
|
|
194
293
|
class: "btn btn-primary"
|
|
195
294
|
}, {
|
|
196
|
-
default: withCtx(() => [..._cache[
|
|
295
|
+
default: withCtx(() => [..._cache[27] || (_cache[27] = [createElementVNode("svg", {
|
|
197
296
|
xmlns: "http://www.w3.org/2000/svg",
|
|
198
297
|
fill: "none",
|
|
199
298
|
viewBox: "0 0 24 24",
|
|
@@ -217,4 +316,4 @@ var ViewTeam_default = _sfc_main;
|
|
|
217
316
|
|
|
218
317
|
//#endregion
|
|
219
318
|
export { ViewTeam_default as t };
|
|
220
|
-
//# sourceMappingURL=ViewTeam-
|
|
319
|
+
//# sourceMappingURL=ViewTeam-BV7SjH8R.js.map
|