Files
FiDA_Front/src/views/home/agent/components/versionTree/index.vue

253 lines
6.0 KiB
Vue
Raw Normal View History

2026-02-03 11:24:47 +08:00
<script setup lang="ts">
import { ref, onMounted, onUnmounted, reactive, toRefs, watch } from 'vue'
2026-02-03 11:24:47 +08:00
import Tree from './tree/index.vue'
2026-02-05 10:43:18 +08:00
import Detail from './detail/index.vue'
// import { versionsList } from './tools/versionsData'
2026-02-25 10:14:10 +08:00
import { findAndAddChild, findAndRemoveChild } from '../../../../../utils/treeDiagram'
import { useProjectStore } from '@/stores'
2026-02-26 10:19:51 +08:00
import { versionTree } from '@/api/versitonTree'
2026-02-09 14:47:58 +08:00
2026-02-03 11:24:47 +08:00
const props = defineProps({
2026-02-10 13:05:24 +08:00
versionTreeData: {
type: Object,
default: () => {
2026-02-03 11:24:47 +08:00
return {
2026-02-10 13:05:24 +08:00
drawer: false,
// list: []
2026-02-03 11:24:47 +08:00
}
2026-02-10 13:05:24 +08:00
}
}
2026-02-03 11:24:47 +08:00
})
2026-02-26 16:48:08 +08:00
const emit = defineEmits([
2026-02-27 16:24:01 +08:00
'restore','update:versionTreeData'
2026-02-26 16:48:08 +08:00
])
2026-02-03 11:24:47 +08:00
const versionsList = ref([])
const projectStore = useProjectStore()
2026-02-26 10:19:51 +08:00
let oldProjectId:any = ''
2026-02-25 15:12:04 +08:00
watch(()=>props.versionTreeData?.drawer, (newVal, oldVal) => {
2026-02-26 10:19:51 +08:00
console.log(newVal,oldProjectId,projectStore.state.id)
if(newVal && oldProjectId !== projectStore.state.id && projectStore.state.id){
getVersionTree()
oldProjectId = JSON.parse(JSON.stringify(projectStore.state.id))
}
})
2026-02-26 10:19:51 +08:00
const getVersionTree = ()=>{
versionTree({
projectId: projectStore.state.id
}).then(res => {
setVersionsList([res])
})
}
const setVersionsList = (res)=>{
//设置versionId
function traverseArray(items,father, callback) {
for (let i = 0; i < items.length; i++) {
const item = items[i]
2026-02-26 16:51:10 +08:00
// if(!item?.url)continue
callback(item, i,father)
if (item.children && Array.isArray(item.children) && item.children.length > 0) {
traverseArray(item.children, item, callback)
}
}
}
2026-02-26 10:19:51 +08:00
traverseArray(res,'',(item,i,father)=>{
item.versionId = father?`${father.versionId}-${i+1}`:'1'
})
2026-02-26 10:19:51 +08:00
versionsList.value = res
}
2026-02-09 14:47:58 +08:00
const treeRef = ref(null)
const treeKey = ref(0)
2026-02-04 10:09:24 +08:00
const treeState = ref(true)//
2026-02-03 11:24:47 +08:00
2026-02-09 14:47:58 +08:00
const selectItem:any = ref({})
2026-02-05 10:43:18 +08:00
2026-02-09 14:47:58 +08:00
const openTree = (state)=>{
treeState.value = state
}
2026-02-26 16:48:08 +08:00
const versionRestore = () => {
2026-02-09 14:47:58 +08:00
let id = ''
if(selectItem.value?.children?.length > 0){
2026-02-09 14:47:58 +08:00
function findMaxForYourFormat(items) {
let max = 0
for (const item of items) {
// 直接分割并取最后一部分
const parts = item?.versionId.split('-')
2026-02-09 14:47:58 +08:00
const lastNumber = parseInt(parts[parts.length - 1], 10)
if (lastNumber > max) {
max = lastNumber
}
}
return max
}
id = `${selectItem.value?.versionId}-${findMaxForYourFormat(selectItem.value?.children) + 1}`
2026-02-09 14:47:58 +08:00
}else{
id = `${selectItem.value?.versionId}-1`
2026-02-09 14:47:58 +08:00
}
let addObj = {
id,
name:`V${id}`
}
findAndAddChild(versionsList.value, selectItem.value?.versionId, addObj)
2026-02-09 14:47:58 +08:00
selectItem.value = {...addObj}
treeKey.value++
2026-02-26 16:48:08 +08:00
emit('restore')
2026-02-27 16:24:01 +08:00
emit('update:versionTreeData', {...props.versionTreeData, drawer: false})
2026-02-09 14:47:58 +08:00
}
const versionDelete = (versionDetail)=>{
if(!selectItem.value?.versionId)return
findAndRemoveChild(versionsList.value, selectItem.value?.versionId)
2026-02-09 14:47:58 +08:00
treeKey.value++
2026-02-03 11:24:47 +08:00
}
2026-02-10 13:05:24 +08:00
let data = reactive({})
2026-02-25 15:12:04 +08:00
// onMounted(() => {setVersionsList('')})
2026-02-10 13:05:24 +08:00
onUnmounted(() => {})
2026-02-26 10:19:51 +08:00
defineExpose({getVersionTree})
2026-02-10 13:05:24 +08:00
const {} = toRefs(data)
2026-02-03 11:24:47 +08:00
</script>
<template>
<div class="versionTree">
2026-02-10 13:05:24 +08:00
<el-drawer
v-model="versionTreeData.drawer"
2026-02-03 11:24:47 +08:00
:close-on-press-escape="false"
:close-on-click-modal="false"
2026-02-10 13:05:24 +08:00
:size="treeState ? '109rem' : '49rem'"
2026-02-03 11:24:47 +08:00
body-class="versionTreeBody"
2026-02-10 13:05:24 +08:00
:with-header="false"
>
2026-02-03 11:24:47 +08:00
<div class="versionTreeTitle">
<span>Version Tree: Retro Sofa Sketch</span>
<div class="closeBtn" @click="versionTreeData.drawer = false">
<div class="closeIcon">
<SvgIcon name="close" />
</div>
</div>
</div>
2026-02-27 16:24:01 +08:00
<div class="expandBtnBox" v-if="versionsList.length > 0">
2026-02-23 10:54:17 +08:00
<div class="btn" @click="openTree(true)">
<div class="versionExport">
<SvgIcon name="versionExport" size="17" color="rgba(0, 0, 0, 0.6)" />
</div>
<span>{{ $t('VersionTree.export') }}</span>
</div>
</div>
<!-- <div class="expandBtnBox">
2026-02-09 14:47:58 +08:00
<div class="btn" @click="openTree(true)">
<div class="bg left" :class="{'active':treeState}"></div>
<span>{{ $t('VersionTree.linearNodeTree') }}</span>
</div>
<div class="btn" @click="openTree(false)">
<div class="bg right" :class="{'active':!treeState}"></div>
<span>{{ $t('VersionTree.branchingNodeTree') }}</span>
</div>
</div> -->
2026-02-27 16:24:01 +08:00
<div class="versionTreeBox" v-if="versionsList.length > 0">
2026-02-03 11:24:47 +08:00
<div class="tree">
2026-02-09 14:47:58 +08:00
<Tree
2026-02-26 10:19:51 +08:00
v-if="versionsList.length > 0"
2026-02-09 14:47:58 +08:00
ref="treeRef"
:versionsList="versionsList"
:treeState="treeState"
v-model:selectItem="selectItem"
@versionRestore="versionRestore"
@versionDelete="versionDelete"
2026-02-09 14:47:58 +08:00
:key="treeKey"
></Tree>
2026-02-03 11:24:47 +08:00
</div>
<div class="detail">
2026-02-09 14:47:58 +08:00
<Detail
v-model:selectItem="selectItem"
></Detail>
2026-02-03 11:24:47 +08:00
</div>
</div>
</el-drawer>
</div>
</template>
<style lang="less" scoped>
.versionTree{
--border-radius: 1rem;
2026-02-04 10:09:24 +08:00
--treeItem-width: 5.4rem;
--treeItem-height: 5.4rem;
--treeItem-raduis: 50%;
2026-02-09 14:47:58 +08:00
--treeItem-border: 2px solid #C1C1C1;
2026-02-04 10:09:24 +08:00
--treeItem-background: #ffffff;
--treeItem-active-background: #e6e6e6;
2026-02-10 13:05:24 +08:00
:deep(.versionTreeBody) {
--el-drawer-padding-primary: 0rem;
display: flex;
flex-direction: column;
}
2026-02-23 10:54:17 +08:00
.versionTreeTitle{
2026-02-10 13:05:24 +08:00
width: 100%;
height: 8rem;
display: flex;
align-items: center;
justify-content: space-between;
2026-02-23 10:54:17 +08:00
padding: 0 .8rem 0 2.4rem;
border-bottom: 1px solid #C9C9C9;
> span{
2026-02-10 13:05:24 +08:00
font-size: 2rem;
font-weight: 600;
font-family: 'SemiBold';
2026-02-03 11:24:47 +08:00
}
2026-02-23 10:54:17 +08:00
> .closeBtn{
width: 2.4rem;
height: 2.4rem;
cursor: pointer;
2026-02-03 11:24:47 +08:00
}
2026-02-23 10:54:17 +08:00
}
.expandBtnBox{
margin-left: auto;
margin-top: 2.2rem;
margin-right: 3rem;
> .btn{
padding: .6rem 1.8rem;
cursor: pointer;
2026-02-03 11:24:47 +08:00
display: flex;
2026-02-23 10:54:17 +08:00
align-items: center;
justify-content: center;
border-radius: 8px;
border: 1.5px solid #D9D9D9;
color: rgba(0, 0, 0, 0.6);
> .versionExport{
margin-right: .6rem;
2026-02-03 11:24:47 +08:00
}
2026-02-23 10:54:17 +08:00
> span{
font-weight: 500;
font-size: 1.4rem;
letter-spacing: Letter Spacing;
2026-02-03 11:24:47 +08:00
}
2026-02-05 10:43:18 +08:00
}
2026-02-10 13:05:24 +08:00
}
.versionTreeBox {
flex: 1;
display: flex;
overflow: hidden;
> .tree {
2026-02-03 11:24:47 +08:00
flex: 1;
2026-02-10 13:05:24 +08:00
height: 100%;
overflow: hidden;
2026-02-23 10:54:17 +08:00
padding: 2.5rem 0 5.4rem 2.2rem;
2026-02-10 13:05:24 +08:00
}
> .detail {
width: 35rem;
2026-02-23 10:54:17 +08:00
margin: 2.5rem 3rem 5.4rem 3.4rem;
2026-02-10 13:05:24 +08:00
height: calc(100% - 2.1rem - 5.4rem);
2026-02-03 11:24:47 +08:00
overflow: hidden;
}
}
2026-02-10 13:05:24 +08:00
}
</style>