@dragonmastery/dragoncore-vue 0.0.4 → 0.0.6

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 (56) hide show
  1. package/dist/{CreateTeamForm-zVlGgmL9.js → CreateTeamForm-O_viMOrD.js} +5 -5
  2. package/dist/{CreateTeamMemberForm-DkCbsJDn.js → CreateTeamMemberForm-BzwDug0x.js} +5 -5
  3. package/dist/{CreditBalanceDashboard-BTW4IK66.js → CreditBalanceDashboard-CBaQsjyo.js} +5 -5
  4. package/dist/{CreditManagement-0JxmCIAd.js → CreditManagement-Bal5mbQC.js} +5 -5
  5. package/dist/CustomerCreateSupportTicketForm-CpnbsCqr.js +27 -0
  6. package/dist/{CustomerSupportTicketDetailPage-DQa_Zvfe.js → CustomerSupportTicketDetailPage-DZQCplSM.js} +197 -183
  7. package/dist/CustomerSupportTicketDetailPage-DZQCplSM.js.map +1 -0
  8. package/dist/CustomerSupportTicketList-CKf8Kyzu.js +27 -0
  9. package/dist/{CustomerSupportTicketParent-BOYIren9.js → CustomerSupportTicketParent-BnmTFigo.js} +1 -1
  10. package/dist/{CustomerSupportTicketParent-sT8hpgrA.js → CustomerSupportTicketParent-BzY4pmBk.js} +2 -2
  11. package/dist/{CustomerSupportTicketParent-sT8hpgrA.js.map → CustomerSupportTicketParent-BzY4pmBk.js.map} +1 -1
  12. package/dist/CustomerSupportTicketSuccess-B-1n0gP-.js +27 -0
  13. package/dist/{EditTeamForm-BM90JTjr.js → EditTeamForm-CKnK07nF.js} +5 -5
  14. package/dist/{ResetPassword-DAn7dYAp.js → ResetPassword-Q8vhelQz.js} +5 -5
  15. package/dist/{SavedFiltersPage-BNasEKOY.js → SavedFiltersPage-DhhcU1R1.js} +51 -23
  16. package/dist/SavedFiltersPage-DhhcU1R1.js.map +1 -0
  17. package/dist/StaffCreateSupportTicketForm-D5ne_W9A.js +27 -0
  18. package/dist/{StaffSupportTicketDetailPage-D49ibqrO.js → StaffSupportTicketDetailPage-DY07Ez0R.js} +176 -132
  19. package/dist/StaffSupportTicketDetailPage-DY07Ez0R.js.map +1 -0
  20. package/dist/StaffSupportTicketList-xD3FaXkS.js +27 -0
  21. package/dist/{StaffSupportTicketParent-CxrPxXSH.js → StaffSupportTicketParent-CWWhaM37.js} +2 -2
  22. package/dist/{StaffSupportTicketParent-CxrPxXSH.js.map → StaffSupportTicketParent-CWWhaM37.js.map} +1 -1
  23. package/dist/{StaffSupportTicketParent-C7Mm7W_0.js → StaffSupportTicketParent-Dp1G85wc.js} +1 -1
  24. package/dist/StaffSupportTicketSuccess-D1nBsbcC.js +27 -0
  25. package/dist/{SupportTicketDevLifecycleBadge-Cl4y47Sy.js → SupportTicketDevLifecycleBadge-Ba-Rm6QW.js} +1 -1
  26. package/dist/{SupportTicketDevLifecycleBadge-Cl4y47Sy.js.map → SupportTicketDevLifecycleBadge-Ba-Rm6QW.js.map} +1 -1
  27. package/dist/{TeamAttachmentsTab-BoOIuTU1.js → TeamAttachmentsTab-DaCRkUsF.js} +5 -5
  28. package/dist/{ViewTeam-Bb1WH_Us.js → TeamList-BaZfSOG4.js} +6 -6
  29. package/dist/{TeamMemberList-CQTxcWNS.js → TeamMemberList-DOG48Y0Q.js} +5 -5
  30. package/dist/{TeamMemberParent-Bt0kbyKQ.js → TeamMemberParent-CTrhsG1K.js} +5 -5
  31. package/dist/{TeamParent-BvLiiJq6.js → TeamParent-myjqz30R.js} +5 -5
  32. package/dist/{TimelineNoteInput-BRsQ2QTz.js → TimelineNoteInput-BVqF4MtZ.js} +31 -8
  33. package/dist/TimelineNoteInput-BVqF4MtZ.js.map +1 -0
  34. package/dist/{TimelineSystemEvent-B69B3eeL.js → TimelineSystemEvent-D58zN850.js} +288 -205
  35. package/dist/TimelineSystemEvent-D58zN850.js.map +1 -0
  36. package/dist/{TeamList-TpS3BhPd.js → ViewTeam-DRQuV1A3.js} +6 -6
  37. package/dist/{ViewTeamMember-CBTAnAhS.js → ViewTeamMember-DjbxMkB4.js} +5 -5
  38. package/dist/{displayIdFormatter-BoKcrgF5.js → displayIdFormatter-B1ZKgofu.js} +1 -1
  39. package/dist/{displayIdFormatter-BoKcrgF5.js.map → displayIdFormatter-B1ZKgofu.js.map} +1 -1
  40. package/dist/index.d.ts +962 -938
  41. package/dist/index.js +6 -6
  42. package/dist/{src-ChwBeNHB.js → src-wQ7pAFHx.js} +1488 -1416
  43. package/dist/src-wQ7pAFHx.js.map +1 -0
  44. package/package.json +2 -2
  45. package/dist/CustomerCreateSupportTicketForm-CQcv4vrX.js +0 -27
  46. package/dist/CustomerSupportTicketDetailPage-DQa_Zvfe.js.map +0 -1
  47. package/dist/CustomerSupportTicketList-CMPRQ_7O.js +0 -27
  48. package/dist/CustomerSupportTicketSuccess-CnRWm6gX.js +0 -27
  49. package/dist/SavedFiltersPage-BNasEKOY.js.map +0 -1
  50. package/dist/StaffCreateSupportTicketForm-DoHCw60c.js +0 -27
  51. package/dist/StaffSupportTicketDetailPage-D49ibqrO.js.map +0 -1
  52. package/dist/StaffSupportTicketList-BgCIa_9v.js +0 -27
  53. package/dist/StaffSupportTicketSuccess-DZF2WpZc.js +0 -27
  54. package/dist/TimelineNoteInput-BRsQ2QTz.js.map +0 -1
  55. package/dist/TimelineSystemEvent-B69B3eeL.js.map +0 -1
  56. package/dist/src-ChwBeNHB.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomerSupportTicketDetailPage-DZQCplSM.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,27 @@
1
+ import "./useRpcAuth-Dp2sec-X.js";
2
+ import "./useQueryCache-DqcDMsxb.js";
3
+ import "./useMutation-B4_S4Xoa.js";
4
+ import "./useQuery-B7ndu5_P.js";
5
+ import { z as CustomerSupportTicketList_default } from "./src-wQ7pAFHx.js";
6
+ import "./AppLink-CHMMrSFI.js";
7
+ import "./TimelineSystemEvent-D58zN850.js";
8
+ import "./TeamMembersTab-4gmnP9sD.js";
9
+ import "./Appearance-BfPdKMXw.js";
10
+ import "./useBreadcrumbs-DmgSucoe.js";
11
+ import "./EditTeamMemberForm-CKbKomrL.js";
12
+ import "./TeamHistoryTab-CNelXR3Q.js";
13
+ import "./UserProfilePage-uAIfC_NW.js";
14
+ import "./ChangePasswordPage-DCews8GU.js";
15
+ import "./TeamNotesTab-BhVRLG8h.js";
16
+ import "./CustomerSupportTicketParent-BzY4pmBk.js";
17
+ import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
+ import "./StaffSupportTicketParent-CWWhaM37.js";
19
+ import "./LoginForm-C85U2E2r.js";
20
+ import "./Signup-hpV8J5cM.js";
21
+ import "./ForgotPassword-D3bjL48L.js";
22
+ import "./Logout-DZuWLh0O.js";
23
+ import "./UserListPage-OGYOLwlw.js";
24
+ import "./CreateUserPage-B8qeBZij.js";
25
+ import "./EditUserPage-XqF25iwz.js";
26
+
27
+ export { CustomerSupportTicketList_default as default };
@@ -2,6 +2,6 @@ import "./useRpcAuth-Dp2sec-X.js";
2
2
  import "./useQueryCache-DqcDMsxb.js";
3
3
  import "./useQuery-B7ndu5_P.js";
4
4
  import "./useBreadcrumbs-DmgSucoe.js";
5
- import { t as CustomerSupportTicketParent_default } from "./CustomerSupportTicketParent-sT8hpgrA.js";
5
+ import { t as CustomerSupportTicketParent_default } from "./CustomerSupportTicketParent-BzY4pmBk.js";
6
6
 
7
7
  export { CustomerSupportTicketParent_default as default };
@@ -1,6 +1,6 @@
1
1
  import { t as useQuery } from "./useQuery-B7ndu5_P.js";
2
2
  import { n as useBreadcrumbs } from "./useBreadcrumbs-DmgSucoe.js";
3
- import { t as formatTicketDisplayId } from "./displayIdFormatter-BoKcrgF5.js";
3
+ import { t as formatTicketDisplayId } from "./displayIdFormatter-B1ZKgofu.js";
4
4
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, openBlock, provide, resolveComponent, toDisplayString, unref } from "vue";
5
5
  import { useRoute } from "vue-router";
6
6
 
@@ -63,4 +63,4 @@ var CustomerSupportTicketParent_default = _sfc_main;
63
63
 
64
64
  //#endregion
65
65
  export { CustomerSupportTicketParent_default as t };
66
- //# sourceMappingURL=CustomerSupportTicketParent-sT8hpgrA.js.map
66
+ //# sourceMappingURL=CustomerSupportTicketParent-BzY4pmBk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerSupportTicketParent-sT8hpgrA.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-BzY4pmBk.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,27 @@
1
+ import "./useRpcAuth-Dp2sec-X.js";
2
+ import "./useQueryCache-DqcDMsxb.js";
3
+ import "./useMutation-B4_S4Xoa.js";
4
+ import "./useQuery-B7ndu5_P.js";
5
+ import { R as CustomerSupportTicketSuccess_default } from "./src-wQ7pAFHx.js";
6
+ import "./AppLink-CHMMrSFI.js";
7
+ import "./TimelineSystemEvent-D58zN850.js";
8
+ import "./TeamMembersTab-4gmnP9sD.js";
9
+ import "./Appearance-BfPdKMXw.js";
10
+ import "./useBreadcrumbs-DmgSucoe.js";
11
+ import "./EditTeamMemberForm-CKbKomrL.js";
12
+ import "./TeamHistoryTab-CNelXR3Q.js";
13
+ import "./UserProfilePage-uAIfC_NW.js";
14
+ import "./ChangePasswordPage-DCews8GU.js";
15
+ import "./TeamNotesTab-BhVRLG8h.js";
16
+ import "./CustomerSupportTicketParent-BzY4pmBk.js";
17
+ import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
+ import "./StaffSupportTicketParent-CWWhaM37.js";
19
+ import "./LoginForm-C85U2E2r.js";
20
+ import "./Signup-hpV8J5cM.js";
21
+ import "./ForgotPassword-D3bjL48L.js";
22
+ import "./Logout-DZuWLh0O.js";
23
+ import "./UserListPage-OGYOLwlw.js";
24
+ import "./CreateUserPage-B8qeBZij.js";
25
+ import "./EditUserPage-XqF25iwz.js";
26
+
27
+ export { CustomerSupportTicketSuccess_default as default };
@@ -2,9 +2,9 @@ import "./useRpcAuth-Dp2sec-X.js";
2
2
  import "./useQueryCache-DqcDMsxb.js";
3
3
  import "./useMutation-B4_S4Xoa.js";
4
4
  import "./useQuery-B7ndu5_P.js";
5
- import { ht as EditTeamForm_default } from "./src-ChwBeNHB.js";
5
+ import { ht as EditTeamForm_default } from "./src-wQ7pAFHx.js";
6
6
  import "./AppLink-CHMMrSFI.js";
7
- import "./TimelineSystemEvent-B69B3eeL.js";
7
+ import "./TimelineSystemEvent-D58zN850.js";
8
8
  import "./TeamMembersTab-4gmnP9sD.js";
9
9
  import "./Appearance-BfPdKMXw.js";
10
10
  import "./useBreadcrumbs-DmgSucoe.js";
@@ -13,9 +13,9 @@ import "./TeamHistoryTab-CNelXR3Q.js";
13
13
  import "./UserProfilePage-uAIfC_NW.js";
14
14
  import "./ChangePasswordPage-DCews8GU.js";
15
15
  import "./TeamNotesTab-BhVRLG8h.js";
16
- import "./CustomerSupportTicketParent-sT8hpgrA.js";
17
- import "./SupportTicketDevLifecycleBadge-Cl4y47Sy.js";
18
- import "./StaffSupportTicketParent-CxrPxXSH.js";
16
+ import "./CustomerSupportTicketParent-BzY4pmBk.js";
17
+ import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
+ import "./StaffSupportTicketParent-CWWhaM37.js";
19
19
  import "./LoginForm-C85U2E2r.js";
20
20
  import "./Signup-hpV8J5cM.js";
21
21
  import "./ForgotPassword-D3bjL48L.js";
@@ -2,9 +2,9 @@ import "./useRpcAuth-Dp2sec-X.js";
2
2
  import "./useQueryCache-DqcDMsxb.js";
3
3
  import "./useMutation-B4_S4Xoa.js";
4
4
  import "./useQuery-B7ndu5_P.js";
5
- import { g as ResetPassword_default } from "./src-ChwBeNHB.js";
5
+ import { g as ResetPassword_default } from "./src-wQ7pAFHx.js";
6
6
  import "./AppLink-CHMMrSFI.js";
7
- import "./TimelineSystemEvent-B69B3eeL.js";
7
+ import "./TimelineSystemEvent-D58zN850.js";
8
8
  import "./TeamMembersTab-4gmnP9sD.js";
9
9
  import "./Appearance-BfPdKMXw.js";
10
10
  import "./useBreadcrumbs-DmgSucoe.js";
@@ -13,9 +13,9 @@ import "./TeamHistoryTab-CNelXR3Q.js";
13
13
  import "./UserProfilePage-uAIfC_NW.js";
14
14
  import "./ChangePasswordPage-DCews8GU.js";
15
15
  import "./TeamNotesTab-BhVRLG8h.js";
16
- import "./CustomerSupportTicketParent-sT8hpgrA.js";
17
- import "./SupportTicketDevLifecycleBadge-Cl4y47Sy.js";
18
- import "./StaffSupportTicketParent-CxrPxXSH.js";
16
+ import "./CustomerSupportTicketParent-BzY4pmBk.js";
17
+ import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
+ import "./StaffSupportTicketParent-CWWhaM37.js";
19
19
  import "./LoginForm-C85U2E2r.js";
20
20
  import "./Signup-hpV8J5cM.js";
21
21
  import "./ForgotPassword-D3bjL48L.js";
@@ -2,9 +2,9 @@ import "./useRpcAuth-Dp2sec-X.js";
2
2
  import "./useQueryCache-DqcDMsxb.js";
3
3
  import { t as useMutation } from "./useMutation-B4_S4Xoa.js";
4
4
  import { t as useQuery } from "./useQuery-B7ndu5_P.js";
5
- import { tn as useInjectedPinnedPresets } from "./src-ChwBeNHB.js";
5
+ import { tn as useInjectedPinnedPresets } from "./src-wQ7pAFHx.js";
6
6
  import "./AppLink-CHMMrSFI.js";
7
- import "./TimelineSystemEvent-B69B3eeL.js";
7
+ import { d as ConfirmDialog_default } from "./TimelineSystemEvent-D58zN850.js";
8
8
  import "./TeamMembersTab-4gmnP9sD.js";
9
9
  import "./Appearance-BfPdKMXw.js";
10
10
  import "./useBreadcrumbs-DmgSucoe.js";
@@ -13,9 +13,9 @@ import "./TeamHistoryTab-CNelXR3Q.js";
13
13
  import "./UserProfilePage-uAIfC_NW.js";
14
14
  import "./ChangePasswordPage-DCews8GU.js";
15
15
  import "./TeamNotesTab-BhVRLG8h.js";
16
- import "./CustomerSupportTicketParent-sT8hpgrA.js";
17
- import "./SupportTicketDevLifecycleBadge-Cl4y47Sy.js";
18
- import "./StaffSupportTicketParent-CxrPxXSH.js";
16
+ import "./CustomerSupportTicketParent-BzY4pmBk.js";
17
+ import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
+ import "./StaffSupportTicketParent-CWWhaM37.js";
19
19
  import "./LoginForm-C85U2E2r.js";
20
20
  import "./Signup-hpV8J5cM.js";
21
21
  import "./ForgotPassword-D3bjL48L.js";
@@ -69,7 +69,7 @@ const CACHE_KEY_ALL = "saved-filters:all";
69
69
  const _sfc_main = /* @__PURE__ */ defineComponent({
70
70
  __name: "SavedFiltersPage",
71
71
  setup(__props) {
72
- const { data: allPresets, loading } = useQuery((api) => api.savedFilters.listAllSavedFilters(), {
72
+ const { data: allPresets, loading, refetch: refetchAllPresets } = useQuery((api) => api.savedFilters.listAllSavedFilters(), {
73
73
  cacheKey: CACHE_KEY_ALL,
74
74
  staleTime: 1440 * 60 * 1e3
75
75
  });
@@ -145,10 +145,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
145
145
  await injectedPinned.refetchPinned();
146
146
  } catch {}
147
147
  }
148
- async function handleDelete(preset) {
148
+ const showDeleteConfirm = ref(false);
149
+ const presetToDelete = ref(null);
150
+ function handleDelete(preset) {
151
+ presetToDelete.value = preset;
152
+ showDeleteConfirm.value = true;
153
+ }
154
+ async function confirmDelete() {
155
+ if (!presetToDelete.value) return;
149
156
  try {
150
- await deletePreset(preset.id);
151
- if (isPinned(preset.id)) await injectedPinned.unpinPreset(preset.id);
157
+ await deletePreset(presetToDelete.value.id);
158
+ if (isPinned(presetToDelete.value.id)) await injectedPinned.unpinPreset(presetToDelete.value.id);
159
+ await refetchAllPresets();
160
+ presetToDelete.value = null;
161
+ showDeleteConfirm.value = false;
152
162
  } catch {}
153
163
  }
154
164
  const editingId = ref(null);
@@ -172,21 +182,23 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
172
182
  name
173
183
  });
174
184
  cancelRename();
185
+ await refetchAllPresets();
186
+ if (isPinned(presetId)) await injectedPinned.refetchPinned();
175
187
  } catch {}
176
188
  }
177
189
  return (_ctx, _cache) => {
178
190
  const _component_router_link = resolveComponent("router-link");
179
191
  return openBlock(), createElementBlock("div", _hoisted_1, [
180
- _cache[13] || (_cache[13] = createElementVNode("h1", { class: "text-2xl font-bold mb-6" }, "Saved Filters", -1)),
181
- unref(loading) ? (openBlock(), createElementBlock("div", _hoisted_2, [..._cache[1] || (_cache[1] = [createElementVNode("span", { class: "loading loading-spinner loading-lg" }, null, -1)])])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
192
+ _cache[15] || (_cache[15] = createElementVNode("h1", { class: "text-2xl font-bold mb-6" }, "Saved Filters", -1)),
193
+ unref(loading) ? (openBlock(), createElementBlock("div", _hoisted_2, [..._cache[3] || (_cache[3] = [createElementVNode("span", { class: "loading loading-spinner loading-lg" }, null, -1)])])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
182
194
  createCommentVNode(" Favorites (pinned) section with reorder "),
183
195
  pinnedPresets.value.length > 0 ? (openBlock(), createElementBlock("section", _hoisted_3, [
184
- _cache[7] || (_cache[7] = createElementVNode("h2", { class: "text-lg font-semibold mb-3 flex items-center gap-2" }, [createElementVNode("svg", {
196
+ _cache[9] || (_cache[9] = createElementVNode("h2", { class: "text-lg font-semibold mb-3 flex items-center gap-2" }, [createElementVNode("svg", {
185
197
  class: "w-5 h-5 text-primary",
186
198
  fill: "currentColor",
187
199
  viewBox: "0 0 24 24"
188
200
  }, [createElementVNode("path", { d: "M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z" })]), createTextVNode(" Favorites ")], -1)),
189
- _cache[8] || (_cache[8] = createElementVNode("p", { class: "text-sm text-base-content/70 mb-3" }, " Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder. ", -1)),
201
+ _cache[10] || (_cache[10] = createElementVNode("p", { class: "text-sm text-base-content/70 mb-3" }, " Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder. ", -1)),
190
202
  createElementVNode("ul", _hoisted_4, [(openBlock(true), createElementBlock(Fragment, null, renderList(pinnedPresets.value, (preset, idx) => {
191
203
  return openBlock(), createElementBlock("li", {
192
204
  key: preset.id,
@@ -198,7 +210,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
198
210
  disabled: unref(reordering) || idx === 0,
199
211
  title: "Move up",
200
212
  onClick: ($event) => movePinned(idx, -1)
201
- }, [..._cache[2] || (_cache[2] = [createElementVNode("svg", {
213
+ }, [..._cache[4] || (_cache[4] = [createElementVNode("svg", {
202
214
  class: "w-4 h-4",
203
215
  fill: "none",
204
216
  stroke: "currentColor",
@@ -214,7 +226,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
214
226
  disabled: unref(reordering) || idx === pinnedPresets.value.length - 1,
215
227
  title: "Move down",
216
228
  onClick: ($event) => movePinned(idx, 1)
217
- }, [..._cache[3] || (_cache[3] = [createElementVNode("svg", {
229
+ }, [..._cache[5] || (_cache[5] = [createElementVNode("svg", {
218
230
  class: "w-4 h-4",
219
231
  fill: "none",
220
232
  stroke: "currentColor",
@@ -240,7 +252,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
240
252
  title: "Rename",
241
253
  disabled: unref(renaming),
242
254
  onClick: ($event) => startRename(preset)
243
- }, [..._cache[4] || (_cache[4] = [createElementVNode("svg", {
255
+ }, [..._cache[6] || (_cache[6] = [createElementVNode("svg", {
244
256
  class: "w-4 h-4",
245
257
  fill: "none",
246
258
  stroke: "currentColor",
@@ -257,7 +269,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
257
269
  title: "Unpin",
258
270
  disabled: unpinning.value,
259
271
  onClick: ($event) => handleUnpin(preset)
260
- }, [..._cache[5] || (_cache[5] = [createElementVNode("svg", {
272
+ }, [..._cache[7] || (_cache[7] = [createElementVNode("svg", {
261
273
  class: "w-4 h-4",
262
274
  fill: "currentColor",
263
275
  viewBox: "0 0 24 24"
@@ -268,7 +280,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
268
280
  title: "Delete",
269
281
  disabled: unref(deleting),
270
282
  onClick: ($event) => handleDelete(preset)
271
- }, [..._cache[6] || (_cache[6] = [createElementVNode("svg", {
283
+ }, [..._cache[8] || (_cache[8] = [createElementVNode("svg", {
272
284
  class: "w-4 h-4",
273
285
  fill: "none",
274
286
  stroke: "currentColor",
@@ -284,7 +296,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
284
296
  }), 128))])
285
297
  ])) : createCommentVNode("v-if", true),
286
298
  createCommentVNode(" All presets grouped by path "),
287
- createElementVNode("section", null, [_cache[12] || (_cache[12] = createElementVNode("h2", { class: "text-lg font-semibold mb-3" }, "All Presets", -1)), groupedPresets.value.length === 0 ? (openBlock(), createElementBlock("p", _hoisted_13, " No saved presets yet. Use the Presets button on any list page to save your filters. ")) : (openBlock(), createElementBlock("div", _hoisted_14, [(openBlock(true), createElementBlock(Fragment, null, renderList(groupedPresets.value, ([routePath, presets]) => {
299
+ createElementVNode("section", null, [_cache[14] || (_cache[14] = createElementVNode("h2", { class: "text-lg font-semibold mb-3" }, "All Presets", -1)), groupedPresets.value.length === 0 ? (openBlock(), createElementBlock("p", _hoisted_13, " No saved presets yet. Use the Presets button on any list page to save your filters. ")) : (openBlock(), createElementBlock("div", _hoisted_14, [(openBlock(true), createElementBlock(Fragment, null, renderList(groupedPresets.value, ([routePath, presets]) => {
288
300
  return openBlock(), createElementBlock("div", {
289
301
  key: routePath,
290
302
  class: "space-y-2"
@@ -330,7 +342,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
330
342
  title: canPinMore.value ? "Pin to favorites" : "Maximum 5 pinned",
331
343
  disabled: !canPinMore.value || pinning.value,
332
344
  onClick: ($event) => handlePin(preset)
333
- }, [..._cache[9] || (_cache[9] = [createElementVNode("svg", {
345
+ }, [..._cache[11] || (_cache[11] = [createElementVNode("svg", {
334
346
  class: "w-4 h-4",
335
347
  fill: "none",
336
348
  stroke: "currentColor",
@@ -347,7 +359,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
347
359
  title: "Rename",
348
360
  disabled: unref(renaming),
349
361
  onClick: ($event) => startRename(preset)
350
- }, [..._cache[10] || (_cache[10] = [createElementVNode("svg", {
362
+ }, [..._cache[12] || (_cache[12] = [createElementVNode("svg", {
351
363
  class: "w-4 h-4",
352
364
  fill: "none",
353
365
  stroke: "currentColor",
@@ -364,7 +376,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
364
376
  title: "Delete",
365
377
  disabled: unref(deleting),
366
378
  onClick: ($event) => handleDelete(preset)
367
- }, [..._cache[11] || (_cache[11] = [createElementVNode("svg", {
379
+ }, [..._cache[13] || (_cache[13] = [createElementVNode("svg", {
368
380
  class: "w-4 h-4",
369
381
  fill: "none",
370
382
  stroke: "currentColor",
@@ -379,6 +391,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
379
391
  }), 128))])]);
380
392
  }), 128))]))])
381
393
  ], 64)),
394
+ createCommentVNode(" Delete confirmation modal "),
395
+ createVNode(ConfirmDialog_default, {
396
+ modelValue: showDeleteConfirm.value,
397
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => showDeleteConfirm.value = $event),
398
+ title: "Delete preset?",
399
+ "confirm-text": "Delete",
400
+ "cancel-text": "Cancel",
401
+ "processing-text": "Deleting...",
402
+ "confirm-button-class": "btn-error",
403
+ "is-processing": unref(deleting),
404
+ onConfirm: confirmDelete,
405
+ onCancel: _cache[2] || (_cache[2] = ($event) => presetToDelete.value = null)
406
+ }, {
407
+ message: withCtx(() => [createElementVNode("p", null, " Are you sure you want to delete \"" + toDisplayString(presetToDelete.value?.name) + "\"? This cannot be undone. ", 1)]),
408
+ _: 1
409
+ }, 8, ["modelValue", "is-processing"]),
382
410
  createCommentVNode(" Rename modal / inline could stay as is ")
383
411
  ]);
384
412
  };
@@ -388,4 +416,4 @@ var SavedFiltersPage_default = _sfc_main;
388
416
 
389
417
  //#endregion
390
418
  export { SavedFiltersPage_default as default };
391
- //# sourceMappingURL=SavedFiltersPage-BNasEKOY.js.map
419
+ //# sourceMappingURL=SavedFiltersPage-DhhcU1R1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SavedFiltersPage-DhhcU1R1.js","names":["CONTEXT_LABELS: Record<string, string>"],"sources":["../src/slices/saved_filter/SavedFiltersPage.vue"],"sourcesContent":["<template>\n <div class=\"max-w-4xl mx-auto\">\n <h1 class=\"text-2xl font-bold mb-6\">Saved Filters</h1>\n\n <div v-if=\"loading\" class=\"flex justify-center py-12\">\n <span class=\"loading loading-spinner loading-lg\" />\n </div>\n\n <template v-else>\n <!-- Favorites (pinned) section with reorder -->\n <section v-if=\"pinnedPresets.length > 0\" class=\"mb-8\">\n <h2 class=\"text-lg font-semibold mb-3 flex items-center gap-2\">\n <svg\n class=\"w-5 h-5 text-primary\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n Favorites\n </h2>\n <p class=\"text-sm text-base-content/70 mb-3\">\n Pinned presets appear on your home page and in the sidebar. Use the arrows to reorder.\n </p>\n <ul class=\"space-y-2\">\n <li\n v-for=\"(preset, idx) in pinnedPresets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <div class=\"flex flex-col gap-0.5 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === 0\"\n title=\"Move up\"\n @click=\"movePinned(idx, -1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-square\"\n :disabled=\"reordering || idx === pinnedPresets.length - 1\"\n title=\"Move down\"\n @click=\"movePinned(idx, 1)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <span class=\"text-xs text-base-content/60 shrink-0\">\n {{ contextLabel(preset.context) }}\n </span>\n <div class=\"flex gap-1 shrink-0\">\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-primary\"\n title=\"Unpin\"\n :disabled=\"unpinning\"\n @click=\"handleUnpin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </li>\n </ul>\n </section>\n\n <!-- All presets grouped by path -->\n <section>\n <h2 class=\"text-lg font-semibold mb-3\">All Presets</h2>\n <p v-if=\"groupedPresets.length === 0\" class=\"text-base-content/70 text-sm\">\n No saved presets yet. Use the Presets button on any list page to save your filters.\n </p>\n <div v-else class=\"space-y-6\">\n <div\n v-for=\"[routePath, presets] in groupedPresets\"\n :key=\"routePath\"\n class=\"space-y-2\"\n >\n <h3 class=\"text-sm font-medium text-base-content/80 uppercase tracking-wide\">\n {{ contextLabelFromPath(routePath) }}\n </h3>\n <ul class=\"space-y-2\">\n <li\n v-for=\"preset in presets\"\n :key=\"preset.id\"\n class=\"flex items-center gap-2 p-3 rounded-lg bg-base-200\"\n >\n <template v-if=\"editingId === preset.id\">\n <input\n ref=\"renameInputRef\"\n v-model=\"editingName\"\n type=\"text\"\n class=\"input input-sm input-bordered flex-1 min-w-0\"\n maxlength=\"100\"\n placeholder=\"Preset name\"\n @keydown.enter=\"saveRename(preset.id)\"\n @keydown.escape=\"cancelRename\"\n />\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary shrink-0\"\n :disabled=\"renaming || !editingName.trim()\"\n @click=\"saveRename(preset.id)\"\n >\n {{ renaming ? '...' : 'Save' }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-ghost shrink-0\"\n :disabled=\"renaming\"\n @click=\"cancelRename\"\n >\n Cancel\n </button>\n </template>\n <template v-else>\n <router-link\n :to=\"getPresetLink(preset)\"\n class=\"flex-1 min-w-0 font-medium truncate hover:underline\"\n >\n {{ preset.name }}\n </router-link>\n <div class=\"flex gap-1 shrink-0\">\n <button\n v-if=\"!isPinned(preset.id)\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n :title=\"canPinMore ? 'Pin to favorites' : 'Maximum 5 pinned'\"\n :disabled=\"!canPinMore || pinning\"\n @click=\"handlePin(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n title=\"Rename\"\n :disabled=\"renaming\"\n @click=\"startRename(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm text-error\"\n title=\"Delete\"\n :disabled=\"deleting\"\n @click=\"handleDelete(preset)\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </template>\n </li>\n </ul>\n </div>\n </div>\n </section>\n </template>\n\n <!-- Delete confirmation modal -->\n <ConfirmDialog\n v-model=\"showDeleteConfirm\"\n title=\"Delete preset?\"\n confirm-text=\"Delete\"\n cancel-text=\"Cancel\"\n processing-text=\"Deleting...\"\n confirm-button-class=\"btn-error\"\n :is-processing=\"deleting\"\n @confirm=\"confirmDelete\"\n @cancel=\"presetToDelete = null\"\n >\n <template #message>\n <p>\n Are you sure you want to delete \"{{ presetToDelete?.name }}\"?\n This cannot be undone.\n </p>\n </template>\n </ConfirmDialog>\n\n <!-- Rename modal / inline could stay as is -->\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SavedFilterReadDto } from '@dragonmastery/dragoncore-shared';\nimport { useMutation, useQuery } from '@dragonmastery/dragoncore-vue';\nimport { computed, nextTick, ref } from 'vue';\nimport ConfirmDialog from '../../components/ConfirmDialog.vue';\nimport { useInjectedPinnedPresets } from './usePinnedPresets';\n\nconst CACHE_KEY_ALL = 'saved-filters:all';\n\nconst { data: allPresets, loading, refetch: refetchAllPresets } = useQuery(\n (api) => api.savedFilters.listAllSavedFilters(),\n { cacheKey: CACHE_KEY_ALL, staleTime: 24 * 60 * 60 * 1000 },\n);\n\nconst injectedPinned = useInjectedPinnedPresets();\nconst pinnedPresets = computed(() => injectedPinned.pinned.value ?? []);\n\nconst groupedPresets = computed(() => {\n const groups = new Map<string, SavedFilterReadDto[]>();\n for (const preset of allPresets.value ?? []) {\n const key = preset.route_path || preset.context || 'other';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(preset);\n }\n return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst pinnedIdsSet = computed(() => new Set(pinnedPresets.value.map((p) => p.id)));\nconst canPinMore = computed(() => pinnedPresets.value.length < 5);\n\nfunction isPinned(id: string) {\n return pinnedIdsSet.value.has(id);\n}\n\nfunction getPresetLink(preset: SavedFilterReadDto) {\n return {\n path: preset.route_path,\n query: preset.filters ?? {},\n };\n}\n\nconst CONTEXT_LABELS: Record<string, string> = {\n tracker: 'Trackers',\n followup: 'Followups',\n support_ticket_staff: 'Staff Support Tickets',\n support_ticket_customer: 'Customer Support Tickets',\n};\n\nfunction contextLabel(context: string): string {\n return CONTEXT_LABELS[context] ?? context;\n}\n\nfunction contextLabelFromPath(routePath: string): string {\n if (routePath.startsWith('/trackers')) return 'Trackers';\n if (routePath.startsWith('/followups')) return 'Followups';\n if (routePath.startsWith('/support-tickets/staff')) return 'Staff Support Tickets';\n if (routePath.startsWith('/support-tickets')) return 'Customer Support Tickets';\n return routePath || 'Other';\n}\n\nconst { mutate: reorderPins, loading: reordering } = useMutation(\n (api, ids: string[]) => api.savedFilters.reorderPinnedPresets(ids),\n { invalidate: 'pinned-presets' },\n);\n\nconst { mutate: updatePreset, loading: renaming } = useMutation(\n (api, input: { id: string; name: string }) =>\n api.savedFilters.updateSavedFilter({ id: input.id, name: input.name }),\n { invalidate: /^saved-filters:/ },\n);\n\nconst { mutate: deletePreset, loading: deleting } = useMutation(\n (api, id: string) => api.savedFilters.deleteSavedFilter(id),\n { invalidate: /^saved-filters:|^pinned-presets/ },\n);\n\nconst pinning = ref(false);\nconst unpinning = ref(false);\n\nasync function handlePin(preset: SavedFilterReadDto) {\n pinning.value = true;\n try {\n await injectedPinned.pinPreset(preset);\n } finally {\n pinning.value = false;\n }\n}\n\nasync function handleUnpin(preset: SavedFilterReadDto) {\n unpinning.value = true;\n try {\n await injectedPinned.unpinPreset(preset.id);\n } finally {\n unpinning.value = false;\n }\n}\n\nasync function movePinned(idx: number, delta: number) {\n const list = [...pinnedPresets.value];\n const newIdx = idx + delta;\n if (newIdx < 0 || newIdx >= list.length) return;\n [list[idx], list[newIdx]] = [list[newIdx]!, list[idx]!];\n try {\n await reorderPins(list.map((p) => p.id));\n await injectedPinned.refetchPinned();\n } catch {\n // Error handled by mutation\n }\n}\n\nconst showDeleteConfirm = ref(false);\nconst presetToDelete = ref<SavedFilterReadDto | null>(null);\n\nfunction handleDelete(preset: SavedFilterReadDto) {\n presetToDelete.value = preset;\n showDeleteConfirm.value = true;\n}\n\nasync function confirmDelete() {\n if (!presetToDelete.value) return;\n try {\n await deletePreset(presetToDelete.value.id);\n if (isPinned(presetToDelete.value.id)) {\n await injectedPinned.unpinPreset(presetToDelete.value.id);\n }\n await refetchAllPresets();\n presetToDelete.value = null;\n showDeleteConfirm.value = false;\n } catch {\n // Error handled by mutation\n }\n}\n\nconst editingId = ref<string | null>(null);\nconst editingName = ref('');\nconst renameInputRef = ref<HTMLInputElement | null>(null);\n\nfunction startRename(preset: SavedFilterReadDto) {\n editingId.value = preset.id;\n editingName.value = preset.name;\n nextTick(() => renameInputRef.value?.focus());\n}\n\nfunction cancelRename() {\n editingId.value = null;\n editingName.value = '';\n}\n\nasync function saveRename(presetId: string) {\n const name = editingName.value.trim();\n if (!name) return;\n try {\n await updatePreset({ id: presetId, name });\n cancelRename();\n await refetchAllPresets();\n if (isPinned(presetId)) {\n await injectedPinned.refetchPinned();\n }\n } catch {\n // Error handled by mutation\n }\n}\n</script>\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import "./useRpcAuth-Dp2sec-X.js";
2
+ import "./useQueryCache-DqcDMsxb.js";
3
+ import "./useMutation-B4_S4Xoa.js";
4
+ import "./useQuery-B7ndu5_P.js";
5
+ import { O as StaffCreateSupportTicketForm_default } from "./src-wQ7pAFHx.js";
6
+ import "./AppLink-CHMMrSFI.js";
7
+ import "./TimelineSystemEvent-D58zN850.js";
8
+ import "./TeamMembersTab-4gmnP9sD.js";
9
+ import "./Appearance-BfPdKMXw.js";
10
+ import "./useBreadcrumbs-DmgSucoe.js";
11
+ import "./EditTeamMemberForm-CKbKomrL.js";
12
+ import "./TeamHistoryTab-CNelXR3Q.js";
13
+ import "./UserProfilePage-uAIfC_NW.js";
14
+ import "./ChangePasswordPage-DCews8GU.js";
15
+ import "./TeamNotesTab-BhVRLG8h.js";
16
+ import "./CustomerSupportTicketParent-BzY4pmBk.js";
17
+ import "./SupportTicketDevLifecycleBadge-Ba-Rm6QW.js";
18
+ import "./StaffSupportTicketParent-CWWhaM37.js";
19
+ import "./LoginForm-C85U2E2r.js";
20
+ import "./Signup-hpV8J5cM.js";
21
+ import "./ForgotPassword-D3bjL48L.js";
22
+ import "./Logout-DZuWLh0O.js";
23
+ import "./UserListPage-OGYOLwlw.js";
24
+ import "./CreateUserPage-B8qeBZij.js";
25
+ import "./EditUserPage-XqF25iwz.js";
26
+
27
+ export { StaffCreateSupportTicketForm_default as default };