Skip to content

Commit e5ae9b5

Browse files
committed
refactor: canvas save
1 parent c834641 commit e5ae9b5

File tree

11 files changed

+161
-54
lines changed

11 files changed

+161
-54
lines changed

backend/apps/dashboard/api/dashboard_api.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from apps.dashboard.crud.dashboard_service import get_dashboard_list, preview_with_id, \
55
create_resource, create_canvas
6-
from apps.dashboard.models.dashboard_model import CreateDashboard
6+
from apps.dashboard.models.dashboard_model import CreateDashboard,BaseDashboard
77
from common.core.deps import SessionDep, CurrentUser
88

99
router = APIRouter(tags=["dashboard"], prefix="/dashboard")
@@ -16,18 +16,18 @@ async def datasource_list(session: SessionDep):
1616
async def preview_dashboard(session: SessionDep,id:str):
1717
return preview_with_id(session=session,dashboard_id=id)
1818

19-
@router.post("/add", response_model=CreateDashboard)
19+
@router.post("/add", response_model=BaseDashboard)
2020
async def add(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
2121
return create_resource(session, user, dashboard)
2222

23-
@router.post("/update", response_model=CreateDashboard)
23+
@router.post("/update", response_model=BaseDashboard)
2424
async def update(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
2525
return create_resource(session, user, dashboard)
2626

27-
@router.post("/add_dashboard", response_model=CreateDashboard)
28-
async def add_dashboard(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
27+
@router.post("/add_canvas", response_model=BaseDashboard)
28+
async def add_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
2929
return create_canvas(session, user, dashboard)
3030

31-
@router.post("/update_dashboard", response_model=CreateDashboard)
31+
@router.post("/update_canvas", response_model=BaseDashboard)
3232
async def update(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
3333
return

backend/apps/dashboard/crud/dashboard_service.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ def create_resource(session: SessionDep, user: CurrentUser, dashboard: CreateDas
2727
session.commit()
2828
return record
2929

30-
31-
3230
def update_resource(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
3331
record = session.query(CoreDashboard).filter(CoreDashboard.id == dashboard.id).first()
3432
record.name = dashboard.name
@@ -44,6 +42,7 @@ def create_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDashb
4442
record.canvas_style_data = dashboard.canvas_style_data
4543
session.add(record)
4644
session.flush()
45+
return record
4746

4847
def update_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
4948
record = session.query(CoreDashboard).filter(CoreDashboard.id == dashboard.id).first()

backend/apps/dashboard/models/dashboard_model.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,19 @@ class DashboardBaseResponse(BaseModel):
131131
create_time: Optional[int] = None
132132
update_time: Optional[int] = None
133133

134-
# dashboard create obj
135-
class CreateDashboard(BaseModel):
134+
class BaseDashboard(BaseModel):
136135
id: str = ''
137136
name: str = ''
138137
pid: str = ''
139138
workspace_id: str = ''
140139
org_id: str = ''
141-
description: str = ''
142140
type: str = ''
143141
node_type: str = ''
142+
create_by: int = 0
143+
144+
145+
# dashboard create obj
146+
class CreateDashboard(BaseDashboard):
144147
canvas_style_data: str =''
145148
component_data: str = ''
146-
configuration: str = ''
147-
create_by: int = 0
149+
description: str = ''

frontend/src/api/dashboard.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ export const dashboardApi = {
77
moveResource: (data: any) => request.post('/dashboard/move',data),
88
addResource: (data: any) => request.post('/dashboard/add',data),
99
updateResource: (data: any) => request.post('/dashboard/update',data),
10-
saveCanvas: (data: any) => request.post('/dashboard/save_canvas',data),
11-
updateCanvas: (data: any) => request.post('/dashboard/update_canvas',data)
10+
saveCanvas: (data: any) => request.post('/dashboard/add_canvas',data),
11+
updateCanvas: (data: any) => request.post('/dashboard/update_',data)
1212
}

frontend/src/stores/dashboard/dashboard.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const dashboardStore = defineStore('dashboard', {
1717
pid: null,
1818
workspaceId: null,
1919
status: null,
20+
dataState: null,
2021
type: null,
2122
creatorName: null,
2223
updateName: null,
@@ -51,7 +52,13 @@ export const dashboardStore = defineStore('dashboard', {
5152
setTabMoveInActiveId(tabId: any) {
5253
this.tabMoveInActiveId = tabId
5354
},
54-
canvasDataInit(){
55+
updateDashboardInfo(params: any) {
56+
Object.keys(params).forEach((key: string) => {
57+
// @ts-ignore
58+
this.dashboardInfo[key] = params[key]
59+
})
60+
},
61+
canvasDataInit() {
5562

5663
}
5764

frontend/src/views/dashboard/canvas/CanvasCore.vue

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ const props = defineProps({
2323
type: Object as PropType<CanvasItem>,
2424
required: false
2525
},
26+
dashboardInfo: {
27+
type: Object,
28+
required: false
29+
},
30+
canvasStyleData: {
31+
type: Object,
32+
required: false
33+
},
2634
canvasComponentData: {
2735
type: Array as PropType<CanvasItem[]>,
2836
required: true

frontend/src/views/dashboard/common/ResourceGroupOpt.vue

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
import folder from '@/assets/svg/folder.svg'
33
import {type SQTreeNode} from '@/views/dashboard/utils/treeNode'
44
import {ref, reactive, computed} from 'vue'
5-
import {dashboardApi} from "@/api/dashboard.ts";
6-
5+
import {saveDashboardResource} from "@/views/dashboard/utils/canvasUtils.ts";
6+
const emits = defineEmits(['finish'])
77
const state = reactive({
8-
placeholder:'',
9-
showParentSelected: false,
8+
opt: null,
9+
placeholder: '',
10+
nodeType: 'folder',
11+
parentSelect: false,
1012
resourceFormNameLabel: 'Name',
1113
dialogTitle: '',
1214
tData: [],
@@ -17,8 +19,8 @@ const state = reactive({
1719
1820
let tData: any = []
1921
20-
const getTitle = (cmd: string) => {
21-
switch (cmd) {
22+
const getTitle = (opt: string) => {
23+
switch (opt) {
2224
case 'newLeaf':
2325
return 'New Dashboard'
2426
case 'newFolder':
@@ -28,8 +30,8 @@ const getTitle = (cmd: string) => {
2830
}
2931
}
3032
31-
const getResourceNewName = (cmd: string) => {
32-
switch (cmd) {
33+
const getResourceNewName = (opt: string) => {
34+
switch (opt) {
3335
case 'newLeaf':
3436
return 'New Dashboard'
3537
case 'newFolder':
@@ -41,19 +43,21 @@ const getResourceNewName = (cmd: string) => {
4143
4244
const optInit = (params: any) => {
4345
// @ts-ignore
44-
state.dialogTitle = getTitle(params.cmd)
45-
state.showParentSelected = params.parentSelect
46+
state.dialogTitle = getTitle(params.opt)
47+
state.opt = params.opt
48+
state.parentSelect = params.parentSelect
4649
state.targetInfo = params.data
50+
state.nodeType = params.nodeType || 'folder'
4751
resourceDialogShow.value = true
48-
// @ts-ignore
49-
resourceForm.name = getResourceNewName(params.cmd)
52+
// @ts-ignore
53+
resourceForm.name = params.name || getResourceNewName(params.opt)
5054
}
5155
5256
const resourceDialogShow = ref(false)
5357
const loading = ref(false)
5458
const pid = ref()
5559
const id = ref()
56-
const cmd = ref('')
60+
const opt = ref('')
5761
const resourceForm = reactive({
5862
pid: '',
5963
pName: '',
@@ -105,38 +109,40 @@ const editeInit = (param: SQTreeNode) => {
105109
const propsTree = {
106110
label: 'name',
107111
children: 'children',
108-
// @ts-ignore
112+
// @ts-ignore
109113
isLeaf: node => !node.children?.length
110114
}
111115
112116
const showPid = computed(() => {
113-
return ['newLeaf', 'copy', 'newLeafAfter'].includes(cmd.value) && state.showParentSelected
117+
return ['newLeaf'].includes(opt.value) && state.parentSelect
114118
})
115119
116120
const saveResource = () => {
117-
const params = {
118-
nodeType: 'folder',
119-
name: resourceForm.name,
120-
type: 'dashboard'
121-
}
122-
// @ts-ignore
123-
dashboardApi.addResource(params).then(res => {
124-
ElMessage({
125-
type: 'success',
126-
message: 'Save Success',
127-
})
128-
129-
resetForm()
121+
const params = {
122+
nodeType: state.nodeType,
123+
name: resourceForm.name,
124+
opt: state.opt,
125+
type: 'dashboard'
126+
}
127+
saveDashboardResource(params, function (rsp:any) {
128+
ElMessage({
129+
type: 'success',
130+
message: 'Save Success',
130131
})
132+
if (state.opt === 'newLeaf') {
133+
emits('finish', {opt: state.opt, resourceId: rsp.id})
134+
}
135+
resetForm()
136+
})
131137
}
132138
133139
const nodeClick = (data: SQTreeNode) => {
134140
resourceForm.pid = data.id as string
135141
resourceForm.pName = data.name as string
136142
}
137143
138-
const filterMethod = (value:any) => {
139-
// @ts-ignore
144+
const filterMethod = (value: any) => {
145+
// @ts-ignore
140146
state.tData = [...tData].filter(item => item.name.includes(value))
141147
}
142148
@@ -145,7 +151,6 @@ defineExpose({
145151
editeInit
146152
})
147153
148-
const emits = defineEmits(['finish'])
149154
</script>
150155

151156
<template>

frontend/src/views/dashboard/editor/DashboardEditor.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ const props = defineProps({
2020
type: Object as PropType<CanvasItem>,
2121
required: false
2222
},
23+
dashboardInfo: {
24+
type: Object,
25+
required: false
26+
},
27+
canvasStyleData: {
28+
type: Object,
29+
required: false
30+
},
2331
canvasComponentData: {
2432
type: Array as PropType<CanvasItem[]>,
2533
required: true
@@ -98,6 +106,8 @@ const emits = defineEmits(["parentAddItemBox"]);
98106
:base-margin-left="baseMarginLeft"
99107
:base-margin-top="baseMarginTop"
100108
:canvas-component-data="canvasComponentData"
109+
:canvas-style-data="canvasStyleData"
110+
:dashboard-info="dashboardInfo"
101111
:parent-config-item="parentConfigItem"
102112
:canvas-id="canvasId"
103113
@parentAddItemBox=" item => emits('parentAddItemBox',item)"

frontend/src/views/dashboard/editor/Toolbar.vue

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import dvText from '@/assets/svg/dv-text.svg'
88
import dvView from '@/assets/svg/dv-view.svg'
99
import ResourceGroupOpt from "@/views/dashboard/common/ResourceGroupOpt.vue";
1010
import {ref} from 'vue'
11+
1112
const dashboardStore = dashboardStoreWithOut()
1213
const {dashboardInfo} = storeToRefs(dashboardStore)
1314
const emits = defineEmits(['addComponent'])
@@ -16,8 +17,31 @@ const openViewDialog = () => {
1617
// do addComponent
1718
}
1819
19-
const saveCanvasWithCheck = () =>{
20+
const saveCanvasWithCheck = () => {
21+
if (dashboardInfo.value.dataState === 'prepare') {
22+
const createParams = {
23+
name: dashboardInfo.value.name,
24+
pid: props.baseParams?.pid,
25+
opt: 'newLeaf',
26+
nodeType: 'leaf',
27+
parentSelect: true
28+
}
29+
// @ts-ignore
30+
resourceGroupOptRef.value?.optInit(createParams)
31+
}
32+
}
33+
34+
const props = defineProps({
35+
baseParams: {
36+
type: Object,
37+
required: false,
38+
}
39+
})
2040
41+
const groupOptFinish = (result: any) => {
42+
let url = window.location.href
43+
url = url.replace(/(#\/[^?]*)(?:\?[^#]*)?/, `$1?dvId=${result.id}`)
44+
window.history.replaceState( { path: url }, '', url )
2145
}
2246
</script>
2347

@@ -52,14 +76,14 @@ const saveCanvasWithCheck = () =>{
5276
</component-button-label>
5377
</div>
5478
<div class="right-toolbar">
55-
<el-button @click="saveCanvasWithCheck()"
56-
style="float: right; margin-right: 12px"
57-
type="primary"
79+
<el-button @click="saveCanvasWithCheck()"
80+
style="float: right; margin-right: 12px"
81+
type="primary"
5882
>
5983
Save
6084
</el-button>
6185
</div>
62-
<ResourceGroupOpt ref="resourceGroupOptRef"></ResourceGroupOpt>
86+
<ResourceGroupOpt @finish="groupOptFinish " ref="resourceGroupOptRef"></ResourceGroupOpt>
6387
</div>
6488
</template>
6589

@@ -78,6 +102,7 @@ const saveCanvasWithCheck = () =>{
78102
left: 50%;
79103
transform: translateX(-50%);
80104
}
105+
81106
.right-toolbar {
82107
display: flex;
83108
position: absolute;

0 commit comments

Comments
 (0)