Merge pull request #331 from shariquerik/custom-status
feat: show custom statuses in Lead/Deal page
This commit is contained in:
commit
5068dc62eb
@ -18,7 +18,9 @@
|
|||||||
@click="showAssignmentModal = true"
|
@click="showAssignmentModal = true"
|
||||||
/>
|
/>
|
||||||
</component>
|
</component>
|
||||||
<Dropdown :options="statusOptions('deal', updateField)">
|
<Dropdown
|
||||||
|
:options="statusOptions('deal', updateField, deal.data._customStatuses)"
|
||||||
|
>
|
||||||
<template #default="{ open }">
|
<template #default="{ open }">
|
||||||
<Button
|
<Button
|
||||||
:label="deal.data.status"
|
:label="deal.data.status"
|
||||||
@ -339,6 +341,7 @@ import {
|
|||||||
createToast,
|
createToast,
|
||||||
setupAssignees,
|
setupAssignees,
|
||||||
setupCustomActions,
|
setupCustomActions,
|
||||||
|
setupCustomStatuses,
|
||||||
errorMessage,
|
errorMessage,
|
||||||
copyToClipboard,
|
copyToClipboard,
|
||||||
} from '@/utils'
|
} from '@/utils'
|
||||||
@ -380,8 +383,7 @@ const deal = createResource({
|
|||||||
params: { name: props.dealId },
|
params: { name: props.dealId },
|
||||||
cache: ['deal', props.dealId],
|
cache: ['deal', props.dealId],
|
||||||
onSuccess: (data) => {
|
onSuccess: (data) => {
|
||||||
setupAssignees(data)
|
let obj = {
|
||||||
setupCustomActions(data, {
|
|
||||||
doc: data,
|
doc: data,
|
||||||
$dialog,
|
$dialog,
|
||||||
router,
|
router,
|
||||||
@ -389,7 +391,10 @@ const deal = createResource({
|
|||||||
createToast,
|
createToast,
|
||||||
deleteDoc: deleteDeal,
|
deleteDoc: deleteDeal,
|
||||||
call,
|
call,
|
||||||
})
|
}
|
||||||
|
setupAssignees(data)
|
||||||
|
setupCustomStatuses(data, obj)
|
||||||
|
setupCustomActions(data, obj)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
@click="showAssignmentModal = true"
|
@click="showAssignmentModal = true"
|
||||||
/>
|
/>
|
||||||
</component>
|
</component>
|
||||||
<Dropdown :options="statusOptions('lead', updateField)">
|
<Dropdown :options="statusOptions('lead', updateField, lead.data._customStatuses)">
|
||||||
<template #default="{ open }">
|
<template #default="{ open }">
|
||||||
<Button
|
<Button
|
||||||
:label="lead.data.status"
|
:label="lead.data.status"
|
||||||
@ -308,6 +308,7 @@ import {
|
|||||||
createToast,
|
createToast,
|
||||||
setupAssignees,
|
setupAssignees,
|
||||||
setupCustomActions,
|
setupCustomActions,
|
||||||
|
setupCustomStatuses,
|
||||||
errorMessage,
|
errorMessage,
|
||||||
copyToClipboard,
|
copyToClipboard,
|
||||||
} from '@/utils'
|
} from '@/utils'
|
||||||
@ -354,8 +355,7 @@ const lead = createResource({
|
|||||||
params: { name: props.leadId },
|
params: { name: props.leadId },
|
||||||
cache: ['lead', props.leadId],
|
cache: ['lead', props.leadId],
|
||||||
onSuccess: (data) => {
|
onSuccess: (data) => {
|
||||||
setupAssignees(data)
|
let obj = {
|
||||||
setupCustomActions(data, {
|
|
||||||
doc: data,
|
doc: data,
|
||||||
$dialog,
|
$dialog,
|
||||||
router,
|
router,
|
||||||
@ -363,7 +363,10 @@ const lead = createResource({
|
|||||||
createToast,
|
createToast,
|
||||||
deleteDoc: deleteLead,
|
deleteDoc: deleteLead,
|
||||||
call,
|
call,
|
||||||
})
|
}
|
||||||
|
setupAssignees(data)
|
||||||
|
setupCustomStatuses(data, obj)
|
||||||
|
setupCustomActions(data, obj)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,11 @@
|
|||||||
</template>
|
</template>
|
||||||
</Breadcrumbs>
|
</Breadcrumbs>
|
||||||
<div class="absolute right-0">
|
<div class="absolute right-0">
|
||||||
<Dropdown :options="statusOptions('deal', updateField)">
|
<Dropdown
|
||||||
|
:options="
|
||||||
|
statusOptions('deal', updateField, deal.data._customStatuses)
|
||||||
|
"
|
||||||
|
>
|
||||||
<template #default="{ open }">
|
<template #default="{ open }">
|
||||||
<Button
|
<Button
|
||||||
:label="deal.data.status"
|
:label="deal.data.status"
|
||||||
@ -274,7 +278,12 @@ import Section from '@/components/Section.vue'
|
|||||||
import SectionFields from '@/components/SectionFields.vue'
|
import SectionFields from '@/components/SectionFields.vue'
|
||||||
import SLASection from '@/components/SLASection.vue'
|
import SLASection from '@/components/SLASection.vue'
|
||||||
import CustomActions from '@/components/CustomActions.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 { getView } from '@/utils/view'
|
||||||
import { globalStore } from '@/stores/global'
|
import { globalStore } from '@/stores/global'
|
||||||
import { organizationsStore } from '@/stores/organizations'
|
import { organizationsStore } from '@/stores/organizations'
|
||||||
@ -313,8 +322,7 @@ const deal = createResource({
|
|||||||
params: { name: props.dealId },
|
params: { name: props.dealId },
|
||||||
cache: ['deal', props.dealId],
|
cache: ['deal', props.dealId],
|
||||||
onSuccess: (data) => {
|
onSuccess: (data) => {
|
||||||
setupAssignees(data)
|
let obj = {
|
||||||
setupCustomActions(data, {
|
|
||||||
doc: data,
|
doc: data,
|
||||||
$dialog,
|
$dialog,
|
||||||
router,
|
router,
|
||||||
@ -322,7 +330,10 @@ const deal = createResource({
|
|||||||
createToast,
|
createToast,
|
||||||
deleteDoc: deleteDeal,
|
deleteDoc: deleteDeal,
|
||||||
call,
|
call,
|
||||||
})
|
}
|
||||||
|
setupAssignees(data)
|
||||||
|
setupCustomStatuses(data, obj)
|
||||||
|
setupCustomActions(data, obj)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,11 @@
|
|||||||
</template>
|
</template>
|
||||||
</Breadcrumbs>
|
</Breadcrumbs>
|
||||||
<div class="absolute right-0">
|
<div class="absolute right-0">
|
||||||
<Dropdown :options="statusOptions('lead', updateField)">
|
<Dropdown
|
||||||
|
:options="
|
||||||
|
statusOptions('lead', updateField, lead.data._customStatuses)
|
||||||
|
"
|
||||||
|
>
|
||||||
<template #default="{ open }">
|
<template #default="{ open }">
|
||||||
<Button
|
<Button
|
||||||
:label="lead.data.status"
|
:label="lead.data.status"
|
||||||
@ -195,7 +199,12 @@ import Section from '@/components/Section.vue'
|
|||||||
import SectionFields from '@/components/SectionFields.vue'
|
import SectionFields from '@/components/SectionFields.vue'
|
||||||
import SLASection from '@/components/SLASection.vue'
|
import SLASection from '@/components/SLASection.vue'
|
||||||
import CustomActions from '@/components/CustomActions.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 { getView } from '@/utils/view'
|
||||||
import { globalStore } from '@/stores/global'
|
import { globalStore } from '@/stores/global'
|
||||||
import { contactsStore } from '@/stores/contacts'
|
import { contactsStore } from '@/stores/contacts'
|
||||||
@ -236,8 +245,7 @@ const lead = createResource({
|
|||||||
params: { name: props.leadId },
|
params: { name: props.leadId },
|
||||||
cache: ['lead', props.leadId],
|
cache: ['lead', props.leadId],
|
||||||
onSuccess: (data) => {
|
onSuccess: (data) => {
|
||||||
setupAssignees(data)
|
let obj = {
|
||||||
setupCustomActions(data, {
|
|
||||||
doc: data,
|
doc: data,
|
||||||
$dialog,
|
$dialog,
|
||||||
router,
|
router,
|
||||||
@ -245,7 +253,10 @@ const lead = createResource({
|
|||||||
createToast,
|
createToast,
|
||||||
deleteDoc: deleteLead,
|
deleteDoc: deleteLead,
|
||||||
call,
|
call,
|
||||||
})
|
}
|
||||||
|
setupAssignees(data)
|
||||||
|
setupCustomStatuses(data, obj)
|
||||||
|
setupCustomActions(data, obj)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -64,9 +64,9 @@ export const statusesStore = defineStore('crm-statuses', () => {
|
|||||||
} else if (['gray', 'green'].includes(color)) {
|
} else if (['gray', 'green'].includes(color)) {
|
||||||
textColor = `!text-${color}-700`
|
textColor = `!text-${color}-700`
|
||||||
}
|
}
|
||||||
|
|
||||||
let bgColor = `!bg-${color}-100 hover:!bg-${color}-200 active:!bg-${color}-300`
|
let bgColor = `!bg-${color}-100 hover:!bg-${color}-200 active:!bg-${color}-300`
|
||||||
|
|
||||||
return [textColor, onlyIcon ? '' : bgColor]
|
return [textColor, onlyIcon ? '' : bgColor]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,9 +91,17 @@ export const statusesStore = defineStore('crm-statuses', () => {
|
|||||||
return communicationStatuses[name]
|
return communicationStatuses[name]
|
||||||
}
|
}
|
||||||
|
|
||||||
function statusOptions(doctype, action) {
|
function statusOptions(doctype, action, statuses = []) {
|
||||||
let statusesByName =
|
let statusesByName =
|
||||||
doctype == 'deal' ? dealStatusesByName : leadStatusesByName
|
doctype == 'deal' ? dealStatusesByName : leadStatusesByName
|
||||||
|
|
||||||
|
if (statuses.length) {
|
||||||
|
statusesByName = statuses.reduce((acc, status) => {
|
||||||
|
acc[status] = statusesByName[status]
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
}
|
||||||
|
|
||||||
let options = []
|
let options = []
|
||||||
for (const status in statusesByName) {
|
for (const status in statusesByName) {
|
||||||
options.push({
|
options.push({
|
||||||
|
|||||||
@ -131,6 +131,27 @@ function getActionsFromScript(script, obj) {
|
|||||||
return formScript?.actions || []
|
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) {
|
export function setupCustomActions(data, obj) {
|
||||||
if (!data._form_script) return []
|
if (!data._form_script) return []
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user