plot-plan-designer
Version:
Design Editor Tools with React.js + ant.design + fabric.js
80 lines (79 loc) • 2.83 kB
JavaScript
import metadata from '../../../libs/fontawesome-5.2.0/metadata/icons.json';
import ActionNode from './action/ActionNode';
import DataNode from './data/DataNode';
import LogicNode from './logic/LogicNode';
import TriggerNode from './trigger/TriggerNode';
import { getNode } from '../configuration/NodeConfiguration';
import FilterNode from './logic/FilterNode';
import SwitchNode from './logic/SwitchNode';
import VirtualButtonNode from './trigger/VirtualButtonNode';
const defaultOption = {
fill: 'rgba(0, 0, 0, 0.3)',
stroke: 'rgba(255, 255, 255, 0)',
borderColor: 'rgba(0, 0, 0, 1)',
borderScaleFactor: 1.5,
deletable: true,
cloneable: true,
action: {
enabled: false,
},
tooltip: {
enabled: true,
},
animation: {
type: 'none',
},
userProperty: {},
trigger: {
enabled: false,
},
};
const NODES = {
ACTION: {
create: (option, descriptor) => new ActionNode(Object.assign(Object.assign(Object.assign({}, defaultOption), option), { descriptor })),
},
DATA: {
create: (option, descriptor) => new DataNode(Object.assign(Object.assign(Object.assign({}, defaultOption), option), { descriptor })),
},
LOGIC: {
create: (option, descriptor) => {
const node = getNode(descriptor.nodeClazz);
const options = Object.assign({}, defaultOption, { descriptor }, option);
switch (node) {
case 'FilterNode':
return new FilterNode(options);
case 'SwitchNode':
return new SwitchNode(options);
default:
return new LogicNode(options);
}
},
},
TRIGGER: {
create: (option, descriptor) => {
const node = getNode(descriptor.nodeClazz);
const options = Object.assign({}, defaultOption, { descriptor }, option);
switch (node) {
case 'VirtualButtonNode':
return new VirtualButtonNode(options);
default:
return new TriggerNode(options);
}
},
},
};
export default (descriptors) => {
return Object.keys(descriptors).reduce((prev, key) => {
return Object.assign(prev, descriptors[key].reduce((p, c) => {
return Object.assign(p, {
[getNode(c.nodeClazz)]: {
create: (option) => {
const iconMetadata = metadata[c.icon];
const icon = iconMetadata ? String.fromCodePoint(parseInt(iconMetadata.unicode, 16)) : '\uf03e';
return NODES[c.type].create(Object.assign(Object.assign({}, option), { icon }), c);
},
},
});
}, {}));
}, {});
};