@@ -259,6 +206,7 @@ import {
dateFormat,
timeAgo,
formatTime,
+ dateTooltipFormat,
} from '@/utils'
import { usersStore } from '@/stores/users'
import { contactsStore } from '@/stores/contacts'
@@ -298,15 +246,6 @@ const lead = createResource({
params: { name: props.leadId },
cache: ['lead', props.leadId],
auto: true,
- onSuccess: (data) => {
- if (
- data.response_by &&
- data.sla_status == 'First Response Due' &&
- new Date(data.response_by) < new Date()
- ) {
- updateField('sla_status', 'Failed')
- }
- },
})
const reload = ref(false)
@@ -441,4 +380,41 @@ function updateField(name, value, callback) {
callback?.()
})
}
+
+let slaSection = computed(() => {
+ let sections = []
+ if (lead.data.first_response_time) {
+ sections.push({
+ label: 'Fulfilled In',
+ value: formatTime(lead.data.first_response_time),
+ tooltipText: dateFormat(lead.data.first_responded_on, dateTooltipFormat),
+ })
+ }
+
+ let status = lead.data.sla_status
+ let tooltipText = status
+ let color =
+ lead.data.sla_status == 'Failed'
+ ? 'red'
+ : lead.data.sla_status == 'Fulfilled'
+ ? 'green'
+ : 'orange'
+
+ if (status == 'First Response Due') {
+ status = timeAgo(lead.data.response_by)
+ tooltipText = dateFormat(lead.data.response_by, dateTooltipFormat)
+ if (new Date(lead.data.response_by) < new Date()) {
+ color = 'red'
+ }
+ }
+
+ sections.push({
+ label: 'Status',
+ isBadge: true,
+ value: status,
+ tooltipText: tooltipText,
+ color: color,
+ })
+ return sections
+})
diff --git a/frontend/src/pages/Leads.vue b/frontend/src/pages/Leads.vue
index c52fb9b0..f4b25b30 100644
--- a/frontend/src/pages/Leads.vue
+++ b/frontend/src/pages/Leads.vue
@@ -155,14 +155,25 @@ const rows = computed(() => {
color: getLeadStatus(lead.status)?.iconColorClass,
}
} else if (row == 'sla_status') {
+ let value = lead.sla_status
+ let tooltipText = value
+ let color =
+ lead.sla_status == 'Failed'
+ ? 'red'
+ : lead.sla_status == 'Fulfilled'
+ ? 'green'
+ : 'orange'
+ if (value == 'First Response Due') {
+ value = timeAgo(lead.response_by)
+ tooltipText = dateFormat(lead.response_by, dateTooltipFormat)
+ if (new Date(lead.response_by) < new Date()) {
+ color = 'red'
+ }
+ }
_rows[row] = {
- label: lead.sla_status,
- color:
- lead.sla_status === 'Failed'
- ? 'red'
- : lead.sla_status === 'Fulfilled'
- ? 'green'
- : 'gray',
+ label: tooltipText,
+ value: value,
+ color: color,
}
} else if (row == 'lead_owner') {
_rows[row] = {
@@ -174,15 +185,18 @@ const rows = computed(() => {
label: dateFormat(lead[row], dateTooltipFormat),
timeAgo: timeAgo(lead[row]),
}
- } else if (['first_response_time', 'first_responded_on'].includes(row)) {
+ } else if (
+ ['first_response_time', 'first_responded_on', 'response_by'].includes(
+ row
+ )
+ ) {
+ let field = row == 'response_by' ? 'response_by' : 'first_responded_on'
_rows[row] = {
- label: lead.first_responded_on
- ? dateFormat(lead.first_responded_on, dateTooltipFormat)
- : '',
+ label: lead[field] ? dateFormat(lead[field], dateTooltipFormat) : '',
timeAgo: lead[row]
- ? row == 'first_responded_on'
- ? timeAgo(lead[row])
- : formatTime(lead[row])
+ ? row == 'first_response_time'
+ ? formatTime(lead[row])
+ : timeAgo(lead[row])
: '',
}
}