fix: ListView CRUD
This commit is contained in:
parent
906c3bc4f5
commit
576736574c
3 changed files with 189 additions and 86 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import { storeToRefs } from 'pinia'
|
import { storeToRefs } from 'pinia'
|
||||||
import { useTreeDataStore } from '@/stores/tree-data'
|
import { useTreeDataStore } from '@/stores/tree-data'
|
||||||
import TagInput from '@/components/TagInput.vue'
|
import TagInput from '@/components/TagInput.vue'
|
||||||
const { currentPath } = storeToRefs(useTreeDataStore())
|
const { currentPath } = storeToRefs(useTreeDataStore())
|
||||||
const { uploadFile, checkFile } = useTreeDataStore()
|
const { uploadFile, checkFile } = useTreeDataStore()
|
||||||
|
|
||||||
|
|
@ -44,8 +44,8 @@ async function handleSubmit(continueUpload: boolean = false) {
|
||||||
await uploadFile(currentPath.value, inputFile.value, {
|
await uploadFile(currentPath.value, inputFile.value, {
|
||||||
title: fileTitle.value,
|
title: fileTitle.value,
|
||||||
description: fileDesc.value,
|
description: fileDesc.value,
|
||||||
keyword: [fileKeyword.value],
|
keyword: fileKeyword.value,
|
||||||
category: [fileCategory.value],
|
category: fileCategory.value,
|
||||||
})
|
})
|
||||||
} else notification.value = true
|
} else notification.value = true
|
||||||
}
|
}
|
||||||
|
|
@ -113,9 +113,7 @@ async function handleSubmit(continueUpload: boolean = false) {
|
||||||
dense
|
dense
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<tag-input/>
|
<tag-input />
|
||||||
|
|
||||||
|
|
||||||
</q-drawer>
|
</q-drawer>
|
||||||
|
|
||||||
<q-dialog
|
<q-dialog
|
||||||
|
|
|
||||||
|
|
@ -4,24 +4,25 @@ import { storeToRefs } from 'pinia'
|
||||||
import type { QTableProps } from 'quasar'
|
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 FromEdit from '@/components/FromEdit.vue'
|
|
||||||
import FileIcon from '@/components/FileIcon.vue'
|
import FileIcon from '@/components/FileIcon.vue'
|
||||||
import FormUpload from '@/components/FormUpload.vue'
|
import FileForm from './FileForm.vue'
|
||||||
import DialogDelete from '@/components/DialogDelete.vue'
|
import FolderForm from './FolderForm.vue'
|
||||||
|
|
||||||
const { deleteFolder } = useTreeDataStore()
|
|
||||||
const { getFormatDate, getSize, getType } = useFileInfoStore()
|
const { getFormatDate, getSize, getType } = useFileInfoStore()
|
||||||
const { listDataFile, listDataFolder, currentDept } = storeToRefs(
|
const { listDataFile, listDataFolder, currentDept, currentPath } = storeToRefs(
|
||||||
useTreeDataStore()
|
useTreeDataStore()
|
||||||
)
|
)
|
||||||
const { getFolder } = useTreeDataStore()
|
const {
|
||||||
const DEPT_NAME = ['ตู้เอกสาร', 'ลิ้นชัก', 'แฟ้ม', 'แฟ้มย่อย']
|
createFolder,
|
||||||
const drawer = ref<boolean>(false)
|
editFolder,
|
||||||
const drawerFile = ref<boolean>(false)
|
getFolder,
|
||||||
const drawerStatus = ref<'edit' | 'create'>('create')
|
deleteFolder,
|
||||||
const editPathname = ref<string>('')
|
uploadFile,
|
||||||
const confirmDelete = ref<boolean>(false)
|
updateFile,
|
||||||
const currentPathDelete = ref<string>('')
|
deleteFile,
|
||||||
|
} = useTreeDataStore()
|
||||||
|
|
||||||
|
const DEPT_NAME = ['ตู้เอกสาร', 'ลิ้นชัก', 'แฟ้ม', 'แฟ้มย่อย'] as const
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
mode: 'admin' | 'user'
|
mode: 'admin' | 'user'
|
||||||
|
|
@ -44,6 +45,105 @@ const currentIcon = computed(() =>
|
||||||
? 'inbox'
|
? 'inbox'
|
||||||
: 'o_folder_open'
|
: 'o_folder_open'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const folderFormState = ref<boolean>(false)
|
||||||
|
const folderFormPath = ref<string>('')
|
||||||
|
const folderFormData = ref<{
|
||||||
|
name?: string
|
||||||
|
}>({})
|
||||||
|
const folderFormType = ref<'edit' | 'create'>('create')
|
||||||
|
const fileFormState = ref<boolean>(false)
|
||||||
|
const fileFormPath = ref<string>('')
|
||||||
|
const fileFormData = ref<{
|
||||||
|
file?: File
|
||||||
|
title?: string
|
||||||
|
description?: string
|
||||||
|
keyword?: string
|
||||||
|
category?: string
|
||||||
|
}>({})
|
||||||
|
const fileFormType = ref<'edit' | 'create'>('create')
|
||||||
|
|
||||||
|
function triggerFolderCreate() {
|
||||||
|
folderFormType.value = 'create'
|
||||||
|
folderFormData.value = {}
|
||||||
|
folderFormState.value = !folderFormState.value
|
||||||
|
}
|
||||||
|
|
||||||
|
function triggerFolderEdit(name: string, pathname: string) {
|
||||||
|
folderFormType.value = 'edit'
|
||||||
|
folderFormPath.value = pathname
|
||||||
|
folderFormData.value.name = name
|
||||||
|
folderFormState.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
async function submitFolderForm(value: {
|
||||||
|
mode: 'create' | 'edit'
|
||||||
|
name: string
|
||||||
|
}) {
|
||||||
|
if (value.mode === 'create') {
|
||||||
|
await createFolder(value.name)
|
||||||
|
} else {
|
||||||
|
await editFolder(value.name, folderFormPath.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function triggerFileCreate() {
|
||||||
|
fileFormType.value = 'create'
|
||||||
|
fileFormData.value = {}
|
||||||
|
fileFormState.value = !fileFormState.value
|
||||||
|
}
|
||||||
|
|
||||||
|
function triggerFileEdit(
|
||||||
|
value: {
|
||||||
|
title: string
|
||||||
|
description: string
|
||||||
|
keyword: string
|
||||||
|
category: string
|
||||||
|
},
|
||||||
|
pathname: string
|
||||||
|
) {
|
||||||
|
fileFormState.value = true
|
||||||
|
fileFormType.value = 'edit'
|
||||||
|
fileFormPath.value = pathname
|
||||||
|
fileFormData.value = {
|
||||||
|
title: value.title,
|
||||||
|
description: value.description,
|
||||||
|
keyword: value.keyword,
|
||||||
|
category: value.keyword,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function submitFileForm(value: {
|
||||||
|
mode: 'create' | 'edit'
|
||||||
|
file: File
|
||||||
|
title: string
|
||||||
|
description: string
|
||||||
|
keyword: string
|
||||||
|
category: string
|
||||||
|
}) {
|
||||||
|
if (value.mode === 'create') {
|
||||||
|
await uploadFile(currentPath.value, value.file, {
|
||||||
|
title: value.title,
|
||||||
|
description: value.description,
|
||||||
|
keyword: value.keyword,
|
||||||
|
category: value.category,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
await updateFile(
|
||||||
|
fileFormPath.value,
|
||||||
|
{
|
||||||
|
title: value.title,
|
||||||
|
description: value.description,
|
||||||
|
keyword: value.keyword,
|
||||||
|
category: value.category,
|
||||||
|
},
|
||||||
|
value.file
|
||||||
|
)
|
||||||
|
}
|
||||||
|
fileFormData.value = {}
|
||||||
|
fileFormState.value = false
|
||||||
|
}
|
||||||
|
|
||||||
const columnsFolder: QTableProps['columns'] = [
|
const columnsFolder: QTableProps['columns'] = [
|
||||||
{
|
{
|
||||||
name: 'name',
|
name: 'name',
|
||||||
|
|
@ -144,16 +244,11 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
|
||||||
color="primary"
|
color="primary"
|
||||||
dense
|
dense
|
||||||
icon="add"
|
icon="add"
|
||||||
@click="
|
@click="() => triggerFolderCreate()"
|
||||||
() => {
|
|
||||||
drawer = !drawer
|
|
||||||
drawerStatus = 'create'
|
|
||||||
drawerFile = false
|
|
||||||
}
|
|
||||||
"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<q-table
|
<q-table
|
||||||
flat
|
flat
|
||||||
bordered
|
bordered
|
||||||
|
|
@ -197,11 +292,10 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
|
||||||
dense
|
dense
|
||||||
icon="edit"
|
icon="edit"
|
||||||
@click.stop="
|
@click.stop="
|
||||||
() => {
|
triggerFolderEdit(
|
||||||
drawer = !drawer
|
actionsRow.row.name,
|
||||||
drawerStatus = 'edit'
|
actionsRow.row.pathname
|
||||||
editPathname = actionsRow.row.pathname
|
)
|
||||||
}
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
<q-btn
|
<q-btn
|
||||||
|
|
@ -209,12 +303,7 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
|
||||||
color="negative"
|
color="negative"
|
||||||
dense
|
dense
|
||||||
icon="delete"
|
icon="delete"
|
||||||
@click.stop="
|
@click.stop="deleteFolder(actionsRow.row.pathname)"
|
||||||
() => {
|
|
||||||
confirmDelete = !confirmDelete
|
|
||||||
currentPathDelete = actionsRow.row.pathname
|
|
||||||
}
|
|
||||||
"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</q-td>
|
</q-td>
|
||||||
|
|
@ -240,12 +329,7 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
|
||||||
color="primary"
|
color="primary"
|
||||||
dense
|
dense
|
||||||
icon="add"
|
icon="add"
|
||||||
@click="
|
@click="() => triggerFileCreate()"
|
||||||
() => {
|
|
||||||
drawerFile = !drawerFile
|
|
||||||
drawer = false
|
|
||||||
}
|
|
||||||
"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -294,8 +378,22 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
|
||||||
</q-tooltip>
|
</q-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="props.mode === 'admin'">
|
<div v-if="props.mode === 'admin'">
|
||||||
<q-btn flat color="positive" dense icon="edit" @click="" />
|
<q-btn
|
||||||
<q-btn flat color="negative" dense icon="delete" @click="" />
|
flat
|
||||||
|
color="positive"
|
||||||
|
dense
|
||||||
|
icon="edit"
|
||||||
|
@click="
|
||||||
|
() => triggerFileEdit(actionsRow.row, actionsRow.row.pathname)
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
color="negative"
|
||||||
|
dense
|
||||||
|
icon="delete"
|
||||||
|
@click="() => deleteFile(actionsRow.row.pathname)"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</q-td>
|
</q-td>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -303,23 +401,23 @@ const onRowClick = (evt: Event, row: TreeDataFolder, index: number) => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<from-edit
|
<file-form
|
||||||
v-if="drawer"
|
:mode="fileFormType"
|
||||||
:drawer="drawer"
|
v-model:open="fileFormState"
|
||||||
:drawerStatus="drawerStatus"
|
v-model:title="fileFormData.title"
|
||||||
:DEPT_NAME="DEPT_NAME"
|
v-model:description="fileFormData.description"
|
||||||
:currentDept="currentDept"
|
v-model:keyword="fileFormData.keyword"
|
||||||
:editPathname="editPathname"
|
v-model:category="fileFormData.category"
|
||||||
@update:drawer="() => (drawer = false)"
|
@submit="submitFileForm"
|
||||||
/>
|
/>
|
||||||
<form-upload
|
|
||||||
:drawerFile="drawerFile"
|
<folder-form
|
||||||
@update:drawerFile="() => (drawerFile = false)"
|
:mode="folderFormType"
|
||||||
/>
|
:tree="DEPT_NAME[currentDept]"
|
||||||
<dialog-delete
|
v-if="currentDept < 4"
|
||||||
:confirmDelete="confirmDelete"
|
v-model:open="folderFormState"
|
||||||
:pathname="currentPathDelete"
|
v-model:name="folderFormData.name"
|
||||||
@update:confirmDelete="() => (confirmDelete = false)"
|
@submit="submitFolderForm"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,19 +10,14 @@ import SearchBar from '@/modules/01_user/components/SearchBar.vue'
|
||||||
import FileSearched from '@/components/FileSearched.vue'
|
import FileSearched from '@/components/FileSearched.vue'
|
||||||
import FileDownload from '@/modules/01_user/components/FileDownload.vue'
|
import FileDownload from '@/modules/01_user/components/FileDownload.vue'
|
||||||
import ListView from '@/components/ListView.vue'
|
import ListView from '@/components/ListView.vue'
|
||||||
import FromEdit from '@/components/FromEdit.vue'
|
import FolderForm from './FolderForm.vue'
|
||||||
|
|
||||||
|
const DEPT_NAME = ['ตู้เอกสาร', 'ลิ้นชัก', 'แฟ้ม', 'แฟ้มย่อย'] as const
|
||||||
const DEPT_NAME = ['ตู้เอกสาร', 'ลิ้นชัก', 'แฟ้ม', 'แฟ้มย่อย', 'ไฟล์']
|
|
||||||
|
|
||||||
const { isPreview } = storeToRefs(useFileInfoStore())
|
const { isPreview } = storeToRefs(useFileInfoStore())
|
||||||
const { isSearch } = storeToRefs(useSearchDataStore())
|
const { isSearch } = storeToRefs(useSearchDataStore())
|
||||||
const { data, currentDept } = storeToRefs(useTreeDataStore())
|
const { data, currentDept } = storeToRefs(useTreeDataStore())
|
||||||
const { getCabinet, gotoParent } = useTreeDataStore()
|
const { createFolder, getCabinet, gotoParent } = useTreeDataStore()
|
||||||
|
|
||||||
const drawer = ref<boolean>(false)
|
|
||||||
const drawerFile = ref<boolean>(false)
|
|
||||||
const drawerStatus = ref<'create'>('create')
|
|
||||||
|
|
||||||
const viewMode = ref<'view_list' | 'view_module'>('view_list')
|
const viewMode = ref<'view_list' | 'view_module'>('view_list')
|
||||||
const inputSearch = ref<string>()
|
const inputSearch = ref<string>()
|
||||||
|
|
@ -30,6 +25,27 @@ const props = defineProps<{
|
||||||
mode: 'admin' | 'user'
|
mode: 'admin' | 'user'
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(getCabinet)
|
onMounted(getCabinet)
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
|
|
@ -107,13 +123,7 @@ onMounted(getCabinet)
|
||||||
color="primary"
|
color="primary"
|
||||||
dense
|
dense
|
||||||
icon="add"
|
icon="add"
|
||||||
@click="
|
@click="()=> triggerFolderCreate()"
|
||||||
() => {
|
|
||||||
drawer = !drawer
|
|
||||||
drawerStatus = 'create'
|
|
||||||
drawerFile = false
|
|
||||||
}
|
|
||||||
"
|
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
<q-btn
|
<q-btn
|
||||||
|
|
@ -142,16 +152,13 @@ onMounted(getCabinet)
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<folder-form
|
||||||
|
:mode="folderFormType"
|
||||||
<from-edit
|
:tree="DEPT_NAME[currentDept]"
|
||||||
v-if="currentDept === 0 && drawer "
|
v-if="currentDept < 4"
|
||||||
:drawer="drawer"
|
v-model:open="folderFormState"
|
||||||
:drawerStatus="drawerStatus"
|
v-model:name="folderFormData.name"
|
||||||
:DEPT_NAME="DEPT_NAME"
|
@submit="submitFolderForm"
|
||||||
:currentDept="currentDept"
|
|
||||||
editPathname=""
|
|
||||||
@update:drawer="() => (drawer = false)"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue