235 lines
5.7 KiB
Vue
235 lines
5.7 KiB
Vue
<template>
|
|
<ListView
|
|
:columns="columns"
|
|
:rows="rows"
|
|
:options="{
|
|
onRowClick: (row) => emit('showEmailTemplate', row.name),
|
|
selectable: options.selectable,
|
|
showTooltip: options.showTooltip,
|
|
resizeColumn: options.resizeColumn,
|
|
}"
|
|
row-key="name"
|
|
ref="listViewRef"
|
|
>
|
|
<ListHeader
|
|
class="sm:mx-5 mx-3"
|
|
@columnWidthUpdated="emit('columnWidthUpdated')"
|
|
>
|
|
<ListHeaderItem
|
|
v-for="column in columns"
|
|
:key="column.key"
|
|
:item="column"
|
|
@columnWidthUpdated="emit('columnWidthUpdated', column)"
|
|
>
|
|
<Button
|
|
v-if="column.key == '_liked_by'"
|
|
variant="ghosted"
|
|
class="!h-4"
|
|
:class="isLikeFilterApplied ? 'fill-red-500' : 'fill-white'"
|
|
@click="() => emit('applyLikeFilter')"
|
|
>
|
|
<HeartIcon class="h-4 w-4" />
|
|
</Button>
|
|
</ListHeaderItem>
|
|
</ListHeader>
|
|
<ListRows
|
|
class="mx-3 sm:mx-5"
|
|
:rows="rows"
|
|
v-slot="{ idx, column, item }"
|
|
doctype="Email Template"
|
|
>
|
|
<ListRowItem :item="item" :align="column.align">
|
|
<!-- <template #prefix>
|
|
|
|
</template> -->
|
|
<template #default="{ label }">
|
|
<div
|
|
v-if="['modified', 'creation'].includes(column.key)"
|
|
class="truncate text-base"
|
|
@click="
|
|
(event) =>
|
|
emit('applyFilter', {
|
|
event,
|
|
idx,
|
|
column,
|
|
item,
|
|
firstColumn: columns[0],
|
|
})
|
|
"
|
|
>
|
|
<Tooltip :text="item.label">
|
|
<div>{{ item.timeAgo }}</div>
|
|
</Tooltip>
|
|
</div>
|
|
<div v-else-if="column.key === 'status'" class="truncate text-base">
|
|
<Badge
|
|
:variant="'subtle'"
|
|
:theme="item.color"
|
|
size="md"
|
|
:label="item.label"
|
|
@click="
|
|
(event) =>
|
|
emit('applyFilter', {
|
|
event,
|
|
idx,
|
|
column,
|
|
item,
|
|
firstColumn: columns[0],
|
|
})
|
|
"
|
|
/>
|
|
</div>
|
|
<div v-else-if="column.type === 'Check'">
|
|
<FormControl
|
|
type="checkbox"
|
|
:modelValue="item"
|
|
:disabled="true"
|
|
class="text-ink-gray-9"
|
|
/>
|
|
</div>
|
|
<div v-else-if="column.key === '_liked_by'">
|
|
<Button
|
|
v-if="column.key == '_liked_by'"
|
|
variant="ghosted"
|
|
:class="isLiked(item) ? 'fill-red-500' : 'fill-white'"
|
|
@click.stop.prevent="
|
|
() => emit('likeDoc', { name: row.name, liked: isLiked(item) })
|
|
"
|
|
>
|
|
<HeartIcon class="h-4 w-4" />
|
|
</Button>
|
|
</div>
|
|
<div
|
|
v-else
|
|
class="truncate text-base"
|
|
@click="
|
|
(event) =>
|
|
emit('applyFilter', {
|
|
event,
|
|
idx,
|
|
column,
|
|
item,
|
|
firstColumn: columns[0],
|
|
})
|
|
"
|
|
>
|
|
{{ label }}
|
|
</div>
|
|
</template>
|
|
</ListRowItem>
|
|
</ListRows>
|
|
<ListSelectBanner>
|
|
<template #actions="{ selections, unselectAll }">
|
|
<Dropdown
|
|
:options="listBulkActionsRef.bulkActions(selections, unselectAll)"
|
|
>
|
|
<Button icon="more-horizontal" variant="ghost" />
|
|
</Dropdown>
|
|
</template>
|
|
</ListSelectBanner>
|
|
</ListView>
|
|
<ListFooter
|
|
class="border-t sm:px-5 px-3 py-2"
|
|
v-model="pageLengthCount"
|
|
:options="{
|
|
rowCount: options.rowCount,
|
|
totalCount: options.totalCount,
|
|
}"
|
|
@loadMore="emit('loadMore')"
|
|
/>
|
|
<ListBulkActions
|
|
ref="listBulkActionsRef"
|
|
v-model="list"
|
|
doctype="Email Template"
|
|
:options="{
|
|
hideAssign: true,
|
|
}"
|
|
/>
|
|
</template>
|
|
<script setup>
|
|
import HeartIcon from '@/components/Icons/HeartIcon.vue'
|
|
import ListBulkActions from '@/components/ListBulkActions.vue'
|
|
import ListRows from '@/components/ListViews/ListRows.vue'
|
|
import {
|
|
ListView,
|
|
ListHeader,
|
|
ListHeaderItem,
|
|
ListSelectBanner,
|
|
ListRowItem,
|
|
ListFooter,
|
|
Dropdown,
|
|
Tooltip,
|
|
} from 'frappe-ui'
|
|
import { sessionStore } from '@/stores/session'
|
|
import { ref, computed, watch } from 'vue'
|
|
|
|
const props = defineProps({
|
|
rows: {
|
|
type: Array,
|
|
required: true,
|
|
},
|
|
columns: {
|
|
type: Array,
|
|
required: true,
|
|
},
|
|
options: {
|
|
type: Object,
|
|
default: () => ({
|
|
selectable: true,
|
|
showTooltip: true,
|
|
resizeColumn: false,
|
|
totalCount: 0,
|
|
rowCount: 0,
|
|
}),
|
|
},
|
|
})
|
|
|
|
const emit = defineEmits([
|
|
'loadMore',
|
|
'updatePageCount',
|
|
'showEmailTemplate',
|
|
'columnWidthUpdated',
|
|
'applyFilter',
|
|
'applyLikeFilter',
|
|
'likeDoc',
|
|
'selectionsChanged',
|
|
])
|
|
|
|
const pageLengthCount = defineModel()
|
|
const list = defineModel('list')
|
|
|
|
const isLikeFilterApplied = computed(() => {
|
|
return list.value.params?.filters?._liked_by ? true : false
|
|
})
|
|
|
|
const { user } = sessionStore()
|
|
|
|
function isLiked(item) {
|
|
if (item) {
|
|
let likedByMe = JSON.parse(item)
|
|
return likedByMe.includes(user)
|
|
}
|
|
}
|
|
|
|
watch(pageLengthCount, (val, old_value) => {
|
|
if (val === old_value) return
|
|
emit('updatePageCount', val)
|
|
})
|
|
|
|
const listBulkActionsRef = ref(null)
|
|
const listViewRef = ref(null)
|
|
|
|
watch(
|
|
() => Array.from(listViewRef.value?.selections || []),
|
|
(selections) => {
|
|
emit('selectionsChanged', selections)
|
|
},
|
|
)
|
|
|
|
defineExpose({
|
|
customListActions: computed(
|
|
() => listBulkActionsRef.value?.customListActions,
|
|
),
|
|
})
|
|
</script>
|