diff --git a/package.json b/package.json index b602f56..a50c9e0 100644 --- a/package.json +++ b/package.json @@ -58,9 +58,9 @@ "@mdi/font": "^7.4.47", "@netgrif/components": "7.0.0-beta.1", "@netgrif/components-core": "7.0.0-beta.1", - "@netgrif/petri.svg": "1.1.0", + "@netgrif/petri.svg": "1.1.1", "@netgrif/petriflow": "2.2.0", - "@netgrif/petriflow.svg": "1.1.0", + "@netgrif/petriflow.svg": "1.1.1", "@ngbracket/ngx-layout": "^17.0.1", "@ngx-translate/core": "~15.0.0", "@ngx-translate/http-loader": "~8.0.0", diff --git a/src/app/form-builder/edit-panel/edit-panel.component.html b/src/app/form-builder/edit-panel/edit-panel.component.html index c589897..aed7533 100644 --- a/src/app/form-builder/edit-panel/edit-panel.component.html +++ b/src/app/form-builder/edit-panel/edit-panel.component.html @@ -151,20 +151,9 @@

class="full-width"> - - Initial value - - - - {{ taskRefTitle(option) }} - - - +
+ +
diff --git a/src/app/form-builder/form-builder.component.html b/src/app/form-builder/form-builder.component.html index 3dcdf51..3b363b3 100644 --- a/src/app/form-builder/form-builder.component.html +++ b/src/app/form-builder/form-builder.component.html @@ -11,6 +11,7 @@ [style.width.px]="width" fixedInViewport=true disableClose="true" + style="max-width: 450px;" class="app-mat-sidenav-right" mode="side" position="end" opened>
diff --git a/src/app/form-builder/form-builder.module.ts b/src/app/form-builder/form-builder.module.ts index 0454779..aafd202 100644 --- a/src/app/form-builder/form-builder.module.ts +++ b/src/app/form-builder/form-builder.module.ts @@ -15,6 +15,7 @@ import {InfoLabelComponent} from './info-label/info-label.component'; import {DataFieldsComponentModule} from '@netgrif/components'; import {FlexLayoutModule} from '@ngbracket/ngx-layout'; import {ResizableModule} from 'angular-resizable-element'; +import {ModelerModule} from '../modeler/modeler.module'; @NgModule({ declarations: [ @@ -39,7 +40,8 @@ import {ResizableModule} from 'angular-resizable-element'; HttpClientModule, MaterialImportModule, ReactiveFormsModule, - ResizableModule + ResizableModule, + ModelerModule ] }) export class FormBuilderModule { diff --git a/src/app/modeler/data-mode/data-detail/data-detail.component.html b/src/app/modeler/data-mode/data-detail/data-detail.component.html index faffabd..fcbb243 100644 --- a/src/app/modeler/data-mode/data-detail/data-detail.component.html +++ b/src/app/modeler/data-mode/data-detail/data-detail.component.html @@ -142,45 +142,93 @@
- + Initial value - - - - - Initial value - - None - - {{ opt.value?.value }} - - - - - - {{ opt.value?.value }} - - - - - - - Initial value - - - - - - - - + + + @switch (item.type) { + @case (DataType.BOOLEAN) { +
+ Initial value + + {{item.init.value}} + +
+ } + @case (DataType.NUMBER) { + + Initial value + + + } + @case (DataType.DATE) { + + Initial value + + + + + + } + @case (DataType.DATETIME) { + + Initial value + + + + + + } + @case (DataType.TASK_REF) { + + } + @case ((item.type === DataType.ENUMERATION || item.type === DataType.ENUMERATION_MAP) ? item.type : '') { + + Initial value + + None + + {{ opt.value?.value }} + + + + } + @case ((item.type === DataType.MULTICHOICE || item.type === DataType.MULTICHOICE_MAP) ? item.type : '') { + + Initial value + + + {{ opt.value?.value }} + + + + } + @default { + + Initial value + + + } + } +
@@ -310,21 +358,12 @@
Options Init
- +
- -
Is Options Init dynamic?
- - - - - -
diff --git a/src/app/modeler/data-mode/data-detail/data-detail.component.ts b/src/app/modeler/data-mode/data-detail/data-detail.component.ts index 792aaa3..42aa612 100644 --- a/src/app/modeler/data-mode/data-detail/data-detail.component.ts +++ b/src/app/modeler/data-mode/data-detail/data-detail.component.ts @@ -1,9 +1,11 @@ -import {Component, OnDestroy} from '@angular/core'; +import {Component, ElementRef, OnDestroy, ViewChild} from '@angular/core'; import {DataMasterDetailService} from '../data-master-detail.service'; import { Component as PetriflowComponent, DataType, - DataVariable, Expression, I18nString, + DataVariable, + Expression, + I18nString, I18nWithDynamic, Option, Property, @@ -23,6 +25,8 @@ import {HistoryService} from '../../services/history/history.service'; import {Observable} from 'rxjs'; import {map, startWith, tap} from 'rxjs/operators'; import {ModelerUtils} from '../../modeler-utils'; +import {MatAutocompleteSelectedEvent} from '@angular/material/autocomplete'; +import {MatChipInputEvent} from '@angular/material/chips'; export interface TypeArray { viewValue: string; @@ -174,21 +178,14 @@ export class DataDetailComponent implements OnDestroy { this.item.placeholder.value = $event.target.value; break; } - case 'init': { - const value = $event.target.value; - if (this.item.init === undefined) { - this.item.init = new I18nWithDynamic(value); - } else { - this.item.init.value = value; - } - break; - } case 'dynamic-init': { const value = $event.source.checked; if (this.item.init === undefined) { - this.item.init = new I18nWithDynamic(value); - } else { - this.item.init.dynamic = value; + this.item.init = new I18nWithDynamic(''); + } + this.item.init.dynamic = value; + if (value === true) { + this.item.inits = new Array(); } break; } @@ -231,6 +228,31 @@ export class DataDetailComponent implements OnDestroy { this.historyDataSave.save = true; } + setBooleanValue(event) { + this.item.init.value = event.checked.toString(); + } + + setNumberValue(event) { + this.item.init.value = event.target.value.toString(); + } + + formatDate(event) { + // TODO: NAB-326 better solution? date picker setting to store only date? + if (event.target.value) { + this.item.init.value = event.target.value.toISOString(); + } else { + this.item.init.value = ''; + } + } + + formatDateTime(event) { + if (event.target.value) { + this.item.init.value = event.target.value.toISOString(); + } else { + this.item.init.value = ''; + } + } + removeSpecificAttributeOnChange() { this.item.inits = []; this.item.init.value = ''; @@ -364,4 +386,8 @@ export class DataDetailComponent implements OnDestroy { trackByFn(index: any, item: any) { return index; } + + protected readonly DataType = DataType; + protected readonly Boolean = Boolean; + protected readonly DataFieldUtils = DataFieldUtils; } diff --git a/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.html b/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.html new file mode 100644 index 0000000..72185ff --- /dev/null +++ b/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.html @@ -0,0 +1,26 @@ + + Initial value + + @for (init of taskRef.inits; track $index) { + + {{ prettyTask(init?.value) }} + + + } + + + + @for (task of tasks; track task) { + {{ task.label?.value }} [{{ task.id }}] + } + + diff --git a/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.scss b/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.scss new file mode 100644 index 0000000..07b4686 --- /dev/null +++ b/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.scss @@ -0,0 +1,3 @@ +.full-width { + width: 100%; +} diff --git a/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.spec.ts b/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.spec.ts new file mode 100644 index 0000000..4430f2e --- /dev/null +++ b/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TaskRefInitFieldComponent } from './task-ref-init-field.component'; + +describe('TaskRefInitFieldComponent', () => { + let component: TaskRefInitFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TaskRefInitFieldComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TaskRefInitFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.ts b/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.ts new file mode 100644 index 0000000..2d06c7a --- /dev/null +++ b/src/app/modeler/data-mode/task-ref-init-field/task-ref-init-field.component.ts @@ -0,0 +1,75 @@ +import {Component, ElementRef, Input, ViewChild} from '@angular/core'; +import {FlexModule} from '@ngbracket/ngx-layout'; +import {MatDatepicker, MatDatepickerInput, MatDatepickerToggle} from '@angular/material/datepicker'; +import {MatFormField, MatLabel, MatPrefix} from '@angular/material/form-field'; +import {MatInput} from '@angular/material/input'; +import {FormControl, ReactiveFormsModule} from '@angular/forms'; +import {ModelService} from '../../services/model/model.service'; +import {DataVariable, I18nWithDynamic, Transition} from '@netgrif/petriflow'; +import {MatChipInputEvent} from '@angular/material/chips'; +import {MatAutocompleteSelectedEvent} from '@angular/material/autocomplete'; + +@Component({ + selector: 'nab-task-ref-init-field', + templateUrl: './task-ref-init-field.component.html', + styleUrl: './task-ref-init-field.component.scss' +}) +export class TaskRefInitFieldComponent { + + @Input() taskRef: DataVariable; + taskRefFormControl: FormControl; + @ViewChild('taskRefInput') taskRefInput: ElementRef; + + constructor(private _modelService: ModelService) { + this.taskRefFormControl = new FormControl(''); + } + + removeInit(index: number): void { + if (index >= 0) { + this.taskRef.inits.splice(index, 1); + } + } + + addInit($event: MatChipInputEvent): void { + this.taskRef.inits.push(new I18nWithDynamic($event.value)); + + $event.chipInput!.clear(); + this.taskRefFormControl.setValue(null); + } + + selectInit($event: MatAutocompleteSelectedEvent): void { + this.taskRef.inits.push(new I18nWithDynamic($event.option.value)); + this.taskRefInput.nativeElement.value = ''; + this.taskRefFormControl.setValue(null); + } + + get tasks(): Transition[] { + return this._modelService.model.getTransitions().filter(t => { + return !this.taskRef.inits.some(init => init.value === t.id); + }).sort((t1, t2) => { + if (!t1.label.value && !t2.label.value) { + return t1.id > t2.id ? 1 : -1; + } + if (!t1.label.value) { + return 1; + } + if (!t2.label.value) { + return -1; + } + return t1.label.value.localeCompare(t2.label.value); + }); + } + + prettyTask(taskId: string): string { + const task = this._modelService.model.getTransition(taskId); + if (task === undefined) { + return taskId; + } + const taskTitle = task.label.value ? `${task.label.value} ` : ''; + return `${taskTitle} [${taskId}]`; + } + + isReferenced(task: Transition): boolean { + return task.dataGroups.some(group => !!group.getDataRef(this.taskRef.id)); + } +} diff --git a/src/app/modeler/modeler.module.ts b/src/app/modeler/modeler.module.ts index b4b1b06..2c02b5d 100644 --- a/src/app/modeler/modeler.module.ts +++ b/src/app/modeler/modeler.module.ts @@ -72,6 +72,7 @@ import {HistoryMasterItemComponent} from './history-mode/history-master-item/his import {HistoryDetailComponent} from './history-mode/history-detail/history-detail.component'; import {MonacoEditorModule} from 'ngx-monaco-editor-v2'; import {FileToolComponent} from './control-panel/tools/file-tool-component/file-tool.component'; +import {TaskRefInitFieldComponent} from './data-mode/task-ref-init-field/task-ref-init-field.component'; @NgModule({ declarations: [ @@ -117,11 +118,13 @@ import {FileToolComponent} from './control-panel/tools/file-tool-component/file- FunctionMasterItemComponent, ActionDetailComponent, HistoryMasterItemComponent, - HistoryDetailComponent + HistoryDetailComponent, + TaskRefInitFieldComponent ], exports: [ ActionEditorModule, - TriggerTreeComponent + TriggerTreeComponent, + TaskRefInitFieldComponent ], imports: [ ActionEditorModule, @@ -129,7 +132,6 @@ import {FileToolComponent} from './control-panel/tools/file-tool-component/file- CommonModule, DataFieldsComponentModule, FlexLayoutModule, - FormBuilderModule, FormsModule, GridsterModule, JoyrideModule,