hrms-edm/Services/client/src/stores/tree-data.ts

382 lines
9.8 KiB
TypeScript
Raw Normal View History

2023-11-23 08:47:44 +07:00
import { ref } from 'vue'
import { defineStore } from 'pinia'
import { useLoader } from '@/stores/loader'
import HttpService from '@/services/HttpService'
const axiosClient = HttpService.getAxiosClient()
const apiEndpoint: string = import.meta.env.VITE_API_ENDPOINT
export interface EhrFolder {
pathname: string
name: string
createdAt: string
createdBy: string
}
export interface EhrFile {
pathname: string
fileName: string
fileSize: string
fileType: string
title: string
description: string
category: string[]
keyword: string[]
updatedAt: string
updatedBy: string
createdAt: string
createdBy: string
}
export interface TreeDataFolder {
pathname: string
name: string
status: boolean
folder: TreeDataFolder[]
file?: EhrFile[]
}
export const useTreeDataStore = defineStore('changeCabinet', () => {
const loader = useLoader()
const data = ref<TreeDataFolder[]>([])
const currentFolder = ref<TreeDataFolder[]>([])
const currentFile = ref<EhrFile[]>([])
const currentPath = ref<string>('')
const currentDept = ref<number>(0)
2023-11-28 09:22:44 +07:00
const listDataFolder = ref<TreeDataFolder[]>()
const listDataFile = ref<EhrFile[]>()
2023-11-23 08:47:44 +07:00
async function getCabinet() {
const res = await axiosClient.get<EhrFolder[]>(`${apiEndpoint}cabinet`)
data.value = currentFolder.value = res.data.map((v) => ({
...v,
status: false,
folder: [],
}))
2023-11-28 09:22:44 +07:00
listDataFolder.value = data.value
2023-11-23 08:47:44 +07:00
}
async function getFolder(pathname: string, updateStatus = true) {
loader.show()
const pathArray: string[] = pathname.split('/').filter(Boolean)
currentDept.value = pathArray.length
if (pathArray.length >= 4) {
currentFolder.value = []
await getFile(pathname)
let current: (typeof data.value)[number] | undefined
current = data.value.find((v) => v.name === pathArray[0])
2023-11-23 11:30:28 +07:00
2023-11-23 08:47:44 +07:00
if (current && updateStatus) current.status = true
current = current?.folder.find((v) => v.name === pathArray[1])
if (current && updateStatus) current.status = true
current = current?.folder.find((v) => v.name === pathArray[2])
if (current && updateStatus) current.status = true
current = current?.folder.find((v) => v.name === pathArray[3])
if (current && updateStatus) current.status = true
2023-11-23 11:30:28 +07:00
currentPath.value = pathname
2023-11-23 08:47:44 +07:00
return loader.hide()
}
let requestPath = 'cabinet'
if (pathArray.length >= 1) requestPath += `/${pathArray[0]}/drawer`
if (pathArray.length >= 2) requestPath += `/${pathArray[1]}/folder`
if (pathArray.length >= 3) requestPath += `/${pathArray[2]}/subfolder`
currentPath.value = pathname
const res = await axiosClient.get<EhrFolder[]>(
2023-11-29 15:28:28 +07:00
`${apiEndpoint}${requestPath}`,
2023-11-23 08:47:44 +07:00
)
const list = res.data.map((v) => ({
...v,
status: false,
folder: [],
}))
let current: (typeof data.value)[number] | undefined
if (pathArray.length >= 1) {
current = data.value.find((v) => v.name === pathArray[0])
if (current && updateStatus) {
current.status = true
}
}
if (pathArray.length >= 2) {
current = current?.folder.find((v) => v.name === pathArray[1])
if (current && updateStatus) {
current.status = true
}
}
if (pathArray.length >= 3) {
current = current?.folder.find((v) => v.name === pathArray[2])
if (current && updateStatus) {
current.status = true
}
}
if (current) current.folder = list
currentFolder.value = list
await getFile(pathname)
2023-11-28 09:22:44 +07:00
listDataFolder.value = currentFolder.value
2023-11-23 08:47:44 +07:00
return loader.hide()
}
async function getFile(pathname: string) {
loader.show()
const pathArray: string[] = pathname.split('/').filter(Boolean)
if (pathArray.length <= 2) {
currentFile.value = []
return loader.hide()
}
let requestPath = `cabinet/${pathArray[0]}/drawer/${pathArray[1]}`
if (pathArray.length >= 3) requestPath += `/folder/${pathArray[2]}`
if (pathArray.length >= 4) requestPath += `/subfolder/${pathArray[3]}`
requestPath += '/file'
const res = await axiosClient.get<EhrFile[]>(`${apiEndpoint}${requestPath}`)
currentFile.value = res.data
2023-11-28 09:22:44 +07:00
listDataFile.value = currentFile.value
2023-11-23 08:47:44 +07:00
return loader.hide()
}
async function createFolder(name: string | undefined) {
loader.show()
if (!name) return loader.hide()
const pathArray: string[] = currentPath.value.split('/').filter(Boolean)
let requestPath = 'cabinet'
if (pathArray.length >= 1) requestPath += `/${pathArray[0]}/drawer`
if (pathArray.length >= 2) requestPath += `/${pathArray[1]}/folder`
if (pathArray.length >= 3) requestPath += `/${pathArray[2]}/subfolder`
await axiosClient.post(`${apiEndpoint}${requestPath}`, {
name,
})
if (currentDept.value === 0) await getCabinet()
else await getFolder(currentPath.value)
return loader.hide()
}
async function editFolder(name: string | undefined, pathname: string) {
loader.show()
if (!name) return loader.hide()
const pathArray: string[] = pathname.split('/').filter(Boolean)
let requestPath = 'cabinet'
if (pathArray.length >= 1) requestPath += `/${pathArray[0]}`
if (pathArray.length >= 2) requestPath += `/drawer/${pathArray[1]}`
if (pathArray.length >= 3) requestPath += `/folder/${pathArray[2]}`
if (pathArray.length >= 4) requestPath += `/subfolder/${pathArray[3]}`
await axiosClient.put(`${apiEndpoint}${requestPath}`, {
name: name,
})
if (currentDept.value === 0) await getCabinet()
else await getFolder(currentPath.value)
return loader.hide()
}
async function deleteFolder(pathname: string) {
loader.show()
const pathArray: string[] = pathname.split('/').filter(Boolean)
let requestPath = 'cabinet'
if (pathArray.length >= 1) requestPath += `/${pathArray[0]}`
if (pathArray.length >= 2) requestPath += `/drawer/${pathArray[1]}`
if (pathArray.length >= 3) requestPath += `/folder/${pathArray[2]}`
if (pathArray.length >= 4) requestPath += `/subfolder/${pathArray[3]}`
await axiosClient.delete(`${apiEndpoint}${requestPath}`)
if (currentDept.value === 0) await getCabinet()
else await getFolder(currentPath.value)
return loader.hide()
}
async function gotoParent() {
const pathname = currentPath.value.split('/').filter(Boolean)
pathname.pop()
if (pathname.length === 0) {
const cabinet = currentFolder.value.find((v) => v.status === true)
if (cabinet) {
cabinet.status = false
}
}
await getFolder(pathname.join('/') + '/')
}
2023-11-28 09:22:44 +07:00
async function uploadFile(
pathname: string,
file: File,
metadata: {
title: string
description: string
keyword: string
category: string
2023-11-29 15:28:28 +07:00
},
2023-11-28 09:22:44 +07:00
) {
loader.show()
const pathArray: string[] = pathname.split('/').filter(Boolean)
if (pathArray.length <= 2) return
let requestPath = 'cabinet'
if (pathArray.length >= 1) requestPath += `/${pathArray[0]}`
if (pathArray.length >= 2) requestPath += `/drawer/${pathArray[1]}`
if (pathArray.length >= 3) requestPath += `/folder/${pathArray[2]}`
if (pathArray.length >= 4) requestPath += `/subfolder/${pathArray[3]}`
requestPath += '/file'
const res = await axiosClient.post<EhrFile & { upload: string }>(
`${apiEndpoint}${requestPath}`,
{
file: file.name,
...metadata,
2023-11-29 15:28:28 +07:00
},
)
if (res && res.data.upload) {
await fetch(res.data.upload, {
method: 'PUT',
body: file,
})
2023-11-28 09:22:44 +07:00
loader.hide()
}
2023-11-28 09:22:44 +07:00
if (currentDept.value === 0) {
await getCabinet()
} else await getFolder(currentPath.value)
2023-11-28 09:22:44 +07:00
await getFile(currentPath.value)
2023-11-28 09:22:44 +07:00
return loader.hide()
}
async function updateFile(
pathname: string,
metadata: {
title: string
description: string
keyword: string
category: string
},
2023-11-29 15:28:28 +07:00
file?: File,
) {
loader.show()
const pathArray: string[] = pathname.split('/').filter(Boolean)
if (pathArray.length < 4) return loader.hide()
let requestPath = `cabinet/${pathArray[0]}/drawer/${pathArray[1]}`
if (pathArray.length >= 4) requestPath += `/folder/${pathArray[2]}`
if (pathArray.length >= 5) requestPath += `/subfolder/${pathArray[3]}`
requestPath += `/file/${pathArray.at(-1)}`
const res = await axiosClient.patch<{ upload: string }>(
`${apiEndpoint}${requestPath}`,
2023-11-29 15:28:28 +07:00
{ file: file?.name, ...metadata },
)
2023-11-28 09:24:20 +07:00
if (res && res.data.upload) {
await fetch(res.data.upload, {
method: 'PUT',
body: file,
})
loader.hide()
2023-11-28 09:24:20 +07:00
}
if (currentDept.value === 0) {
await getCabinet()
} else await getFolder(currentPath.value)
await getFile(currentPath.value)
return loader.hide()
}
async function deleteFile(pathname: string) {
loader.show()
const pathArray: string[] = pathname.split('/').filter(Boolean)
if (pathArray.length < 4) return loader.hide()
let requestPath = `cabinet/${pathArray[0]}/drawer/${pathArray[1]}`
if (pathArray.length >= 4) requestPath += `/folder/${pathArray[2]}`
if (pathArray.length >= 5) requestPath += `/subfolder/${pathArray[3]}`
requestPath += `/file/${pathArray.at(-1)}`
console.log(requestPath, pathArray)
await axiosClient.delete(`${apiEndpoint}${requestPath}`)
if (currentDept.value === 0) {
await getCabinet()
} else await getFolder(currentPath.value)
await getFile(currentPath.value)
return loader.hide()
}
function checkFile(fileName: string) {
return currentFile.value.some((element) => element.fileName === fileName)
2023-11-28 09:24:20 +07:00
}
2023-11-23 08:47:44 +07:00
return {
data,
currentFolder,
currentFile,
currentDept,
2023-11-28 09:22:44 +07:00
currentPath,
2023-11-28 09:22:44 +07:00
listDataFile,
2023-11-28 09:22:44 +07:00
listDataFolder,
2023-11-23 08:47:44 +07:00
getCabinet,
getFolder,
2023-11-28 09:22:44 +07:00
uploadFile,
updateFile,
deleteFile,
2023-11-23 08:47:44 +07:00
gotoParent,
createFolder,
deleteFolder,
editFolder,
2023-11-28 09:24:20 +07:00
checkFile,
2023-11-23 08:47:44 +07:00
}
})