@dragonmastery/dragoncore-vue 0.0.27 → 0.0.28

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.
Files changed (77) hide show
  1. package/dist/{ConsentFlowStep-Dwg2HpnI.js → ConsentFlowStep-DstxorHZ.js} +1 -1
  2. package/dist/{ConsentFlowStep-Dwg2HpnI.js.map → ConsentFlowStep-DstxorHZ.js.map} +1 -1
  3. package/dist/{ConsentRequired-Cp9QGWiV.js → ConsentRequired-ELUidmNv.js} +2 -2
  4. package/dist/{ConsentRequired-Cp9QGWiV.js.map → ConsentRequired-ELUidmNv.js.map} +1 -1
  5. package/dist/{CreateTeamForm-Cy29yHqJ.js → CreateTeamForm-CmVZdqOQ.js} +2 -2
  6. package/dist/{CreateTeamForm-BuplRIXl.js → CreateTeamForm-DRfZ74on.js} +2 -2
  7. package/dist/{CreateTeamForm-BuplRIXl.js.map → CreateTeamForm-DRfZ74on.js.map} +1 -1
  8. package/dist/{CreditBalanceDashboard-DzWc30u_.js → CreditBalanceDashboard-BRY56-9w.js} +2 -2
  9. package/dist/{CreditBalanceDashboard-DzWc30u_.js.map → CreditBalanceDashboard-BRY56-9w.js.map} +1 -1
  10. package/dist/{CreditBalanceDashboard-rN0W4Dxv.js → CreditBalanceDashboard-CwXWREgJ.js} +4 -4
  11. package/dist/{CreditManagement-2dBjtV5Q.js → CreditManagement-BAuzw-NE.js} +4 -4
  12. package/dist/{CreditManagement-Bs4gqN11.js → CreditManagement-D-bsc1US.js} +2 -2
  13. package/dist/{CreditManagement-Bs4gqN11.js.map → CreditManagement-D-bsc1US.js.map} +1 -1
  14. package/dist/{CreditTransactionHistory-D_fy5d3l.js → CreditTransactionHistory-plIaRscn.js} +2 -2
  15. package/dist/{CreditTransactionHistory-D_fy5d3l.js.map → CreditTransactionHistory-plIaRscn.js.map} +1 -1
  16. package/dist/{CustomerCreateSupportTicketForm-e8cIzSS6.js → CustomerCreateSupportTicketForm-Co6C_P5o.js} +2 -2
  17. package/dist/{CustomerCreateSupportTicketForm-e8cIzSS6.js.map → CustomerCreateSupportTicketForm-Co6C_P5o.js.map} +1 -1
  18. package/dist/{CustomerCreateSupportTicketForm-B9bxGTOX.js → CustomerCreateSupportTicketForm-D72blvMU.js} +3 -3
  19. package/dist/{CustomerSupportTicketDetailPage-CI0UmP2U.js → CustomerSupportTicketDetailPage-CUkf9swo.js} +2 -2
  20. package/dist/{CustomerSupportTicketDetailPage-CI0UmP2U.js.map → CustomerSupportTicketDetailPage-CUkf9swo.js.map} +1 -1
  21. package/dist/{CustomerSupportTicketList-CJIV2v6_.js → CustomerSupportTicketList-CB_Y1lVj.js} +18 -18
  22. package/dist/{CustomerSupportTicketSuccess-iLsr2cWy.js → CustomerSupportTicketSuccess-B87Zth-g.js} +3 -3
  23. package/dist/{CustomerSupportTicketSuccess-B5E7Mr0R.js → CustomerSupportTicketSuccess-DVqoR5-o.js} +2 -2
  24. package/dist/{CustomerSupportTicketSuccess-B5E7Mr0R.js.map → CustomerSupportTicketSuccess-DVqoR5-o.js.map} +1 -1
  25. package/dist/DefaultReferralTeamPage-BHail7YF.js +207 -0
  26. package/dist/DefaultReferralTeamPage-BHail7YF.js.map +1 -0
  27. package/dist/{EditTeamForm-BbSQ8cdm.js → EditTeamForm-BEOkUaKG.js} +2 -2
  28. package/dist/{EditTeamForm-BbSQ8cdm.js.map → EditTeamForm-BEOkUaKG.js.map} +1 -1
  29. package/dist/{EditTeamForm-BJBTHghU.js → EditTeamForm-DhutyI9c.js} +2 -2
  30. package/dist/{SavedFiltersPage-BViMOhvn.js → SavedFiltersPage-CvBKztlD.js} +19 -19
  31. package/dist/{SavedFiltersPage-BViMOhvn.js.map → SavedFiltersPage-CvBKztlD.js.map} +1 -1
  32. package/dist/{SignupConsentFlow-Dd3QAkVF.js → SignupConsentFlow-clxBjJlU.js} +2 -2
  33. package/dist/{SignupConsentFlow-Dd3QAkVF.js.map → SignupConsentFlow-clxBjJlU.js.map} +1 -1
  34. package/dist/{SignupRequirementsPage-DUQ63ZuW.js → SignupRequirementsPage-CohJluxQ.js} +1 -1
  35. package/dist/{SignupRequirementsPage-DUQ63ZuW.js.map → SignupRequirementsPage-CohJluxQ.js.map} +1 -1
  36. package/dist/{StaffCreateSupportTicketForm-C-UWBdA6.js → StaffCreateSupportTicketForm-Cm595v_4.js} +2 -2
  37. package/dist/{StaffCreateSupportTicketForm-C-UWBdA6.js.map → StaffCreateSupportTicketForm-Cm595v_4.js.map} +1 -1
  38. package/dist/{StaffCreateSupportTicketForm-BmqqHlqp.js → StaffCreateSupportTicketForm-DBhhJyXE.js} +3 -3
  39. package/dist/{StaffSupportTicketDetailPage--idGVu5P.js → StaffSupportTicketDetailPage-B63QXyum.js} +2 -2
  40. package/dist/{StaffSupportTicketDetailPage--idGVu5P.js.map → StaffSupportTicketDetailPage-B63QXyum.js.map} +1 -1
  41. package/dist/{StaffSupportTicketList-90I_ljzX.js → StaffSupportTicketList-2TbMweMK.js} +18 -18
  42. package/dist/{StaffSupportTicketSuccess-CW1yJhtp.js → StaffSupportTicketSuccess-DKzJs74k.js} +3 -3
  43. package/dist/{StaffSupportTicketSuccess-TEtJGyaZ.js → StaffSupportTicketSuccess-DgULDGIj.js} +2 -2
  44. package/dist/{StaffSupportTicketSuccess-TEtJGyaZ.js.map → StaffSupportTicketSuccess-DgULDGIj.js.map} +1 -1
  45. package/dist/{SupportStaffPage-c2ouJwJk.js → SupportStaffPage-CkFLlle4.js} +1 -1
  46. package/dist/{SupportStaffPage-c2ouJwJk.js.map → SupportStaffPage-CkFLlle4.js.map} +1 -1
  47. package/dist/{SupportTicketMaintenancePage-B07avInx.js → SupportTicketMaintenancePage-CEKi8xQB.js} +1 -1
  48. package/dist/{SupportTicketMaintenancePage-B07avInx.js.map → SupportTicketMaintenancePage-CEKi8xQB.js.map} +1 -1
  49. package/dist/{TeamAttachmentsTab-BgnU0y6j.js → TeamAttachmentsTab-D0SJplvU.js} +18 -18
  50. package/dist/{TeamList-Y5FzwNeV.js → TeamList-DU6CFPUY.js} +2 -2
  51. package/dist/{TeamList-ggZEivO2.js → TeamList-gppM0GOD.js} +2 -2
  52. package/dist/{TeamList-ggZEivO2.js.map → TeamList-gppM0GOD.js.map} +1 -1
  53. package/dist/{TeamParent-C1pHDWY1.js → TeamParent-CuASTHKr.js} +2 -2
  54. package/dist/{TeamParent-CObyDkrL.js → TeamParent-YPtenk3l.js} +2 -2
  55. package/dist/{TeamParent-CObyDkrL.js.map → TeamParent-YPtenk3l.js.map} +1 -1
  56. package/dist/{TimelineNoteInput--q4ENAgu.js → TimelineNoteInput-DXZhcUkH.js} +1 -1
  57. package/dist/{TimelineNoteInput--q4ENAgu.js.map → TimelineNoteInput-DXZhcUkH.js.map} +1 -1
  58. package/dist/{VerifyEmail-DdUKxJnk.js → VerifyEmail-CLDngljq.js} +1 -1
  59. package/dist/{VerifyEmail-CEbvnWLl.js → VerifyEmail-CWUhRA1o.js} +9 -4
  60. package/dist/VerifyEmail-CWUhRA1o.js.map +1 -0
  61. package/dist/{ViewTeam-Dj0JSLzE.js → ViewTeam-Bvvfik4P.js} +2 -2
  62. package/dist/{ViewTeam-RXno7OPV.js → ViewTeam-CRmIplCt.js} +2 -2
  63. package/dist/{ViewTeam-RXno7OPV.js.map → ViewTeam-CRmIplCt.js.map} +1 -1
  64. package/dist/{customerSupportTicketRoutes-Cmva-eXn.js → customerSupportTicketRoutes-Cy4fp4wx.js} +6 -6
  65. package/dist/{customerSupportTicketRoutes-Cmva-eXn.js.map → customerSupportTicketRoutes-Cy4fp4wx.js.map} +1 -1
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.js +18 -18
  68. package/dist/{saved_filter-C1pXMOJZ.js → saved_filter-jeZd2rlb.js} +2 -2
  69. package/dist/{saved_filter-C1pXMOJZ.js.map → saved_filter-jeZd2rlb.js.map} +1 -1
  70. package/dist/{src-qjXj41gp.js → src-zjaOyP9b.js} +29 -11
  71. package/dist/{src-qjXj41gp.js.map → src-zjaOyP9b.js.map} +1 -1
  72. package/dist/{staffSupportTicketRoutes-BUa3oCVP.js → staffSupportTicketRoutes-L4CU5dcu.js} +6 -6
  73. package/dist/{staffSupportTicketRoutes-BUa3oCVP.js.map → staffSupportTicketRoutes-L4CU5dcu.js.map} +1 -1
  74. package/dist/{teamRoutes-DxVWQDWU.js → teamRoutes-CtNcFZjR.js} +7 -7
  75. package/dist/{teamRoutes-DxVWQDWU.js.map → teamRoutes-CtNcFZjR.js.map} +1 -1
  76. package/package.json +2 -2
  77. package/dist/VerifyEmail-CEbvnWLl.js.map +0 -1
@@ -3,9 +3,9 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import "./useMutation-BLNuJoYl.js";
5
5
  import "./useQuery-BzUGEOj0.js";
6
- import { p as StaffSupportTicketList_default } from "./src-qjXj41gp.js";
6
+ import { p as StaffSupportTicketList_default } from "./src-zjaOyP9b.js";
7
7
  import "./AppLink-FcNGKgvG.js";
8
- import "./saved_filter-C1pXMOJZ.js";
8
+ import "./saved_filter-jeZd2rlb.js";
9
9
  import "./ConfirmDialog-DjthOYU6.js";
10
10
  import "./InlineAttachments-DAn_QknY.js";
11
11
  import "./TeamMembersTab-BigqpBDH.js";
@@ -20,30 +20,30 @@ import "./UserProfilePage-FNLYK9kj.js";
20
20
  import "./ChangePasswordPage-nr0B06HB.js";
21
21
  import "./teamMetadata-26Mwjb2i.js";
22
22
  import "./team_memberRoutes-Cxgte_vj.js";
23
- import "./teamRoutes-DxVWQDWU.js";
24
- import "./CreateTeamForm-BuplRIXl.js";
25
- import "./EditTeamForm-BbSQ8cdm.js";
23
+ import "./teamRoutes-CtNcFZjR.js";
24
+ import "./CreateTeamForm-DRfZ74on.js";
25
+ import "./EditTeamForm-BEOkUaKG.js";
26
26
  import "./TeamHistoryTab-p3hDxCc3.js";
27
- import "./TeamList-ggZEivO2.js";
27
+ import "./TeamList-gppM0GOD.js";
28
28
  import "./TeamNotesTab-DPw9YEwK.js";
29
- import "./TeamParent-CObyDkrL.js";
30
- import "./ViewTeam-RXno7OPV.js";
29
+ import "./TeamParent-YPtenk3l.js";
30
+ import "./ViewTeam-CRmIplCt.js";
31
31
  import "./teamMemberMetadata-DX0W-B7p.js";
32
32
  import "./CreateTeamMemberForm-ITp4XFn9.js";
33
33
  import "./EditTeamMemberForm-Fyf8Zxfh.js";
34
34
  import "./TeamMemberList-D0-dM5kI.js";
35
35
  import "./TeamMemberParent-CJGWXjuM.js";
36
36
  import "./ViewTeamMember-Cf5yXdv6.js";
37
- import "./customerSupportTicketRoutes-Cmva-eXn.js";
38
- import "./staffSupportTicketRoutes-BUa3oCVP.js";
37
+ import "./customerSupportTicketRoutes-Cy4fp4wx.js";
38
+ import "./staffSupportTicketRoutes-L4CU5dcu.js";
39
39
  import "./TimelineSystemEvent-Ch1sZiyO.js";
40
- import "./CustomerCreateSupportTicketForm-e8cIzSS6.js";
40
+ import "./CustomerCreateSupportTicketForm-Co6C_P5o.js";
41
41
  import "./CustomerSupportTicketParent-BaKfkSlU.js";
42
- import "./CustomerSupportTicketSuccess-B5E7Mr0R.js";
43
- import "./StaffCreateSupportTicketForm-C-UWBdA6.js";
42
+ import "./CustomerSupportTicketSuccess-DVqoR5-o.js";
43
+ import "./StaffCreateSupportTicketForm-Cm595v_4.js";
44
44
  import "./SupportTicketDevLifecycleBadge-BYKZjEv6.js";
45
45
  import "./StaffSupportTicketParent-yoC-_Lku.js";
46
- import "./StaffSupportTicketSuccess-TEtJGyaZ.js";
46
+ import "./StaffSupportTicketSuccess-DgULDGIj.js";
47
47
  import "./LoginForm-D1Mx2vAY.js";
48
48
  import "./useEmailVerificationChannel-QuMSgzzM.js";
49
49
  import "./Signup-BCVZZCR_.js";
@@ -53,12 +53,12 @@ import "./Logout-Bdktl4NZ.js";
53
53
  import "./mfaSchema-C6PatIbY.js";
54
54
  import "./MfaSetup-Bjc3v0hs.js";
55
55
  import "./MfaVerify-uJlPz8xg.js";
56
- import "./VerifyEmail-CEbvnWLl.js";
56
+ import "./VerifyEmail-CWUhRA1o.js";
57
57
  import "./UserListPage-A0_eNpQ1.js";
58
58
  import "./CreateUserPage-1WiLNGr_.js";
59
59
  import "./EditUserPage-BBzGmOrx.js";
60
- import "./CreditTransactionHistory-D_fy5d3l.js";
61
- import "./CreditBalanceDashboard-DzWc30u_.js";
62
- import "./CreditManagement-Bs4gqN11.js";
60
+ import "./CreditTransactionHistory-plIaRscn.js";
61
+ import "./CreditBalanceDashboard-BRY56-9w.js";
62
+ import "./CreditManagement-D-bsc1US.js";
63
63
 
64
64
  export { StaffSupportTicketList_default as default };
@@ -3,10 +3,10 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import "./useMutation-BLNuJoYl.js";
5
5
  import "./useQuery-BzUGEOj0.js";
6
- import "./saved_filter-C1pXMOJZ.js";
6
+ import "./saved_filter-jeZd2rlb.js";
7
7
  import "./ConfirmDialog-DjthOYU6.js";
8
8
  import "./userAuthorized-klLUHGxT.js";
9
- import "./staffSupportTicketRoutes-BUa3oCVP.js";
10
- import { t as StaffSupportTicketSuccess_default } from "./StaffSupportTicketSuccess-TEtJGyaZ.js";
9
+ import "./staffSupportTicketRoutes-L4CU5dcu.js";
10
+ import { t as StaffSupportTicketSuccess_default } from "./StaffSupportTicketSuccess-DgULDGIj.js";
11
11
 
12
12
  export { StaffSupportTicketSuccess_default as default };
@@ -1,4 +1,4 @@
1
- import { t as staffSupportPaths } from "./staffSupportTicketRoutes-BUa3oCVP.js";
1
+ import { t as staffSupportPaths } from "./staffSupportTicketRoutes-L4CU5dcu.js";
2
2
  import { createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, openBlock, resolveComponent, unref, withCtx } from "vue";
3
3
 
4
4
  //#region src/slices/support_ticket/staff/StaffSupportTicketSuccess.vue
@@ -51,4 +51,4 @@ var StaffSupportTicketSuccess_default = _sfc_main;
51
51
 
52
52
  //#endregion
53
53
  export { StaffSupportTicketSuccess_default as t };
54
- //# sourceMappingURL=StaffSupportTicketSuccess-TEtJGyaZ.js.map
54
+ //# sourceMappingURL=StaffSupportTicketSuccess-DgULDGIj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StaffSupportTicketSuccess-TEtJGyaZ.js","names":[],"sources":["../src/slices/support_ticket/staff/StaffSupportTicketSuccess.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col items-center justify-center min-h-[60vh] p-8\">\n <div class=\"text-center max-w-2xl\">\n <!-- Success Icon -->\n <div class=\"mb-6\">\n <div class=\"inline-flex items-center justify-center w-20 h-20 bg-success rounded-full\">\n <svg\n class=\"w-10 h-10 text-success-content\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M5 13l4 4L19 7\"\n ></path>\n </svg>\n </div>\n </div>\n\n <!-- Success Message -->\n <h1 class=\"text-3xl font-bold text-base-content mb-4\">\n Support Ticket Created Successfully!\n </h1>\n\n <p class=\"text-lg text-base-content/70 mb-8\">\n The support ticket has been created and is ready for processing.\n </p>\n\n <!-- What Happens Next -->\n <div class=\"bg-base-200 rounded-lg p-6 mb-8\">\n <h2 class=\"text-xl font-semibold mb-4\">Next Steps</h2>\n <div class=\"space-y-3 text-left\">\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 1\n </div>\n <div>\n <div class=\"font-medium\">Review & Assign</div>\n <div class=\"text-sm text-base-content/70\">\n Review the ticket details and assign to appropriate team member\n </div>\n </div>\n </div>\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 2\n </div>\n <div>\n <div class=\"font-medium\">Set Timeline</div>\n <div class=\"text-sm text-base-content/70\">\n Update target dates and delivery estimates if needed\n </div>\n </div>\n </div>\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 3\n </div>\n <div>\n <div class=\"font-medium\">Begin Work</div>\n <div class=\"text-sm text-base-content/70\">\n Start development or operational work as appropriate\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <router-link\n :to=\"{ name: staffSupportPaths.staff_list.name }\"\n class=\"btn btn-primary btn-lg\"\n >\n View All Support Tickets\n </router-link>\n <router-link\n :to=\"{ name: staffSupportPaths.staff_create.name }\"\n class=\"btn btn-outline btn-lg\"\n >\n Create Another Ticket\n </router-link>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { staffSupportPaths } from './staffSupportTicketRoutes';\n</script>\n"],"mappings":";;;;;;;;;;;;uBACE,mBA6FM,OA7FN,YA6FM,CA5FJ,mBA2FM,OA3FN,YA2FM;IA1FJ,mBAAA,iBAAqB;8BACrB,mBAiBM,OAAA,EAjBD,OAAM,QAAM,EAAA,CACf,mBAeM,OAAA,EAfD,OAAM,6EAA2E,EAAA,CACpF,mBAaM,OAAA;KAZJ,OAAM;KACN,MAAK;KACL,QAAO;KACP,SAAQ;KACR,OAAM;QAEN,mBAKQ,QAAA;KAJN,kBAAe;KACf,mBAAgB;KAChB,gBAAa;KACb,GAAE;;IAMV,mBAAA,oBAAwB;8BACxB,mBAEK,MAAA,EAFD,OAAM,6CAA2C,EAAC,0CAEtD,GAAA;8BAEA,mBAEI,KAAA,EAFD,OAAM,qCAAmC,EAAC,sEAE7C,GAAA;IAEA,mBAAA,sBAA0B;;IA8C1B,mBAAA,mBAAuB;IACvB,mBAaM,OAbN,YAaM,CAZJ,YAKc,wBAAA;KAJX,IAAE,EAAA,MAAU,MAAA,kBAAiB,CAAC,WAAW,MAAI;KAC9C,OAAM;;4BAGR,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFC,8BAED,GAAA,CAAA,EAAA,CAAA;;mBACA,YAKc,wBAAA;KAJX,IAAE,EAAA,MAAU,MAAA,kBAAiB,CAAC,aAAa,MAAI;KAChD,OAAM;;4BAGR,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFC,2BAED,GAAA,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"StaffSupportTicketSuccess-DgULDGIj.js","names":[],"sources":["../src/slices/support_ticket/staff/StaffSupportTicketSuccess.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col items-center justify-center min-h-[60vh] p-8\">\n <div class=\"text-center max-w-2xl\">\n <!-- Success Icon -->\n <div class=\"mb-6\">\n <div class=\"inline-flex items-center justify-center w-20 h-20 bg-success rounded-full\">\n <svg\n class=\"w-10 h-10 text-success-content\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M5 13l4 4L19 7\"\n ></path>\n </svg>\n </div>\n </div>\n\n <!-- Success Message -->\n <h1 class=\"text-3xl font-bold text-base-content mb-4\">\n Support Ticket Created Successfully!\n </h1>\n\n <p class=\"text-lg text-base-content/70 mb-8\">\n The support ticket has been created and is ready for processing.\n </p>\n\n <!-- What Happens Next -->\n <div class=\"bg-base-200 rounded-lg p-6 mb-8\">\n <h2 class=\"text-xl font-semibold mb-4\">Next Steps</h2>\n <div class=\"space-y-3 text-left\">\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 1\n </div>\n <div>\n <div class=\"font-medium\">Review & Assign</div>\n <div class=\"text-sm text-base-content/70\">\n Review the ticket details and assign to appropriate team member\n </div>\n </div>\n </div>\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 2\n </div>\n <div>\n <div class=\"font-medium\">Set Timeline</div>\n <div class=\"text-sm text-base-content/70\">\n Update target dates and delivery estimates if needed\n </div>\n </div>\n </div>\n <div class=\"flex items-start gap-3\">\n <div\n class=\"flex-shrink-0 w-6 h-6 bg-primary text-primary-content rounded-full flex items-center justify-center text-sm font-semibold\"\n >\n 3\n </div>\n <div>\n <div class=\"font-medium\">Begin Work</div>\n <div class=\"text-sm text-base-content/70\">\n Start development or operational work as appropriate\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <router-link\n :to=\"{ name: staffSupportPaths.staff_list.name }\"\n class=\"btn btn-primary btn-lg\"\n >\n View All Support Tickets\n </router-link>\n <router-link\n :to=\"{ name: staffSupportPaths.staff_create.name }\"\n class=\"btn btn-outline btn-lg\"\n >\n Create Another Ticket\n </router-link>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { staffSupportPaths } from './staffSupportTicketRoutes';\n</script>\n"],"mappings":";;;;;;;;;;;;uBACE,mBA6FM,OA7FN,YA6FM,CA5FJ,mBA2FM,OA3FN,YA2FM;IA1FJ,mBAAA,iBAAqB;8BACrB,mBAiBM,OAAA,EAjBD,OAAM,QAAM,EAAA,CACf,mBAeM,OAAA,EAfD,OAAM,6EAA2E,EAAA,CACpF,mBAaM,OAAA;KAZJ,OAAM;KACN,MAAK;KACL,QAAO;KACP,SAAQ;KACR,OAAM;QAEN,mBAKQ,QAAA;KAJN,kBAAe;KACf,mBAAgB;KAChB,gBAAa;KACb,GAAE;;IAMV,mBAAA,oBAAwB;8BACxB,mBAEK,MAAA,EAFD,OAAM,6CAA2C,EAAC,0CAEtD,GAAA;8BAEA,mBAEI,KAAA,EAFD,OAAM,qCAAmC,EAAC,sEAE7C,GAAA;IAEA,mBAAA,sBAA0B;;IA8C1B,mBAAA,mBAAuB;IACvB,mBAaM,OAbN,YAaM,CAZJ,YAKc,wBAAA;KAJX,IAAE,EAAA,MAAU,MAAA,kBAAiB,CAAC,WAAW,MAAI;KAC9C,OAAM;;4BAGR,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFC,8BAED,GAAA,CAAA,EAAA,CAAA;;mBACA,YAKc,wBAAA;KAJX,IAAE,EAAA,MAAU,MAAA,kBAAiB,CAAC,aAAa,MAAI;KAChD,OAAM;;4BAGR,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFC,2BAED,GAAA,CAAA,EAAA,CAAA"}
@@ -154,4 +154,4 @@ var SupportStaffPage_default = _sfc_main;
154
154
 
155
155
  //#endregion
156
156
  export { SupportStaffPage_default as default };
157
- //# sourceMappingURL=SupportStaffPage-c2ouJwJk.js.map
157
+ //# sourceMappingURL=SupportStaffPage-CkFLlle4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SupportStaffPage-c2ouJwJk.js","names":[],"sources":["../src/slices/admin/features/support_staff/SupportStaffPage.vue"],"sourcesContent":["<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Support Staff</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Users who can triage support tickets. They receive round-robin assignment when new tickets are created.\n </p>\n\n <!-- Add support staff -->\n <div class=\"card bg-base-200 mb-6\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Add Support Staff</h2>\n <div class=\"flex flex-wrap items-end gap-4\">\n <div class=\"form-control flex-1 min-w-[200px]\">\n <label class=\"label\">\n <span class=\"label-text\">User</span>\n </label>\n <select\n v-model=\"selectedUserId\"\n class=\"select select-bordered w-full\"\n :disabled=\"isAdding || !addableUsers.length\"\n >\n <option value=\"\">Select a user...</option>\n <option\n v-for=\"u in addableUsers\"\n :key=\"u.id\"\n :value=\"u.id\"\n >\n {{ u.email }} ({{ u.user_type }})\n </option>\n </select>\n <p v-if=\"!addableUsers.length && !isLoading\" class=\"text-sm text-base-content/50 mt-1\">\n All staff users are already support staff.\n </p>\n </div>\n <button\n class=\"btn btn-primary\"\n :disabled=\"!selectedUserId || isAdding\"\n @click=\"handleAdd\"\n >\n <span v-if=\"isAdding\" class=\"loading loading-spinner loading-sm\"></span>\n {{ isAdding ? 'Adding...' : 'Add' }}\n </button>\n </div>\n <p v-if=\"addError\" class=\"text-sm text-error mt-2\">{{ addError }}</p>\n </div>\n </div>\n\n <!-- List -->\n <div v-if=\"isLoading\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"!(supportStaffPageData?.members ?? []).length\" class=\"alert alert-info\">\n <span>No support staff yet. Add users above to enable triage assignment.</span>\n </div>\n\n <div v-else class=\"overflow-x-auto\">\n <table class=\"table\">\n <thead>\n <tr>\n <th>Email</th>\n <th>Added</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"m in (supportStaffPageData?.members ?? [])\" :key=\"m.id\">\n <td>{{ m.email }}</td>\n <td>{{ formatDate(m.created_at) }}</td>\n <td>\n <button\n class=\"btn btn-sm btn-ghost text-error\"\n :disabled=\"isRemoving === m.user_id\"\n @click=\"handleRemove(m.user_id)\"\n >\n <span v-if=\"isRemoving === m.user_id\" class=\"loading loading-spinner loading-xs\"></span>\n {{ isRemoving === m.user_id ? 'Removing...' : 'Remove' }}\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { BATCH_MODE } from '../../../../composables/useRpcAuth';\nimport { executeWithAuth } from '../../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../../../utils/convertToLocalDateTime';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\nconst STAFF_TYPES = ['staff', 'super_admin'] as const;\n\nconst {\n data: supportStaffPageData,\n loading: isLoading,\n refetch,\n} = useQuery(\n async (api) => {\n const [members, allUsers] = await Promise.all([\n api.supportStaff.listSupportStaff(),\n api.users.listUsers(),\n ]);\n return { members, allUsers };\n },\n {\n cacheKey: 'support-staff-page',\n staleTime: 30 * 1000,\n batchMode: BATCH_MODE.batch,\n trackedSegment: 'support-staff-page',\n },\n);\n\nconst addableUsers = computed(() => {\n const users = supportStaffPageData.value?.allUsers ?? [];\n const staffIds = new Set((supportStaffPageData.value?.members ?? []).map((m) => m.user_id));\n return users.filter(\n (u) =>\n STAFF_TYPES.includes(u.user_type as (typeof STAFF_TYPES)[number]) &&\n !staffIds.has(u.id),\n );\n});\n\nconst selectedUserId = ref('');\nwatch(addableUsers, (users) => {\n if (!selectedUserId.value || !users.some((u) => u.id === selectedUserId.value)) {\n selectedUserId.value = '';\n }\n});\n\nconst { mutate: addSupportStaff, loading: isAdding } = useMutation(\n (api, userId: string) => api.supportStaff.addSupportStaff(userId),\n { invalidate: /support-staff|triage-users/ },\n);\n\nconst addError = ref<string | null>(null);\n\nasync function handleAdd() {\n if (!selectedUserId.value) return;\n addError.value = null;\n try {\n await addSupportStaff(selectedUserId.value);\n toast.success('Support staff added');\n selectedUserId.value = '';\n await refetch();\n } catch (e) {\n addError.value = extractRpcErrorMessage(e, 'Failed to add support staff');\n toast.error(addError.value);\n }\n}\n\nconst isRemoving = ref<string | null>(null);\n\nasync function handleRemove(userId: string) {\n isRemoving.value = userId;\n try {\n await executeWithAuth(\n async (api) => api.supportStaff.removeSupportStaff(userId),\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n toast.success('Support staff removed');\n await refetch();\n } catch (e) {\n toast.error(extractRpcErrorMessage(e, 'Failed to remove support staff'));\n } finally {\n isRemoving.value = null;\n }\n}\n\nfunction formatDate(s: string) {\n return formatSystemTimestamp(s);\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"SupportStaffPage-CkFLlle4.js","names":[],"sources":["../src/slices/admin/features/support_staff/SupportStaffPage.vue"],"sourcesContent":["<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Support Staff</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Users who can triage support tickets. They receive round-robin assignment when new tickets are created.\n </p>\n\n <!-- Add support staff -->\n <div class=\"card bg-base-200 mb-6\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Add Support Staff</h2>\n <div class=\"flex flex-wrap items-end gap-4\">\n <div class=\"form-control flex-1 min-w-[200px]\">\n <label class=\"label\">\n <span class=\"label-text\">User</span>\n </label>\n <select\n v-model=\"selectedUserId\"\n class=\"select select-bordered w-full\"\n :disabled=\"isAdding || !addableUsers.length\"\n >\n <option value=\"\">Select a user...</option>\n <option\n v-for=\"u in addableUsers\"\n :key=\"u.id\"\n :value=\"u.id\"\n >\n {{ u.email }} ({{ u.user_type }})\n </option>\n </select>\n <p v-if=\"!addableUsers.length && !isLoading\" class=\"text-sm text-base-content/50 mt-1\">\n All staff users are already support staff.\n </p>\n </div>\n <button\n class=\"btn btn-primary\"\n :disabled=\"!selectedUserId || isAdding\"\n @click=\"handleAdd\"\n >\n <span v-if=\"isAdding\" class=\"loading loading-spinner loading-sm\"></span>\n {{ isAdding ? 'Adding...' : 'Add' }}\n </button>\n </div>\n <p v-if=\"addError\" class=\"text-sm text-error mt-2\">{{ addError }}</p>\n </div>\n </div>\n\n <!-- List -->\n <div v-if=\"isLoading\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"!(supportStaffPageData?.members ?? []).length\" class=\"alert alert-info\">\n <span>No support staff yet. Add users above to enable triage assignment.</span>\n </div>\n\n <div v-else class=\"overflow-x-auto\">\n <table class=\"table\">\n <thead>\n <tr>\n <th>Email</th>\n <th>Added</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"m in (supportStaffPageData?.members ?? [])\" :key=\"m.id\">\n <td>{{ m.email }}</td>\n <td>{{ formatDate(m.created_at) }}</td>\n <td>\n <button\n class=\"btn btn-sm btn-ghost text-error\"\n :disabled=\"isRemoving === m.user_id\"\n @click=\"handleRemove(m.user_id)\"\n >\n <span v-if=\"isRemoving === m.user_id\" class=\"loading loading-spinner loading-xs\"></span>\n {{ isRemoving === m.user_id ? 'Removing...' : 'Remove' }}\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { BATCH_MODE } from '../../../../composables/useRpcAuth';\nimport { executeWithAuth } from '../../../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../../../utils/convertToLocalDateTime';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\nconst STAFF_TYPES = ['staff', 'super_admin'] as const;\n\nconst {\n data: supportStaffPageData,\n loading: isLoading,\n refetch,\n} = useQuery(\n async (api) => {\n const [members, allUsers] = await Promise.all([\n api.supportStaff.listSupportStaff(),\n api.users.listUsers(),\n ]);\n return { members, allUsers };\n },\n {\n cacheKey: 'support-staff-page',\n staleTime: 30 * 1000,\n batchMode: BATCH_MODE.batch,\n trackedSegment: 'support-staff-page',\n },\n);\n\nconst addableUsers = computed(() => {\n const users = supportStaffPageData.value?.allUsers ?? [];\n const staffIds = new Set((supportStaffPageData.value?.members ?? []).map((m) => m.user_id));\n return users.filter(\n (u) =>\n STAFF_TYPES.includes(u.user_type as (typeof STAFF_TYPES)[number]) &&\n !staffIds.has(u.id),\n );\n});\n\nconst selectedUserId = ref('');\nwatch(addableUsers, (users) => {\n if (!selectedUserId.value || !users.some((u) => u.id === selectedUserId.value)) {\n selectedUserId.value = '';\n }\n});\n\nconst { mutate: addSupportStaff, loading: isAdding } = useMutation(\n (api, userId: string) => api.supportStaff.addSupportStaff(userId),\n { invalidate: /support-staff|triage-users/ },\n);\n\nconst addError = ref<string | null>(null);\n\nasync function handleAdd() {\n if (!selectedUserId.value) return;\n addError.value = null;\n try {\n await addSupportStaff(selectedUserId.value);\n toast.success('Support staff added');\n selectedUserId.value = '';\n await refetch();\n } catch (e) {\n addError.value = extractRpcErrorMessage(e, 'Failed to add support staff');\n toast.error(addError.value);\n }\n}\n\nconst isRemoving = ref<string | null>(null);\n\nasync function handleRemove(userId: string) {\n isRemoving.value = userId;\n try {\n await executeWithAuth(\n async (api) => api.supportStaff.removeSupportStaff(userId),\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n toast.success('Support staff removed');\n await refetch();\n } catch (e) {\n toast.error(extractRpcErrorMessage(e, 'Failed to remove support staff'));\n } finally {\n isRemoving.value = null;\n }\n}\n\nfunction formatDate(s: string) {\n return formatSystemTimestamp(s);\n}\n</script>\n"],"mappings":"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"}
@@ -54,4 +54,4 @@ var SupportTicketMaintenancePage_default = _sfc_main;
54
54
 
55
55
  //#endregion
56
56
  export { SupportTicketMaintenancePage_default as default };
57
- //# sourceMappingURL=SupportTicketMaintenancePage-B07avInx.js.map
57
+ //# sourceMappingURL=SupportTicketMaintenancePage-CEKi8xQB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SupportTicketMaintenancePage-B07avInx.js","names":[],"sources":["../src/slices/admin/features/support_ticket_maintenance/SupportTicketMaintenancePage.vue"],"sourcesContent":["<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Support Ticket Maintenance</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Admin utilities for fixing support ticket data issues.\n </p>\n\n <div class=\"card bg-base-200\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Fix User IDs</h2>\n <p class=\"text-sm text-base-content/70 mb-4\">\n Some support tickets may have email addresses stored in user ID fields (e.g. updated_by, created_by)\n instead of user IDs. This tool scans for such tickets and replaces emails with the correct user IDs\n where a matching user exists.\n </p>\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm w-fit\"\n :disabled=\"isFixingUserIds\"\n @click=\"handleFixUserIds\"\n >\n <span v-if=\"isFixingUserIds\" class=\"loading loading-spinner loading-sm\"></span>\n <span v-else>Fix User IDs</span>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { toast } from 'vue3-toastify';\n\nconst { mutate: fixUserIds, loading: isFixingUserIds } = useMutation(\n (api) => api.supportTickets.staffFixSupportTicketUserIds(),\n {\n invalidate: /^support-ticket/,\n onSuccess: (result) => {\n toast.success(\n `Fixed ${result.ticketsFixed} ticket(s). Scanned: ${result.ticketsScanned}, skipped (no match): ${result.ticketsSkipped}`,\n );\n },\n onError: (err) => {\n toast.error(err?.message ?? 'Failed to fix user IDs');\n },\n },\n);\n\nasync function handleFixUserIds() {\n try {\n await fixUserIds(undefined);\n } catch {\n // Error handled by onError\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAoCA,MAAM,EAAE,QAAQ,YAAY,SAAS,oBAAoB,aACtD,QAAQ,IAAI,eAAe,8BAA8B,EAC1D;GACE,YAAY;GACZ,YAAY,WAAW;AACrB,UAAM,QACJ,SAAS,OAAO,aAAa,uBAAuB,OAAO,eAAe,wBAAwB,OAAO,iBAC1G;;GAEH,UAAU,QAAQ;AAChB,UAAM,MAAM,KAAK,WAAW,yBAAyB;;GAExD,CACF;EAED,eAAe,mBAAmB;AAChC,OAAI;AACF,UAAM,WAAW,OAAU;WACrB;;;uBArDR,mBA4BM,OA5BN,YA4BM;8BA3BJ,mBAEM,OAAA,EAFD,OAAM,0CAAwC,EAAA,CACjD,mBAA8D,MAAA,EAA1D,OAAM,sBAAoB,EAAC,6BAA0B,CAAA;8BAG3D,mBAEI,KAAA,EAFD,OAAM,6BAA2B,EAAC,4DAErC,GAAA;IAEA,mBAkBM,OAlBN,YAkBM,CAjBJ,mBAgBM,OAhBN,YAgBM;+BAfJ,mBAAgD,MAAA,EAA5C,OAAM,sBAAoB,EAAC,gBAAY,GAAA;+BAC3C,mBAII,KAAA,EAJD,OAAM,qCAAmC,EAAC,4OAI7C,GAAA;KACA,mBAQS,UAAA;MAPP,MAAK;MACL,OAAM;MACL,UAAU,MAAA,gBAAe;MACzB,SAAO;SAEI,MAAA,gBAAe,IAAA,WAAA,EAA3B,mBAA+E,QAA/E,WAA+E,KAAA,WAAA,EAC/E,mBAAgC,QAAA,YAAnB,eAAY,EAAA,EAAA,GAAA,WAAA"}
1
+ {"version":3,"file":"SupportTicketMaintenancePage-CEKi8xQB.js","names":[],"sources":["../src/slices/admin/features/support_ticket_maintenance/SupportTicketMaintenancePage.vue"],"sourcesContent":["<template>\n <div class=\"mt-2\">\n <div class=\"flex justify-between items-center mb-4\">\n <h1 class=\"text-2xl font-bold\">Support Ticket Maintenance</h1>\n </div>\n\n <p class=\"text-base-content/70 mb-4\">\n Admin utilities for fixing support ticket data issues.\n </p>\n\n <div class=\"card bg-base-200\">\n <div class=\"card-body\">\n <h2 class=\"card-title text-lg\">Fix User IDs</h2>\n <p class=\"text-sm text-base-content/70 mb-4\">\n Some support tickets may have email addresses stored in user ID fields (e.g. updated_by, created_by)\n instead of user IDs. This tool scans for such tickets and replaces emails with the correct user IDs\n where a matching user exists.\n </p>\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm w-fit\"\n :disabled=\"isFixingUserIds\"\n @click=\"handleFixUserIds\"\n >\n <span v-if=\"isFixingUserIds\" class=\"loading loading-spinner loading-sm\"></span>\n <span v-else>Fix User IDs</span>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { toast } from 'vue3-toastify';\n\nconst { mutate: fixUserIds, loading: isFixingUserIds } = useMutation(\n (api) => api.supportTickets.staffFixSupportTicketUserIds(),\n {\n invalidate: /^support-ticket/,\n onSuccess: (result) => {\n toast.success(\n `Fixed ${result.ticketsFixed} ticket(s). Scanned: ${result.ticketsScanned}, skipped (no match): ${result.ticketsSkipped}`,\n );\n },\n onError: (err) => {\n toast.error(err?.message ?? 'Failed to fix user IDs');\n },\n },\n);\n\nasync function handleFixUserIds() {\n try {\n await fixUserIds(undefined);\n } catch {\n // Error handled by onError\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAoCA,MAAM,EAAE,QAAQ,YAAY,SAAS,oBAAoB,aACtD,QAAQ,IAAI,eAAe,8BAA8B,EAC1D;GACE,YAAY;GACZ,YAAY,WAAW;AACrB,UAAM,QACJ,SAAS,OAAO,aAAa,uBAAuB,OAAO,eAAe,wBAAwB,OAAO,iBAC1G;;GAEH,UAAU,QAAQ;AAChB,UAAM,MAAM,KAAK,WAAW,yBAAyB;;GAExD,CACF;EAED,eAAe,mBAAmB;AAChC,OAAI;AACF,UAAM,WAAW,OAAU;WACrB;;;uBArDR,mBA4BM,OA5BN,YA4BM;8BA3BJ,mBAEM,OAAA,EAFD,OAAM,0CAAwC,EAAA,CACjD,mBAA8D,MAAA,EAA1D,OAAM,sBAAoB,EAAC,6BAA0B,CAAA;8BAG3D,mBAEI,KAAA,EAFD,OAAM,6BAA2B,EAAC,4DAErC,GAAA;IAEA,mBAkBM,OAlBN,YAkBM,CAjBJ,mBAgBM,OAhBN,YAgBM;+BAfJ,mBAAgD,MAAA,EAA5C,OAAM,sBAAoB,EAAC,gBAAY,GAAA;+BAC3C,mBAII,KAAA,EAJD,OAAM,qCAAmC,EAAC,4OAI7C,GAAA;KACA,mBAQS,UAAA;MAPP,MAAK;MACL,OAAM;MACL,UAAU,MAAA,gBAAe;MACzB,SAAO;SAEI,MAAA,gBAAe,IAAA,WAAA,EAA3B,mBAA+E,QAA/E,WAA+E,KAAA,WAAA,EAC/E,mBAAgC,QAAA,YAAnB,eAAY,EAAA,EAAA,GAAA,WAAA"}
@@ -3,9 +3,9 @@ import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./useQueryCache-alzaRWEb.js";
4
4
  import "./useMutation-BLNuJoYl.js";
5
5
  import "./useQuery-BzUGEOj0.js";
6
- import { O as TeamAttachmentsTab_default } from "./src-qjXj41gp.js";
6
+ import { O as TeamAttachmentsTab_default } from "./src-zjaOyP9b.js";
7
7
  import "./AppLink-FcNGKgvG.js";
8
- import "./saved_filter-C1pXMOJZ.js";
8
+ import "./saved_filter-jeZd2rlb.js";
9
9
  import "./ConfirmDialog-DjthOYU6.js";
10
10
  import "./InlineAttachments-DAn_QknY.js";
11
11
  import "./TeamMembersTab-BigqpBDH.js";
@@ -20,30 +20,30 @@ import "./UserProfilePage-FNLYK9kj.js";
20
20
  import "./ChangePasswordPage-nr0B06HB.js";
21
21
  import "./teamMetadata-26Mwjb2i.js";
22
22
  import "./team_memberRoutes-Cxgte_vj.js";
23
- import "./teamRoutes-DxVWQDWU.js";
24
- import "./CreateTeamForm-BuplRIXl.js";
25
- import "./EditTeamForm-BbSQ8cdm.js";
23
+ import "./teamRoutes-CtNcFZjR.js";
24
+ import "./CreateTeamForm-DRfZ74on.js";
25
+ import "./EditTeamForm-BEOkUaKG.js";
26
26
  import "./TeamHistoryTab-p3hDxCc3.js";
27
- import "./TeamList-ggZEivO2.js";
27
+ import "./TeamList-gppM0GOD.js";
28
28
  import "./TeamNotesTab-DPw9YEwK.js";
29
- import "./TeamParent-CObyDkrL.js";
30
- import "./ViewTeam-RXno7OPV.js";
29
+ import "./TeamParent-YPtenk3l.js";
30
+ import "./ViewTeam-CRmIplCt.js";
31
31
  import "./teamMemberMetadata-DX0W-B7p.js";
32
32
  import "./CreateTeamMemberForm-ITp4XFn9.js";
33
33
  import "./EditTeamMemberForm-Fyf8Zxfh.js";
34
34
  import "./TeamMemberList-D0-dM5kI.js";
35
35
  import "./TeamMemberParent-CJGWXjuM.js";
36
36
  import "./ViewTeamMember-Cf5yXdv6.js";
37
- import "./customerSupportTicketRoutes-Cmva-eXn.js";
38
- import "./staffSupportTicketRoutes-BUa3oCVP.js";
37
+ import "./customerSupportTicketRoutes-Cy4fp4wx.js";
38
+ import "./staffSupportTicketRoutes-L4CU5dcu.js";
39
39
  import "./TimelineSystemEvent-Ch1sZiyO.js";
40
- import "./CustomerCreateSupportTicketForm-e8cIzSS6.js";
40
+ import "./CustomerCreateSupportTicketForm-Co6C_P5o.js";
41
41
  import "./CustomerSupportTicketParent-BaKfkSlU.js";
42
- import "./CustomerSupportTicketSuccess-B5E7Mr0R.js";
43
- import "./StaffCreateSupportTicketForm-C-UWBdA6.js";
42
+ import "./CustomerSupportTicketSuccess-DVqoR5-o.js";
43
+ import "./StaffCreateSupportTicketForm-Cm595v_4.js";
44
44
  import "./SupportTicketDevLifecycleBadge-BYKZjEv6.js";
45
45
  import "./StaffSupportTicketParent-yoC-_Lku.js";
46
- import "./StaffSupportTicketSuccess-TEtJGyaZ.js";
46
+ import "./StaffSupportTicketSuccess-DgULDGIj.js";
47
47
  import "./LoginForm-D1Mx2vAY.js";
48
48
  import "./useEmailVerificationChannel-QuMSgzzM.js";
49
49
  import "./Signup-BCVZZCR_.js";
@@ -53,12 +53,12 @@ import "./Logout-Bdktl4NZ.js";
53
53
  import "./mfaSchema-C6PatIbY.js";
54
54
  import "./MfaSetup-Bjc3v0hs.js";
55
55
  import "./MfaVerify-uJlPz8xg.js";
56
- import "./VerifyEmail-CEbvnWLl.js";
56
+ import "./VerifyEmail-CWUhRA1o.js";
57
57
  import "./UserListPage-A0_eNpQ1.js";
58
58
  import "./CreateUserPage-1WiLNGr_.js";
59
59
  import "./EditUserPage-BBzGmOrx.js";
60
- import "./CreditTransactionHistory-D_fy5d3l.js";
61
- import "./CreditBalanceDashboard-DzWc30u_.js";
62
- import "./CreditManagement-Bs4gqN11.js";
60
+ import "./CreditTransactionHistory-plIaRscn.js";
61
+ import "./CreditBalanceDashboard-BRY56-9w.js";
62
+ import "./CreditManagement-D-bsc1US.js";
63
63
 
64
64
  export { TeamAttachmentsTab_default as default };
@@ -2,7 +2,7 @@ import "./useRpcAuth-CJtq1dqM.js";
2
2
  import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import "./userAuthorized-klLUHGxT.js";
4
4
  import "./team_memberRoutes-Cxgte_vj.js";
5
- import "./teamRoutes-DxVWQDWU.js";
6
- import { t as TeamList_default } from "./TeamList-ggZEivO2.js";
5
+ import "./teamRoutes-CtNcFZjR.js";
6
+ import { t as TeamList_default } from "./TeamList-gppM0GOD.js";
7
7
 
8
8
  export { TeamList_default as default };
@@ -1,7 +1,7 @@
1
1
  import { r as executeWithAuth } from "./useRpcAuth-CJtq1dqM.js";
2
2
  import { r as getRefreshTokenHandler } from "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
3
  import { t as formatSystemTimestamp } from "./convertToLocalDateTime-C13-PrSA.js";
4
- import { t as teamPaths } from "./teamRoutes-DxVWQDWU.js";
4
+ import { t as teamPaths } from "./teamRoutes-CtNcFZjR.js";
5
5
  import { createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, resolveComponent, toDisplayString, unref, withCtx } from "vue";
6
6
  import { TeamReadSchema } from "@dragonmastery/dragoncore-shared";
7
7
  import { ActionIcons, useCursorDataTable, withMetadata } from "@dragonmastery/zinia-forms-core";
@@ -138,4 +138,4 @@ var TeamList_default = _sfc_main;
138
138
 
139
139
  //#endregion
140
140
  export { teamRowSchemaWithMetadata as n, TeamList_default as t };
141
- //# sourceMappingURL=TeamList-ggZEivO2.js.map
141
+ //# sourceMappingURL=TeamList-gppM0GOD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TeamList-ggZEivO2.js","names":["variables: TeamFiltersDto"],"sources":["../src/slices/team/TeamRowSchema.ts","../src/slices/team/TeamList.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { TeamReadSchema } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Reuse the existing TeamReadSchema from the validation library\n * for the data table rows - don't recreate it!\n */\nexport const teamRowSchemaWithMetadata = withMetadata(TeamReadSchema, 'teamRow', {});\n\nexport type TeamRow = typeof TeamReadSchema._type;\n","<template>\n <div>\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4 mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold\">Teams</h1>\n <router-link\n :to=\"{ name: teamPaths.create.name }\"\n class=\"btn btn-primary btn-sm sm:btn-md\"\n >\n Create\n </router-link>\n </div>\n <ZiniaDataTable>\n <template #cell-display_name=\"{ row }\">\n <router-link\n :to=\"{ name: teamPaths.view.name, params: { id: row.id } }\"\n class=\"link link-primary\"\n >\n {{ row.display_name }}\n </router-link>\n </template>\n <template #cell-archived_at=\"{ row }\">\n {{ row.archived_at ? 'Archived' : 'Active' }}\n </template>\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n <template #cell-updated_at=\"{ row }\">\n {{ formatSystemTimestamp(row.updated_at) }}\n </template>\n <template #cell-actions=\"{ row }\">\n <router-link\n :to=\"{\n name: teamPaths.view.name,\n params: { id: row.id },\n }\"\n class=\"btn btn-sm btn-primary\"\n >\n View\n </router-link>\n </template>\n </ZiniaDataTable>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamFiltersDto } from '@dragonmastery/dragoncore-shared';\nimport { ActionIcons, useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { ref } from 'vue';\nimport { executeWithAuth } from '../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../utils/convertToLocalDateTime';\nimport { teamRowSchemaWithMetadata, type TeamRow } from './TeamRowSchema';\nimport { teamPaths } from './teamRoutes';\n\n// Store pagination token for breadcrumb state\nconst currentPaginationToken = ref<string | undefined | null>();\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable } = useCursorDataTable(teamRowSchemaWithMetadata, {\n fetchData: async ({ cursor, pageSize, sort, filters, search }) => {\n const variables: TeamFiltersDto = {\n first: pageSize,\n sortBy: sort?.field ? (sort.field as string) : 'created_at',\n sortDirection: (sort?.direction === 'asc' ? 'asc' : 'desc') as 'asc' | 'desc',\n ...(cursor ? { after: cursor } : {}),\n ...(currentPaginationToken.value\n ? { paginationToken: currentPaginationToken.value }\n : {}),\n ...(search ? { search } : {}),\n ...filters,\n };\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.teams.listTeams(variables);\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n // Store the new pagination token for next request\n currentPaginationToken.value = result?.pageInfo?.paginationToken;\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n display_name: {\n label: 'Name',\n field: 'display_name',\n sortable: true,\n },\n unique_name: {\n label: 'Unique Name',\n field: 'unique_name',\n sortable: true,\n },\n contact_email: {\n label: 'Contact Email',\n field: 'contact_email',\n sortable: true,\n filterable: true,\n },\n address_city: {\n label: 'City',\n field: 'address_city',\n sortable: true,\n filterable: true,\n },\n archived_at: {\n label: 'Status',\n field: 'archived_at',\n sortable: true,\n },\n created_at: {\n label: 'Created',\n field: 'created_at',\n sortable: true,\n },\n updated_at: {\n label: 'Updated',\n field: 'updated_at',\n sortable: true,\n },\n },\n actions: {\n items: [\n {\n key: 'view',\n icon: ActionIcons.edit,\n size: 'xs',\n variant: 'primary',\n type: 'link',\n href: (row: TeamRow) => `/teams/${row.id}`,\n },\n ],\n },\n search: {\n searchableFields: ['display_name', 'unique_name', 'legal_name'],\n },\n pagination: { pageSize: 25 },\n});\n</script>\n"],"mappings":";;;;;;;;;;;;;AAOA,MAAa,4BAA4B,aAAa,gBAAgB,WAAW,EAAE,CAAC;;;;;;;;ECgDpF,MAAM,yBAAyB,KAAgC;EAG/D,MAAM,EAAE,mBAAmB,mBAAmB,2BAA2B;GACvE,WAAW,OAAO,EAAE,QAAQ,UAAU,MAAM,SAAS,aAAa;IAChE,MAAMA,YAA4B;KAChC,OAAO;KACP,QAAQ,MAAM,QAAS,KAAK,QAAmB;KAC/C,eAAgB,MAAM,cAAc,QAAQ,QAAQ;KACpD,GAAI,SAAS,EAAE,OAAO,QAAQ,GAAG,EAAE;KACnC,GAAI,uBAAuB,QACvB,EAAE,iBAAiB,uBAAuB,OAAM,GAChD,EAAE;KACN,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;KAC5B,GAAG;KACJ;IAED,MAAM,SAAS,MAAM,gBACnB,OAAO,QAAQ;AACb,YAAO,MAAM,IAAI,MAAM,UAAU,UAAU;OAE7C,EAAE,qBAAqB,wBAAwB,EAAE,CAClD;AAGD,2BAAuB,QAAQ,QAAQ,UAAU;AAEjD,WAAO;KACL,MAAM,OAAO,SAAS,EAAE;KACxB,aAAa,OAAO,UAAU,eAAe;KAC7C,iBAAiB,OAAO,UAAU,mBAAmB;KACrD,gBAAgB,OAAO,UAAU,kBAAkB;KACnD,gBAAgB,OAAO,UAAU,kBAAkB;KACpD;;GAEH,SAAS;IACP,cAAc;KACZ,OAAO;KACP,OAAO;KACP,UAAU;KACX;IACD,aAAa;KACX,OAAO;KACP,OAAO;KACP,UAAU;KACX;IACD,eAAe;KACb,OAAO;KACP,OAAO;KACP,UAAU;KACV,YAAY;KACb;IACD,cAAc;KACZ,OAAO;KACP,OAAO;KACP,UAAU;KACV,YAAY;KACb;IACD,aAAa;KACX,OAAO;KACP,OAAO;KACP,UAAU;KACX;IACD,YAAY;KACV,OAAO;KACP,OAAO;KACP,UAAU;KACX;IACD,YAAY;KACV,OAAO;KACP,OAAO;KACP,UAAU;KACX;IACF;GACD,SAAS,EACP,OAAO,CACL;IACE,KAAK;IACL,MAAM,YAAY;IAClB,MAAM;IACN,SAAS;IACT,MAAM;IACN,OAAO,QAAiB,UAAU,IAAI;IACvC,CACF,EACF;GACD,QAAQ,EACN,kBAAkB;IAAC;IAAgB;IAAe;IAAa,EAChE;GACD,YAAY,EAAE,UAAU,IAAI;GAC7B,CAAC;;;uBAhJA,mBAwCM,OAAA,MAAA,CAvCJ,mBAQM,OARN,YAQM,CAAA,OAAA,OAAA,OAAA,KAPJ,mBAAoD,MAAA,EAAhD,OAAM,iCAA+B,EAAC,SAAK,GAAA,GAC/C,YAKc,wBAAA;IAJX,IAAE,EAAA,MAAU,MAAA,UAAS,CAAC,OAAO,MAAI;IAClC,OAAM;;2BAGR,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFC,YAED,GAAA,CAAA,EAAA,CAAA;;oBAEF,YA6BiB,MAAA,eAAA,EAAA,MAAA;IA5BJ,qBAAiB,SAMZ,EANgB,UAAG,CACjC,YAKc,wBAAA;KAJX,IAAE;MAAA,MAAU,MAAA,UAAS,CAAC,KAAK;MAAI,QAAA,EAAA,IAAgB,IAAI,IAAE;MAAA;KACtD,OAAM;;4BAEgB,CAAA,gCAAnB,IAAI,aAAY,EAAA,EAAA,CAAA,CAAA;;;IAGZ,oBAAgB,SACoB,EADhB,UAAG,CAAA,gCAC7B,IAAI,cAAW,aAAA,SAAA,EAAA,EAAA,CAAA,CAAA;IAET,mBAAe,SACmB,EADf,UAAG,CAAA,gCAC5B,MAAA,sBAAqB,CAAC,IAAI,WAAU,CAAA,EAAA,EAAA,CAAA,CAAA;IAE9B,mBAAe,SACmB,EADf,UAAG,CAAA,gCAC5B,MAAA,sBAAqB,CAAC,IAAI,WAAU,CAAA,EAAA,EAAA,CAAA,CAAA;IAE9B,gBAAY,SASP,EATW,UAAG,CAC5B,YAQc,wBAAA;KAPX,IAAE;YAAsB,MAAA,UAAS,CAAC,KAAK;oBAAgC,IAAI,IAAE;;KAI9E,OAAM;;4BAGR,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFC,UAED,GAAA,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"TeamList-gppM0GOD.js","names":["variables: TeamFiltersDto"],"sources":["../src/slices/team/TeamRowSchema.ts","../src/slices/team/TeamList.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { TeamReadSchema } from '@dragonmastery/dragoncore-shared';\n\n/**\n * Reuse the existing TeamReadSchema from the validation library\n * for the data table rows - don't recreate it!\n */\nexport const teamRowSchemaWithMetadata = withMetadata(TeamReadSchema, 'teamRow', {});\n\nexport type TeamRow = typeof TeamReadSchema._type;\n","<template>\n <div>\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4 mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold\">Teams</h1>\n <router-link\n :to=\"{ name: teamPaths.create.name }\"\n class=\"btn btn-primary btn-sm sm:btn-md\"\n >\n Create\n </router-link>\n </div>\n <ZiniaDataTable>\n <template #cell-display_name=\"{ row }\">\n <router-link\n :to=\"{ name: teamPaths.view.name, params: { id: row.id } }\"\n class=\"link link-primary\"\n >\n {{ row.display_name }}\n </router-link>\n </template>\n <template #cell-archived_at=\"{ row }\">\n {{ row.archived_at ? 'Archived' : 'Active' }}\n </template>\n <template #cell-created_at=\"{ row }\">\n {{ formatSystemTimestamp(row.created_at) }}\n </template>\n <template #cell-updated_at=\"{ row }\">\n {{ formatSystemTimestamp(row.updated_at) }}\n </template>\n <template #cell-actions=\"{ row }\">\n <router-link\n :to=\"{\n name: teamPaths.view.name,\n params: { id: row.id },\n }\"\n class=\"btn btn-sm btn-primary\"\n >\n View\n </router-link>\n </template>\n </ZiniaDataTable>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TeamFiltersDto } from '@dragonmastery/dragoncore-shared';\nimport { ActionIcons, useCursorDataTable } from '@dragonmastery/zinia-forms-core';\nimport { ref } from 'vue';\nimport { executeWithAuth } from '../../composables/useRpcAuth';\nimport { getRefreshTokenHandler } from '../../utils/EnhancedRefreshTokenHandler';\nimport { formatSystemTimestamp } from '../../utils/convertToLocalDateTime';\nimport { teamRowSchemaWithMetadata, type TeamRow } from './TeamRowSchema';\nimport { teamPaths } from './teamRoutes';\n\n// Store pagination token for breadcrumb state\nconst currentPaginationToken = ref<string | undefined | null>();\n\n// Set up data table with cursor breadcrumb pagination\nconst { ZiniaDataTable } = useCursorDataTable(teamRowSchemaWithMetadata, {\n fetchData: async ({ cursor, pageSize, sort, filters, search }) => {\n const variables: TeamFiltersDto = {\n first: pageSize,\n sortBy: sort?.field ? (sort.field as string) : 'created_at',\n sortDirection: (sort?.direction === 'asc' ? 'asc' : 'desc') as 'asc' | 'desc',\n ...(cursor ? { after: cursor } : {}),\n ...(currentPaginationToken.value\n ? { paginationToken: currentPaginationToken.value }\n : {}),\n ...(search ? { search } : {}),\n ...filters,\n };\n\n const result = await executeWithAuth(\n async (api) => {\n return await api.teams.listTeams(variables);\n },\n { refreshTokenHandler: getRefreshTokenHandler() },\n );\n\n // Store the new pagination token for next request\n currentPaginationToken.value = result?.pageInfo?.paginationToken;\n\n return {\n data: result.items || [],\n hasNextPage: result.pageInfo?.hasNextPage ?? false,\n hasPreviousPage: result.pageInfo?.hasPreviousPage ?? false,\n prevPageCursor: result.pageInfo?.prevPageCursor ?? undefined,\n nextPageCursor: result.pageInfo?.nextPageCursor ?? undefined,\n };\n },\n columns: {\n display_name: {\n label: 'Name',\n field: 'display_name',\n sortable: true,\n },\n unique_name: {\n label: 'Unique Name',\n field: 'unique_name',\n sortable: true,\n },\n contact_email: {\n label: 'Contact Email',\n field: 'contact_email',\n sortable: true,\n filterable: true,\n },\n address_city: {\n label: 'City',\n field: 'address_city',\n sortable: true,\n filterable: true,\n },\n archived_at: {\n label: 'Status',\n field: 'archived_at',\n sortable: true,\n },\n created_at: {\n label: 'Created',\n field: 'created_at',\n sortable: true,\n },\n updated_at: {\n label: 'Updated',\n field: 'updated_at',\n sortable: true,\n },\n },\n actions: {\n items: [\n {\n key: 'view',\n icon: ActionIcons.edit,\n size: 'xs',\n variant: 'primary',\n type: 'link',\n href: (row: TeamRow) => `/teams/${row.id}`,\n },\n ],\n },\n search: {\n searchableFields: ['display_name', 'unique_name', 'legal_name'],\n },\n pagination: { pageSize: 25 },\n});\n</script>\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import "./useQuery-BzUGEOj0.js";
5
5
  import "./useBreadcrumbs-DIqU5AAp.js";
6
6
  import "./userAuthorized-klLUHGxT.js";
7
7
  import "./team_memberRoutes-Cxgte_vj.js";
8
- import "./teamRoutes-DxVWQDWU.js";
9
- import { t as TeamParent_default } from "./TeamParent-CObyDkrL.js";
8
+ import "./teamRoutes-CtNcFZjR.js";
9
+ import { t as TeamParent_default } from "./TeamParent-YPtenk3l.js";
10
10
 
11
11
  export { TeamParent_default as default };
@@ -1,6 +1,6 @@
1
1
  import { t as useQuery } from "./useQuery-BzUGEOj0.js";
2
2
  import { n as useBreadcrumbs } from "./useBreadcrumbs-DIqU5AAp.js";
3
- import { t as teamPaths } from "./teamRoutes-DxVWQDWU.js";
3
+ import { t as teamPaths } from "./teamRoutes-CtNcFZjR.js";
4
4
  import { computed, createBlock, createElementBlock, createElementVNode, defineComponent, openBlock, provide, resolveComponent, toDisplayString, unref } from "vue";
5
5
  import { useRoute } from "vue-router";
6
6
 
@@ -80,4 +80,4 @@ var TeamParent_default = _sfc_main;
80
80
 
81
81
  //#endregion
82
82
  export { TeamParent_default as t };
83
- //# sourceMappingURL=TeamParent-CObyDkrL.js.map
83
+ //# sourceMappingURL=TeamParent-YPtenk3l.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TeamParent-CObyDkrL.js","names":[],"sources":["../src/slices/team/TeamParent.vue"],"sourcesContent":["<template>\n <div v-if=\"isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ error.message }}</span>\n </div>\n\n <RouterView v-else :team=\"team\" :isLoading=\"isLoading\" :error=\"error\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { useBreadcrumbs } from '../../composables/useBreadcrumbs';\nimport { useQuery } from '../../composables/useQuery';\nimport { computed, provide } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { teamPaths } from './teamRoutes';\n\nconst route = useRoute();\nconst teamId = route.params.id as string;\n\n// Fetch team data once at parent level\nconst {\n data,\n loading: isLoading,\n error,\n refetch,\n} = useQuery((api) => api.teams.getTeam(teamId), {});\n\nconst team = computed(() => data.value ?? null);\n\n// Provide refresh function to child components\nconst refreshTeam = async () => {\n await refetch();\n};\n\nprovide('refreshTeam', refreshTeam);\n\n// Get current tab name from route meta\nconst currentTabLabel = computed(() => {\n const currentTab = route.meta.currentTab as string | undefined;\n if (!currentTab) return null;\n\n // Find the tab label from sectionTabs\n const sectionTabs = route.meta.sectionTabs as\n | Array<{ id: string; label: string }>\n | undefined;\n if (sectionTabs) {\n const tab = sectionTabs.find((t) => t.id === currentTab);\n return tab?.label || null;\n }\n return null;\n});\n\n// Manage breadcrumbs at parent level - watch route to ensure reactivity\n// Use segment mode to allow TeamMemberParent to append its own breadcrumbs\nuseBreadcrumbs(\n () => {\n // Access route params and meta to ensure reactivity to route changes\n const memberId = route.params.member_id;\n const currentTab = route.meta.currentTab as string | undefined;\n\n const breadcrumbs = [\n {\n label: 'Teams',\n to: { name: teamPaths.list.name },\n },\n {\n label:\n team.value?.display_name ||\n team.value?.unique_name ||\n team.value?.legal_name ||\n 'Team',\n loading: !team.value,\n to: {\n name: teamPaths.view.name,\n params: { id: teamId },\n },\n },\n ];\n\n // Add current tab if we're not on the main view tab and not viewing a member\n if (!memberId && currentTabLabel.value && currentTab !== 'view') {\n breadcrumbs.push({\n label: currentTabLabel.value,\n to: route as any, // Route object for current tab\n });\n }\n\n return breadcrumbs;\n },\n true, // Use segment mode for nested breadcrumbs\n);\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAgCA,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,MAAM,OAAO;EAG5B,MAAM,EACJ,MACA,SAAS,WACT,OACA,YACE,UAAU,QAAQ,IAAI,MAAM,QAAQ,OAAO,EAAE,EAAE,CAAC;EAEpD,MAAM,OAAO,eAAe,KAAK,SAAS,KAAK;EAG/C,MAAM,cAAc,YAAY;AAC9B,SAAM,SAAS;;AAGjB,UAAQ,eAAe,YAAY;EAGnC,MAAM,kBAAkB,eAAe;GACrC,MAAM,aAAa,MAAM,KAAK;AAC9B,OAAI,CAAC,WAAY,QAAO;GAGxB,MAAM,cAAc,MAAM,KAAK;AAG/B,OAAI,YAEF,QADY,YAAY,MAAM,MAAM,EAAE,OAAO,WAAW,EAC5C,SAAS;AAEvB,UAAO;IACP;AAIF,uBACQ;GAEJ,MAAM,WAAW,MAAM,OAAO;GAC9B,MAAM,aAAa,MAAM,KAAK;GAE9B,MAAM,cAAc,CAClB;IACE,OAAO;IACP,IAAI,EAAE,MAAM,UAAU,KAAK,MAAM;IAClC,EACD;IACE,OACE,KAAK,OAAO,gBACZ,KAAK,OAAO,eACZ,KAAK,OAAO,cACZ;IACF,SAAS,CAAC,KAAK;IACf,IAAI;KACF,MAAM,UAAU,KAAK;KACrB,QAAQ,EAAE,IAAI,QAAQ;KACvB;IACF,CACF;AAGD,OAAI,CAAC,YAAY,gBAAgB,SAAS,eAAe,OACvD,aAAY,KAAK;IACf,OAAO,gBAAgB;IACvB,IAAI;IACL,CAAC;AAGJ,UAAO;KAET,KACD;;;UAzGY,MAAA,UAAS,IAAA,WAAA,EAApB,mBAEM,OAFN,YAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAGlC,MAAA,MAAK,IAAA,WAAA,EAArB,mBAeM,OAfN,YAeM,CAAA,OAAA,OAAA,OAAA,KAdJ,mBAYM,OAAA;IAXJ,OAAM;IACN,OAAM;IACN,MAAK;IACL,SAAQ;OAER,mBAKE,QAAA;IAJA,kBAAe;IACf,mBAAgB;IAChB,gBAAa;IACb,GAAE;cAGN,mBAAgC,QAAA,MAAA,gBAAvB,MAAA,MAAK,CAAC,QAAO,EAAA,EAAA,CAAA,CAAA,KAAA,WAAA,EAGxB,YAAwE,uBAAA;;IAApD,MAAM,KAAA;IAAO,WAAW,MAAA,UAAS;IAAG,OAAO,MAAA,MAAK"}
1
+ {"version":3,"file":"TeamParent-YPtenk3l.js","names":[],"sources":["../src/slices/team/TeamParent.vue"],"sourcesContent":["<template>\n <div v-if=\"isLoading\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <div v-else-if=\"error\" class=\"alert alert-error mb-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{{ error.message }}</span>\n </div>\n\n <RouterView v-else :team=\"team\" :isLoading=\"isLoading\" :error=\"error\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { useBreadcrumbs } from '../../composables/useBreadcrumbs';\nimport { useQuery } from '../../composables/useQuery';\nimport { computed, provide } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { teamPaths } from './teamRoutes';\n\nconst route = useRoute();\nconst teamId = route.params.id as string;\n\n// Fetch team data once at parent level\nconst {\n data,\n loading: isLoading,\n error,\n refetch,\n} = useQuery((api) => api.teams.getTeam(teamId), {});\n\nconst team = computed(() => data.value ?? null);\n\n// Provide refresh function to child components\nconst refreshTeam = async () => {\n await refetch();\n};\n\nprovide('refreshTeam', refreshTeam);\n\n// Get current tab name from route meta\nconst currentTabLabel = computed(() => {\n const currentTab = route.meta.currentTab as string | undefined;\n if (!currentTab) return null;\n\n // Find the tab label from sectionTabs\n const sectionTabs = route.meta.sectionTabs as\n | Array<{ id: string; label: string }>\n | undefined;\n if (sectionTabs) {\n const tab = sectionTabs.find((t) => t.id === currentTab);\n return tab?.label || null;\n }\n return null;\n});\n\n// Manage breadcrumbs at parent level - watch route to ensure reactivity\n// Use segment mode to allow TeamMemberParent to append its own breadcrumbs\nuseBreadcrumbs(\n () => {\n // Access route params and meta to ensure reactivity to route changes\n const memberId = route.params.member_id;\n const currentTab = route.meta.currentTab as string | undefined;\n\n const breadcrumbs = [\n {\n label: 'Teams',\n to: { name: teamPaths.list.name },\n },\n {\n label:\n team.value?.display_name ||\n team.value?.unique_name ||\n team.value?.legal_name ||\n 'Team',\n loading: !team.value,\n to: {\n name: teamPaths.view.name,\n params: { id: teamId },\n },\n },\n ];\n\n // Add current tab if we're not on the main view tab and not viewing a member\n if (!memberId && currentTabLabel.value && currentTab !== 'view') {\n breadcrumbs.push({\n label: currentTabLabel.value,\n to: route as any, // Route object for current tab\n });\n }\n\n return breadcrumbs;\n },\n true, // Use segment mode for nested breadcrumbs\n);\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAgCA,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,MAAM,OAAO;EAG5B,MAAM,EACJ,MACA,SAAS,WACT,OACA,YACE,UAAU,QAAQ,IAAI,MAAM,QAAQ,OAAO,EAAE,EAAE,CAAC;EAEpD,MAAM,OAAO,eAAe,KAAK,SAAS,KAAK;EAG/C,MAAM,cAAc,YAAY;AAC9B,SAAM,SAAS;;AAGjB,UAAQ,eAAe,YAAY;EAGnC,MAAM,kBAAkB,eAAe;GACrC,MAAM,aAAa,MAAM,KAAK;AAC9B,OAAI,CAAC,WAAY,QAAO;GAGxB,MAAM,cAAc,MAAM,KAAK;AAG/B,OAAI,YAEF,QADY,YAAY,MAAM,MAAM,EAAE,OAAO,WAAW,EAC5C,SAAS;AAEvB,UAAO;IACP;AAIF,uBACQ;GAEJ,MAAM,WAAW,MAAM,OAAO;GAC9B,MAAM,aAAa,MAAM,KAAK;GAE9B,MAAM,cAAc,CAClB;IACE,OAAO;IACP,IAAI,EAAE,MAAM,UAAU,KAAK,MAAM;IAClC,EACD;IACE,OACE,KAAK,OAAO,gBACZ,KAAK,OAAO,eACZ,KAAK,OAAO,cACZ;IACF,SAAS,CAAC,KAAK;IACf,IAAI;KACF,MAAM,UAAU,KAAK;KACrB,QAAQ,EAAE,IAAI,QAAQ;KACvB;IACF,CACF;AAGD,OAAI,CAAC,YAAY,gBAAgB,SAAS,eAAe,OACvD,aAAY,KAAK;IACf,OAAO,gBAAgB;IACvB,IAAI;IACL,CAAC;AAGJ,UAAO;KAET,KACD;;;UAzGY,MAAA,UAAS,IAAA,WAAA,EAApB,mBAEM,OAFN,YAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAGlC,MAAA,MAAK,IAAA,WAAA,EAArB,mBAeM,OAfN,YAeM,CAAA,OAAA,OAAA,OAAA,KAdJ,mBAYM,OAAA;IAXJ,OAAM;IACN,OAAM;IACN,MAAK;IACL,SAAQ;OAER,mBAKE,QAAA;IAJA,kBAAe;IACf,mBAAgB;IAChB,gBAAa;IACb,GAAE;cAGN,mBAAgC,QAAA,MAAA,gBAAvB,MAAA,MAAK,CAAC,QAAO,EAAA,EAAA,CAAA,CAAA,KAAA,WAAA,EAGxB,YAAwE,uBAAA;;IAApD,MAAM,KAAA;IAAO,WAAW,MAAA,UAAS;IAAG,OAAO,MAAA,MAAK"}
@@ -511,4 +511,4 @@ var TimelineNoteInput_default = _sfc_main;
511
511
 
512
512
  //#endregion
513
513
  export { SupportTicketAttachmentsCollapsible_default as a, parseRecordVersions as i, MetadataField_default as n, ActionBannerAlert_default as r, TimelineNoteInput_default as t };
514
- //# sourceMappingURL=TimelineNoteInput--q4ENAgu.js.map
514
+ //# sourceMappingURL=TimelineNoteInput-DXZhcUkH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimelineNoteInput--q4ENAgu.js","names":["events: SystemEvent[]","collectedChanges: Array<{\n action: string;\n oldValue: string | null;\n newValue: string | null;\n fieldName: string;\n }>","map: Record<AlertVariant, string>","copyTimeoutId: ReturnType<typeof setTimeout> | null"],"sources":["../src/slices/support_ticket/shared/SupportTicketAttachmentsCollapsible.vue","../src/slices/support_ticket/utils/parseRecordVersions.ts","../src/slices/support_ticket/shared/ActionBannerAlert.vue","../src/slices/support_ticket/shared/MetadataField.vue","../src/slices/support_ticket/shared/timelineNoteFormMetadata.ts","../src/slices/support_ticket/shared/TimelineNoteInput.vue"],"sourcesContent":["<template>\n <div v-if=\"recordId\" class=\"w-full\">\n <div class=\"collapse collapse-arrow bg-base-200\">\n <input type=\"checkbox\" v-model=\"attachmentsExpanded\" />\n <div class=\"collapse-title text-sm font-medium px-4 py-2 min-h-0\">\n <div class=\"flex items-center gap-2\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\"\n />\n </svg>\n <span>Attachments ({{ attachmentsCount }})</span>\n </div>\n </div>\n <div class=\"collapse-content px-0\">\n <div class=\"px-4 pb-4\">\n <InlineAttachments\n :record-id=\"recordId\"\n :can-upload=\"editable && !locked\"\n :can-delete=\"editable && !locked\"\n @update:attachments-count=\"attachmentsCount = $event\"\n @uploaded=\"emit('uploaded')\"\n @deleted=\"emit('deleted')\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport InlineAttachments from './InlineAttachments.vue';\n\nconst attachmentsCount = ref(0);\n\ninterface Props {\n recordId: string;\n locked: boolean;\n editable: boolean;\n}\n\ndefineProps<Props>();\n\nconst emit = defineEmits<{ uploaded: []; deleted: [] }>();\n\nconst attachmentsExpanded = ref(false);\n</script>\n","import {\n supportTicketNumberToPriority,\n type RecordVersionReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { formatTicketDate } from './formatTicketDate';\n\nexport interface SystemEventChange {\n action: string;\n oldValue: string | null;\n newValue: string | null;\n fieldName?: string;\n}\n\nexport interface SystemEvent {\n id: string;\n timestamp: string;\n author: string;\n message: string;\n /** When set, used for structured display: action (italic) + type (badge) + details */\n action?: string;\n type?: string | null;\n details?: string | null;\n oldValue?: string | null;\n newValue?: string | null;\n fieldName?: string; // Field name that changed (for filtering)\n /** When multiple fields changed in same record version, grouped changes */\n changes?: SystemEventChange[];\n}\n\nconst SKIP_FIELDS = new Set(['updated_at', 'updated_by', 'id', 'display_id']);\n\n/** Fields that store user IDs - display names from lookup instead of raw IDs */\nconst USER_ID_FIELDS = new Set([\n 'assigned_to',\n 'created_by',\n 'updated_by',\n 'archived_by',\n 'deleted_by',\n]);\n\nfunction truncate(value: string, maxLength: number = 50): string {\n if (value.length <= maxLength) return value;\n return value.substring(0, maxLength) + '...';\n}\n\nfunction formatEnumValue(value: string): string {\n return value\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n}\n\nfunction formatFieldValue(\n fieldName: string,\n value: unknown,\n truncateLong: boolean = false,\n displayMap?: Map<string, string>,\n): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n return formatTicketDate(value).formatted;\n }\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n // User ID fields: display name from lookup when available\n if (typeof value === 'string' && USER_ID_FIELDS.has(fieldName) && displayMap) {\n return displayMap.get(value) ?? value;\n }\n // Priority: DB stores number (1-4), record_versions may have legacy string or new number\n if (fieldName === 'priority') {\n if (typeof value === 'number') {\n return formatEnumValue(supportTicketNumberToPriority(value));\n }\n if (typeof value === 'string') return formatEnumValue(value);\n }\n if (typeof value === 'string') {\n if (\n fieldName.includes('status') ||\n fieldName.includes('type') ||\n fieldName.includes('lifecycle')\n ) {\n return formatEnumValue(value);\n }\n // Truncate title and description\n if (truncateLong && (fieldName === 'title' || fieldName === 'description')) {\n return truncate(value);\n }\n }\n return String(value);\n}\n\nfunction generateActionMessage(\n fieldName: string,\n oldValue: unknown,\n newValue: unknown,\n): string {\n switch (fieldName) {\n case 'assigned_to':\n if (oldValue === null || oldValue === undefined) return 'assigned to';\n return 'reassigned to';\n case 'title':\n return 'changed the title';\n case 'description':\n return 'updated the description';\n case 'type':\n return 'changed type';\n case 'priority':\n return 'changed priority';\n case 'approval_status':\n return 'changed status';\n case 'dev_lifecycle':\n return 'moved';\n case 'credit_value':\n if (oldValue === null || oldValue === undefined) return 'set credits';\n return 'changed credits';\n case 'delivered_value':\n if (oldValue === null || oldValue === undefined) return 'set delivered value';\n return 'changed delivered value';\n case 'start_at':\n if (oldValue === null || oldValue === undefined) return 'set start date';\n if (newValue === null || newValue === undefined) return 'cleared start date';\n return 'changed start date';\n case 'target_at':\n if (oldValue === null || oldValue === undefined) return 'set target date';\n if (newValue === null || newValue === undefined) return 'cleared target date';\n return 'changed target date';\n case 'completed_at':\n if (oldValue === null || oldValue === undefined) return 'marked as completed';\n if (newValue === null || newValue === undefined) return 'cleared completed date';\n return 'changed completed date';\n case 'locked_approval_at':\n if (\n oldValue === null ||\n (oldValue === undefined && newValue !== null && newValue !== undefined)\n ) {\n return 'locked the ticket';\n }\n return 'changed lock status';\n case 'archived_at':\n if (\n oldValue === null ||\n (oldValue === undefined && newValue !== null && newValue !== undefined)\n ) {\n return 'archived the ticket';\n }\n if (\n oldValue !== null &&\n oldValue !== undefined &&\n (newValue === null || newValue === undefined)\n ) {\n return 'unarchived the ticket';\n }\n return 'changed archive status';\n case 'requester_email':\n return 'changed requester email';\n case 'requester_name':\n return 'changed requester name';\n case 'attachment_added':\n return 'added attachment';\n case 'attachment_removed':\n return 'removed attachment';\n default:\n return `updated ${fieldName.replace(/_/g, ' ')}`;\n }\n}\n\nfunction parseRecord(recordJson: string | null | undefined): Record<string, unknown> | null {\n if (!recordJson) return null;\n try {\n return JSON.parse(recordJson);\n } catch {\n return null;\n }\n}\n\nexport function parseRecordVersions(\n versions: RecordVersionReadDto[],\n displayMap?: Map<string, string>,\n): SystemEvent[] {\n const events: SystemEvent[] = [];\n\n for (const version of versions) {\n const author = version.auth_username || 'Unknown';\n const timestamp = version.recorded_at;\n\n if (version.operation === 'insert') {\n events.push({\n id: `${version.id}-insert`,\n timestamp,\n author,\n message: 'created this ticket',\n action: 'created',\n type: 'ticket',\n });\n continue;\n }\n\n if (version.operation === 'update') {\n const oldRecord = parseRecord(version.old_record);\n const newRecord = parseRecord(version.record);\n\n if (!oldRecord || !newRecord) continue;\n\n const collectedChanges: Array<{\n action: string;\n oldValue: string | null;\n newValue: string | null;\n fieldName: string;\n }> = [];\n\n for (const [fieldName, newValue] of Object.entries(newRecord)) {\n if (SKIP_FIELDS.has(fieldName)) continue;\n\n const oldValue = oldRecord[fieldName];\n\n if (oldValue !== newValue) {\n const oldFormatted =\n oldValue !== null && oldValue !== undefined\n ? formatFieldValue(fieldName, oldValue, true, displayMap)\n : null;\n const newFormatted =\n newValue !== null && newValue !== undefined\n ? formatFieldValue(fieldName, newValue, true, displayMap)\n : null;\n\n const actionMsg = generateActionMessage(fieldName, oldValue, newValue);\n\n collectedChanges.push({\n action: actionMsg,\n oldValue: oldFormatted || null,\n newValue: newFormatted || null,\n fieldName,\n });\n }\n }\n\n if (collectedChanges.length > 0) {\n const primaryChange = collectedChanges[0]!;\n const details =\n primaryChange.oldValue != null && primaryChange.newValue != null\n ? `${primaryChange.oldValue} → ${primaryChange.newValue}`\n : primaryChange.newValue ?? null;\n\n events.push({\n id: version.id,\n timestamp,\n author,\n message: primaryChange.action,\n action: collectedChanges.length === 1 ? primaryChange.action : 'updated',\n type: 'ticket',\n details: collectedChanges.length === 1 ? details : null,\n oldValue: collectedChanges.length === 1 ? primaryChange.oldValue : undefined,\n newValue: collectedChanges.length === 1 ? primaryChange.newValue : undefined,\n fieldName: collectedChanges.length === 1 ? primaryChange.fieldName : undefined,\n changes:\n collectedChanges.length > 1\n ? collectedChanges.map((c) => ({\n action: c.action,\n oldValue: c.oldValue,\n newValue: c.newValue,\n fieldName: c.fieldName,\n }))\n : undefined,\n });\n }\n }\n }\n\n events.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n return events;\n}\n","<template>\n <div\n role=\"alert\"\n :class=\"[\n 'py-3 px-4 w-full rounded-lg border border-base-300 border-l-4 bg-base-200/60',\n variantBorderClass,\n ]\"\n >\n <!-- Mobile-first: stack vertically on small screens, row on desktop -->\n <div\n class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-3\"\n >\n <div class=\"flex items-start gap-3 min-w-0\">\n <component :is=\"iconComponent\" v-if=\"icon\" class=\"shrink-0 w-5 h-5 opacity-90 mt-0.5\" />\n <span class=\"flex-1 min-w-0\">\n <slot />\n </span>\n </div>\n <div\n v-if=\"hasActions\"\n class=\"grid grid-cols-2 gap-2 sm:flex sm:flex-row sm:flex-wrap sm:ml-auto sm:shrink-0 sm:[&>*]:w-auto\"\n >\n <slot name=\"actions\" />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h } from 'vue';\n\ntype AlertVariant = 'warning' | 'success' | 'error' | 'info' | 'neutral';\ntype IconType = 'lock' | 'clock' | 'info' | 'archive';\n\ninterface Props {\n variant: AlertVariant;\n icon?: IconType;\n}\n\nconst props = defineProps<Props>();\n\nconst slots = useSlots();\n\nconst variantBorderClass = computed(() => {\n const map: Record<AlertVariant, string> = {\n warning: 'border-l-warning',\n success: 'border-l-success',\n error: 'border-l-error',\n info: 'border-l-info',\n neutral: 'border-l-base-content/30',\n };\n return map[props.variant];\n});\n\nconst hasActions = computed(() => {\n const actionsSlot = slots.actions;\n if (!actionsSlot) return false;\n const vnodes = actionsSlot();\n return !!vnodes?.length;\n});\n\nconst iconComponent = computed(() => {\n if (!props.icon) return null;\n const icons = {\n lock: () =>\n h(\n 'svg',\n {\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-5 h-5',\n },\n [\n h('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 ],\n ),\n clock: () =>\n h(\n 'svg',\n {\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-5 h-5',\n },\n [\n h('path', {\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n d: 'M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z',\n }),\n ],\n ),\n info: () =>\n h(\n 'svg',\n {\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-5 h-5',\n },\n [\n h('path', {\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n d: 'M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z',\n }),\n ],\n ),\n archive: () =>\n h(\n 'svg',\n {\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-5 h-5',\n },\n [\n h('path', {\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n d: 'M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z',\n }),\n ],\n ),\n };\n return icons[props.icon] ?? null;\n});\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <span class=\"text-xs font-semibold uppercase tracking-wide text-base-content/50 mb-0.5\">\n {{ label }}\n </span>\n <template v-if=\"hasContent\">\n <span\n v-if=\"copyable\"\n ref=\"valueRef\"\n role=\"button\"\n tabindex=\"0\"\n class=\"font-mono cursor-pointer select-all\"\n @click=\"handleCopy\"\n @keydown.enter=\"handleCopy\"\n @keydown.space.prevent=\"handleCopy\"\n >\n {{ copied ? 'Copied!' : undefined }}\n <template v-if=\"!copied\"><slot /></template>\n </span>\n <span v-else>\n <slot />\n </span>\n </template>\n <template v-else>\n <slot name=\"empty\">\n <span class=\"text-base-content/50 italic text-sm\">Not set</span>\n </slot>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Comment } from 'vue';\nimport { ref, computed, useSlots } from 'vue';\n\ninterface Props {\n label: string;\n copyable?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n copyable: false,\n});\n\nconst slots = useSlots();\nconst valueRef = ref<HTMLSpanElement | null>(null);\nconst copied = ref(false);\nlet copyTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\nconst hasContent = computed(() => {\n const defaultSlot = slots.default;\n if (!defaultSlot) return false;\n const vnodes = defaultSlot();\n if (!vnodes || !Array.isArray(vnodes)) return false;\n return vnodes.some((v) => v.type !== Comment);\n});\n\nasync function handleCopy() {\n if (!props.copyable) return;\n const text = valueRef.value?.textContent?.trim();\n if (!text) return;\n try {\n await navigator.clipboard.writeText(text);\n copied.value = true;\n if (copyTimeoutId) clearTimeout(copyTimeoutId);\n copyTimeoutId = setTimeout(() => {\n copied.value = false;\n copyTimeoutId = null;\n }, 1500);\n } catch {\n // ignore clipboard errors\n }\n}\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/** Schema for adding a comment/note on support ticket timeline. */\nconst TimelineNoteCreateSchema = z.object({\n body: z.string().min(1, 'Comment is required').trim(),\n is_internal: z.boolean().optional().default(false),\n});\n\nexport const timelineNoteCreateMetadata = withMetadata(\n TimelineNoteCreateSchema,\n 'timelineNoteCreateForm',\n {\n body: {\n label: 'Comment',\n placeholder: 'Add a comment...',\n inputType: 'textarea',\n },\n is_internal: {\n label: 'Internal Note',\n helpText: 'Internal notes are not visible to the customer',\n },\n },\n);\n\nexport type TimelineNoteCreateDto = z.infer<typeof TimelineNoteCreateSchema>;\n","<template>\n <div class=\"border-t border-base-200 pt-4 mt-4 w-full\">\n <template v-if=\"disabled\">\n <div class=\"bg-base-200/50 rounded-lg p-4 text-center\">\n <span class=\"text-base-content/50 text-sm inline-flex items-center gap-1.5\">\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\"\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 This ticket has been locked. You can no longer add comments.\n </span>\n </div>\n </template>\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <div ref=\"formWrapperRef\" class=\"grid grid-cols-1 gap-4 w-full\" @keydown=\"handleKeydown\">\n <p\n v-if=\"showTypeToggle\"\n class=\"col-span-full text-xs mb-1\"\n :class=\"form.values.is_internal ? 'text-warning' : 'text-info'\"\n >\n {{\n form.values.is_internal\n ? '🔒 Internal — not visible to customer'\n : 'Visible to customer'\n }}\n </p>\n <div class=\"col-span-full\">\n <zinia.BodyField class=\"textarea w-full\" />\n </div>\n <div class=\"col-span-full flex flex-wrap gap-2 justify-between items-center\">\n <div v-if=\"showTypeToggle\" class=\"join\">\n <button\n type=\"button\"\n :class=\"[\n 'btn btn-sm join-item',\n !form.values.is_internal ? 'btn-info btn-active' : '',\n ]\"\n :disabled=\"form.isSubmitting\"\n @click=\"form.setValue('is_internal', false)\"\n >\n Customer Note\n </button>\n <button\n type=\"button\"\n :class=\"[\n 'btn btn-sm join-item',\n form.values.is_internal ? 'btn-warning btn-active' : '',\n ]\"\n :disabled=\"form.isSubmitting\"\n @click=\"form.setValue('is_internal', true)\"\n >\n Internal Note\n </button>\n </div>\n <div v-else></div>\n <ZiniaSubmitButton submitText=\"Comment\" submittingText=\"Adding...\" />\n </div>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { ref, watch } from 'vue';\nimport { timelineNoteCreateMetadata } from './timelineNoteFormMetadata';\n\ninterface Props {\n showTypeToggle: boolean;\n disabled: boolean;\n /** When provided, noteType is controlled (e.g. synced with URL query param) */\n noteType?: 'customer' | 'internal';\n /** Called when form submits with validated data. Must return a Promise. */\n onSubmit: (payload: { content: string; noteType: 'customer' | 'internal' }) => Promise<void>;\n}\n\nconst props = defineProps<Props>();\nconst formWrapperRef = ref<HTMLElement | null>(null);\n\nconst emit = defineEmits<{\n 'update:noteType': [value: 'customer' | 'internal'];\n}>();\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton, refreshFormData } = useForm(\n timelineNoteCreateMetadata,\n {\n storeName: 'timeline-note-input',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => ({\n body: '',\n is_internal: props.noteType === 'internal',\n }),\n },\n);\n\n// Sync form's is_internal when controlled noteType prop changes (e.g. from URL)\nwatch(\n () => props.noteType,\n (noteType) => {\n if (noteType !== undefined) {\n form.setValue('is_internal', noteType === 'internal');\n }\n },\n { immediate: true },\n);\n\n// Emit when user toggles note type (for URL sync in StaffTimeline)\nwatch(\n () => form.values.is_internal,\n (isInternal) => {\n if (props.showTypeToggle) {\n emit('update:noteType', isInternal ? 'internal' : 'customer');\n }\n },\n);\n\nfunction handleKeydown(e: KeyboardEvent) {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n const form = formWrapperRef.value?.closest('form');\n form?.requestSubmit();\n }\n}\n\nasync function handleSubmit(formData: { body: string; is_internal: boolean }) {\n await props.onSubmit({\n content: (formData.body ?? '').trim(),\n noteType: props.showTypeToggle && formData.is_internal ? 'internal' : 'customer',\n });\n}\n\nfunction handleSuccess() {\n refreshFormData();\n (document.activeElement as HTMLElement)?.blur();\n}\n\nfunction handleError(_error: Error | unknown) {\n // Form displays errors via ZiniaFormErrorsSummary\n}\n\nfunction reset() {\n refreshFormData();\n}\n\ndefineExpose({ reset });\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TimelineNoteInput-DXZhcUkH.js","names":["events: SystemEvent[]","collectedChanges: Array<{\n action: string;\n oldValue: string | null;\n newValue: string | null;\n fieldName: string;\n }>","map: Record<AlertVariant, string>","copyTimeoutId: ReturnType<typeof setTimeout> | null"],"sources":["../src/slices/support_ticket/shared/SupportTicketAttachmentsCollapsible.vue","../src/slices/support_ticket/utils/parseRecordVersions.ts","../src/slices/support_ticket/shared/ActionBannerAlert.vue","../src/slices/support_ticket/shared/MetadataField.vue","../src/slices/support_ticket/shared/timelineNoteFormMetadata.ts","../src/slices/support_ticket/shared/TimelineNoteInput.vue"],"sourcesContent":["<template>\n <div v-if=\"recordId\" class=\"w-full\">\n <div class=\"collapse collapse-arrow bg-base-200\">\n <input type=\"checkbox\" v-model=\"attachmentsExpanded\" />\n <div class=\"collapse-title text-sm font-medium px-4 py-2 min-h-0\">\n <div class=\"flex items-center gap-2\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\"\n />\n </svg>\n <span>Attachments ({{ attachmentsCount }})</span>\n </div>\n </div>\n <div class=\"collapse-content px-0\">\n <div class=\"px-4 pb-4\">\n <InlineAttachments\n :record-id=\"recordId\"\n :can-upload=\"editable && !locked\"\n :can-delete=\"editable && !locked\"\n @update:attachments-count=\"attachmentsCount = $event\"\n @uploaded=\"emit('uploaded')\"\n @deleted=\"emit('deleted')\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport InlineAttachments from './InlineAttachments.vue';\n\nconst attachmentsCount = ref(0);\n\ninterface Props {\n recordId: string;\n locked: boolean;\n editable: boolean;\n}\n\ndefineProps<Props>();\n\nconst emit = defineEmits<{ uploaded: []; deleted: [] }>();\n\nconst attachmentsExpanded = ref(false);\n</script>\n","import {\n supportTicketNumberToPriority,\n type RecordVersionReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { formatTicketDate } from './formatTicketDate';\n\nexport interface SystemEventChange {\n action: string;\n oldValue: string | null;\n newValue: string | null;\n fieldName?: string;\n}\n\nexport interface SystemEvent {\n id: string;\n timestamp: string;\n author: string;\n message: string;\n /** When set, used for structured display: action (italic) + type (badge) + details */\n action?: string;\n type?: string | null;\n details?: string | null;\n oldValue?: string | null;\n newValue?: string | null;\n fieldName?: string; // Field name that changed (for filtering)\n /** When multiple fields changed in same record version, grouped changes */\n changes?: SystemEventChange[];\n}\n\nconst SKIP_FIELDS = new Set(['updated_at', 'updated_by', 'id', 'display_id']);\n\n/** Fields that store user IDs - display names from lookup instead of raw IDs */\nconst USER_ID_FIELDS = new Set([\n 'assigned_to',\n 'created_by',\n 'updated_by',\n 'archived_by',\n 'deleted_by',\n]);\n\nfunction truncate(value: string, maxLength: number = 50): string {\n if (value.length <= maxLength) return value;\n return value.substring(0, maxLength) + '...';\n}\n\nfunction formatEnumValue(value: string): string {\n return value\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n}\n\nfunction formatFieldValue(\n fieldName: string,\n value: unknown,\n truncateLong: boolean = false,\n displayMap?: Map<string, string>,\n): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n return formatTicketDate(value).formatted;\n }\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n // User ID fields: display name from lookup when available\n if (typeof value === 'string' && USER_ID_FIELDS.has(fieldName) && displayMap) {\n return displayMap.get(value) ?? value;\n }\n // Priority: DB stores number (1-4), record_versions may have legacy string or new number\n if (fieldName === 'priority') {\n if (typeof value === 'number') {\n return formatEnumValue(supportTicketNumberToPriority(value));\n }\n if (typeof value === 'string') return formatEnumValue(value);\n }\n if (typeof value === 'string') {\n if (\n fieldName.includes('status') ||\n fieldName.includes('type') ||\n fieldName.includes('lifecycle')\n ) {\n return formatEnumValue(value);\n }\n // Truncate title and description\n if (truncateLong && (fieldName === 'title' || fieldName === 'description')) {\n return truncate(value);\n }\n }\n return String(value);\n}\n\nfunction generateActionMessage(\n fieldName: string,\n oldValue: unknown,\n newValue: unknown,\n): string {\n switch (fieldName) {\n case 'assigned_to':\n if (oldValue === null || oldValue === undefined) return 'assigned to';\n return 'reassigned to';\n case 'title':\n return 'changed the title';\n case 'description':\n return 'updated the description';\n case 'type':\n return 'changed type';\n case 'priority':\n return 'changed priority';\n case 'approval_status':\n return 'changed status';\n case 'dev_lifecycle':\n return 'moved';\n case 'credit_value':\n if (oldValue === null || oldValue === undefined) return 'set credits';\n return 'changed credits';\n case 'delivered_value':\n if (oldValue === null || oldValue === undefined) return 'set delivered value';\n return 'changed delivered value';\n case 'start_at':\n if (oldValue === null || oldValue === undefined) return 'set start date';\n if (newValue === null || newValue === undefined) return 'cleared start date';\n return 'changed start date';\n case 'target_at':\n if (oldValue === null || oldValue === undefined) return 'set target date';\n if (newValue === null || newValue === undefined) return 'cleared target date';\n return 'changed target date';\n case 'completed_at':\n if (oldValue === null || oldValue === undefined) return 'marked as completed';\n if (newValue === null || newValue === undefined) return 'cleared completed date';\n return 'changed completed date';\n case 'locked_approval_at':\n if (\n oldValue === null ||\n (oldValue === undefined && newValue !== null && newValue !== undefined)\n ) {\n return 'locked the ticket';\n }\n return 'changed lock status';\n case 'archived_at':\n if (\n oldValue === null ||\n (oldValue === undefined && newValue !== null && newValue !== undefined)\n ) {\n return 'archived the ticket';\n }\n if (\n oldValue !== null &&\n oldValue !== undefined &&\n (newValue === null || newValue === undefined)\n ) {\n return 'unarchived the ticket';\n }\n return 'changed archive status';\n case 'requester_email':\n return 'changed requester email';\n case 'requester_name':\n return 'changed requester name';\n case 'attachment_added':\n return 'added attachment';\n case 'attachment_removed':\n return 'removed attachment';\n default:\n return `updated ${fieldName.replace(/_/g, ' ')}`;\n }\n}\n\nfunction parseRecord(recordJson: string | null | undefined): Record<string, unknown> | null {\n if (!recordJson) return null;\n try {\n return JSON.parse(recordJson);\n } catch {\n return null;\n }\n}\n\nexport function parseRecordVersions(\n versions: RecordVersionReadDto[],\n displayMap?: Map<string, string>,\n): SystemEvent[] {\n const events: SystemEvent[] = [];\n\n for (const version of versions) {\n const author = version.auth_username || 'Unknown';\n const timestamp = version.recorded_at;\n\n if (version.operation === 'insert') {\n events.push({\n id: `${version.id}-insert`,\n timestamp,\n author,\n message: 'created this ticket',\n action: 'created',\n type: 'ticket',\n });\n continue;\n }\n\n if (version.operation === 'update') {\n const oldRecord = parseRecord(version.old_record);\n const newRecord = parseRecord(version.record);\n\n if (!oldRecord || !newRecord) continue;\n\n const collectedChanges: Array<{\n action: string;\n oldValue: string | null;\n newValue: string | null;\n fieldName: string;\n }> = [];\n\n for (const [fieldName, newValue] of Object.entries(newRecord)) {\n if (SKIP_FIELDS.has(fieldName)) continue;\n\n const oldValue = oldRecord[fieldName];\n\n if (oldValue !== newValue) {\n const oldFormatted =\n oldValue !== null && oldValue !== undefined\n ? formatFieldValue(fieldName, oldValue, true, displayMap)\n : null;\n const newFormatted =\n newValue !== null && newValue !== undefined\n ? formatFieldValue(fieldName, newValue, true, displayMap)\n : null;\n\n const actionMsg = generateActionMessage(fieldName, oldValue, newValue);\n\n collectedChanges.push({\n action: actionMsg,\n oldValue: oldFormatted || null,\n newValue: newFormatted || null,\n fieldName,\n });\n }\n }\n\n if (collectedChanges.length > 0) {\n const primaryChange = collectedChanges[0]!;\n const details =\n primaryChange.oldValue != null && primaryChange.newValue != null\n ? `${primaryChange.oldValue} → ${primaryChange.newValue}`\n : primaryChange.newValue ?? null;\n\n events.push({\n id: version.id,\n timestamp,\n author,\n message: primaryChange.action,\n action: collectedChanges.length === 1 ? primaryChange.action : 'updated',\n type: 'ticket',\n details: collectedChanges.length === 1 ? details : null,\n oldValue: collectedChanges.length === 1 ? primaryChange.oldValue : undefined,\n newValue: collectedChanges.length === 1 ? primaryChange.newValue : undefined,\n fieldName: collectedChanges.length === 1 ? primaryChange.fieldName : undefined,\n changes:\n collectedChanges.length > 1\n ? collectedChanges.map((c) => ({\n action: c.action,\n oldValue: c.oldValue,\n newValue: c.newValue,\n fieldName: c.fieldName,\n }))\n : undefined,\n });\n }\n }\n }\n\n events.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n return events;\n}\n","<template>\n <div\n role=\"alert\"\n :class=\"[\n 'py-3 px-4 w-full rounded-lg border border-base-300 border-l-4 bg-base-200/60',\n variantBorderClass,\n ]\"\n >\n <!-- Mobile-first: stack vertically on small screens, row on desktop -->\n <div\n class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-3\"\n >\n <div class=\"flex items-start gap-3 min-w-0\">\n <component :is=\"iconComponent\" v-if=\"icon\" class=\"shrink-0 w-5 h-5 opacity-90 mt-0.5\" />\n <span class=\"flex-1 min-w-0\">\n <slot />\n </span>\n </div>\n <div\n v-if=\"hasActions\"\n class=\"grid grid-cols-2 gap-2 sm:flex sm:flex-row sm:flex-wrap sm:ml-auto sm:shrink-0 sm:[&>*]:w-auto\"\n >\n <slot name=\"actions\" />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h } from 'vue';\n\ntype AlertVariant = 'warning' | 'success' | 'error' | 'info' | 'neutral';\ntype IconType = 'lock' | 'clock' | 'info' | 'archive';\n\ninterface Props {\n variant: AlertVariant;\n icon?: IconType;\n}\n\nconst props = defineProps<Props>();\n\nconst slots = useSlots();\n\nconst variantBorderClass = computed(() => {\n const map: Record<AlertVariant, string> = {\n warning: 'border-l-warning',\n success: 'border-l-success',\n error: 'border-l-error',\n info: 'border-l-info',\n neutral: 'border-l-base-content/30',\n };\n return map[props.variant];\n});\n\nconst hasActions = computed(() => {\n const actionsSlot = slots.actions;\n if (!actionsSlot) return false;\n const vnodes = actionsSlot();\n return !!vnodes?.length;\n});\n\nconst iconComponent = computed(() => {\n if (!props.icon) return null;\n const icons = {\n lock: () =>\n h(\n 'svg',\n {\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-5 h-5',\n },\n [\n h('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 ],\n ),\n clock: () =>\n h(\n 'svg',\n {\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-5 h-5',\n },\n [\n h('path', {\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n d: 'M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z',\n }),\n ],\n ),\n info: () =>\n h(\n 'svg',\n {\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-5 h-5',\n },\n [\n h('path', {\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n d: 'M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z',\n }),\n ],\n ),\n archive: () =>\n h(\n 'svg',\n {\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-5 h-5',\n },\n [\n h('path', {\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n d: 'M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z',\n }),\n ],\n ),\n };\n return icons[props.icon] ?? null;\n});\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <span class=\"text-xs font-semibold uppercase tracking-wide text-base-content/50 mb-0.5\">\n {{ label }}\n </span>\n <template v-if=\"hasContent\">\n <span\n v-if=\"copyable\"\n ref=\"valueRef\"\n role=\"button\"\n tabindex=\"0\"\n class=\"font-mono cursor-pointer select-all\"\n @click=\"handleCopy\"\n @keydown.enter=\"handleCopy\"\n @keydown.space.prevent=\"handleCopy\"\n >\n {{ copied ? 'Copied!' : undefined }}\n <template v-if=\"!copied\"><slot /></template>\n </span>\n <span v-else>\n <slot />\n </span>\n </template>\n <template v-else>\n <slot name=\"empty\">\n <span class=\"text-base-content/50 italic text-sm\">Not set</span>\n </slot>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Comment } from 'vue';\nimport { ref, computed, useSlots } from 'vue';\n\ninterface Props {\n label: string;\n copyable?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n copyable: false,\n});\n\nconst slots = useSlots();\nconst valueRef = ref<HTMLSpanElement | null>(null);\nconst copied = ref(false);\nlet copyTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\nconst hasContent = computed(() => {\n const defaultSlot = slots.default;\n if (!defaultSlot) return false;\n const vnodes = defaultSlot();\n if (!vnodes || !Array.isArray(vnodes)) return false;\n return vnodes.some((v) => v.type !== Comment);\n});\n\nasync function handleCopy() {\n if (!props.copyable) return;\n const text = valueRef.value?.textContent?.trim();\n if (!text) return;\n try {\n await navigator.clipboard.writeText(text);\n copied.value = true;\n if (copyTimeoutId) clearTimeout(copyTimeoutId);\n copyTimeoutId = setTimeout(() => {\n copied.value = false;\n copyTimeoutId = null;\n }, 1500);\n } catch {\n // ignore clipboard errors\n }\n}\n</script>\n","import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/** Schema for adding a comment/note on support ticket timeline. */\nconst TimelineNoteCreateSchema = z.object({\n body: z.string().min(1, 'Comment is required').trim(),\n is_internal: z.boolean().optional().default(false),\n});\n\nexport const timelineNoteCreateMetadata = withMetadata(\n TimelineNoteCreateSchema,\n 'timelineNoteCreateForm',\n {\n body: {\n label: 'Comment',\n placeholder: 'Add a comment...',\n inputType: 'textarea',\n },\n is_internal: {\n label: 'Internal Note',\n helpText: 'Internal notes are not visible to the customer',\n },\n },\n);\n\nexport type TimelineNoteCreateDto = z.infer<typeof TimelineNoteCreateSchema>;\n","<template>\n <div class=\"border-t border-base-200 pt-4 mt-4 w-full\">\n <template v-if=\"disabled\">\n <div class=\"bg-base-200/50 rounded-lg p-4 text-center\">\n <span class=\"text-base-content/50 text-sm inline-flex items-center gap-1.5\">\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\"\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 This ticket has been locked. You can no longer add comments.\n </span>\n </div>\n </template>\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <div ref=\"formWrapperRef\" class=\"grid grid-cols-1 gap-4 w-full\" @keydown=\"handleKeydown\">\n <p\n v-if=\"showTypeToggle\"\n class=\"col-span-full text-xs mb-1\"\n :class=\"form.values.is_internal ? 'text-warning' : 'text-info'\"\n >\n {{\n form.values.is_internal\n ? '🔒 Internal — not visible to customer'\n : 'Visible to customer'\n }}\n </p>\n <div class=\"col-span-full\">\n <zinia.BodyField class=\"textarea w-full\" />\n </div>\n <div class=\"col-span-full flex flex-wrap gap-2 justify-between items-center\">\n <div v-if=\"showTypeToggle\" class=\"join\">\n <button\n type=\"button\"\n :class=\"[\n 'btn btn-sm join-item',\n !form.values.is_internal ? 'btn-info btn-active' : '',\n ]\"\n :disabled=\"form.isSubmitting\"\n @click=\"form.setValue('is_internal', false)\"\n >\n Customer Note\n </button>\n <button\n type=\"button\"\n :class=\"[\n 'btn btn-sm join-item',\n form.values.is_internal ? 'btn-warning btn-active' : '',\n ]\"\n :disabled=\"form.isSubmitting\"\n @click=\"form.setValue('is_internal', true)\"\n >\n Internal Note\n </button>\n </div>\n <div v-else></div>\n <ZiniaSubmitButton submitText=\"Comment\" submittingText=\"Adding...\" />\n </div>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { ref, watch } from 'vue';\nimport { timelineNoteCreateMetadata } from './timelineNoteFormMetadata';\n\ninterface Props {\n showTypeToggle: boolean;\n disabled: boolean;\n /** When provided, noteType is controlled (e.g. synced with URL query param) */\n noteType?: 'customer' | 'internal';\n /** Called when form submits with validated data. Must return a Promise. */\n onSubmit: (payload: { content: string; noteType: 'customer' | 'internal' }) => Promise<void>;\n}\n\nconst props = defineProps<Props>();\nconst formWrapperRef = ref<HTMLElement | null>(null);\n\nconst emit = defineEmits<{\n 'update:noteType': [value: 'customer' | 'internal'];\n}>();\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton, refreshFormData } = useForm(\n timelineNoteCreateMetadata,\n {\n storeName: 'timeline-note-input',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => ({\n body: '',\n is_internal: props.noteType === 'internal',\n }),\n },\n);\n\n// Sync form's is_internal when controlled noteType prop changes (e.g. from URL)\nwatch(\n () => props.noteType,\n (noteType) => {\n if (noteType !== undefined) {\n form.setValue('is_internal', noteType === 'internal');\n }\n },\n { immediate: true },\n);\n\n// Emit when user toggles note type (for URL sync in StaffTimeline)\nwatch(\n () => form.values.is_internal,\n (isInternal) => {\n if (props.showTypeToggle) {\n emit('update:noteType', isInternal ? 'internal' : 'customer');\n }\n },\n);\n\nfunction handleKeydown(e: KeyboardEvent) {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n const form = formWrapperRef.value?.closest('form');\n form?.requestSubmit();\n }\n}\n\nasync function handleSubmit(formData: { body: string; is_internal: boolean }) {\n await props.onSubmit({\n content: (formData.body ?? '').trim(),\n noteType: props.showTypeToggle && formData.is_internal ? 'internal' : 'customer',\n });\n}\n\nfunction handleSuccess() {\n refreshFormData();\n (document.activeElement as HTMLElement)?.blur();\n}\n\nfunction handleError(_error: Error | unknown) {\n // Form displays errors via ZiniaFormErrorsSummary\n}\n\nfunction reset() {\n refreshFormData();\n}\n\ndefineExpose({ reset });\n</script>\n"],"mappings":"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"}