import IndicatorIcon from '@/components/Icons/IndicatorIcon.vue' import { capture } from '@/telemetry' import { parseColor } from '@/utils' import { defineStore } from 'pinia' import { createListResource } from 'jingrow-ui' import { reactive, h } from 'vue' export const statusesStore = defineStore('crm-statuses', () => { let leadStatusesByName = reactive({}) let dealStatusesByName = reactive({}) let communicationStatusesByName = reactive({}) const leadStatuses = createListResource({ pagetype: 'CRM Lead Status', fields: ['name', 'color', 'position'], orderBy: 'position asc', cache: 'lead-statuses', initialData: [], auto: true, transform(statuses) { for (let status of statuses) { status.color = parseColor(status.color) leadStatusesByName[status.name] = status } return statuses }, }) const dealStatuses = createListResource({ pagetype: 'CRM Deal Status', fields: ['name', 'color', 'position', 'type'], orderBy: 'position asc', cache: 'deal-statuses', initialData: [], auto: true, transform(statuses) { for (let status of statuses) { status.color = parseColor(status.color) dealStatusesByName[status.name] = status } return statuses }, }) const communicationStatuses = createListResource({ pagetype: 'CRM Communication Status', fields: ['name'], cache: 'communication-statuses', initialData: [], auto: true, transform(statuses) { for (let status of statuses) { communicationStatusesByName[status.name] = status } return statuses }, }) function getLeadStatus(name) { if (!name) { name = leadStatuses.data[0].name } return leadStatusesByName[name] } function getDealStatus(name) { if (!name) { name = dealStatuses.data[0].name } return dealStatusesByName[name] } function getCommunicationStatus(name) { if (!name) { name = communicationStatuses.data[0].name } return communicationStatuses[name] } function statusOptions(pagetype, statuses = [], triggerStatusChange = null) { let statusesByName = pagetype == 'deal' ? dealStatusesByName : leadStatusesByName if (statuses?.length) { statusesByName = statuses.reduce((acc, status) => { acc[status] = statusesByName[status] return acc }, {}) } let options = [] for (const status in statusesByName) { options.push({ label: statusesByName[status]?.name, value: statusesByName[status]?.name, icon: () => h(IndicatorIcon, { class: statusesByName[status]?.color }), onClick: async () => { await triggerStatusChange?.(statusesByName[status]?.name) capture('status_changed', { pagetype, status }) }, }) } return options } return { leadStatuses, dealStatuses, communicationStatuses, getLeadStatus, getDealStatus, getCommunicationStatus, statusOptions, } })