|
|
|
@ -6,7 +6,7 @@
@@ -6,7 +6,7 @@
|
|
|
|
|
<template v-for="(item, index) in breadcrumbList" :key="index"> |
|
|
|
|
<el-breadcrumb-item |
|
|
|
|
:class="{ active: index + 1 < breadcrumbList.length }" |
|
|
|
|
@click="onCrumb" |
|
|
|
|
@click="onCrumb(item)" |
|
|
|
|
>{{ item.name }}</el-breadcrumb-item |
|
|
|
|
> |
|
|
|
|
</template> |
|
|
|
@ -18,7 +18,7 @@
@@ -18,7 +18,7 @@
|
|
|
|
|
@visibleChange="onVisibleChange" |
|
|
|
|
ref="contextMenuRef" |
|
|
|
|
> |
|
|
|
|
<div class="file-list"> |
|
|
|
|
<div class="file-list" v-if="loading"> |
|
|
|
|
<div v-for="item in dataList" :key="item.id" @click="onFileOpen(item)"> |
|
|
|
|
<div class="item SourceClass" v-setItem="item"> |
|
|
|
|
<div class="file-header"> |
|
|
|
@ -30,18 +30,22 @@
@@ -30,18 +30,22 @@
|
|
|
|
|
></Icon> |
|
|
|
|
</div> |
|
|
|
|
<div class="file-icon"> |
|
|
|
|
<img :src="item.type === 'folder' ? Folder : Document" /> |
|
|
|
|
<!-- {{ !!item.isEdit }} --> |
|
|
|
|
|
|
|
|
|
<img :src="item.type === floeType.folder ? Folder : Document" /> |
|
|
|
|
</div> |
|
|
|
|
<div class="file-name"> |
|
|
|
|
<el-input |
|
|
|
|
class="edit-input" |
|
|
|
|
@click.stop="() => {}" |
|
|
|
|
v-show="item?.isEdit" |
|
|
|
|
v-if="!!item?.isEdit" |
|
|
|
|
v-model="editFileName" |
|
|
|
|
:key="item.id + '_edit'" |
|
|
|
|
:ref="el => setInputRefs(el, item.id)" |
|
|
|
|
@blur="onSaveRename(item)" |
|
|
|
|
@keyup.enter="onSaveRename(item)" |
|
|
|
|
/> |
|
|
|
|
<span v-show="!item?.isEdit">{{ item.name }}</span> |
|
|
|
|
<span v-else>{{ item.name }}</span> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
@ -66,33 +70,42 @@
@@ -66,33 +70,42 @@
|
|
|
|
|
</EdfsContextMenu> |
|
|
|
|
</EdfsWrap> |
|
|
|
|
</div> |
|
|
|
|
<markdownDrawer |
|
|
|
|
v-model="isShowMdDrawer" |
|
|
|
|
v-if="isShowMdDrawer" |
|
|
|
|
:data="curMarkdown" |
|
|
|
|
@onSave="onSaveMd" |
|
|
|
|
/> |
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
<script setup lang="ts"> |
|
|
|
|
import { |
|
|
|
|
floeType, |
|
|
|
|
operationDropdownMenu, |
|
|
|
|
breadcrumbList, |
|
|
|
|
fileDropdownMenu, |
|
|
|
|
} from './utils' |
|
|
|
|
import EdfsWrap from '@/components/dashboard/Edfs-wrap.vue' |
|
|
|
|
import { deleteFirmware, getFirmwareList } from '@/api/module/eam/device/firmware' |
|
|
|
|
import { |
|
|
|
|
getFileList, |
|
|
|
|
createFolder, |
|
|
|
|
updateFolder, |
|
|
|
|
createdFile, |
|
|
|
|
updateFile, |
|
|
|
|
deleteFolder, |
|
|
|
|
deleteFile, |
|
|
|
|
getMarkdown, |
|
|
|
|
updateMarkdown, |
|
|
|
|
type ContentType, |
|
|
|
|
} from '@/api/module/eam/device/document' |
|
|
|
|
import { isResError, useMessage } from '@/hooks/useMessage.js' |
|
|
|
|
import { ArrowRight } from '@element-plus/icons-vue' |
|
|
|
|
import ListJson from './list.json' |
|
|
|
|
import Folder from '@/assets/image/dashboard/file/folder.svg' |
|
|
|
|
import Upload from '@/assets/image/dashboard/file/upload.svg' |
|
|
|
|
import Document from '@/assets/image/dashboard/file/document.svg' |
|
|
|
|
import { Icon } from '@/components/dashboard/Icon' |
|
|
|
|
import EdfsContextMenu from '@/components/dashboard/Edfs-context-menu/index.vue' |
|
|
|
|
import { color } from 'echarts' |
|
|
|
|
|
|
|
|
|
const breadcrumbList = ref([{ name: '全部文件', id: 'all' }]) |
|
|
|
|
|
|
|
|
|
const fileDropdownMenu = [ |
|
|
|
|
{ command: 'open', label: '打开' }, |
|
|
|
|
{ command: 'rename', label: '重命名' }, |
|
|
|
|
{ command: 'delete', label: '删除' }, |
|
|
|
|
] |
|
|
|
|
const operationDropdownMenu = [ |
|
|
|
|
{ command: 'newFolder', label: '新建文件夹', icon: Folder }, |
|
|
|
|
// { command: 'upload', label: '上传', icon: Upload }, |
|
|
|
|
{ command: 'newMarkdown', label: '新建文档', icon: Document }, |
|
|
|
|
] |
|
|
|
|
import markdownDrawer from './components/markdownDrawer.vue' |
|
|
|
|
|
|
|
|
|
const dropdownMenu = computed(() => { |
|
|
|
|
return menuTarget.value ? fileDropdownMenu : operationDropdownMenu |
|
|
|
@ -100,17 +113,41 @@ const dropdownMenu = computed(() => {
@@ -100,17 +113,41 @@ const dropdownMenu = computed(() => {
|
|
|
|
|
|
|
|
|
|
const message = useMessage() |
|
|
|
|
|
|
|
|
|
const dataList = ref<any>(ListJson) |
|
|
|
|
const currentId = ref(0) |
|
|
|
|
watch(breadcrumbList.value, () => { |
|
|
|
|
currentId.value = breadcrumbList.value[breadcrumbList.value.length - 1].id |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
async function loadData() {} |
|
|
|
|
const dataList = ref<any>([]) |
|
|
|
|
const loading = ref(false) |
|
|
|
|
async function loadData(id: number = 0) { |
|
|
|
|
loading.value = true |
|
|
|
|
const res = await getFileList({ |
|
|
|
|
parentId: id, |
|
|
|
|
}) |
|
|
|
|
if (isResError(res)) return |
|
|
|
|
dataList.value = res.data.map((item: any) => ({ |
|
|
|
|
...item, |
|
|
|
|
isEdit: false, |
|
|
|
|
})) |
|
|
|
|
loading.value = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function onDelete(id: string) { |
|
|
|
|
async function onDelete(item: any) { |
|
|
|
|
try { |
|
|
|
|
let res |
|
|
|
|
await message.delConfirm() |
|
|
|
|
const res = await deleteFirmware(id) |
|
|
|
|
switch (item.type) { |
|
|
|
|
case floeType.folder: |
|
|
|
|
res = await deleteFolder(item.id) |
|
|
|
|
break |
|
|
|
|
case floeType.file: |
|
|
|
|
res = await deleteFile(item.id) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
if (isResError(res)) return |
|
|
|
|
message.success('删除成功') |
|
|
|
|
loadData() |
|
|
|
|
loadData(currentId.value) |
|
|
|
|
} catch (error) {} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -121,9 +158,8 @@ function onFile(e: any) {
@@ -121,9 +158,8 @@ function onFile(e: any) {
|
|
|
|
|
|
|
|
|
|
function onNewFolder() { |
|
|
|
|
const folder = { |
|
|
|
|
id: dataList.value.length + 1, |
|
|
|
|
name: '新建文件夹', |
|
|
|
|
type: 'folder', |
|
|
|
|
type: floeType.folder, |
|
|
|
|
isEdit: true, |
|
|
|
|
} |
|
|
|
|
dataList.value.push(folder) |
|
|
|
@ -132,9 +168,8 @@ function onNewFolder() {
@@ -132,9 +168,8 @@ function onNewFolder() {
|
|
|
|
|
|
|
|
|
|
function onNewMarkdown() { |
|
|
|
|
const markdown = { |
|
|
|
|
id: dataList.value.length + 1, |
|
|
|
|
name: '新建文档', |
|
|
|
|
type: 'markdown', |
|
|
|
|
type: floeType.file, |
|
|
|
|
isEdit: true, |
|
|
|
|
} |
|
|
|
|
dataList.value.push(markdown) |
|
|
|
@ -144,7 +179,7 @@ function onNewMarkdown() {
@@ -144,7 +179,7 @@ function onNewMarkdown() {
|
|
|
|
|
function onCommand(command: string, item: any) { |
|
|
|
|
switch (command) { |
|
|
|
|
case 'delete': |
|
|
|
|
// onDelete() |
|
|
|
|
onDelete(item) |
|
|
|
|
break |
|
|
|
|
case 'rename': |
|
|
|
|
onRename(item) |
|
|
|
@ -168,16 +203,22 @@ function onVisibleChange(visible: boolean, currentElement: HTMLElement | null) {
@@ -168,16 +203,22 @@ function onVisibleChange(visible: boolean, currentElement: HTMLElement | null) {
|
|
|
|
|
menuTarget.value = currentElement |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function onCrumb() {} |
|
|
|
|
function onCrumb(item: any) { |
|
|
|
|
const isLast = breadcrumbList.value[breadcrumbList.value.length - 1].id === item.id |
|
|
|
|
if (isLast) return |
|
|
|
|
const index = breadcrumbList.value.findIndex(v => v.id === item.id) |
|
|
|
|
breadcrumbList.value = breadcrumbList.value.slice(0, index + 1) |
|
|
|
|
loadData(item.id) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function onFileOpen(item: any) { |
|
|
|
|
if (item.isEdit) return |
|
|
|
|
if (item.type === 'folder') { |
|
|
|
|
breadcrumbList.value.push({ name: item.name, id: item.id }) |
|
|
|
|
loadData() |
|
|
|
|
if (item.type === floeType.folder) { |
|
|
|
|
breadcrumbList.value.push(item) |
|
|
|
|
loadData(item.id) |
|
|
|
|
} |
|
|
|
|
if (item.type === 'markdown') { |
|
|
|
|
console.log('open markdown') |
|
|
|
|
if (item.type === floeType.file) { |
|
|
|
|
onOpenMarkdownDrawer(item.id) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -189,18 +230,97 @@ function setInputRefs(el: any, id: number) {
@@ -189,18 +230,97 @@ function setInputRefs(el: any, id: number) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const editFileName = ref('') |
|
|
|
|
function onSaveRename(item: any) { |
|
|
|
|
async function onSaveRename(item: any) { |
|
|
|
|
if (!item.isEdit) return |
|
|
|
|
item.name = editFileName.value |
|
|
|
|
await nextTick() |
|
|
|
|
item.isEdit = false |
|
|
|
|
await nextTick() |
|
|
|
|
await onSaveFile(item) |
|
|
|
|
editFileName.value = '' |
|
|
|
|
} |
|
|
|
|
async function onRename(item: any) { |
|
|
|
|
if (!item) return |
|
|
|
|
item.isEdit = true |
|
|
|
|
await nextTick() |
|
|
|
|
editFileName.value = item.name |
|
|
|
|
await nextTick() |
|
|
|
|
editInputRefs.value[`editInputRef_${item.id}`].focus() |
|
|
|
|
editInputRefs.value[`editInputRef_${item.id}`].select() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function onSaveFile(item: any) { |
|
|
|
|
const isAdd = !item.id |
|
|
|
|
switch (item.type) { |
|
|
|
|
case floeType.folder: |
|
|
|
|
await saveFolder(isAdd, item) |
|
|
|
|
break |
|
|
|
|
case floeType.file: |
|
|
|
|
await saveFile(isAdd, item) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
loadData(currentId.value) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function saveFolder(isAdd: boolean, item: any) { |
|
|
|
|
let res |
|
|
|
|
if (isAdd) { |
|
|
|
|
res = await createFolder({ |
|
|
|
|
name: item.name, |
|
|
|
|
parentId: currentId.value, |
|
|
|
|
}) |
|
|
|
|
} else { |
|
|
|
|
res = await updateFolder({ |
|
|
|
|
id: item.id, |
|
|
|
|
name: item.name, |
|
|
|
|
parentId: currentId.value, |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
if (isResError(res)) return |
|
|
|
|
} |
|
|
|
|
async function saveFile(isAdd: boolean, item: any) { |
|
|
|
|
let res |
|
|
|
|
if (isAdd) { |
|
|
|
|
res = await createdFile({ |
|
|
|
|
name: item.name + '.md', |
|
|
|
|
parentId: currentId.value, |
|
|
|
|
}) |
|
|
|
|
} else { |
|
|
|
|
res = await updateFile({ |
|
|
|
|
id: item.id, |
|
|
|
|
name: item.name, |
|
|
|
|
parentId: currentId.value, |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
if (isResError(res)) return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// markdown 操作 |
|
|
|
|
const curMarkdown = ref() as Ref<ContentType> |
|
|
|
|
|
|
|
|
|
const isShowMdDrawer = ref(false) |
|
|
|
|
async function onOpenMarkdownDrawer(id: number) { |
|
|
|
|
const res = await getMarkdown({ folderId: id }) |
|
|
|
|
if (isResError(res)) return |
|
|
|
|
curMarkdown.value = res?.data |
|
|
|
|
isShowMdDrawer.value = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function onSaveMd(isDraft: 0 | 1, data: string) { |
|
|
|
|
const res = await updateMarkdown({ |
|
|
|
|
content: data, |
|
|
|
|
folderId: currentId.value, |
|
|
|
|
id: curMarkdown.value?.id, |
|
|
|
|
isDraft, |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
if (isResError(res)) return |
|
|
|
|
message.success(isDraft === 1 ? '保存成功' : '发布成功') |
|
|
|
|
isShowMdDrawer.value = false |
|
|
|
|
curMarkdown.value = null as any |
|
|
|
|
loadData(currentId.value) |
|
|
|
|
} |
|
|
|
|
onMounted(() => { |
|
|
|
|
loadData() |
|
|
|
|
}) |
|
|
|
|