From 6afec574193e186dd36b489c10b7d2ab5a4d6fc2 Mon Sep 17 00:00:00 2001 From: chvostek Date: Thu, 9 Jul 2026 19:16:40 +0200 Subject: [PATCH 1/5] [NAE-2461] Create case filter only deployed - add deployment state in petri-net-reference.ts - add filter on create case to filter only deployed nets --- .../src/app/doc/panels/panels.component.ts | 5 +++-- .../sidemenu-example.component.ts | 7 +++++-- .../src/lib/process/net.ts | 15 ++++++++++++++- .../resources/interface/petri-net-reference.ts | 12 ++++++++++++ .../lib/utility/tests/utility/create-mock-net.ts | 4 +++- .../view/case-view/service/case-view-service.ts | 3 +++ 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/projects/nae-example-app/src/app/doc/panels/panels.component.ts b/projects/nae-example-app/src/app/doc/panels/panels.component.ts index c73a7c9491..2f43b3977a 100644 --- a/projects/nae-example-app/src/app/doc/panels/panels.component.ts +++ b/projects/nae-example-app/src/app/doc/panels/panels.component.ts @@ -5,13 +5,13 @@ import { HeaderColumnType, PetriNetReference, WorkflowMetaField, - Author, AllowedNetsServiceFactory, SimpleFilter, CaseViewService, AllowedNetsService, SearchService, NAE_BASE_FILTER, + DeploymentState, WorkflowViewService } from '@netgrif/components-core'; import {BehaviorSubject} from 'rxjs'; @@ -84,7 +84,8 @@ export class PanelsComponent implements OnInit { email: 'test@netgrif.com', fullName: 'Test Testovič' }, - immediateData: [] + immediateData: [], + deploymentState: DeploymentState.DEPLOYED }; this.featuredFields$ = new BehaviorSubject>([ new HeaderColumn(HeaderColumnType.META, 'visualId', 'Visual ID', 'text'), diff --git a/projects/nae-example-app/src/app/doc/sidemenu-example/sidemenu-example.component.ts b/projects/nae-example-app/src/app/doc/sidemenu-example/sidemenu-example.component.ts index a8434c714f..6175026093 100644 --- a/projects/nae-example-app/src/app/doc/sidemenu-example/sidemenu-example.component.ts +++ b/projects/nae-example-app/src/app/doc/sidemenu-example/sidemenu-example.component.ts @@ -3,6 +3,7 @@ import { Net, SideMenuService, SideMenuSize, + DeploymentState, } from '@netgrif/components-core'; import {of} from 'rxjs'; import {NewCaseComponent, UserAssignComponent, FilterSelectorComponent} from '@netgrif/components'; @@ -40,7 +41,8 @@ export class SidemenuExampleComponent implements OnInit { immediateData: [], initials: 'EX', title: 'Example Dummy Process', - version: '1.0.0' + version: '1.0.0', + deploymentState: DeploymentState.DEPLOYED }), new Net({ stringId: '999', @@ -52,7 +54,8 @@ export class SidemenuExampleComponent implements OnInit { immediateData: [], initials: 'EXX', title: 'Other Example Dummy Process', - version: '1.0.0' + version: '1.0.0', + deploymentState: DeploymentState.DEPLOYED })]) }); } diff --git a/projects/netgrif-components-core/src/lib/process/net.ts b/projects/netgrif-components-core/src/lib/process/net.ts index a87b8c0194..5fed1e5b37 100644 --- a/projects/netgrif-components-core/src/lib/process/net.ts +++ b/projects/netgrif-components-core/src/lib/process/net.ts @@ -1,4 +1,4 @@ -import {PetriNetReference} from '../resources/interface/petri-net-reference'; +import {DeploymentState, PetriNetReference} from '../resources/interface/petri-net-reference'; import {Author} from '../resources/interface/author'; import {ImmediateData} from '../resources/interface/immediate-data'; import Transition from './transition'; @@ -67,6 +67,10 @@ export class Net implements PetriNetReferenceWithPermissions { * @ignore */ private _permissions: Permissions; + /** + * @ignore + */ + private _deploymentState: DeploymentState; /** * @ignore */ @@ -84,6 +88,7 @@ export class Net implements PetriNetReferenceWithPermissions { this._transactions = []; this._roles = []; this._uriNodeId = net.uriNodeId; + this._deploymentState = net.deploymentState; } get stringId(): string { @@ -197,4 +202,12 @@ export class Net implements PetriNetReferenceWithPermissions { set uriNodeId(uriNodeId: string) { this._uriNodeId = uriNodeId; } + + get deploymentState(): DeploymentState { + return this._deploymentState; + } + + set deploymentState(deploymentState: DeploymentState) { + this._deploymentState = deploymentState; + } } diff --git a/projects/netgrif-components-core/src/lib/resources/interface/petri-net-reference.ts b/projects/netgrif-components-core/src/lib/resources/interface/petri-net-reference.ts index 9ecffbd45e..44a13bc81c 100644 --- a/projects/netgrif-components-core/src/lib/resources/interface/petri-net-reference.ts +++ b/projects/netgrif-components-core/src/lib/resources/interface/petri-net-reference.ts @@ -48,5 +48,17 @@ export interface PetriNetReference { * [ImmediateData]{@link ImmediateData} */ immediateData: Array; + + /** + * Deployment state of the net + */ + deploymentState: DeploymentState; +} + +export enum DeploymentState { + DRAFT = 'DRAFT', + DEPLOYED = 'DEPLOYED', + ARCHIVED = 'ARCHIVED', + TRASH = 'TRASH' } diff --git a/projects/netgrif-components-core/src/lib/utility/tests/utility/create-mock-net.ts b/projects/netgrif-components-core/src/lib/utility/tests/utility/create-mock-net.ts index ca77e9f484..ff98f4de01 100644 --- a/projects/netgrif-components-core/src/lib/utility/tests/utility/create-mock-net.ts +++ b/projects/netgrif-components-core/src/lib/utility/tests/utility/create-mock-net.ts @@ -2,6 +2,7 @@ import {Net} from '../../../process/net'; import NetRole from '../../../process/netRole'; import {ImmediateData} from '../../../resources/interface/immediate-data'; import {Permissions} from '../../../process/permissions'; +import {DeploymentState} from '../../../resources/interface/petri-net-reference'; /** * A mock transition representation used by the {@link createMockNet} function to populate the mock net with mock transition objects @@ -37,7 +38,8 @@ export function createMockNet(stringId = 'stringId', email: '', fullName: '' }, - immediateData + immediateData, + deploymentState: DeploymentState.DEPLOYED }); net.roles = roles; net.transitions = transitions.map(t => ({ diff --git a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts index ac84fcfc6e..5b976b03c2 100644 --- a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts +++ b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts @@ -37,6 +37,7 @@ import {PaginationParams} from '../../../utility/pagination/pagination-params'; import {createSortParam, PaginationSort} from '../../../utility/pagination/pagination-sort'; import {MatDialog} from '@angular/material/dialog'; import {NAE_NEW_CASE_DIALOG_COMPONENT} from '../../../dialog/injection-tokens'; +import {DeploymentState} from "../../../resources/interface/petri-net-reference"; @Injectable() export class CaseViewService extends AbstractSortableViewComponent implements OnDestroy { @@ -291,6 +292,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On if (this._newCaseConfiguration.useCachedProcesses) { return this._allowedNetsService.allowedNets$.pipe( map(net => net.filter(n => blockNets.indexOf(n.identifier) === -1)), + map(net => net.filter(n => n.deploymentState === DeploymentState.DEPLOYED)), map(net => net.filter(n => this._permissionService.hasNetPermission(PermissionType.CREATE, n))) ); } else { @@ -298,6 +300,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On switchMap(allowedNets => { return this._processService.getNetReferences(allowedNets.map(net => net.identifier)).pipe( map(net => net.filter(n => blockNets.indexOf(n.identifier) === -1)), + map(net => net.filter(n => n.deploymentState === DeploymentState.DEPLOYED)), map(net => net.filter(n => this._permissionService.hasNetPermission(PermissionType.CREATE, n))) ); }) From 428a34fb0d629326d9196d357ac3655156db9f92 Mon Sep 17 00:00:00 2001 From: chvostek Date: Thu, 9 Jul 2026 19:31:50 +0200 Subject: [PATCH 2/5] [NAE-2461] Create case filter only deployed - update tests --- .../authorization/permission/permission.service.spec.ts | 4 +++- .../lib/header/case-header/case-header.service.spec.ts | 4 +++- .../abstract-workflow-panel.component.spec.ts | 5 +++-- .../netgrif-components-core/src/lib/process/net.spec.ts | 8 ++++++-- .../tree-component/case-tree.service.spec.ts | 4 +++- .../public-workflow-panel.component.spec.ts | 7 ++++--- .../panel/workflow-panel/workflow-panel.component.spec.ts | 5 +++-- 7 files changed, 25 insertions(+), 12 deletions(-) diff --git a/projects/netgrif-components-core/src/lib/authorization/permission/permission.service.spec.ts b/projects/netgrif-components-core/src/lib/authorization/permission/permission.service.spec.ts index bd983991ee..dac6628061 100644 --- a/projects/netgrif-components-core/src/lib/authorization/permission/permission.service.spec.ts +++ b/projects/netgrif-components-core/src/lib/authorization/permission/permission.service.spec.ts @@ -13,6 +13,7 @@ import {User} from '../../user/models/user'; import {AssignPolicy, DataFocusPolicy, FinishPolicy} from '../../task-content/model/policy'; import {PermissionType} from '../../process/permissions'; import {Net} from '../../process/net'; +import {DeploymentState} from "../../resources/interface/petri-net-reference"; describe('PermissionService', () => { let permissionService: PermissionService; @@ -271,7 +272,8 @@ describe('PermissionService', () => { defaultCaseName: '', initials: '', version: '', - title: '' + title: '', + deploymentState: DeploymentState.DEPLOYED }); net.permissions = {}; expect(permissionService.hasNetPermission(PermissionType.CREATE, net)).toBeFalse(); diff --git a/projects/netgrif-components-core/src/lib/header/case-header/case-header.service.spec.ts b/projects/netgrif-components-core/src/lib/header/case-header/case-header.service.spec.ts index b8e33d4d18..5b973b61cc 100644 --- a/projects/netgrif-components-core/src/lib/header/case-header/case-header.service.spec.ts +++ b/projects/netgrif-components-core/src/lib/header/case-header/case-header.service.spec.ts @@ -34,6 +34,7 @@ import {SnackBarModule} from '../../snack-bar/snack-bar.module'; import {NAE_BASE_FILTER} from '../../search/models/base-filter-injection-token'; import {AllowedNetsService} from '../../allowed-nets/services/allowed-nets.service'; import {AllowedNetsServiceFactory} from '../../allowed-nets/services/factory/allowed-nets-service-factory'; +import {DeploymentState} from "../../resources/interface/petri-net-reference"; describe('CaseHeaderService', () => { let service: CaseHeaderService; @@ -87,7 +88,8 @@ describe('CaseHeaderService', () => { defaultCaseName: 'string', createdDate: [2020, 1, 1, 10, 0], author: {email: 'email', fullName: 'fullName'}, - immediateData: [{stringId: 'string', title: 'string', type: 'string'}] + immediateData: [{stringId: 'string', title: 'string', type: 'string'}], + deploymentState: DeploymentState.DEPLOYED }]); expect(service.fieldsGroup.length).toEqual(2); }); diff --git a/projects/netgrif-components-core/src/lib/panel/workflow-panel/abstract-workflow-panel.component.spec.ts b/projects/netgrif-components-core/src/lib/panel/workflow-panel/abstract-workflow-panel.component.spec.ts index 7352cc74cd..efbdaddb8d 100644 --- a/projects/netgrif-components-core/src/lib/panel/workflow-panel/abstract-workflow-panel.component.spec.ts +++ b/projects/netgrif-components-core/src/lib/panel/workflow-panel/abstract-workflow-panel.component.spec.ts @@ -20,7 +20,7 @@ import {TranslateService} from '@ngx-translate/core'; import {LoggerService} from '../../logger/services/logger.service'; import {HeaderColumn, HeaderColumnType} from '../../header/models/header-column'; import {WorkflowMetaField} from '../../header/workflow-header/workflow-meta-enum'; -import {PetriNetReference} from '../../resources/interface/petri-net-reference'; +import {DeploymentState, PetriNetReference} from '../../resources/interface/petri-net-reference'; import {RouterTestingModule} from '@angular/router/testing'; import {WorkflowViewService} from '../../view/workflow-view/workflow-view.service'; import {take} from 'rxjs/operators'; @@ -136,6 +136,7 @@ class TestWrapperComponent { stringId: '', title: '', version: '', - uriNodeId: '' + uriNodeId: '', + deploymentState: DeploymentState.DEPLOYED }; } diff --git a/projects/netgrif-components-core/src/lib/process/net.spec.ts b/projects/netgrif-components-core/src/lib/process/net.spec.ts index ab03eba526..d18738b3e3 100644 --- a/projects/netgrif-components-core/src/lib/process/net.spec.ts +++ b/projects/netgrif-components-core/src/lib/process/net.spec.ts @@ -1,5 +1,6 @@ import {Net} from './net'; import {TestBed} from '@angular/core/testing'; +import {DeploymentState} from "../resources/interface/petri-net-reference"; describe('Net', () => { it('should create an instance', () => { @@ -13,7 +14,8 @@ describe('Net', () => { createdDate: [2020, 1, 1, 1, 1], author: {email: 'mail', fullName: 'name'}, immediateData: [], - uriNodeId: 'string' + uriNodeId: 'string', + deploymentState: DeploymentState.DEPLOYED })).toBeTruthy(); }); @@ -28,7 +30,8 @@ describe('Net', () => { createdDate: [2020, 1, 1, 1, 1], author: {email: 'mail', fullName: 'name'}, immediateData: [], - uriNodeId: 'string' + uriNodeId: 'string', + deploymentState: DeploymentState.DEPLOYED }); expect(net.stringId).toEqual('true'); expect(net.title).toEqual('string'); @@ -42,6 +45,7 @@ describe('Net', () => { expect(net.transitions).toEqual([]); expect(net.transactions).toEqual([]); expect(net.roles).toEqual([]); + expect(net.deploymentState).toEqual(DeploymentState.DEPLOYED); }); afterEach(() => { diff --git a/projects/netgrif-components-core/src/lib/view/tree-case-view/tree-component/case-tree.service.spec.ts b/projects/netgrif-components-core/src/lib/view/tree-case-view/tree-component/case-tree.service.spec.ts index 6b78b49642..8e14fdf0a9 100644 --- a/projects/netgrif-components-core/src/lib/view/tree-case-view/tree-component/case-tree.service.spec.ts +++ b/projects/netgrif-components-core/src/lib/view/tree-case-view/tree-component/case-tree.service.spec.ts @@ -36,6 +36,7 @@ import {SetDataEventOutcome} from '../../../event/model/event-outcomes/data-outc import {AssignTaskEventOutcome} from '../../../event/model/event-outcomes/task-outcomes/assign-task-event-outcome'; import {CreateCaseEventOutcome} from '../../../event/model/event-outcomes/case-outcomes/create-case-event-outcome'; import {createMockNet} from '../../../utility/tests/utility/create-mock-net'; +import {DeploymentState} from "../../../resources/interface/petri-net-reference"; class MockTreeNode { @@ -647,7 +648,8 @@ class TreeTestProcessService { fullName: '' }, immediateData: [], - uriNodeId: '' + uriNodeId: '', + deploymentState: DeploymentState.DEPLOYED })); } } diff --git a/projects/netgrif-components/src/lib/panel/public-workflow-panel/public-workflow-panel.component.spec.ts b/projects/netgrif-components/src/lib/panel/public-workflow-panel/public-workflow-panel.component.spec.ts index ccc799f79e..1e0ede895e 100644 --- a/projects/netgrif-components/src/lib/panel/public-workflow-panel/public-workflow-panel.component.spec.ts +++ b/projects/netgrif-components/src/lib/panel/public-workflow-panel/public-workflow-panel.component.spec.ts @@ -17,7 +17,7 @@ import { TranslateLibModule, UserResourceService, WorkflowMetaField, - WorkflowViewService + WorkflowViewService, DeploymentState } from '@netgrif/components-core'; import {CommonModule} from '@angular/common'; import {FlexModule} from '@ngbracket/ngx-layout'; @@ -25,7 +25,7 @@ import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; import {DataFieldsComponentModule} from '../../data-fields/data-fields.module'; import {HttpClientTestingModule} from '@angular/common/http/testing'; import {PanelComponent} from '../panel.component'; -import {Component, NO_ERRORS_SCHEMA} from '@angular/core'; +import {Component} from '@angular/core'; import {of} from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; @@ -98,6 +98,7 @@ class PublicTestWrapperComponent { stringId: '', title: '', version: '', - uriNodeId: '' + uriNodeId: '', + deploymentState: DeploymentState.DEPLOYED }; } diff --git a/projects/netgrif-components/src/lib/panel/workflow-panel/workflow-panel.component.spec.ts b/projects/netgrif-components/src/lib/panel/workflow-panel/workflow-panel.component.spec.ts index 224c54a8d3..155c5ff745 100644 --- a/projects/netgrif-components/src/lib/panel/workflow-panel/workflow-panel.component.spec.ts +++ b/projects/netgrif-components/src/lib/panel/workflow-panel/workflow-panel.component.spec.ts @@ -23,7 +23,7 @@ import { UserResourceService, WorkflowMetaField, OverflowService, - WorkflowViewService + WorkflowViewService, DeploymentState } from '@netgrif/components-core'; import {HttpClientTestingModule} from '@angular/common/http/testing'; import { RouterTestingModule } from '@angular/router/testing'; @@ -96,6 +96,7 @@ class TestWrapperComponent { stringId: '', title: '', version: '', - uriNodeId: '' + uriNodeId: '', + deploymentState: DeploymentState.DEPLOYED }; } From 94fb5c133cbee7e66de594501f0c5d6eb3b3a3a0 Mon Sep 17 00:00:00 2001 From: chvostek Date: Thu, 9 Jul 2026 19:40:34 +0200 Subject: [PATCH 3/5] [NAE-2461] Create case filter only deployed - fix memory leaks in case-view-service.ts - fix deprecated use of subscribe method --- .../case-view/service/case-view-service.ts | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts index 5b976b03c2..d8085e1bce 100644 --- a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts +++ b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts @@ -7,7 +7,7 @@ import {LoggerService} from '../../../logger/services/logger.service'; import {SnackBarService} from '../../../snack-bar/services/snack-bar.service'; import {SearchService} from '../../../search/search-service/search.service'; import {TranslateService} from '@ngx-translate/core'; -import {catchError, concatMap, filter, map, mergeMap, scan, switchMap, tap} from 'rxjs/operators'; +import {catchError, concatMap, filter, map, mergeMap, scan, switchMap, take, tap} from 'rxjs/operators'; import {Pagination} from '../../../resources/interface/pagination'; import {CaseMetaField} from '../../../header/case-header/case-menta-enum'; import {PageLoadRequestContext} from '../../abstract/page-load-request-context'; @@ -55,6 +55,8 @@ export class CaseViewService extends AbstractSortableViewComponent implements On protected _newCaseConfiguration: NewCaseConfiguration; protected _paginationView: boolean = false; + protected _activeFilterSub: Subscription; + constructor(protected _allowedNetsService: AllowedNetsService, protected _dialog: MatDialog, protected _caseResourceService: CaseResourceService, @@ -75,7 +77,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On Object.assign(this._newCaseConfiguration, newCaseConfig); } this._loading$ = new LoadingWithFilterEmitter(); - this._searchService.activeFilter$.subscribe(() => { + this._activeFilterSub = this._searchService.activeFilter$.subscribe(() => { this.reload(); }); this._endOfData = false; @@ -124,6 +126,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On super.ngOnDestroy(); this._loading$.complete(); this._nextPage$.complete(); + this._activeFilterSub?.unsubscribe(); } public get loading(): boolean { @@ -242,7 +245,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On newCaseCreationConfiguration }, }); - dialogRef.afterClosed().subscribe($event => { + dialogRef.afterClosed().pipe(take(1)).subscribe($event => { if ($event?.data) { this._log.debug($event.message, $event.data); this.reload(); @@ -258,33 +261,38 @@ export class CaseViewService extends AbstractSortableViewComponent implements On isCaseTitleRequired: true }): Observable { const myCase = new Subject(); - this.getNewCaseAllowedNets(newCaseCreationConfiguration.blockNets).subscribe((nets: Array) => { - if (!nets || nets.length === 0) { - const errorMessage = this._translate.instant('side-menu.new-case.noNets'); - this._snackBarService.openErrorSnackBar(errorMessage); - this._log.error('No nets available for case creation. Ensure the allowed nets configuration is correct.'); - return; - } - this._caseResourceService.createCase({ - title: null, - color: 'panel-primary-icon', - netId: nets[0].stringId - }).subscribe((response: EventOutcomeMessageResource) => { - this._snackBarService.openSuccessSnackBar(this._translate.instant('side-menu.new-case.createCase') - + ' ' + this._translate.instant('side-menu.new-case.defaultCaseName')); - this.reload(); - myCase.next((response.outcome as CreateCaseEventOutcome).aCase); - myCase.complete(); - }, error => { - const errorMessage = error.message ? error.message : this._translate.instant('side-menu.new-case.createCaseError'); + this.getNewCaseAllowedNets(newCaseCreationConfiguration.blockNets).pipe(take(1)).subscribe({ + next: (nets: Array) => { + if (!nets || nets.length === 0) { + const errorMessage = this._translate.instant('side-menu.new-case.noNets'); + this._snackBarService.openErrorSnackBar(errorMessage); + this._log.error('No nets available for case creation. Ensure the allowed nets configuration is correct.'); + return; + } + this._caseResourceService.createCase({ + title: null, + color: 'panel-primary-icon', + netId: nets[0].stringId + }).pipe(take(1)).subscribe({ + next: (response: EventOutcomeMessageResource) => { + this._snackBarService.openSuccessSnackBar(this._translate.instant('side-menu.new-case.createCase') + + ' ' + this._translate.instant('side-menu.new-case.defaultCaseName')); + this.reload(); + myCase.next((response.outcome as CreateCaseEventOutcome).aCase); + myCase.complete(); + }, + error: error => { + const errorMessage = error.message ? error.message : this._translate.instant('side-menu.new-case.createCaseError'); + this._snackBarService.openErrorSnackBar(errorMessage); + this._log.error('Error occurred during case creation: ' + errorMessage); + } + }); + }, + error: error => { + const errorMessage = error.message || this._translate.instant('side-menu.new-case.errorCreate'); + this._log.error('Failed to fetch allowed nets. Error: ' + errorMessage); this._snackBarService.openErrorSnackBar(errorMessage); - this._log.error('Error occurred during case creation: ' + errorMessage); - }); - }, error => { - const errorMessage = error.message || this._translate.instant('side-menu.new-case.errorCreate'); - this._log.error('Failed to fetch allowed nets. Error: ' + errorMessage); - this._snackBarService.openErrorSnackBar(errorMessage); - }); + }}); return myCase; } From 5aff374bddf9e8db2e6375d5bd190f48b89c65d5 Mon Sep 17 00:00:00 2001 From: chvostek Date: Thu, 9 Jul 2026 19:44:52 +0200 Subject: [PATCH 4/5] [NAE-2461] Create case filter only deployed - fix missing import --- .../src/lib/view/case-view/service/case-view-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts index d8085e1bce..af0c0d2ed1 100644 --- a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts +++ b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts @@ -1,6 +1,6 @@ import {Inject, Injectable, OnDestroy, Optional} from '@angular/core'; import {CaseResourceService} from '../../../resources/engine-endpoint/case-resource.service'; -import {BehaviorSubject, Observable, of, Subject} from 'rxjs'; +import {BehaviorSubject, Observable, of, Subject, Subscription} from 'rxjs'; import {HttpParams} from '@angular/common/http'; import {Case} from '../../../resources/interface/case'; import {LoggerService} from '../../../logger/services/logger.service'; From 00d6f47461a862ac790fde5ab752f3474ebc61de Mon Sep 17 00:00:00 2001 From: chvostek Date: Fri, 10 Jul 2026 10:16:21 +0200 Subject: [PATCH 5/5] [NAE-2461] Create case filter only deployed - fix subject completion - fix return value encapsulation - fix imports --- .../src/lib/header/case-header/case-header.service.spec.ts | 5 +---- .../src/lib/view/case-view/service/case-view-service.ts | 5 ++++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/netgrif-components-core/src/lib/header/case-header/case-header.service.spec.ts b/projects/netgrif-components-core/src/lib/header/case-header/case-header.service.spec.ts index 5b973b61cc..e44f03632d 100644 --- a/projects/netgrif-components-core/src/lib/header/case-header/case-header.service.spec.ts +++ b/projects/netgrif-components-core/src/lib/header/case-header/case-header.service.spec.ts @@ -19,9 +19,6 @@ import {MockUserResourceService} from '../../utility/tests/mocks/mock-user-resou import {AuthenticationMethodService} from '../../authentication/services/authentication-method.service'; import {ViewService} from '../../routing/view-service/view.service'; import {TestViewService} from '../../utility/tests/test-view-service'; -import {ErrorSnackBarComponent} from '../../snack-bar/components/error-snack-bar/error-snack-bar.component'; -import {SuccessSnackBarComponent} from '../../snack-bar/components/success-snack-bar/success-snack-bar.component'; -import {BrowserDynamicTestingModule} from '@angular/platform-browser-dynamic/testing'; import {CaseMetaField} from './case-menta-enum'; import {MatSnackBarModule} from '@angular/material/snack-bar'; import {MatIconModule} from '@angular/material/icon'; @@ -34,7 +31,7 @@ import {SnackBarModule} from '../../snack-bar/snack-bar.module'; import {NAE_BASE_FILTER} from '../../search/models/base-filter-injection-token'; import {AllowedNetsService} from '../../allowed-nets/services/allowed-nets.service'; import {AllowedNetsServiceFactory} from '../../allowed-nets/services/factory/allowed-nets-service-factory'; -import {DeploymentState} from "../../resources/interface/petri-net-reference"; +import {DeploymentState} from '../../resources/interface/petri-net-reference'; describe('CaseHeaderService', () => { let service: CaseHeaderService; diff --git a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts index af0c0d2ed1..4908eaeaf5 100644 --- a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts +++ b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts @@ -267,6 +267,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On const errorMessage = this._translate.instant('side-menu.new-case.noNets'); this._snackBarService.openErrorSnackBar(errorMessage); this._log.error('No nets available for case creation. Ensure the allowed nets configuration is correct.'); + myCase.complete(); return; } this._caseResourceService.createCase({ @@ -285,6 +286,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On const errorMessage = error.message ? error.message : this._translate.instant('side-menu.new-case.createCaseError'); this._snackBarService.openErrorSnackBar(errorMessage); this._log.error('Error occurred during case creation: ' + errorMessage); + myCase.complete(); } }); }, @@ -292,8 +294,9 @@ export class CaseViewService extends AbstractSortableViewComponent implements On const errorMessage = error.message || this._translate.instant('side-menu.new-case.errorCreate'); this._log.error('Failed to fetch allowed nets. Error: ' + errorMessage); this._snackBarService.openErrorSnackBar(errorMessage); + myCase.complete(); }}); - return myCase; + return myCase.asObservable(); } public getNewCaseAllowedNets(blockNets: string[] = []): Observable> {