Skip to content

Commit

Permalink
feat(core): support node designerProps with nodeName
Browse files Browse the repository at this point in the history
  • Loading branch information
janryWang committed Aug 27, 2021
1 parent 80d62d4 commit 864ae0f
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 34 deletions.
21 changes: 9 additions & 12 deletions packages/core/src/models/TreeNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ import { GlobalRegistry } from '../registry'

export interface ITreeNode {
componentName?: string
designerProps?: IDesignerControllerProps
operation?: Operation
hidden?: boolean
isSourceNode?: boolean
id?: string
name?: string
props?: Record<string | number | symbol, any>
children?: ITreeNode[]
}
Expand Down Expand Up @@ -116,14 +116,14 @@ export class TreeNode {

componentName = 'NO_NAME_COMPONENT'

name = ''

props: ITreeNode['props'] = {}

children: TreeNode[] = []

isSelfSourceNode: boolean

selfDesignerProps: IDesignerControllerProps

constructor(node?: ITreeNode, parent?: TreeNode) {
if (node instanceof TreeNode) {
return node
Expand Down Expand Up @@ -164,17 +164,14 @@ export class TreeNode {
})
}

set designerProps(props: IDesignerControllerProps) {
this.selfDesignerProps = props || {}
}

get designerProps(): IDesignerProps {
const commonDesignerProps = GlobalRegistry.getComponentDesignerProps(
this.componentName
)
const nodeDesignerProps = GlobalRegistry.getNodeDesignerProps(this.name)
const finallyDesignerProps: IDesignerProps = {
...resolveDesignerProps(this, commonDesignerProps),
...resolveDesignerProps(this, this.selfDesignerProps),
...resolveDesignerProps(this, nodeDesignerProps),
}
const display = this.props?.style?.display
if (display) {
Expand Down Expand Up @@ -206,9 +203,9 @@ export class TreeNode {
return this.parent.children.indexOf(this)
}

get childrens(): TreeNode[] {
get descendants(): TreeNode[] {
return this.children.reduce((buf, node) => {
return buf.concat(node).concat(node.childrens)
return buf.concat(node).concat(node.descendants)
}, [])
}

Expand Down Expand Up @@ -669,8 +666,8 @@ export class TreeNode {
if (node.componentName) {
this.componentName = node.componentName
}
if (node.designerProps) {
this.designerProps = node.designerProps
if (node.name) {
this.name = node.name
}
this.props = {
...this.designerProps?.defaultProps,
Expand Down
60 changes: 42 additions & 18 deletions packages/core/src/registry.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import { each, isFn, isPlainObj } from '@designable/shared'
import { Path } from '@formily/path'
import { define, observable } from '@formily/reactive'
import { TreeNode } from './models'
import {
IDesignerControllerProps,
IDesignerControllerPropsMap,
IDesignerLocales,
} from './types'

const getBrowserlanguage = () => {
const getBrowserLanguage = () => {
/* istanbul ignore next */
if (!window.navigator) {
return 'en'
Expand All @@ -32,20 +33,22 @@ const getISOCode = (language: string) => {
return isoCode
}

const DESIGNER_PROPS_MAP: IDesignerControllerPropsMap = {
const COMPONENT_DESIGNER_PROPS_MAP: IDesignerControllerPropsMap = {
Root: {
droppable: true,
cloneable: false,
deletable: false,
},
}

const NODE_DESIGNER_PROPS_MAP: IDesignerControllerPropsMap = {}

const DESIGNER_ICONS_MAP: Record<string, any> = {}

const DESIGNER_LOCALES: IDesignerLocales = define(
{
messages: {},
language: getBrowserlanguage(),
language: getBrowserLanguage(),
},
{
language: observable.ref,
Expand Down Expand Up @@ -77,34 +80,55 @@ const mergeLocales = (target: any, source: any) => {
return source
}

const resolveDesignerProps = (
node: TreeNode,
props: IDesignerControllerProps
) => {
return isFn(props) ? props(node) : props
}

const DESIGNER_GlobalRegistry = {
setComponentDesignerProps: (
componentName: string,
props: IDesignerControllerProps
) => {
const originProps = GlobalRegistry.getComponentDesignerProps(componentName)
DESIGNER_PROPS_MAP[componentName] = (node) => {
if (isFn(originProps)) {
if (isFn(props)) {
return { ...originProps(node), ...props(node) }
} else {
return { ...originProps(node), ...props }
}
} else if (isFn(props)) {
return { ...originProps, ...props(node) }
} else {
return { ...originProps, ...props }
COMPONENT_DESIGNER_PROPS_MAP[componentName] = (node) => {
return {
...resolveDesignerProps(node, originProps),
...resolveDesignerProps(node, props),
}
}
},

setNodeDesignerProps: (nodeName: string, props: IDesignerControllerProps) => {
const originProps = GlobalRegistry.getNodeDesignerProps(nodeName)
NODE_DESIGNER_PROPS_MAP[nodeName] = (node) => {
return {
...resolveDesignerProps(node, originProps),
...resolveDesignerProps(node, props),
}
}
},

getComponentDesignerProps: (componentName: string) => {
return DESIGNER_PROPS_MAP[componentName] || {}
return COMPONENT_DESIGNER_PROPS_MAP[componentName] || {}
},

getNodeDesignerProps: (nodeName: string) => {
return NODE_DESIGNER_PROPS_MAP[nodeName] || {}
},

registerDesignerProps: (map: IDesignerControllerPropsMap) => {
each(map, (props, componentName) => {
GlobalRegistry.setComponentDesignerProps(componentName, props)
registerDesignerProps: (
map: IDesignerControllerPropsMap,
type: 'component' | 'node' = 'component'
) => {
each(map, (props, name) => {
if (type === 'component') {
GlobalRegistry.setComponentDesignerProps(name, props)
} else {
GlobalRegistry.setNodeDesignerProps(name, props)
}
})
},

Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/shortcuts/MultiSelection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export const SelectAllNodes = new Shortcut({
if (operation) {
const tree = operation.tree
const selection = operation.selection
selection.batchSelect(tree.childrens)
selection.batchSelect(tree.descendants)
}
},
})
8 changes: 5 additions & 3 deletions packages/playground/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ GlobalRegistry.registerDesignerProps({
},
})

GlobalRegistry.setNodeDesignerProps('Card2', {
title: 'Card2',
})

GlobalDragSource.setSourcesByGroup('form', [
{
componentName: 'Field',
Expand All @@ -144,9 +148,7 @@ GlobalDragSource.setSourcesByGroup('form', [
},
{
componentName: 'Card',
designerProps: {
title: '卡片123',
},
name: 'Card2',
props: {
title: '卡片',
type: 'void',
Expand Down

0 comments on commit 864ae0f

Please sign in to comment.