Skip to content

Commit 56b39f0

Browse files
committed
feat: multi-node create block
1 parent cd4808d commit 56b39f0

3 files changed

Lines changed: 27 additions & 6 deletions

File tree

packages/canvas/DesignCanvas/src/DesignCanvas.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
</template>
2323

2424
<script>
25-
import { ref, watch, onUnmounted, onMounted } from 'vue'
25+
import { ref, watch, onUnmounted, onMounted, computed } from 'vue'
2626
import {
2727
useProperties,
2828
useCanvas,
@@ -43,6 +43,7 @@ import {
4343
import { constants } from '@opentiny/tiny-engine-utils'
4444
import * as ast from '@opentiny/tiny-engine-common/js/ast'
4545
import { initCanvas } from '../../init-canvas/init-canvas'
46+
import { useMultiSelect } from '../../container/src/composables/useMultiSelect'
4647
import { getImportMapData } from './importMap'
4748
import meta from '../meta'
4849
@@ -152,6 +153,9 @@ export default {
152153
}
153154
)
154155
156+
const { multiSelectedStates } = useMultiSelect()
157+
const multiStateLength = computed(() => multiSelectedStates.value.length)
158+
155159
const nodeSelected = (node, parent, type, id) => {
156160
const { leftPanelFixed, rightPanelFixed } = getFixedPanelsStatus()
157161
@@ -176,7 +180,9 @@ export default {
176180
177181
// 如果选中的节点是画布,就设置成默认选中最外层schema
178182
useProperties().getProps(schemaItem || pageSchema, parent)
179-
useCanvas().setCurrentSchema(schemaItem || pageSchema)
183+
const multiSchemas = multiSelectedStates.value.map(({ schema }) => schema)
184+
const currentSchema = multiStateLength.value > 1 ? multiSchemas : schemaItem || pageSchema
185+
useCanvas().setCurrentSchema(currentSchema)
180186
footData.value = getNodePath(schemaItem?.id)
181187
toolbars.visiblePopover = false
182188
}

packages/canvas/container/src/components/CanvasMenu.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ export default {
168168
const { SaveNewBlock } = getMergeMeta('engine.plugins.blockmanage')?.components || {}
169169
if (SaveNewBlock) {
170170
menus.value.push({ name: '新建区块', code: 'createBlock' })
171+
multiSelectMenus.value.push({ name: '新建区块', code: 'createBlock' })
171172
}
172173
173174
menus.value.unshift({

packages/plugins/block/src/composable/useBlock.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*/
1212

13-
import { ref, reactive, readonly } from 'vue'
13+
import { ref, reactive, readonly, toRaw } from 'vue'
1414
import { hyphenate } from '@vue/shared'
1515
import { extend, copyArray } from '@opentiny/vue-renderless/common/object'
1616
import { format } from '@opentiny/vue-renderless/common/date'
@@ -307,9 +307,23 @@ const initBlock = async (block = {}, _langs = {}, isEdit) => {
307307

308308
const createBlock = ({ name_cn, label, path, categories }) => {
309309
const { pageState } = useCanvas()
310-
const schema = extend(true, {}, pageState.currentSchema)
311-
// 选中 body 节点创建区块时需传递子节点数据
312-
const children = schema.componentName === NODE_TYPE_PAGE ? schema.children : [schema]
310+
const rawSchema = toRaw(pageState.currentSchema)
311+
312+
let processedSchema = []
313+
if (!rawSchema) {
314+
processedSchema = []
315+
} else if (Array.isArray(rawSchema)) {
316+
processedSchema = rawSchema.map((schemaItem) => extend(true, {}, schemaItem))
317+
} else {
318+
processedSchema = extend(true, {}, rawSchema)
319+
}
320+
321+
// 判断 node 类型 以及 schema 类型
322+
// 选中 body 节点 创建区块时需传递子节点数据
323+
const isPageNode = processedSchema.componentName === NODE_TYPE_PAGE
324+
const hasMultiSchema = Array.isArray(processedSchema) && processedSchema.length
325+
326+
const children = isPageNode ? processedSchema.children : hasMultiSchema ? processedSchema : [processedSchema]
313327

314328
// 过滤只有新区块内使用到的数据
315329
const { getLangs } = useTranslate()

0 commit comments

Comments
 (0)