190 lines
5.2 KiB
Vue
190 lines
5.2 KiB
Vue
<template>
|
|
<Dialog v-model="show">
|
|
<template #body-title>
|
|
<div class="flex items-center gap-3">
|
|
<h3 class="text-2xl font-semibold leading-6 text-gray-900">
|
|
{{ __('Call Details') }}
|
|
</h3>
|
|
</div>
|
|
</template>
|
|
<template #body-content>
|
|
<div class="flex flex-col gap-3.5">
|
|
<div
|
|
v-for="field in detailFields"
|
|
:key="field.name"
|
|
class="flex h-7 items-center gap-2 text-base text-gray-800"
|
|
>
|
|
<div class="grid w-7 place-content-center">
|
|
<component :is="field.icon" />
|
|
</div>
|
|
<div v-if="field.name == 'receiver'" class="flex items-center gap-1">
|
|
<Avatar
|
|
:image="field.value.caller.image"
|
|
:label="field.value.caller.label"
|
|
size="sm"
|
|
/>
|
|
<div class="ml-1 flex flex-col gap-1">
|
|
{{ field.value.caller.label }}
|
|
</div>
|
|
<FeatherIcon
|
|
name="arrow-right"
|
|
class="mx-1 h-4 w-4 text-gray-600"
|
|
/>
|
|
<Avatar
|
|
:image="field.value.receiver.image"
|
|
:label="field.value.receiver.label"
|
|
size="sm"
|
|
/>
|
|
<div class="ml-1 flex flex-col gap-1">
|
|
{{ field.value.receiver.label }}
|
|
</div>
|
|
</div>
|
|
<Tooltip v-else-if="field.tooltip" :text="field.tooltip">
|
|
{{ field.value }}
|
|
</Tooltip>
|
|
<div class="w-full" v-else-if="field.name == 'recording_url'">
|
|
<audio class="audio-control w-full" controls :src="field.value"></audio>
|
|
</div>
|
|
<div v-else :class="field.color ? `text-${field.color}-600` : ''">
|
|
{{ field.value }}
|
|
</div>
|
|
<div v-if="field.link">
|
|
<ArrowUpRightIcon
|
|
class="h-4 w-4 shrink-0 cursor-pointer text-gray-600 hover:text-gray-800"
|
|
@click="() => field.link()"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</Dialog>
|
|
</template>
|
|
|
|
<script setup>
|
|
import ArrowUpRightIcon from '@/components/Icons/ArrowUpRightIcon.vue'
|
|
import DurationIcon from '@/components/Icons/DurationIcon.vue'
|
|
import ContactsIcon from '@/components/Icons/ContactsIcon.vue'
|
|
import LeadsIcon from '@/components/Icons/LeadsIcon.vue'
|
|
import Dealsicon from '@/components/Icons/DealsIcon.vue'
|
|
import CalendarIcon from '@/components/Icons/CalendarIcon.vue'
|
|
import NoteIcon from '@/components/Icons/NoteIcon.vue'
|
|
import CheckCircleIcon from '@/components/Icons/CheckCircleIcon.vue'
|
|
// import NoteModal from '@/components/Modals/NoteModal.vue'
|
|
import { FeatherIcon, Avatar, Tooltip, createResource } from 'frappe-ui'
|
|
import { ref, computed, h } from 'vue'
|
|
import { useRouter } from 'vue-router'
|
|
|
|
const props = defineProps({
|
|
callLog: {
|
|
type: Object,
|
|
default: {},
|
|
},
|
|
})
|
|
|
|
const show = defineModel()
|
|
const router = useRouter()
|
|
|
|
const detailFields = computed(() => {
|
|
let details = [
|
|
{
|
|
icon: h(FeatherIcon, {
|
|
name: props.callLog.type.icon,
|
|
class: 'h-3.5 w-3.5',
|
|
}),
|
|
name: 'type',
|
|
value: props.callLog.type.label + ' Call',
|
|
},
|
|
{
|
|
icon: ContactsIcon,
|
|
name: 'receiver',
|
|
value: {
|
|
receiver: props.callLog.receiver,
|
|
caller: props.callLog.caller,
|
|
},
|
|
},
|
|
{
|
|
icon:
|
|
props.callLog.reference_doctype == 'CRM Lead' ? LeadsIcon : Dealsicon,
|
|
name: 'reference_doctype',
|
|
value: props.callLog.reference_doctype == 'CRM Lead' ? 'Lead' : 'Deal',
|
|
link: () => {
|
|
if (props.callLog.reference_doctype == 'CRM Lead') {
|
|
router.push({
|
|
name: 'Lead',
|
|
params: { leadId: props.callLog.reference_docname },
|
|
})
|
|
} else {
|
|
router.push({
|
|
name: 'Deal',
|
|
params: { dealId: props.callLog.reference_docname },
|
|
})
|
|
}
|
|
},
|
|
},
|
|
{
|
|
icon: CalendarIcon,
|
|
name: 'creation',
|
|
value: props.callLog.creation.label,
|
|
tooltip: props.callLog.creation.label,
|
|
},
|
|
{
|
|
icon: DurationIcon,
|
|
name: 'duration',
|
|
value: props.callLog.duration.label,
|
|
},
|
|
{
|
|
icon: CheckCircleIcon,
|
|
name: 'status',
|
|
value: props.callLog.status.label,
|
|
color: props.callLog.status.color,
|
|
},
|
|
{
|
|
icon: h(FeatherIcon, {
|
|
name: 'play-circle',
|
|
class: 'h-4 w-4',
|
|
}),
|
|
name: 'recording_url',
|
|
value: props.callLog.recording_url,
|
|
},
|
|
{
|
|
icon: NoteIcon,
|
|
name: 'note',
|
|
value: props.callLog.note,
|
|
},
|
|
]
|
|
|
|
return details.filter((detail) => detail.value)
|
|
})
|
|
|
|
async function updateNote(_note) {
|
|
if (_note.title || _note.content) {
|
|
let d = await call('frappe.client.set_value', {
|
|
doctype: 'CRM Note',
|
|
name: _callLog.data?.note,
|
|
fieldname: _note,
|
|
})
|
|
if (d.name) {
|
|
_callLog.reload()
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.audio-control {
|
|
height: 40px;
|
|
outline: none;
|
|
border-radius: 10px;
|
|
cursor: pointer;
|
|
background-color: rgb(237, 237, 237);
|
|
}
|
|
|
|
audio::-webkit-media-controls-panel {
|
|
background-color: rgb(237, 237, 237) !important;
|
|
}
|
|
|
|
.audio-control::-webkit-media-controls-panel {
|
|
background-color: white;
|
|
}
|
|
</style>
|