hrms-edm/Services/client/src/components/ListView.vue

351 lines
9.4 KiB
Vue
Raw Normal View History

2023-11-28 09:22:44 +07:00
<script lang="ts" setup>
import type { QTableProps } from 'quasar'
2023-11-28 09:22:44 +07:00
import { computed, ref } from 'vue'
import { storeToRefs } from 'pinia'
import FileIcon from '@/components/FileIcon.vue'
2023-11-29 17:11:21 +07:00
import DialogDelete from '@/components/DialogDelete.vue'
import FileFormWrapper from './FileFormWrapper.vue'
import FolderFormWrapper from './FolderFormWrapper.vue'
2023-11-28 09:22:44 +07:00
import { useFileInfoStore } from '@/stores/file-info-data'
import useStorage from '@/stores/storage'
2023-11-28 17:44:56 +07:00
const storageStore = useStorage()
const { folder, file, currentInfo } = storeToRefs(storageStore)
const { goto, deleteFolder, deleteFile } = storageStore
const { getFormatDate, getSize, getType, getFileInfo } = useFileInfoStore()
2023-11-28 09:22:44 +07:00
const fileFormComponent = ref<InstanceType<typeof FileFormWrapper>>()
const folderFormComponent = ref<InstanceType<typeof FolderFormWrapper>>()
2023-11-28 09:22:44 +07:00
const currentIcon = computed(() =>
currentInfo.value.dept === 0
2023-11-28 09:22:44 +07:00
? 'mdi-file-cabinet'
: currentInfo.value.dept === 1
2023-12-04 02:45:11 +00:00
? 'inbox'
: 'o_folder_open',
2023-11-28 09:22:44 +07:00
)
const TREE_LEVEL_NAME = ['ตู้เอกสาร', 'ลิ้นชัก', 'แฟ้ม', 'แฟ้มย่อย'] as const
2023-11-28 17:44:56 +07:00
const props = defineProps<{
mode: 'admin' | 'user'
}>()
2023-11-28 17:44:56 +07:00
const deleteState = ref<boolean>(false)
const deletePath = ref<string>('')
const deleteTarget = ref<'deleteFolder' | 'deleteFile'>()
const deleteMap = { deleteFolder, deleteFile }
2023-11-29 17:11:21 +07:00
function triggerFolderDelete(pathname: string) {
deleteTarget.value = 'deleteFolder'
deletePath.value = pathname
deleteState.value = !deleteState.value
2023-11-29 17:11:21 +07:00
}
function triggerFileDelete(pathname: string) {
deleteTarget.value = 'deleteFile'
deletePath.value = pathname
deleteState.value = !deleteState.value
2023-11-28 17:44:56 +07:00
}
const colFolder = [
2023-11-28 09:22:44 +07:00
{
name: 'name',
required: true,
label: 'ชื่อ',
align: 'left',
field: 'name',
2023-11-28 09:22:44 +07:00
sortable: true,
},
{
name: 'createdBy',
label: 'สร้างโดย',
align: 'center',
2023-11-28 09:22:44 +07:00
field: 'createdBy',
sortable: true,
},
{
name: 'createdAt',
2023-11-28 09:22:44 +07:00
label: 'วันที่สร้าง',
align: 'center',
2023-11-28 09:22:44 +07:00
field: 'createdAt',
sortable: true,
},
{
name: 'actions',
align: 'center',
label: '',
field: '',
},
] satisfies QTableProps['columns']
2023-11-28 09:22:44 +07:00
const colFile = [
2023-11-28 09:22:44 +07:00
{
name: 'name',
2023-11-28 09:22:44 +07:00
label: 'ชื่อไฟล์',
align: 'left',
field: 'fileName',
2023-11-28 09:22:44 +07:00
sortable: true,
},
{
name: 'title',
label: 'ชื่อเรื่อง',
align: 'center',
2023-11-28 09:22:44 +07:00
field: 'title',
sortable: true,
},
{
name: 'fileType',
label: 'ประเภทของไฟล์',
align: 'center',
2023-11-28 09:22:44 +07:00
field: 'fileType',
sortable: true,
},
{
name: 'actions',
align: 'center',
label: '',
field: '',
},
] satisfies QTableProps['columns']
2023-11-28 09:22:44 +07:00
const onRowClick = ((_, row) => {
goto(row.pathname)
2023-12-08 22:37:04 +07:00
}) satisfies QTableProps['onRowClick']
2023-11-28 09:22:44 +07:00
</script>
<template>
<file-form-wrapper ref="fileFormComponent" />
<folder-form-wrapper ref="folderFormComponent" />
<dialog-delete
v-model:open="deleteState"
@confirm="() => deleteTarget && deleteMap[deleteTarget](deletePath)"
/>
2023-11-30 17:13:00 +07:00
<div class="q-mt-md">
2023-11-28 09:22:44 +07:00
<div class="q-gutter-sm">
<div
class="flex flex-break d justify-between space-between"
v-if="
currentInfo.dept >= 1 &&
currentInfo.dept < 4 &&
props.mode === 'admin'
"
2023-11-28 09:22:44 +07:00
>
<div>
<span class="text-h6">{{ TREE_LEVEL_NAME[currentInfo.dept] }}</span>
2023-11-28 09:22:44 +07:00
</div>
<div>
<q-btn
outline
push
dense
2023-12-07 14:30:10 +07:00
class="q-px-md q-ml-md"
2023-11-28 09:22:44 +07:00
type="submit"
color="primary"
icon="add"
2023-12-04 09:28:40 +07:00
id="listViewFolderCreate"
:label="'สร้าง' + TREE_LEVEL_NAME[currentInfo.dept]"
@click.stop="() => folderFormComponent?.triggerFolderCreate()"
2023-11-28 09:22:44 +07:00
/>
</div>
</div>
<q-table
flat
bordered
2023-12-07 11:26:33 +07:00
row-key="name"
2023-11-28 09:22:44 +07:00
class="cursor"
v-if="currentInfo.dept !== 4"
:pagination="{ rowsPerPage: 20 }"
:rows="folder[currentInfo.path]"
:columns="colFolder"
@row-click="onRowClick"
2023-11-28 09:22:44 +07:00
>
<template v-slot:body-cell-name="data">
<q-td>
2023-11-28 09:22:44 +07:00
<q-icon :name="currentIcon" size="2em" color="primary" />
{{ data.row.name }}
2023-11-28 09:22:44 +07:00
</q-td>
</template>
<template v-slot:body-cell-createdBy="data">
<q-td class="text-center">
<span class="sort-icon-offset-margin">
{{ data.row.createdBy }}
</span>
2023-12-06 16:11:53 +07:00
</q-td>
</template>
<template v-slot:body-cell-createdAt="data">
<q-td class="text-center">
<span class="sort-icon-offset-margin">
{{ getFormatDate(data.row.createdAt) }}
</span>
</q-td>
</template>
<template v-slot:body-cell-actions="data">
2023-11-28 09:22:44 +07:00
<q-td class="justify-center">
<div>
2023-12-06 16:11:53 +07:00
<q-icon
@click.stop
class="q-ma-sm"
name="o_info"
size="2em"
color="primary"
/>
2023-11-28 09:22:44 +07:00
<q-tooltip
anchor="center left"
self="center right"
:offset="[5, 1]"
>
{{ data.row.name }}
2023-11-28 09:22:44 +07:00
</q-tooltip>
</div>
<div v-if="props.mode === 'admin'">
<q-btn
flat
dense
id="listViewFolderEdit"
2023-12-06 11:39:37 +07:00
icon="o_edit"
color="positive"
2023-11-28 09:22:44 +07:00
@click.stop="
folderFormComponent?.triggerFolderEdit(
data.row.name,
data.row.pathname,
2023-11-28 17:44:56 +07:00
)
"
/>
<q-btn
flat
dense
2023-12-04 09:28:40 +07:00
id="listViewFolderDelete"
color="negative"
icon="mdi-trash-can-outline"
:data-testid="data.row.name"
@click.stop="triggerFolderDelete(data.row.pathname)"
/>
2023-11-28 09:22:44 +07:00
</div>
</q-td>
</template>
</q-table>
</div>
</div>
<div class="q-mt-md" v-if="currentInfo.dept >= 3">
2023-11-28 09:22:44 +07:00
<div class="q-gutter-sm">
<div class="flex flex-break justify-between space-between">
<div><span class="text-h6">เอกสาร</span></div>
2023-11-28 09:22:44 +07:00
<div>
<q-btn
outline
push
dense
id="listViewFileCreate"
2023-12-07 14:30:10 +07:00
class="q-px-md q-ml-md"
2023-11-28 09:22:44 +07:00
label="สร้างเอกสาร"
type="submit"
color="primary"
icon="add"
v-if="props.mode == 'admin'"
@click.stop="() => fileFormComponent?.triggerFileCreate()"
2023-11-28 09:22:44 +07:00
/>
</div>
</div>
<q-table
flat
bordered
class="cursor"
row-key="name"
:rows="file[currentInfo.path]"
:columns="colFile"
:pagination="{ rowsPerPage: 20 }"
2023-11-28 09:22:44 +07:00
>
<template v-slot:body-cell-name="data">
2023-11-28 09:22:44 +07:00
<q-td
2023-12-04 09:28:40 +07:00
id="listViewGetFileInfo"
style="width: 50%"
@click="() => getFileInfo(data.row)"
2023-11-28 09:22:44 +07:00
>
<file-icon
size="list"
:fileMimeType="data.row.fileType || '-'"
:fileName="data.row.fileName || '-'"
/>
{{ data.row.fileName }}
2023-11-28 09:22:44 +07:00
</q-td>
</template>
<template v-slot:body-cell-title="data">
<q-td class="text-center">
<span class="sort-icon-offset-margin">{{ data.row.title }}</span>
2023-11-28 09:22:44 +07:00
</q-td>
</template>
<template v-slot:body-cell-fileType="data">
<q-td class="text-center">
<span class="sort-icon-offset-margin">
{{ getType(data.row.fileType, data.row.fileName) }}
</span>
</q-td>
</template>
<template v-slot:body-cell-actions="data">
2023-11-28 09:22:44 +07:00
<q-td class="justify-center">
<div>
2023-12-06 16:11:53 +07:00
<q-icon
class="q-ma-sm"
name="o_info"
size="2em"
color="primary"
/>
2023-11-28 09:22:44 +07:00
<q-tooltip
anchor="center left"
self="center right"
:offset="[5, 1]"
>
{{ getSize(data.row.fileSize) }}
2023-11-28 09:22:44 +07:00
</q-tooltip>
</div>
<div v-if="props.mode === 'admin'">
2023-11-28 17:44:56 +07:00
<q-btn
flat
color="positive"
dense
2023-12-06 11:39:37 +07:00
icon="o_edit"
2023-12-07 11:26:19 +07:00
@click.stop="
() =>
fileFormComponent?.triggerFileEdit(
data.row,
data.row.pathname,
2023-12-12 17:32:16 +07:00
data.row.fileName,
)
2023-11-28 17:44:56 +07:00
"
2023-12-04 09:28:40 +07:00
id="listViewFileEdit"
2023-11-28 17:44:56 +07:00
/>
<q-btn
flat
dense
2023-12-04 09:28:40 +07:00
id="listViewFileDelete"
color="negative"
icon="mdi-trash-can-outline"
@click.stop="() => triggerFileDelete(data.row.pathname)"
2023-11-28 17:44:56 +07:00
/>
2023-11-28 09:22:44 +07:00
</div>
</q-td>
</template>
</q-table>
</div>
</div>
</template>
<style lang="scss" scoped>
.justify-center {
display: flex;
justify-content: center;
align-items: center;
}
2023-11-28 09:22:44 +07:00
.sort-icon-offset-margin {
2023-12-06 16:11:53 +07:00
margin-right: 18px;
}
2023-11-28 09:22:44 +07:00
.cursor {
cursor: pointer;
}
2023-11-28 09:22:44 +07:00
</style>