Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ jobs:
cp -R examples _deploy
cp -R demos/angular-app/dist/angular-app _deploy/angular-app
cp -R demos/react-app/build _deploy/react-app
- name: Append Analytics
run: |
node scripts/append-ga.cjs _deploy/examples
node scripts/append-ga.cjs _deploy/react-app
node scripts/append-ga.cjs _deploy/angular-app
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
with:
Expand Down
5 changes: 2 additions & 3 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,12 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
node: [16]
steps:
- name: Checkout Repo
uses: actions/checkout@v2
- name: Setup Node 16
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: '16'
node-version: '18'
- name: main.sh
run: bash .github/workflows/main.sh
29 changes: 29 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,32 @@
## 0.16.4

This version introduces the `isAutoSelectDisabled` option. Now it's possible to disable the auto-select feature.

```js
const configuration = {
steps: {
isAutoSelectDisabled: true,
// ...
}
};
```

Additionally, this version introduces possibility to initialize the designer with the undo stack from the previous session.

```js
const configuration = {
undoStackSize: 10,
undoStack: myUndoStack,
// ...
};
```

To read the current stack you should use the `dumpUndoStack()` method.

```js
const myUndoStack = designer.dumpUndoStack();
```

## 0.16.3

This version adds: `isReadonly`, `selectedStepId`, `uidGenerator`, `isToolboxCollapsed` and `isEditorCollapsed` properties and `onIsToolboxCollapsedChanged` and `onIsEditorCollapsedChanged` events to the Angular package.
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ Features:
* [🔴 Particles](https://nocode-js.github.io/sequential-workflow-designer/examples/particles.html)
* [⛅ Light Dark](https://nocode-js.github.io/sequential-workflow-designer/examples/light-dark.html)
* [🤖 Code Generator](https://nocode-js.github.io/sequential-workflow-designer/examples/code-generator.html)
* [📐 Simple Flow](https://nocode-js.github.io/sequential-workflow-designer/examples/simple-flow.html)
* [🌻 Rendering Test](https://nocode-js.github.io/sequential-workflow-designer/examples/rendering-test.html)
* [🚄 Stress Test](https://nocode-js.github.io/sequential-workflow-designer/examples/stress-test.html)
* [🚪 Editing Restrictions](https://nocode-js.github.io/sequential-workflow-designer/examples/editing-restrictions.html)
* [📜 Scrollable Page](https://nocode-js.github.io/sequential-workflow-designer/examples/scrollable-page.html)
* [🌵 Multi-Conditional Switch](https://nocode-js.github.io/sequential-workflow-designer/examples/multi-conditional-switch.html)
* [🌀 Auto-Select](https://nocode-js.github.io/sequential-workflow-designer/examples/auto-select.html)
* [React Demo](https://nocode-js.github.io/sequential-workflow-designer/react-app/)
* [Angular Demo](https://nocode-js.github.io/sequential-workflow-designer/angular-app/)

Expand Down Expand Up @@ -95,10 +95,10 @@ Add the below code to your head section in HTML document.
```html
<head>
...
<link href="https://cdn.jsdelivr.net/npm/sequential-workflow-designer@0.16.3/css/designer.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/sequential-workflow-designer@0.16.3/css/designer-light.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/sequential-workflow-designer@0.16.3/css/designer-dark.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/sequential-workflow-designer@0.16.3/dist/index.umd.js"></script>
<link href="https://cdn.jsdelivr.net/npm/sequential-workflow-designer@0.16.4/css/designer.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/sequential-workflow-designer@0.16.4/css/designer-light.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/sequential-workflow-designer@0.16.4/css/designer-dark.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/sequential-workflow-designer@0.16.4/dist/index.umd.js"></script>
```

Call the designer by:
Expand Down
4 changes: 2 additions & 2 deletions angular/designer/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "sequential-workflow-designer-angular",
"description": "Angular wrapper for Sequential Workflow Designer component.",
"version": "0.16.3",
"version": "0.16.4",
"author": {
"name": "NoCode JS",
"url": "https://nocode-js.com/"
Expand All @@ -15,7 +15,7 @@
"peerDependencies": {
"@angular/common": "12 - 16",
"@angular/core": "12 - 16",
"sequential-workflow-designer": "^0.16.3"
"sequential-workflow-designer": "^0.16.4"
},
"dependencies": {
"tslib": "^2.3.0"
Expand Down
4 changes: 2 additions & 2 deletions demos/angular-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
"@angular/platform-browser-dynamic": "^15.2.9",
"@angular/router": "^15.2.9",
"rxjs": "~7.8.0",
"sequential-workflow-designer": "^0.16.3",
"sequential-workflow-designer-angular": "^0.16.3",
"sequential-workflow-designer": "^0.16.4",
"sequential-workflow-designer-angular": "^0.16.4",
"tslib": "^2.3.0",
"zone.js": "~0.13.0"
},
Expand Down
16 changes: 8 additions & 8 deletions demos/angular-app/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5956,17 +5956,17 @@ send@0.18.0:
range-parser "~1.2.1"
statuses "2.0.1"

sequential-workflow-designer-angular@^0.16.3:
version "0.16.3"
resolved "https://registry.yarnpkg.com/sequential-workflow-designer-angular/-/sequential-workflow-designer-angular-0.16.3.tgz#ad10976164b7c4e85bcb73c0585fb73701761648"
integrity sha512-kTRUPodVsfYpvFZ4ljMkGqM+VWC4xCay+jyWiGD9N2ifnQ7vuKcapMk6DQ+pSSTNCqqOugwdqD5snnWwCeWOYw==
sequential-workflow-designer-angular@^0.16.4:
version "0.16.4"
resolved "https://registry.yarnpkg.com/sequential-workflow-designer-angular/-/sequential-workflow-designer-angular-0.16.4.tgz#fc4d958e4ee7ce9344faa192ba0b13c8b3ae898d"
integrity sha512-G+JntoXICmgoILYEbD5AF9+NW0XxzZRCNT6YH5FbuWvH0GgIwv831hD2gQxGwKTAGXj+vSRIfBrVSHKagY08Qw==
dependencies:
tslib "^2.3.0"

sequential-workflow-designer@^0.16.3:
version "0.16.3"
resolved "https://registry.yarnpkg.com/sequential-workflow-designer/-/sequential-workflow-designer-0.16.3.tgz#899559b3a5ea3b5f0be931a071af67169ec65cb5"
integrity sha512-4M37SXOVfQ8YzLB+1PSDCB7NRXgipOSyBu127CBx2BdAt2dc7CnA0cyOYlVHtL3WX7xGfLXeIKKG7eSfQvjlWg==
sequential-workflow-designer@^0.16.4:
version "0.16.4"
resolved "https://registry.yarnpkg.com/sequential-workflow-designer/-/sequential-workflow-designer-0.16.4.tgz#53ebf0e607f9503eb1bd99c8d8cd0cf347021a3d"
integrity sha512-BHL9zqvwkCVOGIldxdKArsAuC1tVOCq1YQdr77o3bgbntA6VDv9K8kW1Oj8MBQw+Er6IHWhLDQ7yEsVSFWyJfQ==
dependencies:
sequential-workflow-model "^0.2.0"

Expand Down
4 changes: 2 additions & 2 deletions demos/react-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"sequential-workflow-designer": "^0.16.3",
"sequential-workflow-designer-react": "^0.16.3"
"sequential-workflow-designer": "^0.16.4",
"sequential-workflow-designer-react": "^0.16.4"
},
"devDependencies": {
"@types/jest": "^29.2.5",
Expand Down
2 changes: 1 addition & 1 deletion designer/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "sequential-workflow-designer",
"description": "Customizable no-code component for building flow-based programming applications.",
"version": "0.16.3",
"version": "0.16.4",
"type": "module",
"main": "./lib/esm/index.js",
"types": "./lib/index.d.ts",
Expand Down
4 changes: 2 additions & 2 deletions designer/src/api/editor-api.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DefinitionChangeType, DesignerState } from '../designer-state';
import { DesignerState } from '../designer-state';
import { DefinitionModifier } from '../definition-modifier';
import { GlobalEditorContext, StepEditorContext } from '../designer-configuration';
import { DefinitionChangeType, GlobalEditorContext, StepEditorContext } from '../designer-configuration';
import { EditorRenderer, EditorRendererHandler } from './editor-renderer';
import { Definition, DefinitionWalker } from '../definition';
import { SimpleEventListener } from '../core';
Expand Down
3 changes: 2 additions & 1 deletion designer/src/api/editor-renderer.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { DefinitionChangeType, DesignerState } from '../designer-state';
import { DesignerState } from '../designer-state';
import { EditorRenderer } from './editor-renderer';
import { Definition, DefinitionWalker, Step } from '../definition';
import { DefinitionChangeType } from '../designer-configuration';

const step: Step = {
componentType: 'task',
Expand Down
3 changes: 2 additions & 1 deletion designer/src/api/editor-renderer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { DefinitionWalker, Step } from '../definition';
import { race } from '../core';
import { DefinitionChangedEvent, DefinitionChangeType, DesignerState } from '../designer-state';
import { DefinitionChangedEvent, DesignerState } from '../designer-state';
import { DefinitionChangeType } from '../designer-configuration';

export type EditorRendererHandler = (step: Step | null) => void;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { CustomActionHandlerContext } from '../../designer-configuration';
import { CustomActionHandlerContext, DefinitionChangeType } from '../../designer-configuration';
import { DesignerContext } from '../../designer-context';
import { DefinitionChangeType } from '../../designer-state';
import { TriggerCustomActionClickCommand } from '../../workspace';
import { PressingBehaviorHandler } from './pressing-behavior';

Expand Down
2 changes: 1 addition & 1 deletion designer/src/core/step-duplicator.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BranchedStep, DefinitionWalker, SequentialStep, Step } from 'sequential-workflow-model';
import { BranchedStep, DefinitionWalker, SequentialStep, Step } from '../definition';
import { StepDuplicator } from './step-duplicator';
import { Uid } from './uid';

Expand Down
14 changes: 10 additions & 4 deletions designer/src/definition-modifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { Uid } from './core';
import { SequenceModifier } from './core/sequence-modifier';
import { StepDuplicator } from './core/step-duplicator';
import { Definition, DefinitionWalker, Sequence, Step } from './definition';
import { DesignerConfiguration } from './designer-configuration';
import { DefinitionChangeType, DesignerState } from './designer-state';
import { DefinitionChangeType, DesignerConfiguration } from './designer-configuration';
import { DesignerState } from './designer-state';

export class DefinitionModifier {
public constructor(
Expand Down Expand Up @@ -47,7 +47,10 @@ export class DefinitionModifier {

SequenceModifier.insertStep(step, targetSequence, targetIndex);
this.state.notifyDefinitionChanged(DefinitionChangeType.stepInserted, step.id);
this.state.setSelectedStepId(step.id);

if (!this.configuration.steps.isAutoSelectDisabled) {
this.state.setSelectedStepId(step.id);
}
return true;
}

Expand All @@ -70,7 +73,10 @@ export class DefinitionModifier {

apply();
this.state.notifyDefinitionChanged(DefinitionChangeType.stepMoved, step.id);
this.state.setSelectedStepId(step.id);

if (!this.configuration.steps.isAutoSelectDisabled) {
this.state.setSelectedStepId(step.id);
}
return true;
}

Expand Down
32 changes: 32 additions & 0 deletions designer/src/designer-configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ export interface DesignerConfiguration<TDefinition extends Definition = Definiti
*/
undoStackSize?: number;

/**
* @description The initial undo stack. If not set, the undo stack will be empty.
*/
undoStack?: UndoStack;

/**
* @description The common configuration of the steps.
*/
Expand Down Expand Up @@ -135,6 +140,11 @@ export interface StepsConfiguration {
canDeleteStep?: (step: Step, parentSequence: Sequence) => boolean;
isDuplicable?: (step: Step, parentSequence: Sequence) => boolean;

/**
* @description The designer automatically selects the step after it is dropped. If true, the step will not be selected.
*/
isAutoSelectDisabled?: boolean;

iconUrlProvider?: StepIconUrlProvider;
}

Expand Down Expand Up @@ -174,3 +184,25 @@ export type GlobalEditorProvider<TDefinition extends Definition = Definition> =
definition: TDefinition,
context: GlobalEditorContext
) => HTMLElement;

export interface UndoStack {
index: number;
items: UndoStackItem[];
}

export interface UndoStackItem {
definition: Definition;
changeType: DefinitionChangeType;
stepId: string | null;
}

export enum DefinitionChangeType {
stepNameChanged = 1,
stepPropertyChanged,
stepChildrenChanged,
stepDeleted,
stepMoved,
stepInserted,
globalPropertyChanged,
rootReplaced
}
2 changes: 1 addition & 1 deletion designer/src/designer-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export class DesignerContext {

let historyController: HistoryController | undefined = undefined;
if (configuration.undoStackSize) {
historyController = HistoryController.create(state, definitionModifier, configuration);
historyController = HistoryController.create(configuration.undoStack, state, definitionModifier, configuration);
}

const componentContext = ComponentContext.create(
Expand Down
12 changes: 1 addition & 11 deletions designer/src/designer-state.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,14 @@
import { SimpleEvent } from './core/simple-event';
import { Vector } from './core/vector';
import { Definition } from './definition';
import { DefinitionChangeType } from './designer-configuration';
import { Viewport } from './designer-extension';

export interface DefinitionChangedEvent {
changeType: DefinitionChangeType;
stepId: string | null;
}

export enum DefinitionChangeType {
stepNameChanged = 1,
stepPropertyChanged,
stepChildrenChanged,
stepDeleted,
stepMoved,
stepInserted,
globalPropertyChanged,
rootReplaced
}

export class DesignerState {
public readonly onViewportChanged = new SimpleEvent<Viewport>();
public readonly onSelectedStepIdChanged = new SimpleEvent<string | null>();
Expand Down
26 changes: 22 additions & 4 deletions designer/src/designer.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import { SimpleEvent } from './core/simple-event';
import { isElementAttached } from './core/is-element-attached';
import { Definition, DefinitionWalker, Sequence, Step, StepOrName } from './definition';
import { DesignerConfiguration } from './designer-configuration';
import { DesignerConfiguration, UndoStack } from './designer-configuration';
import { DesignerContext } from './designer-context';
import { DesignerView } from './designer-view';
import { DesignerState } from './designer-state';
import { ServicesResolver } from './services';
import { validateConfiguration } from './core/designer-configuration-validator';
import { DesignerApi } from './api';
import { HistoryController } from './history-controller';

export class Designer<TDefinition extends Definition = Definition> {
/**
Expand Down Expand Up @@ -43,7 +44,13 @@ export class Designer<TDefinition extends Definition = Definition> {
const designerApi = DesignerApi.create(designerContext);

const view = DesignerView.create(placeholder, designerContext, designerApi);
const designer = new Designer<TDef>(view, designerContext.state, designerContext.definitionWalker, designerApi);
const designer = new Designer<TDef>(
view,
designerContext.state,
designerContext.definitionWalker,
designerContext.historyController,
designerApi
);
view.workspace.onReady.subscribe(() => designer.onReady.forward());

designerContext.state.onDefinitionChanged.subscribe(() => {
Expand All @@ -52,10 +59,10 @@ export class Designer<TDefinition extends Definition = Definition> {
designerContext.state.onSelectedStepIdChanged.subscribe(() =>
designer.onSelectedStepIdChanged.forward(designerContext.state.selectedStepId)
);
designer.state.onIsToolboxCollapsedChanged.subscribe(isCollapsed => {
designerContext.state.onIsToolboxCollapsedChanged.subscribe(isCollapsed => {
designer.onIsToolboxCollapsedChanged.forward(isCollapsed);
});
designer.state.onIsEditorCollapsedChanged.subscribe(isCollapsed => {
designerContext.state.onIsEditorCollapsedChanged.subscribe(isCollapsed => {
designer.onIsEditorCollapsedChanged.forward(isCollapsed);
});
return designer;
Expand All @@ -65,6 +72,7 @@ export class Designer<TDefinition extends Definition = Definition> {
private readonly view: DesignerView,
private readonly state: DesignerState,
private readonly walker: DefinitionWalker,
private readonly historyController: HistoryController | undefined,
private readonly api: DesignerApi
) {}

Expand Down Expand Up @@ -198,6 +206,16 @@ export class Designer<TDefinition extends Definition = Definition> {
this.state.setIsEditorCollapsed(isCollapsed);
}

/**
* @description Dump the undo stack.
*/
public dumpUndoStack(): UndoStack {
if (!this.historyController) {
throw new Error('Undo feature is not activated');
}
return this.historyController.dump();
}

/**
* @param needle A step, a sequence or a step id.
* @returns parent steps and branch names.
Expand Down
Loading