@operato/flow 9.0.0 → 9.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/src/api/tasks.d.ts +7 -0
- package/dist/src/api/tasks.js +2517 -0
- package/dist/src/api/tasks.js.map +1 -0
- package/dist/src/base/anchor-instance.d.ts +30 -0
- package/dist/src/base/anchor-instance.js +82 -0
- package/dist/src/base/anchor-instance.js.map +1 -0
- package/dist/src/base/flow-edge-instance.d.ts +31 -0
- package/dist/src/base/flow-edge-instance.js +170 -0
- package/dist/src/base/flow-edge-instance.js.map +1 -0
- package/dist/src/base/flow-node-abstract.d.ts +49 -0
- package/dist/src/base/flow-node-abstract.js +199 -0
- package/dist/src/base/flow-node-abstract.js.map +1 -0
- package/dist/src/components/flow-debug-panel.d.ts +22 -0
- package/dist/src/components/flow-debug-panel.js +156 -0
- package/dist/src/components/flow-debug-panel.js.map +1 -0
- package/dist/src/components/flow-executor.d.ts +29 -0
- package/dist/src/components/flow-executor.js +88 -0
- package/dist/src/components/flow-executor.js.map +1 -0
- package/dist/src/components/flow-options-builder.d.ts +18 -0
- package/dist/src/components/flow-options-builder.js +145 -0
- package/dist/src/components/flow-options-builder.js.map +1 -0
- package/dist/src/components/flow-properties-panel.d.ts +22 -0
- package/dist/src/components/flow-properties-panel.js +232 -0
- package/dist/src/components/flow-properties-panel.js.map +1 -0
- package/dist/src/components/flow-side-panel.d.ts +9 -0
- package/dist/src/components/flow-side-panel.js +83 -0
- package/dist/src/components/flow-side-panel.js.map +1 -0
- package/dist/src/components/flow-sidebar.d.ts +7 -0
- package/dist/src/components/flow-sidebar.js +84 -0
- package/dist/src/components/flow-sidebar.js.map +1 -0
- package/dist/src/components/flow-toolbar.d.ts +15 -0
- package/dist/src/components/flow-toolbar.js +161 -0
- package/dist/src/components/flow-toolbar.js.map +1 -0
- package/dist/src/components/property-editor.d.ts +35 -0
- package/dist/src/components/property-editor.js +78 -0
- package/dist/src/components/property-editor.js.map +1 -0
- package/dist/src/components/property-panel/data-mapper-popup.d.ts +11 -0
- package/dist/src/components/property-panel/data-mapper-popup.js +86 -0
- package/dist/src/components/property-panel/data-mapper-popup.js.map +1 -0
- package/dist/src/components/property-panel/task-selection-popup.d.ts +10 -0
- package/dist/src/components/property-panel/task-selection-popup.js +106 -0
- package/dist/src/components/property-panel/task-selection-popup.js.map +1 -0
- package/dist/src/context/flow-context.d.ts +21 -0
- package/dist/src/context/flow-context.js +3 -0
- package/dist/src/context/flow-context.js.map +1 -0
- package/dist/src/context/flow-debug-context.d.ts +16 -0
- package/dist/src/context/flow-debug-context.js +3 -0
- package/dist/src/context/flow-debug-context.js.map +1 -0
- package/dist/src/context/flow-edit-context.d.ts +11 -0
- package/dist/src/context/flow-edit-context.js +3 -0
- package/dist/src/context/flow-edit-context.js.map +1 -0
- package/dist/src/handlers/dnd-event-handler.d.ts +9 -0
- package/dist/src/handlers/dnd-event-handler.js +41 -0
- package/dist/src/handlers/dnd-event-handler.js.map +1 -0
- package/dist/src/handlers/flow-event-handler.d.ts +20 -0
- package/dist/src/handlers/flow-event-handler.js +75 -0
- package/dist/src/handlers/flow-event-handler.js.map +1 -0
- package/dist/src/handlers/keydown-event-handler.d.ts +6 -0
- package/dist/src/handlers/keydown-event-handler.js +24 -0
- package/dist/src/handlers/keydown-event-handler.js.map +1 -0
- package/dist/src/handlers/pointer-event-handler.d.ts +9 -0
- package/dist/src/handlers/pointer-event-handler.js +118 -0
- package/dist/src/handlers/pointer-event-handler.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/nodes/decision.d.ts +16 -0
- package/dist/src/nodes/decision.js +43 -0
- package/dist/src/nodes/decision.js.map +1 -0
- package/dist/src/nodes/end-event.d.ts +14 -0
- package/dist/src/nodes/end-event.js +47 -0
- package/dist/src/nodes/end-event.js.map +1 -0
- package/dist/src/nodes/index.d.ts +5 -0
- package/dist/src/nodes/index.js +19 -0
- package/dist/src/nodes/index.js.map +1 -0
- package/dist/src/nodes/intermediate-event.d.ts +14 -0
- package/dist/src/nodes/intermediate-event.js +52 -0
- package/dist/src/nodes/intermediate-event.js.map +1 -0
- package/dist/src/nodes/iterator.d.ts +12 -0
- package/dist/src/nodes/iterator.js +29 -0
- package/dist/src/nodes/iterator.js.map +1 -0
- package/dist/src/nodes/select.d.ts +17 -0
- package/dist/src/nodes/select.js +71 -0
- package/dist/src/nodes/select.js.map +1 -0
- package/dist/src/nodes/start-event.d.ts +15 -0
- package/dist/src/nodes/start-event.js +46 -0
- package/dist/src/nodes/start-event.js.map +1 -0
- package/dist/src/nodes/subflow.d.ts +12 -0
- package/dist/src/nodes/subflow.js +30 -0
- package/dist/src/nodes/subflow.js.map +1 -0
- package/dist/src/nodes/task.d.ts +17 -0
- package/dist/src/nodes/task.js +60 -0
- package/dist/src/nodes/task.js.map +1 -0
- package/dist/src/ox-flow-editor.d.ts +94 -0
- package/dist/src/ox-flow-editor.js +426 -0
- package/dist/src/ox-flow-editor.js.map +1 -0
- package/dist/src/ox-flow-monitor.d.ts +24 -0
- package/dist/src/ox-flow-monitor.js +117 -0
- package/dist/src/ox-flow-monitor.js.map +1 -0
- package/dist/src/property-editors/ox-input-anchors.d.ts +12 -0
- package/dist/src/property-editors/ox-input-anchors.js +163 -0
- package/dist/src/property-editors/ox-input-anchors.js.map +1 -0
- package/dist/src/property-editors/ox-property-editor-anchors.d.ts +6 -0
- package/dist/src/property-editors/ox-property-editor-anchors.js +25 -0
- package/dist/src/property-editors/ox-property-editor-anchors.js.map +1 -0
- package/dist/src/types.d.ts +97 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/generate-mapping-scheme.d.ts +6 -0
- package/dist/src/utils/generate-mapping-scheme.js +50 -0
- package/dist/src/utils/generate-mapping-scheme.js.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { __decorate } from "tslib";
|
|
5
|
+
import '@material/web/icon/icon.js';
|
|
6
|
+
import { css, html } from 'lit';
|
|
7
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
8
|
+
import { OxFormField } from '@operato/input';
|
|
9
|
+
let OxInputAnchors = class OxInputAnchors extends OxFormField {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.value = [];
|
|
13
|
+
}
|
|
14
|
+
render() {
|
|
15
|
+
const anchors = this.value || [];
|
|
16
|
+
return html `
|
|
17
|
+
<fieldset>
|
|
18
|
+
<ul>
|
|
19
|
+
${anchors.map(({ id, angle, type }) => html `
|
|
20
|
+
<li>
|
|
21
|
+
<div data-id=${id}>${id}</div>
|
|
22
|
+
<div @click=${this.onClick.bind(this)} data-angle=${angle} data-type=${type}>
|
|
23
|
+
${type == 'in'
|
|
24
|
+
? html `
|
|
25
|
+
<md-icon ?selected=${angle == 180} data-angle="180">step_into</md-icon>
|
|
26
|
+
<md-icon ?selected=${angle == 90} data-angle="90">step_into</md-icon>
|
|
27
|
+
<md-icon ?selected=${angle == 270} data-angle="270">step_into</md-icon>
|
|
28
|
+
<md-icon ?selected=${angle == 0} data-angle="0">step_into</md-icon>
|
|
29
|
+
`
|
|
30
|
+
: html `
|
|
31
|
+
<md-icon ?selected=${angle == 180} data-angle="180">step_out</md-icon>
|
|
32
|
+
<md-icon ?selected=${angle == 90} data-angle="90">step_out</md-icon>
|
|
33
|
+
<md-icon ?selected=${angle == 270} data-angle="270">step_out</md-icon>
|
|
34
|
+
<md-icon ?selected=${angle == 0} data-angle="0">step_out</md-icon>
|
|
35
|
+
`}
|
|
36
|
+
</div>
|
|
37
|
+
</li>
|
|
38
|
+
`)}
|
|
39
|
+
</ul>
|
|
40
|
+
</fieldset>
|
|
41
|
+
`;
|
|
42
|
+
}
|
|
43
|
+
onClick(e) {
|
|
44
|
+
e.stopPropagation();
|
|
45
|
+
const target = e.target;
|
|
46
|
+
const currentTarget = e.currentTarget;
|
|
47
|
+
if (target === currentTarget || !target.hasAttribute('data-angle')) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const value = target.getAttribute('data-angle');
|
|
51
|
+
currentTarget.setAttribute('data-angle', value);
|
|
52
|
+
const lis = this.renderRoot.querySelectorAll('li');
|
|
53
|
+
this.value = Array.from(lis).map(li => {
|
|
54
|
+
var _a, _b;
|
|
55
|
+
const id = (_a = li.querySelector('[data-id]')) === null || _a === void 0 ? void 0 : _a.getAttribute('data-id');
|
|
56
|
+
const angle = (_b = li.querySelector('div[data-angle]')) === null || _b === void 0 ? void 0 : _b.getAttribute('data-angle');
|
|
57
|
+
const origin = this.value.find(anchor => anchor.id == id);
|
|
58
|
+
return { ...origin, angle: Number(angle) };
|
|
59
|
+
});
|
|
60
|
+
this.dispatchEvent(new CustomEvent('change', {
|
|
61
|
+
bubbles: true,
|
|
62
|
+
composed: true,
|
|
63
|
+
detail: this.value
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
OxInputAnchors.styles = [
|
|
68
|
+
css `
|
|
69
|
+
:host {
|
|
70
|
+
display: flex;
|
|
71
|
+
--md-icon-size: 1.4em;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
fieldset {
|
|
75
|
+
flex: 1;
|
|
76
|
+
font-size: 0.8em;
|
|
77
|
+
border: 0;
|
|
78
|
+
border-bottom: 1px solid;
|
|
79
|
+
background-color: var(--md-sys-color-surface-variant);
|
|
80
|
+
padding: var(--spacing-medium);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
ul {
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-direction: column;
|
|
86
|
+
gap: var(--spacing-small);
|
|
87
|
+
|
|
88
|
+
padding: 0;
|
|
89
|
+
margin: 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
li {
|
|
93
|
+
display: flex;
|
|
94
|
+
flex-direction: row;
|
|
95
|
+
align-items: center;
|
|
96
|
+
gap: var(--spacing-large);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
li > * {
|
|
100
|
+
flex: 1;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
div[data-id] {
|
|
104
|
+
text-align: right;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
div[data-angle] {
|
|
108
|
+
display: flex;
|
|
109
|
+
justify-content: space-between;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
md-icon {
|
|
113
|
+
color: var(--md-sys-color-on-background);
|
|
114
|
+
background-color: var(--md-sys-color-background);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
md-icon[selected] {
|
|
118
|
+
color: var(--md-sys-color-on-primary);
|
|
119
|
+
background-color: var(--md-sys-color-primary);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* 아이콘 회전 */
|
|
123
|
+
div[data-type='in'] md-icon[data-angle='270'] {
|
|
124
|
+
transform: rotate(0deg);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
div[data-type='in'] md-icon[data-angle='0'] {
|
|
128
|
+
transform: rotate(90deg);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
div[data-type='in'] md-icon[data-angle='180'] {
|
|
132
|
+
transform: rotate(-90deg);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
div[data-type='in'] md-icon[data-angle='90'] {
|
|
136
|
+
transform: rotate(180deg);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
div[data-type='out'] md-icon[data-angle='270'] {
|
|
140
|
+
transform: rotate(0deg);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
div[data-type='out'] md-icon[data-angle='0'] {
|
|
144
|
+
transform: rotate(90deg);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
div[data-type='out'] md-icon[data-angle='180'] {
|
|
148
|
+
transform: rotate(-90deg);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
div[data-type='out'] md-icon[data-angle='90'] {
|
|
152
|
+
transform: rotate(180deg);
|
|
153
|
+
}
|
|
154
|
+
`
|
|
155
|
+
];
|
|
156
|
+
__decorate([
|
|
157
|
+
property({ attribute: false })
|
|
158
|
+
], OxInputAnchors.prototype, "value", void 0);
|
|
159
|
+
OxInputAnchors = __decorate([
|
|
160
|
+
customElement('ox-input-anchors')
|
|
161
|
+
], OxInputAnchors);
|
|
162
|
+
export { OxInputAnchors };
|
|
163
|
+
//# sourceMappingURL=ox-input-anchors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ox-input-anchors.js","sourceRoot":"","sources":["../../../src/property-editors/ox-input-anchors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@material/web/icon/icon.js'\n\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { OxFormField } from '@operato/input'\nimport { AnchorModel } from '../types'\n\n@customElement('ox-input-anchors')\nexport class OxInputAnchors extends OxFormField<AnchorModel[]> {\n static styles = [\n css`\n :host {\n display: flex;\n --md-icon-size: 1.4em;\n }\n\n fieldset {\n flex: 1;\n font-size: 0.8em;\n border: 0;\n border-bottom: 1px solid;\n background-color: var(--md-sys-color-surface-variant);\n padding: var(--spacing-medium);\n }\n\n ul {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small);\n\n padding: 0;\n margin: 0;\n }\n\n li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--spacing-large);\n }\n\n li > * {\n flex: 1;\n }\n\n div[data-id] {\n text-align: right;\n }\n\n div[data-angle] {\n display: flex;\n justify-content: space-between;\n }\n\n md-icon {\n color: var(--md-sys-color-on-background);\n background-color: var(--md-sys-color-background);\n }\n\n md-icon[selected] {\n color: var(--md-sys-color-on-primary);\n background-color: var(--md-sys-color-primary);\n }\n\n /* 아이콘 회전 */\n div[data-type='in'] md-icon[data-angle='270'] {\n transform: rotate(0deg);\n }\n\n div[data-type='in'] md-icon[data-angle='0'] {\n transform: rotate(90deg);\n }\n\n div[data-type='in'] md-icon[data-angle='180'] {\n transform: rotate(-90deg);\n }\n\n div[data-type='in'] md-icon[data-angle='90'] {\n transform: rotate(180deg);\n }\n\n div[data-type='out'] md-icon[data-angle='270'] {\n transform: rotate(0deg);\n }\n\n div[data-type='out'] md-icon[data-angle='0'] {\n transform: rotate(90deg);\n }\n\n div[data-type='out'] md-icon[data-angle='180'] {\n transform: rotate(-90deg);\n }\n\n div[data-type='out'] md-icon[data-angle='90'] {\n transform: rotate(180deg);\n }\n `\n ]\n\n @property({ attribute: false }) value: AnchorModel[] = []\n\n render() {\n const anchors = this.value || []\n\n return html`\n <fieldset>\n <ul>\n ${anchors.map(\n ({ id, angle, type }) => html`\n <li>\n <div data-id=${id!}>${id}</div>\n <div @click=${this.onClick.bind(this)} data-angle=${angle!} data-type=${type}>\n ${type == 'in'\n ? html`\n <md-icon ?selected=${angle == 180} data-angle=\"180\">step_into</md-icon>\n <md-icon ?selected=${angle == 90} data-angle=\"90\">step_into</md-icon>\n <md-icon ?selected=${angle == 270} data-angle=\"270\">step_into</md-icon>\n <md-icon ?selected=${angle == 0} data-angle=\"0\">step_into</md-icon>\n `\n : html`\n <md-icon ?selected=${angle == 180} data-angle=\"180\">step_out</md-icon>\n <md-icon ?selected=${angle == 90} data-angle=\"90\">step_out</md-icon>\n <md-icon ?selected=${angle == 270} data-angle=\"270\">step_out</md-icon>\n <md-icon ?selected=${angle == 0} data-angle=\"0\">step_out</md-icon>\n `}\n </div>\n </li>\n `\n )}\n </ul>\n </fieldset>\n `\n }\n\n onClick(e: MouseEvent) {\n e.stopPropagation()\n\n const target = e.target as Element\n const currentTarget = e.currentTarget as Element\n\n if (target === currentTarget || !target.hasAttribute('data-angle')) {\n return\n }\n\n const value = target.getAttribute('data-angle') as string\n\n currentTarget.setAttribute('data-angle', value)\n\n const lis = this.renderRoot.querySelectorAll('li')\n this.value = Array.from(lis).map(li => {\n const id = li.querySelector('[data-id]')?.getAttribute('data-id')!\n const angle = li.querySelector('div[data-angle]')?.getAttribute('data-angle')\n const origin = this.value.find(anchor => anchor.id == id)!\n\n return { ...origin, angle: Number(angle) }\n })\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import './ox-input-anchors';
|
|
2
|
+
import { OxPropertyEditor, PropertySpec } from '@operato/property-editor';
|
|
3
|
+
import { AnchorModel } from '../types';
|
|
4
|
+
export declare class PropertyEditorAnchors extends OxPropertyEditor {
|
|
5
|
+
editorTemplate(value: AnchorModel[], spec: PropertySpec): import("lit-html").TemplateResult<1>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import './ox-input-anchors';
|
|
3
|
+
import { html } from 'lit';
|
|
4
|
+
import { customElement } from 'lit/decorators.js';
|
|
5
|
+
import { OxPropertyEditor } from '@operato/property-editor';
|
|
6
|
+
let PropertyEditorAnchors = class PropertyEditorAnchors extends OxPropertyEditor {
|
|
7
|
+
editorTemplate(value, spec) {
|
|
8
|
+
const { defaultValue = [] } = spec;
|
|
9
|
+
value || (value = []);
|
|
10
|
+
const anchors = defaultValue
|
|
11
|
+
.map(({ id, ...others }) => {
|
|
12
|
+
const anchor = value.find(v => v.id == id);
|
|
13
|
+
if (anchor) {
|
|
14
|
+
return { ...others, ...anchor };
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
.filter(Boolean);
|
|
18
|
+
return html ` <ox-input-anchors .value=${anchors} fullwidth></ox-input-anchors> `;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
PropertyEditorAnchors = __decorate([
|
|
22
|
+
customElement('ox-property-editor-anchors')
|
|
23
|
+
], PropertyEditorAnchors);
|
|
24
|
+
export { PropertyEditorAnchors };
|
|
25
|
+
//# sourceMappingURL=ox-property-editor-anchors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ox-property-editor-anchors.js","sourceRoot":"","sources":["../../../src/property-editors/ox-property-editor-anchors.ts"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,CAAA;AAE3B,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAAgB,MAAM,0BAA0B,CAAA;AAIlE,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,gBAAgB;IACzD,cAAc,CAAC,KAAoB,EAAE,IAAkB;QACrD,MAAM,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,IAAI,CAAA;QAClC,KAAK,KAAL,KAAK,GAAK,EAAE,EAAA;QAEZ,MAAM,OAAO,GAAI,YAA8B;aAC5C,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;YAC1C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;YACjC,CAAC;QACH,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAkB,CAAA;QAEnC,OAAO,IAAI,CAAA,6BAA6B,OAAO,iCAAiC,CAAA;IAClF,CAAC;CACF,CAAA;AAhBY,qBAAqB;IADjC,aAAa,CAAC,4BAA4B,CAAC;GAC/B,qBAAqB,CAgBjC","sourcesContent":["import './ox-input-anchors'\n\nimport { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxPropertyEditor, PropertySpec } from '@operato/property-editor'\nimport { AnchorModel } from '../types'\n\n@customElement('ox-property-editor-anchors')\nexport class PropertyEditorAnchors extends OxPropertyEditor {\n editorTemplate(value: AnchorModel[], spec: PropertySpec) {\n const { defaultValue = [] } = spec\n value ||= []\n\n const anchors = (defaultValue as AnchorModel[])\n .map(({ id, ...others }) => {\n const anchor = value.find(v => v.id == id)\n if (anchor) {\n return { ...others, ...anchor }\n }\n })\n .filter(Boolean) as AnchorModel[]\n\n return html` <ox-input-anchors .value=${anchors} fullwidth></ox-input-anchors> `\n }\n}\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Mapping } from '@operato/data-mapper';
|
|
2
|
+
import { PropertySpec } from '@operato/property-editor';
|
|
3
|
+
import { SVGTemplateResult } from 'lit';
|
|
4
|
+
export interface FlowDataSchema {
|
|
5
|
+
type: 'object' | 'array' | 'string' | 'number' | 'boolean';
|
|
6
|
+
properties?: {
|
|
7
|
+
[key: string]: FlowDataSchema;
|
|
8
|
+
};
|
|
9
|
+
required?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface FlowNodeDataSchema {
|
|
12
|
+
inputSchema: FlowDataSchema | undefined;
|
|
13
|
+
outputSchema: FlowDataSchema | undefined;
|
|
14
|
+
dataSourceSchema: FlowDataSchema | undefined;
|
|
15
|
+
}
|
|
16
|
+
export interface FlowEntityModel {
|
|
17
|
+
id: string;
|
|
18
|
+
type: string;
|
|
19
|
+
subtype?: string;
|
|
20
|
+
label?: string;
|
|
21
|
+
options?: {
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface FlowEntity extends FlowEntityModel {
|
|
26
|
+
optionsSpec: PropertySpec[];
|
|
27
|
+
selected: boolean;
|
|
28
|
+
update: (model: Partial<FlowEntityModel>) => void;
|
|
29
|
+
updateOptions: (options: {
|
|
30
|
+
[key: string]: any;
|
|
31
|
+
}) => void;
|
|
32
|
+
}
|
|
33
|
+
/** 앵커 타입 */
|
|
34
|
+
export interface AnchorModel extends FlowEntityModel {
|
|
35
|
+
type: 'in' | 'out';
|
|
36
|
+
pos: {
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
};
|
|
40
|
+
angle?: number;
|
|
41
|
+
weight?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface Anchor extends AnchorModel {
|
|
44
|
+
node: FlowNode;
|
|
45
|
+
render(): SVGTemplateResult;
|
|
46
|
+
}
|
|
47
|
+
/** 플로우 노드 */
|
|
48
|
+
export interface FlowNodeModel extends FlowEntityModel, FlowNodeDataSchema {
|
|
49
|
+
pos: {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
};
|
|
53
|
+
size: {
|
|
54
|
+
w: number;
|
|
55
|
+
h: number;
|
|
56
|
+
};
|
|
57
|
+
anchorsOption?: {
|
|
58
|
+
id: string;
|
|
59
|
+
[key: string]: any;
|
|
60
|
+
}[];
|
|
61
|
+
}
|
|
62
|
+
export interface FlowNode extends FlowEntity, FlowNodeModel {
|
|
63
|
+
anchors: Anchor[];
|
|
64
|
+
anchorModels: AnchorModel[];
|
|
65
|
+
findAnchor(id: string): Anchor | undefined;
|
|
66
|
+
render(): SVGTemplateResult;
|
|
67
|
+
renderNode(): SVGTemplateResult;
|
|
68
|
+
}
|
|
69
|
+
export interface AnchorPointer {
|
|
70
|
+
nodeId: string;
|
|
71
|
+
anchorId: string;
|
|
72
|
+
}
|
|
73
|
+
/** 플로우 엣지 */
|
|
74
|
+
export interface FlowEdgeModel extends FlowEntityModel {
|
|
75
|
+
type: string;
|
|
76
|
+
from: AnchorPointer;
|
|
77
|
+
to: AnchorPointer;
|
|
78
|
+
weight?: number;
|
|
79
|
+
dataMappings: Mapping[];
|
|
80
|
+
}
|
|
81
|
+
export interface FlowEdge extends FlowEntity, FlowEdgeModel {
|
|
82
|
+
fromAnchor?: Anchor;
|
|
83
|
+
toAnchor?: Anchor;
|
|
84
|
+
render(): SVGTemplateResult;
|
|
85
|
+
}
|
|
86
|
+
export type EditorMode = 'edit' | 'debug';
|
|
87
|
+
export type FlowModel = {
|
|
88
|
+
nodes: FlowNodeModel[];
|
|
89
|
+
edges: FlowEdgeModel[];
|
|
90
|
+
};
|
|
91
|
+
export type FlowNodeImplementation = new (...args: any[]) => FlowNode;
|
|
92
|
+
export type TaskType = {
|
|
93
|
+
name: string;
|
|
94
|
+
description: string | null;
|
|
95
|
+
help: string | null;
|
|
96
|
+
parameterSpec: PropertySpec[];
|
|
97
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Mapping } from '@operato/data-mapper'\nimport { PropertySpec } from '@operato/property-editor'\nimport { SVGTemplateResult } from 'lit'\n\nexport interface FlowDataSchema {\n type: 'object' | 'array' | 'string' | 'number' | 'boolean'\n properties?: { [key: string]: FlowDataSchema }\n required?: string[]\n}\n\nexport interface FlowNodeDataSchema {\n inputSchema: FlowDataSchema | undefined\n outputSchema: FlowDataSchema | undefined\n dataSourceSchema: FlowDataSchema | undefined\n}\n\n// export interface FlowDataMapping {\n// toField: string\n// mappingType: 'direct' | 'expression'\n// fromFields: { nodeId: string; field: string }[] // ⬅ 명확한 데이터 출처 명시\n// expression?: string\n// }\n\nexport interface FlowEntityModel {\n id: string\n type: string\n subtype?: string\n label?: string\n options?: { [key: string]: any }\n}\n\nexport interface FlowEntity extends FlowEntityModel {\n optionsSpec: PropertySpec[]\n selected: boolean\n update: (model: Partial<FlowEntityModel>) => void\n updateOptions: (options: { [key: string]: any }) => void\n}\n\n/** 앵커 타입 */\nexport interface AnchorModel extends FlowEntityModel {\n type: 'in' | 'out'\n pos: { x: number; y: number }\n angle?: number\n weight?: number\n}\n\nexport interface Anchor extends AnchorModel {\n node: FlowNode\n render(): SVGTemplateResult\n}\n\n/** 플로우 노드 */\nexport interface FlowNodeModel extends FlowEntityModel, FlowNodeDataSchema {\n pos: { x: number; y: number }\n size: { w: number; h: number }\n anchorsOption?: { id: string; [key: string]: any }[]\n}\n\nexport interface FlowNode extends FlowEntity, FlowNodeModel {\n anchors: Anchor[]\n anchorModels: AnchorModel[]\n findAnchor(id: string): Anchor | undefined\n render(): SVGTemplateResult\n renderNode(): SVGTemplateResult\n}\n\nexport interface AnchorPointer {\n nodeId: string\n anchorId: string\n}\n\n/** 플로우 엣지 */\nexport interface FlowEdgeModel extends FlowEntityModel {\n type: string\n from: AnchorPointer\n to: AnchorPointer\n weight?: number\n dataMappings: Mapping[]\n}\n\nexport interface FlowEdge extends FlowEntity, FlowEdgeModel {\n fromAnchor?: Anchor\n toAnchor?: Anchor\n render(): SVGTemplateResult\n}\n\nexport type EditorMode = 'edit' | 'debug'\n\nexport type FlowModel = { nodes: FlowNodeModel[]; edges: FlowEdgeModel[] }\n\nexport type FlowNodeImplementation = new (...args: any[]) => FlowNode\n\nexport type TaskType = {\n name: string\n description: string | null\n help: string | null\n parameterSpec: PropertySpec[]\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TreeNode } from '@operato/data-mapper';
|
|
2
|
+
import { FlowDataSchema, FlowNode } from '../types.js';
|
|
3
|
+
import { PropertySpec } from '@operato/property-editor';
|
|
4
|
+
export declare function convertNodesToTree(nodes: FlowNode[], except: FlowNode[]): TreeNode;
|
|
5
|
+
export declare function convertSchemaToTree(schema: FlowDataSchema, rootLabel: string): TreeNode;
|
|
6
|
+
export declare function convertPropertySpecsToSchema(propertySpecs: PropertySpec[]): FlowDataSchema;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export function convertNodesToTree(nodes, except) {
|
|
2
|
+
const schema = {
|
|
3
|
+
type: 'object',
|
|
4
|
+
properties: nodes
|
|
5
|
+
.filter(node => !except.includes(node))
|
|
6
|
+
.reduce((sum, node) => {
|
|
7
|
+
const { type, subtype, label, outputSchema } = node;
|
|
8
|
+
sum[label || subtype || type] = outputSchema;
|
|
9
|
+
return sum;
|
|
10
|
+
}, {})
|
|
11
|
+
};
|
|
12
|
+
return convertSchemaToTree(schema, 'Context Data');
|
|
13
|
+
}
|
|
14
|
+
export function convertSchemaToTree(schema, rootLabel) {
|
|
15
|
+
const convert = (schema, idPrefix) => {
|
|
16
|
+
return {
|
|
17
|
+
id: idPrefix,
|
|
18
|
+
label: idPrefix || rootLabel,
|
|
19
|
+
multiplicity: schema.type === 'array' ? '*' : '1',
|
|
20
|
+
children: schema.properties
|
|
21
|
+
? Object.entries(schema.properties).map(([key, subSchema]) => convert(subSchema, `${key}`))
|
|
22
|
+
: undefined
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
return convert(schema, rootLabel.toLowerCase());
|
|
26
|
+
}
|
|
27
|
+
export function convertPropertySpecsToSchema(propertySpecs) {
|
|
28
|
+
return {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: propertySpecs.reduce((sum, propertySpec) => {
|
|
31
|
+
const { name, type } = propertySpec;
|
|
32
|
+
let schemaType = 'string';
|
|
33
|
+
switch (type) {
|
|
34
|
+
case 'string':
|
|
35
|
+
case 'number':
|
|
36
|
+
case 'boolena':
|
|
37
|
+
schemaType = type;
|
|
38
|
+
break;
|
|
39
|
+
case 'checkbox':
|
|
40
|
+
schemaType = 'boolean';
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
schemaType = 'object';
|
|
44
|
+
}
|
|
45
|
+
sum[name] = { type: schemaType };
|
|
46
|
+
return sum;
|
|
47
|
+
}, {})
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=generate-mapping-scheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-mapping-scheme.js","sourceRoot":"","sources":["../../../src/utils/generate-mapping-scheme.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,kBAAkB,CAAC,KAAiB,EAAE,MAAkB;IACtE,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,KAAK;aACd,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;YACnD,GAAG,CAAC,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,YAAY,CAAA;YAC5C,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAS,CAAC;KAChB,CAAA;IAED,OAAO,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAsB,EAAE,SAAiB;IAC3E,MAAM,OAAO,GAAG,CAAC,MAAsB,EAAE,QAAgB,EAAY,EAAE;QACrE,OAAO;YACL,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,QAAQ,IAAI,SAAS;YAC5B,YAAY,EAAE,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACjD,QAAQ,EAAE,MAAM,CAAC,UAAU;gBACzB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;gBAC3F,CAAC,CAAC,SAAS;SACd,CAAA;IACH,CAAC,CAAA;IAED,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,aAA6B;IACxE,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,aAAa,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE;YACpB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,YAAY,CAAA;YACnC,IAAI,UAAU,GAAyD,QAAQ,CAAA;YAE/E,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ,CAAC;gBACd,KAAK,SAAS;oBACZ,UAAU,GAAG,IAAW,CAAA;oBACxB,MAAK;gBACP,KAAK,UAAU;oBACb,UAAU,GAAG,SAAS,CAAA;oBACtB,MAAK;gBACP;oBACE,UAAU,GAAG,QAAQ,CAAA;YACzB,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;YAEhC,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,EAAuC,CACxC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { TreeNode } from '@operato/data-mapper'\nimport { FlowDataSchema, FlowNode } from '../types.js'\nimport { PropertySpec } from '@operato/property-editor'\n\nexport function convertNodesToTree(nodes: FlowNode[], except: FlowNode[]): TreeNode {\n const schema: FlowDataSchema = {\n type: 'object',\n properties: nodes\n .filter(node => !except.includes(node))\n .reduce((sum, node) => {\n const { type, subtype, label, outputSchema } = node\n sum[label || subtype || type] = outputSchema\n return sum\n }, {} as any)\n }\n\n return convertSchemaToTree(schema, 'Context Data')\n}\n\nexport function convertSchemaToTree(schema: FlowDataSchema, rootLabel: string): TreeNode {\n const convert = (schema: FlowDataSchema, idPrefix: string): TreeNode => {\n return {\n id: idPrefix,\n label: idPrefix || rootLabel,\n multiplicity: schema.type === 'array' ? '*' : '1',\n children: schema.properties\n ? Object.entries(schema.properties).map(([key, subSchema]) => convert(subSchema, `${key}`))\n : undefined\n }\n }\n\n return convert(schema, rootLabel.toLowerCase())\n}\n\nexport function convertPropertySpecsToSchema(propertySpecs: PropertySpec[]): FlowDataSchema {\n return {\n type: 'object',\n properties: propertySpecs.reduce(\n (sum, propertySpec) => {\n const { name, type } = propertySpec\n let schemaType: 'string' | 'number' | 'boolean' | 'object' | 'array' = 'string'\n\n switch (type) {\n case 'string':\n case 'number':\n case 'boolena':\n schemaType = type as any\n break\n case 'checkbox':\n schemaType = 'boolean'\n break\n default:\n schemaType = 'object'\n }\n\n sum[name] = { type: schemaType }\n\n return sum\n },\n {} as { [key: string]: FlowDataSchema }\n )\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@operato/flow",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.2",
|
|
4
4
|
"description": "Visual Scenario Flow Builder & Viewer",
|
|
5
5
|
"author": "heartyoh",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"main": "dist/index.js",
|
|
8
|
-
"module": "dist/index.js",
|
|
7
|
+
"main": "dist/src/index.js",
|
|
8
|
+
"module": "dist/src/index.js",
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"operato": true,
|
|
11
11
|
"publishConfig": {
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@lit/context": "1.1.4",
|
|
46
|
-
"@operato/data-mapper": "^9.0.
|
|
47
|
-
"@operato/popup": "^9.0.
|
|
48
|
-
"@operato/property-editor": "^9.0.
|
|
46
|
+
"@operato/data-mapper": "^9.0.2",
|
|
47
|
+
"@operato/popup": "^9.0.1",
|
|
48
|
+
"@operato/property-editor": "^9.0.1",
|
|
49
49
|
"dagre-esm": "^0.8.5",
|
|
50
50
|
"i18next": "^24.2.1",
|
|
51
51
|
"lit": "^3.1.2",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"@hatiolab/prettier-config": "^1.0.0",
|
|
57
57
|
"@open-wc/eslint-config": "^12.0.3",
|
|
58
58
|
"@open-wc/testing": "^4.0.0",
|
|
59
|
-
"@operato/styles": "^9.0.
|
|
59
|
+
"@operato/styles": "^9.0.1",
|
|
60
60
|
"@types/dagre": "^0.7.52",
|
|
61
61
|
"@types/lodash-es": "^4.17.5",
|
|
62
62
|
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
@@ -86,5 +86,5 @@
|
|
|
86
86
|
"prettier --write"
|
|
87
87
|
]
|
|
88
88
|
},
|
|
89
|
-
"gitHead": "
|
|
89
|
+
"gitHead": "595a66745b97ab3f364e870aabff7b05c7bf3da8"
|
|
90
90
|
}
|