diff --git a/package-lock.json b/package-lock.json index b8479ff..770dbf0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "ngx-markdown": "^12.0.1", "protractor": "^7.0.0", "rxjs": "^6.5.3", - "sartography-workflow-lib": "^0.0.563", + "sartography-workflow-lib": "0.0.569", "tslib": "^2.3.0", "uuid": "^8.3.2", "zone.js": "^0.11.4" @@ -17413,9 +17413,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sartography-workflow-lib": { - "version": "0.0.563", - "resolved": "https://registry.npmjs.org/sartography-workflow-lib/-/sartography-workflow-lib-0.0.563.tgz", - "integrity": "sha512-aW6nYc/5w6TOrywuUDiCiw4wbQYxRH4fBrH1p0sDtzRggMpdfBdn7ccLd3aH+4GKZSnnxUNe3AdPBKbZ8draug==", + "version": "0.0.569", + "resolved": "https://registry.npmjs.org/sartography-workflow-lib/-/sartography-workflow-lib-0.0.569.tgz", + "integrity": "sha512-hcE8wvGpnAUr59rxbcwjB9Nq8tlsQnf5jFb9em2LiDJGi8OxPWQoJ1l+7YV0e8zS1yhU6Ym65DfUV6u367VkAw==", "dependencies": { "tslib": "^2.2.0" } @@ -34401,9 +34401,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sartography-workflow-lib": { - "version": "0.0.563", - "resolved": "https://registry.npmjs.org/sartography-workflow-lib/-/sartography-workflow-lib-0.0.563.tgz", - "integrity": "sha512-aW6nYc/5w6TOrywuUDiCiw4wbQYxRH4fBrH1p0sDtzRggMpdfBdn7ccLd3aH+4GKZSnnxUNe3AdPBKbZ8draug==", + "version": "0.0.569", + "resolved": "https://registry.npmjs.org/sartography-workflow-lib/-/sartography-workflow-lib-0.0.569.tgz", + "integrity": "sha512-hcE8wvGpnAUr59rxbcwjB9Nq8tlsQnf5jFb9em2LiDJGi8OxPWQoJ1l+7YV0e8zS1yhU6Ym65DfUV6u367VkAw==", "requires": { "tslib": "^2.2.0" } diff --git a/package.json b/package.json index c641079..f28b40b 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "backend:start": "cd docker && docker-compose up -d --force-recreate && cd ..", "backend": "npm run backend:stop && npm run backend:build && npm run backend:start", "env": "chmod +x ./docker/substitute-env-variables.sh && ./docker/substitute-env-variables.sh src/index.html PRODUCTION,API_URL,IRB_URL,HOME_ROUTE,BASE_HREF,DEPLOY_URL,PORT0,GOOGLE_ANALYTICS_KEY,SENTRY_KEY,TITLE", - "ci": "npm run lint && npm run test:coverage && sonar-scanner && npm run env && npm run backend && npm run e2e" + "ci": "npm run lint && npm run test:coverage && sonar-scanner" }, "private": true, "dependencies": { @@ -63,7 +63,7 @@ "ngx-markdown": "^12.0.1", "protractor": "^7.0.0", "rxjs": "^6.5.3", - "sartography-workflow-lib": "0.0.567", + "sartography-workflow-lib": "0.0.569", "tslib": "^2.3.0", "uuid": "^8.3.2", "zone.js": "^0.11.4" diff --git a/src/app/_dialogs/delete-workflow-spec-category-dialog/delete-workflow-spec-category-dialog.component.html b/src/app/_dialogs/delete-workflow-spec-category-dialog/delete-workflow-spec-category-dialog.component.html index 2d4b161..51b5861 100644 --- a/src/app/_dialogs/delete-workflow-spec-category-dialog/delete-workflow-spec-category-dialog.component.html +++ b/src/app/_dialogs/delete-workflow-spec-category-dialog/delete-workflow-spec-category-dialog.component.html @@ -1,5 +1,5 @@
- Delete category {{data.category.name}}? + Delete category {{data.category.id}}?
diff --git a/src/app/_dialogs/delete-workflow-spec-dialog/delete-workflow-spec-dialog.component.html b/src/app/_dialogs/delete-workflow-spec-dialog/delete-workflow-spec-dialog.component.html index de54c9f..6d74c5e 100644 --- a/src/app/_dialogs/delete-workflow-spec-dialog/delete-workflow-spec-dialog.component.html +++ b/src/app/_dialogs/delete-workflow-spec-dialog/delete-workflow-spec-dialog.component.html @@ -1,5 +1,5 @@
- Delete workflow specification {{data.workflowSpec.name}}? + Delete workflow specification {{data.workflowSpec.id}}?
diff --git a/src/app/_dialogs/workflow-spec-category-dialog/workflow-spec-category-dialog.component.ts b/src/app/_dialogs/workflow-spec-category-dialog/workflow-spec-category-dialog.component.ts index 7b98244..85dfdef 100644 --- a/src/app/_dialogs/workflow-spec-category-dialog/workflow-spec-category-dialog.component.ts +++ b/src/app/_dialogs/workflow-spec-category-dialog/workflow-spec-category-dialog.component.ts @@ -25,18 +25,7 @@ export class WorkflowSpecCategoryDialogComponent { placeholder: 'ID of workflow spec category', required: true, }, - }, - { - key: 'name', - type: 'input', - defaultValue: this.data.name, - templateOptions: { - label: 'Name', - placeholder: 'Name of workflow spec category', - description: 'Enter a name, in lowercase letters, separated by underscores, that is easy for you to remember.' + - 'It will be converted to all_lowercase_with_underscores when you save.', - required: true, - }, + hideExpression: true, }, { key: 'display_name', diff --git a/src/app/_dialogs/workflow-spec-dialog/workflow-spec-dialog.component.spec.ts b/src/app/_dialogs/workflow-spec-dialog/workflow-spec-dialog.component.spec.ts index 30a9a8b..685245a 100644 --- a/src/app/_dialogs/workflow-spec-dialog/workflow-spec-dialog.component.spec.ts +++ b/src/app/_dialogs/workflow-spec-dialog/workflow-spec-dialog.component.spec.ts @@ -11,7 +11,13 @@ import {Router} from '@angular/router'; import {RouterTestingModule} from '@angular/router/testing'; import {FormlyModule} from '@ngx-formly/core'; import {FormlyMaterialModule} from '@ngx-formly/material'; -import {ApiService, MockEnvironment, mockWorkflowSpec0, mockWorkflowSpecCategories} from 'sartography-workflow-lib'; +import { + ApiService, + MockEnvironment, + mockWorkflowSpec0, + mockWorkflowSpecCategories, + mockWorkflowSpecs +} from 'sartography-workflow-lib'; import {WorkflowSpecDialogData} from '../../_interfaces/dialog-data'; import {WorkflowSpecDialogComponent} from './workflow-spec-dialog.component'; @@ -74,6 +80,12 @@ describe('WorkflowSpecDialogComponent', () => { expect(catReq.request.method).toEqual('GET'); catReq.flush(mockWorkflowSpecCategories); expect(component.categories.length).toBeGreaterThan(0); + + const specReq = httpMock.expectOne('apiRoot/workflow-specification'); + expect(specReq.request.method).toEqual('GET'); + specReq.flush(mockWorkflowSpecs); + expect(component.specs.length).toBeGreaterThan(0); + }); afterEach(() => { diff --git a/src/app/_dialogs/workflow-spec-dialog/workflow-spec-dialog.component.ts b/src/app/_dialogs/workflow-spec-dialog/workflow-spec-dialog.component.ts index b6ed230..1369002 100644 --- a/src/app/_dialogs/workflow-spec-dialog/workflow-spec-dialog.component.ts +++ b/src/app/_dialogs/workflow-spec-dialog/workflow-spec-dialog.component.ts @@ -1,22 +1,26 @@ import {Component, Inject} from '@angular/core'; -import {FormGroup} from '@angular/forms'; +import {FormControl, FormGroup, ValidationErrors} from '@angular/forms'; import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; import {FormlyFieldConfig, FormlyFormOptions, FormlyTemplateOptions} from '@ngx-formly/core'; import {ApiService, toSnakeCase} from 'sartography-workflow-lib'; import {v4 as uuidv4} from 'uuid'; import {WorkflowSpecDialogData} from '../../_interfaces/dialog-data'; +import {of} from "rxjs"; + @Component({ selector: 'app-workflow-spec-dialog', templateUrl: './workflow-spec-dialog.component.html', styleUrls: ['./workflow-spec-dialog.component.scss'] }) + export class WorkflowSpecDialogComponent { form: FormGroup = new FormGroup({}); model: any = {}; options: FormlyFormOptions = {}; fields: FormlyFieldConfig[] = []; categories: any; + specs: any; constructor( private api: ApiService, @@ -29,29 +33,29 @@ export class WorkflowSpecDialogComponent { label: c.display_name, })); + this.api.getWorkflowSpecList().subscribe(wfs => { + this.specs = wfs.map(w => w.id); + this.fields = [ { key: 'id', type: 'input', - defaultValue: this.data.id || uuidv4(), + defaultValue: this.data.id, templateOptions: { - label: 'ID', - placeholder: 'UUID of workflow specification', - description: 'This is an autogenerated unique ID and is not editable.', - required: true, - disabled: true, - }, - }, - { - key: 'name', - type: 'input', - defaultValue: this.data.name, - templateOptions: { - label: 'Name', + label: 'id', placeholder: 'Name of workflow specification', - description: 'Enter a name, in lowercase letters, separated by underscores, that is easy for you to remember.' + + description: 'Enter a name to identify this spec. It cannot be changed later.' + 'It will be converted to all_lowercase_with_underscores when you save.', required: true, + disabled: this.data.id !== '', + }, + asyncValidators: { + uniqueID: { + expression: (control: FormControl) => { + return of(this.specs.indexOf(control.value) === -1); + }, + message: 'This ID name is already taken.', + }, }, }, { @@ -110,6 +114,7 @@ export class WorkflowSpecDialogComponent { }, ]; }); + }); } onNoClick() { diff --git a/src/app/_interfaces/dialog-data.ts b/src/app/_interfaces/dialog-data.ts index d5aed86..4af9296 100644 --- a/src/app/_interfaces/dialog-data.ts +++ b/src/app/_interfaces/dialog-data.ts @@ -20,7 +20,6 @@ export interface OpenFileDialogData { export interface WorkflowSpecDialogData { id: string; - name: string; display_name: string; description: string; category_id: number; @@ -31,7 +30,6 @@ export interface WorkflowSpecDialogData { export interface WorkflowSpecCategoryDialogData { id: number; - name: string; display_name: string; display_order?: number; admin: boolean; diff --git a/src/app/modeler/modeler.component.html b/src/app/modeler/modeler.component.html index e4fffd4..152c747 100644 --- a/src/app/modeler/modeler.component.html +++ b/src/app/modeler/modeler.component.html @@ -5,7 +5,7 @@ Back {{workflowSpec.display_name}} - ({{workflowSpec.name}}) + ({{workflowSpec.id}})