Merge branch 'net' into dev/front

This commit is contained in:
somnetsak123 2023-11-30 09:11:43 +07:00 committed by Methapon2001
commit 4e2146e993
No known key found for this signature in database
GPG key ID: 849924FEF46BD132
4 changed files with 107 additions and 33 deletions

View file

@ -1,9 +1,24 @@
<script setup lang="ts"> <script setup lang="ts">
defineEmits(['confirm', 'cancel']) defineEmits(['confirm', 'cancel', 'update:open'])
const props = withDefaults(
defineProps<{
open: boolean
}>(),
{
open: false,
},
)
</script> </script>
<template> <template>
<q-dialog persistent transition-show="scale" transition-hide="scale"> <q-dialog
persistent
transition-show="scale"
transition-hide="scale"
:model-value="props.open"
@update:model-value="(v) => $emit('update:open', v)"
>
<q-card style="width: 400px"> <q-card style="width: 400px">
<q-card-section> <q-card-section>
<span class="text-h6"> <span class="text-h6">
@ -21,7 +36,7 @@ defineEmits(['confirm', 'cancel'])
label="ยกเลิก" label="ยกเลิก"
flat flat
v-close-popup v-close-popup
@click="() => $emit('cancel')" @click="() => ($emit('update:open', !open))"
/> />
<q-btn <q-btn

View file

@ -4,22 +4,25 @@ import { storeToRefs } from 'pinia'
import FileIcon from '@/components/FileIcon.vue' import FileIcon from '@/components/FileIcon.vue'
import FileItemAction from '@/components/FileItemAction.vue' import FileItemAction from '@/components/FileItemAction.vue'
import DialogDelete from '@/components/DialogDelete.vue'
import FileForm from './FileForm.vue' import FileForm from './FileForm.vue'
import FolderForm from './FolderForm.vue' import FolderForm from './FolderForm.vue'
import UploadExistDialog from './UploadExistDialog.vue' import UploadExistDialog from './UploadExistDialog.vue'
import { useTreeDataStore } from '@/stores/tree-data' import { useTreeDataStore } from '@/stores/tree-data'
import { useFileInfoStore } from '@/stores/file-info-data' import { useFileInfoStore } from '@/stores/file-info-data'
import test from 'node:test'
const props = withDefaults( const props = withDefaults(
defineProps<{ action: boolean; viewMode: 'view_list' | 'view_module' }>(), defineProps<{ action: boolean; viewMode: 'view_list' | 'view_module' }>(),
{ {
action: false, action: false,
}, }
) )
const DEPT_NAME = ['ตู้เอกสาร', 'ลิ้นชัก', 'แฟ้ม', 'แฟ้มย่อย'] as const const DEPT_NAME = ['ตู้เอกสาร', 'ลิ้นชัก', 'แฟ้ม', 'แฟ้มย่อย'] as const
const { getFileInfo, getFileNameFormat } = useFileInfoStore() const { getFileInfo, getFileNameFormat } = useFileInfoStore()
const { currentFolder, currentFile, currentDept, currentPath } = const { currentFolder, currentFile, currentDept, currentPath } = storeToRefs(
storeToRefs(useTreeDataStore()) useTreeDataStore()
)
const { const {
createFolder, createFolder,
editFolder, editFolder,
@ -35,10 +38,14 @@ const currentIcon = computed(() =>
currentDept.value === 0 currentDept.value === 0
? 'mdi-file-cabinet' ? 'mdi-file-cabinet'
: currentDept.value === 1 : currentDept.value === 1
? 'inbox' ? 'inbox'
: 'o_folder_open', : 'o_folder_open'
) )
const dialogDeleteState = ref<boolean>(false)
const deleteFormPath = ref<string>('')
const deleteFormType = ref<'deleteFolder' | 'deleteFile'>()
const folderFormState = ref<boolean>(false) const folderFormState = ref<boolean>(false)
const folderFormPath = ref<string>('') const folderFormPath = ref<string>('')
const folderFormData = ref<{ const folderFormData = ref<{
@ -58,6 +65,18 @@ const fileFormType = ref<'edit' | 'create'>('create')
const fileFormError = ref<{ fileExist?: boolean }>({}) const fileFormError = ref<{ fileExist?: boolean }>({})
const fileExistNotification = ref<boolean>(false) const fileExistNotification = ref<boolean>(false)
function triggerFolderDelete(pathname: string) {
deleteFormType.value = 'deleteFolder'
deleteFormPath.value = pathname
dialogDeleteState.value = !dialogDeleteState.value
}
function triggerFileDelete(pathname: string) {
deleteFormType.value = 'deleteFile'
deleteFormPath.value = pathname
dialogDeleteState.value = !dialogDeleteState.value
}
function triggerFolderCreate() { function triggerFolderCreate() {
folderFormType.value = 'create' folderFormType.value = 'create'
folderFormData.value = {} folderFormData.value = {}
@ -95,7 +114,7 @@ function triggerFileEdit(
keyword: string keyword: string
category: string category: string
}, },
pathname: string, pathname: string
) { ) {
fileFormState.value = true fileFormState.value = true
fileFormType.value = 'edit' fileFormType.value = 'edit'
@ -119,7 +138,7 @@ async function submitFileForm(
keyword: string keyword: string
category: string category: string
}, },
force = false, force = false
) { ) {
currentParam.value = value currentParam.value = value
@ -144,7 +163,7 @@ async function submitFileForm(
keyword: value.keyword, keyword: value.keyword,
category: value.category, category: value.category,
}, },
value.file, value.file
) )
} }
fileFormData.value = {} fileFormData.value = {}
@ -186,7 +205,7 @@ async function submitFileForm(
v-if="props.action" v-if="props.action"
> >
<file-item-action <file-item-action
@delete="() => deleteFolder(value.pathname)" @delete="() => triggerFolderDelete(value.pathname)"
@edit="() => triggerFolderEdit(value.name, value.pathname)" @edit="() => triggerFolderEdit(value.name, value.pathname)"
/> />
</div> </div>
@ -292,10 +311,10 @@ async function submitFileForm(
keyword: value.keyword.join(','), keyword: value.keyword.join(','),
category: value.category.join(','), category: value.category.join(','),
}, },
value.pathname, value.pathname
) )
" "
@delete="() => deleteFile(value.pathname)" @delete="() => triggerFileDelete(value.pathname)"
/> />
</div> </div>
<div <div
@ -369,6 +388,15 @@ async function submitFileForm(
@confirm="() => currentParam && submitFileForm(currentParam, true)" @confirm="() => currentParam && submitFileForm(currentParam, true)"
@cancel="() => (currentParam = undefined)" @cancel="() => (currentParam = undefined)"
/> />
<dialog-delete
v-model:open="dialogDeleteState"
@confirm="
() =>
deleteFormType &&
{ deleteFolder, deleteFile }[deleteFormType](deleteFormPath)
"
/>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>

View file

@ -5,12 +5,14 @@ import type { QTableProps } from 'quasar'
import { useTreeDataStore, type TreeDataFolder } from '@/stores/tree-data' import { useTreeDataStore, type TreeDataFolder } from '@/stores/tree-data'
import { useFileInfoStore } from '@/stores/file-info-data' import { useFileInfoStore } from '@/stores/file-info-data'
import FileIcon from '@/components/FileIcon.vue' import FileIcon from '@/components/FileIcon.vue'
import DialogDelete from '@/components/DialogDelete.vue'
import FileForm from './FileForm.vue' import FileForm from './FileForm.vue'
import FolderForm from './FolderForm.vue' import FolderForm from './FolderForm.vue'
const { getFormatDate, getSize, getType, getFileInfo } = useFileInfoStore() const { getFormatDate, getSize, getType, getFileInfo } = useFileInfoStore()
const { listDataFile, listDataFolder, currentDept, currentPath } = const { listDataFile, listDataFolder, currentDept, currentPath } = storeToRefs(
storeToRefs(useTreeDataStore()) useTreeDataStore()
)
const { const {
createFolder, createFolder,
editFolder, editFolder,
@ -32,18 +34,18 @@ const currentLevel = computed(() =>
currentDept.value === 0 currentDept.value === 0
? 'ตู้จัดเก็บเอกสาร' ? 'ตู้จัดเก็บเอกสาร'
: currentDept.value === 1 : currentDept.value === 1
? 'ลิ้นชัก' ? 'ลิ้นชัก'
: currentDept.value === 2 : currentDept.value === 2
? 'แฟ้ม' ? 'แฟ้ม'
: 'แฟ้มย่อย', : 'แฟ้มย่อย'
) )
const currentIcon = computed(() => const currentIcon = computed(() =>
currentDept.value === 0 currentDept.value === 0
? 'mdi-file-cabinet' ? 'mdi-file-cabinet'
: currentDept.value === 1 : currentDept.value === 1
? 'inbox' ? 'inbox'
: 'o_folder_open', : 'o_folder_open'
) )
const folderFormState = ref<boolean>(false) const folderFormState = ref<boolean>(false)
@ -64,6 +66,22 @@ const fileFormData = ref<{
}>({}) }>({})
const fileFormType = ref<'edit' | 'create'>('create') const fileFormType = ref<'edit' | 'create'>('create')
const dialogDeleteState = ref<boolean>(false)
const deleteFormPath = ref<string>('')
const deleteFormType = ref<'deleteFolder' | 'deleteFile'>()
function triggerFolderDelete(pathname: string) {
deleteFormType.value = 'deleteFolder'
deleteFormPath.value = pathname
dialogDeleteState.value = !dialogDeleteState.value
}
function triggerFileDelete(pathname: string) {
deleteFormType.value = 'deleteFile'
deleteFormPath.value = pathname
dialogDeleteState.value = !dialogDeleteState.value
}
function triggerFolderCreate() { function triggerFolderCreate() {
folderFormType.value = 'create' folderFormType.value = 'create'
folderFormData.value = {} folderFormData.value = {}
@ -101,7 +119,7 @@ function triggerFileEdit(
keyword: string keyword: string
category: string category: string
}, },
pathname: string, pathname: string
) { ) {
fileFormState.value = true fileFormState.value = true
fileFormType.value = 'edit' fileFormType.value = 'edit'
@ -138,7 +156,7 @@ async function submitFileForm(value: {
keyword: value.keyword, keyword: value.keyword,
category: value.category, category: value.category,
}, },
value.file, value.file
) )
} }
fileFormData.value = {} fileFormData.value = {}
@ -295,7 +313,7 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
@click.stop=" @click.stop="
triggerFolderEdit( triggerFolderEdit(
actionsRow.row.name, actionsRow.row.name,
actionsRow.row.pathname, actionsRow.row.pathname
) )
" "
/> />
@ -304,7 +322,7 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
color="negative" color="negative"
dense dense
icon="delete" icon="delete"
@click.stop="deleteFolder(actionsRow.row.pathname)" @click.stop="triggerFolderDelete(actionsRow.row.pathname)"
/> />
</div> </div>
</q-td> </q-td>
@ -395,7 +413,7 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
color="negative" color="negative"
dense dense
icon="delete" icon="delete"
@click="() => deleteFile(actionsRow.row.pathname)" @click="() => triggerFileDelete(actionsRow.row.pathname)"
/> />
</div> </div>
</q-td> </q-td>
@ -424,6 +442,15 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
v-model:name="folderFormData.name" v-model:name="folderFormData.name"
@submit="submitFolderForm" @submit="submitFolderForm"
/> />
<dialog-delete
v-model:open="dialogDeleteState"
@confirm="
() =>
deleteFormType &&
(deleteFolder(deleteFormPath), deleteFile(deleteFormPath))
"
/>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>

View file

@ -40,6 +40,8 @@ export interface TreeDataFolder {
export const useTreeDataStore = defineStore('changeCabinet', () => { export const useTreeDataStore = defineStore('changeCabinet', () => {
const loader = useLoader() const loader = useLoader()
const indexToRemove = ref<number>()
const fileNameRemove = ref<string>('')
const data = ref<TreeDataFolder[]>([]) const data = ref<TreeDataFolder[]>([])
const currentFolder = ref<TreeDataFolder[]>([]) const currentFolder = ref<TreeDataFolder[]>([])
@ -94,7 +96,7 @@ export const useTreeDataStore = defineStore('changeCabinet', () => {
currentPath.value = pathname currentPath.value = pathname
const res = await axiosClient.get<EhrFolder[]>( const res = await axiosClient.get<EhrFolder[]>(
`${apiEndpoint}${requestPath}`, `${apiEndpoint}${requestPath}`
) )
const list = res.data.map((v) => ({ const list = res.data.map((v) => ({
@ -154,6 +156,7 @@ export const useTreeDataStore = defineStore('changeCabinet', () => {
const res = await axiosClient.get<EhrFile[]>(`${apiEndpoint}${requestPath}`) const res = await axiosClient.get<EhrFile[]>(`${apiEndpoint}${requestPath}`)
currentFile.value = res.data currentFile.value = res.data
listDataFile.value = currentFile.value listDataFile.value = currentFile.value
return loader.hide() return loader.hide()
@ -245,7 +248,7 @@ export const useTreeDataStore = defineStore('changeCabinet', () => {
description: string description: string
keyword: string keyword: string
category: string category: string
}, }
) { ) {
loader.show() loader.show()
@ -265,7 +268,7 @@ export const useTreeDataStore = defineStore('changeCabinet', () => {
{ {
file: file.name, file: file.name,
...metadata, ...metadata,
}, }
) )
if (res && res.data.upload) { if (res && res.data.upload) {
@ -294,7 +297,7 @@ export const useTreeDataStore = defineStore('changeCabinet', () => {
keyword: string keyword: string
category: string category: string
}, },
file?: File, file?: File
) { ) {
loader.show() loader.show()
@ -309,7 +312,7 @@ export const useTreeDataStore = defineStore('changeCabinet', () => {
const res = await axiosClient.patch<{ upload: string }>( const res = await axiosClient.patch<{ upload: string }>(
`${apiEndpoint}${requestPath}`, `${apiEndpoint}${requestPath}`,
{ file: file?.name, ...metadata }, { file: file?.name, ...metadata }
) )
if (res && res.data.upload) { if (res && res.data.upload) {
@ -342,7 +345,6 @@ export const useTreeDataStore = defineStore('changeCabinet', () => {
if (pathArray.length >= 5) requestPath += `/subfolder/${pathArray[3]}` if (pathArray.length >= 5) requestPath += `/subfolder/${pathArray[3]}`
requestPath += `/file/${pathArray.at(-1)}` requestPath += `/file/${pathArray.at(-1)}`
console.log(requestPath, pathArray)
await axiosClient.delete(`${apiEndpoint}${requestPath}`) await axiosClient.delete(`${apiEndpoint}${requestPath}`)
if (currentDept.value === 0) { if (currentDept.value === 0) {
@ -351,6 +353,8 @@ export const useTreeDataStore = defineStore('changeCabinet', () => {
await getFile(currentPath.value) await getFile(currentPath.value)
currentFile.value = currentFile.value.filter((v) => v.pathname !== pathname)
return loader.hide() return loader.hide()
} }