文档管理
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

290 lines
7.3 KiB

7 months ago
<template>
<div class="firmware-management-wrap">
<EdfsWrap class="firmware-table" :customLeft="true">
<template #title-left>
<el-breadcrumb :separator-icon="ArrowRight">
<template v-for="(item, index) in breadcrumbList" :key="index">
<el-breadcrumb-item
:class="{ active: index + 1 < breadcrumbList.length }"
@click="onCrumb"
>{{ item.name }}</el-breadcrumb-item
>
</template>
</el-breadcrumb>
</template>
<EdfsContextMenu
eventSourceClass="SourceClass"
:disabledEmpty="false"
@visibleChange="onVisibleChange"
ref="contextMenuRef"
>
<div class="file-list">
<div v-for="item in dataList" :key="item.id" @click="onFileOpen(item)">
<div class="item SourceClass" v-setItem="item">
<div class="file-header">
<div></div>
<Icon
class="icon"
icon="solar:hamburger-menu-outline"
@click="onFile"
></Icon>
</div>
<div class="file-icon">
<img :src="item.type === 'folder' ? Folder : Document" />
</div>
<div class="file-name">
<el-input
class="edit-input"
@click.stop="() => {}"
v-show="item?.isEdit"
v-model="editFileName"
:ref="el => setInputRefs(el, item.id)"
@blur="onSaveRename(item)"
/>
<span v-show="!item?.isEdit">{{ item.name }}</span>
</div>
</div>
</div>
</div>
<template #menu="{ menuData }">
<div
v-for="menu in dropdownMenu"
:key="menu.command"
@click="onCommand(menu.command, menuData)"
>
<img
v-if="menu?.icon"
:src="menu?.icon"
width="20"
style="margin-right: 8px"
/>
<span :style="{ color: menu.command === 'delete' ? 'red' : 'inherit' }">{{
menu.label
}}</span>
</div>
</template>
</EdfsContextMenu>
</EdfsWrap>
</div>
</template>
<script setup lang="ts">
import EdfsWrap from '@/components/dashboard/Edfs-wrap.vue'
import { deleteFirmware, getFirmwareList } from '@/api/module/eam/device/firmware'
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 },
]
const dropdownMenu = computed(() => {
return menuTarget.value ? fileDropdownMenu : operationDropdownMenu
})
const message = useMessage()
const dataList = ref<any>(ListJson)
async function loadData() {}
async function onDelete(id: string) {
try {
await message.delConfirm()
const res = await deleteFirmware(id)
if (isResError(res)) return
message.success('删除成功')
loadData()
} catch (error) {}
}
const contextMenuRef = ref<any>(null)
function onFile(e: any) {
contextMenuRef.value.onContextmenu(e)
}
function onNewFolder() {
const folder = {
id: dataList.value.length + 1,
name: '新建文件夹',
type: 'folder',
isEdit: true,
}
dataList.value.push(folder)
onRename(folder)
}
function onNewMarkdown() {
const markdown = {
id: dataList.value.length + 1,
name: '新建文档',
type: 'markdown',
isEdit: true,
}
dataList.value.push(markdown)
onRename(markdown)
}
function onCommand(command: string, item: any) {
switch (command) {
case 'delete':
// onDelete()
break
case 'rename':
onRename(item)
break
case 'open':
onFileOpen(item)
break
case 'newFolder':
onNewFolder()
break
case 'newMarkdown':
onNewMarkdown()
break
case 'upload':
break
}
}
const menuTarget = ref<HTMLElement | null>(null)
function onVisibleChange(visible: boolean, currentElement: HTMLElement | null) {
menuTarget.value = currentElement
}
function onCrumb() {}
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 === 'markdown') {
console.log('open markdown')
}
}
const editInputRefs = ref<any>({})
function setInputRefs(el: any, id: number) {
if (el) {
editInputRefs.value[`editInputRef_${id}`] = el
}
}
const editFileName = ref('')
function onSaveRename(item: any) {
item.isEdit = false
editFileName.value = ''
}
async function onRename(item: any) {
if (!item) return
item.isEdit = true
editFileName.value = item.name
await nextTick()
editInputRefs.value[`editInputRef_${item.id}`].focus()
editInputRefs.value[`editInputRef_${item.id}`].select()
}
onMounted(() => {
loadData()
})
</script>
<style scoped lang="scss">
.firmware-management-wrap {
width: 100%;
height: 100%;
:deep(.el-breadcrumb) {
margin-left: 4px;
}
.active {
:deep(.el-breadcrumb__inner) {
color: var(--el-color-primary);
font-weight: 800;
cursor: pointer;
}
}
.file-list {
user-select: none;
display: flex;
flex-wrap: wrap;
gap: 20px;
.item {
width: 90px;
height: 110px;
display: flex;
cursor: pointer;
align-items: center;
flex-direction: column;
justify-content: center;
border-radius: 3px;
padding-bottom: 4px;
.file-header {
visibility: hidden;
width: 100%;
height: calc(100% - 66px - 24px);
display: flex;
align-items: center;
padding: 0 8px;
box-sizing: border-box;
justify-content: space-between;
.icon {
flex-direction: end;
color: var(--icon-color);
:hover {
color: var(--icon-hover-color);
}
}
}
.file-icon {
width: 66px;
height: 66px;
img {
width: 100%;
height: 100%;
}
}
.file-name {
height: 24px;
line-height: 24px;
font-size: 14px;
color: var(--label-color);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
text-align: center;
.edit-input {
width: 100%;
height: 100%;
margin-bottom: 4px;
}
}
&:hover {
background-color: var(--mask-bg);
.file-header {
visibility: visible;
}
}
}
}
}
</style>