sequential-workflow-designer-angular 0.5.4
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/LICENSE +9 -0
- package/README.md +162 -0
- package/designer.component.d.ts +38 -0
- package/esm2020/designer.component.mjs +149 -0
- package/esm2020/public-api.mjs +3 -0
- package/esm2020/sequential-workflow-designer-angular.mjs +5 -0
- package/esm2020/sequential-workflow-designer.module.mjs +18 -0
- package/fesm2015/sequential-workflow-designer-angular.mjs +171 -0
- package/fesm2015/sequential-workflow-designer-angular.mjs.map +1 -0
- package/fesm2020/sequential-workflow-designer-angular.mjs +171 -0
- package/fesm2020/sequential-workflow-designer-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +49 -0
- package/public-api.d.ts +2 -0
- package/sequential-workflow-designer.module.d.ts +8 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 N4NO.com
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
# Sequential Workflow Designer for Angular
|
|
4
|
+
|
|
5
|
+
[](https://actions-badge.atrox.dev/b4rtaz/sequential-workflow-designer/goto?ref=main) [](/LICENSE) [](https://npmjs.org/package/sequential-workflow-designer-angular)
|
|
6
|
+
|
|
7
|
+
Angular wrapper for the [Sequential Workflow Designer](https://github.com/nocode-js/sequential-workflow-designer) component.
|
|
8
|
+
|
|
9
|
+
## 🚀 Installation
|
|
10
|
+
|
|
11
|
+
Install the following packages by [NPM](https://www.npmjs.com/) command:
|
|
12
|
+
|
|
13
|
+
`npm i sequential-workflow-designer sequential-workflow-designer-angular`
|
|
14
|
+
|
|
15
|
+
Add CSS files to your `angular.json` file.
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"projects": {
|
|
20
|
+
"YOUR_APP": {
|
|
21
|
+
"architect": {
|
|
22
|
+
"build": {
|
|
23
|
+
"styles": [
|
|
24
|
+
"./node_modules/sequential-workflow-designer/css/designer.css",
|
|
25
|
+
"./node_modules/sequential-workflow-designer/css/designer-light.css",
|
|
26
|
+
"./node_modules/sequential-workflow-designer/css/designer-dark.css"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 🎬 Usage
|
|
36
|
+
|
|
37
|
+
Import the module:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { SequentialWorkflowDesignerModule } from 'sequential-workflow-designer-angular';
|
|
41
|
+
|
|
42
|
+
@NgModule({
|
|
43
|
+
imports: [
|
|
44
|
+
SequentialWorkflowDesignerModule,
|
|
45
|
+
// ...
|
|
46
|
+
],
|
|
47
|
+
// ...
|
|
48
|
+
})
|
|
49
|
+
export class AppModule {}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Define a definition and a configuration.
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
export class AppComponent {
|
|
56
|
+
private designer?: Designer;
|
|
57
|
+
public definition: Definition = { /* ... */ };
|
|
58
|
+
public toolboxConfiguration: ToolboxConfiguration = { /* ... */ };
|
|
59
|
+
public stepsConfiguration: StepsConfiguration = { /* ... */ };
|
|
60
|
+
// ...
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Define the following methods to handle the designer's events.
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
export class AppComponent {
|
|
68
|
+
//...
|
|
69
|
+
public onDesignerReady(designer: Designer) {
|
|
70
|
+
this.designer = designer;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public onDefinitionChanged(definition: Definition) {
|
|
74
|
+
this.definition = definition;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Additionally we need to define a few utils methods to handle the editor's logic.
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
export class AppComponent {
|
|
83
|
+
// ...
|
|
84
|
+
public updateName(step: Step, event: Event, context: StepEditorContext) {
|
|
85
|
+
step.name = (event.target as HTMLInputElement).value;
|
|
86
|
+
context.notifyNameChanged();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public updateProperty(properties: Properties, name: string, event: Event, context: GlobalEditorContext | StepEditorContext) {
|
|
90
|
+
properties[name] = (event.target as HTMLInputElement).value;
|
|
91
|
+
context.notifyPropertiesChanged();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Create a template for the global editor. The value of the `editor` variable implements the `GlobalEditorWrapper` interface.
|
|
97
|
+
|
|
98
|
+
```html
|
|
99
|
+
<ng-template #globalEditor let-editor>
|
|
100
|
+
<h2>Global Editor</h2>
|
|
101
|
+
|
|
102
|
+
<h3>Velocity</h3>
|
|
103
|
+
<input type="number"
|
|
104
|
+
[value]="editor.definition.properties.velocity"
|
|
105
|
+
(input)="updateProperty(editor.definition.properties, 'velocity', $event, editor.context)" />
|
|
106
|
+
</ng-template>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
interface GlobalEditorWrapper {
|
|
111
|
+
definition: Definition;
|
|
112
|
+
context: GlobalEditorContext;
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Create a template for the step editor. The value of the `editor` variable implements the `StepEditorWrapper` interface.
|
|
117
|
+
|
|
118
|
+
```html
|
|
119
|
+
<ng-template #stepEditor let-editor>
|
|
120
|
+
<h2>Step Editor</h2>
|
|
121
|
+
|
|
122
|
+
<h3>Name</h3>
|
|
123
|
+
<input type="text"
|
|
124
|
+
[value]="editor.step.name"
|
|
125
|
+
(input)="updateName(editor.step, $event, editor.context)" />
|
|
126
|
+
|
|
127
|
+
<h3>Velocity</h3>
|
|
128
|
+
<input type="number"
|
|
129
|
+
[value]="editor.step.properties.velocity"
|
|
130
|
+
(input)="updateProperty(editor.step.properties, 'velocity', $event, editor.context)" />
|
|
131
|
+
</ng-template>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
interface StepEditorWrapper {
|
|
136
|
+
step: Step;
|
|
137
|
+
context: StepEditorContext;
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
At the end attach the designer:
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<sqd-designer
|
|
145
|
+
theme="light"
|
|
146
|
+
[undoStackSize]="10"
|
|
147
|
+
[definition]="startDefinition"
|
|
148
|
+
[toolboxConfiguration]="toolboxConfiguration"
|
|
149
|
+
[stepsConfiguration]="stepsConfiguration"
|
|
150
|
+
[areEditorsHidden]="false"
|
|
151
|
+
[globalEditor]="globalEditor"
|
|
152
|
+
[stepEditor]="stepEditor"
|
|
153
|
+
(onReady)="onDesignerReady($event)"
|
|
154
|
+
(onDefinitionChanged)="onDefinitionChanged($event)">
|
|
155
|
+
</sqd-designer>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Check the [demo project](https://github.com/nocode-js/sequential-workflow-designer/tree/main/demos/angular-app).
|
|
159
|
+
|
|
160
|
+
## 💡 License
|
|
161
|
+
|
|
162
|
+
This project is released under the MIT license.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AfterViewInit, EventEmitter, NgZone, OnChanges, OnDestroy, SimpleChanges, TemplateRef } from '@angular/core';
|
|
2
|
+
import { Definition, Designer, DesignerExtension, GlobalEditorContext, Step, StepEditorContext, StepsConfiguration, ToolboxConfiguration } from 'sequential-workflow-designer';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export interface GlobalEditorWrapper {
|
|
5
|
+
definition: Definition;
|
|
6
|
+
context: GlobalEditorContext;
|
|
7
|
+
}
|
|
8
|
+
export interface StepEditorWrapper {
|
|
9
|
+
step: Step;
|
|
10
|
+
context: StepEditorContext;
|
|
11
|
+
}
|
|
12
|
+
export declare class DesignerComponent implements AfterViewInit, OnChanges, OnDestroy {
|
|
13
|
+
private readonly ngZone;
|
|
14
|
+
private designer?;
|
|
15
|
+
private lastEmbeddedView?;
|
|
16
|
+
private placeholder?;
|
|
17
|
+
theme?: string;
|
|
18
|
+
undoStackSize?: number;
|
|
19
|
+
definition?: Definition;
|
|
20
|
+
stepsConfiguration?: StepsConfiguration;
|
|
21
|
+
toolboxConfiguration?: ToolboxConfiguration;
|
|
22
|
+
extensions?: DesignerExtension[];
|
|
23
|
+
areEditorsHidden?: boolean;
|
|
24
|
+
globalEditor?: TemplateRef<unknown>;
|
|
25
|
+
stepEditor?: TemplateRef<unknown>;
|
|
26
|
+
readonly onReady: EventEmitter<Designer>;
|
|
27
|
+
readonly onDefinitionChanged: EventEmitter<Definition>;
|
|
28
|
+
constructor(ngZone: NgZone);
|
|
29
|
+
ngAfterViewInit(): void;
|
|
30
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
31
|
+
ngOnDestroy(): void;
|
|
32
|
+
private attach;
|
|
33
|
+
private readonly globalEditorProvider;
|
|
34
|
+
private readonly stepEditorProvider;
|
|
35
|
+
private editorProvider;
|
|
36
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DesignerComponent, never>;
|
|
37
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DesignerComponent, "sqd-designer", never, { "theme": "theme"; "undoStackSize": "undoStackSize"; "definition": "definition"; "stepsConfiguration": "stepsConfiguration"; "toolboxConfiguration": "toolboxConfiguration"; "extensions": "extensions"; "areEditorsHidden": "areEditorsHidden"; "globalEditor": "globalEditor"; "stepEditor": "stepEditor"; }, { "onReady": "onReady"; "onDefinitionChanged": "onDefinitionChanged"; }, never, never, false, never>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { Designer } from 'sequential-workflow-designer';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class DesignerComponent {
|
|
5
|
+
constructor(ngZone) {
|
|
6
|
+
this.ngZone = ngZone;
|
|
7
|
+
this.onReady = new EventEmitter();
|
|
8
|
+
this.onDefinitionChanged = new EventEmitter();
|
|
9
|
+
this.globalEditorProvider = (definition, context) => {
|
|
10
|
+
if (!this.globalEditor) {
|
|
11
|
+
throw new Error('Input "globalEditor" is not set');
|
|
12
|
+
}
|
|
13
|
+
return this.editorProvider(this.globalEditor, {
|
|
14
|
+
definition,
|
|
15
|
+
context
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
this.stepEditorProvider = (step, context) => {
|
|
19
|
+
if (!this.stepEditor) {
|
|
20
|
+
throw new Error('Input "stepEditor" is not set');
|
|
21
|
+
}
|
|
22
|
+
return this.editorProvider(this.stepEditor, {
|
|
23
|
+
step,
|
|
24
|
+
context
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
ngAfterViewInit() {
|
|
29
|
+
this.attach();
|
|
30
|
+
}
|
|
31
|
+
ngOnChanges(changes) {
|
|
32
|
+
const isFirstChange = Object.keys(changes).every(key => changes[key].firstChange);
|
|
33
|
+
if (isFirstChange) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (this.designer && changes['definition'] && changes['definition'].currentValue === this.designer.getDefinition()) {
|
|
37
|
+
// The same reference = no change.
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.attach();
|
|
41
|
+
}
|
|
42
|
+
ngOnDestroy() {
|
|
43
|
+
if (this.lastEmbeddedView) {
|
|
44
|
+
this.lastEmbeddedView.destroy();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
attach() {
|
|
48
|
+
this.ngZone.runOutsideAngular(() => {
|
|
49
|
+
if (!this.placeholder) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!this.definition) {
|
|
53
|
+
throw new Error('Input "definition" is not set');
|
|
54
|
+
}
|
|
55
|
+
if (!this.stepsConfiguration) {
|
|
56
|
+
throw new Error('Input "stepsConfiguration" is not set');
|
|
57
|
+
}
|
|
58
|
+
if (!this.toolboxConfiguration) {
|
|
59
|
+
throw new Error('Input "toolboxConfiguration" is not set');
|
|
60
|
+
}
|
|
61
|
+
if (this.designer) {
|
|
62
|
+
this.designer.destroy();
|
|
63
|
+
this.designer = undefined;
|
|
64
|
+
}
|
|
65
|
+
const designer = Designer.create(this.placeholder.nativeElement, this.definition, {
|
|
66
|
+
theme: this.theme,
|
|
67
|
+
undoStackSize: this.undoStackSize,
|
|
68
|
+
editors: {
|
|
69
|
+
isHidden: this.areEditorsHidden,
|
|
70
|
+
globalEditorProvider: this.globalEditorProvider,
|
|
71
|
+
stepEditorProvider: this.stepEditorProvider
|
|
72
|
+
},
|
|
73
|
+
steps: this.stepsConfiguration,
|
|
74
|
+
toolbox: this.toolboxConfiguration,
|
|
75
|
+
extensions: this.extensions
|
|
76
|
+
});
|
|
77
|
+
designer.onReady.subscribe(() => {
|
|
78
|
+
this.ngZone.run(() => {
|
|
79
|
+
this.onReady.emit(designer);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
designer.onDefinitionChanged.subscribe(() => {
|
|
83
|
+
this.ngZone.run(() => {
|
|
84
|
+
this.onDefinitionChanged.emit(designer.getDefinition());
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
this.designer = designer;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
editorProvider(templateRef, editor) {
|
|
91
|
+
return this.ngZone.run(() => {
|
|
92
|
+
if (this.lastEmbeddedView) {
|
|
93
|
+
this.lastEmbeddedView.destroy();
|
|
94
|
+
this.lastEmbeddedView = undefined;
|
|
95
|
+
}
|
|
96
|
+
this.lastEmbeddedView = templateRef.createEmbeddedView({
|
|
97
|
+
$implicit: editor
|
|
98
|
+
});
|
|
99
|
+
this.lastEmbeddedView.detectChanges();
|
|
100
|
+
const container = document.createElement('div');
|
|
101
|
+
container.className = 'sqd-editor-angular';
|
|
102
|
+
for (const node of this.lastEmbeddedView.rootNodes) {
|
|
103
|
+
container.appendChild(node);
|
|
104
|
+
}
|
|
105
|
+
return container;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
DesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: DesignerComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
110
|
+
DesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: DesignerComponent, selector: "sqd-designer", inputs: { theme: "theme", undoStackSize: "undoStackSize", definition: "definition", stepsConfiguration: "stepsConfiguration", toolboxConfiguration: "toolboxConfiguration", extensions: "extensions", areEditorsHidden: "areEditorsHidden", globalEditor: "globalEditor", stepEditor: "stepEditor" }, outputs: { onReady: "onReady", onDefinitionChanged: "onDefinitionChanged" }, viewQueries: [{ propertyName: "placeholder", first: true, predicate: ["placeholder"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" });
|
|
111
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: DesignerComponent, decorators: [{
|
|
112
|
+
type: Component,
|
|
113
|
+
args: [{ selector: 'sqd-designer', template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" }]
|
|
114
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { placeholder: [{
|
|
115
|
+
type: ViewChild,
|
|
116
|
+
args: ['placeholder', { static: true }]
|
|
117
|
+
}], theme: [{
|
|
118
|
+
type: Input,
|
|
119
|
+
args: ['theme']
|
|
120
|
+
}], undoStackSize: [{
|
|
121
|
+
type: Input,
|
|
122
|
+
args: ['undoStackSize']
|
|
123
|
+
}], definition: [{
|
|
124
|
+
type: Input,
|
|
125
|
+
args: ['definition']
|
|
126
|
+
}], stepsConfiguration: [{
|
|
127
|
+
type: Input,
|
|
128
|
+
args: ['stepsConfiguration']
|
|
129
|
+
}], toolboxConfiguration: [{
|
|
130
|
+
type: Input,
|
|
131
|
+
args: ['toolboxConfiguration']
|
|
132
|
+
}], extensions: [{
|
|
133
|
+
type: Input,
|
|
134
|
+
args: ['extensions']
|
|
135
|
+
}], areEditorsHidden: [{
|
|
136
|
+
type: Input,
|
|
137
|
+
args: ['areEditorsHidden']
|
|
138
|
+
}], globalEditor: [{
|
|
139
|
+
type: Input,
|
|
140
|
+
args: ['globalEditor']
|
|
141
|
+
}], stepEditor: [{
|
|
142
|
+
type: Input,
|
|
143
|
+
args: ['stepEditor']
|
|
144
|
+
}], onReady: [{
|
|
145
|
+
type: Output
|
|
146
|
+
}], onDefinitionChanged: [{
|
|
147
|
+
type: Output
|
|
148
|
+
}] } });
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGVzaWduZXIvc3JjL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uL2Rlc2lnbmVyL3NyYy9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sU0FBUyxFQUdULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRU4sUUFBUSxFQU9SLE1BQU0sOEJBQThCLENBQUM7O0FBZ0J0QyxNQUFNLE9BQU8saUJBQWlCO0lBK0I3QixZQUFvQyxNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUpsQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUV2Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBeUVwRCx5QkFBb0IsR0FBRyxDQUFDLFVBQXNCLEVBQUUsT0FBNEIsRUFBRSxFQUFFO1lBQ2hHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7YUFDbkQ7WUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQXNCLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ2xFLFVBQVU7Z0JBQ1YsT0FBTzthQUNQLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVlLHVCQUFrQixHQUFHLENBQUMsSUFBVSxFQUFFLE9BQTBCLEVBQUUsRUFBRTtZQUNoRixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFvQixJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUM5RCxJQUFJO2dCQUNKLE9BQU87YUFD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QUFDLGVBQWU7Z0JBR2YsVUFBVTtzQkFEaEIsS0FBSzt1QkFBQyxZQUFZO2dCQUdaLGtCQUFrQjtzQkFEeEIsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBR3BCLG9CQUFvQjtzQkFEMUIsS0FBSzt1QkFBQyxzQkFBc0I7Z0JBR3RCLFVBQVU7c0JBRGhCLEtBQUs7dUJBQUMsWUFBWTtnQkFHWixnQkFBZ0I7c0JBRHRCLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUdsQixZQUFZO3NCQURsQixLQUFLO3VCQUFDLGNBQWM7Z0JBR2QsVUFBVTtzQkFEaEIsS0FBSzt1QkFBQyxZQUFZO2dCQUlILE9BQU87c0JBRHRCLE1BQU07Z0JBR1MsbUJBQW1CO3NCQURsQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QWZ0ZXJWaWV3SW5pdCxcblx0Q29tcG9uZW50LFxuXHRFbGVtZW50UmVmLFxuXHRFbWJlZGRlZFZpZXdSZWYsXG5cdEV2ZW50RW1pdHRlcixcblx0SW5wdXQsXG5cdE5nWm9uZSxcblx0T25DaGFuZ2VzLFxuXHRPbkRlc3Ryb3ksXG5cdE91dHB1dCxcblx0U2ltcGxlQ2hhbmdlcyxcblx0VGVtcGxhdGVSZWYsXG5cdFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG5cdERlZmluaXRpb24sXG5cdERlc2lnbmVyLFxuXHREZXNpZ25lckV4dGVuc2lvbixcblx0R2xvYmFsRWRpdG9yQ29udGV4dCxcblx0U3RlcCxcblx0U3RlcEVkaXRvckNvbnRleHQsXG5cdFN0ZXBzQ29uZmlndXJhdGlvbixcblx0VG9vbGJveENvbmZpZ3VyYXRpb25cbn0gZnJvbSAnc2VxdWVudGlhbC13b3JrZmxvdy1kZXNpZ25lcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsRWRpdG9yV3JhcHBlciB7XG5cdGRlZmluaXRpb246IERlZmluaXRpb247XG5cdGNvbnRleHQ6IEdsb2JhbEVkaXRvckNvbnRleHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcEVkaXRvcldyYXBwZXIge1xuXHRzdGVwOiBTdGVwO1xuXHRjb250ZXh0OiBTdGVwRWRpdG9yQ29udGV4dDtcbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnc3FkLWRlc2lnbmVyJyxcblx0dGVtcGxhdGVVcmw6ICcuL2Rlc2lnbmVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25lckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblx0cHJpdmF0ZSBkZXNpZ25lcj86IERlc2lnbmVyO1xuXHRwcml2YXRlIGxhc3RFbWJlZGRlZFZpZXc/OiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj47XG5cblx0QFZpZXdDaGlsZCgncGxhY2Vob2xkZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxuXHRwcml2YXRlIHBsYWNlaG9sZGVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cblx0QElucHV0KCd0aGVtZScpXG5cdHB1YmxpYyB0aGVtZT86IHN0cmluZztcblx0QElucHV0KCd1bmRvU3RhY2tTaXplJylcblx0cHVibGljIHVuZG9TdGFja1NpemU/OiBudW1iZXI7XG5cdEBJbnB1dCgnZGVmaW5pdGlvbicpXG5cdHB1YmxpYyBkZWZpbml0aW9uPzogRGVmaW5pdGlvbjtcblx0QElucHV0KCdzdGVwc0NvbmZpZ3VyYXRpb24nKVxuXHRwdWJsaWMgc3RlcHNDb25maWd1cmF0aW9uPzogU3RlcHNDb25maWd1cmF0aW9uO1xuXHRASW5wdXQoJ3Rvb2xib3hDb25maWd1cmF0aW9uJylcblx0cHVibGljIHRvb2xib3hDb25maWd1cmF0aW9uPzogVG9vbGJveENvbmZpZ3VyYXRpb247XG5cdEBJbnB1dCgnZXh0ZW5zaW9ucycpXG5cdHB1YmxpYyBleHRlbnNpb25zPzogRGVzaWduZXJFeHRlbnNpb25bXTtcblx0QElucHV0KCdhcmVFZGl0b3JzSGlkZGVuJylcblx0cHVibGljIGFyZUVkaXRvcnNIaWRkZW4/OiBib29sZWFuO1xuXHRASW5wdXQoJ2dsb2JhbEVkaXRvcicpXG5cdHB1YmxpYyBnbG9iYWxFZGl0b3I/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblx0QElucHV0KCdzdGVwRWRpdG9yJylcblx0cHVibGljIHN0ZXBFZGl0b3I/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuXHRAT3V0cHV0KClcblx0cHVibGljIHJlYWRvbmx5IG9uUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPERlc2lnbmVyPigpO1xuXHRAT3V0cHV0KClcblx0cHVibGljIHJlYWRvbmx5IG9uRGVmaW5pdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERlZmluaXRpb24+KCk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmUpIHt9XG5cblx0cHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHR0aGlzLmF0dGFjaCgpO1xuXHR9XG5cblx0cHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblx0XHRjb25zdCBpc0ZpcnN0Q2hhbmdlID0gT2JqZWN0LmtleXMoY2hhbmdlcykuZXZlcnkoa2V5ID0+IGNoYW5nZXNba2V5XS5maXJzdENoYW5nZSk7XG5cdFx0aWYgKGlzRmlyc3RDaGFuZ2UpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMuZGVzaWduZXIgJiYgY2hhbmdlc1snZGVmaW5pdGlvbiddICYmIGNoYW5nZXNbJ2RlZmluaXRpb24nXS5jdXJyZW50VmFsdWUgPT09IHRoaXMuZGVzaWduZXIuZ2V0RGVmaW5pdGlvbigpKSB7XG5cdFx0XHQvLyBUaGUgc2FtZSByZWZlcmVuY2UgPSBubyBjaGFuZ2UuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5hdHRhY2goKTtcblx0fVxuXG5cdHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sYXN0RW1iZWRkZWRWaWV3KSB7XG5cdFx0XHR0aGlzLmxhc3RFbWJlZGRlZFZpZXcuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXR0YWNoKCkge1xuXHRcdHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcblx0XHRcdGlmICghdGhpcy5wbGFjZWhvbGRlcikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXRoaXMuZGVmaW5pdGlvbikge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IFwiZGVmaW5pdGlvblwiIGlzIG5vdCBzZXQnKTtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy5zdGVwc0NvbmZpZ3VyYXRpb24pIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnB1dCBcInN0ZXBzQ29uZmlndXJhdGlvblwiIGlzIG5vdCBzZXQnKTtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy50b29sYm94Q29uZmlndXJhdGlvbikge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IFwidG9vbGJveENvbmZpZ3VyYXRpb25cIiBpcyBub3Qgc2V0Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmRlc2lnbmVyKSB7XG5cdFx0XHRcdHRoaXMuZGVzaWduZXIuZGVzdHJveSgpO1xuXHRcdFx0XHR0aGlzLmRlc2lnbmVyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBkZXNpZ25lciA9IERlc2lnbmVyLmNyZWF0ZSh0aGlzLnBsYWNlaG9sZGVyLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZGVmaW5pdGlvbiwge1xuXHRcdFx0XHR0aGVtZTogdGhpcy50aGVtZSxcblx0XHRcdFx0dW5kb1N0YWNrU2l6ZTogdGhpcy51bmRvU3RhY2tTaXplLFxuXHRcdFx0XHRlZGl0b3JzOiB7XG5cdFx0XHRcdFx0aXNIaWRkZW46IHRoaXMuYXJlRWRpdG9yc0hpZGRlbixcblx0XHRcdFx0XHRnbG9iYWxFZGl0b3JQcm92aWRlcjogdGhpcy5nbG9iYWxFZGl0b3JQcm92aWRlcixcblx0XHRcdFx0XHRzdGVwRWRpdG9yUHJvdmlkZXI6IHRoaXMuc3RlcEVkaXRvclByb3ZpZGVyXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN0ZXBzOiB0aGlzLnN0ZXBzQ29uZmlndXJhdGlvbixcblx0XHRcdFx0dG9vbGJveDogdGhpcy50b29sYm94Q29uZmlndXJhdGlvbixcblx0XHRcdFx0ZXh0ZW5zaW9uczogdGhpcy5leHRlbnNpb25zXG5cdFx0XHR9KTtcblx0XHRcdGRlc2lnbmVyLm9uUmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcblx0XHRcdFx0dGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm9uUmVhZHkuZW1pdChkZXNpZ25lcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHRkZXNpZ25lci5vbkRlZmluaXRpb25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vbkRlZmluaXRpb25DaGFuZ2VkLmVtaXQoZGVzaWduZXIuZ2V0RGVmaW5pdGlvbigpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuZGVzaWduZXIgPSBkZXNpZ25lcjtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsRWRpdG9yUHJvdmlkZXIgPSAoZGVmaW5pdGlvbjogRGVmaW5pdGlvbiwgY29udGV4dDogR2xvYmFsRWRpdG9yQ29udGV4dCkgPT4ge1xuXHRcdGlmICghdGhpcy5nbG9iYWxFZGl0b3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW5wdXQgXCJnbG9iYWxFZGl0b3JcIiBpcyBub3Qgc2V0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVkaXRvclByb3ZpZGVyPEdsb2JhbEVkaXRvcldyYXBwZXI+KHRoaXMuZ2xvYmFsRWRpdG9yLCB7XG5cdFx0XHRkZWZpbml0aW9uLFxuXHRcdFx0Y29udGV4dFxuXHRcdH0pO1xuXHR9O1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgc3RlcEVkaXRvclByb3ZpZGVyID0gKHN0ZXA6IFN0ZXAsIGNvbnRleHQ6IFN0ZXBFZGl0b3JDb250ZXh0KSA9PiB7XG5cdFx0aWYgKCF0aGlzLnN0ZXBFZGl0b3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW5wdXQgXCJzdGVwRWRpdG9yXCIgaXMgbm90IHNldCcpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lZGl0b3JQcm92aWRlcjxTdGVwRWRpdG9yV3JhcHBlcj4odGhpcy5zdGVwRWRpdG9yLCB7XG5cdFx0XHRzdGVwLFxuXHRcdFx0Y29udGV4dFxuXHRcdH0pO1xuXHR9O1xuXG5cdHByaXZhdGUgZWRpdG9yUHJvdmlkZXI8RT4odGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHVua25vd24+LCBlZGl0b3I6IEUpIHtcblx0XHRyZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcblx0XHRcdGlmICh0aGlzLmxhc3RFbWJlZGRlZFZpZXcpIHtcblx0XHRcdFx0dGhpcy5sYXN0RW1iZWRkZWRWaWV3LmRlc3Ryb3koKTtcblx0XHRcdFx0dGhpcy5sYXN0RW1iZWRkZWRWaWV3ID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxhc3RFbWJlZGRlZFZpZXcgPSB0ZW1wbGF0ZVJlZi5jcmVhdGVFbWJlZGRlZFZpZXcoe1xuXHRcdFx0XHQkaW1wbGljaXQ6IGVkaXRvclxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmxhc3RFbWJlZGRlZFZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuXG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGNvbnRhaW5lci5jbGFzc05hbWUgPSAnc3FkLWVkaXRvci1hbmd1bGFyJztcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmxhc3RFbWJlZGRlZFZpZXcucm9vdE5vZGVzKSB7XG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZChub2RlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjb250YWluZXI7XG5cdFx0fSk7XG5cdH1cbn1cbiIsIjxkaXYgI3BsYWNlaG9sZGVyIGNsYXNzPVwic3FkLWRlc2lnbmVyLWFuZ3VsYXJcIj48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './designer.component';
|
|
2
|
+
export * from './sequential-workflow-designer.module';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2Rlc2lnbmVyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx1Q0FBdUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVzaWduZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2VxdWVudGlhbC13b3JrZmxvdy1kZXNpZ25lci5tb2R1bGUnO1xuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVudGlhbC13b3JrZmxvdy1kZXNpZ25lci1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGVzaWduZXIvc3JjL3NlcXVlbnRpYWwtd29ya2Zsb3ctZGVzaWduZXItYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { DesignerComponent } from './designer.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class SequentialWorkflowDesignerModule {
|
|
6
|
+
}
|
|
7
|
+
SequentialWorkflowDesignerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
8
|
+
SequentialWorkflowDesignerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, declarations: [DesignerComponent], imports: [CommonModule], exports: [DesignerComponent] });
|
|
9
|
+
SequentialWorkflowDesignerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, imports: [CommonModule] });
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
declarations: [DesignerComponent],
|
|
14
|
+
imports: [CommonModule],
|
|
15
|
+
exports: [DesignerComponent]
|
|
16
|
+
}]
|
|
17
|
+
}] });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVudGlhbC13b3JrZmxvdy1kZXNpZ25lci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kZXNpZ25lci9zcmMvc2VxdWVudGlhbC13b3JrZmxvdy1kZXNpZ25lci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBT3pELE1BQU0sT0FBTyxnQ0FBZ0M7OzZIQUFoQyxnQ0FBZ0M7OEhBQWhDLGdDQUFnQyxpQkFKN0IsaUJBQWlCLGFBQ3RCLFlBQVksYUFDWixpQkFBaUI7OEhBRWYsZ0NBQWdDLFlBSGxDLFlBQVk7MkZBR1YsZ0NBQWdDO2tCQUw1QyxRQUFRO21CQUFDO29CQUNULFlBQVksRUFBRSxDQUFDLGlCQUFpQixDQUFDO29CQUNqQyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDO2lCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGVzaWduZXJDb21wb25lbnQgfSBmcm9tICcuL2Rlc2lnbmVyLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG5cdGRlY2xhcmF0aW9uczogW0Rlc2lnbmVyQ29tcG9uZW50XSxcblx0aW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG5cdGV4cG9ydHM6IFtEZXNpZ25lckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgU2VxdWVudGlhbFdvcmtmbG93RGVzaWduZXJNb2R1bGUge31cbiJdfQ==
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter, Component, ViewChild, Input, Output, NgModule } from '@angular/core';
|
|
3
|
+
import { Designer } from 'sequential-workflow-designer';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
|
|
6
|
+
class DesignerComponent {
|
|
7
|
+
constructor(ngZone) {
|
|
8
|
+
this.ngZone = ngZone;
|
|
9
|
+
this.onReady = new EventEmitter();
|
|
10
|
+
this.onDefinitionChanged = new EventEmitter();
|
|
11
|
+
this.globalEditorProvider = (definition, context) => {
|
|
12
|
+
if (!this.globalEditor) {
|
|
13
|
+
throw new Error('Input "globalEditor" is not set');
|
|
14
|
+
}
|
|
15
|
+
return this.editorProvider(this.globalEditor, {
|
|
16
|
+
definition,
|
|
17
|
+
context
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
this.stepEditorProvider = (step, context) => {
|
|
21
|
+
if (!this.stepEditor) {
|
|
22
|
+
throw new Error('Input "stepEditor" is not set');
|
|
23
|
+
}
|
|
24
|
+
return this.editorProvider(this.stepEditor, {
|
|
25
|
+
step,
|
|
26
|
+
context
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
ngAfterViewInit() {
|
|
31
|
+
this.attach();
|
|
32
|
+
}
|
|
33
|
+
ngOnChanges(changes) {
|
|
34
|
+
const isFirstChange = Object.keys(changes).every(key => changes[key].firstChange);
|
|
35
|
+
if (isFirstChange) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (this.designer && changes['definition'] && changes['definition'].currentValue === this.designer.getDefinition()) {
|
|
39
|
+
// The same reference = no change.
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.attach();
|
|
43
|
+
}
|
|
44
|
+
ngOnDestroy() {
|
|
45
|
+
if (this.lastEmbeddedView) {
|
|
46
|
+
this.lastEmbeddedView.destroy();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
attach() {
|
|
50
|
+
this.ngZone.runOutsideAngular(() => {
|
|
51
|
+
if (!this.placeholder) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (!this.definition) {
|
|
55
|
+
throw new Error('Input "definition" is not set');
|
|
56
|
+
}
|
|
57
|
+
if (!this.stepsConfiguration) {
|
|
58
|
+
throw new Error('Input "stepsConfiguration" is not set');
|
|
59
|
+
}
|
|
60
|
+
if (!this.toolboxConfiguration) {
|
|
61
|
+
throw new Error('Input "toolboxConfiguration" is not set');
|
|
62
|
+
}
|
|
63
|
+
if (this.designer) {
|
|
64
|
+
this.designer.destroy();
|
|
65
|
+
this.designer = undefined;
|
|
66
|
+
}
|
|
67
|
+
const designer = Designer.create(this.placeholder.nativeElement, this.definition, {
|
|
68
|
+
theme: this.theme,
|
|
69
|
+
undoStackSize: this.undoStackSize,
|
|
70
|
+
editors: {
|
|
71
|
+
isHidden: this.areEditorsHidden,
|
|
72
|
+
globalEditorProvider: this.globalEditorProvider,
|
|
73
|
+
stepEditorProvider: this.stepEditorProvider
|
|
74
|
+
},
|
|
75
|
+
steps: this.stepsConfiguration,
|
|
76
|
+
toolbox: this.toolboxConfiguration,
|
|
77
|
+
extensions: this.extensions
|
|
78
|
+
});
|
|
79
|
+
designer.onReady.subscribe(() => {
|
|
80
|
+
this.ngZone.run(() => {
|
|
81
|
+
this.onReady.emit(designer);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
designer.onDefinitionChanged.subscribe(() => {
|
|
85
|
+
this.ngZone.run(() => {
|
|
86
|
+
this.onDefinitionChanged.emit(designer.getDefinition());
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
this.designer = designer;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
editorProvider(templateRef, editor) {
|
|
93
|
+
return this.ngZone.run(() => {
|
|
94
|
+
if (this.lastEmbeddedView) {
|
|
95
|
+
this.lastEmbeddedView.destroy();
|
|
96
|
+
this.lastEmbeddedView = undefined;
|
|
97
|
+
}
|
|
98
|
+
this.lastEmbeddedView = templateRef.createEmbeddedView({
|
|
99
|
+
$implicit: editor
|
|
100
|
+
});
|
|
101
|
+
this.lastEmbeddedView.detectChanges();
|
|
102
|
+
const container = document.createElement('div');
|
|
103
|
+
container.className = 'sqd-editor-angular';
|
|
104
|
+
for (const node of this.lastEmbeddedView.rootNodes) {
|
|
105
|
+
container.appendChild(node);
|
|
106
|
+
}
|
|
107
|
+
return container;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
DesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: DesignerComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
112
|
+
DesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: DesignerComponent, selector: "sqd-designer", inputs: { theme: "theme", undoStackSize: "undoStackSize", definition: "definition", stepsConfiguration: "stepsConfiguration", toolboxConfiguration: "toolboxConfiguration", extensions: "extensions", areEditorsHidden: "areEditorsHidden", globalEditor: "globalEditor", stepEditor: "stepEditor" }, outputs: { onReady: "onReady", onDefinitionChanged: "onDefinitionChanged" }, viewQueries: [{ propertyName: "placeholder", first: true, predicate: ["placeholder"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" });
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: DesignerComponent, decorators: [{
|
|
114
|
+
type: Component,
|
|
115
|
+
args: [{ selector: 'sqd-designer', template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" }]
|
|
116
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { placeholder: [{
|
|
117
|
+
type: ViewChild,
|
|
118
|
+
args: ['placeholder', { static: true }]
|
|
119
|
+
}], theme: [{
|
|
120
|
+
type: Input,
|
|
121
|
+
args: ['theme']
|
|
122
|
+
}], undoStackSize: [{
|
|
123
|
+
type: Input,
|
|
124
|
+
args: ['undoStackSize']
|
|
125
|
+
}], definition: [{
|
|
126
|
+
type: Input,
|
|
127
|
+
args: ['definition']
|
|
128
|
+
}], stepsConfiguration: [{
|
|
129
|
+
type: Input,
|
|
130
|
+
args: ['stepsConfiguration']
|
|
131
|
+
}], toolboxConfiguration: [{
|
|
132
|
+
type: Input,
|
|
133
|
+
args: ['toolboxConfiguration']
|
|
134
|
+
}], extensions: [{
|
|
135
|
+
type: Input,
|
|
136
|
+
args: ['extensions']
|
|
137
|
+
}], areEditorsHidden: [{
|
|
138
|
+
type: Input,
|
|
139
|
+
args: ['areEditorsHidden']
|
|
140
|
+
}], globalEditor: [{
|
|
141
|
+
type: Input,
|
|
142
|
+
args: ['globalEditor']
|
|
143
|
+
}], stepEditor: [{
|
|
144
|
+
type: Input,
|
|
145
|
+
args: ['stepEditor']
|
|
146
|
+
}], onReady: [{
|
|
147
|
+
type: Output
|
|
148
|
+
}], onDefinitionChanged: [{
|
|
149
|
+
type: Output
|
|
150
|
+
}] } });
|
|
151
|
+
|
|
152
|
+
class SequentialWorkflowDesignerModule {
|
|
153
|
+
}
|
|
154
|
+
SequentialWorkflowDesignerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
155
|
+
SequentialWorkflowDesignerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, declarations: [DesignerComponent], imports: [CommonModule], exports: [DesignerComponent] });
|
|
156
|
+
SequentialWorkflowDesignerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, imports: [CommonModule] });
|
|
157
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, decorators: [{
|
|
158
|
+
type: NgModule,
|
|
159
|
+
args: [{
|
|
160
|
+
declarations: [DesignerComponent],
|
|
161
|
+
imports: [CommonModule],
|
|
162
|
+
exports: [DesignerComponent]
|
|
163
|
+
}]
|
|
164
|
+
}] });
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Generated bundle index. Do not edit.
|
|
168
|
+
*/
|
|
169
|
+
|
|
170
|
+
export { DesignerComponent, SequentialWorkflowDesignerModule };
|
|
171
|
+
//# sourceMappingURL=sequential-workflow-designer-angular.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequential-workflow-designer-angular.mjs","sources":["../../designer/src/designer.component.ts","../../designer/src/designer.component.html","../../designer/src/sequential-workflow-designer.module.ts","../../designer/src/sequential-workflow-designer-angular.ts"],"sourcesContent":["import {\n\tAfterViewInit,\n\tComponent,\n\tElementRef,\n\tEmbeddedViewRef,\n\tEventEmitter,\n\tInput,\n\tNgZone,\n\tOnChanges,\n\tOnDestroy,\n\tOutput,\n\tSimpleChanges,\n\tTemplateRef,\n\tViewChild\n} from '@angular/core';\nimport {\n\tDefinition,\n\tDesigner,\n\tDesignerExtension,\n\tGlobalEditorContext,\n\tStep,\n\tStepEditorContext,\n\tStepsConfiguration,\n\tToolboxConfiguration\n} from 'sequential-workflow-designer';\n\nexport interface GlobalEditorWrapper {\n\tdefinition: Definition;\n\tcontext: GlobalEditorContext;\n}\n\nexport interface StepEditorWrapper {\n\tstep: Step;\n\tcontext: StepEditorContext;\n}\n\n@Component({\n\tselector: 'sqd-designer',\n\ttemplateUrl: './designer.component.html'\n})\nexport class DesignerComponent implements AfterViewInit, OnChanges, OnDestroy {\n\tprivate designer?: Designer;\n\tprivate lastEmbeddedView?: EmbeddedViewRef<unknown>;\n\n\t@ViewChild('placeholder', { static: true })\n\tprivate placeholder?: ElementRef<HTMLElement>;\n\n\t@Input('theme')\n\tpublic theme?: string;\n\t@Input('undoStackSize')\n\tpublic undoStackSize?: number;\n\t@Input('definition')\n\tpublic definition?: Definition;\n\t@Input('stepsConfiguration')\n\tpublic stepsConfiguration?: StepsConfiguration;\n\t@Input('toolboxConfiguration')\n\tpublic toolboxConfiguration?: ToolboxConfiguration;\n\t@Input('extensions')\n\tpublic extensions?: DesignerExtension[];\n\t@Input('areEditorsHidden')\n\tpublic areEditorsHidden?: boolean;\n\t@Input('globalEditor')\n\tpublic globalEditor?: TemplateRef<unknown>;\n\t@Input('stepEditor')\n\tpublic stepEditor?: TemplateRef<unknown>;\n\n\t@Output()\n\tpublic readonly onReady = new EventEmitter<Designer>();\n\t@Output()\n\tpublic readonly onDefinitionChanged = new EventEmitter<Definition>();\n\n\tpublic constructor(private readonly ngZone: NgZone) {}\n\n\tpublic ngAfterViewInit() {\n\t\tthis.attach();\n\t}\n\n\tpublic ngOnChanges(changes: SimpleChanges) {\n\t\tconst isFirstChange = Object.keys(changes).every(key => changes[key].firstChange);\n\t\tif (isFirstChange) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.designer && changes['definition'] && changes['definition'].currentValue === this.designer.getDefinition()) {\n\t\t\t// The same reference = no change.\n\t\t\treturn;\n\t\t}\n\n\t\tthis.attach();\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\tif (this.lastEmbeddedView) {\n\t\t\tthis.lastEmbeddedView.destroy();\n\t\t}\n\t}\n\n\tprivate attach() {\n\t\tthis.ngZone.runOutsideAngular(() => {\n\t\t\tif (!this.placeholder) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this.definition) {\n\t\t\t\tthrow new Error('Input \"definition\" is not set');\n\t\t\t}\n\t\t\tif (!this.stepsConfiguration) {\n\t\t\t\tthrow new Error('Input \"stepsConfiguration\" is not set');\n\t\t\t}\n\t\t\tif (!this.toolboxConfiguration) {\n\t\t\t\tthrow new Error('Input \"toolboxConfiguration\" is not set');\n\t\t\t}\n\n\t\t\tif (this.designer) {\n\t\t\t\tthis.designer.destroy();\n\t\t\t\tthis.designer = undefined;\n\t\t\t}\n\n\t\t\tconst designer = Designer.create(this.placeholder.nativeElement, this.definition, {\n\t\t\t\ttheme: this.theme,\n\t\t\t\tundoStackSize: this.undoStackSize,\n\t\t\t\teditors: {\n\t\t\t\t\tisHidden: this.areEditorsHidden,\n\t\t\t\t\tglobalEditorProvider: this.globalEditorProvider,\n\t\t\t\t\tstepEditorProvider: this.stepEditorProvider\n\t\t\t\t},\n\t\t\t\tsteps: this.stepsConfiguration,\n\t\t\t\ttoolbox: this.toolboxConfiguration,\n\t\t\t\textensions: this.extensions\n\t\t\t});\n\t\t\tdesigner.onReady.subscribe(() => {\n\t\t\t\tthis.ngZone.run(() => {\n\t\t\t\t\tthis.onReady.emit(designer);\n\t\t\t\t});\n\t\t\t});\n\t\t\tdesigner.onDefinitionChanged.subscribe(() => {\n\t\t\t\tthis.ngZone.run(() => {\n\t\t\t\t\tthis.onDefinitionChanged.emit(designer.getDefinition());\n\t\t\t\t});\n\t\t\t});\n\t\t\tthis.designer = designer;\n\t\t});\n\t}\n\n\tprivate readonly globalEditorProvider = (definition: Definition, context: GlobalEditorContext) => {\n\t\tif (!this.globalEditor) {\n\t\t\tthrow new Error('Input \"globalEditor\" is not set');\n\t\t}\n\t\treturn this.editorProvider<GlobalEditorWrapper>(this.globalEditor, {\n\t\t\tdefinition,\n\t\t\tcontext\n\t\t});\n\t};\n\n\tprivate readonly stepEditorProvider = (step: Step, context: StepEditorContext) => {\n\t\tif (!this.stepEditor) {\n\t\t\tthrow new Error('Input \"stepEditor\" is not set');\n\t\t}\n\t\treturn this.editorProvider<StepEditorWrapper>(this.stepEditor, {\n\t\t\tstep,\n\t\t\tcontext\n\t\t});\n\t};\n\n\tprivate editorProvider<E>(templateRef: TemplateRef<unknown>, editor: E) {\n\t\treturn this.ngZone.run(() => {\n\t\t\tif (this.lastEmbeddedView) {\n\t\t\t\tthis.lastEmbeddedView.destroy();\n\t\t\t\tthis.lastEmbeddedView = undefined;\n\t\t\t}\n\n\t\t\tthis.lastEmbeddedView = templateRef.createEmbeddedView({\n\t\t\t\t$implicit: editor\n\t\t\t});\n\t\t\tthis.lastEmbeddedView.detectChanges();\n\n\t\t\tconst container = document.createElement('div');\n\t\t\tcontainer.className = 'sqd-editor-angular';\n\t\t\tfor (const node of this.lastEmbeddedView.rootNodes) {\n\t\t\t\tcontainer.appendChild(node);\n\t\t\t}\n\t\t\treturn container;\n\t\t});\n\t}\n}\n","<div #placeholder class=\"sqd-designer-angular\"></div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { DesignerComponent } from './designer.component';\n\n@NgModule({\n\tdeclarations: [DesignerComponent],\n\timports: [CommonModule],\n\texports: [DesignerComponent]\n})\nexport class SequentialWorkflowDesignerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter, Component, ViewChild, Input, Output, NgModule } from '@angular/core';
|
|
3
|
+
import { Designer } from 'sequential-workflow-designer';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
|
|
6
|
+
class DesignerComponent {
|
|
7
|
+
constructor(ngZone) {
|
|
8
|
+
this.ngZone = ngZone;
|
|
9
|
+
this.onReady = new EventEmitter();
|
|
10
|
+
this.onDefinitionChanged = new EventEmitter();
|
|
11
|
+
this.globalEditorProvider = (definition, context) => {
|
|
12
|
+
if (!this.globalEditor) {
|
|
13
|
+
throw new Error('Input "globalEditor" is not set');
|
|
14
|
+
}
|
|
15
|
+
return this.editorProvider(this.globalEditor, {
|
|
16
|
+
definition,
|
|
17
|
+
context
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
this.stepEditorProvider = (step, context) => {
|
|
21
|
+
if (!this.stepEditor) {
|
|
22
|
+
throw new Error('Input "stepEditor" is not set');
|
|
23
|
+
}
|
|
24
|
+
return this.editorProvider(this.stepEditor, {
|
|
25
|
+
step,
|
|
26
|
+
context
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
ngAfterViewInit() {
|
|
31
|
+
this.attach();
|
|
32
|
+
}
|
|
33
|
+
ngOnChanges(changes) {
|
|
34
|
+
const isFirstChange = Object.keys(changes).every(key => changes[key].firstChange);
|
|
35
|
+
if (isFirstChange) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (this.designer && changes['definition'] && changes['definition'].currentValue === this.designer.getDefinition()) {
|
|
39
|
+
// The same reference = no change.
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.attach();
|
|
43
|
+
}
|
|
44
|
+
ngOnDestroy() {
|
|
45
|
+
if (this.lastEmbeddedView) {
|
|
46
|
+
this.lastEmbeddedView.destroy();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
attach() {
|
|
50
|
+
this.ngZone.runOutsideAngular(() => {
|
|
51
|
+
if (!this.placeholder) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (!this.definition) {
|
|
55
|
+
throw new Error('Input "definition" is not set');
|
|
56
|
+
}
|
|
57
|
+
if (!this.stepsConfiguration) {
|
|
58
|
+
throw new Error('Input "stepsConfiguration" is not set');
|
|
59
|
+
}
|
|
60
|
+
if (!this.toolboxConfiguration) {
|
|
61
|
+
throw new Error('Input "toolboxConfiguration" is not set');
|
|
62
|
+
}
|
|
63
|
+
if (this.designer) {
|
|
64
|
+
this.designer.destroy();
|
|
65
|
+
this.designer = undefined;
|
|
66
|
+
}
|
|
67
|
+
const designer = Designer.create(this.placeholder.nativeElement, this.definition, {
|
|
68
|
+
theme: this.theme,
|
|
69
|
+
undoStackSize: this.undoStackSize,
|
|
70
|
+
editors: {
|
|
71
|
+
isHidden: this.areEditorsHidden,
|
|
72
|
+
globalEditorProvider: this.globalEditorProvider,
|
|
73
|
+
stepEditorProvider: this.stepEditorProvider
|
|
74
|
+
},
|
|
75
|
+
steps: this.stepsConfiguration,
|
|
76
|
+
toolbox: this.toolboxConfiguration,
|
|
77
|
+
extensions: this.extensions
|
|
78
|
+
});
|
|
79
|
+
designer.onReady.subscribe(() => {
|
|
80
|
+
this.ngZone.run(() => {
|
|
81
|
+
this.onReady.emit(designer);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
designer.onDefinitionChanged.subscribe(() => {
|
|
85
|
+
this.ngZone.run(() => {
|
|
86
|
+
this.onDefinitionChanged.emit(designer.getDefinition());
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
this.designer = designer;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
editorProvider(templateRef, editor) {
|
|
93
|
+
return this.ngZone.run(() => {
|
|
94
|
+
if (this.lastEmbeddedView) {
|
|
95
|
+
this.lastEmbeddedView.destroy();
|
|
96
|
+
this.lastEmbeddedView = undefined;
|
|
97
|
+
}
|
|
98
|
+
this.lastEmbeddedView = templateRef.createEmbeddedView({
|
|
99
|
+
$implicit: editor
|
|
100
|
+
});
|
|
101
|
+
this.lastEmbeddedView.detectChanges();
|
|
102
|
+
const container = document.createElement('div');
|
|
103
|
+
container.className = 'sqd-editor-angular';
|
|
104
|
+
for (const node of this.lastEmbeddedView.rootNodes) {
|
|
105
|
+
container.appendChild(node);
|
|
106
|
+
}
|
|
107
|
+
return container;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
DesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: DesignerComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
112
|
+
DesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: DesignerComponent, selector: "sqd-designer", inputs: { theme: "theme", undoStackSize: "undoStackSize", definition: "definition", stepsConfiguration: "stepsConfiguration", toolboxConfiguration: "toolboxConfiguration", extensions: "extensions", areEditorsHidden: "areEditorsHidden", globalEditor: "globalEditor", stepEditor: "stepEditor" }, outputs: { onReady: "onReady", onDefinitionChanged: "onDefinitionChanged" }, viewQueries: [{ propertyName: "placeholder", first: true, predicate: ["placeholder"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" });
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: DesignerComponent, decorators: [{
|
|
114
|
+
type: Component,
|
|
115
|
+
args: [{ selector: 'sqd-designer', template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" }]
|
|
116
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { placeholder: [{
|
|
117
|
+
type: ViewChild,
|
|
118
|
+
args: ['placeholder', { static: true }]
|
|
119
|
+
}], theme: [{
|
|
120
|
+
type: Input,
|
|
121
|
+
args: ['theme']
|
|
122
|
+
}], undoStackSize: [{
|
|
123
|
+
type: Input,
|
|
124
|
+
args: ['undoStackSize']
|
|
125
|
+
}], definition: [{
|
|
126
|
+
type: Input,
|
|
127
|
+
args: ['definition']
|
|
128
|
+
}], stepsConfiguration: [{
|
|
129
|
+
type: Input,
|
|
130
|
+
args: ['stepsConfiguration']
|
|
131
|
+
}], toolboxConfiguration: [{
|
|
132
|
+
type: Input,
|
|
133
|
+
args: ['toolboxConfiguration']
|
|
134
|
+
}], extensions: [{
|
|
135
|
+
type: Input,
|
|
136
|
+
args: ['extensions']
|
|
137
|
+
}], areEditorsHidden: [{
|
|
138
|
+
type: Input,
|
|
139
|
+
args: ['areEditorsHidden']
|
|
140
|
+
}], globalEditor: [{
|
|
141
|
+
type: Input,
|
|
142
|
+
args: ['globalEditor']
|
|
143
|
+
}], stepEditor: [{
|
|
144
|
+
type: Input,
|
|
145
|
+
args: ['stepEditor']
|
|
146
|
+
}], onReady: [{
|
|
147
|
+
type: Output
|
|
148
|
+
}], onDefinitionChanged: [{
|
|
149
|
+
type: Output
|
|
150
|
+
}] } });
|
|
151
|
+
|
|
152
|
+
class SequentialWorkflowDesignerModule {
|
|
153
|
+
}
|
|
154
|
+
SequentialWorkflowDesignerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
155
|
+
SequentialWorkflowDesignerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, declarations: [DesignerComponent], imports: [CommonModule], exports: [DesignerComponent] });
|
|
156
|
+
SequentialWorkflowDesignerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, imports: [CommonModule] });
|
|
157
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: SequentialWorkflowDesignerModule, decorators: [{
|
|
158
|
+
type: NgModule,
|
|
159
|
+
args: [{
|
|
160
|
+
declarations: [DesignerComponent],
|
|
161
|
+
imports: [CommonModule],
|
|
162
|
+
exports: [DesignerComponent]
|
|
163
|
+
}]
|
|
164
|
+
}] });
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Generated bundle index. Do not edit.
|
|
168
|
+
*/
|
|
169
|
+
|
|
170
|
+
export { DesignerComponent, SequentialWorkflowDesignerModule };
|
|
171
|
+
//# sourceMappingURL=sequential-workflow-designer-angular.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequential-workflow-designer-angular.mjs","sources":["../../designer/src/designer.component.ts","../../designer/src/designer.component.html","../../designer/src/sequential-workflow-designer.module.ts","../../designer/src/sequential-workflow-designer-angular.ts"],"sourcesContent":["import {\n\tAfterViewInit,\n\tComponent,\n\tElementRef,\n\tEmbeddedViewRef,\n\tEventEmitter,\n\tInput,\n\tNgZone,\n\tOnChanges,\n\tOnDestroy,\n\tOutput,\n\tSimpleChanges,\n\tTemplateRef,\n\tViewChild\n} from '@angular/core';\nimport {\n\tDefinition,\n\tDesigner,\n\tDesignerExtension,\n\tGlobalEditorContext,\n\tStep,\n\tStepEditorContext,\n\tStepsConfiguration,\n\tToolboxConfiguration\n} from 'sequential-workflow-designer';\n\nexport interface GlobalEditorWrapper {\n\tdefinition: Definition;\n\tcontext: GlobalEditorContext;\n}\n\nexport interface StepEditorWrapper {\n\tstep: Step;\n\tcontext: StepEditorContext;\n}\n\n@Component({\n\tselector: 'sqd-designer',\n\ttemplateUrl: './designer.component.html'\n})\nexport class DesignerComponent implements AfterViewInit, OnChanges, OnDestroy {\n\tprivate designer?: Designer;\n\tprivate lastEmbeddedView?: EmbeddedViewRef<unknown>;\n\n\t@ViewChild('placeholder', { static: true })\n\tprivate placeholder?: ElementRef<HTMLElement>;\n\n\t@Input('theme')\n\tpublic theme?: string;\n\t@Input('undoStackSize')\n\tpublic undoStackSize?: number;\n\t@Input('definition')\n\tpublic definition?: Definition;\n\t@Input('stepsConfiguration')\n\tpublic stepsConfiguration?: StepsConfiguration;\n\t@Input('toolboxConfiguration')\n\tpublic toolboxConfiguration?: ToolboxConfiguration;\n\t@Input('extensions')\n\tpublic extensions?: DesignerExtension[];\n\t@Input('areEditorsHidden')\n\tpublic areEditorsHidden?: boolean;\n\t@Input('globalEditor')\n\tpublic globalEditor?: TemplateRef<unknown>;\n\t@Input('stepEditor')\n\tpublic stepEditor?: TemplateRef<unknown>;\n\n\t@Output()\n\tpublic readonly onReady = new EventEmitter<Designer>();\n\t@Output()\n\tpublic readonly onDefinitionChanged = new EventEmitter<Definition>();\n\n\tpublic constructor(private readonly ngZone: NgZone) {}\n\n\tpublic ngAfterViewInit() {\n\t\tthis.attach();\n\t}\n\n\tpublic ngOnChanges(changes: SimpleChanges) {\n\t\tconst isFirstChange = Object.keys(changes).every(key => changes[key].firstChange);\n\t\tif (isFirstChange) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.designer && changes['definition'] && changes['definition'].currentValue === this.designer.getDefinition()) {\n\t\t\t// The same reference = no change.\n\t\t\treturn;\n\t\t}\n\n\t\tthis.attach();\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\tif (this.lastEmbeddedView) {\n\t\t\tthis.lastEmbeddedView.destroy();\n\t\t}\n\t}\n\n\tprivate attach() {\n\t\tthis.ngZone.runOutsideAngular(() => {\n\t\t\tif (!this.placeholder) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this.definition) {\n\t\t\t\tthrow new Error('Input \"definition\" is not set');\n\t\t\t}\n\t\t\tif (!this.stepsConfiguration) {\n\t\t\t\tthrow new Error('Input \"stepsConfiguration\" is not set');\n\t\t\t}\n\t\t\tif (!this.toolboxConfiguration) {\n\t\t\t\tthrow new Error('Input \"toolboxConfiguration\" is not set');\n\t\t\t}\n\n\t\t\tif (this.designer) {\n\t\t\t\tthis.designer.destroy();\n\t\t\t\tthis.designer = undefined;\n\t\t\t}\n\n\t\t\tconst designer = Designer.create(this.placeholder.nativeElement, this.definition, {\n\t\t\t\ttheme: this.theme,\n\t\t\t\tundoStackSize: this.undoStackSize,\n\t\t\t\teditors: {\n\t\t\t\t\tisHidden: this.areEditorsHidden,\n\t\t\t\t\tglobalEditorProvider: this.globalEditorProvider,\n\t\t\t\t\tstepEditorProvider: this.stepEditorProvider\n\t\t\t\t},\n\t\t\t\tsteps: this.stepsConfiguration,\n\t\t\t\ttoolbox: this.toolboxConfiguration,\n\t\t\t\textensions: this.extensions\n\t\t\t});\n\t\t\tdesigner.onReady.subscribe(() => {\n\t\t\t\tthis.ngZone.run(() => {\n\t\t\t\t\tthis.onReady.emit(designer);\n\t\t\t\t});\n\t\t\t});\n\t\t\tdesigner.onDefinitionChanged.subscribe(() => {\n\t\t\t\tthis.ngZone.run(() => {\n\t\t\t\t\tthis.onDefinitionChanged.emit(designer.getDefinition());\n\t\t\t\t});\n\t\t\t});\n\t\t\tthis.designer = designer;\n\t\t});\n\t}\n\n\tprivate readonly globalEditorProvider = (definition: Definition, context: GlobalEditorContext) => {\n\t\tif (!this.globalEditor) {\n\t\t\tthrow new Error('Input \"globalEditor\" is not set');\n\t\t}\n\t\treturn this.editorProvider<GlobalEditorWrapper>(this.globalEditor, {\n\t\t\tdefinition,\n\t\t\tcontext\n\t\t});\n\t};\n\n\tprivate readonly stepEditorProvider = (step: Step, context: StepEditorContext) => {\n\t\tif (!this.stepEditor) {\n\t\t\tthrow new Error('Input \"stepEditor\" is not set');\n\t\t}\n\t\treturn this.editorProvider<StepEditorWrapper>(this.stepEditor, {\n\t\t\tstep,\n\t\t\tcontext\n\t\t});\n\t};\n\n\tprivate editorProvider<E>(templateRef: TemplateRef<unknown>, editor: E) {\n\t\treturn this.ngZone.run(() => {\n\t\t\tif (this.lastEmbeddedView) {\n\t\t\t\tthis.lastEmbeddedView.destroy();\n\t\t\t\tthis.lastEmbeddedView = undefined;\n\t\t\t}\n\n\t\t\tthis.lastEmbeddedView = templateRef.createEmbeddedView({\n\t\t\t\t$implicit: editor\n\t\t\t});\n\t\t\tthis.lastEmbeddedView.detectChanges();\n\n\t\t\tconst container = document.createElement('div');\n\t\t\tcontainer.className = 'sqd-editor-angular';\n\t\t\tfor (const node of this.lastEmbeddedView.rootNodes) {\n\t\t\t\tcontainer.appendChild(node);\n\t\t\t}\n\t\t\treturn container;\n\t\t});\n\t}\n}\n","<div #placeholder class=\"sqd-designer-angular\"></div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { DesignerComponent } from './designer.component';\n\n@NgModule({\n\tdeclarations: [DesignerComponent],\n\timports: [CommonModule],\n\texports: [DesignerComponent]\n})\nexport class SequentialWorkflowDesignerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sequential-workflow-designer-angular",
|
|
3
|
+
"description": "Angular wrapper for Sequential Workflow Designer component.",
|
|
4
|
+
"version": "0.5.4",
|
|
5
|
+
"author": "N4NO.com",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/nocode-js/sequential-workflow-designer.git"
|
|
10
|
+
},
|
|
11
|
+
"peerDependencies": {
|
|
12
|
+
"@angular/common": "^15.1.0",
|
|
13
|
+
"@angular/core": "^15.1.0",
|
|
14
|
+
"sequential-workflow-designer": "^0.5.4"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"tslib": "^2.3.0"
|
|
18
|
+
},
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"keywords": [
|
|
21
|
+
"workflow",
|
|
22
|
+
"designer",
|
|
23
|
+
"builder",
|
|
24
|
+
"nocode",
|
|
25
|
+
"lowcode",
|
|
26
|
+
"flow",
|
|
27
|
+
"angular",
|
|
28
|
+
"angularjs"
|
|
29
|
+
],
|
|
30
|
+
"module": "fesm2015/sequential-workflow-designer-angular.mjs",
|
|
31
|
+
"es2020": "fesm2020/sequential-workflow-designer-angular.mjs",
|
|
32
|
+
"esm2020": "esm2020/sequential-workflow-designer-angular.mjs",
|
|
33
|
+
"fesm2020": "fesm2020/sequential-workflow-designer-angular.mjs",
|
|
34
|
+
"fesm2015": "fesm2015/sequential-workflow-designer-angular.mjs",
|
|
35
|
+
"typings": "index.d.ts",
|
|
36
|
+
"exports": {
|
|
37
|
+
"./package.json": {
|
|
38
|
+
"default": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
".": {
|
|
41
|
+
"types": "./index.d.ts",
|
|
42
|
+
"esm2020": "./esm2020/sequential-workflow-designer-angular.mjs",
|
|
43
|
+
"es2020": "./fesm2020/sequential-workflow-designer-angular.mjs",
|
|
44
|
+
"es2015": "./fesm2015/sequential-workflow-designer-angular.mjs",
|
|
45
|
+
"node": "./fesm2015/sequential-workflow-designer-angular.mjs",
|
|
46
|
+
"default": "./fesm2020/sequential-workflow-designer-angular.mjs"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./designer.component";
|
|
3
|
+
import * as i2 from "@angular/common";
|
|
4
|
+
export declare class SequentialWorkflowDesignerModule {
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SequentialWorkflowDesignerModule, never>;
|
|
6
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<SequentialWorkflowDesignerModule, [typeof i1.DesignerComponent], [typeof i2.CommonModule], [typeof i1.DesignerComponent]>;
|
|
7
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<SequentialWorkflowDesignerModule>;
|
|
8
|
+
}
|