Browse Source

Workflow-state.

pull/380/head
Sebastian Stehle 7 years ago
parent
commit
f4070cc9db
  1. 15
      src/Squidex/app/features/settings/pages/workflows/workflow-step.component.html
  2. 9
      src/Squidex/app/features/settings/pages/workflows/workflow-step.component.scss
  3. 3
      src/Squidex/app/features/settings/pages/workflows/workflow-step.component.ts
  4. 4
      src/Squidex/app/features/settings/pages/workflows/workflow-transition.component.html
  5. 7
      src/Squidex/app/features/settings/pages/workflows/workflow-transition.component.scss
  6. 11
      src/Squidex/app/features/settings/pages/workflows/workflows-page.component.html
  7. 2
      src/Squidex/app/features/settings/pages/workflows/workflows-page.component.ts
  8. 2
      src/Squidex/app/features/settings/settings-area.component.html
  9. 2
      src/Squidex/app/framework/utils/immutable-array.ts
  10. 2
      src/Squidex/app/shared/services/workflows.service.ts
  11. 2
      src/Squidex/app/shared/state/workflows.state.spec.ts

15
src/Squidex/app/features/settings/pages/workflows/workflow-step.component.html

@ -1,7 +1,10 @@
<div class="step"> <div class="step">
<div class="row no-gutters step-header"> <div class="row no-gutters step-header">
<div class="col-auto"> <div class="col-auto">
<button class="btn btn-initial mr-1" (click)="makeInitial.emit()" [disabled]="step.name === workflow.initial || step.isLocked"> <button class="btn btn-initial mr-1" (click)="makeInitial.emit()"
[class.enabled]="step.name !== workflow.initial && step.isLocked"
[class.active]="step.name === workflow.initial"
[disabled]="step.name === workflow.initial || step.isLocked || disabled">
<i class="icon-arrow-right text-decent" *ngIf="!step.isLocked"></i> <i class="icon-arrow-right text-decent" *ngIf="!step.isLocked"></i>
</button> </button>
</div> </div>
@ -10,14 +13,14 @@
[ngModelOptions]="onBlur" [ngModelOptions]="onBlur"
[ngModel]="step.color" [ngModel]="step.color"
(ngModelChange)="changeColor($event)" (ngModelChange)="changeColor($event)"
[disabled]="step.isLocked"> [disabled]="step.isLocked || disabled">
</sqx-color-picker> </sqx-color-picker>
</div> </div>
<div class="col"> <div class="col">
<sqx-editable-title <sqx-editable-title
[name]="step.name" [name]="step.name"
(nameChanged)="changeName($event)" (nameChanged)="changeName($event)"
[disabled]="step.isLocked"> [disabled]="step.isLocked || transitionAdd">
</sqx-editable-title> </sqx-editable-title>
</div> </div>
<div class="col"> <div class="col">
@ -26,7 +29,7 @@
<small class="text-decent">(Cannot be removed)</small> <small class="text-decent">(Cannot be removed)</small>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<button type="button" class="btn btn-text-danger" (click)="remove.emit()" *ngIf="!step.isLocked"> <button type="button" class="btn btn-text-danger" (click)="remove.emit()" *ngIf="!step.isLocked" [disabled]="disabled">
<i class="icon-bin2"></i> <i class="icon-bin2"></i>
</button> </button>
</div> </div>
@ -35,12 +38,13 @@
<div class="step-inner"> <div class="step-inner">
<sqx-workflow-transition *ngFor="let transition of transitions; trackBy: trackByTransition" <sqx-workflow-transition *ngFor="let transition of transitions; trackBy: trackByTransition"
[transition]="transition" [transition]="transition"
[disabled]="disabled"
[roles]="roles" [roles]="roles"
(remove)="transitionRemove.emit(transition)" (remove)="transitionRemove.emit(transition)"
(update)="changeTransition(transition, $event)"> (update)="changeTransition(transition, $event)">
</sqx-workflow-transition> </sqx-workflow-transition>
<div class="row transition no-gutters" *ngIf="openSteps.length > 0"> <div class="row transition no-gutters" *ngIf="openSteps.length > 0 && !disabled">
<div class="col-auto"> <div class="col-auto">
<i class="icon-corner-down-right text-decent"></i> <i class="icon-corner-down-right text-decent"></i>
</div> </div>
@ -60,6 +64,7 @@
<div class="form-check"> <div class="form-check">
<input class="form-check-input" type="checkbox" id="preventUpdates_{{step.name}}" <input class="form-check-input" type="checkbox" id="preventUpdates_{{step.name}}"
[disabled]="disabled"
[ngModel]="step.noUpdate" [ngModel]="step.noUpdate"
(ngModelChange)="changeNoUpdate($event)" /> (ngModelChange)="changeNoUpdate($event)" />

9
src/Squidex/app/features/settings/pages/workflows/workflow-step.component.scss

@ -40,16 +40,16 @@
.step { .step {
& { & {
margin-bottom: 1rem; margin-bottom: 1.5rem;
} }
&-inner { &-inner {
padding-left: 2rem; padding-left: 2.4rem;
} }
&-header { &-header {
&:hover { &:hover {
.btn-initial { .enabled {
visibility: visible; visibility: visible;
} }
} }
@ -68,6 +68,9 @@
&:disabled { &:disabled {
@include opacity(1); @include opacity(1);
}
&.active {
visibility: visible; visibility: visible;
} }
} }

3
src/Squidex/app/features/settings/pages/workflows/workflow-step.component.ts

@ -32,6 +32,9 @@ export class WorkflowStepComponent implements OnChanges {
@Input() @Input()
public roles: RoleDto[]; public roles: RoleDto[];
@Input()
public disabled: boolean;
@Output() @Output()
public makeInitial = new EventEmitter(); public makeInitial = new EventEmitter();

4
src/Squidex/app/features/settings/pages/workflows/workflow-transition.component.html

@ -12,6 +12,7 @@
</div> </div>
<div class="col"> <div class="col">
<input class="form-control" [class.dashed]="!transition.expression" spellcheck="false" <input class="form-control" [class.dashed]="!transition.expression" spellcheck="false"
[disabled]="disabled"
[ngModelOptions]="onBlur" [ngModelOptions]="onBlur"
[ngModel]="transition.expression" [ngModel]="transition.expression"
(ngModelChange)="changeExpression($event)" (ngModelChange)="changeExpression($event)"
@ -22,6 +23,7 @@
</div> </div>
<div class="col"> <div class="col">
<select class="form-control" [class.dashed]="!transition.role || transition.role === ''" <select class="form-control" [class.dashed]="!transition.role || transition.role === ''"
[disabled]="disabled"
[ngModel]="transition.role" [ngModel]="transition.role"
(ngModelChange)="changeRole($event)"> (ngModelChange)="changeRole($event)">
<option></option> <option></option>
@ -31,7 +33,7 @@
<span class="select-placeholder" *ngIf="!transition.role || transition.role === ''">Add Role</span> <span class="select-placeholder" *ngIf="!transition.role || transition.role === ''">Add Role</span>
</div> </div>
<div class="col-auto pl-2"> <div class="col-auto pl-2">
<button type="button" class="btn btn-text-danger" (click)="remove.emit()"> <button type="button" class="btn btn-text-danger" (click)="remove.emit()" [disabled]="disabled">
<i class="icon-bin2"></i> <i class="icon-bin2"></i>
</button> </button>
</div> </div>

7
src/Squidex/app/features/settings/pages/workflows/workflow-transition.component.scss

@ -15,3 +15,10 @@
line-height: 1.2rem; line-height: 1.2rem;
border: 1px solid transparent; border: 1px solid transparent;
} }
.form-control {
&:disabled,
&.disabled {
background: $panel-light-background;
}
}

11
src/Squidex/app/features/settings/pages/workflows/workflows-page.component.html

@ -1,6 +1,8 @@
<sqx-title message="{app} | Workflows | Settings" parameter1="app" [value1]="appsState.appName"></sqx-title>
<sqx-panel desiredWidth="50rem" isBlank="true" [isLazyLoaded]="false"> <sqx-panel desiredWidth="50rem" isBlank="true" [isLazyLoaded]="false">
<ng-container title> <ng-container title>
Workflows Workflow
</ng-container> </ng-container>
<ng-container menu> <ng-container menu>
@ -20,12 +22,13 @@
</ng-container> </ng-container>
<ng-container content> <ng-container content>
<ng-component *ngIf="workflow"> <ng-container *ngIf="workflow">
<ng-container *ngIf="rolesState.roles | async; let roles"> <ng-container *ngIf="rolesState.roles | async; let roles">
<sqx-workflow-step *ngFor="let step of workflow.steps; trackBy: trackByStep" <sqx-workflow-step *ngFor="let step of workflow.steps; trackBy: trackByStep"
[workflow]="workflow" [workflow]="workflow"
[step]="step" [disabled]="!workflow.canUpdate"
[roles]="roles" [roles]="roles"
[step]="step"
(makeInitial)="setInitial(step)" (makeInitial)="setInitial(step)"
(rename)="renameStep(step, $event)" (rename)="renameStep(step, $event)"
(remove)="removeStep(step)" (remove)="removeStep(step)"
@ -39,6 +42,6 @@
<button class="btn btn-success" (click)="addStep()" *ngIf="workflow.canUpdate"> <button class="btn btn-success" (click)="addStep()" *ngIf="workflow.canUpdate">
Add Step Add Step
</button> </button>
</ng-component> </ng-container>
</ng-container> </ng-container>
</sqx-panel> </sqx-panel>

2
src/Squidex/app/features/settings/pages/workflows/workflows-page.component.ts

@ -8,6 +8,7 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { import {
AppsState,
MathHelper, MathHelper,
RolesState, RolesState,
WorkflowDto, WorkflowDto,
@ -29,6 +30,7 @@ export class WorkflowsPageComponent implements OnInit {
public workflow: WorkflowDto; public workflow: WorkflowDto;
constructor( constructor(
public readonly appsState: AppsState,
public readonly rolesState: RolesState, public readonly rolesState: RolesState,
public readonly workflowsState: WorkflowsState public readonly workflowsState: WorkflowsState
) { ) {

2
src/Squidex/app/features/settings/settings-area.component.html

@ -45,7 +45,7 @@
</li> </li>
<li class="nav-item" *ngIf="selectedApp.canReadWorkflows"> <li class="nav-item" *ngIf="selectedApp.canReadWorkflows">
<a class="nav-link" routerLink="workflows" routerLinkActive="active"> <a class="nav-link" routerLink="workflows" routerLinkActive="active">
Workflows Workflow
<i class="icon-angle-right"></i> <i class="icon-angle-right"></i>
</a> </a>
</li> </li>

2
src/Squidex/app/framework/utils/immutable-array.ts

@ -197,7 +197,7 @@ export function compareStringsAsc(a: string, b: string) {
} }
export function compareStringsDesc(a: string, b: string) { export function compareStringsDesc(a: string, b: string) {
return a.localeCompare(b, undefined, { sensitivity: 'base' }); return b.localeCompare(a, undefined, { sensitivity: 'base' });
} }
export function compareNumbersAsc(a: number, b: number) { export function compareNumbersAsc(a: number, b: number) {

2
src/Squidex/app/shared/services/workflows.service.ts

@ -27,8 +27,8 @@ export class WorkflowDto {
public static DEFAULT = public static DEFAULT =
new WorkflowDto() new WorkflowDto()
.setStep('Archived', { color: '#eb3142', noUpdate: true })
.setStep('Draft', { color: '#8091a5' }) .setStep('Draft', { color: '#8091a5' })
.setStep('Archived', { color: '#eb3142', noUpdate: true })
.setStep('Published', { color: '#4bb958', isLocked: true }) .setStep('Published', { color: '#4bb958', isLocked: true })
.setTransition('Archived', 'Draft') .setTransition('Archived', 'Draft')
.setTransition('Draft', 'Archived') .setTransition('Draft', 'Archived')

2
src/Squidex/app/shared/state/workflows.state.spec.ts

@ -84,7 +84,7 @@ describe('WorkflowsState', () => {
const request = oldWorkflow.workflow.serialize(); const request = oldWorkflow.workflow.serialize();
workflowsService.setup(x => x.putWorkflow(app, oldWorkflow, request, version)) workflowsService.setup(x => x.putWorkflow(app, oldWorkflow.workflow, request, version))
.returns(() => of(versioned(newVersion, updated))).verifiable(); .returns(() => of(versioned(newVersion, updated))).verifiable();
workflowsState.save(oldWorkflow.workflow).subscribe(); workflowsState.save(oldWorkflow.workflow).subscribe();

Loading…
Cancel
Save