diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java
index 00ed8e5e45..b9b1f88c46 100644
--- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java
+++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java
@@ -103,7 +103,19 @@ public class PanelGroupService {
newDefaultPanel.setCreateBy(AuthUtils.getUser().getUsername());
checkPanelName(newDefaultPanel.getName(), newDefaultPanel.getPid(), PanelConstants.OPT_TYPE_INSERT, newDefaultPanel.getId());
panelGroupMapper.insertSelective(newDefaultPanel);
- } else {
+ } else if ("copy".equals(request.getOptType())) {
+ panelId = UUID.randomUUID().toString();
+ // 复制模板
+ PanelGroupWithBLOBs newPanel = panelGroupMapper.selectByPrimaryKey(request.getId());
+ // 插入校验
+ if (StringUtils.isNotEmpty(request.getName())) {
+ checkPanelName(request.getName(), newPanel.getPid(), PanelConstants.OPT_TYPE_INSERT, request.getId());
+ }
+ newPanel.setName(request.getName());
+ newPanel.setId(panelId);
+ newPanel.setCreateBy(AuthUtils.getUser().getUsername());
+ panelGroupMapper.insertSelective(newPanel);
+ }else {
// 更新
if (StringUtils.isNotEmpty(request.getName())) {
checkPanelName(request.getName(), request.getPid(), PanelConstants.OPT_TYPE_UPDATE, request.getId());
diff --git a/frontend/src/views/panel/list/PanelList.vue b/frontend/src/views/panel/list/PanelList.vue
index 6f69d67cde..8d7ef8482b 100644
--- a/frontend/src/views/panel/list/PanelList.vue
+++ b/frontend/src/views/panel/list/PanelList.vue
@@ -109,6 +109,9 @@
{{ $t('panel.share') }}
+
+ {{ $t('panel.copy') }}
+
{{ $t('panel.create_public_links') }}
@@ -306,11 +309,16 @@ export default {
this.lastActiveNodeData.name = panelInfo.name
return
}
- if (!this.lastActiveNodeData.children) {
- this.$set(this.lastActiveNodeData, 'children', [])
+ // 复制后的仪表板 放在父节点下面
+ if (this.editPanel.optType === 'copy') {
+ this.lastActiveNode.parent.data.children.push(panelInfo)
+ } else {
+ if (!this.lastActiveNodeData.children) {
+ this.$set(this.lastActiveNodeData, 'children', [])
+ }
+ this.lastActiveNodeData.children.push(panelInfo)
+ this.lastActiveNode.expanded = true
}
- this.lastActiveNodeData.children.push(panelInfo)
- this.lastActiveNode.expanded = true
this.activeNodeAndClick(panelInfo)
} else {
this.tree(this.groupForm)
@@ -367,6 +375,18 @@ export default {
}
}
break
+ case 'copy':
+ this.editPanel = {
+ visible: true,
+ titlePre: this.$t('panel.copy'),
+ optType: 'copy',
+ panelInfo: {
+ id: param.data.id,
+ name: param.data.name,
+ optType: 'copy'
+ }
+ }
+ break
}
switch (param.type) {
case 'folder':
@@ -388,6 +408,7 @@ export default {
clickMore(param) {
switch (param.optType) {
+ case 'copy':
case 'toDefaultPanel':
case 'rename':
this.showEditPanel(param)