@dragonmastery/dragoncore-vue 0.0.22 → 0.0.23
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/{AppLink-CHMMrSFI.js → AppLink-FcNGKgvG.js} +1 -1
- package/dist/{AppLink-CHMMrSFI.js.map → AppLink-FcNGKgvG.js.map} +1 -1
- package/dist/Appearance-Ch4zfWZ3.js +3 -0
- package/dist/{Appearance-DxWTyx1M.js → Appearance-shr0Aql0.js} +1 -1
- package/dist/{Appearance-DxWTyx1M.js.map → Appearance-shr0Aql0.js.map} +1 -1
- package/dist/{ChangePasswordPage-ePeFkv_6.js → ChangePasswordPage-C633yQiU.js} +2 -2
- package/dist/{ChangePasswordPage-ePeFkv_6.js.map → ChangePasswordPage-C633yQiU.js.map} +1 -1
- package/dist/ChangePasswordPage-CYuCCosx.js +7 -0
- package/dist/ConfirmDialog-DjthOYU6.js +85 -0
- package/dist/ConfirmDialog-DjthOYU6.js.map +1 -0
- package/dist/ConsentRequired-BPjsZoPY.js +211 -0
- package/dist/ConsentRequired-BPjsZoPY.js.map +1 -0
- package/dist/CreateTeamForm-CeaC41VY.js +142 -0
- package/dist/CreateTeamForm-CeaC41VY.js.map +1 -0
- package/dist/CreateTeamForm-DfgCaUwX.js +12 -0
- package/dist/CreateTeamMemberForm-Bv9gNG4z.js +140 -0
- package/dist/CreateTeamMemberForm-Bv9gNG4z.js.map +1 -0
- package/dist/CreateTeamMemberForm-CnHfpob_.js +12 -0
- package/dist/CreateUserPage-C9uOeYDJ.js +7 -0
- package/dist/{CreateUserPage-Cdv-3U5M.js → CreateUserPage-CqKcY7_X.js} +2 -2
- package/dist/{CreateUserPage-Cdv-3U5M.js.map → CreateUserPage-CqKcY7_X.js.map} +1 -1
- package/dist/CreditBalanceDashboard-0HiJE_OS.js +13 -0
- package/dist/CreditBalanceDashboard-k_orNn4h.js +28 -0
- package/dist/CreditBalanceDashboard-k_orNn4h.js.map +1 -0
- package/dist/CreditManagement-BVBZQDI4.js +356 -0
- package/dist/CreditManagement-BVBZQDI4.js.map +1 -0
- package/dist/CreditManagement-DXdIN-0d.js +13 -0
- package/dist/CreditTransactionHistory-DSu-6aDi.js +229 -0
- package/dist/CreditTransactionHistory-DSu-6aDi.js.map +1 -0
- package/dist/CustomerCreateSupportTicketForm-BsjX8Pja.js +14 -0
- package/dist/CustomerCreateSupportTicketForm-kf8YIGjx.js +158 -0
- package/dist/CustomerCreateSupportTicketForm-kf8YIGjx.js.map +1 -0
- package/dist/{CustomerSupportTicketDetailPage-UGqVoV4j.js → CustomerSupportTicketDetailPage-C_-YoAaP.js} +12 -9
- package/dist/{CustomerSupportTicketDetailPage-UGqVoV4j.js.map → CustomerSupportTicketDetailPage-C_-YoAaP.js.map} +1 -1
- package/dist/CustomerSupportTicketList-DdACn3ug.js +63 -0
- package/dist/{CustomerSupportTicketParent-C2XdM5f7.js → CustomerSupportTicketParent-BpBuYCrP.js} +4 -4
- package/dist/{CustomerSupportTicketParent-C2XdM5f7.js.map → CustomerSupportTicketParent-BpBuYCrP.js.map} +1 -1
- package/dist/CustomerSupportTicketParent-Djy7pNqO.js +8 -0
- package/dist/CustomerSupportTicketSuccess-DsFzpJFU.js +12 -0
- package/dist/CustomerSupportTicketSuccess-cumNSGdx.js +54 -0
- package/dist/CustomerSupportTicketSuccess-cumNSGdx.js.map +1 -0
- package/dist/EditTeamForm-BE3iX2x3.js +12 -0
- package/dist/EditTeamForm-BxRN338L.js +163 -0
- package/dist/EditTeamForm-BxRN338L.js.map +1 -0
- package/dist/EditTeamMemberForm-D7D1Zddh.js +9 -0
- package/dist/{EditTeamMemberForm-BgjNP8MZ.js → EditTeamMemberForm-DfgJr5Cy.js} +7 -72
- package/dist/EditTeamMemberForm-DfgJr5Cy.js.map +1 -0
- package/dist/EditUserPage-C0K7EGjM.js +8 -0
- package/dist/{EditUserPage-uLPhRW5x.js → EditUserPage-CI_jtU8P.js} +4 -4
- package/dist/{EditUserPage-uLPhRW5x.js.map → EditUserPage-CI_jtU8P.js.map} +1 -1
- package/dist/EnhancedRefreshTokenHandler-C6tZCcfX.js +189 -0
- package/dist/EnhancedRefreshTokenHandler-C6tZCcfX.js.map +1 -0
- package/dist/FieldsetSection-Cd4B8Ad7.js +27 -0
- package/dist/FieldsetSection-Cd4B8Ad7.js.map +1 -0
- package/dist/{ForgotPassword-B8JG_n9D.js → ForgotPassword-Ckb9Z-wb.js} +4 -4
- package/dist/{ForgotPassword-B8JG_n9D.js.map → ForgotPassword-Ckb9Z-wb.js.map} +1 -1
- package/dist/ForgotPassword-tJVSg7PB.js +8 -0
- package/dist/{TimelineSystemEvent-BGG9WkQw.js → InlineAttachments-DAn_QknY.js} +60 -661
- package/dist/InlineAttachments-DAn_QknY.js.map +1 -0
- package/dist/{LoginForm-C-_lBDyl.js → LoginForm-CMN2T1fA.js} +5 -5
- package/dist/{LoginForm-C-_lBDyl.js.map → LoginForm-CMN2T1fA.js.map} +1 -1
- package/dist/LoginForm-QFJ8NHww.js +8 -0
- package/dist/{Logout-CIAoXyOg.js → Logout-CFLYHlLr.js} +5 -5
- package/dist/{Logout-CIAoXyOg.js.map → Logout-CFLYHlLr.js.map} +1 -1
- package/dist/Logout-CjDBff3W.js +8 -0
- package/dist/MfaSetup-BZcoxJx-.js +9 -0
- package/dist/{MfaSetup-9qdTKQ0m.js → MfaSetup-XqoAwBXx.js} +5 -5
- package/dist/{MfaSetup-9qdTKQ0m.js.map → MfaSetup-XqoAwBXx.js.map} +1 -1
- package/dist/{MfaVerify-Cgta1nE9.js → MfaVerify-C-A75TFZ.js} +6 -6
- package/dist/{MfaVerify-Cgta1nE9.js.map → MfaVerify-C-A75TFZ.js.map} +1 -1
- package/dist/MfaVerify-Dy2aV5Gk.js +9 -0
- package/dist/{RecordVersionViewer-BWZ78vvE.js → RecordVersionViewer-D2j10HdK.js} +1 -1
- package/dist/{RecordVersionViewer-BWZ78vvE.js.map → RecordVersionViewer-D2j10HdK.js.map} +1 -1
- package/dist/{ResetPassword-DHUfERyS.js → ResetPassword-Cd-Yxp8E.js} +4 -4
- package/dist/{ResetPassword-DHUfERyS.js.map → ResetPassword-Cd-Yxp8E.js.map} +1 -1
- package/dist/ResetPassword-D6to3G6a.js +8 -0
- package/dist/{SavedFiltersPage-CjFv4fI_.js → SavedFiltersPage-DM5DvAFa.js} +62 -34
- package/dist/{SavedFiltersPage-CjFv4fI_.js.map → SavedFiltersPage-DM5DvAFa.js.map} +1 -1
- package/dist/{Signup-DfG7Xmkx.js → Signup-2pqvJiVt.js} +57 -57
- package/dist/Signup-2pqvJiVt.js.map +1 -0
- package/dist/Signup-XdImA1os.js +9 -0
- package/dist/{SignupConsentFlow-YGWhF7tj.js → SignupConsentFlow-X3kXuviv.js} +106 -70
- package/dist/SignupConsentFlow-X3kXuviv.js.map +1 -0
- package/dist/{SignupRequirementsPage-Sm3vgkhC.js → SignupRequirementsPage-Cf-ElkEq.js} +9 -8
- package/dist/{SignupRequirementsPage-Sm3vgkhC.js.map → SignupRequirementsPage-Cf-ElkEq.js.map} +1 -1
- package/dist/StaffCreateSupportTicketForm-BlUP2XXy.js +14 -0
- package/dist/StaffCreateSupportTicketForm-D2nn4rTU.js +255 -0
- package/dist/StaffCreateSupportTicketForm-D2nn4rTU.js.map +1 -0
- package/dist/{StaffSupportTicketDetailPage-ePkLJU12.js → StaffSupportTicketDetailPage-MFtm06BE.js} +14 -11
- package/dist/{StaffSupportTicketDetailPage-ePkLJU12.js.map → StaffSupportTicketDetailPage-MFtm06BE.js.map} +1 -1
- package/dist/StaffSupportTicketList-LfLx0pYP.js +63 -0
- package/dist/StaffSupportTicketParent-B7mEN1oD.js +8 -0
- package/dist/{StaffSupportTicketParent-Bz-SH6-k.js → StaffSupportTicketParent-BvPwgOqH.js} +4 -4
- package/dist/{StaffSupportTicketParent-Bz-SH6-k.js.map → StaffSupportTicketParent-BvPwgOqH.js.map} +1 -1
- package/dist/StaffSupportTicketSuccess-BMCOP3ko.js +12 -0
- package/dist/StaffSupportTicketSuccess-Ca2WrcRg.js +54 -0
- package/dist/StaffSupportTicketSuccess-Ca2WrcRg.js.map +1 -0
- package/dist/{SupportStaffPage-0X1VMovT.js → SupportStaffPage-B69-kuvg.js} +8 -7
- package/dist/{SupportStaffPage-0X1VMovT.js.map → SupportStaffPage-B69-kuvg.js.map} +1 -1
- package/dist/{SupportTicketDevLifecycleBadge-EMrQHfyG.js → SupportTicketDevLifecycleBadge-BoAjMb08.js} +1 -1
- package/dist/{SupportTicketDevLifecycleBadge-EMrQHfyG.js.map → SupportTicketDevLifecycleBadge-BoAjMb08.js.map} +1 -1
- package/dist/{SupportTicketMaintenancePage-CLDqc4Pb.js → SupportTicketMaintenancePage-Bptja-xb.js} +5 -4
- package/dist/{SupportTicketMaintenancePage-CLDqc4Pb.js.map → SupportTicketMaintenancePage-Bptja-xb.js.map} +1 -1
- package/dist/TeamAttachmentsTab-Dk3LxX3n.js +63 -0
- package/dist/TeamHistoryTab-CRONdHcL.js +6 -0
- package/dist/{TeamHistoryTab-D0zW5wjj.js → TeamHistoryTab-DM8KBEG1.js} +7 -19
- package/dist/TeamHistoryTab-DM8KBEG1.js.map +1 -0
- package/dist/TeamList-DYm_vQ2z.js +8 -0
- package/dist/TeamList-qdwlMuJv.js +141 -0
- package/dist/TeamList-qdwlMuJv.js.map +1 -0
- package/dist/TeamMemberList-4LRLT_7Z.js +7 -0
- package/dist/TeamMemberList-DyI1U1t_.js +166 -0
- package/dist/TeamMemberList-DyI1U1t_.js.map +1 -0
- package/dist/TeamMemberParent-B63pRfI6.js +10 -0
- package/dist/TeamMemberParent-D9Fxu7GD.js +83 -0
- package/dist/TeamMemberParent-D9Fxu7GD.js.map +1 -0
- package/dist/TeamMembersTab-BGcdyEE8.js +3 -0
- package/dist/{TeamMembersTab-4gmnP9sD.js → TeamMembersTab-BigqpBDH.js} +1 -1
- package/dist/{TeamMembersTab-4gmnP9sD.js.map → TeamMembersTab-BigqpBDH.js.map} +1 -1
- package/dist/{TeamNotesTab-DImzeVPk.js → TeamNotesTab-BgxleidZ.js} +6 -5
- package/dist/{TeamNotesTab-DImzeVPk.js.map → TeamNotesTab-BgxleidZ.js.map} +1 -1
- package/dist/TeamNotesTab-o7glfjoY.js +8 -0
- package/dist/TeamParent-BwXqA3rj.js +83 -0
- package/dist/TeamParent-BwXqA3rj.js.map +1 -0
- package/dist/TeamParent-CFOmyKPz.js +11 -0
- package/dist/{TimelineNoteInput-Cpnwnx7B.js → TimelineNoteInput-DXaodm43.js} +3 -2
- package/dist/{TimelineNoteInput-Cpnwnx7B.js.map → TimelineNoteInput-DXaodm43.js.map} +1 -1
- package/dist/TimelineSystemEvent-zCMUx5Zz.js +525 -0
- package/dist/TimelineSystemEvent-zCMUx5Zz.js.map +1 -0
- package/dist/UserListPage-Bmwg0an5.js +5 -0
- package/dist/{UserListPage-DpkOdR1U.js → UserListPage-DtA8tLff.js} +4 -3
- package/dist/{UserListPage-DpkOdR1U.js.map → UserListPage-DtA8tLff.js.map} +1 -1
- package/dist/UserProfilePage-DRbCAr9H.js +8 -0
- package/dist/{UserProfilePage-CWRgwGQH.js → UserProfilePage-g4-VEDXo.js} +4 -4
- package/dist/{UserProfilePage-CWRgwGQH.js.map → UserProfilePage-g4-VEDXo.js.map} +1 -1
- package/dist/{VerifyEmail-DXZ4T5eN.js → VerifyEmail-CM5ehFB8.js} +7 -7
- package/dist/{VerifyEmail-DXZ4T5eN.js.map → VerifyEmail-CM5ehFB8.js.map} +1 -1
- package/dist/VerifyEmail-DMHczC9f.js +10 -0
- package/dist/ViewTeam-CXyABxE6.js +8 -0
- package/dist/ViewTeam-DSbKV60o.js +220 -0
- package/dist/ViewTeam-DSbKV60o.js.map +1 -0
- package/dist/ViewTeamMember-BB0nvPOe.js +167 -0
- package/dist/ViewTeamMember-BB0nvPOe.js.map +1 -0
- package/dist/ViewTeamMember-jrOnBaDh.js +7 -0
- package/dist/ZiniaContainer-CjVhCnGB.js +18 -0
- package/dist/ZiniaContainer-CjVhCnGB.js.map +1 -0
- package/dist/{convertToLocalDateTime-CFhtN6PI.js → convertToLocalDateTime-BF25N4xd.js} +1 -2
- package/dist/convertToLocalDateTime-BF25N4xd.js.map +1 -0
- package/dist/customerSupportTicketRoutes-C7OxGAGl.js +142 -0
- package/dist/customerSupportTicketRoutes-C7OxGAGl.js.map +1 -0
- package/dist/{displayIdFormatter-Dz900Awr.js → displayIdFormatter-B-_WQHOr.js} +1 -1
- package/dist/{displayIdFormatter-Dz900Awr.js.map → displayIdFormatter-B-_WQHOr.js.map} +1 -1
- package/dist/{extractRpcErrorMessage-Di8E8-Wh.js → extractRpcErrorMessage-diUBl6Ij.js} +1 -1
- package/dist/{extractRpcErrorMessage-Di8E8-Wh.js.map → extractRpcErrorMessage-diUBl6Ij.js.map} +1 -1
- package/dist/index.d.ts +859 -900
- package/dist/index.js +66 -38
- package/dist/{mfaSchema-BnRWf0ma.js → mfaSchema-Ukqzdyck.js} +1 -1
- package/dist/{mfaSchema-BnRWf0ma.js.map → mfaSchema-Ukqzdyck.js.map} +1 -1
- package/dist/saved_filter-CfzH0BzK.js +1210 -0
- package/dist/saved_filter-CfzH0BzK.js.map +1 -0
- package/dist/signupConsentStorage-DS9vCUuC.js +27 -0
- package/dist/signupConsentStorage-DS9vCUuC.js.map +1 -0
- package/dist/{src-CEBiyg_f.css → src-C6ZmNSSU.css} +1 -1
- package/dist/{src-CEBiyg_f.css.map → src-C6ZmNSSU.css.map} +1 -1
- package/dist/src-DVe_0RO9.js +4654 -0
- package/dist/src-DVe_0RO9.js.map +1 -0
- package/dist/staffSupportTicketRoutes-CWutoQWp.js +135 -0
- package/dist/staffSupportTicketRoutes-CWutoQWp.js.map +1 -0
- package/dist/teamMemberMetadata-CQnbVepq.js +49 -0
- package/dist/teamMemberMetadata-CQnbVepq.js.map +1 -0
- package/dist/teamMetadata-DlvwO5V0.js +53 -0
- package/dist/teamMetadata-DlvwO5V0.js.map +1 -0
- package/dist/teamRoutes-KFgnsdDP.js +192 -0
- package/dist/teamRoutes-KFgnsdDP.js.map +1 -0
- package/dist/team_memberRoutes-Cjpw_ql6.js +84 -0
- package/dist/team_memberRoutes-Cjpw_ql6.js.map +1 -0
- package/dist/{useBreadcrumbs-qB6ghsAf.js → useBreadcrumbs-DIqU5AAp.js} +1 -1
- package/dist/{useBreadcrumbs-qB6ghsAf.js.map → useBreadcrumbs-DIqU5AAp.js.map} +1 -1
- package/dist/{useEmailVerificationChannel-BiiuuTUM.js → useEmailVerificationChannel-B51z65PN.js} +3 -3
- package/dist/{useEmailVerificationChannel-BiiuuTUM.js.map → useEmailVerificationChannel-B51z65PN.js.map} +1 -1
- package/dist/{useMutation-BMZJLpgx.js → useMutation-BLNuJoYl.js} +6 -3
- package/dist/useMutation-BLNuJoYl.js.map +1 -0
- package/dist/{useQuery-qpXzBuVg.js → useQuery-BzUGEOj0.js} +4 -3
- package/dist/{useQuery-qpXzBuVg.js.map → useQuery-BzUGEOj0.js.map} +1 -1
- package/dist/{useQueryCache-DkRwK5Gz.js → useQueryCache-alzaRWEb.js} +2 -2
- package/dist/{useQueryCache-DkRwK5Gz.js.map → useQueryCache-alzaRWEb.js.map} +1 -1
- package/dist/{useReturnUrl-qFeazn-G.js → useReturnUrl-B5V3SJf5.js} +1 -1
- package/dist/{useReturnUrl-qFeazn-G.js.map → useReturnUrl-B5V3SJf5.js.map} +1 -1
- package/dist/{useRpcAuth-x5Gn5gR0.js → useRpcAuth-CJtq1dqM.js} +9 -192
- package/dist/useRpcAuth-CJtq1dqM.js.map +1 -0
- package/dist/userAuthorized-C09FHWGL.js +185 -0
- package/dist/userAuthorized-C09FHWGL.js.map +1 -0
- package/package.json +3 -3
- package/dist/Appearance-D5pwxuf4.js +0 -3
- package/dist/ChangePasswordPage-DVBkBcm9.js +0 -6
- package/dist/ConsentRequired-e7DEOGNg.js +0 -213
- package/dist/ConsentRequired-e7DEOGNg.js.map +0 -1
- package/dist/CreateTeamForm-CV9Y00tD.js +0 -35
- package/dist/CreateTeamMemberForm-BX1vUcdg.js +0 -35
- package/dist/CreateUserPage-DQoEX-Er.js +0 -6
- package/dist/CreditBalanceDashboard-BZAnEjSz.js +0 -35
- package/dist/CreditManagement-C4-_c175.js +0 -35
- package/dist/CustomerCreateSupportTicketForm-3tIJKMnJ.js +0 -35
- package/dist/CustomerSupportTicketList-CFQEoXtm.js +0 -35
- package/dist/CustomerSupportTicketParent-Tnov1dEg.js +0 -7
- package/dist/CustomerSupportTicketSuccess-DLszUCsg.js +0 -35
- package/dist/EditTeamForm-Ww04P2M0.js +0 -35
- package/dist/EditTeamMemberForm-BgjNP8MZ.js.map +0 -1
- package/dist/EditTeamMemberForm-COfY-2FQ.js +0 -6
- package/dist/EditUserPage-BJHs3raG.js +0 -7
- package/dist/ForgotPassword-CzMPARbz.js +0 -7
- package/dist/LoginForm-DdzRn8nU.js +0 -7
- package/dist/Logout-3_Ns09Vy.js +0 -7
- package/dist/MfaSetup-BE_NP70B.js +0 -8
- package/dist/MfaVerify-CyiJ9A3L.js +0 -8
- package/dist/ResetPassword-DXHunZVp.js +0 -7
- package/dist/Signup-Cy1puoqh.js +0 -9
- package/dist/Signup-DfG7Xmkx.js.map +0 -1
- package/dist/SignupConsentFlow-YGWhF7tj.js.map +0 -1
- package/dist/StaffCreateSupportTicketForm-C5tRPz95.js +0 -35
- package/dist/StaffSupportTicketList-BbiPTm54.js +0 -35
- package/dist/StaffSupportTicketParent-D2onnMqe.js +0 -7
- package/dist/StaffSupportTicketSuccess-DLVRTvr1.js +0 -35
- package/dist/TeamAttachmentsTab-B-xXmvOy.js +0 -35
- package/dist/TeamHistoryTab-Bb7mq4Dc.js +0 -4
- package/dist/TeamHistoryTab-D0zW5wjj.js.map +0 -1
- package/dist/TeamList-B-cFoclM.js +0 -35
- package/dist/TeamMemberList-D3GNHlXH.js +0 -35
- package/dist/TeamMemberParent-BKfPMX05.js +0 -35
- package/dist/TeamMembersTab-CBB2Yl_I.js +0 -3
- package/dist/TeamNotesTab-BbODx7wS.js +0 -7
- package/dist/TeamParent-5lokhztw.js +0 -35
- package/dist/TimelineSystemEvent-BGG9WkQw.js.map +0 -1
- package/dist/UserListPage-4hZll_PC.js +0 -4
- package/dist/UserProfilePage-qFrg3PiC.js +0 -7
- package/dist/VerifyEmail-C5EO8OFo.js +0 -9
- package/dist/ViewTeam-Die0SWa_.js +0 -35
- package/dist/ViewTeamMember-_sqrqGit.js +0 -35
- package/dist/convertToLocalDateTime-CFhtN6PI.js.map +0 -1
- package/dist/src-_IeDZXH6.js +0 -8951
- package/dist/src-_IeDZXH6.js.map +0 -1
- package/dist/useMutation-BMZJLpgx.js.map +0 -1
- package/dist/useRpcAuth-x5Gn5gR0.js.map +0 -1
- package/dist/useSignupPendingData-BWHwUHhL.js +0 -47
- package/dist/useSignupPendingData-BWHwUHhL.js.map +0 -1
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, toDisplayString } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/slices/support_ticket/utils/creditValueFormatter.ts
|
|
4
|
+
/**
|
|
5
|
+
* Helper function to check if credit value is empty
|
|
6
|
+
*/
|
|
7
|
+
function isCreditValueEmpty(value) {
|
|
8
|
+
return value === null || value === void 0 || value.trim() === "";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Core credit formatting logic
|
|
12
|
+
*/
|
|
13
|
+
function formatCreditValueCore(creditValue) {
|
|
14
|
+
if (isCreditValueEmpty(creditValue)) return "TBD";
|
|
15
|
+
const trimmed = creditValue.trim();
|
|
16
|
+
if (parseFloat(trimmed) === 0) return "0";
|
|
17
|
+
return trimmed.replace(/\.?0+$/, "");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Formats credit value for staff views (includes internal ticket logic)
|
|
21
|
+
*
|
|
22
|
+
* @param creditValue - The credit value from the database
|
|
23
|
+
* @param approvalStatus - The approval status to determine display logic
|
|
24
|
+
* @returns Formatted string for display
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* formatStaffCreditValue("5.50", "PENDING") // "5.5"
|
|
28
|
+
* formatStaffCreditValue("10", "INTERNAL") // "N/A"
|
|
29
|
+
*/
|
|
30
|
+
function formatStaffCreditValue(creditValue, approvalStatus) {
|
|
31
|
+
if (approvalStatus === "INTERNAL") return "N/A";
|
|
32
|
+
return formatCreditValueCore(creditValue);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Formats credit value for customer views (status-based logic)
|
|
36
|
+
*
|
|
37
|
+
* @param creditValue - The credit value from the database
|
|
38
|
+
* @param status - The computed status from the customer query
|
|
39
|
+
* @returns Formatted string for display
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* formatCustomerCreditValue("5.50", "PENDING") // "5.5"
|
|
43
|
+
* formatCustomerCreditValue("5.50", "FOLLOWUP") // "5.5"
|
|
44
|
+
*/
|
|
45
|
+
function formatCustomerCreditValue(creditValue) {
|
|
46
|
+
return formatCreditValueCore(creditValue);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/slices/support_ticket/shared/SupportTicketPriorityBadge.vue
|
|
51
|
+
const _hoisted_1$4 = ["aria-label"];
|
|
52
|
+
const _sfc_main$4 = /* @__PURE__ */ defineComponent({
|
|
53
|
+
__name: "SupportTicketPriorityBadge",
|
|
54
|
+
props: {
|
|
55
|
+
priority: {},
|
|
56
|
+
size: { default: "md" },
|
|
57
|
+
variant: { default: "default" }
|
|
58
|
+
},
|
|
59
|
+
setup(__props) {
|
|
60
|
+
/**
|
|
61
|
+
* SupportTicketPriorityBadge - A reusable Vue component for displaying support ticket priority
|
|
62
|
+
* as color-coded badges with consistent DaisyUI styling and accessibility features.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* <SupportTicketPriorityBadge :priority="'HIGH'" size="md" />
|
|
66
|
+
* <SupportTicketPriorityBadge :priority="'CRITICAL'" size="sm" variant="outline" />
|
|
67
|
+
*/
|
|
68
|
+
const props = __props;
|
|
69
|
+
/**
|
|
70
|
+
* Configuration for each priority badge
|
|
71
|
+
*/
|
|
72
|
+
const priorityConfig = {
|
|
73
|
+
LOW: {
|
|
74
|
+
color: "badge-neutral",
|
|
75
|
+
text: "Low",
|
|
76
|
+
ariaLabel: "Priority: Low priority"
|
|
77
|
+
},
|
|
78
|
+
MEDIUM: {
|
|
79
|
+
color: "badge-neutral",
|
|
80
|
+
text: "Medium",
|
|
81
|
+
ariaLabel: "Priority: Medium priority"
|
|
82
|
+
},
|
|
83
|
+
HIGH: {
|
|
84
|
+
color: "badge-neutral",
|
|
85
|
+
text: "High",
|
|
86
|
+
ariaLabel: "Priority: High priority"
|
|
87
|
+
},
|
|
88
|
+
CRITICAL: {
|
|
89
|
+
color: "badge-neutral",
|
|
90
|
+
text: "Critical",
|
|
91
|
+
ariaLabel: "Priority: Critical priority"
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const getPriorityConfig = (priority) => {
|
|
95
|
+
const config$1 = priorityConfig[priority];
|
|
96
|
+
if (!config$1) return {
|
|
97
|
+
color: "badge-neutral",
|
|
98
|
+
text: priority || "Unknown",
|
|
99
|
+
ariaLabel: `Priority: ${priority || "Unknown priority"}`
|
|
100
|
+
};
|
|
101
|
+
return config$1;
|
|
102
|
+
};
|
|
103
|
+
const config = computed(() => getPriorityConfig(props.priority));
|
|
104
|
+
const badgeClasses = computed(() => {
|
|
105
|
+
const baseClasses = ["badge", "text-xs"];
|
|
106
|
+
baseClasses.push(config.value.color);
|
|
107
|
+
if (props.size === "sm") baseClasses.push("badge-sm", "text-xs");
|
|
108
|
+
else if (props.size === "lg") baseClasses.push("badge-lg", "text-sm");
|
|
109
|
+
else baseClasses.push("text-xs", "sm:text-sm");
|
|
110
|
+
if (props.variant === "outline") baseClasses.push("badge-outline");
|
|
111
|
+
return baseClasses.join(" ");
|
|
112
|
+
});
|
|
113
|
+
const displayText = computed(() => config.value.text);
|
|
114
|
+
const ariaLabel = computed(() => config.value.ariaLabel);
|
|
115
|
+
return (_ctx, _cache) => {
|
|
116
|
+
return openBlock(), createElementBlock("div", {
|
|
117
|
+
class: normalizeClass(badgeClasses.value),
|
|
118
|
+
"aria-label": ariaLabel.value,
|
|
119
|
+
role: "status"
|
|
120
|
+
}, toDisplayString(displayText.value), 11, _hoisted_1$4);
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
var SupportTicketPriorityBadge_default = _sfc_main$4;
|
|
125
|
+
|
|
126
|
+
//#endregion
|
|
127
|
+
//#region src/slices/support_ticket/shared/SupportTicketTypeBadge.vue
|
|
128
|
+
const _hoisted_1$3 = ["aria-label"];
|
|
129
|
+
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
130
|
+
__name: "SupportTicketTypeBadge",
|
|
131
|
+
props: {
|
|
132
|
+
type: {},
|
|
133
|
+
size: { default: "md" },
|
|
134
|
+
variant: { default: "default" }
|
|
135
|
+
},
|
|
136
|
+
setup(__props) {
|
|
137
|
+
/**
|
|
138
|
+
* SupportTicketTypeBadge - A reusable Vue component for displaying support ticket type
|
|
139
|
+
* as color-coded badges with consistent DaisyUI styling and accessibility features.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* <SupportTicketTypeBadge :type="'BUG'" size="md" />
|
|
143
|
+
* <SupportTicketTypeBadge :type="'FEATURE_REQUEST'" size="sm" variant="outline" />
|
|
144
|
+
*/
|
|
145
|
+
const props = __props;
|
|
146
|
+
/**
|
|
147
|
+
* Configuration for each type badge
|
|
148
|
+
*/
|
|
149
|
+
const typeConfig = {
|
|
150
|
+
BUG: {
|
|
151
|
+
color: "badge-neutral",
|
|
152
|
+
text: "Bug",
|
|
153
|
+
ariaLabel: "Type: Bug report requiring fix"
|
|
154
|
+
},
|
|
155
|
+
FEATURE_REQUEST: {
|
|
156
|
+
color: "badge-neutral",
|
|
157
|
+
text: "Feature",
|
|
158
|
+
ariaLabel: "Type: New feature request"
|
|
159
|
+
},
|
|
160
|
+
IMPROVEMENT: {
|
|
161
|
+
color: "badge-neutral",
|
|
162
|
+
text: "Improvement",
|
|
163
|
+
ariaLabel: "Type: Enhancement to existing feature"
|
|
164
|
+
},
|
|
165
|
+
OPERATIONAL: {
|
|
166
|
+
color: "badge-neutral",
|
|
167
|
+
text: "Ops",
|
|
168
|
+
ariaLabel: "Type: Operational/admin work"
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
const getTypeConfig = (type) => {
|
|
172
|
+
const config$1 = typeConfig[type];
|
|
173
|
+
if (!config$1) return {
|
|
174
|
+
color: "badge-neutral",
|
|
175
|
+
text: type || "Unknown",
|
|
176
|
+
ariaLabel: `Type: ${type || "Unknown type"}`
|
|
177
|
+
};
|
|
178
|
+
return config$1;
|
|
179
|
+
};
|
|
180
|
+
const config = computed(() => getTypeConfig(props.type));
|
|
181
|
+
const badgeClasses = computed(() => {
|
|
182
|
+
const baseClasses = ["badge", "text-xs"];
|
|
183
|
+
baseClasses.push(config.value.color);
|
|
184
|
+
if (props.size === "sm") baseClasses.push("badge-sm", "text-xs");
|
|
185
|
+
else if (props.size === "lg") baseClasses.push("badge-lg", "text-sm");
|
|
186
|
+
else baseClasses.push("text-xs", "sm:text-sm");
|
|
187
|
+
if (props.variant === "outline") baseClasses.push("badge-outline");
|
|
188
|
+
return baseClasses.join(" ");
|
|
189
|
+
});
|
|
190
|
+
const displayText = computed(() => config.value.text);
|
|
191
|
+
const ariaLabel = computed(() => config.value.ariaLabel);
|
|
192
|
+
return (_ctx, _cache) => {
|
|
193
|
+
return openBlock(), createElementBlock("div", {
|
|
194
|
+
class: normalizeClass(badgeClasses.value),
|
|
195
|
+
"aria-label": ariaLabel.value,
|
|
196
|
+
role: "status"
|
|
197
|
+
}, toDisplayString(displayText.value), 11, _hoisted_1$3);
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
var SupportTicketTypeBadge_default = _sfc_main$3;
|
|
202
|
+
|
|
203
|
+
//#endregion
|
|
204
|
+
//#region src/slices/support_ticket/shared/SupportTicketApprovalBadge.vue
|
|
205
|
+
const _hoisted_1$2 = ["aria-label"];
|
|
206
|
+
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
207
|
+
__name: "SupportTicketApprovalBadge",
|
|
208
|
+
props: {
|
|
209
|
+
approvalStatus: {},
|
|
210
|
+
size: { default: "md" },
|
|
211
|
+
variant: { default: "default" }
|
|
212
|
+
},
|
|
213
|
+
setup(__props) {
|
|
214
|
+
/**
|
|
215
|
+
* SupportTicketApprovalBadge - A reusable Vue component for displaying support ticket approval status
|
|
216
|
+
* as color-coded badges with consistent DaisyUI styling and accessibility features.
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* <SupportTicketApprovalBadge :approvalStatus="'PENDING'" size="md" />
|
|
220
|
+
* <SupportTicketApprovalBadge :approvalStatus="'APPROVED'" size="sm" variant="outline" />
|
|
221
|
+
*/
|
|
222
|
+
const props = __props;
|
|
223
|
+
/**
|
|
224
|
+
* Configuration for each approval status badge
|
|
225
|
+
*/
|
|
226
|
+
const approvalConfig = {
|
|
227
|
+
PENDING: {
|
|
228
|
+
color: "badge-warning",
|
|
229
|
+
text: "Pending",
|
|
230
|
+
ariaLabel: "Approval: Awaiting staff decision"
|
|
231
|
+
},
|
|
232
|
+
APPROVED: {
|
|
233
|
+
color: "badge-success",
|
|
234
|
+
text: "Approved",
|
|
235
|
+
ariaLabel: "Approval: Approved by staff"
|
|
236
|
+
},
|
|
237
|
+
REJECTED: {
|
|
238
|
+
color: "badge-error",
|
|
239
|
+
text: "Rejected",
|
|
240
|
+
ariaLabel: "Approval: Rejected by staff"
|
|
241
|
+
},
|
|
242
|
+
INTERNAL: {
|
|
243
|
+
color: "badge-info",
|
|
244
|
+
text: "Internal",
|
|
245
|
+
ariaLabel: "Approval: Internal staff ticket"
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
const getApprovalConfig = (approvalStatus) => {
|
|
249
|
+
const config$1 = approvalConfig[approvalStatus];
|
|
250
|
+
if (!config$1) return {
|
|
251
|
+
color: "badge-neutral",
|
|
252
|
+
text: approvalStatus || "Unknown",
|
|
253
|
+
ariaLabel: `Approval: ${approvalStatus || "Unknown status"}`
|
|
254
|
+
};
|
|
255
|
+
return config$1;
|
|
256
|
+
};
|
|
257
|
+
const config = computed(() => getApprovalConfig(props.approvalStatus));
|
|
258
|
+
const badgeClasses = computed(() => {
|
|
259
|
+
const baseClasses = ["badge", "text-xs"];
|
|
260
|
+
baseClasses.push(config.value.color);
|
|
261
|
+
if (props.size === "sm") baseClasses.push("badge-sm", "text-xs");
|
|
262
|
+
else if (props.size === "lg") baseClasses.push("badge-lg", "text-sm");
|
|
263
|
+
else baseClasses.push("text-xs", "sm:text-sm");
|
|
264
|
+
if (props.variant === "outline") baseClasses.push("badge-outline");
|
|
265
|
+
return baseClasses.join(" ");
|
|
266
|
+
});
|
|
267
|
+
const displayText = computed(() => config.value.text);
|
|
268
|
+
const ariaLabel = computed(() => config.value.ariaLabel);
|
|
269
|
+
return (_ctx, _cache) => {
|
|
270
|
+
return openBlock(), createElementBlock("div", {
|
|
271
|
+
class: normalizeClass(badgeClasses.value),
|
|
272
|
+
"aria-label": ariaLabel.value,
|
|
273
|
+
role: "status"
|
|
274
|
+
}, toDisplayString(displayText.value), 11, _hoisted_1$2);
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
var SupportTicketApprovalBadge_default = _sfc_main$2;
|
|
279
|
+
|
|
280
|
+
//#endregion
|
|
281
|
+
//#region src/slices/support_ticket/utils/formatTicketDate.ts
|
|
282
|
+
/**
|
|
283
|
+
* Takes an ISO date string and returns:
|
|
284
|
+
* - formatted: "Jan 15, 2025"
|
|
285
|
+
* - relative: "3 days ago" / "2 hours ago" / "just now"
|
|
286
|
+
* - localTime: "2:30 PM" (user's local time)
|
|
287
|
+
*/
|
|
288
|
+
function formatTicketDate(isoString) {
|
|
289
|
+
const date = new Date(isoString);
|
|
290
|
+
if (isNaN(date.getTime())) return {
|
|
291
|
+
formatted: isoString,
|
|
292
|
+
relative: "",
|
|
293
|
+
localTime: ""
|
|
294
|
+
};
|
|
295
|
+
const formatted = date.toLocaleDateString(void 0, {
|
|
296
|
+
year: "numeric",
|
|
297
|
+
month: "short",
|
|
298
|
+
day: "numeric"
|
|
299
|
+
});
|
|
300
|
+
const localTime = date.toLocaleTimeString(void 0, {
|
|
301
|
+
hour: "numeric",
|
|
302
|
+
minute: "2-digit"
|
|
303
|
+
});
|
|
304
|
+
const diffMs = (/* @__PURE__ */ new Date()).getTime() - date.getTime();
|
|
305
|
+
const diffSec = Math.floor(diffMs / 1e3);
|
|
306
|
+
const diffMin = Math.floor(diffSec / 60);
|
|
307
|
+
const diffHour = Math.floor(diffMin / 60);
|
|
308
|
+
const diffDay = Math.floor(diffHour / 24);
|
|
309
|
+
let relative;
|
|
310
|
+
if (Math.abs(diffSec) < 60) relative = "just now";
|
|
311
|
+
else if (diffSec < 0) {
|
|
312
|
+
const sec = Math.abs(diffSec);
|
|
313
|
+
const min = Math.floor(sec / 60);
|
|
314
|
+
const hr = Math.floor(min / 60);
|
|
315
|
+
const day = Math.floor(hr / 24);
|
|
316
|
+
if (min < 60) relative = `in ${min} minute${min === 1 ? "" : "s"}`;
|
|
317
|
+
else if (hr < 24) relative = `in ${hr} hour${hr === 1 ? "" : "s"}`;
|
|
318
|
+
else relative = `in ${day} day${day === 1 ? "" : "s"}`;
|
|
319
|
+
} else if (diffMin < 60) relative = diffMin === 1 ? "1 minute ago" : `${diffMin} minutes ago`;
|
|
320
|
+
else if (diffHour < 24) relative = diffHour === 1 ? "1 hour ago" : `${diffHour} hours ago`;
|
|
321
|
+
else if (diffDay < 30) relative = diffDay === 1 ? "1 day ago" : `${diffDay} days ago`;
|
|
322
|
+
else {
|
|
323
|
+
const diffWeeks = Math.floor(diffDay / 7);
|
|
324
|
+
const diffMonths = Math.floor(diffDay / 30);
|
|
325
|
+
if (diffWeeks < 4) relative = diffWeeks === 1 ? "1 week ago" : `${diffWeeks} weeks ago`;
|
|
326
|
+
else if (diffMonths < 12) relative = diffMonths === 1 ? "1 month ago" : `${diffMonths} months ago`;
|
|
327
|
+
else {
|
|
328
|
+
const diffYears = Math.floor(diffMonths / 12);
|
|
329
|
+
relative = diffYears === 1 ? "1 year ago" : `${diffYears} years ago`;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
formatted,
|
|
334
|
+
relative,
|
|
335
|
+
localTime
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
//#endregion
|
|
340
|
+
//#region src/slices/support_ticket/shared/TimelineItem.vue
|
|
341
|
+
const _hoisted_1$1 = { class: "flex items-center gap-2 mb-3 flex-wrap" };
|
|
342
|
+
const _hoisted_2$1 = {
|
|
343
|
+
key: 0,
|
|
344
|
+
class: "badge badge-warning badge-sm gap-1 shrink-0",
|
|
345
|
+
"aria-label": "Internal note"
|
|
346
|
+
};
|
|
347
|
+
const _hoisted_3$1 = {
|
|
348
|
+
key: 1,
|
|
349
|
+
class: "w-6 h-6 rounded-full bg-primary text-primary-content text-xs flex items-center justify-center shrink-0",
|
|
350
|
+
"aria-hidden": "true"
|
|
351
|
+
};
|
|
352
|
+
const _hoisted_4$1 = { class: "font-semibold text-sm" };
|
|
353
|
+
const _hoisted_5$1 = { class: "text-base-content/50 text-sm" };
|
|
354
|
+
const _hoisted_6$1 = { class: "text-sm text-base-content break-words whitespace-pre-wrap" };
|
|
355
|
+
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
356
|
+
__name: "TimelineItem",
|
|
357
|
+
props: {
|
|
358
|
+
authorName: {},
|
|
359
|
+
createdAt: {},
|
|
360
|
+
variant: {}
|
|
361
|
+
},
|
|
362
|
+
setup(__props) {
|
|
363
|
+
const props = __props;
|
|
364
|
+
const authorInitial = computed(() => {
|
|
365
|
+
return (props.authorName?.trim() || "?").charAt(0).toUpperCase();
|
|
366
|
+
});
|
|
367
|
+
const relativeTime = computed(() => {
|
|
368
|
+
return props.createdAt ? formatTicketDate(props.createdAt).relative : "";
|
|
369
|
+
});
|
|
370
|
+
return (_ctx, _cache) => {
|
|
371
|
+
return openBlock(), createElementBlock("div", { class: normalizeClass(["card card-bordered p-4 w-full", __props.variant === "internal" ? "bg-warning/10 border-warning/30" : "bg-base-100"]) }, [createElementVNode("div", _hoisted_1$1, [
|
|
372
|
+
__props.variant === "internal" ? (openBlock(), createElementBlock("span", _hoisted_2$1, [..._cache[0] || (_cache[0] = [createElementVNode("svg", {
|
|
373
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
374
|
+
fill: "none",
|
|
375
|
+
viewBox: "0 0 24 24",
|
|
376
|
+
"stroke-width": "1.5",
|
|
377
|
+
stroke: "currentColor",
|
|
378
|
+
class: "w-3.5 h-3.5"
|
|
379
|
+
}, [createElementVNode("path", {
|
|
380
|
+
"stroke-linecap": "round",
|
|
381
|
+
"stroke-linejoin": "round",
|
|
382
|
+
d: "M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z"
|
|
383
|
+
})], -1), createTextVNode(" Internal ", -1)])])) : (openBlock(), createElementBlock("span", _hoisted_3$1, toDisplayString(authorInitial.value), 1)),
|
|
384
|
+
createElementVNode("span", _hoisted_4$1, toDisplayString(__props.authorName), 1),
|
|
385
|
+
createElementVNode("span", _hoisted_5$1, "· " + toDisplayString(relativeTime.value), 1)
|
|
386
|
+
]), createElementVNode("div", _hoisted_6$1, [renderSlot(_ctx.$slots, "default")])], 2);
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
var TimelineItem_default = _sfc_main$1;
|
|
391
|
+
|
|
392
|
+
//#endregion
|
|
393
|
+
//#region src/slices/support_ticket/shared/TimelineSystemEvent.vue
|
|
394
|
+
const _hoisted_1 = { class: "py-2 flex items-start gap-2 text-sm" };
|
|
395
|
+
const _hoisted_2 = { class: "flex-1 min-w-0 space-y-0.5" };
|
|
396
|
+
const _hoisted_3 = { class: "flex flex-wrap items-baseline gap-x-2 gap-y-1" };
|
|
397
|
+
const _hoisted_4 = { class: "text-base-content/60 font-medium" };
|
|
398
|
+
const _hoisted_5 = { class: "font-semibold text-base-content" };
|
|
399
|
+
const _hoisted_6 = { class: "badge badge-sm badge-outline border-base-content/20 text-base-content/80 font-normal px-1.5 py-0 capitalize" };
|
|
400
|
+
const _hoisted_7 = { class: "text-base-content/70" };
|
|
401
|
+
const _hoisted_8 = { class: "text-base-content/70" };
|
|
402
|
+
const _hoisted_9 = { class: "line-through text-base-content/50" };
|
|
403
|
+
const _hoisted_10 = {
|
|
404
|
+
key: 0,
|
|
405
|
+
class: "mt-1.5 ml-6 list-disc list-inside text-base-content/70 text-sm space-y-0.5"
|
|
406
|
+
};
|
|
407
|
+
const _hoisted_11 = { class: "italic text-base-content/60" };
|
|
408
|
+
const _hoisted_12 = { class: "line-through text-base-content/50 ml-1" };
|
|
409
|
+
const _hoisted_13 = {
|
|
410
|
+
key: 1,
|
|
411
|
+
class: "ml-1"
|
|
412
|
+
};
|
|
413
|
+
const _hoisted_14 = { class: "text-base-content/40 text-xs" };
|
|
414
|
+
const _hoisted_15 = ["title"];
|
|
415
|
+
const RECENT_THRESHOLD_HOURS = 18;
|
|
416
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
417
|
+
__name: "TimelineSystemEvent",
|
|
418
|
+
props: {
|
|
419
|
+
author: {},
|
|
420
|
+
message: {},
|
|
421
|
+
timestamp: {},
|
|
422
|
+
action: {},
|
|
423
|
+
type: {},
|
|
424
|
+
details: {},
|
|
425
|
+
oldValue: {},
|
|
426
|
+
newValue: {},
|
|
427
|
+
changes: {}
|
|
428
|
+
},
|
|
429
|
+
setup(__props) {
|
|
430
|
+
const props = __props;
|
|
431
|
+
const showFull = ref(false);
|
|
432
|
+
const displayAction = computed(() => props.action ?? props.message);
|
|
433
|
+
const displayDetails = computed(() => {
|
|
434
|
+
if (props.details) return props.details;
|
|
435
|
+
if (props.oldValue != null && props.newValue != null) return `${props.oldValue} → ${props.newValue}`;
|
|
436
|
+
return props.newValue ?? null;
|
|
437
|
+
});
|
|
438
|
+
const hasChangeDetails = computed(() => props.oldValue != null && props.newValue != null || props.details != null || props.newValue != null);
|
|
439
|
+
const detailsPrefix = computed(() => {
|
|
440
|
+
if (!props.details || props.oldValue == null && props.newValue == null) return null;
|
|
441
|
+
if (props.details.includes(" · ")) {
|
|
442
|
+
const parts = props.details.split(" · ");
|
|
443
|
+
return parts.length > 1 ? parts[0] : null;
|
|
444
|
+
}
|
|
445
|
+
return props.details;
|
|
446
|
+
});
|
|
447
|
+
/** Use relative time when within ~18 hours, otherwise full date and time */
|
|
448
|
+
const shortTime = computed(() => {
|
|
449
|
+
if (!props.timestamp) return "";
|
|
450
|
+
const { relative, formatted, localTime } = formatTicketDate(props.timestamp);
|
|
451
|
+
const dateTime = [formatted, localTime].filter(Boolean).join(", ");
|
|
452
|
+
if (!relative && !dateTime) return "";
|
|
453
|
+
const date = new Date(props.timestamp);
|
|
454
|
+
const hoursAgo = (Date.now() - date.getTime()) / (1e3 * 60 * 60);
|
|
455
|
+
return hoursAgo >= 0 && hoursAgo < RECENT_THRESHOLD_HOURS ? relative : dateTime;
|
|
456
|
+
});
|
|
457
|
+
const fullDateTime = computed(() => {
|
|
458
|
+
if (!props.timestamp) return "";
|
|
459
|
+
const { formatted, localTime } = formatTicketDate(props.timestamp);
|
|
460
|
+
return [formatted, localTime].filter(Boolean).join(", ");
|
|
461
|
+
});
|
|
462
|
+
const displayTime = computed(() => showFull.value ? fullDateTime.value : shortTime.value);
|
|
463
|
+
return (_ctx, _cache) => {
|
|
464
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [_cache[7] || (_cache[7] = createElementVNode("svg", {
|
|
465
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
466
|
+
fill: "none",
|
|
467
|
+
viewBox: "0 0 24 24",
|
|
468
|
+
"stroke-width": "1.5",
|
|
469
|
+
stroke: "currentColor",
|
|
470
|
+
class: "w-4 h-4 text-base-content/30 shrink-0 mt-0.5",
|
|
471
|
+
"aria-hidden": "true"
|
|
472
|
+
}, [createElementVNode("path", {
|
|
473
|
+
"stroke-linecap": "round",
|
|
474
|
+
"stroke-linejoin": "round",
|
|
475
|
+
d: "M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124a6.57 6.57 0 01.22-.128c.332-.183.582-.495.644-.869l.214-1.281z"
|
|
476
|
+
}), createElementVNode("path", {
|
|
477
|
+
"stroke-linecap": "round",
|
|
478
|
+
"stroke-linejoin": "round",
|
|
479
|
+
d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
|
|
480
|
+
})], -1)), createElementVNode("div", _hoisted_2, [
|
|
481
|
+
createElementVNode("div", _hoisted_3, [
|
|
482
|
+
createElementVNode("span", _hoisted_4, toDisplayString(__props.author), 1),
|
|
483
|
+
_cache[5] || (_cache[5] = createElementVNode("span", {
|
|
484
|
+
class: "text-base-content/40 text-xs",
|
|
485
|
+
"aria-hidden": "true"
|
|
486
|
+
}, "·", -1)),
|
|
487
|
+
createElementVNode("span", _hoisted_5, toDisplayString(displayAction.value), 1),
|
|
488
|
+
__props.type ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [_cache[1] || (_cache[1] = createElementVNode("span", {
|
|
489
|
+
class: "text-base-content/40 text-xs",
|
|
490
|
+
"aria-hidden": "true"
|
|
491
|
+
}, "·", -1)), createElementVNode("span", _hoisted_6, toDisplayString(__props.type), 1)], 64)) : createCommentVNode("v-if", true),
|
|
492
|
+
__props.changes && __props.changes.length > 1 ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [__props.details ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [_cache[2] || (_cache[2] = createElementVNode("span", {
|
|
493
|
+
class: "text-base-content/40 text-xs",
|
|
494
|
+
"aria-hidden": "true"
|
|
495
|
+
}, "·", -1)), createElementVNode("span", _hoisted_7, toDisplayString(__props.details), 1)], 64)) : createCommentVNode("v-if", true)], 64)) : hasChangeDetails.value ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [_cache[4] || (_cache[4] = createElementVNode("span", {
|
|
496
|
+
class: "text-base-content/40 text-xs",
|
|
497
|
+
"aria-hidden": "true"
|
|
498
|
+
}, "·", -1)), createElementVNode("span", _hoisted_8, [detailsPrefix.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(toDisplayString(detailsPrefix.value), 1)], 64)) : createCommentVNode("v-if", true), __props.oldValue != null && __props.newValue != null ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
499
|
+
createElementVNode("span", _hoisted_9, toDisplayString(__props.oldValue), 1),
|
|
500
|
+
_cache[3] || (_cache[3] = createElementVNode("span", { class: "mx-1 text-base-content/40" }, "→", -1)),
|
|
501
|
+
createElementVNode("span", null, toDisplayString(__props.newValue), 1)
|
|
502
|
+
], 64)) : displayDetails.value ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [createTextVNode(toDisplayString(displayDetails.value), 1)], 64)) : createCommentVNode("v-if", true)])], 64)) : createCommentVNode("v-if", true)
|
|
503
|
+
]),
|
|
504
|
+
__props.changes && __props.changes.length > 1 ? (openBlock(), createElementBlock("ul", _hoisted_10, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.changes, (change, i) => {
|
|
505
|
+
return openBlock(), createElementBlock("li", { key: i }, [createElementVNode("span", _hoisted_11, toDisplayString(change.action) + ":", 1), change.oldValue != null && change.newValue != null ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
|
506
|
+
createElementVNode("span", _hoisted_12, toDisplayString(change.oldValue), 1),
|
|
507
|
+
_cache[6] || (_cache[6] = createElementVNode("span", { class: "mx-1 text-base-content/40" }, "→", -1)),
|
|
508
|
+
createElementVNode("span", null, toDisplayString(change.newValue), 1)
|
|
509
|
+
], 64)) : change.newValue != null ? (openBlock(), createElementBlock("span", _hoisted_13, toDisplayString(change.newValue), 1)) : createCommentVNode("v-if", true)]);
|
|
510
|
+
}), 128))])) : createCommentVNode("v-if", true),
|
|
511
|
+
createElementVNode("div", _hoisted_14, [createElementVNode("button", {
|
|
512
|
+
type: "button",
|
|
513
|
+
class: "cursor-pointer hover:text-base-content/60 hover:underline focus:outline-none focus:underline",
|
|
514
|
+
title: fullDateTime.value,
|
|
515
|
+
onClick: _cache[0] || (_cache[0] = ($event) => showFull.value = !showFull.value)
|
|
516
|
+
}, toDisplayString(displayTime.value), 9, _hoisted_15)])
|
|
517
|
+
])]);
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
var TimelineSystemEvent_default = _sfc_main;
|
|
522
|
+
|
|
523
|
+
//#endregion
|
|
524
|
+
export { SupportTicketTypeBadge_default as a, formatStaffCreditValue as c, SupportTicketApprovalBadge_default as i, TimelineItem_default as n, SupportTicketPriorityBadge_default as o, formatTicketDate as r, formatCustomerCreditValue as s, TimelineSystemEvent_default as t };
|
|
525
|
+
//# sourceMappingURL=TimelineSystemEvent-zCMUx5Zz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimelineSystemEvent-zCMUx5Zz.js","names":["priorityConfig: Record<SupportTicketPriority, PriorityBadgeConfig>","typeConfig: Record<SupportTicketType, TypeBadgeConfig>","approvalConfig: Record<SupportTicketApproval, ApprovalBadgeConfig>","relative: string"],"sources":["../src/slices/support_ticket/utils/creditValueFormatter.ts","../src/slices/support_ticket/shared/SupportTicketPriorityBadge.vue","../src/slices/support_ticket/shared/SupportTicketTypeBadge.vue","../src/slices/support_ticket/shared/SupportTicketApprovalBadge.vue","../src/slices/support_ticket/utils/formatTicketDate.ts","../src/slices/support_ticket/shared/TimelineItem.vue","../src/slices/support_ticket/shared/TimelineSystemEvent.vue"],"sourcesContent":["import type { SupportTicketApproval } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Helper function to check if credit value is empty\n */\nfunction isCreditValueEmpty(value: string | null | undefined): boolean {\n return value === null || value === undefined || value.trim() === '';\n}\n\n/**\n * Core credit formatting logic\n */\nfunction formatCreditValueCore(creditValue: string | null | undefined): string {\n // Use same logic as backend formatter\n if (isCreditValueEmpty(creditValue)) {\n return 'TBD';\n }\n\n const trimmed = creditValue!.trim();\n const num = parseFloat(trimmed);\n\n // Explicit zero is valid - preserve it (same as backend)\n if (num === 0) {\n return '0';\n }\n\n // Remove trailing zeros for non-zero values (same as backend)\n // Examples: \"100.00\" -> \"100\", \"9.50\" -> \"9.5\", \"123.45\" -> \"123.45\"\n return trimmed.replace(/\\.?0+$/, '');\n}\n\n/**\n * Formats credit value for staff views (includes internal ticket logic)\n *\n * @param creditValue - The credit value from the database\n * @param approvalStatus - The approval status to determine display logic\n * @returns Formatted string for display\n *\n * @example\n * formatStaffCreditValue(\"5.50\", \"PENDING\") // \"5.5\"\n * formatStaffCreditValue(\"10\", \"INTERNAL\") // \"N/A\"\n */\nexport function formatStaffCreditValue(\n creditValue: string | null | undefined,\n approvalStatus?: SupportTicketApproval,\n): string {\n // Internal tickets don't use credits\n if (approvalStatus === 'INTERNAL') {\n return 'N/A';\n }\n\n return formatCreditValueCore(creditValue);\n}\n\n/**\n * Formats credit value for customer views (status-based logic)\n *\n * @param creditValue - The credit value from the database\n * @param status - The computed status from the customer query\n * @returns Formatted string for display\n *\n * @example\n * formatCustomerCreditValue(\"5.50\", \"PENDING\") // \"5.5\"\n * formatCustomerCreditValue(\"5.50\", \"FOLLOWUP\") // \"5.5\"\n */\nexport function formatCustomerCreditValue(creditValue: string | null | undefined): string {\n // Note: Internal tickets (status would be different) are handled by backend\n // Customers don't see internal tickets, so we don't need to check for INTERNAL here\n return formatCreditValueCore(creditValue);\n}\n","<template>\n <div :class=\"badgeClasses\" :aria-label=\"ariaLabel\" role=\"status\">\n {{ displayText }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * SupportTicketPriorityBadge - A reusable Vue component for displaying support ticket priority\n * as color-coded badges with consistent DaisyUI styling and accessibility features.\n *\n * @example\n * <SupportTicketPriorityBadge :priority=\"'HIGH'\" size=\"md\" />\n * <SupportTicketPriorityBadge :priority=\"'CRITICAL'\" size=\"sm\" variant=\"outline\" />\n */\nimport type { SupportTicketPriority } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\n\n/**\n * Props for the SupportTicketPriorityBadge component\n */\ninterface Props {\n /** The support ticket priority to display */\n priority: SupportTicketPriority;\n /** Size of the badge - defaults to 'md' */\n size?: 'sm' | 'md' | 'lg';\n /** Visual variant of the badge - defaults to 'default' */\n variant?: 'default' | 'outline';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n variant: 'default',\n});\n\n/**\n * Configuration for each priority badge\n */\ninterface PriorityBadgeConfig {\n /** DaisyUI badge color class */\n color: string;\n /** Display text for the badge */\n text: string;\n /** Accessibility label for screen readers */\n ariaLabel: string;\n}\n\nconst priorityConfig: Record<SupportTicketPriority, PriorityBadgeConfig> = {\n LOW: {\n color: 'badge-neutral',\n text: 'Low',\n ariaLabel: 'Priority: Low priority',\n },\n MEDIUM: {\n color: 'badge-neutral',\n text: 'Medium',\n ariaLabel: 'Priority: Medium priority',\n },\n HIGH: {\n color: 'badge-neutral',\n text: 'High',\n ariaLabel: 'Priority: High priority',\n },\n CRITICAL: {\n color: 'badge-neutral',\n text: 'Critical',\n ariaLabel: 'Priority: Critical priority',\n },\n};\n\nconst getPriorityConfig = (priority: SupportTicketPriority): PriorityBadgeConfig => {\n const config = priorityConfig[priority];\n if (!config) {\n return {\n color: 'badge-neutral',\n text: priority || 'Unknown',\n ariaLabel: `Priority: ${priority || 'Unknown priority'}`,\n };\n }\n return config;\n};\n\nconst config = computed(() => getPriorityConfig(props.priority));\n\nconst badgeClasses = computed(() => {\n const baseClasses = ['badge', 'text-xs'];\n\n // Add color class\n baseClasses.push(config.value.color);\n\n // Add size class with responsive text sizing\n if (props.size === 'sm') {\n baseClasses.push('badge-sm', 'text-xs');\n } else if (props.size === 'lg') {\n baseClasses.push('badge-lg', 'text-sm');\n } else {\n // md size - responsive text\n baseClasses.push('text-xs', 'sm:text-sm');\n }\n\n // Add variant class\n if (props.variant === 'outline') {\n baseClasses.push('badge-outline');\n }\n\n return baseClasses.join(' ');\n});\n\nconst displayText = computed(() => config.value.text);\nconst ariaLabel = computed(() => config.value.ariaLabel);\n</script>\n","<template>\n <div :class=\"badgeClasses\" :aria-label=\"ariaLabel\" role=\"status\">\n {{ displayText }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * SupportTicketTypeBadge - A reusable Vue component for displaying support ticket type\n * as color-coded badges with consistent DaisyUI styling and accessibility features.\n *\n * @example\n * <SupportTicketTypeBadge :type=\"'BUG'\" size=\"md\" />\n * <SupportTicketTypeBadge :type=\"'FEATURE_REQUEST'\" size=\"sm\" variant=\"outline\" />\n */\nimport type { SupportTicketType } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\n\n/**\n * Props for the SupportTicketTypeBadge component\n */\ninterface Props {\n /** The support ticket type to display */\n type: SupportTicketType;\n /** Size of the badge - defaults to 'md' */\n size?: 'sm' | 'md' | 'lg';\n /** Visual variant of the badge - defaults to 'default' */\n variant?: 'default' | 'outline';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n variant: 'default',\n});\n\n/**\n * Configuration for each type badge\n */\ninterface TypeBadgeConfig {\n /** DaisyUI badge color class */\n color: string;\n /** Display text for the badge */\n text: string;\n /** Accessibility label for screen readers */\n ariaLabel: string;\n}\n\nconst typeConfig: Record<SupportTicketType, TypeBadgeConfig> = {\n BUG: {\n color: 'badge-neutral',\n text: 'Bug',\n ariaLabel: 'Type: Bug report requiring fix',\n },\n FEATURE_REQUEST: {\n color: 'badge-neutral',\n text: 'Feature',\n ariaLabel: 'Type: New feature request',\n },\n IMPROVEMENT: {\n color: 'badge-neutral',\n text: 'Improvement',\n ariaLabel: 'Type: Enhancement to existing feature',\n },\n OPERATIONAL: {\n color: 'badge-neutral',\n text: 'Ops',\n ariaLabel: 'Type: Operational/admin work',\n },\n};\n\nconst getTypeConfig = (type: SupportTicketType): TypeBadgeConfig => {\n const config = typeConfig[type];\n if (!config) {\n return {\n color: 'badge-neutral',\n text: type || 'Unknown',\n ariaLabel: `Type: ${type || 'Unknown type'}`,\n };\n }\n return config;\n};\n\nconst config = computed(() => getTypeConfig(props.type));\n\nconst badgeClasses = computed(() => {\n const baseClasses = ['badge', 'text-xs'];\n\n // Add color class\n baseClasses.push(config.value.color);\n\n // Add size class with responsive text sizing\n if (props.size === 'sm') {\n baseClasses.push('badge-sm', 'text-xs');\n } else if (props.size === 'lg') {\n baseClasses.push('badge-lg', 'text-sm');\n } else {\n // md size - responsive text\n baseClasses.push('text-xs', 'sm:text-sm');\n }\n\n // Add variant class\n if (props.variant === 'outline') {\n baseClasses.push('badge-outline');\n }\n\n return baseClasses.join(' ');\n});\n\nconst displayText = computed(() => config.value.text);\nconst ariaLabel = computed(() => config.value.ariaLabel);\n</script>\n","<template>\n <div :class=\"badgeClasses\" :aria-label=\"ariaLabel\" role=\"status\">\n {{ displayText }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * SupportTicketApprovalBadge - A reusable Vue component for displaying support ticket approval status\n * as color-coded badges with consistent DaisyUI styling and accessibility features.\n *\n * @example\n * <SupportTicketApprovalBadge :approvalStatus=\"'PENDING'\" size=\"md\" />\n * <SupportTicketApprovalBadge :approvalStatus=\"'APPROVED'\" size=\"sm\" variant=\"outline\" />\n */\nimport type { SupportTicketApproval } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\n\n/**\n * Props for the SupportTicketApprovalBadge component\n */\ninterface Props {\n /** The support ticket approval status to display */\n approvalStatus: SupportTicketApproval;\n /** Size of the badge - defaults to 'md' */\n size?: 'sm' | 'md' | 'lg';\n /** Visual variant of the badge - defaults to 'default' */\n variant?: 'default' | 'outline';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n variant: 'default',\n});\n\n/**\n * Configuration for each approval status badge\n */\ninterface ApprovalBadgeConfig {\n /** DaisyUI badge color class */\n color: string;\n /** Display text for the badge */\n text: string;\n /** Accessibility label for screen readers */\n ariaLabel: string;\n}\n\nconst approvalConfig: Record<SupportTicketApproval, ApprovalBadgeConfig> = {\n PENDING: {\n color: 'badge-warning',\n text: 'Pending',\n ariaLabel: 'Approval: Awaiting staff decision',\n },\n APPROVED: {\n color: 'badge-success',\n text: 'Approved',\n ariaLabel: 'Approval: Approved by staff',\n },\n REJECTED: {\n color: 'badge-error',\n text: 'Rejected',\n ariaLabel: 'Approval: Rejected by staff',\n },\n INTERNAL: {\n color: 'badge-info',\n text: 'Internal',\n ariaLabel: 'Approval: Internal staff ticket',\n },\n};\n\nconst getApprovalConfig = (approvalStatus: SupportTicketApproval): ApprovalBadgeConfig => {\n const config = approvalConfig[approvalStatus];\n if (!config) {\n return {\n color: 'badge-neutral',\n text: approvalStatus || 'Unknown',\n ariaLabel: `Approval: ${approvalStatus || 'Unknown status'}`,\n };\n }\n return config;\n};\n\nconst config = computed(() => getApprovalConfig(props.approvalStatus));\n\nconst badgeClasses = computed(() => {\n const baseClasses = ['badge', 'text-xs'];\n\n // Add color class\n baseClasses.push(config.value.color);\n\n // Add size class with responsive text sizing\n if (props.size === 'sm') {\n baseClasses.push('badge-sm', 'text-xs');\n } else if (props.size === 'lg') {\n baseClasses.push('badge-lg', 'text-sm');\n } else {\n // md size - responsive text\n baseClasses.push('text-xs', 'sm:text-sm');\n }\n\n // Add variant class\n if (props.variant === 'outline') {\n baseClasses.push('badge-outline');\n }\n\n return baseClasses.join(' ');\n});\n\nconst displayText = computed(() => config.value.text);\nconst ariaLabel = computed(() => config.value.ariaLabel);\n</script>\n","/**\n * Takes an ISO date string and returns:\n * - formatted: \"Jan 15, 2025\"\n * - relative: \"3 days ago\" / \"2 hours ago\" / \"just now\"\n * - localTime: \"2:30 PM\" (user's local time)\n */\nexport function formatTicketDate(isoString: string): {\n formatted: string;\n relative: string;\n localTime: string;\n} {\n const date = new Date(isoString);\n if (isNaN(date.getTime())) {\n return { formatted: isoString, relative: '', localTime: '' };\n }\n\n const formatted = date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n\n const localTime = date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n\n let relative: string;\n if (Math.abs(diffSec) < 60) {\n relative = 'just now';\n } else if (diffSec < 0) {\n const sec = Math.abs(diffSec);\n const min = Math.floor(sec / 60);\n const hr = Math.floor(min / 60);\n const day = Math.floor(hr / 24);\n if (min < 60) relative = `in ${min} minute${min === 1 ? '' : 's'}`;\n else if (hr < 24) relative = `in ${hr} hour${hr === 1 ? '' : 's'}`;\n else relative = `in ${day} day${day === 1 ? '' : 's'}`;\n } else if (diffMin < 60) {\n relative = diffMin === 1 ? '1 minute ago' : `${diffMin} minutes ago`;\n } else if (diffHour < 24) {\n relative = diffHour === 1 ? '1 hour ago' : `${diffHour} hours ago`;\n } else if (diffDay < 30) {\n relative = diffDay === 1 ? '1 day ago' : `${diffDay} days ago`;\n } else {\n const diffWeeks = Math.floor(diffDay / 7);\n const diffMonths = Math.floor(diffDay / 30);\n if (diffWeeks < 4) {\n relative = diffWeeks === 1 ? '1 week ago' : `${diffWeeks} weeks ago`;\n } else if (diffMonths < 12) {\n relative = diffMonths === 1 ? '1 month ago' : `${diffMonths} months ago`;\n } else {\n const diffYears = Math.floor(diffMonths / 12);\n relative = diffYears === 1 ? '1 year ago' : `${diffYears} years ago`;\n }\n }\n\n return { formatted, relative, localTime };\n}\n","<template>\n <div\n :class=\"[\n 'card card-bordered p-4 w-full',\n variant === 'internal'\n ? 'bg-warning/10 border-warning/30'\n : 'bg-base-100',\n ]\"\n >\n <div class=\"flex items-center gap-2 mb-3 flex-wrap\">\n <span\n v-if=\"variant === 'internal'\"\n class=\"badge badge-warning badge-sm gap-1 shrink-0\"\n aria-label=\"Internal note\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-3.5 h-3.5\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z\"\n />\n </svg>\n Internal\n </span>\n <span\n v-else\n class=\"w-6 h-6 rounded-full bg-primary text-primary-content text-xs flex items-center justify-center shrink-0\"\n aria-hidden=\"true\"\n >\n {{ authorInitial }}\n </span>\n <span class=\"font-semibold text-sm\">{{ authorName }}</span>\n <span class=\"text-base-content/50 text-sm\">· {{ relativeTime }}</span>\n </div>\n <div class=\"text-sm text-base-content break-words whitespace-pre-wrap\">\n <slot />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { formatTicketDate } from '../utils/formatTicketDate';\n\ninterface Props {\n authorName: string;\n createdAt: string;\n variant: 'customer' | 'internal';\n}\n\nconst props = defineProps<Props>();\n\nconst authorInitial = computed(() => {\n const name = props.authorName?.trim() || '?';\n return name.charAt(0).toUpperCase();\n});\n\nconst relativeTime = computed(() => {\n return props.createdAt ? formatTicketDate(props.createdAt).relative : '';\n});\n</script>\n","<template>\n <div class=\"py-2 flex items-start gap-2 text-sm\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 text-base-content/30 shrink-0 mt-0.5\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124a6.57 6.57 0 01.22-.128c.332-.183.582-.495.644-.869l.214-1.281z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <div class=\"flex-1 min-w-0 space-y-0.5\">\n <div class=\"flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <span class=\"text-base-content/60 font-medium\">{{ author }}</span>\n <span class=\"text-base-content/40 text-xs\" aria-hidden=\"true\">·</span>\n <span class=\"font-semibold text-base-content\">{{ displayAction }}</span>\n <template v-if=\"type\">\n <span class=\"text-base-content/40 text-xs\" aria-hidden=\"true\">·</span>\n <span\n class=\"badge badge-sm badge-outline border-base-content/20 text-base-content/80 font-normal px-1.5 py-0 capitalize\"\n >\n {{ type }}\n </span>\n </template>\n <template v-if=\"changes && changes.length > 1\">\n <template v-if=\"details\">\n <span class=\"text-base-content/40 text-xs\" aria-hidden=\"true\">·</span>\n <span class=\"text-base-content/70\">{{ details }}</span>\n </template>\n </template>\n <template v-else-if=\"hasChangeDetails\">\n <span class=\"text-base-content/40 text-xs\" aria-hidden=\"true\">·</span>\n <span class=\"text-base-content/70\">\n <template v-if=\"detailsPrefix\">{{ detailsPrefix }} </template>\n <template v-if=\"oldValue != null && newValue != null\">\n <span class=\"line-through text-base-content/50\">{{ oldValue }}</span>\n <span class=\"mx-1 text-base-content/40\">→</span>\n <span>{{ newValue }}</span>\n </template>\n <template v-else-if=\"displayDetails\">{{ displayDetails }}</template>\n </span>\n </template>\n </div>\n <ul\n v-if=\"changes && changes.length > 1\"\n class=\"mt-1.5 ml-6 list-disc list-inside text-base-content/70 text-sm space-y-0.5\"\n >\n <li v-for=\"(change, i) in changes\" :key=\"i\">\n <span class=\"italic text-base-content/60\">{{ change.action }}:</span>\n <template v-if=\"change.oldValue != null && change.newValue != null\">\n <span class=\"line-through text-base-content/50 ml-1\">{{ change.oldValue }}</span>\n <span class=\"mx-1 text-base-content/40\">→</span>\n <span>{{ change.newValue }}</span>\n </template>\n <template v-else-if=\"change.newValue != null\">\n <span class=\"ml-1\">{{ change.newValue }}</span>\n </template>\n </li>\n </ul>\n <div class=\"text-base-content/40 text-xs\">\n <button\n type=\"button\"\n class=\"cursor-pointer hover:text-base-content/60 hover:underline focus:outline-none focus:underline\"\n :title=\"fullDateTime\"\n @click=\"showFull = !showFull\"\n >\n {{ displayTime }}\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport { formatTicketDate } from '../utils/formatTicketDate';\n\ninterface SystemEventChange {\n action: string;\n oldValue: string | null;\n newValue: string | null;\n fieldName?: string;\n}\n\ninterface Props {\n author: string;\n message: string;\n timestamp: string;\n action?: string;\n type?: string | null;\n details?: string | null;\n oldValue?: string | null;\n newValue?: string | null;\n changes?: SystemEventChange[];\n}\n\nconst props = defineProps<Props>();\nconst showFull = ref(false);\n\nconst displayAction = computed(() => props.action ?? props.message);\nconst displayDetails = computed(() => {\n if (props.details) return props.details;\n if (props.oldValue != null && props.newValue != null) {\n return `${props.oldValue} → ${props.newValue}`;\n }\n return props.newValue ?? null;\n});\nconst hasChangeDetails = computed(\n () =>\n (props.oldValue != null && props.newValue != null) ||\n props.details != null ||\n props.newValue != null,\n);\nconst detailsPrefix = computed(() => {\n if (!props.details || (props.oldValue == null && props.newValue == null)) return null;\n if (props.details.includes(' · ')) {\n const parts = props.details.split(' · ');\n return parts.length > 1 ? parts[0]! : null;\n }\n return props.details;\n});\n\n/** Use relative time when within ~18 hours, otherwise full date and time */\nconst RECENT_THRESHOLD_HOURS = 18;\n\nconst shortTime = computed(() => {\n if (!props.timestamp) return '';\n const { relative, formatted, localTime } = formatTicketDate(props.timestamp);\n const dateTime = [formatted, localTime].filter(Boolean).join(', ');\n if (!relative && !dateTime) return '';\n const date = new Date(props.timestamp);\n const hoursAgo = (Date.now() - date.getTime()) / (1000 * 60 * 60);\n const isRecent = hoursAgo >= 0 && hoursAgo < RECENT_THRESHOLD_HOURS;\n return isRecent ? relative : dateTime;\n});\n\nconst fullDateTime = computed(() => {\n if (!props.timestamp) return '';\n const { formatted, localTime } = formatTicketDate(props.timestamp);\n return [formatted, localTime].filter(Boolean).join(', ');\n});\n\nconst displayTime = computed(() =>\n showFull.value ? fullDateTime.value : shortTime.value,\n);\n</script>\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { r as executeWithAuth
|
|
2
|
-
import {
|
|
1
|
+
import { r as executeWithAuth } from "./useRpcAuth-CJtq1dqM.js";
|
|
2
|
+
import { r as getRefreshTokenHandler } from "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
|
|
3
|
+
import { t as formatSystemTimestamp } from "./convertToLocalDateTime-BF25N4xd.js";
|
|
3
4
|
import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, resolveComponent, toDisplayString, unref, withCtx } from "vue";
|
|
4
5
|
import { UserReadSchema } from "@dragonmastery/dragoncore-shared";
|
|
5
6
|
import { useCursorDataTable, withMetadata } from "@dragonmastery/zinia-forms-core";
|
|
@@ -150,4 +151,4 @@ var UserListPage_default = _sfc_main;
|
|
|
150
151
|
|
|
151
152
|
//#endregion
|
|
152
153
|
export { userRowSchemaWithMetadata as n, UserTypeBadge_default as r, UserListPage_default as t };
|
|
153
|
-
//# sourceMappingURL=UserListPage-
|
|
154
|
+
//# sourceMappingURL=UserListPage-DtA8tLff.js.map
|