Skip to content

Commit 8fd76c4

Browse files
committed
refactor: new resource
1 parent e5ae9b5 commit 8fd76c4

File tree

8 files changed

+92
-52
lines changed

8 files changed

+92
-52
lines changed

backend/apps/dashboard/api/dashboard_api.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1+
from xmlrpc.client import Boolean
12

23
from fastapi import APIRouter, File, UploadFile, HTTPException
34

45
from apps.dashboard.crud.dashboard_service import get_dashboard_list, preview_with_id, \
5-
create_resource, create_canvas
6-
from apps.dashboard.models.dashboard_model import CreateDashboard,BaseDashboard
6+
create_resource, create_canvas, validate_name
7+
from apps.dashboard.models.dashboard_model import CreateDashboard, BaseDashboard, QueryDashboard
78
from common.core.deps import SessionDep, CurrentUser
89

910
router = APIRouter(tags=["dashboard"], prefix="/dashboard")
1011

1112
@router.post("/list")
12-
async def datasource_list(session: SessionDep):
13-
return get_dashboard_list(session=session)
13+
async def datasource_list(session: SessionDep,dashboard: QueryDashboard):
14+
return get_dashboard_list(session=session,dashboard=dashboard)
1415

1516
@router.get("/preview_dashboard/{id}")
1617
async def preview_dashboard(session: SessionDep,id:str):
@@ -30,4 +31,9 @@ async def add_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDa
3031

3132
@router.post("/update_canvas", response_model=BaseDashboard)
3233
async def update(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
33-
return
34+
return
35+
36+
@router.post("/check_name")
37+
async def check_name(session: SessionDep, dashboard: QueryDashboard):
38+
return validate_name(session,dashboard)
39+

backend/apps/dashboard/crud/dashboard_service.py

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from sqlalchemy import select
2-
from apps.dashboard.models.dashboard_model import CoreDashboard, CreateDashboard
1+
from sqlalchemy import select, and_, text
2+
from apps.dashboard.models.dashboard_model import CoreDashboard, CreateDashboard, QueryDashboard
33
from common.core.deps import SessionDep, CurrentUser
4-
from sqlmodel import text
54
import uuid
65
import datetime
7-
def get_dashboard_list(session: SessionDep):
6+
def get_dashboard_list(session: SessionDep,dashboard: QueryDashboard):
87
sql = text("SELECT id, name, type,node_type, pid, create_time FROM core_dashboard")
98
for row in session.exec(sql).mappings():
109
yield CoreDashboard(**row)
@@ -45,4 +44,36 @@ def create_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDashb
4544
return record
4645

4746
def update_canvas(session: SessionDep, user: CurrentUser, dashboard: CreateDashboard):
48-
record = session.query(CoreDashboard).filter(CoreDashboard.id == dashboard.id).first()
47+
record = session.query(CoreDashboard).filter(CoreDashboard.id == dashboard.id).first()
48+
49+
50+
def validate_name( session: SessionDep, dashboard: QueryDashboard) -> bool:
51+
if not dashboard.workspace_id:
52+
raise ValueError("workspace_id is required")
53+
if not dashboard.pid:
54+
raise ValueError("pid is required")
55+
if not dashboard.opt:
56+
raise ValueError("opt is required")
57+
58+
if dashboard.opt in ('newLeaf', 'newFolder'):
59+
query = session.query(CoreDashboard).filter(
60+
and_(
61+
CoreDashboard.workspace_id == dashboard.workspace_id,
62+
CoreDashboard.pid == dashboard.pid,
63+
CoreDashboard.name == dashboard.name
64+
)
65+
)
66+
elif dashboard.opt in ('updateLeaf', 'updateFolder'):
67+
if not dashboard.id:
68+
raise ValueError("id is required for update operation")
69+
query = session.query(CoreDashboard).filter(
70+
and_(
71+
CoreDashboard.workspace_id == dashboard.workspace_id,
72+
CoreDashboard.pid == dashboard.pid,
73+
CoreDashboard.name == dashboard.name,
74+
CoreDashboard.id != dashboard.id
75+
)
76+
)
77+
else:
78+
raise ValueError(f"Invalid opt value: {dashboard.opt}")
79+
return not session.query(query.exists()).scalar()

backend/apps/dashboard/models/dashboard_model.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,12 @@ class BaseDashboard(BaseModel):
141141
node_type: str = ''
142142
create_by: int = 0
143143

144+
class QueryDashboard(BaseDashboard):
145+
opt: str = ''
146+
144147

145148
# dashboard create obj
146-
class CreateDashboard(BaseDashboard):
149+
class CreateDashboard(QueryDashboard):
147150
canvas_style_data: str =''
148151
component_data: str = ''
149152
description: str = ''

frontend/src/api/dashboard.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ export const dashboardApi = {
88
addResource: (data: any) => request.post('/dashboard/add',data),
99
updateResource: (data: any) => request.post('/dashboard/update',data),
1010
saveCanvas: (data: any) => request.post('/dashboard/add_canvas',data),
11-
updateCanvas: (data: any) => request.post('/dashboard/update_',data)
11+
updateCanvas: (data: any) => request.post('/dashboard/update_',data),
12+
check_name: (data: any) => request.post('/dashboard/check_name',data)
1213
}

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

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,11 @@ const optInit = (params: any) => {
5151
resourceDialogShow.value = true
5252
// @ts-ignore
5353
resourceForm.name = params.name || getResourceNewName(params.opt)
54+
resourceForm.pid = params.pid || 'root'
5455
}
5556
5657
const resourceDialogShow = ref(false)
5758
const loading = ref(false)
58-
const pid = ref()
59-
const id = ref()
60-
const opt = ref('')
6159
const resourceForm = reactive({
6260
pid: '',
6361
pName: '',
@@ -101,11 +99,6 @@ const resetForm = () => {
10199
resourceDialogShow.value = false
102100
}
103101
104-
const editeInit = (param: SQTreeNode) => {
105-
pid.value = param['pid']
106-
id.value = param.id
107-
}
108-
109102
const propsTree = {
110103
label: 'name',
111104
children: 'children',
@@ -114,14 +107,15 @@ const propsTree = {
114107
}
115108
116109
const showPid = computed(() => {
117-
return ['newLeaf'].includes(opt.value) && state.parentSelect
110+
return state.opt && ['newLeaf'].includes(state.opt) && state.parentSelect
118111
})
119112
120113
const saveResource = () => {
121114
const params = {
122115
nodeType: state.nodeType,
123116
name: resourceForm.name,
124117
opt: state.opt,
118+
pid: resourceForm.pid,
125119
type: 'dashboard'
126120
}
127121
saveDashboardResource(params, function (rsp:any) {
@@ -147,8 +141,7 @@ const filterMethod = (value: any) => {
147141
}
148142
149143
defineExpose({
150-
optInit,
151-
editeInit
144+
optInit
152145
})
153146
154147
</script>

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ onMounted(() => {
205205
206206
// @ts-ignore
207207
const addOperation = (params: any) => {
208-
if (params.cmd === 'newLeaf') {
208+
if (params.opt === 'newLeaf') {
209209
const newCanvasUrl = '#/canvas?opt=create' + (params?.id ? `&pid=${params?.id}` : '')
210210
window.open(newCanvasUrl, '_blank')
211211
} else {
@@ -232,7 +232,7 @@ defineExpose({
232232
<el-icon
233233
class="custom-icon btn"
234234
style="margin-right: 10px"
235-
@click="addOperation({cmd:'newFolder',type:'folder'} )"
235+
@click="addOperation({opt:'newFolder',type:'folder',pid:'root'} )"
236236
>
237237
<Icon name="dv-new-folder">
238238
<newFolder class="svg-icon"/>
@@ -243,7 +243,7 @@ defineExpose({
243243
<el-icon
244244
class="custom-icon btn"
245245
style="margin-right: 10px"
246-
@click="addOperation({cmd:'newLeaf',type:'dashboard'} )"
246+
@click="addOperation({opt:'newLeaf',type:'dashboard'} )"
247247
>
248248
<Icon name="dv-new-folder">
249249
<icon_fileAdd_outlined class="svg-icon"/>
@@ -303,7 +303,7 @@ defineExpose({
303303
v-on:click.stop
304304
v-if="!data.leaf"
305305
class="hover-icon"
306-
@click="addOperation({cmd:'newLeaf',type:'dashboard',id:data.id} )"
306+
@click="addOperation({opt:'newLeaf',type:'dashboard',id:data.id} )"
307307
>
308308
<Icon><icon_add_outlined class="svg-icon"/></Icon>
309309
</el-icon>
@@ -315,14 +315,14 @@ defineExpose({
315315
>
316316
<Icon><icon_edit_outlined class="svg-icon"/></Icon>
317317
</el-icon>
318-
<!-- <HandleMore-->
319-
<!-- @handle-command=" (cmd:string) => addOperation({cmd})-->
320-
<!-- "-->
321-
<!-- :menu-list="resourceTypeList"-->
322-
<!-- :icon-name="icon_add_outlined"-->
323-
<!-- placement="bottom-start"-->
324-
<!-- v-if="!data.leaf"-->
325-
<!-- ></HandleMore>-->
318+
<!-- <HandleMore-->
319+
<!-- @handle-command=" (opt:string) => addOperation({opt})-->
320+
<!-- "-->
321+
<!-- :menu-list="resourceTypeList"-->
322+
<!-- :icon-name="icon_add_outlined"-->
323+
<!-- placement="bottom-start"-->
324+
<!-- v-if="!data.leaf"-->
325+
<!-- ></HandleMore>-->
326326
</div>
327327
</span>
328328
</template>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const props = defineProps({
4040
4141
const groupOptFinish = (result: any) => {
4242
let url = window.location.href
43-
url = url.replace(/(#\/[^?]*)(?:\?[^#]*)?/, `$1?dvId=${result.id}`)
43+
url = url.replace(/(#\/[^?]*)(?:\?[^#]*)?/, `$1?resourceId=${result.resourceId}`)
4444
window.history.replaceState( { path: url }, '', url )
4545
}
4646
</script>

frontend/src/views/dashboard/utils/canvasUtils.ts

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import {dashboardApi} from "@/api/dashboard.ts";
22
import {dashboardStoreWithOut} from "@/stores/dashboard/dashboard.ts";
33
import {storeToRefs} from "pinia";
4+
45
const dashboardStore = dashboardStoreWithOut()
5-
const {componentData,canvasStyle} = storeToRefs(dashboardStore)
6+
const {componentData, canvasStyle} = storeToRefs(dashboardStore)
67

8+
const workspace_id = 'default' // temp
79
export const initCanvasData = (params: any, callBack: Function) => {
810
dashboardApi.getDashboardInfo(params).then((res: any) => {
911
const canvasInfo = res.data;
@@ -28,20 +30,24 @@ export const initCanvasData = (params: any, callBack: Function) => {
2830
}
2931

3032
export const saveDashboardResource = (params: any, callBack: Function) => {
31-
if(params.opt === 'newLeaf'){// create canvas
32-
const reqeustParams = {
33-
...params,
34-
component_data:JSON.stringify(componentData.value),
35-
canvas_style_data:JSON.stringify(canvasStyle.value)
33+
params['workspace_id'] = workspace_id
34+
dashboardApi.check_name(params).then((res: any) => {
35+
if (!res) {
36+
if (params.opt === 'newLeaf') {// create canvas
37+
const reqeustParams = {
38+
...params,
39+
component_data: JSON.stringify(componentData.value),
40+
canvas_style_data: JSON.stringify(canvasStyle.value)
41+
}
42+
dashboardApi.saveCanvas(reqeustParams).then((res: any) => {
43+
dashboardStore.updateDashboardInfo({id: res.id, dataState: 'ready'})
44+
callBack(res)
45+
})
46+
} else if (params.opt === 'newFolder') {
47+
dashboardApi.addResource(params).then((res: any) => {
48+
callBack(res)
49+
})
50+
}
3651
}
37-
dashboardApi.saveCanvas(reqeustParams).then((res: any) => {
38-
dashboardStore.updateDashboardInfo({id:res.id,dataState:'ready'})
39-
callBack(res)
40-
})
41-
}else if(params.opt === 'newFolder'){
42-
dashboardApi.addResource(params).then((res: any) => {
43-
callBack(res)
44-
})
45-
}
46-
52+
})
4753
}

0 commit comments

Comments
 (0)