|
|
|
@ -1,5 +1,5 @@
|
|
|
|
|
<template>
|
|
|
|
|
<div >
|
|
|
|
|
<div>
|
|
|
|
|
<div class="leftPanel">
|
|
|
|
|
<el-tabs v-model="leftPanelState" class="demo-tabs" type="border-card">
|
|
|
|
|
<el-tab-pane label="图表组件" name="1">
|
|
|
|
@ -264,9 +264,13 @@
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="rightPanel">
|
|
|
|
|
<el-collapse>
|
|
|
|
|
<el-collapse
|
|
|
|
|
v-if="Object.keys(nodeDataForm).length>0 || Object.keys(nodeAttrForm).length>0|| Object.keys(customDataForm).length>0">
|
|
|
|
|
<el-collapse-item title="基础设置" name="1" v-if="Object.keys(nodeDataForm).length>0">
|
|
|
|
|
<el-form :model="nodeDataForm" label-width="auto" style="max-width: 600px">
|
|
|
|
|
<el-form-item label="组件名称">
|
|
|
|
|
<el-input v-model="nodeDataForm.name" style="width: 100%" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="x">
|
|
|
|
|
<el-input-number :precision="0" :step="1" v-model="nodeDataForm.position.x" style="width: 100%"
|
|
|
|
|
@change="updateNode(nodeDataForm.id,nodeDataForm,{ replace: true })" />
|
|
|
|
@ -285,7 +289,7 @@
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-collapse-item>
|
|
|
|
|
<el-collapse-item title="数据配置" name="2" v-if="Object.keys(nodeAttrForm).length>0">
|
|
|
|
|
<el-collapse-item title="组件配置" name="2" v-if="Object.keys(nodeAttrForm).length>0">
|
|
|
|
|
<el-form :model="nodeAttrForm" label-width="auto" style="max-width: 600px">
|
|
|
|
|
<el-form-item label="默认内容" v-if="Object.keys(nodeAttrForm).includes('defaultInputArea')">
|
|
|
|
|
<el-input type="textarea" v-model="nodeAttrForm.defaultInputArea" style="width: 100%" />
|
|
|
|
@ -411,14 +415,60 @@
|
|
|
|
|
<el-form-item label="饼图标签" v-if="Object.keys(nodeAttrForm).includes('label')">
|
|
|
|
|
<el-switch v-model="nodeAttrForm.label" active-text="显示" inactive-text="隐藏" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="表格设置" v-if="Object.keys(nodeAttrForm).includes('tableOptions')">
|
|
|
|
|
<el-form-item label="表格列设置" v-if="Object.keys(nodeAttrForm).includes('tableOptions')">
|
|
|
|
|
<el-button plain @click="tableOptionsVisible = true">
|
|
|
|
|
配置表格
|
|
|
|
|
</el-button>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="表格动画设置" v-if="Object.keys(nodeAttrForm).includes('tableClassOption')">
|
|
|
|
|
<el-button plain @click="tableClassOptionsVisible = true">
|
|
|
|
|
配置动画
|
|
|
|
|
</el-button>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="表头高度" v-if="Object.keys(nodeAttrForm).includes('thHeight')">
|
|
|
|
|
<el-input v-model="nodeAttrForm.thHeight" style="width: 100%" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="行高度" v-if="Object.keys(nodeAttrForm).includes('tdHeight')">
|
|
|
|
|
<el-input v-model="nodeAttrForm.tdHeight" style="width: 100%" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="表头文字颜色" v-if="Object.keys(nodeAttrForm).includes('thColor')">
|
|
|
|
|
<el-color-picker v-model="nodeAttrForm.thColor" show-alpha />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="行文字颜色" v-if="Object.keys(nodeAttrForm).includes('tdColor')">
|
|
|
|
|
<el-badge value="99" class="item" :offset="[-8,0]"
|
|
|
|
|
v-for="(i,k) in nodeAttrForm.tdColor">
|
|
|
|
|
<el-color-picker style="margin-right: 4px;" v-model="nodeAttrForm.tdColor[k]" show-alpha />
|
|
|
|
|
<template #content>
|
|
|
|
|
<div class="custom-content" @click="nodeAttrForm.tdColor.splice(k, 1)">
|
|
|
|
|
<el-icon>
|
|
|
|
|
<Close />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
</el-badge>
|
|
|
|
|
<el-button :icon="Plus" @click="nodeAttrForm.tdColor.push('#fff')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="表头背景颜色" v-if="Object.keys(nodeAttrForm).includes('thBgColor')">
|
|
|
|
|
<el-color-picker v-model="nodeAttrForm.thBgColor" show-alpha />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="行背景颜色" v-if="Object.keys(nodeAttrForm).includes('tdBgColor')">
|
|
|
|
|
<el-badge value="99" class="item" :offset="[-8,0]"
|
|
|
|
|
v-for="(i,k) in nodeAttrForm.tdBgColor">
|
|
|
|
|
<el-color-picker style="margin-right: 8px;"
|
|
|
|
|
v-model="nodeAttrForm.tdBgColor[k]" show-alpha />
|
|
|
|
|
<template #content>
|
|
|
|
|
<div class="custom-content" @click="nodeAttrForm.tdBgColor.splice(k, 1)">
|
|
|
|
|
<el-icon>
|
|
|
|
|
<Close />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
</el-badge>
|
|
|
|
|
<el-button :icon="Plus" @click="nodeAttrForm.tdBgColor.push('#fff')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-collapse-item>
|
|
|
|
|
<el-collapse-item title="自定义配置" name="3" v-if="customDataForm">
|
|
|
|
|
<el-collapse-item title="自定义配置" name="3" v-if="Object.keys(customDataForm||{}).length>0">
|
|
|
|
|
<el-form :model="customDataForm" label-width="auto" style="max-width: 600px">
|
|
|
|
|
<el-form-item label="自定义内容" v-if="Object.keys(customDataForm).includes('option')">
|
|
|
|
|
<el-input type="textarea" v-model="customDataForm.option" style="width: 100%" />
|
|
|
|
@ -434,9 +484,38 @@
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="拓展代码" v-if="Object.keys(customDataForm).includes('script')">
|
|
|
|
|
<el-input type="textarea" v-model="customDataForm.script" style="width: 100%" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-collapse-item>
|
|
|
|
|
</el-collapse>
|
|
|
|
|
<div v-else>
|
|
|
|
|
<div v-for="i in nodes.filter(e=>e.type!=='area').reverse()" class="nodeCard">
|
|
|
|
|
|
|
|
|
|
<div style="display: inline-block;margin-right: 8px;">
|
|
|
|
|
<el-dropdown trigger="click" @command="nodeOperate">
|
|
|
|
|
<span class="el-dropdown-link">
|
|
|
|
|
<el-icon class="settingIcon">
|
|
|
|
|
<Setting />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</span>
|
|
|
|
|
<template #dropdown>
|
|
|
|
|
<el-dropdown-menu>
|
|
|
|
|
<el-dropdown-item :command="{type:'toTop',node:i}">置顶</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item :command="{type:'moveUp',node:i}">上移一层</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item :command="{type:'moveDown',node:i}">下移一层</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item :command="{type:'copy',node:i}">复制</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item :command="{type:'del',node:i}">删除</el-dropdown-item>
|
|
|
|
|
</el-dropdown-menu>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dropdown>
|
|
|
|
|
</div>
|
|
|
|
|
<span class="cardSpan">
|
|
|
|
|
{{ i.name }}
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<el-dialog v-model="pageSettingVisible" title="页面设置" width="500">
|
|
|
|
@ -493,6 +572,28 @@
|
|
|
|
|
<el-input v-model="scope.row.width" style="width: 100%" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="对齐方式">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-select
|
|
|
|
|
v-model="scope.row.align"
|
|
|
|
|
placeholder="请选择"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
label="左对齐"
|
|
|
|
|
value="left"
|
|
|
|
|
/>
|
|
|
|
|
<el-option
|
|
|
|
|
label="居中"
|
|
|
|
|
value="center"
|
|
|
|
|
/>
|
|
|
|
|
<el-option
|
|
|
|
|
label="右对齐"
|
|
|
|
|
value="right"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="类型">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-select
|
|
|
|
@ -524,6 +625,24 @@
|
|
|
|
|
<el-button size="small" :icon="Plus" style="width: 100%" @click="nodeAttrForm.tableOptions.push({})">添加
|
|
|
|
|
</el-button>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
<el-dialog v-model="tableClassOptionsVisible" title="动画设置" width="500">
|
|
|
|
|
<el-form :model="nodeAttrForm.tableClassOption" label-width="auto">
|
|
|
|
|
<el-form-item label="滚动速度">
|
|
|
|
|
<el-input-number :controls="false" v-model="nodeAttrForm.tableClassOption.step" autocomplete="off" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="开启滚动的数据量">
|
|
|
|
|
<el-input-number :controls="false" v-model="nodeAttrForm.tableClassOption.limitMoveNum" autocomplete="off" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="鼠标悬停停止">
|
|
|
|
|
<el-switch v-model="nodeAttrForm.tableClassOption.hoverStop" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<template #footer>
|
|
|
|
|
<div class="dialog-footer">
|
|
|
|
|
<el-button @click="tableClassOptionsVisible = false">关闭</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
@ -552,7 +671,7 @@ import ImgNode from './nodes/form/imgNode.vue';
|
|
|
|
|
import AreaNode from './nodes/other/areaNode.vue';
|
|
|
|
|
import TableNode from './nodes/form/tableNode.vue';
|
|
|
|
|
import ScrollTableNode from './nodes/form/scrollTableNode.vue';
|
|
|
|
|
import tool from './tool';
|
|
|
|
|
import tool, { options } from './tool';
|
|
|
|
|
import { getDataSourceList } from '@/views/boardGenerate/api/dataSource';
|
|
|
|
|
import { editBoardApi, getBoardApi } from '@/views/boardGenerate/api/boardList';
|
|
|
|
|
|
|
|
|
@ -564,7 +683,9 @@ const { onDragStart, onDrop, onDragOver } = tool();
|
|
|
|
|
// flow内置方法
|
|
|
|
|
const {
|
|
|
|
|
addEdges,
|
|
|
|
|
updateNode
|
|
|
|
|
updateNode,
|
|
|
|
|
removeNodes,
|
|
|
|
|
addNodes
|
|
|
|
|
} = useVueFlow();
|
|
|
|
|
|
|
|
|
|
const baseUrl = import.meta.env.VITE_APP_BASE_API;
|
|
|
|
@ -575,6 +696,7 @@ const loading = ref(false)
|
|
|
|
|
const pageSettingVisible = ref(false);
|
|
|
|
|
const pageSettingForm = ref({});
|
|
|
|
|
const tableOptionsVisible = ref(false);
|
|
|
|
|
const tableClassOptionsVisible = ref(false);
|
|
|
|
|
const pageTitle = ref('页面名称');
|
|
|
|
|
const leftPanelState = ref('1');
|
|
|
|
|
const pageData = ref({});
|
|
|
|
@ -703,7 +825,6 @@ const logEvent = async (eventname, event) => {
|
|
|
|
|
nodeAttrForm.value = event.node.data.options;
|
|
|
|
|
nodeDataForm.value = event.node;
|
|
|
|
|
customDataForm.value = event.node.data.customData;
|
|
|
|
|
console.log(event.node.data);
|
|
|
|
|
break;
|
|
|
|
|
case 'nodeDrag':
|
|
|
|
|
console.log(event.nodes);
|
|
|
|
@ -754,7 +875,7 @@ const pageSetting = () => {
|
|
|
|
|
pageSettingForm.value = pageData.value;
|
|
|
|
|
};
|
|
|
|
|
const save = () => {
|
|
|
|
|
|
|
|
|
|
loading.value = true;
|
|
|
|
|
editBoardApi({
|
|
|
|
|
...boardData.value,
|
|
|
|
|
customContent: JSON.stringify(pageSettingForm.value),
|
|
|
|
@ -806,7 +927,10 @@ const save = () => {
|
|
|
|
|
type: 'success',
|
|
|
|
|
message: '保存成功'
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
.finally(() => {
|
|
|
|
|
loading.value = false;
|
|
|
|
|
})
|
|
|
|
|
// localStorage.setItem('NODES', JSON.stringify(nodes.value.map(e => {
|
|
|
|
|
// let data = {};
|
|
|
|
|
// let savaField = ['customData', 'options'];
|
|
|
|
@ -882,8 +1006,47 @@ const setPageData = () => {
|
|
|
|
|
// localStorage.setItem('PAGEDATA', JSON.stringify(pageData.value));
|
|
|
|
|
pageSettingVisible.value = false;
|
|
|
|
|
};
|
|
|
|
|
const asd = () => {
|
|
|
|
|
console.log(12312);
|
|
|
|
|
};
|
|
|
|
|
const nodeOperate = (data) => {
|
|
|
|
|
let type = data.type;
|
|
|
|
|
const index = nodes.value.indexOf(data.node);
|
|
|
|
|
let arr = JSON.parse(JSON.stringify(nodes.value));
|
|
|
|
|
const item = arr[index];
|
|
|
|
|
switch (type) {
|
|
|
|
|
case 'toTop':
|
|
|
|
|
nodes.value = [...nodes.value.filter(e => e.id !== data.node.id), data.node];
|
|
|
|
|
break;
|
|
|
|
|
case 'moveUp':
|
|
|
|
|
arr.splice(index, 1);
|
|
|
|
|
arr.splice(index + 1, 0, item);
|
|
|
|
|
nodes.value = arr;
|
|
|
|
|
break;
|
|
|
|
|
case 'moveDown':
|
|
|
|
|
arr.splice(index, 1);
|
|
|
|
|
arr.splice(index - 1, 0, item);
|
|
|
|
|
nodes.value = arr;
|
|
|
|
|
break;
|
|
|
|
|
case 'copy':
|
|
|
|
|
item.id = options.getId(item.type);
|
|
|
|
|
console.log(item);
|
|
|
|
|
addNodes(item);
|
|
|
|
|
break;
|
|
|
|
|
case 'del':
|
|
|
|
|
removeNodes([data.node.id]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
|
|
|
|
|
.custom-content {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
gap: 4px;
|
|
|
|
|
}
|
|
|
|
|
:deep(.vue-flow__node-area) {
|
|
|
|
|
z-index: -1 !important;
|
|
|
|
|
pointer-events: none !important;
|
|
|
|
@ -994,6 +1157,53 @@ const setPageData = () => {
|
|
|
|
|
width: 384px;
|
|
|
|
|
height: 216px
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.nodeCard {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 50px;
|
|
|
|
|
padding: 0 12px;
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
transition: all 0.3s ease;
|
|
|
|
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
|
background-color: #f0f7ff;
|
|
|
|
|
box-shadow: 0 -4px 8px -4px rgba(0, 0, 0, 0.08),
|
|
|
|
|
0 4px 8px -4px rgba(0, 0, 0, 0.08);
|
|
|
|
|
|
|
|
|
|
.settingIcon {
|
|
|
|
|
color: #409EFF;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.cardSpan {
|
|
|
|
|
flex: 1;
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
color: #333;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
padding-left: 8px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.settingIcon {
|
|
|
|
|
font-size: 18px;
|
|
|
|
|
color: #888;
|
|
|
|
|
transition: color 0.3s ease;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.el-dropdown-link {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
height: 100%;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</style>
|
|
|
|
|
|
|
|
|
|
<style>
|
|
|
|
|