116 lines
3.0 KiB
JavaScript
116 lines
3.0 KiB
JavaScript
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,
|
|
}
|
|
})
|