1
0
forked from test/crm
jcrm/frontend/src/stores/statuses.js

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,
}
})