151 lines
3.5 KiB
Vue
151 lines
3.5 KiB
Vue
<template>
|
|
<ListView
|
|
:class="$attrs.class"
|
|
:columns="columns"
|
|
:rows="rows"
|
|
:options="{
|
|
selectable: true,
|
|
showTooltip: true,
|
|
resizeColumn: true,
|
|
}"
|
|
row-key="reference_docname"
|
|
@update:selections="(selections) => emit('selectionsChanged', selections)"
|
|
ref="listViewRef"
|
|
>
|
|
<ListHeader @columnWidthUpdated="emit('columnWidthUpdated')">
|
|
<ListHeaderItem
|
|
v-for="column in columns"
|
|
:key="column.key"
|
|
:item="column"
|
|
@columnWidthUpdated="emit('columnWidthUpdated', column)"
|
|
>
|
|
</ListHeaderItem>
|
|
</ListHeader>
|
|
<div class="*:mx-0 *:sm:mx-0">
|
|
<ListRows :rows="rows" v-slot="{ idx, column, item, row }">
|
|
<ListRowItem
|
|
:item="item"
|
|
@click="listViewRef.toggleRow(row['reference_docname'])"
|
|
class="!w-full"
|
|
>
|
|
<template #default="{ label }">
|
|
<div
|
|
v-if="column.key === 'title'"
|
|
class="truncate text-base flex gap-2 w-full"
|
|
>
|
|
<span class="max-w-[90%] truncate">
|
|
{{ label }}
|
|
</span>
|
|
<FeatherIcon
|
|
name="external-link"
|
|
class="h-4 w-4 cursor-pointer"
|
|
@click.stop="viewLinkedDoc(row)"
|
|
/>
|
|
</div>
|
|
<span
|
|
v-if="column.key === 'reference_doctype'"
|
|
class="truncate text-base flex gap-2"
|
|
>
|
|
{{ getDoctypeName(row.reference_doctype) }}
|
|
</span>
|
|
</template>
|
|
</ListRowItem>
|
|
</ListRows>
|
|
</div>
|
|
</ListView>
|
|
</template>
|
|
|
|
<script setup>
|
|
import ListRows from '@/components/ListViews/ListRows.vue'
|
|
import { ListView, ListHeader, ListHeaderItem, ListRowItem } from 'frappe-ui'
|
|
import { ref } from 'vue'
|
|
|
|
const props = defineProps({
|
|
rows: {
|
|
type: Array,
|
|
required: true,
|
|
},
|
|
columns: {
|
|
type: Array,
|
|
required: true,
|
|
},
|
|
linkedDocsResource: {
|
|
type: Object,
|
|
required: true,
|
|
},
|
|
unlinkLinkedDoc: {
|
|
type: Function,
|
|
required: true,
|
|
},
|
|
options: {
|
|
type: Object,
|
|
default: () => ({
|
|
selectable: true,
|
|
showTooltip: true,
|
|
resizeColumn: false,
|
|
totalCount: 0,
|
|
rowCount: 0,
|
|
}),
|
|
},
|
|
})
|
|
const emit = defineEmits([
|
|
'loadMore',
|
|
'updatePageCount',
|
|
'columnWidthUpdated',
|
|
'applyFilter',
|
|
'applyLikeFilter',
|
|
'likeDoc',
|
|
'selectionsChanged',
|
|
])
|
|
|
|
const listViewRef = ref(null)
|
|
|
|
const viewLinkedDoc = (doc) => {
|
|
let page = ''
|
|
let id = ''
|
|
let openDesk = false
|
|
switch (doc.reference_doctype) {
|
|
case 'CRM Lead':
|
|
page = 'leads'
|
|
id = doc.reference_docname
|
|
break
|
|
case 'CRM Call Log':
|
|
page = 'call-logs'
|
|
id = `view?open=${doc.reference_docname}`
|
|
break
|
|
case 'CRM Task':
|
|
page = 'tasks'
|
|
id = `view?open=${doc.reference_docname}`
|
|
break
|
|
case 'Contact':
|
|
page = 'contacts'
|
|
id = doc.reference_docname
|
|
break
|
|
case 'CRM Organization':
|
|
page = 'organizations'
|
|
id = doc.reference_docname
|
|
break
|
|
case 'CRM Notification':
|
|
page = 'crm-notification'
|
|
id = doc.reference_docname
|
|
openDesk = true
|
|
break
|
|
case 'FCRM Note':
|
|
page = 'notes'
|
|
id = `view?open=${doc.reference_docname}`
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
let base = '/crm'
|
|
if (openDesk) {
|
|
base = '/app'
|
|
}
|
|
window.open(`${base}/${page}/${id}`)
|
|
}
|
|
|
|
const getDoctypeName = (doctype) => {
|
|
return doctype.replace(/^(CRM|FCRM)\s*/, '')
|
|
}
|
|
</script>
|