Merge pull request #331 from shariquerik/custom-status

feat: show custom statuses in Lead/Deal page
This commit is contained in:
Shariq Ansari 2024-09-05 03:07:53 +05:30 committed by GitHub
commit 5068dc62eb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 80 additions and 21 deletions

View File

@ -18,7 +18,9 @@
@click="showAssignmentModal = true"
/>
</component>
<Dropdown :options="statusOptions('deal', updateField)">
<Dropdown
:options="statusOptions('deal', updateField, deal.data._customStatuses)"
>
<template #default="{ open }">
<Button
:label="deal.data.status"
@ -339,6 +341,7 @@ import {
createToast,
setupAssignees,
setupCustomActions,
setupCustomStatuses,
errorMessage,
copyToClipboard,
} from '@/utils'
@ -380,8 +383,7 @@ const deal = createResource({
params: { name: props.dealId },
cache: ['deal', props.dealId],
onSuccess: (data) => {
setupAssignees(data)
setupCustomActions(data, {
let obj = {
doc: data,
$dialog,
router,
@ -389,7 +391,10 @@ const deal = createResource({
createToast,
deleteDoc: deleteDeal,
call,
})
}
setupAssignees(data)
setupCustomStatuses(data, obj)
setupCustomActions(data, obj)
},
})

View File

@ -18,7 +18,7 @@
@click="showAssignmentModal = true"
/>
</component>
<Dropdown :options="statusOptions('lead', updateField)">
<Dropdown :options="statusOptions('lead', updateField, lead.data._customStatuses)">
<template #default="{ open }">
<Button
:label="lead.data.status"
@ -308,6 +308,7 @@ import {
createToast,
setupAssignees,
setupCustomActions,
setupCustomStatuses,
errorMessage,
copyToClipboard,
} from '@/utils'
@ -354,8 +355,7 @@ const lead = createResource({
params: { name: props.leadId },
cache: ['lead', props.leadId],
onSuccess: (data) => {
setupAssignees(data)
setupCustomActions(data, {
let obj = {
doc: data,
$dialog,
router,
@ -363,7 +363,10 @@ const lead = createResource({
createToast,
deleteDoc: deleteLead,
call,
})
}
setupAssignees(data)
setupCustomStatuses(data, obj)
setupCustomActions(data, obj)
},
})

View File

@ -9,7 +9,11 @@
</template>
</Breadcrumbs>
<div class="absolute right-0">
<Dropdown :options="statusOptions('deal', updateField)">
<Dropdown
:options="
statusOptions('deal', updateField, deal.data._customStatuses)
"
>
<template #default="{ open }">
<Button
:label="deal.data.status"
@ -274,7 +278,12 @@ import Section from '@/components/Section.vue'
import SectionFields from '@/components/SectionFields.vue'
import SLASection from '@/components/SLASection.vue'
import CustomActions from '@/components/CustomActions.vue'
import { createToast, setupAssignees, setupCustomActions } from '@/utils'
import {
createToast,
setupAssignees,
setupCustomActions,
setupCustomStatuses,
} from '@/utils'
import { getView } from '@/utils/view'
import { globalStore } from '@/stores/global'
import { organizationsStore } from '@/stores/organizations'
@ -313,8 +322,7 @@ const deal = createResource({
params: { name: props.dealId },
cache: ['deal', props.dealId],
onSuccess: (data) => {
setupAssignees(data)
setupCustomActions(data, {
let obj = {
doc: data,
$dialog,
router,
@ -322,7 +330,10 @@ const deal = createResource({
createToast,
deleteDoc: deleteDeal,
call,
})
}
setupAssignees(data)
setupCustomStatuses(data, obj)
setupCustomActions(data, obj)
},
})

View File

@ -9,7 +9,11 @@
</template>
</Breadcrumbs>
<div class="absolute right-0">
<Dropdown :options="statusOptions('lead', updateField)">
<Dropdown
:options="
statusOptions('lead', updateField, lead.data._customStatuses)
"
>
<template #default="{ open }">
<Button
:label="lead.data.status"
@ -195,7 +199,12 @@ import Section from '@/components/Section.vue'
import SectionFields from '@/components/SectionFields.vue'
import SLASection from '@/components/SLASection.vue'
import CustomActions from '@/components/CustomActions.vue'
import { createToast, setupAssignees, setupCustomActions } from '@/utils'
import {
createToast,
setupAssignees,
setupCustomActions,
setupCustomStatuses,
} from '@/utils'
import { getView } from '@/utils/view'
import { globalStore } from '@/stores/global'
import { contactsStore } from '@/stores/contacts'
@ -236,8 +245,7 @@ const lead = createResource({
params: { name: props.leadId },
cache: ['lead', props.leadId],
onSuccess: (data) => {
setupAssignees(data)
setupCustomActions(data, {
let obj = {
doc: data,
$dialog,
router,
@ -245,7 +253,10 @@ const lead = createResource({
createToast,
deleteDoc: deleteLead,
call,
})
}
setupAssignees(data)
setupCustomStatuses(data, obj)
setupCustomActions(data, obj)
},
})

View File

@ -64,9 +64,9 @@ export const statusesStore = defineStore('crm-statuses', () => {
} else if (['gray', 'green'].includes(color)) {
textColor = `!text-${color}-700`
}
let bgColor = `!bg-${color}-100 hover:!bg-${color}-200 active:!bg-${color}-300`
return [textColor, onlyIcon ? '' : bgColor]
}
@ -91,9 +91,17 @@ export const statusesStore = defineStore('crm-statuses', () => {
return communicationStatuses[name]
}
function statusOptions(doctype, action) {
function statusOptions(doctype, action, statuses = []) {
let statusesByName =
doctype == '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({

View File

@ -131,6 +131,27 @@ function getActionsFromScript(script, obj) {
return formScript?.actions || []
}
function getStatusFromScript(script, obj) {
let scriptFn = new Function(script + '\nreturn setupForm')()
let formScript = scriptFn(obj)
return formScript?.statuses || []
}
export function setupCustomStatuses(data, obj) {
if (!data._form_script) return []
let statuses = []
if (Array.isArray(data._form_script)) {
data._form_script.forEach((script) => {
statuses = statuses.concat(getStatusFromScript(script, obj))
})
} else {
statuses = getStatusFromScript(data._form_script, data)
}
data._customStatuses = statuses
}
export function setupCustomActions(data, obj) {
if (!data._form_script) return []