From 28d23d5d78224ae7f391f459fcf8cdc6aa580fec Mon Sep 17 00:00:00 2001 From: kangwei Date: Tue, 18 Feb 2020 01:28:01 +0800 Subject: [PATCH] debug start --- .../simulator => }/auxilary/README.md | 0 .../simulator => }/auxilary/auxiliary.less | 0 .../simulator => }/auxilary/auxiliary.tsx | 0 .../auxilary/embed-editor-toolbar.tsx | 0 packages/designer/auxilary/gliding.less | 39 + packages/designer/auxilary/gliding.tsx | 47 ++ .../builtins/simulator => }/auxilary/index.ts | 0 .../simulator => }/auxilary/insertion.less | 0 .../simulator => }/auxilary/insertion.tsx | 0 .../auxilary/offset-observer.ts | 0 .../simulator => }/auxilary/selecting.less | 0 .../simulator => }/auxilary/selecting.tsx | 0 packages/designer/package.json | 5 +- .../src/builtins/drag-ghost/index.tsx | 82 ++ .../designer/src/builtins/embed-editor.ts | 59 -- .../src/builtins/simulator/host/README.md | 1 + .../simulator/host/create-simulator.ts | 77 ++ .../src/builtins/simulator/host/host-view.tsx | 95 +++ .../src/builtins/simulator/host/host.less | 67 ++ .../src/builtins/simulator/host/host.ts | 799 ++++++++++++++++++ .../src/builtins/simulator/host/index.ts | 2 + .../simulator/host/resource-consumer.ts | 80 ++ .../src/builtins/simulator/host/viewport.ts | 135 +++ .../designer/src/builtins/simulator/index.ts | 5 + .../src/builtins/simulator/renderer/README.md | 1 + .../src/builtins/simulator/renderer/host.ts | 4 + .../src/builtins/simulator/renderer/index.ts | 7 + .../simulator/renderer/renderer-view.tsx | 69 ++ .../builtins/simulator/renderer/renderer.less | 10 + .../builtins/simulator/renderer/renderer.ts | 259 ++++++ .../src/builtins/simulator/utils/asset.ts | 76 ++ .../simulator}/utils/cursor.less | 0 .../{ => builtins/simulator}/utils/cursor.ts | 0 .../simulator/utils/intrinsic-mocks.ts | 284 +++++++ .../src/builtins/simulator/utils/loader.ts | 105 +++ .../{ => builtins/simulator}/utils/react.ts | 2 +- .../{ => builtins/simulator}/utils/script.ts | 18 +- .../src/builtins/simulator/utils/style.ts | 73 ++ .../builtins/simulator/utils/vision-types.js | 198 +++++ .../designer/src/designer/active-tracker.ts | 23 + .../designer/src/designer/designer-view.tsx | 51 ++ packages/designer/src/designer/designer.less | 0 packages/designer/src/designer/designer.ts | 2 +- .../src/designer/document/document-model.ts | 349 ++++++++ .../src/designer/document/document-view.tsx | 35 + .../document/node/component-config.ts | 380 +++++++++ .../designer/document/node/node-children.ts | 186 ++++ .../designer/document/node/node-content.ts | 86 ++ .../src/designer/document/node/node.ts | 481 +++++++++++ .../src/designer/document/node/props/prop.ts | 453 ++++++++++ .../src/designer/document/node/props/props.ts | 242 ++++++ .../document/node/props/stash-space.ts | 65 ++ .../src/designer/document/node/root-node.ts | 77 ++ packages/designer/src/designer/dragon.ts | 8 +- packages/designer/src/designer/history.ts | 1 + packages/designer/src/designer/hovering.ts | 34 + packages/designer/src/designer/index.ts | 3 + packages/designer/src/designer/location.ts | 126 +++ .../designer/src/designer/project-view.tsx | 22 + packages/designer/src/designer/schema.ts | 2 +- packages/designer/src/designer/scroller.ts | 181 ++++ packages/designer/src/designer/simulator.ts | 156 ++++ packages/designer/src/index.ts | 3 + packages/designer/src/module.d.ts | 1 + packages/designer/src/utils/index.ts | 9 - .../designer/src/utils/navtive-selection.ts | 15 + packages/designer/src/utils/parse-code.ts | 7 - packages/designer/src/utils/shallow-equal.ts | 27 - packages/designer/src/utils/style-point.ts | 55 -- packages/designer/src/utils/type-check.ts | 11 - 70 files changed, 5509 insertions(+), 181 deletions(-) rename packages/designer/{src/builtins/simulator => }/auxilary/README.md (100%) rename packages/designer/{src/builtins/simulator => }/auxilary/auxiliary.less (100%) rename packages/designer/{src/builtins/simulator => }/auxilary/auxiliary.tsx (100%) rename packages/designer/{src/builtins/simulator => }/auxilary/embed-editor-toolbar.tsx (100%) create mode 100644 packages/designer/auxilary/gliding.less create mode 100644 packages/designer/auxilary/gliding.tsx rename packages/designer/{src/builtins/simulator => }/auxilary/index.ts (100%) rename packages/designer/{src/builtins/simulator => }/auxilary/insertion.less (100%) rename packages/designer/{src/builtins/simulator => }/auxilary/insertion.tsx (100%) rename packages/designer/{src/builtins/simulator => }/auxilary/offset-observer.ts (100%) rename packages/designer/{src/builtins/simulator => }/auxilary/selecting.less (100%) rename packages/designer/{src/builtins/simulator => }/auxilary/selecting.tsx (100%) create mode 100644 packages/designer/src/builtins/drag-ghost/index.tsx delete mode 100644 packages/designer/src/builtins/embed-editor.ts create mode 100644 packages/designer/src/builtins/simulator/host/README.md create mode 100644 packages/designer/src/builtins/simulator/host/create-simulator.ts create mode 100644 packages/designer/src/builtins/simulator/host/host-view.tsx create mode 100644 packages/designer/src/builtins/simulator/host/host.less create mode 100644 packages/designer/src/builtins/simulator/host/host.ts create mode 100644 packages/designer/src/builtins/simulator/host/index.ts create mode 100644 packages/designer/src/builtins/simulator/host/resource-consumer.ts create mode 100644 packages/designer/src/builtins/simulator/host/viewport.ts create mode 100644 packages/designer/src/builtins/simulator/index.ts create mode 100644 packages/designer/src/builtins/simulator/renderer/README.md create mode 100644 packages/designer/src/builtins/simulator/renderer/host.ts create mode 100644 packages/designer/src/builtins/simulator/renderer/index.ts create mode 100644 packages/designer/src/builtins/simulator/renderer/renderer-view.tsx create mode 100644 packages/designer/src/builtins/simulator/renderer/renderer.less create mode 100644 packages/designer/src/builtins/simulator/renderer/renderer.ts create mode 100644 packages/designer/src/builtins/simulator/utils/asset.ts rename packages/designer/src/{ => builtins/simulator}/utils/cursor.less (100%) rename packages/designer/src/{ => builtins/simulator}/utils/cursor.ts (100%) create mode 100644 packages/designer/src/builtins/simulator/utils/intrinsic-mocks.ts create mode 100644 packages/designer/src/builtins/simulator/utils/loader.ts rename packages/designer/src/{ => builtins/simulator}/utils/react.ts (93%) rename packages/designer/src/{ => builtins/simulator}/utils/script.ts (63%) create mode 100644 packages/designer/src/builtins/simulator/utils/style.ts create mode 100644 packages/designer/src/builtins/simulator/utils/vision-types.js create mode 100644 packages/designer/src/designer/active-tracker.ts create mode 100644 packages/designer/src/designer/designer-view.tsx create mode 100644 packages/designer/src/designer/designer.less create mode 100644 packages/designer/src/designer/document/document-model.ts create mode 100644 packages/designer/src/designer/document/document-view.tsx create mode 100644 packages/designer/src/designer/document/node/component-config.ts create mode 100644 packages/designer/src/designer/document/node/node-children.ts create mode 100644 packages/designer/src/designer/document/node/node-content.ts create mode 100644 packages/designer/src/designer/document/node/node.ts create mode 100644 packages/designer/src/designer/document/node/props/prop.ts create mode 100644 packages/designer/src/designer/document/node/props/props.ts create mode 100644 packages/designer/src/designer/document/node/props/stash-space.ts create mode 100644 packages/designer/src/designer/document/node/root-node.ts create mode 100644 packages/designer/src/designer/history.ts create mode 100644 packages/designer/src/designer/hovering.ts create mode 100644 packages/designer/src/designer/location.ts create mode 100644 packages/designer/src/designer/project-view.tsx create mode 100644 packages/designer/src/designer/scroller.ts create mode 100644 packages/designer/src/designer/simulator.ts create mode 100644 packages/designer/src/module.d.ts delete mode 100644 packages/designer/src/utils/index.ts create mode 100644 packages/designer/src/utils/navtive-selection.ts delete mode 100644 packages/designer/src/utils/parse-code.ts delete mode 100644 packages/designer/src/utils/shallow-equal.ts delete mode 100644 packages/designer/src/utils/style-point.ts delete mode 100644 packages/designer/src/utils/type-check.ts diff --git a/packages/designer/src/builtins/simulator/auxilary/README.md b/packages/designer/auxilary/README.md similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/README.md rename to packages/designer/auxilary/README.md diff --git a/packages/designer/src/builtins/simulator/auxilary/auxiliary.less b/packages/designer/auxilary/auxiliary.less similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/auxiliary.less rename to packages/designer/auxilary/auxiliary.less diff --git a/packages/designer/src/builtins/simulator/auxilary/auxiliary.tsx b/packages/designer/auxilary/auxiliary.tsx similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/auxiliary.tsx rename to packages/designer/auxilary/auxiliary.tsx diff --git a/packages/designer/src/builtins/simulator/auxilary/embed-editor-toolbar.tsx b/packages/designer/auxilary/embed-editor-toolbar.tsx similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/embed-editor-toolbar.tsx rename to packages/designer/auxilary/embed-editor-toolbar.tsx diff --git a/packages/designer/auxilary/gliding.less b/packages/designer/auxilary/gliding.less new file mode 100644 index 000000000..733ae746d --- /dev/null +++ b/packages/designer/auxilary/gliding.less @@ -0,0 +1,39 @@ +.my-edging { + box-sizing: border-box; + pointer-events: none; + position: absolute; + top: 0; + left: 0; + border: 1px dashed var(--color-brand-light); + z-index: 1; + background: rgba(95, 240, 114, 0.04); + will-change: transform, width, height; + transition-property: transform, width, height; + transition-duration: 60ms; + transition-timing-function: linear; + overflow: visible; + >.title { + position: absolute; + color: var(--color-brand-light); + top: -20px; + left: 0; + font-weight: lighter; + } + + &.x-shadow { + border-color: rgba(138, 93, 226, 0.8); + background: rgba(138, 93, 226, 0.04); + + >.title { + color: rgba(138, 93, 226, 1.0); + } + } + + &.x-flow { + border-color: rgba(255, 99, 8, 0.8); + background: rgba(255, 99, 8, 0.04); + >.title { + color: rgb(255, 99, 8); + } + } +} diff --git a/packages/designer/auxilary/gliding.tsx b/packages/designer/auxilary/gliding.tsx new file mode 100644 index 000000000..a6b063ddc --- /dev/null +++ b/packages/designer/auxilary/gliding.tsx @@ -0,0 +1,47 @@ +import { observer } from '@recore/core-obx'; +import { Component } from 'react'; +import './edging.less'; + +@observer +export class GlidingView extends Component { + shouldComponentUpdate() { + return false; + } + + render() { + const node = edging.watching; + if (!node || !edging.enable || (current.selection && current.selection.has(node.id))) { + return null; + } + + // TODO: think of multi ReactInstance + // TODO: findDOMNode cause a render bug + const rect = node.document.computeRect(node); + if (!rect) { + return null; + } + + const { scale, scrollTarget } = node.document.viewport; + + const sx = scrollTarget!.left; + const sy = scrollTarget!.top; + + const style = { + width: rect.width * scale, + height: rect.height * scale, + transform: `translate(${(sx + rect.left) * scale}px, ${(sy + rect.top) * scale}px)`, + } as any; + + let className = 'my-edging'; + + // TODO: + // 1. thinkof icon + // 2. thinkof top|bottom|inner space + + return ( +
+ {(node as any).title || node.tagName} +
+ ); + } +} diff --git a/packages/designer/src/builtins/simulator/auxilary/index.ts b/packages/designer/auxilary/index.ts similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/index.ts rename to packages/designer/auxilary/index.ts diff --git a/packages/designer/src/builtins/simulator/auxilary/insertion.less b/packages/designer/auxilary/insertion.less similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/insertion.less rename to packages/designer/auxilary/insertion.less diff --git a/packages/designer/src/builtins/simulator/auxilary/insertion.tsx b/packages/designer/auxilary/insertion.tsx similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/insertion.tsx rename to packages/designer/auxilary/insertion.tsx diff --git a/packages/designer/src/builtins/simulator/auxilary/offset-observer.ts b/packages/designer/auxilary/offset-observer.ts similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/offset-observer.ts rename to packages/designer/auxilary/offset-observer.ts diff --git a/packages/designer/src/builtins/simulator/auxilary/selecting.less b/packages/designer/auxilary/selecting.less similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/selecting.less rename to packages/designer/auxilary/selecting.less diff --git a/packages/designer/src/builtins/simulator/auxilary/selecting.tsx b/packages/designer/auxilary/selecting.tsx similarity index 100% rename from packages/designer/src/builtins/simulator/auxilary/selecting.tsx rename to packages/designer/auxilary/selecting.tsx diff --git a/packages/designer/package.json b/packages/designer/package.json index a553eb221..fa25e054d 100644 --- a/packages/designer/package.json +++ b/packages/designer/package.json @@ -3,16 +3,13 @@ "version": "0.9.0", "description": "alibaba lowcode designer", "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, "author": "", "license": "MIT", "dependencies": { + "@ali/iceluna-sdk": "^1.0.5-beta.12", "@recore/core-obx": "^1.0.4", "@recore/obx": "^1.0.5", "@types/medium-editor": "^5.0.3", - "@ali/lowcode-renderer": "0.9.0", "classnames": "^2.2.6", "react": "^16", "react-dom": "^16.7.0" diff --git a/packages/designer/src/builtins/drag-ghost/index.tsx b/packages/designer/src/builtins/drag-ghost/index.tsx new file mode 100644 index 000000000..a42793a55 --- /dev/null +++ b/packages/designer/src/builtins/drag-ghost/index.tsx @@ -0,0 +1,82 @@ +import { Component } from 'react'; +import { obx } from '@recore/obx'; +import { observer } from '@recore/core-obx'; +import Designer from '../../designer/designer'; +import './ghost.less'; + +type offBinding = () => any; + +@observer +export default class Ghost extends Component<{ designer: Designer }> { + private dispose: offBinding[] = []; + @obx.ref private dragment: any = null; + @obx.ref private x = 0; + @obx.ref private y = 0; + private dragon = this.props.designer.dragon; + + componentWillMount() { + this.dispose = [ + this.dragon.onDragstart((e) => { + this.dragment = e.dragObject; + this.x = e.globalX; + this.y = e.globalY; + }), + this.dragon.onDrag(e => { + this.x = e.globalX; + this.y = e.globalY; + }), + this.dragon.onDragend(() => { + this.dragment = null; + this.x = 0; + this.y = 0; + }), + ]; + } + + shouldComponentUpdate() { + return false; + } + + componentWillUnmount() { + if (this.dispose) { + this.dispose.forEach(off => off()); + } + } + + renderGhostGroup() { + const dragment = this.dragment; + if (Array.isArray(dragment)) { + return dragment.map((node: any, index: number) => { + const ghost = ( +
+
{node.tagName}
+
+ ); + return ghost; + }); + } else { + return ( +
+
{dragment.tagName}
+
+ ); + } + } + + render() { + if (!this.dragment) { + return null; + } + + return ( +
+ {this.renderGhostGroup()} +
+ ); + } +} diff --git a/packages/designer/src/builtins/embed-editor.ts b/packages/designer/src/builtins/embed-editor.ts deleted file mode 100644 index 89368a8e8..000000000 --- a/packages/designer/src/builtins/embed-editor.ts +++ /dev/null @@ -1,59 +0,0 @@ -import MediumEditor from 'medium-editor'; -import { computed, obx } from '@ali/recore'; -import { current } from './current'; -import ElementNode from '../document/node/element-node'; - -class EmbedEditor { - @obx container?: HTMLDivElement | null; - private _editor?: any; - @computed getEditor(): any | null { - if (this._editor) { - this._editor.destroy(); - this._editor = null; - } - const win = current.document!.contentWindow; - const doc = current.document!.ownerDocument; - if (!win || !doc || !this.container) { - return null; - } - - const rect = this.container.getBoundingClientRect(); - - this._editor = new MediumEditor([], { - contentWindow: win, - ownerDocument: doc, - toolbar: { - diffLeft: rect.left, - diffTop: rect.top - 10, - }, - elementsContainer: this.container, - }); - return this._editor; - } - - @obx.ref editing?: [ElementNode, string, HTMLElement]; - - edit(node: ElementNode, prop: string, el: HTMLElement) { - const ed = this.getEditor(); - if (!ed) { - return; - } - this.exitAndSave(); - console.info(el); - this.editing = [node, prop, el]; - ed.origElements = el; - ed.setup(); - } - - exitAndSave() { - this.editing = undefined; - // removeElements - // get content save to - } - - mount(container?: HTMLDivElement | null) { - this.container = container; - } -} - -export default new EmbedEditor(); diff --git a/packages/designer/src/builtins/simulator/host/README.md b/packages/designer/src/builtins/simulator/host/README.md new file mode 100644 index 000000000..a2da06fa3 --- /dev/null +++ b/packages/designer/src/builtins/simulator/host/README.md @@ -0,0 +1 @@ +主进程 diff --git a/packages/designer/src/builtins/simulator/host/create-simulator.ts b/packages/designer/src/builtins/simulator/host/create-simulator.ts new file mode 100644 index 000000000..5928a055a --- /dev/null +++ b/packages/designer/src/builtins/simulator/host/create-simulator.ts @@ -0,0 +1,77 @@ +// NOTE: 仅用作类型标注,切勿作为实体使用 +import { SimulatorRenderer } from '../renderer/renderer'; +import { SimulatorHost } from './host'; +import { AssetLevel, AssetList, isAssetBundle, isAssetItem, isCSSUrl, AssetType, assetItem } from '../utils/asset'; + +export function createSimulator(host: SimulatorHost, iframe: HTMLIFrameElement, vendors: AssetList = []): Promise { + const win: any = iframe.contentWindow; + const doc = iframe.contentDocument!; + + win.LCSimulatorHost = host; + + const styles: any = {}; + const scripts: any = {}; + Object.keys(AssetLevel).forEach((key) => { + const v = (AssetLevel as any)[key]; + styles[v] = []; + scripts[v] = []; + }); + + function parseAssetList(assets: AssetList, level?: AssetLevel) { + for (let asset of assets) { + if (!asset) { + continue; + } + if (isAssetBundle(asset)) { + if (asset.assets) { + parseAssetList(Array.isArray(asset.assets) ? asset.assets : [asset.assets], asset.level || level); + } + continue; + } + if (Array.isArray(asset)) { + parseAssetList(asset, level); + continue; + } + if (!isAssetItem(asset)) { + asset = assetItem(isCSSUrl(asset) ? AssetType.CSSUrl : AssetType.JSUrl, asset, level)!; + } + const id = asset.id ? ` data-id="${asset.id}"` : ''; + const lv = asset.level || level || AssetLevel.BaseDepends; + if (asset.type === 'jsUrl') { + (scripts[lv] || scripts[AssetLevel.App]).push(``) + } else if (asset.type === 'jsText') { + (scripts[lv] || scripts[AssetLevel.App]).push(`${asset.content}`); + } else if (asset.type === 'cssUrl') { + (styles[lv] || styles[AssetLevel.App]).push(``); + } else if (asset.type === 'cssText') { + (styles[lv] || styles[AssetLevel.App]).push(``); + } + } + } + + parseAssetList(vendors); + + const styleFrags = Object.keys(styles).map(key => { + return styles[key].join('\n') + ``; + }); + const scriptFrags = Object.keys(scripts).map(key => { + return styles[key].join('\n') + ``; + }); + + doc.open(); + doc.write(` + ${styleFrags} +${scriptFrags}`); + doc.close(); + + return new Promise(resolve => { + if (win.SimulatorRenderer || host.renderer) { + return resolve(win.SimulatorRenderer || host.renderer); + } + const loaded = () => { + resolve(win.SimulatorRenderer || host.renderer); + win.removeEventListener('load', loaded); + }; + win.addEventListener('load', loaded); + }); +} diff --git a/packages/designer/src/builtins/simulator/host/host-view.tsx b/packages/designer/src/builtins/simulator/host/host-view.tsx new file mode 100644 index 000000000..dddf33338 --- /dev/null +++ b/packages/designer/src/builtins/simulator/host/host-view.tsx @@ -0,0 +1,95 @@ +import { Component, createContext } from 'react'; +import { observer } from '@recore/core-obx'; +// import { AuxiliaryView } from '../auxilary'; +import { SimulatorHost, SimulatorProps } from './host'; +import DocumentModel from '../../../designer/document/document-model'; +import './host.less'; + +/* + Simulator 模拟器,可替换部件,有协议约束, 包含画布的容器,使用场景:当 Canvas 大小变化时,用来居中处理 或 定位 Canvas + Canvas(DeviceShell) 设备壳层,通过背景图片来模拟,通过设备预设样式改变宽度、高度及定位 CanvasViewport + CanvasViewport 页面编排场景中宽高不可溢出 Canvas 区 + Content(Shell) 内容外层,宽高紧贴 CanvasViewport,禁用边框,禁用 margin + ContentFrame 可设置宽高,在页面场景一般只设置框,高度拉伸贴合 Content + Auxiliary 辅助显示层,初始相对 Content 位置 0,0,紧贴 Canvas, 根据 Content 滚动位置,改变相对位置 +*/ + +export const SimulatorContext = createContext({} as any); + +export class SimulatorHostView extends Component void; +}> { + readonly host: SimulatorHost; + constructor(props: any) { + super(props); + const { documentContext } = this.props; + this.host = (documentContext.simulator as SimulatorHost) || new SimulatorHost(documentContext); + } + shouldComponentUpdate(nextProps: SimulatorProps) { + this.host.setProps(nextProps); + return false; + } + componentDidMount() { + if (this.props.onMount) { + this.props.onMount(this.host); + } + } + render() { + const { Provider } = SimulatorContext; + return ( +
+ + {/*progressing.visible ? : null*/} + + +
+ ); + } +} + +@observer +class Canvas extends Component { + static contextType = SimulatorContext; + render() { + const sim = this.context as SimulatorHost; + let className = 'lc-simulator-canvas'; + if (sim.deviceClassName) { + className += ` ${sim.deviceClassName}`; + } else if (sim.device) { + className += ` lc-simulator-device-${sim.device}`; + } + + return ( +
+
sim.mountViewport(elmt)} className="lc-simulator-canvas-viewport"> + {/**/} + +
+
+ ); + } +} + +@observer +class Content extends Component { + static contextType = SimulatorContext; + render() { + const sim = this.context as SimulatorHost; + const viewport = sim.viewport; + let frameStyle = {}; + if (viewport.scale < 1) { + frameStyle = { + transform: `scale(${viewport.scale})`, + height: viewport.contentHeight, + width: viewport.contentWidth, + }; + } + + return ( +
+