diff --git a/frontend/src/stores/dashboard/dashboard.ts b/frontend/src/stores/dashboard/dashboard.ts
index 2504e784f..6e5936808 100644
--- a/frontend/src/stores/dashboard/dashboard.ts
+++ b/frontend/src/stores/dashboard/dashboard.ts
@@ -13,6 +13,10 @@ export const dashboardStore = defineStore('dashboard', {
canvasViewInfo: {},
fullscreenFlag: false,
dataPrepareState: false,
+ baseMatrixCount: {
+ x: 72,
+ y: 36,
+ },
dashboardInfo: {
id: null,
name: null,
diff --git a/frontend/src/views/dashboard/canvas/CanvasCore.vue b/frontend/src/views/dashboard/canvas/CanvasCore.vue
index e574ebb67..dac6b9e35 100644
--- a/frontend/src/views/dashboard/canvas/CanvasCore.vue
+++ b/frontend/src/views/dashboard/canvas/CanvasCore.vue
@@ -1069,8 +1069,6 @@ const forceComputed = () => {
}
function addItemBox(item: CanvasItem) {
- // @ts-expect-error eslint-disable-next-line @typescript-eslint/ban-ts-comment
- item.x = findPositionX(item)
canvasComponentData.value.push(item)
forceComputed()
nextTick(() => {
@@ -1177,8 +1175,7 @@ function tabMoveInCheckSQ() {
/**
* Find position box
*/
-function findPositionX(item: CanvasItem) {
- const width = item.sizeX
+function findPositionX(width: number) {
let resultX = 1
let checkPointYIndex = -1 // -1 means not occupying any Y-direction canvas
// Component width
@@ -1245,6 +1242,7 @@ defineExpose({
removeItem,
findClosetCoords,
makeCoordinate,
+ findPositionX,
})
diff --git a/frontend/src/views/dashboard/editor/DashboardEditor.vue b/frontend/src/views/dashboard/editor/DashboardEditor.vue
index d4a4a49a8..6f7fd5db9 100644
--- a/frontend/src/views/dashboard/editor/DashboardEditor.vue
+++ b/frontend/src/views/dashboard/editor/DashboardEditor.vue
@@ -85,6 +85,11 @@ const addItemToBox = (item: CanvasItem) => {
canvasCoreRef.value.addItemBox(item)
}
+const findPositionX = (width: number) => {
+ // @ts-expect-error eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ return canvasCoreRef.value.findPositionX(width)
+}
+
useEmitt({
name: 'custom-canvas-resize',
callback: canvasSizeInit,
@@ -93,6 +98,7 @@ useEmitt({
defineExpose({
canvasSizeInit,
addItemToBox,
+ findPositionX,
})
onMounted(() => {
diff --git a/frontend/src/views/dashboard/editor/Toolbar.vue b/frontend/src/views/dashboard/editor/Toolbar.vue
index 4dc96031a..74830acd2 100644
--- a/frontend/src/views/dashboard/editor/Toolbar.vue
+++ b/frontend/src/views/dashboard/editor/Toolbar.vue
@@ -22,7 +22,7 @@ const { dashboardInfo, fullscreenFlag } = storeToRefs(dashboardStore)
const snapshotStore = snapshotStoreWithOut()
const { snapshotIndex } = storeToRefs(snapshotStore)
-const emits = defineEmits(['addComponent'])
+const emits = defineEmits(['addComponents'])
const resourceGroupOptRef = ref(null)
const chatChartSelectionRef = ref(null)
const openViewDialog = () => {
@@ -139,10 +139,11 @@ const backToMain = () => {
}
const addChatChart = (views: any) => {
+ emits('addComponents', 'SQView', views)
views.forEach((view: any) => {
const target = cloneDeep(view)
delete target.chart.sourceType
- emits('addComponent', 'SQView', target)
+ emits('addComponents', 'SQView', target)
})
ElMessage({
type: 'success',
@@ -212,14 +213,14 @@ const previewInner = () => {
:title="t('dashboard.text')"
themes="light"
is-label
- @custom-click="() => emits('addComponent', 'SQText')"
+ @custom-click="() => emits('addComponents', 'SQText')"
>
emits('addComponent', 'SQTab')"
+ @custom-click="() => emits('addComponents', 'SQTab')"
>
diff --git a/frontend/src/views/dashboard/editor/index.vue b/frontend/src/views/dashboard/editor/index.vue
index 98c80b3e4..f5167e097 100644
--- a/frontend/src/views/dashboard/editor/index.vue
+++ b/frontend/src/views/dashboard/editor/index.vue
@@ -13,7 +13,8 @@ import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const dashboardStore = dashboardStoreWithOut()
-const { componentData, canvasViewInfo, fullscreenFlag } = storeToRefs(dashboardStore)
+const { componentData, canvasViewInfo, fullscreenFlag, baseMatrixCount } =
+ storeToRefs(dashboardStore)
const dataInitState = ref(true)
const state = reactive({
@@ -23,8 +24,26 @@ const state = reactive({
})
const dashboardEditorInnerRef = ref(null)
-const addComponent = (componentType: string, viewInfo?: any) => {
+const addComponents = (componentType: string, views?: any) => {
const component = cloneDeep(findNewComponentFromList(componentType))
+ // @ts-expect-error eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ component.x = findPositionX(component.sizeX)
+ if (views) {
+ views.forEach((view: any, index: number) => {
+ const target = cloneDeep(view)
+ delete target.chart.sourceType
+ if (index > 0) {
+ // @ts-expect-error eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ component.x = ((component.x + component?.sizeX - 1) % baseMatrixCount.value.x) + 1
+ }
+ addComponent(component, target)
+ })
+ } else {
+ addComponent(component)
+ }
+}
+const addComponent = (componentSource: any, viewInfo?: any) => {
+ const component = cloneDeep(componentSource)
if (component && dashboardEditorInnerRef.value) {
component.id = guid()
// add view
@@ -34,9 +53,7 @@ const addComponent = (componentType: string, viewInfo?: any) => {
dashboardStore.addCanvasViewInfo(viewInfo)
} else if (component.component === 'SQTab') {
const subTabName = guid('tab')
- // @ts-expect-error eslint-disable-next-line @typescript-eslint/ban-ts-comment
component.propValue[0].name = subTabName
- // @ts-expect-error eslint-disable-next-line @typescript-eslint/ban-ts-comment
component.propValue[0].title = t('dashboard.new_tab')
component.activeTabName = subTabName
}
@@ -85,12 +102,20 @@ const baseParams = computed(() => {
pid: state.routerPid,
}
})
+const findPositionX = (width: number) => {
+ // @ts-expect-error eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ return dashboardEditorInnerRef.value.findPositionX(width)
+}