diff --git a/src/Squidex/app/features/settings/declarations.ts b/src/Squidex/app/features/settings/declarations.ts index fdb82e6b5..17e095257 100644 --- a/src/Squidex/app/features/settings/declarations.ts +++ b/src/Squidex/app/features/settings/declarations.ts @@ -18,5 +18,7 @@ export * from './pages/patterns/patterns-page.component'; export * from './pages/plans/plans-page.component'; export * from './pages/roles/role.component'; export * from './pages/roles/roles-page.component'; +export * from './pages/workflows/workflow-step.component'; +export * from './pages/workflows/workflows-page.component'; export * from './settings-area.component'; \ No newline at end of file diff --git a/src/Squidex/app/features/settings/module.ts b/src/Squidex/app/features/settings/module.ts index 633249037..29802f591 100644 --- a/src/Squidex/app/features/settings/module.ts +++ b/src/Squidex/app/features/settings/module.ts @@ -30,7 +30,9 @@ import { PlansPageComponent, RoleComponent, RolesPageComponent, - SettingsAreaComponent + SettingsAreaComponent, + WorkflowsPageComponent, + WorkflowStepComponent } from './declarations'; const routes: Routes = [ @@ -170,6 +172,10 @@ const routes: Routes = [ } } ] + }, + { + path: 'workflows', + component: WorkflowsPageComponent } ] } @@ -196,7 +202,9 @@ const routes: Routes = [ PlansPageComponent, RoleComponent, RolesPageComponent, - SettingsAreaComponent + SettingsAreaComponent, + WorkflowsPageComponent, + WorkflowStepComponent ] }) export class SqxFeatureSettingsModule { } \ No newline at end of file diff --git a/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.html b/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.html new file mode 100644 index 000000000..70f05540d --- /dev/null +++ b/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.html @@ -0,0 +1,63 @@ +
+
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+
+
{{transition.to}} +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
{{target.name}} +
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.scss b/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.scss new file mode 100644 index 000000000..a51dd500f --- /dev/null +++ b/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.scss @@ -0,0 +1,39 @@ +@import '_vars'; +@import '_mixins'; + +.color { + line-height: 2.8rem; +} + +.color-circle { + @include circle(12px); + border: 1px solid $color-border-dark; + background: $color-border; + display: inline-block; +} + +.dashed { + border-style: dashed; +} + +.transition { + & { + padding-left: 1rem; + margin-top: .25rem; + margin-bottom: .5rem; + line-height: 2rem; + } + + &-to { + padding: .5rem .75rem; + background: transparent; + border: 1px solid transparent; + line-height: 1.2rem; + } +} + +.step { + & { + margin-bottom: 1rem; + } +} \ No newline at end of file diff --git a/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.ts b/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.ts new file mode 100644 index 000000000..afbb45169 --- /dev/null +++ b/src/Squidex/app/features/settings/pages/workflows/workflow-step.component.ts @@ -0,0 +1,69 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; + +import { + WorkflowDto, + WorkflowStep, + WorkflowStepValues, + WorkflowTransition, + WorkflowTransitionView +} from '@app/shared'; + +@Component({ + selector: 'sqx-workflow-step', + styleUrls: ['./workflow-step.component.scss'], + templateUrl: './workflow-step.component.html' +}) +export class WorkflowStepComponent implements OnChanges { + @Input() + public workflow: WorkflowDto; + + @Input() + public step: WorkflowStep; + + @Output() + public transitionAdd = new EventEmitter(); + + @Output() + public transitionRemove = new EventEmitter(); + + @Output() + public update = new EventEmitter(); + + @Output() + public rename = new EventEmitter(); + + @Output() + public remove = new EventEmitter(); + + public onBlur = { updateOn: 'blur' }; + + public openSteps: WorkflowStep[]; + public openStep: WorkflowStep; + + public transitions: WorkflowTransitionView[]; + + public ngOnChanges(changes: SimpleChanges) { + if (changes['workflow'] || changes['step'] || false) { + this.openSteps = this.workflow.getOpenSteps(this.step); + this.openStep = this.openSteps[0]; + + this.transitions = this.workflow.getTransitions(this.step); + } + } + + public changeName(name: string) { + this.rename.emit(name); + } + + public changeColor(color: string) { + this.update.emit({ color }); + } +} + diff --git a/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.html b/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.html new file mode 100644 index 000000000..c5782052b --- /dev/null +++ b/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.html @@ -0,0 +1,37 @@ + + + Workflows + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.scss b/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.scss new file mode 100644 index 000000000..fbb752506 --- /dev/null +++ b/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.scss @@ -0,0 +1,2 @@ +@import '_vars'; +@import '_mixins'; \ No newline at end of file diff --git a/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.ts b/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.ts new file mode 100644 index 000000000..272a2852b --- /dev/null +++ b/src/Squidex/app/features/settings/pages/workflows/workflows-page.component.ts @@ -0,0 +1,65 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { Component, OnInit } from '@angular/core'; + +import { + WorkflowDto, + WorkflowStep, + WorkflowStepValues, + WorkflowTransition +} from '@app/shared'; + +@Component({ + selector: 'sqx-workflows-page', + styleUrls: ['./workflows-page.component.scss'], + templateUrl: './workflows-page.component.html' +}) +export class WorkflowsPageComponent implements OnInit { + public workflow: WorkflowDto; + + public ngOnInit() { + this.workflow = new WorkflowDto().setStep('Published', { color: 'green', isLocked: true }); + } + + public reload() { + return; + } + + public save() { + return; + } + + public addStep() { + this.workflow = this.workflow.setStep(`Step${this.workflow.steps.length + 1}`, {}); + } + + public addTransiton(from: WorkflowStep, to: WorkflowStep) { + this.workflow = this.workflow.setTransition(from.name, to.name, {}); + } + + public removeTransition(from: WorkflowStep, transition: WorkflowTransition) { + this.workflow = this.workflow.removeTransition(from.name, transition.to); + } + + public updateStep(step: WorkflowStep, values: WorkflowStepValues) { + this.workflow = this.workflow.setStep(step.name, values); + } + + public renameStep(step: WorkflowStep, newName: string) { + this.workflow = this.workflow.renameStep(step.name, newName); + } + + public removeStep(step: WorkflowStep) { + this.workflow = this.workflow.removeStep(step.name); + } + + public trackByStep(index: number, step: WorkflowStep) { + return step.name; + } +} + diff --git a/src/Squidex/app/features/settings/settings-area.component.html b/src/Squidex/app/features/settings/settings-area.component.html index 5669f4b3c..cee2481d3 100644 --- a/src/Squidex/app/features/settings/settings-area.component.html +++ b/src/Squidex/app/features/settings/settings-area.component.html @@ -43,6 +43,12 @@ +