diff --git a/packages/designer/src/builtin-simulator/bem-tools/index.tsx b/packages/designer/src/builtin-simulator/bem-tools/index.tsx index c22951c2f..e719b1917 100644 --- a/packages/designer/src/builtin-simulator/bem-tools/index.tsx +++ b/packages/designer/src/builtin-simulator/bem-tools/index.tsx @@ -15,8 +15,14 @@ export class BemTools extends Component<{ host: BuiltinSimulatorHost }> { } render() { - const host = this.props.host; + // yiyi + // live 模式选中,画布会不会有相关交互 + const { host } = this.props; + const { designMode } = host; const { scrollX, scrollY, scale } = host.viewport; + if (designMode === 'live') { + return null; + } return (
diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 054294b81..133049fcb 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -288,7 +288,10 @@ export class BuiltinSimulatorHost implements ISimulatorHost { doc.removeEventListener('mouseup', checkSelect, true); + // 鼠标是否移动 if (!isShaken(downEvent, e)) { - const id = node.id; + let id = node.id; designer.activeTracker.track({ node, instance: nodeInst?.instance }); - if (isMulti && !isRootNode(node) && selection.has(id)) { + if (isMulti && !isRootNode(node) && selection?.has(id)) { selection.remove(id); } else { - selection.select(id); + if (node.isPage() && node.getChildren()?.notEmpty()) { + const firstChildId = node + .getChildren() + ?.get(0) + ?.getId(); + if (firstChildId) id = firstChildId; + } + selection?.select(id); // dirty code should refector const editor = this.designer?.editor; @@ -349,15 +365,15 @@ export class BuiltinSimulatorHost implements ISimulatorHost { - if (!detecting.enable) { + if (!detecting.enable || this.designMode !== 'design') { return; } const nodeInst = this.getNodeInstanceFromElement(e.target as Element); diff --git a/packages/designer/src/designer/designer-view.tsx b/packages/designer/src/designer/designer-view.tsx index fa601a994..011eaa80e 100644 --- a/packages/designer/src/designer/designer-view.tsx +++ b/packages/designer/src/designer/designer-view.tsx @@ -40,7 +40,7 @@ export class DesignerView extends Component doc.actived); } + @obx private _config: any = {}; + @computed get config(): any { + // TODO: parse layout Component + return this._config; + } + set config(value: any) { + this._config = value; + } + /** * 获取项目整体 schema */ @@ -55,6 +64,7 @@ export class Project { componentsTree: [], ...schema, }; + this.config = schema?.config; if (autoOpen) { if (autoOpen === true) { @@ -91,9 +101,14 @@ export class Project { | 'i18n' | 'css' | 'dataSource' + | 'config' | string, value: any, - ): void {} + ): void { + if (key === 'config') { + this.config = value; + } + } /** * 分字段设置储存数据 @@ -108,8 +123,13 @@ export class Project { | 'i18n' | 'css' | 'dataSource' + | 'config' | string, - ): any {} + ): any { + if (key === 'config') { + return this.config; + } + } private documentsMap = new Map(); diff --git a/packages/editor-preset-vision/src/editor.ts b/packages/editor-preset-vision/src/editor.ts index c73ac6fdb..23d798d8e 100644 --- a/packages/editor-preset-vision/src/editor.ts +++ b/packages/editor-preset-vision/src/editor.ts @@ -20,6 +20,7 @@ globalContext.register(editor, Editor); export const skeleton = new Skeleton(editor); editor.set(Skeleton, skeleton); editor.set('skeleton', skeleton); +editor.set('designMode', 'live'); export const designer = new Designer({ editor: editor }); editor.set(Designer, designer); @@ -279,6 +280,9 @@ skeleton.add({ name: 'settingsPane', type: 'Panel', content: SettingsPrimaryPane, + props: { + ignoreRoot: true, + }, }); skeleton.add({ area: 'leftArea', diff --git a/packages/editor-preset-vision/src/pages.ts b/packages/editor-preset-vision/src/pages.ts index 2a4d723b5..de23cbb2b 100644 --- a/packages/editor-preset-vision/src/pages.ts +++ b/packages/editor-preset-vision/src/pages.ts @@ -52,6 +52,15 @@ const pages = Object.assign(project, { version: '1.0.0', componentsMap: [], componentsTree, + config: { + layout: { + componentName: 'MiniappTabNav', + props: { + logo: '', + name: '测试网站', + }, + }, + }, }, true); }, addPage(data: OldPageData | RootSchema) { diff --git a/packages/editor-preset-vision/src/project.ts b/packages/editor-preset-vision/src/project.ts index 9239a9497..e6a1ec47d 100644 --- a/packages/editor-preset-vision/src/project.ts +++ b/packages/editor-preset-vision/src/project.ts @@ -1,17 +1,15 @@ -export class Project { - private schema: any; +import { designer } from './editor'; - constructor() { - this.schema = {}; - } +const { project } = designer; - getSchema() { - return this.schema; - } +Object.assign(project, { + getSchema(): any { + return this.schema || {}; + }, setSchema(schema: any) { this.schema = schema; - } -} + }, +}); -export default new Project(); +export default project; diff --git a/packages/editor-skeleton/src/components/settings/settings-primary-pane.tsx b/packages/editor-skeleton/src/components/settings/settings-primary-pane.tsx index 80abfa1c3..d316b62d9 100644 --- a/packages/editor-skeleton/src/components/settings/settings-primary-pane.tsx +++ b/packages/editor-skeleton/src/components/settings/settings-primary-pane.tsx @@ -7,7 +7,7 @@ import { SettingsPane } from './settings-pane'; import { createIcon } from '@ali/lowcode-utils'; @observer -export class SettingsPrimaryPane extends Component<{ editor: Editor }> { +export class SettingsPrimaryPane extends Component<{ editor: Editor; config: any }> { private main = new SettingsMain(this.props.editor); @obx.ref private _activeKey?: any; @@ -22,6 +22,8 @@ export class SettingsPrimaryPane extends Component<{ editor: Editor }> { renderBreadcrumb() { const { settings } = this.main; + const { config } = this.props; + const shouldIgnoreRoot = config.props?.ignoreRoot; if (!settings) { return null; } @@ -43,6 +45,10 @@ export class SettingsPrimaryPane extends Component<{ editor: Editor }> { let l = 3; while (l-- > 0 && node) { const _node = node; + if (shouldIgnoreRoot && node.isRoot()) { + node = null; + continue; + } const props = l === 2 ? {} diff --git a/packages/plugin-designer/src/index.tsx b/packages/plugin-designer/src/index.tsx index b23442165..cc1f76748 100644 --- a/packages/plugin-designer/src/index.tsx +++ b/packages/plugin-designer/src/index.tsx @@ -13,6 +13,7 @@ interface DesignerPluginState { extraEnvironment?: any[] | null; renderEnv?: string; device?: string; + designMode?: string; } export default class DesignerPlugin extends PureComponent { @@ -24,6 +25,7 @@ export default class DesignerPlugin extends PureComponent ); diff --git a/packages/rax-simulator-renderer/src/renderer-view.tsx b/packages/rax-simulator-renderer/src/renderer-view.tsx index dee038dfe..b9537f120 100644 --- a/packages/rax-simulator-renderer/src/renderer-view.tsx +++ b/packages/rax-simulator-renderer/src/renderer-view.tsx @@ -90,8 +90,13 @@ class Layout extends Component<{ rendererContainer: SimulatorRendererContainer } const layout = rendererContainer.layout; if (layout) { - const { Component, props } = layout; - return {children}; + const { Component, props, componentName } = layout; + if (Component) { + return {children}; + } + if (componentName) { + return createElement(rendererContainer.getComponent(componentName), {}, [children]); + } } return {children}; diff --git a/packages/types/src/app-config.ts b/packages/types/src/app-config.ts new file mode 100644 index 000000000..6343645c9 --- /dev/null +++ b/packages/types/src/app-config.ts @@ -0,0 +1,19 @@ +export interface AppConfig { + sdkVersion?: string; + historyMode?: string; + targetRootID?: string; + layout?: Layout; + theme?: Theme; + [key: string]: any; +} + +interface Theme { + package: string; + version: string; + primary: string; +} + +interface Layout { + componentName?: string; + props?: Record; +} diff --git a/packages/types/src/schema.ts b/packages/types/src/schema.ts index d3e74f6ea..65e8ae51b 100644 --- a/packages/types/src/schema.ts +++ b/packages/types/src/schema.ts @@ -3,6 +3,7 @@ import { CompositeValue, JSExpression, CompositeObject, JSONObject } from './val import { DataSource } from './data-source'; import { I18nMap } from './i18n'; import { UtilsMap } from './utils'; +import { AppConfig } from './app-config'; export interface NodeSchema { id?: string; @@ -83,6 +84,7 @@ export interface ProjectSchema { constants?: JSONObject; css?: string; dataSource?: DataSource; + config?: AppConfig; } export function isNodeSchema(data: any): data is NodeSchema {