@dragonmastery/dragoncore-vue 0.0.20 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/{ChangePasswordPage-DBXchGfn.js → ChangePasswordPage--3XwluwE.js} +2 -2
  2. package/dist/{ChangePasswordPage-DBXchGfn.js.map → ChangePasswordPage--3XwluwE.js.map} +1 -1
  3. package/dist/ChangePasswordPage-CpDPmEml.js +6 -0
  4. package/dist/{ConsentRequired-qMNT-U2T.js → ConsentRequired-C4IRMA0c.js} +26 -17
  5. package/dist/ConsentRequired-C4IRMA0c.js.map +1 -0
  6. package/dist/CreateTeamForm-B4cIuYAf.js +35 -0
  7. package/dist/CreateTeamMemberForm-Chrw1y00.js +35 -0
  8. package/dist/{CreateUserPage-B0iHLsm5.js → CreateUserPage-DLwXeLAq.js} +2 -2
  9. package/dist/{CreateUserPage-B0iHLsm5.js.map → CreateUserPage-DLwXeLAq.js.map} +1 -1
  10. package/dist/CreateUserPage-WruMs7WP.js +6 -0
  11. package/dist/CreditBalanceDashboard-CkcsrZ_e.js +35 -0
  12. package/dist/CreditManagement-Ddvu9dMw.js +35 -0
  13. package/dist/CustomerCreateSupportTicketForm-BKperKGS.js +35 -0
  14. package/dist/{CustomerSupportTicketDetailPage-DyJTKtLU.js → CustomerSupportTicketDetailPage-BdyaKG1v.js} +7 -7
  15. package/dist/{CustomerSupportTicketDetailPage-DyJTKtLU.js.map → CustomerSupportTicketDetailPage-BdyaKG1v.js.map} +1 -1
  16. package/dist/CustomerSupportTicketList-DcbrjDa9.js +35 -0
  17. package/dist/CustomerSupportTicketParent-BeNzUwuP.js +7 -0
  18. package/dist/{CustomerSupportTicketParent-CldxkQ75.js → CustomerSupportTicketParent-HIxwSVdu.js} +2 -2
  19. package/dist/{CustomerSupportTicketParent-CldxkQ75.js.map → CustomerSupportTicketParent-HIxwSVdu.js.map} +1 -1
  20. package/dist/CustomerSupportTicketSuccess-CC967u3y.js +35 -0
  21. package/dist/EditTeamForm-B5Tee5wL.js +35 -0
  22. package/dist/{EditTeamMemberForm-CiNb4nNG.js → EditTeamMemberForm-CaS2GLjV.js} +2 -2
  23. package/dist/{EditTeamMemberForm-CiNb4nNG.js.map → EditTeamMemberForm-CaS2GLjV.js.map} +1 -1
  24. package/dist/EditTeamMemberForm-OtcS8QWt.js +6 -0
  25. package/dist/{EditUserPage-DpV3dm-c.js → EditUserPage-DURc5rmi.js} +3 -3
  26. package/dist/{EditUserPage-DpV3dm-c.js.map → EditUserPage-DURc5rmi.js.map} +1 -1
  27. package/dist/EditUserPage-T4DQlKhf.js +7 -0
  28. package/dist/ForgotPassword-CUifhmqP.js +7 -0
  29. package/dist/{ForgotPassword-roKwDfce.js → ForgotPassword-OjIPi9s9.js} +2 -2
  30. package/dist/{ForgotPassword-roKwDfce.js.map → ForgotPassword-OjIPi9s9.js.map} +1 -1
  31. package/dist/{LoginForm-BGDymDnO.js → LoginForm-9UFnA-fO.js} +49 -47
  32. package/dist/LoginForm-9UFnA-fO.js.map +1 -0
  33. package/dist/LoginForm-Bg7GoZEA.js +7 -0
  34. package/dist/Logout-Bs92csWH.js +7 -0
  35. package/dist/{Logout-Cbw1SacV.js → Logout-YgTgOFUH.js} +3 -3
  36. package/dist/{Logout-Cbw1SacV.js.map → Logout-YgTgOFUH.js.map} +1 -1
  37. package/dist/MfaSetup-BACX5XP-.js +8 -0
  38. package/dist/{MfaSetup-CwYXnvgW.js → MfaSetup-RtFMY_dj.js} +3 -3
  39. package/dist/{MfaSetup-CwYXnvgW.js.map → MfaSetup-RtFMY_dj.js.map} +1 -1
  40. package/dist/{MfaVerify-CIlen2i5.js → MfaVerify-Cvhe8bEM.js} +4 -4
  41. package/dist/{MfaVerify-CIlen2i5.js.map → MfaVerify-Cvhe8bEM.js.map} +1 -1
  42. package/dist/MfaVerify-ak4iSdQ2.js +8 -0
  43. package/dist/{ResetPassword-BgKyXQ4q.js → ResetPassword-BE4mXK9q.js} +2 -2
  44. package/dist/{ResetPassword-BgKyXQ4q.js.map → ResetPassword-BE4mXK9q.js.map} +1 -1
  45. package/dist/ResetPassword-pY1uhTdl.js +7 -0
  46. package/dist/{SavedFiltersPage-BlzfWkaj.js → SavedFiltersPage-DQt6uc8m.js} +27 -26
  47. package/dist/{SavedFiltersPage-BlzfWkaj.js.map → SavedFiltersPage-DQt6uc8m.js.map} +1 -1
  48. package/dist/{Signup-qBqsSYVz.js → Signup-9TjMMnU4.js} +23 -32
  49. package/dist/Signup-9TjMMnU4.js.map +1 -0
  50. package/dist/Signup-Bq-G3D-s.js +9 -0
  51. package/dist/{SignupConsentFlow-DG2IGikE.js → SignupConsentFlow-QUZGKjdB.js} +59 -33
  52. package/dist/SignupConsentFlow-QUZGKjdB.js.map +1 -0
  53. package/dist/{SignupRequirementsPage-DnLpQfB8.js → SignupRequirementsPage-DfbYmpQD.js} +5 -5
  54. package/dist/{SignupRequirementsPage-DnLpQfB8.js.map → SignupRequirementsPage-DfbYmpQD.js.map} +1 -1
  55. package/dist/StaffCreateSupportTicketForm-D0ZuisDk.js +35 -0
  56. package/dist/{StaffSupportTicketDetailPage-D0SjH36N.js → StaffSupportTicketDetailPage-DQdfh6H1.js} +7 -7
  57. package/dist/{StaffSupportTicketDetailPage-D0SjH36N.js.map → StaffSupportTicketDetailPage-DQdfh6H1.js.map} +1 -1
  58. package/dist/StaffSupportTicketList-CiqC05XB.js +35 -0
  59. package/dist/{StaffSupportTicketParent-Dk6RFRMt.js → StaffSupportTicketParent-CilR4RGM.js} +2 -2
  60. package/dist/{StaffSupportTicketParent-Dk6RFRMt.js.map → StaffSupportTicketParent-CilR4RGM.js.map} +1 -1
  61. package/dist/StaffSupportTicketParent-DkV329NI.js +7 -0
  62. package/dist/StaffSupportTicketSuccess-CUYnimaI.js +35 -0
  63. package/dist/{SupportStaffPage-DFcgP8iE.js → SupportStaffPage-KKugAnFm.js} +5 -5
  64. package/dist/{SupportStaffPage-DFcgP8iE.js.map → SupportStaffPage-KKugAnFm.js.map} +1 -1
  65. package/dist/{SupportTicketMaintenancePage-BCW0eZxV.js → SupportTicketMaintenancePage-smItdkrD.js} +4 -4
  66. package/dist/{SupportTicketMaintenancePage-BCW0eZxV.js.map → SupportTicketMaintenancePage-smItdkrD.js.map} +1 -1
  67. package/dist/TeamAttachmentsTab-DUtCD1Yi.js +35 -0
  68. package/dist/TeamHistoryTab-BsUoH4VK.js +4 -0
  69. package/dist/{TeamHistoryTab-PVS8A-6K.js → TeamHistoryTab-D5biUPmq.js} +2 -2
  70. package/dist/{TeamHistoryTab-PVS8A-6K.js.map → TeamHistoryTab-D5biUPmq.js.map} +1 -1
  71. package/dist/TeamList-BkPIqZ8V.js +35 -0
  72. package/dist/TeamMemberList-1mxUGCNa.js +35 -0
  73. package/dist/TeamMemberParent-DzeBIElY.js +35 -0
  74. package/dist/{TeamNotesTab-D7ELC1EW.js → TeamNotesTab-BzGZZ1h8.js} +4 -4
  75. package/dist/{TeamNotesTab-D7ELC1EW.js.map → TeamNotesTab-BzGZZ1h8.js.map} +1 -1
  76. package/dist/TeamNotesTab-ClHl2nXd.js +7 -0
  77. package/dist/TeamParent-DJa9UZTP.js +35 -0
  78. package/dist/{TimelineNoteInput-D-NjzUiF.js → TimelineNoteInput-0p-M4Qie.js} +2 -2
  79. package/dist/{TimelineNoteInput-D-NjzUiF.js.map → TimelineNoteInput-0p-M4Qie.js.map} +1 -1
  80. package/dist/{TimelineSystemEvent-Cc6HMeO3.js → TimelineSystemEvent-BHzFr46C.js} +4 -4
  81. package/dist/{TimelineSystemEvent-Cc6HMeO3.js.map → TimelineSystemEvent-BHzFr46C.js.map} +1 -1
  82. package/dist/UserListPage-BTLE4J0s.js +4 -0
  83. package/dist/{UserListPage-DdJFeLP1.js → UserListPage-DUE5gJTo.js} +2 -2
  84. package/dist/{UserListPage-DdJFeLP1.js.map → UserListPage-DUE5gJTo.js.map} +1 -1
  85. package/dist/{UserProfilePage-BhCxv0N9.js → UserProfilePage-C3b93Keh.js} +4 -4
  86. package/dist/{UserProfilePage-BhCxv0N9.js.map → UserProfilePage-C3b93Keh.js.map} +1 -1
  87. package/dist/UserProfilePage-CVTORtSx.js +7 -0
  88. package/dist/VerifyEmail-DCP4DWIw.js +9 -0
  89. package/dist/VerifyEmail-DlOmWGG-.js +257 -0
  90. package/dist/VerifyEmail-DlOmWGG-.js.map +1 -0
  91. package/dist/ViewTeam-DVfnLMhV.js +35 -0
  92. package/dist/ViewTeamMember-L4v3gCIn.js +35 -0
  93. package/dist/index.d.ts +703 -705
  94. package/dist/index.js +26 -25
  95. package/dist/{mfaSchema-s-T8m-7-.js → mfaSchema-BnRWf0ma.js} +1 -1
  96. package/dist/{mfaSchema-s-T8m-7-.js.map → mfaSchema-BnRWf0ma.js.map} +1 -1
  97. package/dist/{src--FuqlDhU.js → src-QZJyMfGX.js} +82 -67
  98. package/dist/src-QZJyMfGX.js.map +1 -0
  99. package/dist/useEmailVerificationChannel-BNi926Ho.js +37 -0
  100. package/dist/useEmailVerificationChannel-BNi926Ho.js.map +1 -0
  101. package/dist/{useMutation-Dhx2gMgS.js → useMutation-BTsyHKyn.js} +3 -3
  102. package/dist/{useMutation-Dhx2gMgS.js.map → useMutation-BTsyHKyn.js.map} +1 -1
  103. package/dist/{useQuery-DxmMxM8z.js → useQuery-BggIE52P.js} +3 -3
  104. package/dist/{useQuery-DxmMxM8z.js.map → useQuery-BggIE52P.js.map} +1 -1
  105. package/dist/{useQueryCache-CJKZquh6.js → useQueryCache-Bjm-S8v5.js} +2 -2
  106. package/dist/{useQueryCache-CJKZquh6.js.map → useQueryCache-Bjm-S8v5.js.map} +1 -1
  107. package/dist/{useRpcAuth-Bse-lggK.js → useRpcAuth-rmHf7bYx.js} +40 -1
  108. package/dist/useRpcAuth-rmHf7bYx.js.map +1 -0
  109. package/package.json +2 -2
  110. package/dist/ChangePasswordPage-Re323roR.js +0 -6
  111. package/dist/ConsentRequired-qMNT-U2T.js.map +0 -1
  112. package/dist/CreateTeamForm-DXN1hoJh.js +0 -34
  113. package/dist/CreateTeamMemberForm-CLHT1HN_.js +0 -34
  114. package/dist/CreateUserPage-C8107z_O.js +0 -6
  115. package/dist/CreditBalanceDashboard-D7MFKfh6.js +0 -34
  116. package/dist/CreditManagement-A8hVPoSp.js +0 -34
  117. package/dist/CustomerCreateSupportTicketForm-B8JQNC1I.js +0 -34
  118. package/dist/CustomerSupportTicketList-DR-UfcGr.js +0 -34
  119. package/dist/CustomerSupportTicketParent-C-KzT4qQ.js +0 -7
  120. package/dist/CustomerSupportTicketSuccess-SBdIcS-_.js +0 -34
  121. package/dist/EditTeamForm-BDQkhBbx.js +0 -34
  122. package/dist/EditTeamMemberForm-CBxFLoIy.js +0 -6
  123. package/dist/EditUserPage-BWKrAKZZ.js +0 -7
  124. package/dist/ForgotPassword-D3OQqbrD.js +0 -7
  125. package/dist/LoginForm-BGDymDnO.js.map +0 -1
  126. package/dist/LoginForm-C97dUsU3.js +0 -7
  127. package/dist/Logout-DY3iorah.js +0 -7
  128. package/dist/MfaSetup-DAQV8MhP.js +0 -8
  129. package/dist/MfaVerify-D-_oX6gL.js +0 -8
  130. package/dist/ResetPassword-CkPqUFbq.js +0 -7
  131. package/dist/Signup-C2FshPnc.js +0 -8
  132. package/dist/Signup-qBqsSYVz.js.map +0 -1
  133. package/dist/SignupConsentFlow-DG2IGikE.js.map +0 -1
  134. package/dist/StaffCreateSupportTicketForm-BrGB7tqD.js +0 -34
  135. package/dist/StaffSupportTicketList-HA4NlkKE.js +0 -34
  136. package/dist/StaffSupportTicketParent-BTbpNdfc.js +0 -7
  137. package/dist/StaffSupportTicketSuccess-CTeMG_iK.js +0 -34
  138. package/dist/TeamAttachmentsTab-IaRtuF55.js +0 -34
  139. package/dist/TeamHistoryTab-DWcVhkwC.js +0 -4
  140. package/dist/TeamList-BNo_ime8.js +0 -34
  141. package/dist/TeamMemberList-DJKYxfsx.js +0 -34
  142. package/dist/TeamMemberParent-Bk6dqXsh.js +0 -34
  143. package/dist/TeamNotesTab-JRWYpqRJ.js +0 -7
  144. package/dist/TeamParent-TSWT_0bK.js +0 -34
  145. package/dist/UserListPage-BjHbDpvC.js +0 -4
  146. package/dist/UserProfilePage-BxIMig4s.js +0 -7
  147. package/dist/VerifyEmail-BYSYk5ef.js +0 -7
  148. package/dist/VerifyEmail-DXYcjCX4.js +0 -176
  149. package/dist/VerifyEmail-DXYcjCX4.js.map +0 -1
  150. package/dist/VerifyEmailRequired-DeMYFS0I.js +0 -89
  151. package/dist/VerifyEmailRequired-DeMYFS0I.js.map +0 -1
  152. package/dist/ViewTeam-DIxy437n.js +0 -34
  153. package/dist/ViewTeamMember-DIaIqfbX.js +0 -34
  154. package/dist/src--FuqlDhU.js.map +0 -1
  155. package/dist/useRpcAuth-Bse-lggK.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerSupportTicketDetailPage-DyJTKtLU.js","names":["$emit","items: TimelineItem[]"],"sources":["../src/slices/support_ticket/customer/components/CustomerActionBanner.vue","../src/slices/support_ticket/customer/components/CustomerMetadataCard.vue","../src/slices/support_ticket/customer/components/CustomerSupportTicketSubscribeControl.vue","../src/slices/support_ticket/customer/customerMetadataCardEditFormMetadata.ts","../src/slices/support_ticket/customer/components/CustomerMetadataCardEdit.vue","../src/slices/support_ticket/customer/components/CustomerTimeline.vue","../src/slices/support_ticket/customer/CustomerSupportTicketDetailPage.vue"],"sourcesContent":["<template>\n <ActionBannerAlert v-if=\"isArchived\" variant=\"neutral\" icon=\"archive\">\n This ticket is archived. Comments, edits, and attachments are locked for both customer and staff.\n </ActionBannerAlert>\n <ActionBannerAlert v-else-if=\"isApproved\" variant=\"success\" icon=\"lock\">\n This ticket was approved on {{ lockedDateFormatted }}.\n </ActionBannerAlert>\n <ActionBannerAlert v-else-if=\"isRejected\" variant=\"error\" icon=\"lock\">\n This ticket was rejected on {{ lockedDateFormatted }}.\n </ActionBannerAlert>\n</template>\n\n<script setup lang=\"ts\">\nimport type { CustomerSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\nimport { formatTicketDate } from '../../utils/formatTicketDate';\nimport ActionBannerAlert from '../../shared/ActionBannerAlert.vue';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n}\n\nconst props = defineProps<Props>();\n\nconst isArchived = computed(() => !!props.ticket.archived_at);\n\nconst isApproved = computed(() => {\n const t = props.ticket;\n return !!t.is_locked && !!t.locked_approval_at && t.status !== 'CANCELLED';\n});\n\nconst isRejected = computed(() => {\n const t = props.ticket;\n return !!t.is_locked && !!t.locked_approval_at && t.status === 'CANCELLED';\n});\n\nconst lockedDateFormatted = computed(() => {\n const at = props.ticket.locked_approval_at;\n if (!at) return '';\n return formatTicketDate(at).formatted;\n});\n</script>\n","<template>\n <div class=\"border border-base-200 rounded-lg p-4 md:p-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3\">\n <MetadataField label=\"Status\">\n <SupportTicketApprovalBadge\n :approval-status=\"displayApprovalStatus\"\n size=\"sm\"\n />\n </MetadataField>\n <MetadataField label=\"Type\">\n <SupportTicketTypeBadge :type=\"ticket.type\" size=\"sm\" />\n </MetadataField>\n <MetadataField label=\"Priority\">\n <SupportTicketPriorityBadge :priority=\"ticket.priority\" size=\"sm\" />\n </MetadataField>\n <MetadataField label=\"Requester\">\n {{ ticket.created_by_display_name }}\n </MetadataField>\n <div class=\"md:col-span-2\">\n <MetadataField label=\"Description\">\n <p v-if=\"ticket.description?.trim()\" class=\"whitespace-pre-wrap text-sm\">\n {{ ticket.description }}\n </p>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">No description provided</span>\n </template>\n </MetadataField>\n </div>\n <MetadataField label=\"Ticket ID\" :copyable=\"true\">\n {{ ticketDisplayId }}\n </MetadataField>\n <MetadataField label=\"Created\">\n {{ createdFormatted }}\n <span v-if=\"createdRelative\" class=\"text-base-content/50\">· {{ createdRelative }}</span>\n </MetadataField>\n <template v-if=\"showCredits\">\n <MetadataField label=\"Credits\">\n {{ creditDisplay }}\n </MetadataField>\n </template>\n <template v-if=\"ticket.target_at\">\n <MetadataField label=\"Target\">\n {{ targetFormatted }}\n <span class=\"text-base-content/50\">· {{ targetRelative }}</span>\n </MetadataField>\n </template>\n <template v-if=\"ticket.completed_at\">\n <MetadataField label=\"Completed\">\n {{ completedFormatted }}\n <span class=\"text-base-content/50\">· {{ completedRelative }}</span>\n </MetadataField>\n </template>\n </div>\n <div v-if=\"canEdit\" class=\"flex justify-end gap-2 mt-4\">\n <button type=\"button\" class=\"btn btn-sm\" @click=\"$emit('edit')\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { CustomerSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport type { SupportTicketApproval } from '@dragonmastery/dragoncore-shared';\nimport MetadataField from '../../shared/MetadataField.vue';\nimport SupportTicketApprovalBadge from '../../shared/SupportTicketApprovalBadge.vue';\nimport SupportTicketTypeBadge from '../../shared/SupportTicketTypeBadge.vue';\nimport SupportTicketPriorityBadge from '../../shared/SupportTicketPriorityBadge.vue';\nimport { formatTicketDate } from '../../utils/formatTicketDate';\nimport { formatTicketDisplayId } from '../../utils/displayIdFormatter';\nimport { formatCustomerCreditValue } from '../../utils/creditValueFormatter';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n}\n\ndefineEmits<{ edit: [] }>();\n\nconst props = defineProps<Props>();\n\nconst canEdit = computed(() => !props.ticket.is_locked && !props.ticket.archived_at);\n\nconst displayApprovalStatus = computed((): SupportTicketApproval => {\n const s = props.ticket.status;\n if (s === 'PENDING') return 'PENDING';\n if (s === 'CANCELLED') return 'REJECTED';\n return 'APPROVED';\n});\n\nconst ticketDisplayId = computed(() =>\n formatTicketDisplayId(\n props.ticket.display_id,\n props.ticket.display_id_prefix,\n props.ticket.id,\n ),\n);\n\nconst createdFormatted = computed(() => {\n const at = props.ticket.created_at;\n return at ? formatTicketDate(at).formatted : '';\n});\nconst createdRelative = computed(() => {\n const at = props.ticket.created_at;\n return at ? formatTicketDate(at).relative : '';\n});\n\nconst showCredits = computed(() => {\n return !!props.ticket.is_locked && !!props.ticket.locked_approval_at;\n});\n\nconst creditDisplay = computed(() => formatCustomerCreditValue(props.ticket.credit_value));\n\nconst targetFormatted = computed(() =>\n props.ticket.target_at ? formatTicketDate(props.ticket.target_at!).formatted : '',\n);\nconst targetRelative = computed(() =>\n props.ticket.target_at ? formatTicketDate(props.ticket.target_at!).relative : '',\n);\n\nconst completedFormatted = computed(() =>\n props.ticket.completed_at ? formatTicketDate(props.ticket.completed_at!).formatted : '',\n);\nconst completedRelative = computed(() =>\n props.ticket.completed_at ? formatTicketDate(props.ticket.completed_at!).relative : '',\n);\n</script>\n","<template>\n <div\n v-if=\"ticket\"\n class=\"flex flex-wrap items-center justify-between gap-3 rounded-lg border border-base-200 bg-base-200/30 px-4 py-3\"\n >\n <div class=\"flex items-center gap-3 min-w-0\">\n <div\n class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg\"\n :class=\"\n isSubscribed ? 'bg-info/20 text-info' : 'bg-base-300 text-base-content/60'\n \"\n >\n <!-- Bell (subscribed) -->\n <svg\n v-if=\"isSubscribed\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\"\n />\n </svg>\n <!-- Bell with slash (unsubscribed) -->\n <svg\n v-else\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M9.143 17.082a24.248 24.248 0 0 0 3.844.148m-3.844-.148a23.856 23.856 0 0 1-5.455-1.31 8.964 8.964 0 0 0 2.3-5.542m3.155 6.852a3 3 0 0 0 5.667 1.97m1.965-2.277L21 21m-4.225-4.225a23.81 23.81 0 0 0 3.536-1.003A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6.53 6.53m10.245 10.245L6.53 6.53M3 3l3.53 3.53\"\n />\n </svg>\n </div>\n <p class=\"text-sm text-base-content/80 min-w-0\">\n {{\n isSubscribed\n ? 'You will receive notifications for updates.'\n : 'Get notified when there are updates or new comments.'\n }}\n </p>\n <button\n type=\"button\"\n :class=\"[\n 'btn btn-sm shrink-0 font-medium',\n isSubscribed ? 'btn-outline' : 'btn-info',\n ]\"\n :disabled=\"isToggling\"\n @click=\"handleToggle\"\n >\n <span v-if=\"isToggling\" class=\"loading loading-spinner loading-xs\"></span>\n <span v-else>{{ isSubscribed ? 'Unsubscribe' : 'Subscribe' }}</span>\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n CustomerSupportTicketReadDto,\n DragoncoreApi,\n} from '@dragonmastery/dragoncore-shared';\nimport { computed, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n}\n\nconst props = defineProps<Props>();\n\nconst isToggling = ref(false);\n// Local override after toggle - avoids full-page refetch\nconst subscriptionOverride = ref<boolean | null>(null);\n\nwatch(\n () => props.ticket.id,\n () => {\n subscriptionOverride.value = null;\n },\n);\n\nconst isSubscribed = computed(\n () => subscriptionOverride.value ?? props.ticket.my_subscription != null,\n);\n\nconst { mutate: toggleSubscription } = useMutation<\n DragoncoreApi,\n string,\n { subscribed: boolean }\n>((api, id) => api.supportTickets.toggleSubscription(id), {\n invalidate: /^support-tickets?:/,\n});\n\nasync function handleToggle() {\n try {\n isToggling.value = true;\n const result = await toggleSubscription(props.ticket.id);\n subscriptionOverride.value = result.subscribed;\n toast.success(\n result.subscribed\n ? 'You are now subscribed to this ticket'\n : 'You have unsubscribed from this ticket',\n );\n } catch (e) {\n toast.error(extractRpcErrorMessage(e, 'Failed to update subscription'));\n } finally {\n isToggling.value = false;\n }\n}\n</script>\n","import {\n CustomerSupportTicketUpdateSchema,\n SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n} from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\nexport type CustomerMetadataCardEditFormDto = z.infer<typeof CustomerSupportTicketUpdateSchema>;\n\nexport const customerMetadataCardEditFormMetadata = withMetadata(\n CustomerSupportTicketUpdateSchema,\n 'customerMetadataCardEditForm',\n {\n title: {\n label: 'Title',\n placeholder: 'Enter ticket title',\n },\n description: {\n label: 'Description',\n inputType: 'textarea',\n placeholder: 'Describe the ticket in detail',\n },\n type: { label: 'Type' },\n priority: {\n label: 'Priority',\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n },\n);\n","<template>\n <div class=\"border border-base-200 rounded-lg p-4 md:p-6\">\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Title - full width -->\n <div class=\"form-control md:col-span-2\">\n <zinia.TitleField placeholder=\"Enter ticket title\" />\n </div>\n\n <!-- Description - full width -->\n <div class=\"form-control md:col-span-2\">\n <zinia.DescriptionField class=\"w-full\" placeholder=\"Describe the ticket in detail\" />\n </div>\n\n <!-- Type -->\n <div class=\"form-control\">\n <zinia.TypeField />\n </div>\n\n <!-- Priority -->\n <div class=\"form-control\">\n <zinia.PriorityField />\n </div>\n </div>\n\n <div v-if=\"form.submitError\" class=\"alert alert-error py-2 mt-4\">\n <span class=\"text-sm\">{{ form.submitError }}</span>\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n\n <!-- Action Buttons -->\n <div class=\"flex justify-end gap-2 mt-4\">\n <button type=\"button\" class=\"btn btn-ghost\" @click=\"handleCancel\" :disabled=\"saving\">\n Cancel\n </button>\n <ZiniaSubmitButton submitText=\"Save\" submittingText=\"Saving...\" />\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n supportTicketPriorityToNumber,\n type CustomerSupportTicketReadDto,\n type CustomerSupportTicketUpdateDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed } from 'vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { customerMetadataCardEditFormMetadata } from '../customerMetadataCardEditFormMetadata';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n saving?: boolean;\n}\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n success: [];\n cancel: [];\n}>();\n\nconst { mutate: updateTicket, loading: isSaving } = useMutation(\n (api, input: CustomerSupportTicketUpdateDto) => api.supportTickets.updateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst saving = computed(() => props.saving ?? isSaving.value);\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton, ZiniaFormErrorsSummary } = useForm(\n customerMetadataCardEditFormMetadata,\n {\n storeName: `customer-metadata-card-edit-${props.ticket.id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n const t = props.ticket;\n return {\n id: t.id,\n title: t.title || '',\n description: t.description ?? '',\n type: t.type,\n priority: supportTicketPriorityToNumber(t.priority),\n };\n },\n },\n);\n\nfunction buildPayload(formData: Record<string, unknown>): CustomerSupportTicketUpdateDto {\n return {\n id: props.ticket.id,\n title: String(formData.title ?? '').trim(),\n description: (formData.description as string) || '',\n type: formData.type as CustomerSupportTicketUpdateDto['type'],\n priority: formData.priority as CustomerSupportTicketUpdateDto['priority'],\n };\n}\n\nasync function handleSubmit(formData: Record<string, unknown>) {\n const payload = buildPayload(formData);\n await updateTicket(payload);\n return undefined;\n}\n\nfunction handleSuccess() {\n emit('success');\n}\n\nfunction handleError(error: Error | unknown) {\n const message = extractRpcErrorMessage(error, 'Failed to update ticket');\n form.setSubmitError(message);\n}\n\nfunction handleCancel() {\n emit('cancel');\n}\n</script>\n","<template>\n <div class=\"flex flex-col gap-4 w-full\">\n <TimelineNoteInput\n ref=\"noteInputRef\"\n :show-type-toggle=\"false\"\n :disabled=\"commentsLocked ?? false\"\n :on-submit=\"onAddNote\"\n />\n <p\n v-if=\"mergedTimelineItems.length === 0\"\n class=\"text-base-content/50 text-sm text-center py-8\"\n >\n No activity yet.\n </p>\n <template v-for=\"item in mergedTimelineItems\" :key=\"item.id\">\n <TimelineItem\n v-if=\"item.type === 'customer-note'\"\n :author-name=\"item.data.authorName\"\n :created-at=\"item.data.createdAt\"\n variant=\"customer\"\n >\n {{ item.data.body ?? '' }}\n </TimelineItem>\n <TimelineSystemEvent\n v-else-if=\"item.type === 'system-event'\"\n :author=\"item.data.author\"\n :message=\"item.data.message\"\n :timestamp=\"item.data.timestamp\"\n :action=\"item.data.action\"\n :type=\"item.data.type\"\n :details=\"item.data.details\"\n :old-value=\"item.data.oldValue\"\n :new-value=\"item.data.newValue\"\n :changes=\"item.data.changes\"\n />\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { CustomerSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, ref } from 'vue';\nimport type { SystemEvent } from '../../utils/parseRecordVersions';\nimport TimelineItem from '../../shared/TimelineItem.vue';\nimport TimelineNoteInput from '../../shared/TimelineNoteInput.vue';\nimport TimelineSystemEvent from '../../shared/TimelineSystemEvent.vue';\n\nexport interface CustomerNoteDto {\n authorName: string;\n createdAt: string;\n body: string;\n}\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n notes: CustomerNoteDto[];\n systemEvents: SystemEvent[];\n /** Locks comments - only when archived (customers can add comments until archived) */\n commentsLocked?: boolean;\n /** Called when user submits a note. Must return a Promise. */\n onAddNote: (payload: {\n content: string;\n noteType: 'customer' | 'internal';\n }) => Promise<void>;\n}\n\nconst props = defineProps<Props>();\n\nconst noteInputRef = ref<InstanceType<typeof TimelineNoteInput> | null>(null);\n\ntype TimelineItem =\n | { type: 'customer-note'; timestamp: string; id: string; data: CustomerNoteDto }\n | { type: 'system-event'; timestamp: string; id: string; data: SystemEvent };\n\nconst mergedTimelineItems = computed((): TimelineItem[] => {\n const items: TimelineItem[] = [];\n\n for (const note of props.notes ?? []) {\n items.push({\n type: 'customer-note',\n timestamp: note.createdAt,\n id: `note-${note.createdAt}-${note.authorName}`,\n data: note,\n });\n }\n\n for (const event of props.systemEvents ?? []) {\n items.push({\n type: 'system-event',\n timestamp: event.timestamp,\n id: event.id,\n data: event,\n });\n }\n\n items.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n return items;\n});\n\nfunction resetInput() {\n noteInputRef.value?.reset();\n}\n\ndefineExpose({ resetInput });\n</script>\n","<template>\n <!-- Loading State (only on initial load; refetch keeps content visible) -->\n <div v-if=\"isLoading && !ticket\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error mb-4 max-w-4xl mx-auto px-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 <div class=\"flex-1\">\n <span>{{ error.message || 'An error occurred' }}</span>\n <div class=\"mt-2\">\n <router-link :to=\"{ name: 'CustomerSupportTicketList' }\" class=\"link link-primary\">\n Go back to ticket list\n </router-link>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div v-else-if=\"ticket\" class=\"px-4 py-6 max-w-4xl mx-auto\">\n <!-- Header -->\n <div class=\"mb-6\">\n <h1 class=\"text-2xl font-bold text-base-content break-words leading-tight mt-2\">\n {{ ticket.title }}\n </h1>\n </div>\n\n <!-- Action Banner -->\n <div class=\"mb-6\">\n <CustomerActionBanner :ticket=\"ticket\" />\n </div>\n\n <!-- Subscribe / Unsubscribe -->\n <div class=\"mb-6\">\n <CustomerSupportTicketSubscribeControl :ticket=\"ticket\" />\n </div>\n\n <!-- Metadata Card (Display or Edit) -->\n <div class=\"mb-8\">\n <CustomerMetadataCard v-if=\"!isEditMode\" :ticket=\"ticket\" @edit=\"enterEditMode\" />\n <CustomerMetadataCardEdit\n v-else\n :ticket=\"ticket\"\n @success=\"handleMetadataSaveSuccess\"\n @cancel=\"exitEditMode\"\n />\n </div>\n\n <!-- Attachments (separate from timeline so adding a comment doesn't cause refetch) -->\n <div class=\"mb-8\">\n <SupportTicketAttachmentsCollapsible\n :record-id=\"ticket.id\"\n :locked=\"isCommentsLocked\"\n :editable=\"!isCommentsLocked\"\n @uploaded=\"refetchTimeline\"\n @deleted=\"refetchTimeline\"\n />\n </div>\n\n <!-- Timeline: stay mounted once we have data so adding a comment doesn't unmount/remount -->\n <div>\n <CustomerTimeline\n v-if=\"timelineData != null\"\n :ticket=\"ticket\"\n :notes=\"customerNotesForTimeline\"\n :system-events=\"filteredSystemEvents\"\n :comments-locked=\"isCommentsLocked\"\n :on-add-note=\"handleAddNote\"\n />\n <div v-else-if=\"timelineError\" class=\"alert alert-error mb-4\">\n <span>{{ timelineError?.message ?? 'Failed to load timeline' }}</span>\n <button class=\"btn btn-sm btn-outline mt-2\" @click=\"refetchTimeline\">\n Retry\n </button>\n </div>\n <div v-else class=\"flex justify-center items-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { CustomerSupportTicketReadDto, NoteCreateDto } from '@dragonmastery/dragoncore-shared';\nimport { OPERATORS, RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { computed, inject, nextTick } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { BATCH_MODE } from '../../../composables/useRpcAuth';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useQuery } from '../../../composables/useQuery';\nimport SupportTicketAttachmentsCollapsible from '../shared/SupportTicketAttachmentsCollapsible.vue';\nimport { parseRecordVersions, type SystemEvent } from '../utils/parseRecordVersions';\nimport CustomerActionBanner from './components/CustomerActionBanner.vue';\nimport CustomerMetadataCard from './components/CustomerMetadataCard.vue';\nimport CustomerSupportTicketSubscribeControl from './components/CustomerSupportTicketSubscribeControl.vue';\nimport CustomerMetadataCardEdit from './components/CustomerMetadataCardEdit.vue';\nimport CustomerTimeline from './components/CustomerTimeline.vue';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\nconst support_ticket_id = route.params.id as string;\n\n// Edit mode state\nconst isEditMode = computed(() => route.query.mode === 'edit');\n\n// Get refresh function from parent\nconst refreshTicket = inject<(() => Promise<void>) | undefined>('refreshTicket');\n\n// Comments locked only when archived (customers can add comments until archived)\nconst isCommentsLocked = computed(() => {\n if (!props.ticket) return false;\n return !!props.ticket.archived_at;\n});\n\n// Fetch customer notes and record versions in a single batched request\nconst {\n data: timelineData,\n error: timelineError,\n refetch: refetchTimeline,\n} = useQuery(\n async (api) => {\n const [customerNotes, recordVersions] = await Promise.all([\n api.notes.getNotes({\n record_id: { operator: OPERATORS.EQUALS, value: support_ticket_id },\n record_type: { operator: OPERATORS.EQUALS, value: 'support_ticket' },\n is_internal: { operator: OPERATORS.EQUALS, value: false },\n first: 100,\n sortBy: 'created_at',\n sortDirection: 'asc',\n }),\n api.recordVersions.listRecordVersionsCustomer(\n support_ticket_id,\n RecordConst.SUPPORT_TICKET, // legacy; record_types in filters takes priority\n {\n record_types: [RecordConst.SUPPORT_TICKET, RecordConst.SUPPORT_TICKET_ACTIVITY],\n first: 100,\n sortBy: 'recorded_at',\n sortDirection: 'asc',\n },\n ),\n ]);\n return { customerNotes, recordVersions };\n },\n {\n enabled: !!support_ticket_id && !!props.ticket,\n batchMode: BATCH_MODE.batch,\n trackedSegment: 'customer-support-ticket-timeline',\n },\n);\n\n// Map notes for timeline\ninterface CustomerNoteForTimeline {\n authorName: string;\n createdAt: string;\n body: string;\n}\n\nconst customerNotesForTimeline = computed((): CustomerNoteForTimeline[] => {\n const items = timelineData.value?.customerNotes?.items ?? [];\n return items\n .map((n) => ({\n authorName: n.created_by_display_name ?? n.created_by ?? '(unknown)',\n createdAt: n.created_at,\n body: n.body ?? '',\n }))\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n});\n\n// Parse and filter system events for customer visibility (merged by API from record_types)\nconst allSystemEvents = computed(() => {\n const data = timelineData.value?.recordVersions;\n const versions = data?.items ?? [];\n const userDisplayMap = data?.user_display_map;\n const displayMap = userDisplayMap ? new Map(Object.entries(userDisplayMap)) : undefined;\n return parseRecordVersions(versions, displayMap);\n});\n\n// Filter out staff-only system events\nconst filteredSystemEvents = computed((): SystemEvent[] => {\n if (!props.ticket) return [];\n\n const events = allSystemEvents.value;\n const isPending = props.ticket.status === 'PENDING' || !props.ticket.is_locked;\n\n // Staff-only fields that customers should never see\n const STAFF_ONLY_FIELDS = new Set(['dev_lifecycle', 'delivered_value', 'start_at']);\n\n return events.filter((event) => {\n // Filter by field name if available\n if (event.fieldName) {\n // Always filter out staff-only fields\n if (STAFF_ONLY_FIELDS.has(event.fieldName)) {\n return false;\n }\n\n // Filter credit_value changes when ticket is still pending\n if (isPending && event.fieldName === 'credit_value') {\n return false;\n }\n\n return true;\n }\n\n // Fallback to message-based filtering if fieldName not available\n const message = event.message.toLowerCase();\n\n // Always filter out dev_lifecycle, delivered_value, start_at\n if (\n message.includes('dev lifecycle') ||\n message.includes('moved') ||\n message.includes('delivered value') ||\n message.includes('start date')\n ) {\n return false;\n }\n\n // Filter credit_value changes when ticket is still pending\n if (isPending && (message.includes('credits') || message.includes('credit'))) {\n return false;\n }\n\n // Allow all other events (type, priority, status, target date, completed date, etc.)\n return true;\n });\n});\n\n// Note creation mutation\nconst { mutate: createNote } = useMutation(\n (api, input: NoteCreateDto) => api.notes.createNote(input),\n { invalidate: /^notes?:/ },\n);\n\n// Handle note creation\nasync function handleAddNote(payload: {\n content: string;\n noteType: 'customer' | 'internal';\n}) {\n try {\n await createNote({\n record_id: support_ticket_id,\n record_type: 'support_ticket' as const,\n body: payload.content,\n tag: null,\n is_internal: false,\n });\n await refetchTimeline();\n toast.success('Comment added');\n } catch {\n toast.error('Failed to add comment');\n throw new Error('Failed to add comment');\n }\n}\n\n// Enter edit mode\nfunction enterEditMode() {\n router.push({\n name: route.name || 'CustomerViewSupportTicket',\n params: route.params,\n query: { ...route.query, mode: 'edit' },\n });\n}\n\n// Exit edit mode\nasync function exitEditMode() {\n await router.push({\n name: route.name || 'CustomerViewSupportTicket',\n params: route.params,\n query: { ...route.query, mode: undefined },\n });\n}\n\n// Handle metadata save success (form does mutation; we refresh and exit)\nasync function handleMetadataSaveSuccess() {\n await exitEditMode();\n await nextTick();\n toast.success('Ticket updated successfully');\n if (refreshTicket) {\n await refreshTicket();\n }\n await refetchTimeline();\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CustomerSupportTicketDetailPage-BdyaKG1v.js","names":["$emit","items: TimelineItem[]"],"sources":["../src/slices/support_ticket/customer/components/CustomerActionBanner.vue","../src/slices/support_ticket/customer/components/CustomerMetadataCard.vue","../src/slices/support_ticket/customer/components/CustomerSupportTicketSubscribeControl.vue","../src/slices/support_ticket/customer/customerMetadataCardEditFormMetadata.ts","../src/slices/support_ticket/customer/components/CustomerMetadataCardEdit.vue","../src/slices/support_ticket/customer/components/CustomerTimeline.vue","../src/slices/support_ticket/customer/CustomerSupportTicketDetailPage.vue"],"sourcesContent":["<template>\n <ActionBannerAlert v-if=\"isArchived\" variant=\"neutral\" icon=\"archive\">\n This ticket is archived. Comments, edits, and attachments are locked for both customer and staff.\n </ActionBannerAlert>\n <ActionBannerAlert v-else-if=\"isApproved\" variant=\"success\" icon=\"lock\">\n This ticket was approved on {{ lockedDateFormatted }}.\n </ActionBannerAlert>\n <ActionBannerAlert v-else-if=\"isRejected\" variant=\"error\" icon=\"lock\">\n This ticket was rejected on {{ lockedDateFormatted }}.\n </ActionBannerAlert>\n</template>\n\n<script setup lang=\"ts\">\nimport type { CustomerSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed } from 'vue';\nimport { formatTicketDate } from '../../utils/formatTicketDate';\nimport ActionBannerAlert from '../../shared/ActionBannerAlert.vue';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n}\n\nconst props = defineProps<Props>();\n\nconst isArchived = computed(() => !!props.ticket.archived_at);\n\nconst isApproved = computed(() => {\n const t = props.ticket;\n return !!t.is_locked && !!t.locked_approval_at && t.status !== 'CANCELLED';\n});\n\nconst isRejected = computed(() => {\n const t = props.ticket;\n return !!t.is_locked && !!t.locked_approval_at && t.status === 'CANCELLED';\n});\n\nconst lockedDateFormatted = computed(() => {\n const at = props.ticket.locked_approval_at;\n if (!at) return '';\n return formatTicketDate(at).formatted;\n});\n</script>\n","<template>\n <div class=\"border border-base-200 rounded-lg p-4 md:p-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3\">\n <MetadataField label=\"Status\">\n <SupportTicketApprovalBadge\n :approval-status=\"displayApprovalStatus\"\n size=\"sm\"\n />\n </MetadataField>\n <MetadataField label=\"Type\">\n <SupportTicketTypeBadge :type=\"ticket.type\" size=\"sm\" />\n </MetadataField>\n <MetadataField label=\"Priority\">\n <SupportTicketPriorityBadge :priority=\"ticket.priority\" size=\"sm\" />\n </MetadataField>\n <MetadataField label=\"Requester\">\n {{ ticket.created_by_display_name }}\n </MetadataField>\n <div class=\"md:col-span-2\">\n <MetadataField label=\"Description\">\n <p v-if=\"ticket.description?.trim()\" class=\"whitespace-pre-wrap text-sm\">\n {{ ticket.description }}\n </p>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">No description provided</span>\n </template>\n </MetadataField>\n </div>\n <MetadataField label=\"Ticket ID\" :copyable=\"true\">\n {{ ticketDisplayId }}\n </MetadataField>\n <MetadataField label=\"Created\">\n {{ createdFormatted }}\n <span v-if=\"createdRelative\" class=\"text-base-content/50\">· {{ createdRelative }}</span>\n </MetadataField>\n <template v-if=\"showCredits\">\n <MetadataField label=\"Credits\">\n {{ creditDisplay }}\n </MetadataField>\n </template>\n <template v-if=\"ticket.target_at\">\n <MetadataField label=\"Target\">\n {{ targetFormatted }}\n <span class=\"text-base-content/50\">· {{ targetRelative }}</span>\n </MetadataField>\n </template>\n <template v-if=\"ticket.completed_at\">\n <MetadataField label=\"Completed\">\n {{ completedFormatted }}\n <span class=\"text-base-content/50\">· {{ completedRelative }}</span>\n </MetadataField>\n </template>\n </div>\n <div v-if=\"canEdit\" class=\"flex justify-end gap-2 mt-4\">\n <button type=\"button\" class=\"btn btn-sm\" @click=\"$emit('edit')\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { CustomerSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport type { SupportTicketApproval } from '@dragonmastery/dragoncore-shared';\nimport MetadataField from '../../shared/MetadataField.vue';\nimport SupportTicketApprovalBadge from '../../shared/SupportTicketApprovalBadge.vue';\nimport SupportTicketTypeBadge from '../../shared/SupportTicketTypeBadge.vue';\nimport SupportTicketPriorityBadge from '../../shared/SupportTicketPriorityBadge.vue';\nimport { formatTicketDate } from '../../utils/formatTicketDate';\nimport { formatTicketDisplayId } from '../../utils/displayIdFormatter';\nimport { formatCustomerCreditValue } from '../../utils/creditValueFormatter';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n}\n\ndefineEmits<{ edit: [] }>();\n\nconst props = defineProps<Props>();\n\nconst canEdit = computed(() => !props.ticket.is_locked && !props.ticket.archived_at);\n\nconst displayApprovalStatus = computed((): SupportTicketApproval => {\n const s = props.ticket.status;\n if (s === 'PENDING') return 'PENDING';\n if (s === 'CANCELLED') return 'REJECTED';\n return 'APPROVED';\n});\n\nconst ticketDisplayId = computed(() =>\n formatTicketDisplayId(\n props.ticket.display_id,\n props.ticket.display_id_prefix,\n props.ticket.id,\n ),\n);\n\nconst createdFormatted = computed(() => {\n const at = props.ticket.created_at;\n return at ? formatTicketDate(at).formatted : '';\n});\nconst createdRelative = computed(() => {\n const at = props.ticket.created_at;\n return at ? formatTicketDate(at).relative : '';\n});\n\nconst showCredits = computed(() => {\n return !!props.ticket.is_locked && !!props.ticket.locked_approval_at;\n});\n\nconst creditDisplay = computed(() => formatCustomerCreditValue(props.ticket.credit_value));\n\nconst targetFormatted = computed(() =>\n props.ticket.target_at ? formatTicketDate(props.ticket.target_at!).formatted : '',\n);\nconst targetRelative = computed(() =>\n props.ticket.target_at ? formatTicketDate(props.ticket.target_at!).relative : '',\n);\n\nconst completedFormatted = computed(() =>\n props.ticket.completed_at ? formatTicketDate(props.ticket.completed_at!).formatted : '',\n);\nconst completedRelative = computed(() =>\n props.ticket.completed_at ? formatTicketDate(props.ticket.completed_at!).relative : '',\n);\n</script>\n","<template>\n <div\n v-if=\"ticket\"\n class=\"flex flex-wrap items-center justify-between gap-3 rounded-lg border border-base-200 bg-base-200/30 px-4 py-3\"\n >\n <div class=\"flex items-center gap-3 min-w-0\">\n <div\n class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg\"\n :class=\"\n isSubscribed ? 'bg-info/20 text-info' : 'bg-base-300 text-base-content/60'\n \"\n >\n <!-- Bell (subscribed) -->\n <svg\n v-if=\"isSubscribed\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\"\n />\n </svg>\n <!-- Bell with slash (unsubscribed) -->\n <svg\n v-else\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M9.143 17.082a24.248 24.248 0 0 0 3.844.148m-3.844-.148a23.856 23.856 0 0 1-5.455-1.31 8.964 8.964 0 0 0 2.3-5.542m3.155 6.852a3 3 0 0 0 5.667 1.97m1.965-2.277L21 21m-4.225-4.225a23.81 23.81 0 0 0 3.536-1.003A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6.53 6.53m10.245 10.245L6.53 6.53M3 3l3.53 3.53\"\n />\n </svg>\n </div>\n <p class=\"text-sm text-base-content/80 min-w-0\">\n {{\n isSubscribed\n ? 'You will receive notifications for updates.'\n : 'Get notified when there are updates or new comments.'\n }}\n </p>\n <button\n type=\"button\"\n :class=\"[\n 'btn btn-sm shrink-0 font-medium',\n isSubscribed ? 'btn-outline' : 'btn-info',\n ]\"\n :disabled=\"isToggling\"\n @click=\"handleToggle\"\n >\n <span v-if=\"isToggling\" class=\"loading loading-spinner loading-xs\"></span>\n <span v-else>{{ isSubscribed ? 'Unsubscribe' : 'Subscribe' }}</span>\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n CustomerSupportTicketReadDto,\n DragoncoreApi,\n} from '@dragonmastery/dragoncore-shared';\nimport { computed, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n}\n\nconst props = defineProps<Props>();\n\nconst isToggling = ref(false);\n// Local override after toggle - avoids full-page refetch\nconst subscriptionOverride = ref<boolean | null>(null);\n\nwatch(\n () => props.ticket.id,\n () => {\n subscriptionOverride.value = null;\n },\n);\n\nconst isSubscribed = computed(\n () => subscriptionOverride.value ?? props.ticket.my_subscription != null,\n);\n\nconst { mutate: toggleSubscription } = useMutation<\n DragoncoreApi,\n string,\n { subscribed: boolean }\n>((api, id) => api.supportTickets.toggleSubscription(id), {\n invalidate: /^support-tickets?:/,\n});\n\nasync function handleToggle() {\n try {\n isToggling.value = true;\n const result = await toggleSubscription(props.ticket.id);\n subscriptionOverride.value = result.subscribed;\n toast.success(\n result.subscribed\n ? 'You are now subscribed to this ticket'\n : 'You have unsubscribed from this ticket',\n );\n } catch (e) {\n toast.error(extractRpcErrorMessage(e, 'Failed to update subscription'));\n } finally {\n isToggling.value = false;\n }\n}\n</script>\n","import {\n CustomerSupportTicketUpdateSchema,\n SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n} from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\nexport type CustomerMetadataCardEditFormDto = z.infer<typeof CustomerSupportTicketUpdateSchema>;\n\nexport const customerMetadataCardEditFormMetadata = withMetadata(\n CustomerSupportTicketUpdateSchema,\n 'customerMetadataCardEditForm',\n {\n title: {\n label: 'Title',\n placeholder: 'Enter ticket title',\n },\n description: {\n label: 'Description',\n inputType: 'textarea',\n placeholder: 'Describe the ticket in detail',\n },\n type: { label: 'Type' },\n priority: {\n label: 'Priority',\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n },\n);\n","<template>\n <div class=\"border border-base-200 rounded-lg p-4 md:p-6\">\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Title - full width -->\n <div class=\"form-control md:col-span-2\">\n <zinia.TitleField placeholder=\"Enter ticket title\" />\n </div>\n\n <!-- Description - full width -->\n <div class=\"form-control md:col-span-2\">\n <zinia.DescriptionField class=\"w-full\" placeholder=\"Describe the ticket in detail\" />\n </div>\n\n <!-- Type -->\n <div class=\"form-control\">\n <zinia.TypeField />\n </div>\n\n <!-- Priority -->\n <div class=\"form-control\">\n <zinia.PriorityField />\n </div>\n </div>\n\n <div v-if=\"form.submitError\" class=\"alert alert-error py-2 mt-4\">\n <span class=\"text-sm\">{{ form.submitError }}</span>\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n\n <!-- Action Buttons -->\n <div class=\"flex justify-end gap-2 mt-4\">\n <button type=\"button\" class=\"btn btn-ghost\" @click=\"handleCancel\" :disabled=\"saving\">\n Cancel\n </button>\n <ZiniaSubmitButton submitText=\"Save\" submittingText=\"Saving...\" />\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n supportTicketPriorityToNumber,\n type CustomerSupportTicketReadDto,\n type CustomerSupportTicketUpdateDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed } from 'vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { customerMetadataCardEditFormMetadata } from '../customerMetadataCardEditFormMetadata';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n saving?: boolean;\n}\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n success: [];\n cancel: [];\n}>();\n\nconst { mutate: updateTicket, loading: isSaving } = useMutation(\n (api, input: CustomerSupportTicketUpdateDto) => api.supportTickets.updateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst saving = computed(() => props.saving ?? isSaving.value);\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton, ZiniaFormErrorsSummary } = useForm(\n customerMetadataCardEditFormMetadata,\n {\n storeName: `customer-metadata-card-edit-${props.ticket.id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n const t = props.ticket;\n return {\n id: t.id,\n title: t.title || '',\n description: t.description ?? '',\n type: t.type,\n priority: supportTicketPriorityToNumber(t.priority),\n };\n },\n },\n);\n\nfunction buildPayload(formData: Record<string, unknown>): CustomerSupportTicketUpdateDto {\n return {\n id: props.ticket.id,\n title: String(formData.title ?? '').trim(),\n description: (formData.description as string) || '',\n type: formData.type as CustomerSupportTicketUpdateDto['type'],\n priority: formData.priority as CustomerSupportTicketUpdateDto['priority'],\n };\n}\n\nasync function handleSubmit(formData: Record<string, unknown>) {\n const payload = buildPayload(formData);\n await updateTicket(payload);\n return undefined;\n}\n\nfunction handleSuccess() {\n emit('success');\n}\n\nfunction handleError(error: Error | unknown) {\n const message = extractRpcErrorMessage(error, 'Failed to update ticket');\n form.setSubmitError(message);\n}\n\nfunction handleCancel() {\n emit('cancel');\n}\n</script>\n","<template>\n <div class=\"flex flex-col gap-4 w-full\">\n <TimelineNoteInput\n ref=\"noteInputRef\"\n :show-type-toggle=\"false\"\n :disabled=\"commentsLocked ?? false\"\n :on-submit=\"onAddNote\"\n />\n <p\n v-if=\"mergedTimelineItems.length === 0\"\n class=\"text-base-content/50 text-sm text-center py-8\"\n >\n No activity yet.\n </p>\n <template v-for=\"item in mergedTimelineItems\" :key=\"item.id\">\n <TimelineItem\n v-if=\"item.type === 'customer-note'\"\n :author-name=\"item.data.authorName\"\n :created-at=\"item.data.createdAt\"\n variant=\"customer\"\n >\n {{ item.data.body ?? '' }}\n </TimelineItem>\n <TimelineSystemEvent\n v-else-if=\"item.type === 'system-event'\"\n :author=\"item.data.author\"\n :message=\"item.data.message\"\n :timestamp=\"item.data.timestamp\"\n :action=\"item.data.action\"\n :type=\"item.data.type\"\n :details=\"item.data.details\"\n :old-value=\"item.data.oldValue\"\n :new-value=\"item.data.newValue\"\n :changes=\"item.data.changes\"\n />\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { CustomerSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, ref } from 'vue';\nimport type { SystemEvent } from '../../utils/parseRecordVersions';\nimport TimelineItem from '../../shared/TimelineItem.vue';\nimport TimelineNoteInput from '../../shared/TimelineNoteInput.vue';\nimport TimelineSystemEvent from '../../shared/TimelineSystemEvent.vue';\n\nexport interface CustomerNoteDto {\n authorName: string;\n createdAt: string;\n body: string;\n}\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto;\n notes: CustomerNoteDto[];\n systemEvents: SystemEvent[];\n /** Locks comments - only when archived (customers can add comments until archived) */\n commentsLocked?: boolean;\n /** Called when user submits a note. Must return a Promise. */\n onAddNote: (payload: {\n content: string;\n noteType: 'customer' | 'internal';\n }) => Promise<void>;\n}\n\nconst props = defineProps<Props>();\n\nconst noteInputRef = ref<InstanceType<typeof TimelineNoteInput> | null>(null);\n\ntype TimelineItem =\n | { type: 'customer-note'; timestamp: string; id: string; data: CustomerNoteDto }\n | { type: 'system-event'; timestamp: string; id: string; data: SystemEvent };\n\nconst mergedTimelineItems = computed((): TimelineItem[] => {\n const items: TimelineItem[] = [];\n\n for (const note of props.notes ?? []) {\n items.push({\n type: 'customer-note',\n timestamp: note.createdAt,\n id: `note-${note.createdAt}-${note.authorName}`,\n data: note,\n });\n }\n\n for (const event of props.systemEvents ?? []) {\n items.push({\n type: 'system-event',\n timestamp: event.timestamp,\n id: event.id,\n data: event,\n });\n }\n\n items.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n return items;\n});\n\nfunction resetInput() {\n noteInputRef.value?.reset();\n}\n\ndefineExpose({ resetInput });\n</script>\n","<template>\n <!-- Loading State (only on initial load; refetch keeps content visible) -->\n <div v-if=\"isLoading && !ticket\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error mb-4 max-w-4xl mx-auto px-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 <div class=\"flex-1\">\n <span>{{ error.message || 'An error occurred' }}</span>\n <div class=\"mt-2\">\n <router-link :to=\"{ name: 'CustomerSupportTicketList' }\" class=\"link link-primary\">\n Go back to ticket list\n </router-link>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div v-else-if=\"ticket\" class=\"px-4 py-6 max-w-4xl mx-auto\">\n <!-- Header -->\n <div class=\"mb-6\">\n <h1 class=\"text-2xl font-bold text-base-content break-words leading-tight mt-2\">\n {{ ticket.title }}\n </h1>\n </div>\n\n <!-- Action Banner -->\n <div class=\"mb-6\">\n <CustomerActionBanner :ticket=\"ticket\" />\n </div>\n\n <!-- Subscribe / Unsubscribe -->\n <div class=\"mb-6\">\n <CustomerSupportTicketSubscribeControl :ticket=\"ticket\" />\n </div>\n\n <!-- Metadata Card (Display or Edit) -->\n <div class=\"mb-8\">\n <CustomerMetadataCard v-if=\"!isEditMode\" :ticket=\"ticket\" @edit=\"enterEditMode\" />\n <CustomerMetadataCardEdit\n v-else\n :ticket=\"ticket\"\n @success=\"handleMetadataSaveSuccess\"\n @cancel=\"exitEditMode\"\n />\n </div>\n\n <!-- Attachments (separate from timeline so adding a comment doesn't cause refetch) -->\n <div class=\"mb-8\">\n <SupportTicketAttachmentsCollapsible\n :record-id=\"ticket.id\"\n :locked=\"isCommentsLocked\"\n :editable=\"!isCommentsLocked\"\n @uploaded=\"refetchTimeline\"\n @deleted=\"refetchTimeline\"\n />\n </div>\n\n <!-- Timeline: stay mounted once we have data so adding a comment doesn't unmount/remount -->\n <div>\n <CustomerTimeline\n v-if=\"timelineData != null\"\n :ticket=\"ticket\"\n :notes=\"customerNotesForTimeline\"\n :system-events=\"filteredSystemEvents\"\n :comments-locked=\"isCommentsLocked\"\n :on-add-note=\"handleAddNote\"\n />\n <div v-else-if=\"timelineError\" class=\"alert alert-error mb-4\">\n <span>{{ timelineError?.message ?? 'Failed to load timeline' }}</span>\n <button class=\"btn btn-sm btn-outline mt-2\" @click=\"refetchTimeline\">\n Retry\n </button>\n </div>\n <div v-else class=\"flex justify-center items-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { CustomerSupportTicketReadDto, NoteCreateDto } from '@dragonmastery/dragoncore-shared';\nimport { OPERATORS, RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { computed, inject, nextTick } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { BATCH_MODE } from '../../../composables/useRpcAuth';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useQuery } from '../../../composables/useQuery';\nimport SupportTicketAttachmentsCollapsible from '../shared/SupportTicketAttachmentsCollapsible.vue';\nimport { parseRecordVersions, type SystemEvent } from '../utils/parseRecordVersions';\nimport CustomerActionBanner from './components/CustomerActionBanner.vue';\nimport CustomerMetadataCard from './components/CustomerMetadataCard.vue';\nimport CustomerSupportTicketSubscribeControl from './components/CustomerSupportTicketSubscribeControl.vue';\nimport CustomerMetadataCardEdit from './components/CustomerMetadataCardEdit.vue';\nimport CustomerTimeline from './components/CustomerTimeline.vue';\n\ninterface Props {\n ticket: CustomerSupportTicketReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\nconst support_ticket_id = route.params.id as string;\n\n// Edit mode state\nconst isEditMode = computed(() => route.query.mode === 'edit');\n\n// Get refresh function from parent\nconst refreshTicket = inject<(() => Promise<void>) | undefined>('refreshTicket');\n\n// Comments locked only when archived (customers can add comments until archived)\nconst isCommentsLocked = computed(() => {\n if (!props.ticket) return false;\n return !!props.ticket.archived_at;\n});\n\n// Fetch customer notes and record versions in a single batched request\nconst {\n data: timelineData,\n error: timelineError,\n refetch: refetchTimeline,\n} = useQuery(\n async (api) => {\n const [customerNotes, recordVersions] = await Promise.all([\n api.notes.getNotes({\n record_id: { operator: OPERATORS.EQUALS, value: support_ticket_id },\n record_type: { operator: OPERATORS.EQUALS, value: 'support_ticket' },\n is_internal: { operator: OPERATORS.EQUALS, value: false },\n first: 100,\n sortBy: 'created_at',\n sortDirection: 'asc',\n }),\n api.recordVersions.listRecordVersionsCustomer(\n support_ticket_id,\n RecordConst.SUPPORT_TICKET, // legacy; record_types in filters takes priority\n {\n record_types: [RecordConst.SUPPORT_TICKET, RecordConst.SUPPORT_TICKET_ACTIVITY],\n first: 100,\n sortBy: 'recorded_at',\n sortDirection: 'asc',\n },\n ),\n ]);\n return { customerNotes, recordVersions };\n },\n {\n enabled: !!support_ticket_id && !!props.ticket,\n batchMode: BATCH_MODE.batch,\n trackedSegment: 'customer-support-ticket-timeline',\n },\n);\n\n// Map notes for timeline\ninterface CustomerNoteForTimeline {\n authorName: string;\n createdAt: string;\n body: string;\n}\n\nconst customerNotesForTimeline = computed((): CustomerNoteForTimeline[] => {\n const items = timelineData.value?.customerNotes?.items ?? [];\n return items\n .map((n) => ({\n authorName: n.created_by_display_name ?? n.created_by ?? '(unknown)',\n createdAt: n.created_at,\n body: n.body ?? '',\n }))\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n});\n\n// Parse and filter system events for customer visibility (merged by API from record_types)\nconst allSystemEvents = computed(() => {\n const data = timelineData.value?.recordVersions;\n const versions = data?.items ?? [];\n const userDisplayMap = data?.user_display_map;\n const displayMap = userDisplayMap ? new Map(Object.entries(userDisplayMap)) : undefined;\n return parseRecordVersions(versions, displayMap);\n});\n\n// Filter out staff-only system events\nconst filteredSystemEvents = computed((): SystemEvent[] => {\n if (!props.ticket) return [];\n\n const events = allSystemEvents.value;\n const isPending = props.ticket.status === 'PENDING' || !props.ticket.is_locked;\n\n // Staff-only fields that customers should never see\n const STAFF_ONLY_FIELDS = new Set(['dev_lifecycle', 'delivered_value', 'start_at']);\n\n return events.filter((event) => {\n // Filter by field name if available\n if (event.fieldName) {\n // Always filter out staff-only fields\n if (STAFF_ONLY_FIELDS.has(event.fieldName)) {\n return false;\n }\n\n // Filter credit_value changes when ticket is still pending\n if (isPending && event.fieldName === 'credit_value') {\n return false;\n }\n\n return true;\n }\n\n // Fallback to message-based filtering if fieldName not available\n const message = event.message.toLowerCase();\n\n // Always filter out dev_lifecycle, delivered_value, start_at\n if (\n message.includes('dev lifecycle') ||\n message.includes('moved') ||\n message.includes('delivered value') ||\n message.includes('start date')\n ) {\n return false;\n }\n\n // Filter credit_value changes when ticket is still pending\n if (isPending && (message.includes('credits') || message.includes('credit'))) {\n return false;\n }\n\n // Allow all other events (type, priority, status, target date, completed date, etc.)\n return true;\n });\n});\n\n// Note creation mutation\nconst { mutate: createNote } = useMutation(\n (api, input: NoteCreateDto) => api.notes.createNote(input),\n { invalidate: /^notes?:/ },\n);\n\n// Handle note creation\nasync function handleAddNote(payload: {\n content: string;\n noteType: 'customer' | 'internal';\n}) {\n try {\n await createNote({\n record_id: support_ticket_id,\n record_type: 'support_ticket' as const,\n body: payload.content,\n tag: null,\n is_internal: false,\n });\n await refetchTimeline();\n toast.success('Comment added');\n } catch {\n toast.error('Failed to add comment');\n throw new Error('Failed to add comment');\n }\n}\n\n// Enter edit mode\nfunction enterEditMode() {\n router.push({\n name: route.name || 'CustomerViewSupportTicket',\n params: route.params,\n query: { ...route.query, mode: 'edit' },\n });\n}\n\n// Exit edit mode\nasync function exitEditMode() {\n await router.push({\n name: route.name || 'CustomerViewSupportTicket',\n params: route.params,\n query: { ...route.query, mode: undefined },\n });\n}\n\n// Handle metadata save success (form does mutation; we refresh and exit)\nasync function handleMetadataSaveSuccess() {\n await exitEditMode();\n await nextTick();\n toast.success('Ticket updated successfully');\n if (refreshTicket) {\n await refreshTicket();\n }\n await refetchTimeline();\n}\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import "./useRpcAuth-rmHf7bYx.js";
2
+ import "./useQueryCache-Bjm-S8v5.js";
3
+ import "./useMutation-BTsyHKyn.js";
4
+ import "./useQuery-BggIE52P.js";
5
+ import { L as CustomerSupportTicketList_default } from "./src-QZJyMfGX.js";
6
+ import "./AppLink-CHMMrSFI.js";
7
+ import "./TimelineSystemEvent-BHzFr46C.js";
8
+ import "./TeamMembersTab-4gmnP9sD.js";
9
+ import "./Appearance-DxWTyx1M.js";
10
+ import "./useSignupPendingData-BWHwUHhL.js";
11
+ import "./useBreadcrumbs-qB6ghsAf.js";
12
+ import "./EditTeamMemberForm-CaS2GLjV.js";
13
+ import "./RecordVersionViewer-BWZ78vvE.js";
14
+ import "./TeamHistoryTab-D5biUPmq.js";
15
+ import "./UserProfilePage-C3b93Keh.js";
16
+ import "./ChangePasswordPage--3XwluwE.js";
17
+ import "./TeamNotesTab-BzGZZ1h8.js";
18
+ import "./CustomerSupportTicketParent-HIxwSVdu.js";
19
+ import "./SupportTicketDevLifecycleBadge-EMrQHfyG.js";
20
+ import "./StaffSupportTicketParent-CilR4RGM.js";
21
+ import "./LoginForm-9UFnA-fO.js";
22
+ import "./useEmailVerificationChannel-BNi926Ho.js";
23
+ import "./Signup-9TjMMnU4.js";
24
+ import "./ForgotPassword-OjIPi9s9.js";
25
+ import "./ResetPassword-BE4mXK9q.js";
26
+ import "./Logout-YgTgOFUH.js";
27
+ import "./mfaSchema-BnRWf0ma.js";
28
+ import "./MfaSetup-RtFMY_dj.js";
29
+ import "./MfaVerify-Cvhe8bEM.js";
30
+ import "./VerifyEmail-DlOmWGG-.js";
31
+ import "./UserListPage-DUE5gJTo.js";
32
+ import "./CreateUserPage-DLwXeLAq.js";
33
+ import "./EditUserPage-DURc5rmi.js";
34
+
35
+ export { CustomerSupportTicketList_default as default };
@@ -0,0 +1,7 @@
1
+ import "./useRpcAuth-rmHf7bYx.js";
2
+ import "./useQueryCache-Bjm-S8v5.js";
3
+ import "./useQuery-BggIE52P.js";
4
+ import "./useBreadcrumbs-qB6ghsAf.js";
5
+ import { t as CustomerSupportTicketParent_default } from "./CustomerSupportTicketParent-HIxwSVdu.js";
6
+
7
+ export { CustomerSupportTicketParent_default as default };
@@ -1,4 +1,4 @@
1
- import { t as useQuery } from "./useQuery-DxmMxM8z.js";
1
+ import { t as useQuery } from "./useQuery-BggIE52P.js";
2
2
  import { n as useBreadcrumbs } from "./useBreadcrumbs-qB6ghsAf.js";
3
3
  import { t as formatTicketDisplayId } from "./displayIdFormatter-Dz900Awr.js";
4
4
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, openBlock, provide, resolveComponent, toDisplayString, unref } from "vue";
@@ -63,4 +63,4 @@ var CustomerSupportTicketParent_default = _sfc_main;
63
63
 
64
64
  //#endregion
65
65
  export { CustomerSupportTicketParent_default as t };
66
- //# sourceMappingURL=CustomerSupportTicketParent-CldxkQ75.js.map
66
+ //# sourceMappingURL=CustomerSupportTicketParent-HIxwSVdu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerSupportTicketParent-CldxkQ75.js","names":[],"sources":["../src/slices/support_ticket/customer/CustomerSupportTicketParent.vue"],"sourcesContent":["<template>\n <!-- Only show full-page spinner on initial load; refetch keeps content visible -->\n <div v-if=\"isLoading && !ticket\" 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 && !ticket\" 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 :ticket=\"ticket\" :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 { formatTicketDisplayId } from '../utils/displayIdFormatter';\n\nconst route = useRoute();\nconst ticketId = route.params.id as string;\n\n// Fetch ticket data once at parent level\nconst {\n data,\n loading: isLoading,\n error,\n refetch,\n} = useQuery((api) => api.supportTickets.getTicket(ticketId), {});\n\nconst ticket = computed(() => data.value ?? null);\n\n// Provide refresh function to child components\nconst refreshTicket = async () => {\n await refetch();\n};\n\nprovide('refreshTicket', refreshTicket);\n\n// Manage breadcrumbs at parent level\nuseBreadcrumbs(() => [\n {\n label: 'Support',\n to: { name: 'CustomerSupportTicketList' },\n },\n {\n label: ticket.value\n ? formatTicketDisplayId(\n ticket.value.display_id,\n ticket.value.display_id_prefix,\n ticket.value.id,\n )\n : '',\n loading: !ticket.value,\n to: {\n name: 'CustomerViewSupportTicket',\n params: { id: ticketId },\n },\n },\n]);\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAkCA,MAAM,WADQ,UAAU,CACD,OAAO;EAG9B,MAAM,EACJ,MACA,SAAS,WACT,OACA,YACE,UAAU,QAAQ,IAAI,eAAe,UAAU,SAAS,EAAE,EAAE,CAAC;EAEjE,MAAM,SAAS,eAAe,KAAK,SAAS,KAAK;EAGjD,MAAM,gBAAgB,YAAY;AAChC,SAAM,SAAS;;AAGjB,UAAQ,iBAAiB,cAAc;AAGvC,uBAAqB,CACnB;GACE,OAAO;GACP,IAAI,EAAE,MAAM,6BAA6B;GAC1C,EACD;GACE,OAAO,OAAO,QACV,sBACE,OAAO,MAAM,YACb,OAAO,MAAM,mBACb,OAAO,MAAM,GACf,GACA;GACJ,SAAS,CAAC,OAAO;GACjB,IAAI;IACF,MAAM;IACN,QAAQ,EAAE,IAAI,UAAU;IACzB;GACF,CACF,CAAC;;;2DAxEA,mBAAA,+EAAmF,EACxE,MAAA,UAAS,IAAA,CAAK,OAAA,SAAA,WAAA,EAAzB,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,CAAK,OAAA,SAAA,WAAA,EAA1B,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,YAA4E,uBAAA;;IAAxD,QAAQ,OAAA;IAAS,WAAW,MAAA,UAAS;IAAG,OAAO,MAAA,MAAK"}
1
+ {"version":3,"file":"CustomerSupportTicketParent-HIxwSVdu.js","names":[],"sources":["../src/slices/support_ticket/customer/CustomerSupportTicketParent.vue"],"sourcesContent":["<template>\n <!-- Only show full-page spinner on initial load; refetch keeps content visible -->\n <div v-if=\"isLoading && !ticket\" 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 && !ticket\" 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 :ticket=\"ticket\" :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 { formatTicketDisplayId } from '../utils/displayIdFormatter';\n\nconst route = useRoute();\nconst ticketId = route.params.id as string;\n\n// Fetch ticket data once at parent level\nconst {\n data,\n loading: isLoading,\n error,\n refetch,\n} = useQuery((api) => api.supportTickets.getTicket(ticketId), {});\n\nconst ticket = computed(() => data.value ?? null);\n\n// Provide refresh function to child components\nconst refreshTicket = async () => {\n await refetch();\n};\n\nprovide('refreshTicket', refreshTicket);\n\n// Manage breadcrumbs at parent level\nuseBreadcrumbs(() => [\n {\n label: 'Support',\n to: { name: 'CustomerSupportTicketList' },\n },\n {\n label: ticket.value\n ? formatTicketDisplayId(\n ticket.value.display_id,\n ticket.value.display_id_prefix,\n ticket.value.id,\n )\n : '',\n loading: !ticket.value,\n to: {\n name: 'CustomerViewSupportTicket',\n params: { id: ticketId },\n },\n },\n]);\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAkCA,MAAM,WADQ,UAAU,CACD,OAAO;EAG9B,MAAM,EACJ,MACA,SAAS,WACT,OACA,YACE,UAAU,QAAQ,IAAI,eAAe,UAAU,SAAS,EAAE,EAAE,CAAC;EAEjE,MAAM,SAAS,eAAe,KAAK,SAAS,KAAK;EAGjD,MAAM,gBAAgB,YAAY;AAChC,SAAM,SAAS;;AAGjB,UAAQ,iBAAiB,cAAc;AAGvC,uBAAqB,CACnB;GACE,OAAO;GACP,IAAI,EAAE,MAAM,6BAA6B;GAC1C,EACD;GACE,OAAO,OAAO,QACV,sBACE,OAAO,MAAM,YACb,OAAO,MAAM,mBACb,OAAO,MAAM,GACf,GACA;GACJ,SAAS,CAAC,OAAO;GACjB,IAAI;IACF,MAAM;IACN,QAAQ,EAAE,IAAI,UAAU;IACzB;GACF,CACF,CAAC;;;2DAxEA,mBAAA,+EAAmF,EACxE,MAAA,UAAS,IAAA,CAAK,OAAA,SAAA,WAAA,EAAzB,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,CAAK,OAAA,SAAA,WAAA,EAA1B,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,YAA4E,uBAAA;;IAAxD,QAAQ,OAAA;IAAS,WAAW,MAAA,UAAS;IAAG,OAAO,MAAA,MAAK"}
@@ -0,0 +1,35 @@
1
+ import "./useRpcAuth-rmHf7bYx.js";
2
+ import "./useQueryCache-Bjm-S8v5.js";
3
+ import "./useMutation-BTsyHKyn.js";
4
+ import "./useQuery-BggIE52P.js";
5
+ import { I as CustomerSupportTicketSuccess_default } from "./src-QZJyMfGX.js";
6
+ import "./AppLink-CHMMrSFI.js";
7
+ import "./TimelineSystemEvent-BHzFr46C.js";
8
+ import "./TeamMembersTab-4gmnP9sD.js";
9
+ import "./Appearance-DxWTyx1M.js";
10
+ import "./useSignupPendingData-BWHwUHhL.js";
11
+ import "./useBreadcrumbs-qB6ghsAf.js";
12
+ import "./EditTeamMemberForm-CaS2GLjV.js";
13
+ import "./RecordVersionViewer-BWZ78vvE.js";
14
+ import "./TeamHistoryTab-D5biUPmq.js";
15
+ import "./UserProfilePage-C3b93Keh.js";
16
+ import "./ChangePasswordPage--3XwluwE.js";
17
+ import "./TeamNotesTab-BzGZZ1h8.js";
18
+ import "./CustomerSupportTicketParent-HIxwSVdu.js";
19
+ import "./SupportTicketDevLifecycleBadge-EMrQHfyG.js";
20
+ import "./StaffSupportTicketParent-CilR4RGM.js";
21
+ import "./LoginForm-9UFnA-fO.js";
22
+ import "./useEmailVerificationChannel-BNi926Ho.js";
23
+ import "./Signup-9TjMMnU4.js";
24
+ import "./ForgotPassword-OjIPi9s9.js";
25
+ import "./ResetPassword-BE4mXK9q.js";
26
+ import "./Logout-YgTgOFUH.js";
27
+ import "./mfaSchema-BnRWf0ma.js";
28
+ import "./MfaSetup-RtFMY_dj.js";
29
+ import "./MfaVerify-Cvhe8bEM.js";
30
+ import "./VerifyEmail-DlOmWGG-.js";
31
+ import "./UserListPage-DUE5gJTo.js";
32
+ import "./CreateUserPage-DLwXeLAq.js";
33
+ import "./EditUserPage-DURc5rmi.js";
34
+
35
+ export { CustomerSupportTicketSuccess_default as default };
@@ -0,0 +1,35 @@
1
+ import "./useRpcAuth-rmHf7bYx.js";
2
+ import "./useQueryCache-Bjm-S8v5.js";
3
+ import "./useMutation-BTsyHKyn.js";
4
+ import "./useQuery-BggIE52P.js";
5
+ import { pt as EditTeamForm_default } from "./src-QZJyMfGX.js";
6
+ import "./AppLink-CHMMrSFI.js";
7
+ import "./TimelineSystemEvent-BHzFr46C.js";
8
+ import "./TeamMembersTab-4gmnP9sD.js";
9
+ import "./Appearance-DxWTyx1M.js";
10
+ import "./useSignupPendingData-BWHwUHhL.js";
11
+ import "./useBreadcrumbs-qB6ghsAf.js";
12
+ import "./EditTeamMemberForm-CaS2GLjV.js";
13
+ import "./RecordVersionViewer-BWZ78vvE.js";
14
+ import "./TeamHistoryTab-D5biUPmq.js";
15
+ import "./UserProfilePage-C3b93Keh.js";
16
+ import "./ChangePasswordPage--3XwluwE.js";
17
+ import "./TeamNotesTab-BzGZZ1h8.js";
18
+ import "./CustomerSupportTicketParent-HIxwSVdu.js";
19
+ import "./SupportTicketDevLifecycleBadge-EMrQHfyG.js";
20
+ import "./StaffSupportTicketParent-CilR4RGM.js";
21
+ import "./LoginForm-9UFnA-fO.js";
22
+ import "./useEmailVerificationChannel-BNi926Ho.js";
23
+ import "./Signup-9TjMMnU4.js";
24
+ import "./ForgotPassword-OjIPi9s9.js";
25
+ import "./ResetPassword-BE4mXK9q.js";
26
+ import "./Logout-YgTgOFUH.js";
27
+ import "./mfaSchema-BnRWf0ma.js";
28
+ import "./MfaSetup-RtFMY_dj.js";
29
+ import "./MfaVerify-Cvhe8bEM.js";
30
+ import "./VerifyEmail-DlOmWGG-.js";
31
+ import "./UserListPage-DUE5gJTo.js";
32
+ import "./CreateUserPage-DLwXeLAq.js";
33
+ import "./EditUserPage-DURc5rmi.js";
34
+
35
+ export { EditTeamForm_default as default };
@@ -1,4 +1,4 @@
1
- import { t as useMutation } from "./useMutation-Dhx2gMgS.js";
1
+ import { t as useMutation } from "./useMutation-BTsyHKyn.js";
2
2
  import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, inject, openBlock, renderSlot, toDisplayString, unref, withCtx } from "vue";
3
3
  import { useRoute } from "vue-router";
4
4
  import { toast } from "vue3-toastify";
@@ -188,4 +188,4 @@ var EditTeamMemberForm_default = _sfc_main;
188
188
 
189
189
  //#endregion
190
190
  export { FieldsetSection_default as i, teamMemberCreateSchemaWithMetadata as n, teamMemberUpdateSchemaWithMetadata as r, EditTeamMemberForm_default as t };
191
- //# sourceMappingURL=EditTeamMemberForm-CiNb4nNG.js.map
191
+ //# sourceMappingURL=EditTeamMemberForm-CaS2GLjV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditTeamMemberForm-CiNb4nNG.js","names":[],"sources":["../src/components/ui/FieldsetSection.vue","../src/slices/team/team_member/teamMemberMetadata.ts","../src/slices/team/team_member/EditTeamMemberForm.vue"],"sourcesContent":["<template>\n <fieldset class=\"bg-base-100 border-base-300 border p-4 mb-6 rounded-xl\">\n <legend class=\"text-xl font-medium mb-5 top-4 text-center relative\">{{ title }}</legend>\n\n <!-- Mobile: Single column -->\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-6 pt-2\">\n <slot></slot>\n </div>\n </fieldset>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps({\n title: {\n type: String,\n required: true,\n },\n});\n</script>\n","import {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { TeamMemberCreateSchema, TeamMemberUpdateSchema } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\n\n// Create schema (no ID)\nexport const teamMemberCreateSchemaWithMetadata = withMetadata(\n TeamMemberCreateSchema.omit({ team_id: true }),\n 'teamMemberCreateSchema',\n {\n user_id: {\n inputType: 'select',\n placeholder: 'Select user',\n },\n email_address: {\n inputType: 'email',\n placeholder: 'Enter email address',\n },\n website_address: {\n inputType: 'text',\n placeholder: 'Enter website address',\n },\n business_phone: {\n inputType: 'tel',\n placeholder: 'Enter business phone',\n },\n mobile_phone: {\n inputType: 'tel',\n placeholder: 'Enter mobile phone',\n },\n },\n);\n\n// Update schema (with ID)\nexport const teamMemberUpdateSchemaWithMetadata = withMetadata(\n TeamMemberUpdateSchema,\n 'teamMemberUpdateSchema',\n {\n email_address: {\n inputType: 'email',\n placeholder: 'Enter email address',\n },\n website_address: {\n inputType: 'text',\n placeholder: 'Enter website address',\n },\n business_phone: {\n inputType: 'tel',\n placeholder: 'Enter business phone',\n },\n mobile_phone: {\n inputType: 'tel',\n placeholder: 'Enter mobile phone',\n },\n },\n);\n\nexport type TeamMemberCreateFormDto = UseFormTyped<typeof TeamMemberCreateSchema>;\nexport type TeamMemberUpdateFormDto = UseFormTyped<typeof TeamMemberUpdateSchema>;\n\nexport const injectTeamMemberCreateForm = () =>\n inject<TeamMemberCreateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectTeamMemberUpdateForm = () =>\n inject<TeamMemberUpdateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectTeamMemberZinia = () =>\n inject<TeamMemberCreateFormDto['zinia'] | TeamMemberUpdateFormDto['zinia']>(\n ZINIA_FIELDS_KEY,\n );\n","<template>\n <div v-if=\"form.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=\"form.loadError\" 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>{{ form.loadError }}</span>\n </div>\n\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Edit Team Member\"\n subtitle=\"Update team member details\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Member Details\">\n <zinia.DisplayNameField placeholder=\"Enter display name (optional)\" />\n <zinia.RoleField placeholder=\"Enter role (optional)\" />\n </FieldsetSection>\n\n <!-- Contact Information -->\n <FieldsetSection title=\"Contact Information\">\n <zinia.EmailAddressField placeholder=\"Enter email address (optional)\" />\n <zinia.BusinessPhoneField placeholder=\"Enter business phone (optional)\" />\n <zinia.MobilePhoneField placeholder=\"Enter mobile phone (optional)\" />\n <zinia.TimeZoneField placeholder=\"Enter time zone (optional)\" />\n </FieldsetSection>\n\n <!-- Web Presence -->\n <FieldsetSection title=\"Web Presence\">\n <zinia.WebsiteAddressField placeholder=\"Enter website address (optional)\" />\n </FieldsetSection>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" 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>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton\n submitText=\"Update Team Member\"\n submittingText=\"Updating Team Member...\"\n />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport FieldsetSection from '../../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { TeamMemberReadDto, TeamMemberUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { teamMemberUpdateSchemaWithMetadata } from './teamMemberMetadata';\n\ninterface Props {\n teamMember: TeamMemberReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst member_id = route.params.member_id as string;\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamMemberUpdateSchemaWithMetadata, {\n storeName: `edit-team-member-${member_id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n if (!props.teamMember) {\n throw new Error('No team member data found');\n }\n\n return props.teamMember as TeamMemberUpdateDto;\n },\n});\n\n// Get refresh function from parent\nconst refreshTeamMember = inject<(() => Promise<void>) | undefined>('refreshTeamMember');\n\n// Setup mutation for updating team member\nconst { mutate: updateTeamMember } = useMutation(\n (api, input: TeamMemberUpdateDto) => api.teamMembers.updateTeamMember(input),\n { invalidate: /^team-members?:|^user:teams/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: TeamMemberUpdateDto) => {\n const updatedTeamMember = await updateTeamMember(formData);\n if (!updatedTeamMember) {\n throw new Error('Failed to update team member');\n }\n return updatedTeamMember;\n};\n\n// Handle successful submission\nconst handleSuccess = async () => {\n clearSavedFormState();\n toast.success(`Team member updated successfully!`);\n // Refresh team member data via parent\n if (refreshTeamMember) {\n await refreshTeamMember();\n }\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"EditTeamMemberForm-CaS2GLjV.js","names":[],"sources":["../src/components/ui/FieldsetSection.vue","../src/slices/team/team_member/teamMemberMetadata.ts","../src/slices/team/team_member/EditTeamMemberForm.vue"],"sourcesContent":["<template>\n <fieldset class=\"bg-base-100 border-base-300 border p-4 mb-6 rounded-xl\">\n <legend class=\"text-xl font-medium mb-5 top-4 text-center relative\">{{ title }}</legend>\n\n <!-- Mobile: Single column -->\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-6 pt-2\">\n <slot></slot>\n </div>\n </fieldset>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps({\n title: {\n type: String,\n required: true,\n },\n});\n</script>\n","import {\n type UseFormTyped,\n withMetadata,\n ZINIA_FIELDS_KEY,\n ZINIA_FORM_KEY,\n} from '@dragonmastery/zinia-forms-core';\nimport { TeamMemberCreateSchema, TeamMemberUpdateSchema } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\n\n// Create schema (no ID)\nexport const teamMemberCreateSchemaWithMetadata = withMetadata(\n TeamMemberCreateSchema.omit({ team_id: true }),\n 'teamMemberCreateSchema',\n {\n user_id: {\n inputType: 'select',\n placeholder: 'Select user',\n },\n email_address: {\n inputType: 'email',\n placeholder: 'Enter email address',\n },\n website_address: {\n inputType: 'text',\n placeholder: 'Enter website address',\n },\n business_phone: {\n inputType: 'tel',\n placeholder: 'Enter business phone',\n },\n mobile_phone: {\n inputType: 'tel',\n placeholder: 'Enter mobile phone',\n },\n },\n);\n\n// Update schema (with ID)\nexport const teamMemberUpdateSchemaWithMetadata = withMetadata(\n TeamMemberUpdateSchema,\n 'teamMemberUpdateSchema',\n {\n email_address: {\n inputType: 'email',\n placeholder: 'Enter email address',\n },\n website_address: {\n inputType: 'text',\n placeholder: 'Enter website address',\n },\n business_phone: {\n inputType: 'tel',\n placeholder: 'Enter business phone',\n },\n mobile_phone: {\n inputType: 'tel',\n placeholder: 'Enter mobile phone',\n },\n },\n);\n\nexport type TeamMemberCreateFormDto = UseFormTyped<typeof TeamMemberCreateSchema>;\nexport type TeamMemberUpdateFormDto = UseFormTyped<typeof TeamMemberUpdateSchema>;\n\nexport const injectTeamMemberCreateForm = () =>\n inject<TeamMemberCreateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectTeamMemberUpdateForm = () =>\n inject<TeamMemberUpdateFormDto['form']>(ZINIA_FORM_KEY);\nexport const injectTeamMemberZinia = () =>\n inject<TeamMemberCreateFormDto['zinia'] | TeamMemberUpdateFormDto['zinia']>(\n ZINIA_FIELDS_KEY,\n );\n","<template>\n <div v-if=\"form.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=\"form.loadError\" 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>{{ form.loadError }}</span>\n </div>\n\n <ZiniaForm\n v-else\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Edit Team Member\"\n subtitle=\"Update team member details\"\n >\n <!-- Basic Information -->\n <FieldsetSection title=\"Member Details\">\n <zinia.DisplayNameField placeholder=\"Enter display name (optional)\" />\n <zinia.RoleField placeholder=\"Enter role (optional)\" />\n </FieldsetSection>\n\n <!-- Contact Information -->\n <FieldsetSection title=\"Contact Information\">\n <zinia.EmailAddressField placeholder=\"Enter email address (optional)\" />\n <zinia.BusinessPhoneField placeholder=\"Enter business phone (optional)\" />\n <zinia.MobilePhoneField placeholder=\"Enter mobile phone (optional)\" />\n <zinia.TimeZoneField placeholder=\"Enter time zone (optional)\" />\n </FieldsetSection>\n\n <!-- Web Presence -->\n <FieldsetSection title=\"Web Presence\">\n <zinia.WebsiteAddressField placeholder=\"Enter website address (optional)\" />\n </FieldsetSection>\n\n <!-- Form Status Messages -->\n <div v-if=\"form.submitError\" 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>{{ form.submitError }}</span>\n </div>\n\n <!-- Submit Button -->\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton\n submitText=\"Update Team Member\"\n submittingText=\"Updating Team Member...\"\n />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport FieldsetSection from '../../../components/ui/FieldsetSection.vue';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { TeamMemberReadDto, TeamMemberUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { inject } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { teamMemberUpdateSchemaWithMetadata } from './teamMemberMetadata';\n\ninterface Props {\n teamMember: TeamMemberReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst member_id = route.params.member_id as string;\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaResetButton,\n ZiniaFormErrorsSummary,\n clearSavedFormState,\n} = useForm(teamMemberUpdateSchemaWithMetadata, {\n storeName: `edit-team-member-${member_id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n if (!props.teamMember) {\n throw new Error('No team member data found');\n }\n\n return props.teamMember as TeamMemberUpdateDto;\n },\n});\n\n// Get refresh function from parent\nconst refreshTeamMember = inject<(() => Promise<void>) | undefined>('refreshTeamMember');\n\n// Setup mutation for updating team member\nconst { mutate: updateTeamMember } = useMutation(\n (api, input: TeamMemberUpdateDto) => api.teamMembers.updateTeamMember(input),\n { invalidate: /^team-members?:|^user:teams/ },\n);\n\n// Handle form submission\nconst handleSubmit = async (formData: TeamMemberUpdateDto) => {\n const updatedTeamMember = await updateTeamMember(formData);\n if (!updatedTeamMember) {\n throw new Error('Failed to update team member');\n }\n return updatedTeamMember;\n};\n\n// Handle successful submission\nconst handleSuccess = async () => {\n clearSavedFormState();\n toast.success(`Team member updated successfully!`);\n // Refresh team member data via parent\n if (refreshTeamMember) {\n await refreshTeamMember();\n }\n};\n\n// Handle submission error\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import "./useRpcAuth-rmHf7bYx.js";
2
+ import "./useQueryCache-Bjm-S8v5.js";
3
+ import "./useMutation-BTsyHKyn.js";
4
+ import { t as EditTeamMemberForm_default } from "./EditTeamMemberForm-CaS2GLjV.js";
5
+
6
+ export { EditTeamMemberForm_default as default };
@@ -1,5 +1,5 @@
1
- import { t as useMutation } from "./useMutation-Dhx2gMgS.js";
2
- import { t as useQuery } from "./useQuery-DxmMxM8z.js";
1
+ import { t as useMutation } from "./useMutation-BTsyHKyn.js";
2
+ import { t as useQuery } from "./useQuery-BggIE52P.js";
3
3
  import { t as formatSystemTimestamp } from "./convertToLocalDateTime-CFhtN6PI.js";
4
4
  import { Fragment, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
5
5
  import { useRoute, useRouter } from "vue-router";
@@ -109,4 +109,4 @@ var EditUserPage_default = _sfc_main;
109
109
 
110
110
  //#endregion
111
111
  export { updateUserSchemaWithMetadata as n, EditUserPage_default as t };
112
- //# sourceMappingURL=EditUserPage-DpV3dm-c.js.map
112
+ //# sourceMappingURL=EditUserPage-DURc5rmi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditUserPage-DpV3dm-c.js","names":[],"sources":["../src/slices/admin/features/user_management/updateUserMetadata.ts","../src/slices/admin/features/user_management/EditUserPage.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { UserUpdateSchema } from '@dragonmastery/dragoncore-shared';\n\nexport const updateUserSchemaWithMetadata = withMetadata(\n UserUpdateSchema,\n 'updateUserSchema',\n {\n user_type: {\n label: 'User Role',\n helpText: 'Select the role for this user',\n },\n },\n);\n","<template>\n <div class=\"max-w-2xl mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Edit User</h1>\n\n <!-- Loading State -->\n <div v-if=\"fetching\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error mb-4\">\n <span>Error loading user: {{ error.message }}</span>\n </div>\n\n <!-- Edit Form -->\n <div v-else-if=\"userData\">\n <!-- Read-only user info -->\n <div class=\"card bg-base-100 shadow-xl mb-6\">\n <div class=\"card-body\">\n <h2 class=\"card-title\">User Information</h2>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label class=\"label\">\n <span class=\"label-text font-semibold\">Username</span>\n </label>\n <div class=\"input input-bordered bg-base-200\">\n {{ userData.username }}\n </div>\n </div>\n <div>\n <label class=\"label\">\n <span class=\"label-text font-semibold\">Email</span>\n </label>\n <div class=\"input input-bordered bg-base-200\">\n {{ userData.email }}\n </div>\n </div>\n <div>\n <label class=\"label\">\n <span class=\"label-text font-semibold\">Email Verified</span>\n </label>\n <div class=\"flex items-center\">\n <span\n class=\"badge\"\n :class=\"userData.email_verified ? 'badge-success' : 'badge-error'\"\n >\n {{ userData.email_verified ? 'Verified' : 'Not Verified' }}\n </span>\n </div>\n </div>\n <div>\n <label class=\"label\">\n <span class=\"label-text font-semibold\">Created</span>\n </label>\n <div class=\"input input-bordered bg-base-200\">\n {{ formatSystemTimestamp(userData.created_at) }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Editable role -->\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Update User Role\"\n subtitle=\"Change the user's role in the system\"\n >\n <zinia.UserTypeField />\n\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <span>{{ form.submitError }}</span>\n </div>\n\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Update Role\" submittingText=\"Updating...\" />\n </div>\n\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatSystemTimestamp } from '../../../../utils/convertToLocalDateTime';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { UserUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { updateUserSchemaWithMetadata } from './updateUserMetadata';\n\nconst route = useRoute();\nconst router = useRouter();\nconst userId = route.params.id as string;\n\n// Fetch user data\nconst {\n data,\n loading: fetching,\n error,\n} = useQuery((api) => api.users.getUser(userId), {\n staleTime: 5 * 60 * 1000,\n});\n\nconst userData = ref<any | null>(null);\n\n// Create form with user data\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton, ZiniaResetButton, ZiniaFormErrorsSummary } =\n useForm(updateUserSchemaWithMetadata, {\n storeName: `edit-user-form-${userId}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n while (fetching.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n if (!data.value) {\n throw new Error('User not found');\n }\n\n userData.value = data.value;\n return {\n id: data.value?.id,\n user_type: data.value?.user_type,\n } satisfies UserUpdateDto;\n },\n });\n\nconst { mutate: updateUser } = useMutation(\n (api, formData: UserUpdateDto) => api.users.updateUser(formData),\n { invalidate: /^users?:/ },\n);\n\nconst handleSubmit = async (formData: UserUpdateDto) => {\n const result = await updateUser(formData);\n if (!result) throw new Error('Failed to update user');\n return result;\n};\n\nconst handleSuccess = async (_result: any) => {\n await router.push({ name: 'UserManagement' });\n toast.success('User role updated successfully!');\n};\n\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"EditUserPage-DURc5rmi.js","names":[],"sources":["../src/slices/admin/features/user_management/updateUserMetadata.ts","../src/slices/admin/features/user_management/EditUserPage.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { UserUpdateSchema } from '@dragonmastery/dragoncore-shared';\n\nexport const updateUserSchemaWithMetadata = withMetadata(\n UserUpdateSchema,\n 'updateUserSchema',\n {\n user_type: {\n label: 'User Role',\n helpText: 'Select the role for this user',\n },\n },\n);\n","<template>\n <div class=\"max-w-2xl mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Edit User</h1>\n\n <!-- Loading State -->\n <div v-if=\"fetching\" class=\"flex justify-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error mb-4\">\n <span>Error loading user: {{ error.message }}</span>\n </div>\n\n <!-- Edit Form -->\n <div v-else-if=\"userData\">\n <!-- Read-only user info -->\n <div class=\"card bg-base-100 shadow-xl mb-6\">\n <div class=\"card-body\">\n <h2 class=\"card-title\">User Information</h2>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label class=\"label\">\n <span class=\"label-text font-semibold\">Username</span>\n </label>\n <div class=\"input input-bordered bg-base-200\">\n {{ userData.username }}\n </div>\n </div>\n <div>\n <label class=\"label\">\n <span class=\"label-text font-semibold\">Email</span>\n </label>\n <div class=\"input input-bordered bg-base-200\">\n {{ userData.email }}\n </div>\n </div>\n <div>\n <label class=\"label\">\n <span class=\"label-text font-semibold\">Email Verified</span>\n </label>\n <div class=\"flex items-center\">\n <span\n class=\"badge\"\n :class=\"userData.email_verified ? 'badge-success' : 'badge-error'\"\n >\n {{ userData.email_verified ? 'Verified' : 'Not Verified' }}\n </span>\n </div>\n </div>\n <div>\n <label class=\"label\">\n <span class=\"label-text font-semibold\">Created</span>\n </label>\n <div class=\"input input-bordered bg-base-200\">\n {{ formatSystemTimestamp(userData.created_at) }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Editable role -->\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"Update User Role\"\n subtitle=\"Change the user's role in the system\"\n >\n <zinia.UserTypeField />\n\n <div v-if=\"form.submitError\" class=\"alert alert-error mb-4\">\n <span>{{ form.submitError }}</span>\n </div>\n\n <div class=\"flex justify-center mt-6\">\n <ZiniaSubmitButton submitText=\"Update Role\" submittingText=\"Updating...\" />\n </div>\n\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n <ZiniaResetButton />\n </ZiniaForm>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatSystemTimestamp } from '../../../../utils/convertToLocalDateTime';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { UserUpdateDto } from '@dragonmastery/dragoncore-shared';\nimport { ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { updateUserSchemaWithMetadata } from './updateUserMetadata';\n\nconst route = useRoute();\nconst router = useRouter();\nconst userId = route.params.id as string;\n\n// Fetch user data\nconst {\n data,\n loading: fetching,\n error,\n} = useQuery((api) => api.users.getUser(userId), {\n staleTime: 5 * 60 * 1000,\n});\n\nconst userData = ref<any | null>(null);\n\n// Create form with user data\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton, ZiniaResetButton, ZiniaFormErrorsSummary } =\n useForm(updateUserSchemaWithMetadata, {\n storeName: `edit-user-form-${userId}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n while (fetching.value) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n if (!data.value) {\n throw new Error('User not found');\n }\n\n userData.value = data.value;\n return {\n id: data.value?.id,\n user_type: data.value?.user_type,\n } satisfies UserUpdateDto;\n },\n });\n\nconst { mutate: updateUser } = useMutation(\n (api, formData: UserUpdateDto) => api.users.updateUser(formData),\n { invalidate: /^users?:/ },\n);\n\nconst handleSubmit = async (formData: UserUpdateDto) => {\n const result = await updateUser(formData);\n if (!result) throw new Error('Failed to update user');\n return result;\n};\n\nconst handleSuccess = async (_result: any) => {\n await router.push({ name: 'UserManagement' });\n toast.success('User role updated successfully!');\n};\n\nconst handleError = (error: Error | unknown) => {\n form.setSubmitError(error instanceof Error ? error.message : 'An unknown error occurred');\n};\n</script>\n"],"mappings":";;;;;;;;;;AAGA,MAAa,+BAA+B,aAC1C,kBACA,oBACA,EACE,WAAW;CACT,OAAO;CACP,UAAU;CACX,EACF,CACF;;;;;;;;;;;;;;;;;;;;;;;;;ECsFD,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,WAAW;EAC1B,MAAM,SAAS,MAAM,OAAO;EAG5B,MAAM,EACJ,MACA,SAAS,UACT,UACE,UAAU,QAAQ,IAAI,MAAM,QAAQ,OAAO,EAAE,EAC/C,WAAW,MAAS,KACrB,CAAC;EAEF,MAAM,WAAW,IAAgB,KAAK;EAGtC,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,kBAAkB,2BACnE,QAAQ,8BAA8B;GACpC,WAAW,kBAAkB;GAC7B,uBAAuB;GACvB,aAAa;GACb,WAAW,YAAY;AACrB,WAAO,SAAS,MACd,OAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;AAG1D,QAAI,CAAC,KAAK,MACR,OAAM,IAAI,MAAM,iBAAiB;AAGnC,aAAS,QAAQ,KAAK;AACtB,WAAO;KACL,IAAI,KAAK,OAAO;KAChB,WAAW,KAAK,OAAO;KACxB;;GAEJ,CAAC;EAEJ,MAAM,EAAE,QAAQ,eAAe,aAC5B,KAAK,aAA4B,IAAI,MAAM,WAAW,SAAS,EAChE,EAAE,YAAY,YAAY,CAC3B;EAED,MAAM,eAAe,OAAO,aAA4B;GACtD,MAAM,SAAS,MAAM,WAAW,SAAS;AACzC,OAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,wBAAwB;AACrD,UAAO;;EAGT,MAAM,gBAAgB,OAAO,YAAiB;AAC5C,SAAM,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC7C,SAAM,QAAQ,kCAAkC;;EAGlD,MAAM,eAAe,YAA2B;AAC9C,QAAK,eAAe,mBAAiB,QAAQ,QAAM,UAAU,4BAA4B;;;uBAxJzF,mBAmFM,OAnFN,YAmFM;8BAlFJ,mBAA8D,MAAA,EAA1D,OAAM,uCAAqC,EAAC,aAAS,GAAA;IAEzD,mBAAA,kBAAsB;IACX,MAAA,SAAQ,IAAA,WAAA,EAAnB,mBAEM,OAFN,YAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAIlC,MAAA,MAAK,IAAA,WAAA,EAArB,mBAEM,UAAA,EAAA,KAAA,GAAA,EAAA,CAHN,mBAAA,gBAAoB,EACpB,mBAEM,OAFN,YAEM,CADJ,mBAAoD,QAAA,MAA9C,yBAAoB,gBAAG,MAAA,MAAK,CAAC,QAAO,EAAA,EAAA,CAAA,CAAA,CAAA,WAI5B,SAAA,SAAA,WAAA,EAAhB,mBAoEM,UAAA,EAAA,KAAA,GAAA,EAAA,CArEN,mBAAA,cAAkB,EAClB,mBAoEM,OAAA,MAAA;KAnEJ,mBAAA,wBAA4B;KAC5B,mBA2CM,OA3CN,YA2CM,CA1CJ,mBAyCM,OAzCN,YAyCM,CAAA,OAAA,OAAA,OAAA,KAxCJ,mBAA4C,MAAA,EAAxC,OAAM,cAAY,EAAC,oBAAgB,GAAA,GACvC,mBAsCM,OAtCN,YAsCM;MArCJ,mBAOM,OAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KANJ,mBAEQ,SAAA,EAFD,OAAM,SAAO,EAAA,CAClB,mBAAsD,QAAA,EAAhD,OAAM,4BAA0B,EAAC,WAAQ,CAAA,QAEjD,mBAEM,OAFN,YAEM,gBADD,SAAA,MAAS,SAAQ,EAAA,EAAA,CAAA,CAAA;MAGxB,mBAOM,OAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KANJ,mBAEQ,SAAA,EAFD,OAAM,SAAO,EAAA,CAClB,mBAAmD,QAAA,EAA7C,OAAM,4BAA0B,EAAC,QAAK,CAAA,QAE9C,mBAEM,OAFN,YAEM,gBADD,SAAA,MAAS,MAAK,EAAA,EAAA,CAAA,CAAA;MAGrB,mBAYM,OAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAXJ,mBAEQ,SAAA,EAFD,OAAM,SAAO,EAAA,CAClB,mBAA4D,QAAA,EAAtD,OAAM,4BAA0B,EAAC,iBAAc,CAAA,QAEvD,mBAOM,OAPN,YAOM,CANJ,mBAKO,QAAA,EAJL,OAAK,eAAA,CAAC,SACE,SAAA,MAAS,iBAAc,kBAAA,cAAA,CAAA,EAAA,kBAE5B,SAAA,MAAS,iBAAc,aAAA,eAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;MAIhC,mBAOM,OAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KANJ,mBAEQ,SAAA,EAFD,OAAM,SAAO,EAAA,CAClB,mBAAqD,QAAA,EAA/C,OAAM,4BAA0B,EAAC,UAAO,CAAA,QAEhD,mBAEM,OAFN,aAEM,gBADD,MAAA,sBAAqB,CAAC,SAAA,MAAS,WAAU,CAAA,EAAA,EAAA,CAAA,CAAA;;KAOtD,mBAAA,kBAAsB;KACtB,YAmBY,MAAA,UAAA,EAAA;MAlBT,gBAAe;MACf,WAAS;MACT,SAAO;MACR,OAAM;MACN,UAAS;;6BAEc;OAAvB,YAAuB,MAAA,MAAA,CAAA,cAAA;OAEZ,MAAA,KAAI,CAAC,eAAA,WAAA,EAAhB,mBAEM,OAFN,aAEM,CADJ,mBAAmC,QAAA,MAAA,gBAA1B,MAAA,KAAI,CAAC,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;OAG3B,mBAEM,OAFN,aAEM,CADJ,YAA2E,MAAA,kBAAA,EAAA;QAAxD,YAAW;QAAc,gBAAe;;OAG7D,YAAmE,MAAA,uBAAA,EAAA,EAA3C,OAAM,oCAAkC,CAAA;OAChE,YAAoB,MAAA,iBAAA,CAAA"}
@@ -0,0 +1,7 @@
1
+ import "./useRpcAuth-rmHf7bYx.js";
2
+ import "./useQueryCache-Bjm-S8v5.js";
3
+ import "./useMutation-BTsyHKyn.js";
4
+ import "./useQuery-BggIE52P.js";
5
+ import { t as EditUserPage_default } from "./EditUserPage-DURc5rmi.js";
6
+
7
+ export { EditUserPage_default as default };
@@ -0,0 +1,7 @@
1
+ import "./useRpcAuth-rmHf7bYx.js";
2
+ import "./useQueryCache-Bjm-S8v5.js";
3
+ import "./useMutation-BTsyHKyn.js";
4
+ import "./AppLink-CHMMrSFI.js";
5
+ import { t as ForgotPassword_default } from "./ForgotPassword-OjIPi9s9.js";
6
+
7
+ export { ForgotPassword_default as default };
@@ -1,4 +1,4 @@
1
- import { t as useMutation } from "./useMutation-Dhx2gMgS.js";
1
+ import { t as useMutation } from "./useMutation-BTsyHKyn.js";
2
2
  import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
3
3
  import { o as withReturnUrl } from "./useReturnUrl-qFeazn-G.js";
4
4
  import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
@@ -74,4 +74,4 @@ var ForgotPassword_default = _sfc_main;
74
74
 
75
75
  //#endregion
76
76
  export { forgotPasswordSchemaWithMetadata as n, ForgotPassword_default as t };
77
- //# sourceMappingURL=ForgotPassword-roKwDfce.js.map
77
+ //# sourceMappingURL=ForgotPassword-OjIPi9s9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ForgotPassword-roKwDfce.js","names":[],"sources":["../src/slices/auth/features/forgot_password/forgot_password_schema.ts","../src/slices/auth/features/forgot_password/ForgotPassword.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { forgot_password_zod } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type ForgotPasswordForm = z.infer<typeof forgot_password_zod>;\n\n// Enhance the schema with metadata\nexport const forgotPasswordSchemaWithMetadata = withMetadata(\n forgot_password_zod,\n 'forgotPasswordSchema',\n {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'username',\n className: 'login-field',\n autofocus: true,\n },\n },\n);\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Forgot Password</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.EmailField />\n\n <ZiniaSubmitButton submitText=\"Send Reset Password Email\" submittingText=\"Sending...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { computed } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport { forgotPasswordSchemaWithMetadata } from './forgot_password_schema';\n\nconst route = useRoute();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(\n forgotPasswordSchemaWithMetadata,\n {\n storeName: 'forgot-password-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n },\n);\n\nconst { mutate: forgotPasswordMutate } = useMutation(\n (api, email: string) => api.passwordReset.forgotPassword(email),\n {\n skipAuthCheck: true, // Forgot password should work without authentication\n },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof forgotPasswordSchemaWithMetadata>) => {\n const result = await forgotPasswordMutate(data.email);\n if (!result?.ok) throw new Error('Forgot password failed');\n return result.ok;\n};\n\n// Handle success\nconst handleSuccess = async (_data: boolean) => {\n form.reset();\n toast.success(\n 'If the email address exists, an email has been sent to your email address with instructions to reset your password.',\n );\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n toast.error(error instanceof Error ? error.message : 'Forgot password failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;AAQA,MAAa,mCAAmC,aAC9C,qBACA,wBACA,EACE,OAAO;CACL,WAAW;CACX,aAAa;CACb,UAAU;CACV,cAAc;CACd,WAAW;CACX,WAAW;CACZ,EACF,CACF;;;;;;;;;ECSD,MAAM,QAAQ,UAAU;EACxB,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAE/E,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QACpD,kCACA;GACE,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CACF;EAED,MAAM,EAAE,QAAQ,yBAAyB,aACtC,KAAK,UAAkB,IAAI,cAAc,eAAe,MAAM,EAC/D,EACE,eAAe,MAChB,CACF;EAGD,MAAM,eAAe,OAAO,SAA2D;GACrF,MAAM,SAAS,MAAM,qBAAqB,KAAK,MAAM;AACrD,OAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,yBAAyB;AAC1D,UAAO,OAAO;;EAIhB,MAAM,gBAAgB,OAAO,UAAmB;AAC9C,QAAK,OAAO;AACZ,SAAM,QACJ,sHACD;;EAIH,MAAM,eAAe,UAAmB;AACtC,SAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,yBAAyB;;;uBAlE9E,mBAeM,OAfN,YAeM,CAAA,OAAA,OAAA,OAAA,KAdJ,mBAAoE,MAAA,EAAhE,OAAM,uCAAqC,EAAC,mBAAe,GAAA,GAE/D,YAWY,MAAA,UAAA,EAAA;IAXA,gBAAe;IAAe,WAAS;IAAgB,SAAO;;2BACpD;KAApB,YAAoB,MAAA,MAAA,CAAA,WAAA;KAEpB,YAAwF,MAAA,kBAAA,EAAA;MAArE,YAAW;MAA4B,gBAAe;;KAEzE,mBAKM,OALN,YAKM,CAJJ,mBAGI,KAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAAA,gBAHD,8BAED,GAAA,GAAA,YAAiE,iBAAA;MAAxD,OAAM;MAAoB,IAAI,UAAA;;6BAAgB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAL,SAAK,GAAA,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"ForgotPassword-OjIPi9s9.js","names":[],"sources":["../src/slices/auth/features/forgot_password/forgot_password_schema.ts","../src/slices/auth/features/forgot_password/ForgotPassword.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { forgot_password_zod } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type ForgotPasswordForm = z.infer<typeof forgot_password_zod>;\n\n// Enhance the schema with metadata\nexport const forgotPasswordSchemaWithMetadata = withMetadata(\n forgot_password_zod,\n 'forgotPasswordSchema',\n {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'username',\n className: 'login-field',\n autofocus: true,\n },\n },\n);\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Forgot Password</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.EmailField />\n\n <ZiniaSubmitButton submitText=\"Send Reset Password Email\" submittingText=\"Sending...\" />\n\n <div class=\"text-center mt-2\">\n <p>\n Already have an account?\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Login</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { computed } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport { forgotPasswordSchemaWithMetadata } from './forgot_password_schema';\n\nconst route = useRoute();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(\n forgotPasswordSchemaWithMetadata,\n {\n storeName: 'forgot-password-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n },\n);\n\nconst { mutate: forgotPasswordMutate } = useMutation(\n (api, email: string) => api.passwordReset.forgotPassword(email),\n {\n skipAuthCheck: true, // Forgot password should work without authentication\n },\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof forgotPasswordSchemaWithMetadata>) => {\n const result = await forgotPasswordMutate(data.email);\n if (!result?.ok) throw new Error('Forgot password failed');\n return result.ok;\n};\n\n// Handle success\nconst handleSuccess = async (_data: boolean) => {\n form.reset();\n toast.success(\n 'If the email address exists, an email has been sent to your email address with instructions to reset your password.',\n );\n};\n\n// Handle error\nconst handleError = (error: unknown) => {\n toast.error(error instanceof Error ? error.message : 'Forgot password failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;AAQA,MAAa,mCAAmC,aAC9C,qBACA,wBACA,EACE,OAAO;CACL,WAAW;CACX,aAAa;CACb,UAAU;CACV,cAAc;CACd,WAAW;CACX,WAAW;CACZ,EACF,CACF;;;;;;;;;ECSD,MAAM,QAAQ,UAAU;EACxB,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAE/E,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QACpD,kCACA;GACE,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CACF;EAED,MAAM,EAAE,QAAQ,yBAAyB,aACtC,KAAK,UAAkB,IAAI,cAAc,eAAe,MAAM,EAC/D,EACE,eAAe,MAChB,CACF;EAGD,MAAM,eAAe,OAAO,SAA2D;GACrF,MAAM,SAAS,MAAM,qBAAqB,KAAK,MAAM;AACrD,OAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,yBAAyB;AAC1D,UAAO,OAAO;;EAIhB,MAAM,gBAAgB,OAAO,UAAmB;AAC9C,QAAK,OAAO;AACZ,SAAM,QACJ,sHACD;;EAIH,MAAM,eAAe,UAAmB;AACtC,SAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,yBAAyB;;;uBAlE9E,mBAeM,OAfN,YAeM,CAAA,OAAA,OAAA,OAAA,KAdJ,mBAAoE,MAAA,EAAhE,OAAM,uCAAqC,EAAC,mBAAe,GAAA,GAE/D,YAWY,MAAA,UAAA,EAAA;IAXA,gBAAe;IAAe,WAAS;IAAgB,SAAO;;2BACpD;KAApB,YAAoB,MAAA,MAAA,CAAA,WAAA;KAEpB,YAAwF,MAAA,kBAAA,EAAA;MAArE,YAAW;MAA4B,gBAAe;;KAEzE,mBAKM,OALN,YAKM,CAJJ,mBAGI,KAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAAA,gBAHD,8BAED,GAAA,GAAA,YAAiE,iBAAA;MAAxD,OAAM;MAAoB,IAAI,UAAA;;6BAAgB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAL,SAAK,GAAA,CAAA,EAAA,CAAA"}