Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
5da6cb5
[NAB-358] - Release 2.1.0
mazarijuraj Nov 13, 2024
db18e62
[NAB-369] - Boolean field description
mazarijuraj Nov 13, 2024
e7fb00d
add initial loading with logo
tuplle Nov 13, 2024
680a528
Merge pull request #16 from netgrif/feature/initial-loading
mazarijuraj Nov 14, 2024
71252a3
[NAB-359] - Task ref with multiple init values
mazarijuraj Nov 18, 2024
b6b069f
[NAB-359] - Task ref with multiple init values
mazarijuraj Nov 19, 2024
44d395f
[NAB-359] - Task ref with multiple init values
mazarijuraj Nov 25, 2024
5a60cb3
[NAB-359] - Task ref with multiple init values
mazarijuraj Nov 25, 2024
360655b
[NAB-362] - Action editor interpolated string highlight
mazarijuraj Nov 28, 2024
2996490
[NAB-373] - Place reference value not changed on simulation
mazarijuraj Nov 29, 2024
97fe0e9
Merge pull request #15 from netgrif/NAB-369
mazarijuraj Nov 29, 2024
2b0ecfb
Merge pull request #18 from netgrif/NAB-373
mazarijuraj Nov 29, 2024
b60c760
Merge pull request #17 from netgrif/NAB-362
mazarijuraj Nov 29, 2024
3f706cb
[NAB-367] - One-click variable arc change
mazarijuraj Nov 29, 2024
ac7e0cd
[NAB-367] - One-click variable arc change
mazarijuraj Nov 29, 2024
ba28244
[NAB-367] - One-click variable arc change
mazarijuraj Nov 29, 2024
ab85397
[NAB-367] - One-click variable arc change
mazarijuraj Dec 2, 2024
58830d9
[NAB-368] - Component parameters
mazarijuraj Dec 4, 2024
d18b24b
[NAB-368] - Component parameters
mazarijuraj Dec 9, 2024
e9793d9
[NAB-368] - Component parameters
mazarijuraj Dec 16, 2024
9fbded8
[NAB-372] - Element move after dialog save
mazarijuraj Dec 16, 2024
47af2f7
Merge pull request #20 from netgrif/NAB-372
mazarijuraj Dec 16, 2024
ff8cb62
Merge branch 'next' into NAB-367
mazarijuraj Dec 16, 2024
7aa8b26
[NAB-367] - One-click variable arc change
mazarijuraj Dec 16, 2024
dc056d9
[NAB-367] - One-click variable arc change
mazarijuraj Dec 16, 2024
4bb65be
Merge pull request #19 from netgrif/NAB-367
mazarijuraj Dec 16, 2024
801cd32
[NAB-358] - Release 2.1.0
mazarijuraj Dec 16, 2024
690b835
[NAB-371] Safari black canvas
camperko Mar 27, 2025
ff5bf06
[NAB-359] Task ref with multiple init values
camperko Mar 27, 2025
9201b63
Merge remote-tracking branch 'origin/next' into NAB-359
camperko Mar 27, 2025
64308d0
Merge remote-tracking branch 'origin/next' into NAB-368
camperko Mar 27, 2025
60a15d2
[NAB-368] Component parameters
camperko Apr 1, 2025
eec18ea
[NAB-377] Incorrect Demo Link
camperko Apr 1, 2025
09312e1
[NAB-376] Action Edtitor Groovy tutorial
camperko Apr 1, 2025
5bf80c6
[NAB-374] Right click shows default browser context menu
camperko Apr 3, 2025
9b380eb
[NAB-374] Right click shows default browser context menu
camperko Apr 3, 2025
25f819f
Merge pull request #25 from netgrif/NAB-374
mazarijuraj Apr 7, 2025
0be33a8
Merge pull request #24 from netgrif/NAB-376
mazarijuraj Apr 7, 2025
dc733e6
Merge pull request #23 from netgrif/NAB-377
mazarijuraj Apr 7, 2025
956a98c
[NAB-359] - Task ref with multiple init values
mazarijuraj Apr 7, 2025
9983fc8
Merge pull request #21 from netgrif/NAB-359
mazarijuraj Apr 7, 2025
dd50cba
Merge branch 'next' into NAB-368
mazarijuraj Apr 7, 2025
020ecfd
[NAB-375] Variables with no init values referenced in arcs will cause…
camperko Apr 7, 2025
c9b7fa2
[NAB-368] Component parameters
camperko Apr 8, 2025
1c6ba63
Merge remote-tracking branch 'origin/NAB-368' into NAB-368
mazarijuraj Apr 14, 2025
f5df106
Merge pull request #22 from netgrif/NAB-368
mazarijuraj Apr 14, 2025
77a3d63
[NAB-378] Global role support
tuplle May 14, 2025
e5daa2f
[NAB-375] Variables with no init values referenced in arcs will cause…
tuplle May 14, 2025
3c41e30
Merge pull request #26 from netgrif/NAB-375
tuplle May 14, 2025
68377b5
Merge pull request #27 from netgrif/NAB-378
tuplle May 14, 2025
c173387
increase version to 2.1.0-RC.3
tuplle May 14, 2025
6a4460d
[NAB-375] Variables with no init values referenced in arcs will cause…
mazarijuraj Jun 4, 2025
6094167
[NAB-358] Release 2.1.0
mazarijuraj Jun 4, 2025
9528c05
[NAB-358] Release 2.1.0
mazarijuraj Jun 24, 2025
cf2a8b5
[NAB-358] Release 2.1.0
mazarijuraj Jun 24, 2025
fc78a5a
[NAB-358] Release 2.1.0
mazarijuraj Jun 26, 2025
d0c96e9
[NAB-358] Release 2.1.0
mazarijuraj Jun 26, 2025
636a552
increase version to 2.1.0-RC.7
tuplle Sep 3, 2025
4142aaa
[NAB-389] Cannot change the number of columns in form editor
Kovy95 Oct 23, 2025
62182da
[NAB-389] Cannot change the number of columns in form editor
Kovy95 Dec 17, 2025
5b1962f
Merge pull request #29 from netgrif/NAB-389
tuplle Dec 17, 2025
8f31d26
increase version to 2.1.0-RC.8
tuplle Dec 17, 2025
2a2bf47
[NAB-390] Change demo link to eTask
mazarijuraj Dec 18, 2025
e558a7a
Merge pull request #31 from netgrif/NAB-390
tuplle Jan 14, 2026
5cc1e88
Display application version in the sidenav
tuplle Jan 14, 2026
9f96b8f
Reorganize imports across components and services
tuplle Jan 14, 2026
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ Thumbs.db
.scannerwork/
out/
package-lock.json
pnpm-lock.yaml
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
Expand Down
2 changes: 1 addition & 1 deletion nae.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@
"urls": {
"netgrif": "https://netgrif.com",
"bpmn2pn": "https://bpmn2pn.netgrif.cloud/bpmn2pn/",
"engine": "https://demo.netgrif.com/",
"engine": "https://etask.netgrif.cloud/",
"youtube": "https://www.youtube.com/channel/UCNfqgnjskMMpy7QvOOKhKgw",
"github": "https://github.com/netgrif",
"issues": "https://github.com/netgrif/application-builder/issues"
Expand Down
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@netgrif/application-builder",
"version": "2.0.0",
"version": "2.1.0-RC.8",
"description": "Netgrif Application Builder for building, configuring and modeling applications for Application Engine.",
"homepage": "https://builder.netgrif.com",
"license": "SEE LICENSE IN LICENSE FILE",
Expand Down Expand Up @@ -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/petriflow": "2.2.0",
"@netgrif/petriflow.svg": "1.1.0",
"@netgrif/petri.svg": "1.1.1",
"@netgrif/petriflow": "2.2.2",
"@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",
Expand Down
4 changes: 2 additions & 2 deletions src/app/app-builder-view.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {ConfigurationService, LoggerService, ViewService} from '@netgrif/components-core';
import {Router} from '@angular/router';
import {Injectable} from '@angular/core';
import {Router} from '@angular/router';
import {ConfigurationService, LoggerService, ViewService} from '@netgrif/components-core';

@Injectable({
providedIn: 'root',
Expand Down
4 changes: 2 additions & 2 deletions src/app/app-routing.module.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NgModule } from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {CommonModule} from '@angular/common';
import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';

const routes: Routes = [];

Expand Down
5 changes: 4 additions & 1 deletion src/app/app.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
text="{{tutorial.demo.text}}"
stepPosition="{{tutorial.demo.position}}"
(click)="openInTab(config.services.urls.engine)"
matTooltip="Netgrif Demo" matTooltipPosition="right">
matTooltip="Netgrif eTask" matTooltipPosition="right">
<mat-icon>play_arrow</mat-icon>
</mat-list-item>
<mat-list-item class="field-list-mat-list-item"
Expand Down Expand Up @@ -58,6 +58,9 @@
matTooltip="Help" matTooltipPosition="right">
<mat-icon>help</mat-icon>
</mat-list-item>
<mat-list-item class="field-list-mat-list-item">
<span class="app-version-text">2.1.0</span>
</mat-list-item>
Comment on lines +61 to +63
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Consider dynamically injecting the version number.

Hardcoding the version "2.1.0" in the template creates a maintenance burden—it must be manually updated with each release and risks drifting out of sync with package.json.

♻️ Suggested approach

Inject the version from the component:

-                <mat-list-item class="field-list-mat-list-item">
-                    <span class="app-version-text">2.1.0</span>
-                </mat-list-item>
+                <mat-list-item class="field-list-mat-list-item"
+                               matTooltip="Application version" matTooltipPosition="right">
+                    <span class="app-version-text">{{ appVersion }}</span>
+                </mat-list-item>

Then in the component class, read the version from package.json or an environment variable:

import { version } from '../../../package.json';

export class AppComponent {
  appVersion = version;
  // ...
}

Ensure resolveJsonModule and allowSyntheticDefaultImports are enabled in tsconfig.json.

🤖 Prompt for AI Agents
In `@src/app/app.component.html` around lines 61 - 63, Replace the hardcoded
"2.1.0" in the template span with an Angular binding to a component property
(e.g., replace the span content in the mat-list-item with {{ appVersion }}),
then update the AppComponent class to import the version from package.json
(import { version } ...) and assign it to appVersion; ensure tsconfig.json
enables resolveJsonModule and allowSyntheticDefaultImports so the JSON import
works.

</mat-action-list>
</mat-sidenav>
<joyrideStep joyrideStep="{{tutorial.welcome.step}}" stepPosition="{{tutorial.welcome.position}}"
Expand Down
2 changes: 1 addition & 1 deletion src/app/app.component.scss
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,4 @@
padding-right: 9px;
height: 42px;
}
}
}
18 changes: 9 additions & 9 deletions src/app/app.component.spec.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import {waitForAsync, TestBed} from '@angular/core/testing';
import {AppComponent} from './app.component';
import {HttpClientTestingModule} from '@angular/common/http/testing';
import {NO_ERRORS_SCHEMA} from '@angular/core';
import {TestBed, waitForAsync} from '@angular/core/testing';
import {FlexLayoutModule} from '@angular/flex-layout';
import {MatListModule} from '@angular/material/list';
import {BrowserModule} from '@angular/platform-browser';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {MaterialImportModule} from './material-import/material-import.module';
import {FlexLayoutModule} from '@angular/flex-layout';
import {FormBuilderModule} from './form-builder/form-builder.module';
import {RouterTestingModule} from '@angular/router/testing';
import {MatListModule} from '@angular/material/list';
import {JoyrideModule} from 'ngx-joyride';
import {AuthenticationModule, ConfigurationService} from '@netgrif/components-core';
import {JoyrideModule} from 'ngx-joyride';
import {AppBuilderConfigurationService} from './app-builder-configuration.service';
import {HttpClientTestingModule} from '@angular/common/http/testing';
import {AppComponent} from './app.component';
import {AppModule} from './app.module';
import {NO_ERRORS_SCHEMA} from '@angular/core';
import {FormBuilderModule} from './form-builder/form-builder.module';
import {MaterialImportModule} from './material-import/material-import.module';

describe('AppComponent', () => {
beforeEach(waitForAsync(() => {
Expand Down
4 changes: 2 additions & 2 deletions src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ import {AfterViewInit, Component, HostListener} from '@angular/core';
import {MatDialog} from '@angular/material/dialog';
import {Router} from '@angular/router';
import {NetgrifApplicationEngine} from '@netgrif/components-core/';
import {JoyrideService} from 'ngx-joyride';
import {AppBuilderConfigurationService} from './app-builder-configuration.service';
import {DialogConfirmComponent} from './dialogs/dialog-confirm/dialog-confirm.component';
import {
DialogLocalStorageModelComponent,
DialogLocalStorageModelComponent,
} from './dialogs/dialog-local-storage-model/dialog-local-storage-model.component';
import {ModelImportService} from './modeler/model-import-service';
import {ModelerConfig} from './modeler/modeler-config';
import {MortgageService} from './modeler/mortgage.service';
import {ModelService} from './modeler/services/model/model.service';
import {TutorialService} from './tutorial/tutorial-service';
import {JoyrideService} from 'ngx-joyride';

@Component({
selector: 'nab-root',
Expand Down
72 changes: 37 additions & 35 deletions src/app/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,49 +1,50 @@
import {BrowserModule, DomSanitizer} from '@angular/platform-browser';
import {CommonModule, NgOptimizedImage} from '@angular/common';
import {NgModule} from '@angular/core';
import {AppComponent} from './app.component';
import {MAT_FORM_FIELD_DEFAULT_OPTIONS} from '@angular/material/form-field';
import {MatIconRegistry} from '@angular/material/icon';
import {MatPaginatorIntl} from '@angular/material/paginator';
import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
import {BrowserModule, DomSanitizer} from '@angular/platform-browser';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {MaterialImportModule} from './material-import/material-import.module';
import {FormBuilderModule} from './form-builder/form-builder.module';
import {RouterModule, Routes} from '@angular/router';
import {FormBuilderComponent} from './form-builder/form-builder.component';
import {ModelerComponent} from './modeler/modeler.component';
import {ModelerModule} from './modeler/modeler.module';
import {EditModeComponent} from './modeler/edit-mode/edit-mode.component';
import {DataModeComponent} from './modeler/data-mode/data-mode.component';
import {RoleModeComponent} from './modeler/role-mode/role-mode.component';
import {ActionsModeComponent} from './modeler/actions-mode/actions-mode.component';
import {MatIconRegistry} from '@angular/material/icon';
import {TaskContentComponentModule} from '@netgrif/components';
import {AuthenticationMethodService, ConfigurationService, NullAuthenticationService} from '@netgrif/components-core';
import {ExportService, ImportService} from '@netgrif/petriflow';
import {JoyrideModule} from 'ngx-joyride';
import {environment} from '../environments/environment';
import {AppBuilderConfigurationService} from './app-builder-configuration.service';
import {AppRoutingModule} from './app-routing.module';
import {AppComponent} from './app.component';
import {DialogArcEditComponent} from './dialogs/dialog-arc-edit/dialog-arc-edit.component';
import {DialogChangeDataComponent} from './dialogs/dialog-change-data/dialog-change-data.component';
import {DialogConfirmComponent} from './dialogs/dialog-confirm/dialog-confirm.component';
import {DialogRefactorComponent} from './dialogs/dialog-refactor/dialog-refactor.component';
import {DialogErrorsComponent} from './dialogs/dialog-errors/dialog-errors.component';
import {ExportService, ImportService} from '@netgrif/petriflow';
import {SelectedTransitionService} from './modeler/selected-transition.service';
import {I18nModeComponent} from './modeler/i18n-mode/i18n-mode.component';
import {DialogDeadNetComponent} from './dialogs/dialog-dead-net/dialog-dead-net.component';
import {AppRoutingModule} from './app-routing.module';
import {DialogPlaceRefDeleteComponent} from './dialogs/dialog-place-ref-delete/dialog-place-ref-delete.component';
import {DialogPlaceEditComponent} from './dialogs/dialog-place-edit/dialog-place-edit.component';
import {DialogDeleteModelComponent} from './dialogs/dialog-delete-model/dialog-delete-model.component';
import {DialogArcEditComponent} from './dialogs/dialog-arc-edit/dialog-arc-edit.component';
import {DialogTransitionEditComponent} from './dialogs/dialog-transition-edit/dialog-transition-edit.component';
import {SimulationModeComponent} from './modeler/simulation-mode/simulation-mode.component';
import {DialogErrorsComponent} from './dialogs/dialog-errors/dialog-errors.component';
import {
DialogLocalStorageModelComponent
DialogLocalStorageModelComponent,
} from './dialogs/dialog-local-storage-model/dialog-local-storage-model.component';
import {HistoryModeComponent} from './modeler/history-mode/history-mode.component';
import {DialogChangeDataComponent} from './dialogs/dialog-change-data/dialog-change-data.component';
import {DialogMarkingChangeComponent} from './dialogs/dialog-marking-change/dialog-marking-change.component';
import {DialogModelEditComponent} from './dialogs/dialog-model-edit/dialog-model-edit.component';
import {MaterialIconPickerComponent} from './modeler/components/material-icon-picker/material-icon-picker.component';
import {CommonModule, NgOptimizedImage} from '@angular/common';
import {MAT_FORM_FIELD_DEFAULT_OPTIONS} from '@angular/material/form-field';
import {TaskContentComponentModule} from '@netgrif/components';
import {JoyrideModule} from 'ngx-joyride';
import {AuthenticationMethodService, ConfigurationService, NullAuthenticationService} from '@netgrif/components-core';
import {AppBuilderConfigurationService} from './app-builder-configuration.service';
import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
import {MatPaginatorIntl} from '@angular/material/paginator';
import {DialogPlaceEditComponent} from './dialogs/dialog-place-edit/dialog-place-edit.component';
import {DialogPlaceRefDeleteComponent} from './dialogs/dialog-place-ref-delete/dialog-place-ref-delete.component';
import {DialogRefactorComponent} from './dialogs/dialog-refactor/dialog-refactor.component';
import {DialogTransitionEditComponent} from './dialogs/dialog-transition-edit/dialog-transition-edit.component';
import {FormBuilderComponent} from './form-builder/form-builder.component';
import {FormBuilderModule} from './form-builder/form-builder.module';
import {MaterialImportModule} from './material-import/material-import.module';
import {ActionsModeComponent} from './modeler/actions-mode/actions-mode.component';
import {BuilderPaginatorIntl} from './modeler/components/master-detail/main-master/builder-paginator-inpl';
import {MaterialIconPickerComponent} from './modeler/components/material-icon-picker/material-icon-picker.component';
import {DataModeComponent} from './modeler/data-mode/data-mode.component';
import {EditModeComponent} from './modeler/edit-mode/edit-mode.component';
import {HistoryModeComponent} from './modeler/history-mode/history-mode.component';
import {I18nModeComponent} from './modeler/i18n-mode/i18n-mode.component';
import {ModelerComponent} from './modeler/modeler.component';
import {ModelerModule} from './modeler/modeler.module';
import {RoleModeComponent} from './modeler/role-mode/role-mode.component';
import {SelectedTransitionService} from './modeler/selected-transition.service';
import {SimulationModeComponent} from './modeler/simulation-mode/simulation-mode.component';

const appRoutes: Routes = [
{
Expand Down Expand Up @@ -77,6 +78,7 @@ const appRoutes: Routes = [
DialogModelEditComponent,
MaterialIconPickerComponent,
DialogLocalStorageModelComponent,
DialogMarkingChangeComponent
],
imports: [
BrowserModule,
Expand Down
4 changes: 2 additions & 2 deletions src/app/cdk-import/cdk-import.module.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {NgModule} from '@angular/core';
import {CdkPortalOutlet} from '@angular/cdk/portal';
import {CdkTreeModule} from '@angular/cdk/tree';
import {CdkPortal, CdkPortalOutlet} from '@angular/cdk/portal';
import {NgModule} from '@angular/core';

@NgModule({
declarations: [],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {Component, Inject} from '@angular/core';
import {DataVariable, Place} from '@netgrif/petriflow';
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
import {ModelerConfig} from '../../modeler/modeler-config';
import {DataVariable, Place} from '@netgrif/petriflow';
import {ReferenceDialogData} from '../../modeler/edit-mode/domain/reference-dialog-data';
import {ModelerConfig} from '../../modeler/modeler-config';
import {ModelService} from '../../modeler/services/model/model.service';

@Component({
Expand Down
8 changes: 4 additions & 4 deletions src/app/dialogs/dialog-arc-edit/dialog-arc-edit.component.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import {Component, Inject, OnInit} from '@angular/core';
import {ModelService} from '../../modeler/services/model/model.service';
import {Arc, DataType, TransitionPlaceArc, XmlArcType} from '@netgrif/petriflow';
import {MAT_DIALOG_DATA} from '@angular/material/dialog';
import {ChangedArc} from './changed-arc';
import {FormControl, ValidatorFn, Validators} from '@angular/forms';
import {MAT_DIALOG_DATA} from '@angular/material/dialog';
import {Arc, DataType, TransitionPlaceArc, XmlArcType} from '@netgrif/petriflow';
import {Observable} from 'rxjs';
import {map, startWith} from 'rxjs/operators';
import {ModelService} from '../../modeler/services/model/model.service';
import {ChangedArc} from './changed-arc';

export interface ArcEditData {
arcId: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
<h2 mat-dialog-title>Change referenced data values</h2>
<h2 mat-dialog-title>Change referenced data value{{dataSet.length > 1 ? 's' : ''}}</h2>
<mat-dialog-content class="netgrif-input">
<mat-form-field fxFlex *ngFor="let data of dataSet">
<mat-label>{{data.id}}</mat-label>
<input type="number" step="1" matInput [(ngModel)]="data.value">
<input type="number" step="1" min="0" matInput [(ngModel)]="data.value" [formControl]="valueCtrl">
<mat-error *ngIf="valueCtrl.errors && valueCtrl.errors.required">Value is required</mat-error>
<mat-error *ngIf="valueCtrl.errors && valueCtrl.errors.validValue">Value can not be a negative number</mat-error>
</mat-form-field>
Comment on lines 3 to 8
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Shared FormControl breaks multi-field editing.

All input fields in the loop share the same valueCtrl FormControl. This means:

  • All inputs display and update the same value
  • Validation state is shared across all fields
  • Users cannot edit multiple data values independently

Each data item needs its own FormControl or the component should use template-driven forms with separate ngModel bindings without a shared FormControl.

Since the AI summary indicates valueCtrl was introduced in the TypeScript file, you'll need to refactor the component to either:

Option 1: Remove the FormControl and use template-driven validation:

-        <input type="number" step="1" min="0" matInput [(ngModel)]="data.value" [formControl]="valueCtrl">
-        <mat-error *ngIf="valueCtrl.errors && valueCtrl.errors.required">Value is required</mat-error>
-        <mat-error *ngIf="valueCtrl.errors && valueCtrl.errors.validValue">Value can not be a negative number</mat-error>
+        <input type="number" step="1" min="0" matInput [(ngModel)]="data.value" required>
+        <mat-error>Value is required and cannot be negative</mat-error>

And update the save button to check if any data.value is invalid.

Option 2: Use FormArray with individual controls for each data item (requires more changes in the TypeScript file).

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In src/app/dialogs/dialog-change-data/dialog-change-data.component.html around
lines 3-8, the template currently binds every input to the same FormControl
(valueCtrl) causing shared value and validation across all rows; fix by giving
each datum its own control: either remove the shared FormControl and rely on
template-driven ngModel-only inputs (remove [formControl]="valueCtrl", keep
[(ngModel)]="data.value", add required and min attributes and update the save
routine to validate that no data.value is null/negative), or implement a
reactive FormArray in the component TS that creates one FormControl per data
item and bind each input to formControlName/index accordingly (populate the
FormArray from dataSet, validate per-control, and use the FormArray.valid flag
on save).

<span *ngIf="dataSet.length === 0">No referenced data found</span>
</mat-dialog-content>
<mat-dialog-actions>
<button mat-flat-button color="primary" [mat-dialog-close]="dataSet">
<button mat-flat-button color="primary" [mat-dialog-close]="dataSet" [disabled]="valueCtrl.invalid">
<mat-icon>done</mat-icon>
<span>Save</span>
</button>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {Component, Inject, OnInit} from '@angular/core';
import {Component, Inject} from '@angular/core';
import {FormControl, ValidatorFn, Validators} from '@angular/forms';
import {MAT_DIALOG_DATA} from '@angular/material/dialog';

export interface DataSet {
Expand All @@ -18,11 +19,26 @@ export interface Data {
export class DialogChangeDataComponent {

public dataSet: Array<Data>;
public valueCtrl: FormControl;

constructor(
@Inject(MAT_DIALOG_DATA) public data: DataSet,
) {
this.dataSet = new Array<Data>();
data.dataSet.forEach((value, id) => this.dataSet.push({id, value}));
this.valueCtrl = new FormControl('', [
Validators.required,
this.validValue()
]);
}

private validValue(): ValidatorFn {
return (fc: FormControl): { [key: string]: any } | null => {
const value = Math.floor(fc.value as number);
if (isFinite(value) && value === fc.value as number && value >= 0) {
return null;
}
return ({validMultiplicity: true})
};
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import {ComponentFixture, TestBed} from '@angular/core/testing';

import { DialogDeleteModelComponent } from './dialog-delete-model.component';
import {DialogDeleteModelComponent} from './dialog-delete-model.component';

describe('DialogDeleteModelComponent', () => {
let component: DialogDeleteModelComponent;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Component, OnInit } from '@angular/core';
import {Component} from '@angular/core';

@Component({
selector: 'nab-dialog-delete-model',
Expand Down
2 changes: 1 addition & 1 deletion src/app/dialogs/dialog-errors/dialog-errors.component.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {Component, Inject, OnInit} from '@angular/core';
import {Component, Inject} from '@angular/core';
import {MAT_DIALOG_DATA} from '@angular/material/dialog';

export interface DialogErrorsData {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import {ComponentFixture, TestBed} from '@angular/core/testing';

import { DialogLocalStorageModelComponent } from './dialog-local-storage-model.component';
import {DialogLocalStorageModelComponent} from './dialog-local-storage-model.component';

describe('DialogLocalStorageModelComponent', () => {
let component: DialogLocalStorageModelComponent;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {Component, Inject, OnInit} from '@angular/core';
import {Component, Inject} from '@angular/core';
import {MAT_DIALOG_DATA} from '@angular/material/dialog';

export interface DialogData {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import {Component, Inject, OnDestroy, OnInit, ViewChild} from '@angular/core';
import {MatTableDataSource} from '@angular/material/table';
import {MAT_CHECKBOX_DEFAULT_OPTIONS, MatCheckboxDefaultOptions} from '@angular/material/checkbox';
import {MAT_DIALOG_DATA} from '@angular/material/dialog';
import {MatSort, MatSortable, Sort} from '@angular/material/sort';
import {MatPaginator} from '@angular/material/paginator';
import {MatSort, MatSortable, Sort} from '@angular/material/sort';
import {MatTableDataSource} from '@angular/material/table';
import {DataVariable, ProcessPermissionRef, Role, TransitionPermissionRef} from '@netgrif/petriflow';
import {ModelService} from '../../modeler/services/model/model.service';
import {ModelerConfig} from '../../modeler/modeler-config';
import {HistoryService} from '../../modeler/services/history/history.service';
import {MAT_CHECKBOX_DEFAULT_OPTIONS, MatCheckboxDefaultOptions} from '@angular/material/checkbox';
import {ModelService} from '../../modeler/services/model/model.service';

export enum RoleRefType {
TRANSITION = 'transition',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<h2 mat-dialog-title>Change marking of place {{CanvasNodeElement.pretty(place)}}</h2>
<mat-dialog-content class="netgrif-input">
<mat-form-field fxFlex>
<mat-label>Tokens</mat-label>
<input type="number" min="0" step="1" matInput [(ngModel)]="place.marking" [formControl]="markingCtrl">
<mat-error *ngIf="markingCtrl.errors && markingCtrl.errors.required">Number of tokens is required</mat-error>
<mat-error *ngIf="markingCtrl.errors && markingCtrl.errors.validMultiplicity">Number of tokens must be a non-negative integer</mat-error>
</mat-form-field>
</mat-dialog-content>
<mat-dialog-actions>
<button mat-flat-button color="primary" [mat-dialog-close]="place.marking" [disabled]="markingCtrl.invalid">
<mat-icon>done</mat-icon>
<span>Save</span>
</button>
</mat-dialog-actions>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
mat-dialog-content {
display: flex;
flex-direction: column;
}

mat-dialog-actions {
justify-content: flex-end;
}
Loading