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

191 lines
6.1 KiB
Vue
Raw Normal View History

2023-11-23 08:47:44 +07:00
<script lang="ts" setup>
import { onMounted, ref } from 'vue'
import { storeToRefs } from 'pinia'
import { useTreeDataStore } from '@/stores/tree-data'
import { useSearchDataStore } from '@/stores/searched-data'
import { useFileInfoStore } from '@/stores/file-info-data'
2023-11-23 08:47:44 +07:00
import FileItem from '@/components/FileItem.vue'
import TreeExplorer from '@/components/TreeExplorer.vue'
import SearchBar from '@/modules/01_user/components/SearchBar.vue'
import FileSearched from '@/components/FileSearched.vue'
import FileDownload from '@/modules/01_user/components/FileDownload.vue'
2023-11-28 09:22:44 +07:00
import ListView from '@/components/ListView.vue'
2023-11-28 17:44:56 +07:00
import FolderForm from './FolderForm.vue'
2023-11-23 08:47:44 +07:00
2023-11-28 17:44:56 +07:00
const DEPT_NAME = ['ตู้เอกสาร', 'ลิ้นชัก', 'แฟ้ม', 'แฟ้มย่อย'] as const
2023-11-23 08:47:44 +07:00
const { isFilePreview } = storeToRefs(useFileInfoStore())
2023-11-23 08:47:44 +07:00
const { isSearch } = storeToRefs(useSearchDataStore())
2023-11-29 15:26:45 +07:00
const { data, currentDept, currentPath } = storeToRefs(useTreeDataStore())
const { createFolder, getCabinet, gotoParent, getFolder } = useTreeDataStore()
2023-11-23 08:47:44 +07:00
const viewMode = ref<'view_list' | 'view_module'>('view_list')
const inputSearch = ref<string>()
const props = defineProps<{
mode: 'admin' | 'user'
}>()
2023-11-28 17:44:56 +07:00
const folderFormState = ref<boolean>(false)
const folderFormType = ref<'edit' | 'create'>('create')
const folderFormData = ref<{
name?: string
}>({})
function triggerFolderCreate() {
folderFormType.value = 'create'
folderFormData.value = {}
folderFormState.value = !folderFormState.value
}
async function submitFolderForm(value: {
mode: 'create' | 'edit'
name: string
}) {
if (value.mode === 'create') {
await createFolder(value.name)
}
}
2023-11-23 08:47:44 +07:00
onMounted(getCabinet)
</script>
<template>
<section id="header" class="q-px-md q-pt-md q-pb-none">
<div class="q-my-md row items-center">
<div class="col">
<h5 class="q-my-none" v-if="mode === 'admin'">จัดเก็บเอกสาร</h5>
<h5 class="q-my-none" v-else>สืบค้นเอกสาร</h5>
</div>
<div class="col-3" v-if="mode === 'admin'">
<q-input
rounded
outlined
dense
label="ค้นหา"
bg-color="white"
v-model="inputSearch"
>
<template v-slot:append><q-icon name="search" /></template>
</q-input>
</div>
</div>
</section>
<section
class="row q-col-gutter-md q-pa-md"
:class="{ reverse: props.mode === 'user' }"
id="cabinet"
>
<div class="col-12 col-md-3">
<div class="bg-white rounded-borders shadow-5">
<div
class="q-px-md q-py-sm text-primary bg-grey-1"
id="container-header"
>
<span class="block q-my-sm text-weight-bold">ดเกบเอกสาร</span>
</div>
<q-separator />
<div class="q-pa-md">
<tree-explorer :data="data" :level="1" />
</div>
</div>
</div>
<div class="col">
<file-download v-if="isFilePreview === true" />
<div
class="bg-white rounded-borders shadow-5 relative"
v-if="isFilePreview === false"
>
2023-11-23 08:47:44 +07:00
<search-bar v-if="mode === 'user'" />
<div class="bg-white q-pa-md">
<div class="row items-center justify-between">
2023-11-29 15:26:45 +07:00
<span class="text-body1">
<div class="row items-center">
<q-btn
flat
dense
class="q-mr-sm q-px-sm"
v-if="currentDept > 0 && isSearch === false"
@click="() => gotoParent()"
>
<q-icon name="arrow_back" size="1rem" color="primary" />
</q-btn>
<q-breadcrumbs v-if="isSearch === false" active-color="primary">
<q-breadcrumbs-el
v-if="currentPath === '/' || !currentPath"
label="ตู้เอกสารทั้งหมด"
/>
<q-breadcrumbs-el
class="text-black"
v-for="fragments in currentPath.split('/').filter(Boolean)"
:label="fragments"
/>
</q-breadcrumbs>
</div>
<span v-if="isSearch === true">ผลการค้นหา</span>
2023-11-23 08:47:44 +07:00
<q-btn
2023-11-28 09:22:44 +07:00
v-if="
mode === 'admin' &&
viewMode === 'view_module' &&
currentDept === 0
"
2023-11-28 09:22:44 +07:00
class="q-px-md q-ml-md al"
2023-11-23 08:47:44 +07:00
label="สร้างตู้เก็บเอกสาร"
type="submit"
color="primary"
dense
icon="add"
2023-11-29 15:26:45 +07:00
@click="() => triggerFolderCreate()"
2023-11-23 08:47:44 +07:00
/>
</span>
2023-11-29 15:26:45 +07:00
<div>
<q-btn
flat
dense
color="blue-grey-2"
icon="refresh"
class="q-mr-sm"
@click="() => getFolder(currentPath)"
/>
<q-btn
flat
dense
color="blue-grey-2"
:icon="viewMode"
@click="
() => {
viewMode =
viewMode === 'view_list' ? 'view_module' : 'view_list'
}
"
/>
</div>
2023-11-23 08:47:44 +07:00
</div>
<div>
<file-searched v-if="isSearch === true" />
<file-item
:viewMode="viewMode"
:action="props.mode === 'admin'"
2023-11-28 09:22:44 +07:00
v-if="isSearch === false && viewMode === 'view_list'"
2023-11-23 08:47:44 +07:00
/>
2023-11-28 09:22:44 +07:00
<list-view v-if="viewMode === 'view_module'" :mode="mode" />
2023-11-23 08:47:44 +07:00
</div>
</div>
</div>
</div>
</section>
2023-11-28 17:44:56 +07:00
<folder-form
:mode="folderFormType"
:tree="DEPT_NAME[currentDept]"
v-if="currentDept < 4"
v-model:open="folderFormState"
v-model:name="folderFormData.name"
@submit="submitFolderForm"
/>
2023-11-23 08:47:44 +07:00
</template>
<style lang="scss" scoped>
.pointer {
cursor: pointer;
}
</style>