diff --git a/frontend/src/stores/statuses.js b/frontend/src/stores/statuses.js new file mode 100644 index 00000000..fc9d840c --- /dev/null +++ b/frontend/src/stores/statuses.js @@ -0,0 +1,79 @@ +import { defineStore } from 'pinia' +import { createListResource } from 'frappe-ui' +import { reactive, h } from 'vue' +import IndicatorIcon from '@/components/Icons/IndicatorIcon.vue' + +export const statusesStore = defineStore('crm-statuses', () => { + let leadStatusesByName = reactive({}) + let dealStatusesByName = reactive({}) + + const leadStatuses = createListResource({ + doctype: '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 = + status.color == 'black' + ? '!text-gray-900' + : `!text-${status.color}-600` + leadStatusesByName[status.name] = status + } + return statuses + }, + }) + + const dealStatuses = createListResource({ + doctype: 'CRM Deal Status', + fields: ['name', 'color', 'position'], + orderBy: 'position asc', + cache: 'deal-statuses', + initialData: [], + auto: true, + transform(statuses) { + for (let status of statuses) { + status.color = + status.color == 'black' + ? '!text-gray-900' + : `!text-${status.color}-600` + dealStatusesByName[status.name] = status + } + return statuses + }, + }) + + function getLeadStatus(name) { + return leadStatusesByName[name] + } + + function getDealStatus(name) { + return dealStatusesByName[name] + } + + function statusOptions(doctype, action) { + let statusesByName = + doctype == 'deal' ? dealStatusesByName : leadStatusesByName + let options = [] + for (const status in statusesByName) { + options.push({ + label: statusesByName[status].name, + icon: () => h(IndicatorIcon, { class: statusesByName[status].color }), + onClick: () => { + action && action('status', statusesByName[status].name) + }, + }) + } + return options + } + + return { + leadStatuses, + dealStatuses, + getLeadStatus, + getDealStatus, + statusOptions, + } +})