@dragonmastery/dragoncore-vue 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChangePasswordPage-DBXchGfn.js → ChangePasswordPage--3XwluwE.js} +2 -2
- package/dist/{ChangePasswordPage-DBXchGfn.js.map → ChangePasswordPage--3XwluwE.js.map} +1 -1
- package/dist/ChangePasswordPage-CpDPmEml.js +6 -0
- package/dist/{ConsentRequired-qMNT-U2T.js → ConsentRequired-C4IRMA0c.js} +26 -17
- package/dist/ConsentRequired-C4IRMA0c.js.map +1 -0
- package/dist/CreateTeamForm-B4cIuYAf.js +35 -0
- package/dist/CreateTeamMemberForm-Chrw1y00.js +35 -0
- package/dist/{CreateUserPage-B0iHLsm5.js → CreateUserPage-DLwXeLAq.js} +2 -2
- package/dist/{CreateUserPage-B0iHLsm5.js.map → CreateUserPage-DLwXeLAq.js.map} +1 -1
- package/dist/CreateUserPage-WruMs7WP.js +6 -0
- package/dist/CreditBalanceDashboard-CkcsrZ_e.js +35 -0
- package/dist/CreditManagement-Ddvu9dMw.js +35 -0
- package/dist/CustomerCreateSupportTicketForm-BKperKGS.js +35 -0
- package/dist/{CustomerSupportTicketDetailPage-DyJTKtLU.js → CustomerSupportTicketDetailPage-BdyaKG1v.js} +7 -7
- package/dist/{CustomerSupportTicketDetailPage-DyJTKtLU.js.map → CustomerSupportTicketDetailPage-BdyaKG1v.js.map} +1 -1
- package/dist/CustomerSupportTicketList-DcbrjDa9.js +35 -0
- package/dist/CustomerSupportTicketParent-BeNzUwuP.js +7 -0
- package/dist/{CustomerSupportTicketParent-CldxkQ75.js → CustomerSupportTicketParent-HIxwSVdu.js} +2 -2
- package/dist/{CustomerSupportTicketParent-CldxkQ75.js.map → CustomerSupportTicketParent-HIxwSVdu.js.map} +1 -1
- package/dist/CustomerSupportTicketSuccess-CC967u3y.js +35 -0
- package/dist/EditTeamForm-B5Tee5wL.js +35 -0
- package/dist/{EditTeamMemberForm-CiNb4nNG.js → EditTeamMemberForm-CaS2GLjV.js} +2 -2
- package/dist/{EditTeamMemberForm-CiNb4nNG.js.map → EditTeamMemberForm-CaS2GLjV.js.map} +1 -1
- package/dist/EditTeamMemberForm-OtcS8QWt.js +6 -0
- package/dist/{EditUserPage-DpV3dm-c.js → EditUserPage-DURc5rmi.js} +3 -3
- package/dist/{EditUserPage-DpV3dm-c.js.map → EditUserPage-DURc5rmi.js.map} +1 -1
- package/dist/EditUserPage-T4DQlKhf.js +7 -0
- package/dist/ForgotPassword-CUifhmqP.js +7 -0
- package/dist/{ForgotPassword-roKwDfce.js → ForgotPassword-OjIPi9s9.js} +2 -2
- package/dist/{ForgotPassword-roKwDfce.js.map → ForgotPassword-OjIPi9s9.js.map} +1 -1
- package/dist/{LoginForm-BGDymDnO.js → LoginForm-9UFnA-fO.js} +49 -47
- package/dist/LoginForm-9UFnA-fO.js.map +1 -0
- package/dist/LoginForm-Bg7GoZEA.js +7 -0
- package/dist/Logout-Bs92csWH.js +7 -0
- package/dist/{Logout-Cbw1SacV.js → Logout-YgTgOFUH.js} +3 -3
- package/dist/{Logout-Cbw1SacV.js.map → Logout-YgTgOFUH.js.map} +1 -1
- package/dist/MfaSetup-BACX5XP-.js +8 -0
- package/dist/{MfaSetup-CwYXnvgW.js → MfaSetup-RtFMY_dj.js} +3 -3
- package/dist/{MfaSetup-CwYXnvgW.js.map → MfaSetup-RtFMY_dj.js.map} +1 -1
- package/dist/{MfaVerify-CIlen2i5.js → MfaVerify-Cvhe8bEM.js} +4 -4
- package/dist/{MfaVerify-CIlen2i5.js.map → MfaVerify-Cvhe8bEM.js.map} +1 -1
- package/dist/MfaVerify-ak4iSdQ2.js +8 -0
- package/dist/{ResetPassword-BgKyXQ4q.js → ResetPassword-BE4mXK9q.js} +2 -2
- package/dist/{ResetPassword-BgKyXQ4q.js.map → ResetPassword-BE4mXK9q.js.map} +1 -1
- package/dist/ResetPassword-pY1uhTdl.js +7 -0
- package/dist/{SavedFiltersPage-BlzfWkaj.js → SavedFiltersPage-DQt6uc8m.js} +27 -26
- package/dist/{SavedFiltersPage-BlzfWkaj.js.map → SavedFiltersPage-DQt6uc8m.js.map} +1 -1
- package/dist/{Signup-qBqsSYVz.js → Signup-9TjMMnU4.js} +23 -32
- package/dist/Signup-9TjMMnU4.js.map +1 -0
- package/dist/Signup-Bq-G3D-s.js +9 -0
- package/dist/{SignupConsentFlow-DG2IGikE.js → SignupConsentFlow-QUZGKjdB.js} +59 -33
- package/dist/SignupConsentFlow-QUZGKjdB.js.map +1 -0
- package/dist/{SignupRequirementsPage-DnLpQfB8.js → SignupRequirementsPage-DfbYmpQD.js} +5 -5
- package/dist/{SignupRequirementsPage-DnLpQfB8.js.map → SignupRequirementsPage-DfbYmpQD.js.map} +1 -1
- package/dist/StaffCreateSupportTicketForm-D0ZuisDk.js +35 -0
- package/dist/{StaffSupportTicketDetailPage-D0SjH36N.js → StaffSupportTicketDetailPage-DQdfh6H1.js} +7 -7
- package/dist/{StaffSupportTicketDetailPage-D0SjH36N.js.map → StaffSupportTicketDetailPage-DQdfh6H1.js.map} +1 -1
- package/dist/StaffSupportTicketList-CiqC05XB.js +35 -0
- package/dist/{StaffSupportTicketParent-Dk6RFRMt.js → StaffSupportTicketParent-CilR4RGM.js} +2 -2
- package/dist/{StaffSupportTicketParent-Dk6RFRMt.js.map → StaffSupportTicketParent-CilR4RGM.js.map} +1 -1
- package/dist/StaffSupportTicketParent-DkV329NI.js +7 -0
- package/dist/StaffSupportTicketSuccess-CUYnimaI.js +35 -0
- package/dist/{SupportStaffPage-DFcgP8iE.js → SupportStaffPage-KKugAnFm.js} +5 -5
- package/dist/{SupportStaffPage-DFcgP8iE.js.map → SupportStaffPage-KKugAnFm.js.map} +1 -1
- package/dist/{SupportTicketMaintenancePage-BCW0eZxV.js → SupportTicketMaintenancePage-smItdkrD.js} +4 -4
- package/dist/{SupportTicketMaintenancePage-BCW0eZxV.js.map → SupportTicketMaintenancePage-smItdkrD.js.map} +1 -1
- package/dist/TeamAttachmentsTab-DUtCD1Yi.js +35 -0
- package/dist/TeamHistoryTab-BsUoH4VK.js +4 -0
- package/dist/{TeamHistoryTab-PVS8A-6K.js → TeamHistoryTab-D5biUPmq.js} +2 -2
- package/dist/{TeamHistoryTab-PVS8A-6K.js.map → TeamHistoryTab-D5biUPmq.js.map} +1 -1
- package/dist/TeamList-BkPIqZ8V.js +35 -0
- package/dist/TeamMemberList-1mxUGCNa.js +35 -0
- package/dist/TeamMemberParent-DzeBIElY.js +35 -0
- package/dist/{TeamNotesTab-D7ELC1EW.js → TeamNotesTab-BzGZZ1h8.js} +4 -4
- package/dist/{TeamNotesTab-D7ELC1EW.js.map → TeamNotesTab-BzGZZ1h8.js.map} +1 -1
- package/dist/TeamNotesTab-ClHl2nXd.js +7 -0
- package/dist/TeamParent-DJa9UZTP.js +35 -0
- package/dist/{TimelineNoteInput-D-NjzUiF.js → TimelineNoteInput-0p-M4Qie.js} +2 -2
- package/dist/{TimelineNoteInput-D-NjzUiF.js.map → TimelineNoteInput-0p-M4Qie.js.map} +1 -1
- package/dist/{TimelineSystemEvent-Cc6HMeO3.js → TimelineSystemEvent-BHzFr46C.js} +4 -4
- package/dist/{TimelineSystemEvent-Cc6HMeO3.js.map → TimelineSystemEvent-BHzFr46C.js.map} +1 -1
- package/dist/UserListPage-BTLE4J0s.js +4 -0
- package/dist/{UserListPage-DdJFeLP1.js → UserListPage-DUE5gJTo.js} +2 -2
- package/dist/{UserListPage-DdJFeLP1.js.map → UserListPage-DUE5gJTo.js.map} +1 -1
- package/dist/{UserProfilePage-BhCxv0N9.js → UserProfilePage-C3b93Keh.js} +4 -4
- package/dist/{UserProfilePage-BhCxv0N9.js.map → UserProfilePage-C3b93Keh.js.map} +1 -1
- package/dist/UserProfilePage-CVTORtSx.js +7 -0
- package/dist/VerifyEmail-DCP4DWIw.js +9 -0
- package/dist/VerifyEmail-DlOmWGG-.js +257 -0
- package/dist/VerifyEmail-DlOmWGG-.js.map +1 -0
- package/dist/ViewTeam-DVfnLMhV.js +35 -0
- package/dist/ViewTeamMember-L4v3gCIn.js +35 -0
- package/dist/index.d.ts +703 -705
- package/dist/index.js +26 -25
- package/dist/{mfaSchema-s-T8m-7-.js → mfaSchema-BnRWf0ma.js} +1 -1
- package/dist/{mfaSchema-s-T8m-7-.js.map → mfaSchema-BnRWf0ma.js.map} +1 -1
- package/dist/{src--FuqlDhU.js → src-QZJyMfGX.js} +82 -67
- package/dist/src-QZJyMfGX.js.map +1 -0
- package/dist/useEmailVerificationChannel-BNi926Ho.js +37 -0
- package/dist/useEmailVerificationChannel-BNi926Ho.js.map +1 -0
- package/dist/{useMutation-Dhx2gMgS.js → useMutation-BTsyHKyn.js} +3 -3
- package/dist/{useMutation-Dhx2gMgS.js.map → useMutation-BTsyHKyn.js.map} +1 -1
- package/dist/{useQuery-DxmMxM8z.js → useQuery-BggIE52P.js} +3 -3
- package/dist/{useQuery-DxmMxM8z.js.map → useQuery-BggIE52P.js.map} +1 -1
- package/dist/{useQueryCache-CJKZquh6.js → useQueryCache-Bjm-S8v5.js} +2 -2
- package/dist/{useQueryCache-CJKZquh6.js.map → useQueryCache-Bjm-S8v5.js.map} +1 -1
- package/dist/{useRpcAuth-Bse-lggK.js → useRpcAuth-rmHf7bYx.js} +40 -1
- package/dist/useRpcAuth-rmHf7bYx.js.map +1 -0
- package/package.json +2 -2
- package/dist/ChangePasswordPage-Re323roR.js +0 -6
- package/dist/ConsentRequired-qMNT-U2T.js.map +0 -1
- package/dist/CreateTeamForm-DXN1hoJh.js +0 -34
- package/dist/CreateTeamMemberForm-CLHT1HN_.js +0 -34
- package/dist/CreateUserPage-C8107z_O.js +0 -6
- package/dist/CreditBalanceDashboard-D7MFKfh6.js +0 -34
- package/dist/CreditManagement-A8hVPoSp.js +0 -34
- package/dist/CustomerCreateSupportTicketForm-B8JQNC1I.js +0 -34
- package/dist/CustomerSupportTicketList-DR-UfcGr.js +0 -34
- package/dist/CustomerSupportTicketParent-C-KzT4qQ.js +0 -7
- package/dist/CustomerSupportTicketSuccess-SBdIcS-_.js +0 -34
- package/dist/EditTeamForm-BDQkhBbx.js +0 -34
- package/dist/EditTeamMemberForm-CBxFLoIy.js +0 -6
- package/dist/EditUserPage-BWKrAKZZ.js +0 -7
- package/dist/ForgotPassword-D3OQqbrD.js +0 -7
- package/dist/LoginForm-BGDymDnO.js.map +0 -1
- package/dist/LoginForm-C97dUsU3.js +0 -7
- package/dist/Logout-DY3iorah.js +0 -7
- package/dist/MfaSetup-DAQV8MhP.js +0 -8
- package/dist/MfaVerify-D-_oX6gL.js +0 -8
- package/dist/ResetPassword-CkPqUFbq.js +0 -7
- package/dist/Signup-C2FshPnc.js +0 -8
- package/dist/Signup-qBqsSYVz.js.map +0 -1
- package/dist/SignupConsentFlow-DG2IGikE.js.map +0 -1
- package/dist/StaffCreateSupportTicketForm-BrGB7tqD.js +0 -34
- package/dist/StaffSupportTicketList-HA4NlkKE.js +0 -34
- package/dist/StaffSupportTicketParent-BTbpNdfc.js +0 -7
- package/dist/StaffSupportTicketSuccess-CTeMG_iK.js +0 -34
- package/dist/TeamAttachmentsTab-IaRtuF55.js +0 -34
- package/dist/TeamHistoryTab-DWcVhkwC.js +0 -4
- package/dist/TeamList-BNo_ime8.js +0 -34
- package/dist/TeamMemberList-DJKYxfsx.js +0 -34
- package/dist/TeamMemberParent-Bk6dqXsh.js +0 -34
- package/dist/TeamNotesTab-JRWYpqRJ.js +0 -7
- package/dist/TeamParent-TSWT_0bK.js +0 -34
- package/dist/UserListPage-BjHbDpvC.js +0 -4
- package/dist/UserProfilePage-BxIMig4s.js +0 -7
- package/dist/VerifyEmail-BYSYk5ef.js +0 -7
- package/dist/VerifyEmail-DXYcjCX4.js +0 -176
- package/dist/VerifyEmail-DXYcjCX4.js.map +0 -1
- package/dist/VerifyEmailRequired-DeMYFS0I.js +0 -89
- package/dist/VerifyEmailRequired-DeMYFS0I.js.map +0 -1
- package/dist/ViewTeam-DIxy437n.js +0 -34
- package/dist/ViewTeamMember-DIaIqfbX.js +0 -34
- package/dist/src--FuqlDhU.js.map +0 -1
- package/dist/useRpcAuth-Bse-lggK.js.map +0 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { l as useUserSessionStore, m as useEnv } from "./useRpcAuth-
|
|
2
|
-
import { t as useMutation } from "./useMutation-
|
|
1
|
+
import { l as useUserSessionStore, m as useEnv } from "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
3
3
|
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
4
4
|
import { o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
5
|
-
import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
|
|
5
|
+
import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
|
|
6
6
|
import { useRoute, useRouter } from "vue-router";
|
|
7
|
-
import { toast } from "vue3-toastify";
|
|
8
7
|
import { loginSchema } from "@dragonmastery/dragoncore-shared";
|
|
9
8
|
import { useForm, withMetadata } from "@dragonmastery/zinia-forms-core";
|
|
10
9
|
|
|
@@ -30,19 +29,25 @@ const loginSchemaWithMetadata = withMetadata(loginSchema, "loginSchema", {
|
|
|
30
29
|
//#endregion
|
|
31
30
|
//#region src/slices/auth/features/login/LoginForm.vue
|
|
32
31
|
const _hoisted_1 = { class: "max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container" };
|
|
33
|
-
const _hoisted_2 = {
|
|
34
|
-
const _hoisted_3 = {
|
|
32
|
+
const _hoisted_2 = {
|
|
35
33
|
key: 0,
|
|
34
|
+
class: "mt-4 p-4 rounded-lg bg-error/15 text-error"
|
|
35
|
+
};
|
|
36
|
+
const _hoisted_3 = { class: "text-sm" };
|
|
37
|
+
const _hoisted_4 = { class: "mt-2" };
|
|
38
|
+
const _hoisted_5 = {
|
|
39
|
+
key: 1,
|
|
36
40
|
class: "text-center mt-2"
|
|
37
41
|
};
|
|
38
42
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
39
43
|
__name: "LoginForm",
|
|
40
44
|
setup(__props) {
|
|
41
|
-
const { allowUserSignup } = useEnv();
|
|
45
|
+
const { allowUserSignup, emailVerificationMode } = useEnv();
|
|
42
46
|
const route = useRoute();
|
|
43
47
|
const returnUrl = computed(() => route.query.returnUrl);
|
|
44
48
|
const forgotPasswordLink = computed(() => withReturnUrl("/auth/forgot-password", returnUrl.value));
|
|
45
49
|
const signupLink = computed(() => withReturnUrl("/auth/signup", returnUrl.value));
|
|
50
|
+
const loginBannerMessage = ref(null);
|
|
46
51
|
const { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(loginSchemaWithMetadata, {
|
|
47
52
|
storeName: "login-form",
|
|
48
53
|
persistToLocalStorage: false,
|
|
@@ -52,6 +57,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
52
57
|
const router = useRouter();
|
|
53
58
|
const { mutate: loginMutate } = useMutation((api, input) => api.userSessions.login(input), { credentials: "include" });
|
|
54
59
|
const handleSubmit = async (data) => {
|
|
60
|
+
loginBannerMessage.value = null;
|
|
55
61
|
const loginData = await loginMutate(data);
|
|
56
62
|
if (!loginData) throw new Error("Login failed");
|
|
57
63
|
const { access_token, user_details_token } = loginData;
|
|
@@ -62,50 +68,46 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
62
68
|
sessionStore.setSession(data.user_details_token);
|
|
63
69
|
sessionStore.setAccessToken(data.access_token);
|
|
64
70
|
form.reset();
|
|
65
|
-
|
|
71
|
+
loginBannerMessage.value = null;
|
|
72
|
+
const emailVerified = data.frontend_session?.user?.email_verified ?? true;
|
|
73
|
+
const targetPath = emailVerificationMode === "strict" && !emailVerified ? withReturnUrl("/auth/verify-email", returnUrl.value) : getValidReturnUrl(router.currentRoute.value, "/");
|
|
66
74
|
await router.push(targetPath);
|
|
67
|
-
toast.success("You are now logged in!");
|
|
68
75
|
};
|
|
69
76
|
const handleError = (error) => {
|
|
70
|
-
|
|
77
|
+
loginBannerMessage.value = error instanceof Error ? error.message : "Invalid username or password was entered.";
|
|
71
78
|
};
|
|
72
79
|
return (_ctx, _cache) => {
|
|
73
|
-
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
createCommentVNode(" Divider between login form and social buttons "),
|
|
105
|
-
createCommentVNode(" <div class=\"divider my-6\">OR</div> "),
|
|
106
|
-
createCommentVNode(" Social Login Buttons Component "),
|
|
107
|
-
createCommentVNode(" <SocialLoginButtons @login=\"socialLogin\" /> ")
|
|
108
|
-
]);
|
|
80
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [_cache[3] || (_cache[3] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Login", -1)), createVNode(unref(ZiniaForm), {
|
|
81
|
+
onHandleSubmit: handleSubmit,
|
|
82
|
+
onSuccess: handleSuccess,
|
|
83
|
+
onError: handleError
|
|
84
|
+
}, {
|
|
85
|
+
default: withCtx(() => [
|
|
86
|
+
createVNode(unref(zinia).EmailField),
|
|
87
|
+
createVNode(unref(zinia).PasswordField),
|
|
88
|
+
createVNode(unref(ZiniaSubmitButton), {
|
|
89
|
+
submitText: "Login",
|
|
90
|
+
submittingText: "Logging in..."
|
|
91
|
+
}),
|
|
92
|
+
createCommentVNode(" Error banner underneath login button - backend owns the message "),
|
|
93
|
+
loginBannerMessage.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("p", _hoisted_3, toDisplayString(loginBannerMessage.value), 1)])) : createCommentVNode("v-if", true),
|
|
94
|
+
createElementVNode("div", _hoisted_4, [createVNode(AppLink_default, {
|
|
95
|
+
to: forgotPasswordLink.value,
|
|
96
|
+
class: "link-accent link"
|
|
97
|
+
}, {
|
|
98
|
+
default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode(" Forgot your password? ", -1)])]),
|
|
99
|
+
_: 1
|
|
100
|
+
}, 8, ["to"])]),
|
|
101
|
+
unref(allowUserSignup) ? (openBlock(), createElementBlock("div", _hoisted_5, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Don't have an account? ", -1)), createVNode(AppLink_default, {
|
|
102
|
+
class: "link-accent link",
|
|
103
|
+
to: signupLink.value
|
|
104
|
+
}, {
|
|
105
|
+
default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("Sign up", -1)])]),
|
|
106
|
+
_: 1
|
|
107
|
+
}, 8, ["to"])])])) : createCommentVNode("v-if", true)
|
|
108
|
+
]),
|
|
109
|
+
_: 1
|
|
110
|
+
})]);
|
|
109
111
|
};
|
|
110
112
|
}
|
|
111
113
|
});
|
|
@@ -113,4 +115,4 @@ var LoginForm_default = _sfc_main;
|
|
|
113
115
|
|
|
114
116
|
//#endregion
|
|
115
117
|
export { loginSchemaWithMetadata as n, LoginForm_default as t };
|
|
116
|
-
//# sourceMappingURL=LoginForm-
|
|
118
|
+
//# sourceMappingURL=LoginForm-9UFnA-fO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoginForm-9UFnA-fO.js","names":[],"sources":["../src/slices/auth/features/login/loginSchema.ts","../src/slices/auth/features/login/LoginForm.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { loginSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type LoginForm = z.infer<typeof loginSchema>;\n\n// Enhance the schema with metadata\nexport const loginSchemaWithMetadata = withMetadata(loginSchema, 'loginSchema', {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'username',\n className: 'login-field',\n autofocus: true,\n },\n\n password: {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n});\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Login</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.EmailField />\n <zinia.PasswordField />\n\n <ZiniaSubmitButton submitText=\"Login\" submittingText=\"Logging in...\" />\n\n <!-- Error banner underneath login button - backend owns the message -->\n <div\n v-if=\"loginBannerMessage\"\n class=\"mt-4 p-4 rounded-lg bg-error/15 text-error\"\n >\n <p class=\"text-sm\">{{ loginBannerMessage }}</p>\n </div>\n\n <div class=\"mt-2\">\n <AppLink :to=\"forgotPasswordLink\" class=\"link-accent link\">\n Forgot your password?\n </AppLink>\n </div>\n <div v-if=\"allowUserSignup\" class=\"text-center mt-2\">\n <p>\n Don't have an account?\n <AppLink class=\"link-accent link\" :to=\"signupLink\">Sign up</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { z } from 'zod';\nimport { loginSchemaWithMetadata } from './loginSchema';\n\nconst { allowUserSignup, emailVerificationMode } = useEnv();\nconst route = useRoute();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst forgotPasswordLink = computed(() => withReturnUrl('/auth/forgot-password', returnUrl.value));\nconst signupLink = computed(() => withReturnUrl('/auth/signup', returnUrl.value));\n\nconst loginBannerMessage = ref<string | null>(null);\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(loginSchemaWithMetadata, {\n storeName: 'login-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst sessionStore = useUserSessionStore();\nconst router = useRouter();\nconst { mutate: loginMutate } = useMutation(\n (api, input: z.infer<typeof loginSchemaWithMetadata>) => api.userSessions.login(input),\n { credentials: 'include' }, // Include credentials to allow cookies\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof loginSchemaWithMetadata>) => {\n loginBannerMessage.value = null;\n\n const loginData = await loginMutate(data);\n if (!loginData) throw new Error('Login failed');\n const { access_token, user_details_token } = loginData;\n if (!access_token || !user_details_token) throw new Error('Invalid login response');\n\n return loginData;\n};\n\n// Handle success\nconst handleSuccess = async (data: {\n access_token: string;\n user_details_token: string;\n frontend_session?: { user?: { email_verified?: boolean } };\n}) => {\n sessionStore.setSession(data.user_details_token);\n sessionStore.setAccessToken(data.access_token);\n\n form.reset();\n loginBannerMessage.value = null;\n\n const emailVerified = data.frontend_session?.user?.email_verified ?? true;\n const needsVerification =\n emailVerificationMode === 'strict' && !emailVerified;\n\n const targetPath = needsVerification\n ? withReturnUrl('/auth/verify-email', returnUrl.value)\n : getValidReturnUrl(router.currentRoute.value, '/');\n\n await router.push(targetPath);\n};\n\n// Handle error - display backend message (backend owns error messaging)\nconst handleError = (error: unknown) => {\n loginBannerMessage.value =\n error instanceof Error ? error.message : 'Invalid username or password was entered.';\n};\n</script>\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { l as useUserSessionStore } from "./useRpcAuth-
|
|
2
|
-
import { t as useMutation } from "./useMutation-
|
|
1
|
+
import { l as useUserSessionStore } from "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
3
3
|
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
4
4
|
import { r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
5
5
|
import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, onMounted, openBlock, ref, toDisplayString, withCtx } from "vue";
|
|
@@ -68,4 +68,4 @@ var Logout_default = _sfc_main;
|
|
|
68
68
|
|
|
69
69
|
//#endregion
|
|
70
70
|
export { Logout_default as t };
|
|
71
|
-
//# sourceMappingURL=Logout-
|
|
71
|
+
//# sourceMappingURL=Logout-YgTgOFUH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logout-
|
|
1
|
+
{"version":3,"file":"Logout-YgTgOFUH.js","names":["error: unknown"],"sources":["../src/slices/auth/features/Logout.vue"],"sourcesContent":["<template>\n <div class=\"min-h-screen flex items-center justify-center bg-base-100\">\n <div class=\"max-w-md mx-auto bg-base-200 p-8 rounded-xl shadow-md text-center\">\n <div v-if=\"status === 'loading'\" class=\"space-y-4\">\n <div class=\"flex justify-center\">\n <span class=\"loading loading-spinner loading-lg text-primary\"></span>\n </div>\n <h2 class=\"text-2xl font-bold mb-2\">Logging out...</h2>\n <p class=\"text-base-content/70\">Please wait while we securely log you out</p>\n </div>\n <div v-else class=\"space-y-4\">\n <h2 class=\"text-2xl font-bold mb-2\">\n {{ status === 'success' ? 'Logged out' : 'Logout failed' }}\n </h2>\n <p class=\"text-base-content/70\">\n {{ status === 'success'\n ? 'Redirecting you...'\n : 'Redirecting you to login...' }}\n </p>\n <p class=\"text-sm text-base-content/60\">\n If you aren't redirected automatically,\n <AppLink :to=\"redirectTo\" class=\"link link-primary\">click here</AppLink>.\n </p>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../components/AppLink.vue';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../composables/useUserSessionStore';\nimport { getValidReturnUrl } from '../../../utils/useReturnUrl';\nimport { onMounted, computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\n\nconst sessionStore = useUserSessionStore();\nconst route = useRoute();\nconst router = useRouter();\nconst status = ref<'loading' | 'success' | 'error'>('loading');\n\nconst redirectTo = computed(() =>\n getValidReturnUrl(route, '/auth/login'),\n);\n\nconst { mutate: logoutMutate } = useMutation(\n (api) => api.userSessions.logout(),\n { credentials: 'include' }, // Include credentials to allow cookies\n);\n\nonMounted(async () => {\n try {\n await logoutMutate(undefined);\n sessionStore.clearSession();\n status.value = 'success';\n setTimeout(() => router.push(redirectTo.value), 1000);\n } catch (error: unknown) {\n status.value = 'error';\n toast.error(error instanceof Error ? error.message : 'Failed to logout', {\n autoClose: 2000,\n });\n setTimeout(() => router.push(redirectTo.value), 2000);\n }\n});\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAqCA,MAAM,eAAe,qBAAqB;EAC1C,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,WAAW;EAC1B,MAAM,SAAS,IAAqC,UAAU;EAE9D,MAAM,aAAa,eACjB,kBAAkB,OAAO,cAAc,CACxC;EAED,MAAM,EAAE,QAAQ,iBAAiB,aAC9B,QAAQ,IAAI,aAAa,QAAQ,EAClC,EAAE,aAAa,WAAW,CAC3B;AAED,YAAU,YAAY;AACpB,OAAI;AACF,UAAM,aAAa,OAAU;AAC7B,iBAAa,cAAc;AAC3B,WAAO,QAAQ;AACf,qBAAiB,OAAO,KAAK,WAAW,MAAM,EAAE,IAAK;YAC9CA,OAAgB;AACvB,WAAO,QAAQ;AACf,UAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,oBAAoB,EACvE,WAAW,KACZ,CAAC;AACF,qBAAiB,OAAO,KAAK,WAAW,MAAM,EAAE,IAAK;;IAEvD;;uBA/DA,mBAwBM,OAxBN,YAwBM,CAvBJ,mBAsBM,OAtBN,YAsBM,CArBO,OAAA,UAAM,aAAA,WAAA,EAAjB,mBAMM,OANN,YAMM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA;IALJ,mBAEM,OAAA,EAFD,OAAM,uBAAqB,EAAA,CAC9B,mBAAqE,QAAA,EAA/D,OAAM,mDAAiD,CAAA,CAAA;IAE/D,mBAAuD,MAAA,EAAnD,OAAM,2BAAyB,EAAC,kBAAc,GAAA;IAClD,mBAA6E,KAAA,EAA1E,OAAM,wBAAsB,EAAC,6CAAyC,GAAA;yBAE3E,mBAaM,OAbN,YAaM;IAZJ,mBAEK,MAFL,YAEK,gBADA,OAAA,UAAM,YAAA,eAAA,gBAAA,EAAA,EAAA;IAEX,mBAII,KAJJ,YAII,gBAHC,OAAA,UAAM,YAAA,uBAAA,8BAAA;IAIX,mBAGI,KAHJ,YAGI;+CAHoC,6CAEtC,GAAA;KAAA,YAAwE,iBAAA;MAA9D,IAAI,WAAA;MAAY,OAAM;;6BAA8B,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAV,cAAU,GAAA,CAAA,EAAA,CAAA;;;+CAAU,MAC1E,GAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import "./useQueryCache-Bjm-S8v5.js";
|
|
3
|
+
import "./useMutation-BTsyHKyn.js";
|
|
4
|
+
import "./AppLink-CHMMrSFI.js";
|
|
5
|
+
import "./mfaSchema-BnRWf0ma.js";
|
|
6
|
+
import { t as MfaSetup_default } from "./MfaSetup-RtFMY_dj.js";
|
|
7
|
+
|
|
8
|
+
export { MfaSetup_default as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as useMutation } from "./useMutation-
|
|
1
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
2
2
|
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
3
3
|
import { o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
4
|
-
import { t as mfaSetupConfirmSchemaWithMetadata } from "./mfaSchema-
|
|
4
|
+
import { t as mfaSetupConfirmSchemaWithMetadata } from "./mfaSchema-BnRWf0ma.js";
|
|
5
5
|
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
|
|
6
6
|
import { useRoute, useRouter } from "vue-router";
|
|
7
7
|
import { toast } from "vue3-toastify";
|
|
@@ -110,4 +110,4 @@ var MfaSetup_default = _sfc_main;
|
|
|
110
110
|
|
|
111
111
|
//#endregion
|
|
112
112
|
export { MfaSetup_default as t };
|
|
113
|
-
//# sourceMappingURL=MfaSetup-
|
|
113
|
+
//# sourceMappingURL=MfaSetup-RtFMY_dj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MfaSetup-
|
|
1
|
+
{"version":3,"file":"MfaSetup-RtFMY_dj.js","names":[],"sources":["../src/slices/auth/features/mfa/MfaSetup.vue"],"sourcesContent":["<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\">Set Up Two-Factor Authentication</h1>\n\n <div v-if=\"!setupData\" class=\"space-y-4\">\n <p class=\"text-base-content/80\">\n Add an extra layer of security to your account by enabling two-factor authentication (2FA).\n </p>\n <button\n type=\"button\"\n class=\"btn btn-primary w-full\"\n :disabled=\"loading\"\n @click=\"startSetup\"\n >\n {{ loading ? 'Starting...' : 'Begin Setup' }}\n </button>\n </div>\n\n <ZiniaForm\n v-else\n @handle-submit=\"handleConfirm\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n >\n <div class=\"space-y-4 mb-4\">\n <p class=\"text-sm text-base-content/80\">\n Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.):\n </p>\n <div v-if=\"setupData.qrCodeUrl\" class=\"flex justify-center\">\n <img\n :src=\"setupData.qrCodeUrl\"\n alt=\"MFA QR Code\"\n class=\"w-48 h-48 border rounded-lg\"\n />\n </div>\n <p class=\"text-sm text-base-content/80\">\n Or enter this secret manually: <code class=\"bg-base-300 px-2 py-1 rounded text-sm break-all\">{{ setupData.secret }}</code>\n </p>\n </div>\n <zinia.CodeField />\n <ZiniaSubmitButton submitText=\"Verify & Enable\" submittingText=\"Verifying...\" />\n\n <div class=\"text-center mt-2\">\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Back to Login</AppLink>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport type { DragoncoreApi, MfaApi } from '@dragonmastery/dragoncore-shared';\nimport { mfaSetupConfirmSchemaWithMetadata } from './mfaSchema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst setupData = ref<{ secret: string; qrCodeUrl: string } | null>(null);\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(\n mfaSetupConfirmSchemaWithMetadata,\n {\n storeName: 'mfa-setup-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n },\n);\n\nconst { mutate: startSetupMutate, loading } = useMutation(\n (api, _input?: unknown) => {\n const mfa = (api as DragoncoreApi).mfa;\n if (!mfa) throw new Error('MFA is not configured for this application');\n return (mfa as MfaApi).startSetup();\n },\n { skipAuthCheck: false },\n);\n\nconst { mutate: confirmSetupMutate } = useMutation(\n (api, code: string) => {\n const mfa = (api as DragoncoreApi).mfa;\n if (!mfa) throw new Error('MFA is not configured for this application');\n return (mfa as MfaApi).confirmSetup(code);\n },\n { skipAuthCheck: false },\n);\n\nconst startSetup = async () => {\n const result = await startSetupMutate(undefined);\n if (result) setupData.value = result;\n};\n\nconst handleConfirm = async (data: z.infer<typeof mfaSetupConfirmSchemaWithMetadata>) => {\n const result = await confirmSetupMutate(data.code);\n if (!result?.ok) throw new Error('MFA setup verification failed');\n return result;\n};\n\nconst handleSuccess = async (data: { ok: boolean; recoveryCodes?: string[] }) => {\n form.reset();\n setupData.value = null;\n if (data.recoveryCodes?.length) {\n toast.success(\n 'MFA enabled! Save your recovery codes in a safe place. You will need them if you lose access to your authenticator.',\n );\n } else {\n toast.success('Two-factor authentication has been enabled.');\n }\n const targetPath = getValidReturnUrl(route, '/');\n await router.push(targetPath);\n};\n\nconst handleError = (error: Error) => {\n toast.error(error.message || 'MFA setup failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DA,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,UAAU;EACxB,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAC/E,MAAM,YAAY,IAAkD,KAAK;EAEzE,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QACpD,mCACA;GACE,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CACF;EAED,MAAM,EAAE,QAAQ,kBAAkB,YAAY,aAC3C,KAAK,WAAqB;GACzB,MAAM,MAAO,IAAsB;AACnC,OAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,UAAQ,IAAe,YAAY;KAErC,EAAE,eAAe,OAAO,CACzB;EAED,MAAM,EAAE,QAAQ,uBAAuB,aACpC,KAAK,SAAiB;GACrB,MAAM,MAAO,IAAsB;AACnC,OAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,UAAQ,IAAe,aAAa,KAAK;KAE3C,EAAE,eAAe,OAAO,CACzB;EAED,MAAM,aAAa,YAAY;GAC7B,MAAM,SAAS,MAAM,iBAAiB,OAAU;AAChD,OAAI,OAAQ,WAAU,QAAQ;;EAGhC,MAAM,gBAAgB,OAAO,SAA4D;GACvF,MAAM,SAAS,MAAM,mBAAmB,KAAK,KAAK;AAClD,OAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,gCAAgC;AACjE,UAAO;;EAGT,MAAM,gBAAgB,OAAO,SAAoD;AAC/E,QAAK,OAAO;AACZ,aAAU,QAAQ;AAClB,OAAI,KAAK,eAAe,OACtB,OAAM,QACJ,sHACD;OAED,OAAM,QAAQ,8CAA8C;GAE9D,MAAM,aAAa,kBAAkB,OAAO,IAAI;AAChD,SAAM,OAAO,KAAK,WAAW;;EAG/B,MAAM,eAAe,UAAiB;AACpC,SAAM,MAAM,MAAM,WAAW,mBAAmB;;;uBAvHhD,mBA6CM,OA7CN,YA6CM,CAAA,OAAA,OAAA,OAAA,KA5CJ,mBAAqF,MAAA,EAAjF,OAAM,uCAAqC,EAAC,oCAAgC,GAAA,GAAA,CAEpE,UAAA,SAAA,WAAA,EAAZ,mBAYM,OAZN,YAYM,CAAA,OAAA,OAAA,OAAA,KAXJ,mBAEI,KAAA,EAFD,OAAM,wBAAsB,EAAC,iGAEhC,GAAA,GACA,mBAOS,UAAA;IANP,MAAK;IACL,OAAM;IACL,UAAU,MAAA,QAAO;IACjB,SAAO;sBAEL,MAAA,QAAO,GAAA,gBAAA,cAAA,EAAA,GAAA,WAAA,CAAA,CAAA,KAAA,WAAA,EAId,YA2BY,MAAA,UAAA,EAAA;;IAzBT,gBAAe;IACf,WAAS;IACT,SAAO;;2BAgBF;KAdN,mBAcM,OAdN,YAcM;gCAbJ,mBAEI,KAAA,EAFD,OAAM,gCAA8B,EAAC,wFAExC,GAAA;MACW,UAAA,MAAU,aAAA,WAAA,EAArB,mBAMM,OANN,YAMM,CALJ,mBAIE,OAAA;OAHC,KAAK,UAAA,MAAU;OAChB,KAAI;OACJ,OAAM;;MAGV,mBAEI,KAFJ,YAEI,CAAA,OAAA,OAAA,OAAA,KAAA,gBAFoC,oCACP,GAAA,GAAA,mBAA2F,QAA3F,YAA2F,gBAA1B,UAAA,MAAU,OAAM,EAAA,EAAA,CAAA,CAAA;;KAGpH,YAAmB,MAAA,MAAA,CAAA,UAAA;KACnB,YAAgF,MAAA,kBAAA,EAAA;MAA7D,YAAW;MAAkB,gBAAe;;KAE/D,mBAEM,OAFN,YAEM,CADJ,YAAyE,iBAAA;MAAhE,OAAM;MAAoB,IAAI,UAAA;;6BAAwB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAb,iBAAa,GAAA,CAAA,EAAA,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { l as useUserSessionStore } from "./useRpcAuth-
|
|
2
|
-
import { t as useMutation } from "./useMutation-
|
|
1
|
+
import { l as useUserSessionStore } from "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
3
3
|
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
4
4
|
import { o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
5
|
-
import { n as mfaVerifySchemaWithMetadata } from "./mfaSchema-
|
|
5
|
+
import { n as mfaVerifySchemaWithMetadata } from "./mfaSchema-BnRWf0ma.js";
|
|
6
6
|
import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
|
|
7
7
|
import { useRoute, useRouter } from "vue-router";
|
|
8
8
|
import { toast } from "vue3-toastify";
|
|
@@ -83,4 +83,4 @@ var MfaVerify_default = _sfc_main;
|
|
|
83
83
|
|
|
84
84
|
//#endregion
|
|
85
85
|
export { MfaVerify_default as t };
|
|
86
|
-
//# sourceMappingURL=MfaVerify-
|
|
86
|
+
//# sourceMappingURL=MfaVerify-Cvhe8bEM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MfaVerify-
|
|
1
|
+
{"version":3,"file":"MfaVerify-Cvhe8bEM.js","names":[],"sources":["../src/slices/auth/features/mfa/MfaVerify.vue"],"sourcesContent":["<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\">Two-Factor Authentication</h1>\n\n <p class=\"text-base-content/80 mb-4\">\n Enter the 6-digit code from your authenticator app to complete sign in.\n </p>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.CodeField />\n <ZiniaSubmitButton submitText=\"Verify\" submittingText=\"Verifying...\" />\n\n <div class=\"text-center mt-2\">\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Back to Login</AppLink>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport type { MfaApi } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\nimport { mfaVerifySchemaWithMetadata } from './mfaSchema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst sessionStore = useUserSessionStore();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst mfaSessionId = route.query.mfaSessionId as string;\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(mfaVerifySchemaWithMetadata, {\n storeName: 'mfa-verify-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst { mutate: verifyMutate } = useMutation(\n (api, input: { mfaSessionId: string; code: string }) => {\n const mfa = (api as DragoncoreApi).mfa;\n if (!mfa) throw new Error('MFA is not configured for this application');\n return (mfa as MfaApi).verify(input.mfaSessionId, input.code);\n },\n { credentials: 'include' },\n);\n\nconst handleSubmit = async (data: z.infer<typeof mfaVerifySchemaWithMetadata>) => {\n if (!mfaSessionId) throw new Error('Invalid MFA session. Please try logging in again.');\n const result = await verifyMutate({ mfaSessionId, code: data.code });\n if (!result?.access_token || !result?.user_details_token) throw new Error('Verification failed');\n return result;\n};\n\nconst handleSuccess = async (data: { access_token: string; user_details_token: string }) => {\n sessionStore.setSession(data.user_details_token);\n sessionStore.setAccessToken(data.access_token);\n form.reset();\n\n const targetPath = getValidReturnUrl(route, '/');\n await router.push(targetPath);\n toast.success('You are now logged in!');\n};\n\nconst handleError = (error: Error) => {\n toast.error(error.message || 'Verification failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;EAiCA,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,UAAU;EACxB,MAAM,eAAe,qBAAqB;EAE1C,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAC/E,MAAM,eAAe,MAAM,MAAM;EAEjC,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QAAQ,6BAA6B;GACzF,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CAAC;EAEF,MAAM,EAAE,QAAQ,iBAAiB,aAC9B,KAAK,UAAkD;GACtD,MAAM,MAAO,IAAsB;AACnC,OAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,UAAQ,IAAe,OAAO,MAAM,cAAc,MAAM,KAAK;KAE/D,EAAE,aAAa,WAAW,CAC3B;EAED,MAAM,eAAe,OAAO,SAAsD;AAChF,OAAI,CAAC,aAAc,OAAM,IAAI,MAAM,oDAAoD;GACvF,MAAM,SAAS,MAAM,aAAa;IAAE;IAAc,MAAM,KAAK;IAAM,CAAC;AACpE,OAAI,CAAC,QAAQ,gBAAgB,CAAC,QAAQ,mBAAoB,OAAM,IAAI,MAAM,sBAAsB;AAChG,UAAO;;EAGT,MAAM,gBAAgB,OAAO,SAA+D;AAC1F,gBAAa,WAAW,KAAK,mBAAmB;AAChD,gBAAa,eAAe,KAAK,aAAa;AAC9C,QAAK,OAAO;GAEZ,MAAM,aAAa,kBAAkB,OAAO,IAAI;AAChD,SAAM,OAAO,KAAK,WAAW;AAC7B,SAAM,QAAQ,yBAAyB;;EAGzC,MAAM,eAAe,UAAiB;AACpC,SAAM,MAAM,MAAM,WAAW,sBAAsB;;;uBAzEnD,mBAeM,OAfN,YAeM;8BAdJ,mBAA8E,MAAA,EAA1E,OAAM,uCAAqC,EAAC,6BAAyB,GAAA;8BAEzE,mBAEI,KAAA,EAFD,OAAM,6BAA2B,EAAC,6EAErC,GAAA;IAEA,YAOY,MAAA,UAAA,EAAA;KAPA,gBAAe;KAAe,WAAS;KAAgB,SAAO;;4BACrD;MAAnB,YAAmB,MAAA,MAAA,CAAA,UAAA;MACnB,YAAuE,MAAA,kBAAA,EAAA;OAApD,YAAW;OAAS,gBAAe;;MAEtD,mBAEM,OAFN,YAEM,CADJ,YAAyE,iBAAA;OAAhE,OAAM;OAAoB,IAAI,UAAA;;8BAAwB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAb,iBAAa,GAAA,CAAA,EAAA,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import "./useQueryCache-Bjm-S8v5.js";
|
|
3
|
+
import "./useMutation-BTsyHKyn.js";
|
|
4
|
+
import "./AppLink-CHMMrSFI.js";
|
|
5
|
+
import "./mfaSchema-BnRWf0ma.js";
|
|
6
|
+
import { t as MfaVerify_default } from "./MfaVerify-Cvhe8bEM.js";
|
|
7
|
+
|
|
8
|
+
export { MfaVerify_default as default };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as useMutation } from "./useMutation-
|
|
1
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
2
2
|
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
3
3
|
import { o as withReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
4
4
|
import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
|
|
@@ -89,4 +89,4 @@ var ResetPassword_default = _sfc_main;
|
|
|
89
89
|
|
|
90
90
|
//#endregion
|
|
91
91
|
export { resetPasswordSchemaWithMetadata as n, ResetPassword_default as t };
|
|
92
|
-
//# sourceMappingURL=ResetPassword-
|
|
92
|
+
//# sourceMappingURL=ResetPassword-BE4mXK9q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResetPassword-
|
|
1
|
+
{"version":3,"file":"ResetPassword-BE4mXK9q.js","names":[],"sources":["../src/slices/auth/features/reset_password/reset_password_schema.ts","../src/slices/auth/features/reset_password/ResetPassword.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { resetPasswordInputSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type ResetPasswordForm = z.infer<typeof resetPasswordInputSchema>;\n\n// Enhance the schema with metadata\nexport const resetPasswordSchemaWithMetadata = withMetadata(\n resetPasswordInputSchema,\n 'resetPasswordSchema',\n {\n 'passwords.password': {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'new-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: 'new-password',\n className: 'login-field',\n },\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\">Reset Password</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.PasswordsPasswordField />\n <zinia.PasswordsPasswordConfirmField />\n\n <ZiniaSubmitButton submitText=\"Reset Password\" submittingText=\"Resetting Password...\" />\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 AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport { resetPasswordSchemaWithMetadata } from './reset_password_schema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst token = route.params.token as string;\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(\n resetPasswordSchemaWithMetadata,\n {\n storeName: 'reset-password-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n },\n);\n\nconst { mutate: resetPasswordMutate } = useMutation(\n (api, input: z.infer<typeof resetPasswordSchemaWithMetadata> & { token: string }) =>\n api.passwordReset.resetPassword(input),\n {\n skipAuthCheck: true, // Reset password should work without authentication\n },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof resetPasswordSchemaWithMetadata>) => {\n const result = await resetPasswordMutate({\n ...data,\n token,\n });\n if (!result?.ok) throw new Error('Reset password failed');\n return result;\n};\n\n// Handle success\nconst handleSuccess = async (_data: { ok: boolean }) => {\n form.reset();\n await router.push(loginLink.value);\n toast.success('Password reset successful!');\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n toast.error(error instanceof Error ? error.message : 'Reset password failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;AAQA,MAAa,kCAAkC,aAC7C,0BACA,uBACA;CACE,sBAAsB;EACpB,WAAW;EACX,aAAa;EACb,UAAU;EACV,cAAc;EACd,WAAW;EACZ;CACD,8BAA8B;EAC5B,WAAW;EACX,aAAa;EACb,UAAU;EACV,cAAc;EACd,WAAW;EACZ;CACF,CACF;;;;;;;;;ECID,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,MAAM,OAAO;EAE3B,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAG/E,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QACpD,iCACA;GACE,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CACF;EAED,MAAM,EAAE,QAAQ,wBAAwB,aACrC,KAAK,UACJ,IAAI,cAAc,cAAc,MAAM,EACxC,EACE,eAAe,MAChB,CACF;EAGD,MAAM,eAAe,OAAO,SAA0D;GACpF,MAAM,SAAS,MAAM,oBAAoB;IACvC,GAAG;IACH;IACD,CAAC;AACF,OAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,wBAAwB;AACzD,UAAO;;EAIT,MAAM,gBAAgB,OAAO,UAA2B;AACtD,QAAK,OAAO;AACZ,SAAM,OAAO,KAAK,UAAU,MAAM;AAClC,SAAM,QAAQ,6BAA6B;;EAI7C,MAAM,eAAe,UAAmB;AACtC,SAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB;;;uBA1E7E,mBAgBM,OAhBN,YAgBM,CAAA,OAAA,OAAA,OAAA,KAfJ,mBAAmE,MAAA,EAA/D,OAAM,uCAAqC,EAAC,kBAAc,GAAA,GAE9D,YAYY,MAAA,UAAA,EAAA;IAZA,gBAAe;IAAe,WAAS;IAAgB,SAAO;;2BACxC;KAAhC,YAAgC,MAAA,MAAA,CAAA,uBAAA;KAChC,YAAuC,MAAA,MAAA,CAAA,8BAAA;KAEvC,YAAwF,MAAA,kBAAA,EAAA;MAArE,YAAW;MAAiB,gBAAe;;KAE9D,mBAKM,OALN,YAKM,CAJJ,mBAGI,KAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAAA,gBAHD,8BAED,GAAA,GAAA,YAAiE,iBAAA;MAAxD,OAAM;MAAoB,IAAI,UAAA;;6BAAgB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAL,SAAK,GAAA,CAAA,EAAA,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import "./useQueryCache-Bjm-S8v5.js";
|
|
3
|
+
import "./useMutation-BTsyHKyn.js";
|
|
4
|
+
import "./AppLink-CHMMrSFI.js";
|
|
5
|
+
import { t as ResetPassword_default } from "./ResetPassword-BE4mXK9q.js";
|
|
6
|
+
|
|
7
|
+
export { ResetPassword_default as default };
|
|
@@ -1,35 +1,36 @@
|
|
|
1
|
-
import "./useRpcAuth-
|
|
2
|
-
import "./useQueryCache-
|
|
3
|
-
import { t as useMutation } from "./useMutation-
|
|
4
|
-
import { t as useQuery } from "./useQuery-
|
|
5
|
-
import { Zt as useInjectedPinnedPresets } from "./src
|
|
1
|
+
import "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import "./useQueryCache-Bjm-S8v5.js";
|
|
3
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
4
|
+
import { t as useQuery } from "./useQuery-BggIE52P.js";
|
|
5
|
+
import { Zt as useInjectedPinnedPresets } from "./src-QZJyMfGX.js";
|
|
6
6
|
import "./AppLink-CHMMrSFI.js";
|
|
7
|
-
import { d as ConfirmDialog_default } from "./TimelineSystemEvent-
|
|
7
|
+
import { d as ConfirmDialog_default } from "./TimelineSystemEvent-BHzFr46C.js";
|
|
8
8
|
import "./TeamMembersTab-4gmnP9sD.js";
|
|
9
9
|
import "./Appearance-DxWTyx1M.js";
|
|
10
10
|
import "./useSignupPendingData-BWHwUHhL.js";
|
|
11
11
|
import "./useBreadcrumbs-qB6ghsAf.js";
|
|
12
|
-
import "./EditTeamMemberForm-
|
|
12
|
+
import "./EditTeamMemberForm-CaS2GLjV.js";
|
|
13
13
|
import "./RecordVersionViewer-BWZ78vvE.js";
|
|
14
|
-
import "./TeamHistoryTab-
|
|
15
|
-
import "./UserProfilePage-
|
|
16
|
-
import "./ChangePasswordPage
|
|
17
|
-
import "./TeamNotesTab-
|
|
18
|
-
import "./CustomerSupportTicketParent-
|
|
14
|
+
import "./TeamHistoryTab-D5biUPmq.js";
|
|
15
|
+
import "./UserProfilePage-C3b93Keh.js";
|
|
16
|
+
import "./ChangePasswordPage--3XwluwE.js";
|
|
17
|
+
import "./TeamNotesTab-BzGZZ1h8.js";
|
|
18
|
+
import "./CustomerSupportTicketParent-HIxwSVdu.js";
|
|
19
19
|
import "./SupportTicketDevLifecycleBadge-EMrQHfyG.js";
|
|
20
|
-
import "./StaffSupportTicketParent-
|
|
21
|
-
import "./LoginForm-
|
|
22
|
-
import "./
|
|
23
|
-
import "./
|
|
24
|
-
import "./
|
|
25
|
-
import "./
|
|
26
|
-
import "./
|
|
27
|
-
import "./
|
|
28
|
-
import "./
|
|
29
|
-
import "./
|
|
30
|
-
import "./
|
|
31
|
-
import "./
|
|
32
|
-
import "./
|
|
20
|
+
import "./StaffSupportTicketParent-CilR4RGM.js";
|
|
21
|
+
import "./LoginForm-9UFnA-fO.js";
|
|
22
|
+
import "./useEmailVerificationChannel-BNi926Ho.js";
|
|
23
|
+
import "./Signup-9TjMMnU4.js";
|
|
24
|
+
import "./ForgotPassword-OjIPi9s9.js";
|
|
25
|
+
import "./ResetPassword-BE4mXK9q.js";
|
|
26
|
+
import "./Logout-YgTgOFUH.js";
|
|
27
|
+
import "./mfaSchema-BnRWf0ma.js";
|
|
28
|
+
import "./MfaSetup-RtFMY_dj.js";
|
|
29
|
+
import "./MfaVerify-Cvhe8bEM.js";
|
|
30
|
+
import "./VerifyEmail-DlOmWGG-.js";
|
|
31
|
+
import "./UserListPage-DUE5gJTo.js";
|
|
32
|
+
import "./CreateUserPage-DLwXeLAq.js";
|
|
33
|
+
import "./EditUserPage-DURc5rmi.js";
|
|
33
34
|
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, renderList, resolveComponent, toDisplayString, unref, vModelText, withCtx, withDirectives, withKeys } from "vue";
|
|
34
35
|
|
|
35
36
|
//#region src/slices/saved_filter/SavedFiltersPage.vue
|
|
@@ -423,4 +424,4 @@ var SavedFiltersPage_default = _sfc_main;
|
|
|
423
424
|
|
|
424
425
|
//#endregion
|
|
425
426
|
export { SavedFiltersPage_default as default };
|
|
426
|
-
//# sourceMappingURL=SavedFiltersPage-
|
|
427
|
+
//# sourceMappingURL=SavedFiltersPage-DQt6uc8m.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SavedFiltersPage-BlzfWkaj.js","names":["CONTEXT_LABELS: Record<string, string>"],"sources":["../src/slices/saved_filter/SavedFiltersPage.vue"],"sourcesContent":["<template>\n <div class=\"max-w-4xl mx-auto\">\n <h1 class=\"text-2xl font-bold mb-6\">Saved Filters</h1>\n\n <div v-if=\"loading\" class=\"flex justify-center py-12\">\n <span class=\"loading loading-spinner loading-lg\" />\n </div>\n\n <template v-else>\n <!-- Favorites (pinned) section with reorder -->\n <section v-if=\"pinnedPresets.length > 0\" class=\"mb-8\">\n <h2 class=\"text-lg font-semibold mb-3 flex items-center gap-2\">\n <svg\n class=\"w-5 h-5 text-primary\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n Favorites\n </h2>\n <p class=\"text-sm text-base-content/70 mb-3\">\n Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder.\n </p>\n <ul class=\"space-y-2\">\n <li\n v-for=\"(preset, idx) in pinnedPresets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <div class=\"flex flex-col gap-0.5 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === 0\"\n title=\"Move up\"\n @click=\"movePinned(idx, -1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === pinnedPresets.length - 1\"\n title=\"Move down\"\n @click=\"movePinned(idx, 1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <span class=\"text-xs text-base-content/60 shrink-0\">\n {{ contextLabel(preset.context) }}\n </span>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-primary\"\n title=\"Unpin\"\n :disabled=\"unpinning\"\n @click=\"handleUnpin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </li>\n </ul>\n </section>\n\n <!-- All presets grouped by path -->\n <section>\n <h2 class=\"text-lg font-semibold mb-3\">All Presets</h2>\n <p v-if=\"groupedPresets.length === 0\" class=\"text-base-content/70 text-sm\">\n No saved presets yet. Use the Presets button on any list page to save your filters.\n </p>\n <div v-else class=\"space-y-6\">\n <div\n v-for=\"[routePath, presets] in groupedPresets\"\n :key=\"routePath\"\n class=\"space-y-2\"\n >\n <h3 class=\"text-sm font-medium text-base-content/80 uppercase tracking-wide\">\n {{ contextLabelFromPath(routePath) }}\n </h3>\n <ul class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <div class=\"flex gap-1 shrink-0\">\n <button\n v-if=\"!isPinned(preset.id)\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n :title=\"canPinMore ? 'Pin to favorites' : 'Maximum 5 pinned'\"\n :disabled=\"!canPinMore || pinning\"\n @click=\"handlePin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n </div>\n </div>\n </section>\n </template>\n\n <!-- Delete confirmation modal -->\n <ConfirmDialog\n v-model=\"showDeleteConfirm\"\n title=\"Delete preset?\"\n confirm-text=\"Delete\"\n cancel-text=\"Cancel\"\n processing-text=\"Deleting...\"\n confirm-button-class=\"btn-error\"\n :is-processing=\"deleting\"\n @confirm=\"confirmDelete\"\n @cancel=\"presetToDelete = null\"\n >\n <template #message>\n <p>\n Are you sure you want to delete \"{{ presetToDelete?.name }}\"?\n This cannot be undone.\n </p>\n </template>\n </ConfirmDialog>\n\n <!-- Rename modal / inline could stay as is -->\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useMutation, useQuery } from '@dragonmastery/dragoncore-vue';\nimport { computed, nextTick, ref } from 'vue';\nimport ConfirmDialog from '../../components/ConfirmDialog.vue';\nimport { useInjectedPinnedPresets } from './usePinnedPresets';\n\nconst CACHE_KEY_ALL = 'saved-filters:all';\n\nconst { data: allPresets, loading, refetch: refetchAllPresets } = useQuery(\n (api) => api.savedFilters.listAllSavedFilters(),\n { cacheKey: CACHE_KEY_ALL, staleTime: 24 * 60 * 60 * 1000 },\n);\n\nconst injectedPinned = useInjectedPinnedPresets();\nconst pinnedPresets = computed(() => injectedPinned.pinned.value ?? []);\n\nconst groupedPresets = computed(() => {\n const groups = new Map<string, SavedFilterReadDto[]>();\n for (const preset of allPresets.value ?? []) {\n const key = preset.route_path || preset.context || 'other';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(preset);\n }\n return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst pinnedIdsSet = computed(() => new Set(pinnedPresets.value.map((p) => p.id)));\nconst canPinMore = computed(() => pinnedPresets.value.length < 5);\n\nfunction isPinned(id: string) {\n return pinnedIdsSet.value.has(id);\n}\n\nfunction getPresetLink(preset: SavedFilterReadDto) {\n return {\n path: preset.route_path,\n query: preset.filters ?? {},\n };\n}\n\nconst CONTEXT_LABELS: Record<string, string> = {\n tracker: 'Trackers',\n followup: 'Followups',\n support_ticket_staff: 'Staff Support Tickets',\n support_ticket_customer: 'Customer Support Tickets',\n};\n\nfunction contextLabel(context: string): string {\n return CONTEXT_LABELS[context] ?? context;\n}\n\nfunction contextLabelFromPath(routePath: string): string {\n if (routePath.startsWith('/trackers')) return 'Trackers';\n if (routePath.startsWith('/followups')) return 'Followups';\n if (routePath.startsWith('/support-tickets/staff')) return 'Staff Support Tickets';\n if (routePath.startsWith('/support-tickets')) return 'Customer Support Tickets';\n return routePath || 'Other';\n}\n\nconst { mutate: reorderPins, loading: reordering } = useMutation(\n (api, ids: string[]) => api.savedFilters.reorderPinnedPresets(ids),\n { invalidate: 'pinned-presets' },\n);\n\nconst { mutate: updatePreset, loading: renaming } = useMutation(\n (api, input: { id: string; name: string }) =>\n api.savedFilters.updateSavedFilter({ id: input.id, name: input.name }),\n { invalidate: /^saved-filters:/ },\n);\n\nconst { mutate: deletePreset, loading: deleting } = useMutation(\n (api, id: string) => api.savedFilters.deleteSavedFilter(id),\n { invalidate: /^saved-filters:|^pinned-presets/ },\n);\n\nconst pinning = ref(false);\nconst unpinning = ref(false);\n\nasync function handlePin(preset: SavedFilterReadDto) {\n pinning.value = true;\n try {\n await injectedPinned.pinPreset(preset);\n } finally {\n pinning.value = false;\n }\n}\n\nasync function handleUnpin(preset: SavedFilterReadDto) {\n unpinning.value = true;\n try {\n await injectedPinned.unpinPreset(preset.id);\n } finally {\n unpinning.value = false;\n }\n}\n\nasync function movePinned(idx: number, delta: number) {\n const list = [...pinnedPresets.value];\n const newIdx = idx + delta;\n if (newIdx < 0 || newIdx >= list.length) return;\n [list[idx], list[newIdx]] = [list[newIdx]!, list[idx]!];\n try {\n await reorderPins(list.map((p) => p.id));\n await injectedPinned.refetchPinned();\n } catch {\n // Error handled by mutation\n }\n}\n\nconst showDeleteConfirm = ref(false);\nconst presetToDelete = ref<SavedFilterReadDto | null>(null);\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n presetToDelete.value = preset;\n showDeleteConfirm.value = true;\n}\n\nasync function confirmDelete() {\n if (!presetToDelete.value) return;\n try {\n await deletePreset(presetToDelete.value.id);\n if (isPinned(presetToDelete.value.id)) {\n await injectedPinned.unpinPreset(presetToDelete.value.id);\n }\n await refetchAllPresets();\n presetToDelete.value = null;\n showDeleteConfirm.value = false;\n } catch {\n // Error handled by mutation\n }\n}\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n try {\n await updatePreset({ id: presetId, name });\n cancelRename();\n await refetchAllPresets();\n if (isPinned(presetId)) {\n await injectedPinned.refetchPinned();\n }\n } catch {\n // Error handled by mutation\n }\n}\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SavedFiltersPage-DQt6uc8m.js","names":["CONTEXT_LABELS: Record<string, string>"],"sources":["../src/slices/saved_filter/SavedFiltersPage.vue"],"sourcesContent":["<template>\n <div class=\"max-w-4xl mx-auto\">\n <h1 class=\"text-2xl font-bold mb-6\">Saved Filters</h1>\n\n <div v-if=\"loading\" class=\"flex justify-center py-12\">\n <span class=\"loading loading-spinner loading-lg\" />\n </div>\n\n <template v-else>\n <!-- Favorites (pinned) section with reorder -->\n <section v-if=\"pinnedPresets.length > 0\" class=\"mb-8\">\n <h2 class=\"text-lg font-semibold mb-3 flex items-center gap-2\">\n <svg\n class=\"w-5 h-5 text-primary\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n Favorites\n </h2>\n <p class=\"text-sm text-base-content/70 mb-3\">\n Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder.\n </p>\n <ul class=\"space-y-2\">\n <li\n v-for=\"(preset, idx) in pinnedPresets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <div class=\"flex flex-col gap-0.5 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === 0\"\n title=\"Move up\"\n @click=\"movePinned(idx, -1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === pinnedPresets.length - 1\"\n title=\"Move down\"\n @click=\"movePinned(idx, 1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <span class=\"text-xs text-base-content/60 shrink-0\">\n {{ contextLabel(preset.context) }}\n </span>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-primary\"\n title=\"Unpin\"\n :disabled=\"unpinning\"\n @click=\"handleUnpin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </li>\n </ul>\n </section>\n\n <!-- All presets grouped by path -->\n <section>\n <h2 class=\"text-lg font-semibold mb-3\">All Presets</h2>\n <p v-if=\"groupedPresets.length === 0\" class=\"text-base-content/70 text-sm\">\n No saved presets yet. Use the Presets button on any list page to save your filters.\n </p>\n <div v-else class=\"space-y-6\">\n <div\n v-for=\"[routePath, presets] in groupedPresets\"\n :key=\"routePath\"\n class=\"space-y-2\"\n >\n <h3 class=\"text-sm font-medium text-base-content/80 uppercase tracking-wide\">\n {{ contextLabelFromPath(routePath) }}\n </h3>\n <ul class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <div class=\"flex gap-1 shrink-0\">\n <button\n v-if=\"!isPinned(preset.id)\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n :title=\"canPinMore ? 'Pin to favorites' : 'Maximum 5 pinned'\"\n :disabled=\"!canPinMore || pinning\"\n @click=\"handlePin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n </div>\n </div>\n </section>\n </template>\n\n <!-- Delete confirmation modal -->\n <ConfirmDialog\n v-model=\"showDeleteConfirm\"\n title=\"Delete preset?\"\n confirm-text=\"Delete\"\n cancel-text=\"Cancel\"\n processing-text=\"Deleting...\"\n confirm-button-class=\"btn-error\"\n :is-processing=\"deleting\"\n @confirm=\"confirmDelete\"\n @cancel=\"presetToDelete = null\"\n >\n <template #message>\n <p>\n Are you sure you want to delete \"{{ presetToDelete?.name }}\"?\n This cannot be undone.\n </p>\n </template>\n </ConfirmDialog>\n\n <!-- Rename modal / inline could stay as is -->\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useMutation, useQuery } from '@dragonmastery/dragoncore-vue';\nimport { computed, nextTick, ref } from 'vue';\nimport ConfirmDialog from '../../components/ConfirmDialog.vue';\nimport { useInjectedPinnedPresets } from './usePinnedPresets';\n\nconst CACHE_KEY_ALL = 'saved-filters:all';\n\nconst { data: allPresets, loading, refetch: refetchAllPresets } = useQuery(\n (api) => api.savedFilters.listAllSavedFilters(),\n { cacheKey: CACHE_KEY_ALL, staleTime: 24 * 60 * 60 * 1000 },\n);\n\nconst injectedPinned = useInjectedPinnedPresets();\nconst pinnedPresets = computed(() => injectedPinned.pinned.value ?? []);\n\nconst groupedPresets = computed(() => {\n const groups = new Map<string, SavedFilterReadDto[]>();\n for (const preset of allPresets.value ?? []) {\n const key = preset.route_path || preset.context || 'other';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(preset);\n }\n return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst pinnedIdsSet = computed(() => new Set(pinnedPresets.value.map((p) => p.id)));\nconst canPinMore = computed(() => pinnedPresets.value.length < 5);\n\nfunction isPinned(id: string) {\n return pinnedIdsSet.value.has(id);\n}\n\nfunction getPresetLink(preset: SavedFilterReadDto) {\n return {\n path: preset.route_path,\n query: preset.filters ?? {},\n };\n}\n\nconst CONTEXT_LABELS: Record<string, string> = {\n tracker: 'Trackers',\n followup: 'Followups',\n support_ticket_staff: 'Staff Support Tickets',\n support_ticket_customer: 'Customer Support Tickets',\n};\n\nfunction contextLabel(context: string): string {\n return CONTEXT_LABELS[context] ?? context;\n}\n\nfunction contextLabelFromPath(routePath: string): string {\n if (routePath.startsWith('/trackers')) return 'Trackers';\n if (routePath.startsWith('/followups')) return 'Followups';\n if (routePath.startsWith('/support-tickets/staff')) return 'Staff Support Tickets';\n if (routePath.startsWith('/support-tickets')) return 'Customer Support Tickets';\n return routePath || 'Other';\n}\n\nconst { mutate: reorderPins, loading: reordering } = useMutation(\n (api, ids: string[]) => api.savedFilters.reorderPinnedPresets(ids),\n { invalidate: 'pinned-presets' },\n);\n\nconst { mutate: updatePreset, loading: renaming } = useMutation(\n (api, input: { id: string; name: string }) =>\n api.savedFilters.updateSavedFilter({ id: input.id, name: input.name }),\n { invalidate: /^saved-filters:/ },\n);\n\nconst { mutate: deletePreset, loading: deleting } = useMutation(\n (api, id: string) => api.savedFilters.deleteSavedFilter(id),\n { invalidate: /^saved-filters:|^pinned-presets/ },\n);\n\nconst pinning = ref(false);\nconst unpinning = ref(false);\n\nasync function handlePin(preset: SavedFilterReadDto) {\n pinning.value = true;\n try {\n await injectedPinned.pinPreset(preset);\n } finally {\n pinning.value = false;\n }\n}\n\nasync function handleUnpin(preset: SavedFilterReadDto) {\n unpinning.value = true;\n try {\n await injectedPinned.unpinPreset(preset.id);\n } finally {\n unpinning.value = false;\n }\n}\n\nasync function movePinned(idx: number, delta: number) {\n const list = [...pinnedPresets.value];\n const newIdx = idx + delta;\n if (newIdx < 0 || newIdx >= list.length) return;\n [list[idx], list[newIdx]] = [list[newIdx]!, list[idx]!];\n try {\n await reorderPins(list.map((p) => p.id));\n await injectedPinned.refetchPinned();\n } catch {\n // Error handled by mutation\n }\n}\n\nconst showDeleteConfirm = ref(false);\nconst presetToDelete = ref<SavedFilterReadDto | null>(null);\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n presetToDelete.value = preset;\n showDeleteConfirm.value = true;\n}\n\nasync function confirmDelete() {\n if (!presetToDelete.value) return;\n try {\n await deletePreset(presetToDelete.value.id);\n if (isPinned(presetToDelete.value.id)) {\n await injectedPinned.unpinPreset(presetToDelete.value.id);\n }\n await refetchAllPresets();\n presetToDelete.value = null;\n showDeleteConfirm.value = false;\n } catch {\n // Error handled by mutation\n }\n}\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n try {\n await updatePreset({ id: presetId, name });\n cancelRename();\n await refetchAllPresets();\n if (isPinned(presetId)) {\n await injectedPinned.refetchPinned();\n }\n } catch {\n // Error handled by mutation\n }\n}\n</script>\n"],"mappings":"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"}
|