From 8a4598b2d4341b3b59da3ef02ad01de564be9bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Kov=C3=A1=C4=8Dik?= Date: Wed, 27 May 2026 12:19:20 +0200 Subject: [PATCH 1/3] [NAE-2439] Implement new filter data types - create new filter field as text field for filter query --- ...act-filter-string-query-field.component.ts | 25 +++++++++++++++++++ .../filter-field/models/filter-field.ts | 4 +++ .../src/lib/data-fields/public-api.ts | 1 + .../src/lib/data-fields/data-fields.module.ts | 5 +++- .../filter-string-query-field.component.html | 9 +++++++ .../filter-string-query-field.component.scss | 5 ++++ ...ilter-string-query-field.component.spec.ts | 25 +++++++++++++++++++ .../filter-string-query-field.component.ts | 17 +++++++++++++ 8 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 projects/netgrif-components-core/src/lib/data-fields/filter-field/filter-string-query-field/abstract-filter-string-query-field.component.ts create mode 100644 projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.html create mode 100644 projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.scss create mode 100644 projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.spec.ts create mode 100644 projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.ts diff --git a/projects/netgrif-components-core/src/lib/data-fields/filter-field/filter-string-query-field/abstract-filter-string-query-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/filter-field/filter-string-query-field/abstract-filter-string-query-field.component.ts new file mode 100644 index 0000000000..57eab9d2ca --- /dev/null +++ b/projects/netgrif-components-core/src/lib/data-fields/filter-field/filter-string-query-field/abstract-filter-string-query-field.component.ts @@ -0,0 +1,25 @@ +import {Component, Inject, Injector, OnInit, Optional} from "@angular/core"; +import {FilterField, FilterFieldValidation} from "../models/filter-field"; +import {AbstractBaseDataFieldComponent} from "../../base-component/abstract-base-data-field.component"; +import {DATA_FIELD_PORTAL_DATA, DataFieldPortalData} from "../../models/data-field-portal-data-injection-token"; +import {FormControl} from "@angular/forms"; +import {TranslateService} from "@ngx-translate/core"; + +@Component({ + selector: 'ncc-abstract-filter-string-query-field', + template: '' +}) +export abstract class AbstractFilterStringQueryFieldComponent extends AbstractBaseDataFieldComponent { + + constructor(protected _translate: TranslateService, + @Optional() @Inject(DATA_FIELD_PORTAL_DATA) dataFieldPortalData: DataFieldPortalData) { + super(dataFieldPortalData); + } + + public getErrorMessage() { + if (this.formControlRef.hasError(FilterFieldValidation.REQUIRED)) { + return this._translate.instant('dataField.validations.required'); + } + return ''; + } +} diff --git a/projects/netgrif-components-core/src/lib/data-fields/filter-field/models/filter-field.ts b/projects/netgrif-components-core/src/lib/data-fields/filter-field/models/filter-field.ts index da998cbf26..36ae44b240 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/filter-field/models/filter-field.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/filter-field/models/filter-field.ts @@ -5,6 +5,10 @@ import {Component, ComponentPrefixes} from '../../models/component'; import {FilterMetadata} from '../../../search/models/persistance/filter-metadata'; import {Validation} from '../../models/validation'; +export enum FilterFieldValidation { + REQUIRED = 'required' +} + export class FilterField extends DataField { constructor(stringId: string, title: string, diff --git a/projects/netgrif-components-core/src/lib/data-fields/public-api.ts b/projects/netgrif-components-core/src/lib/data-fields/public-api.ts index 16157a3867..41830a65e9 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/public-api.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/public-api.ts @@ -54,6 +54,7 @@ export * from './filter-field/abstract-filter-field-content.component'; export * from './filter-field/abstract-filter-field-tab-view.component'; export * from './filter-field/abstract-filter-field-tab-view-content.component'; export * from './filter-field/filter-default-field/abstract-filter-default-field.component'; +export * from './filter-field/filter-string-query-field/abstract-filter-string-query-field.component'; export * from './i18n-field/abstract-i18n-field.component'; export * from './i18n-field/i18n-text-field/abstract-i18n-text-field.component'; export * from './i18n-field/i18n-divider-field/abstract-i18n-divider-field.component'; diff --git a/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts b/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts index 6e7c16928c..4c5b154750 100644 --- a/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts +++ b/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts @@ -127,6 +127,7 @@ import { import {SignaturePadFieldComponent} from './text-field/signature-pad-field/signature-pad-field.component'; import { StringCollectionDefaultFieldComponent } from './string-collection-field/string-collection-default-field/string-collection-default-field.component'; import {ComponentPortal} from "@angular/cdk/portal"; +import { FilterStringQueryFieldComponent } from './filter-field/filter-string-query-field/filter-string-query-field.component'; @NgModule({ declarations: [ @@ -192,7 +193,8 @@ import {ComponentPortal} from "@angular/cdk/portal"; EnumerationCaserefFieldComponent, StringCollectionDefaultFieldComponent, SignaturePadFieldComponent, - NumberDecimalFieldComponent + NumberDecimalFieldComponent, + FilterStringQueryFieldComponent ], exports: [ DataFieldTemplateComponent @@ -244,6 +246,7 @@ export class DataFieldsComponentModule { registry.register("file-list-default", (injector: Injector) => new ComponentPortal(FileListDefaultFieldComponent, null, injector)); registry.register("filter-default", (injector: Injector) => new ComponentPortal(FilterDefaultFieldComponent, null, injector)); registry.register("filter-filter-tab-view", (injector: Injector) => new ComponentPortal(FilterDefaultFieldComponent, null, injector)); + registry.register("filter-string_query", (injector: Injector) => new ComponentPortal(FilterStringQueryFieldComponent, null, injector)); registry.register("i18n-divider", (injector: Injector) => new ComponentPortal(I18nDividerFieldComponent, null, injector)); registry.register("i18n-text", (injector: Injector) => new ComponentPortal(I18nTextFieldComponent, null, injector)); registry.register("i18n-default", (injector: Injector) => new ComponentPortal(I18nTextFieldComponent, null, injector)); diff --git a/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.html b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.html new file mode 100644 index 0000000000..58a44b8b1b --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.html @@ -0,0 +1,9 @@ + + {{dataField.title}} + + {{dataField.description}} + {{getErrorMessage()}} + diff --git a/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.scss b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.scss new file mode 100644 index 0000000000..94f24bbe92 --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.scss @@ -0,0 +1,5 @@ +.full-width { + display: block; + margin: 0 auto; + width: 100%; +} diff --git a/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.spec.ts b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.spec.ts new file mode 100644 index 0000000000..5673a39803 --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FilterStringQueryFieldComponent } from './filter-string-query-field.component'; + +describe('FilterStringQueryFieldComponent', () => { + let component: FilterStringQueryFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FilterStringQueryFieldComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FilterStringQueryFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.ts b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.ts new file mode 100644 index 0000000000..274ab9f29a --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.ts @@ -0,0 +1,17 @@ +import { Component, Optional, Inject } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { AbstractFilterStringQueryFieldComponent, DATA_FIELD_PORTAL_DATA, DataFieldPortalData, FilterField} from '@netgrif/components-core'; + +@Component({ + selector: 'nc-filter-string-query-field', + templateUrl: './filter-string-query-field.component.html', + styleUrls: ['./filter-string-query-field.component.scss'] +}) +export class FilterStringQueryFieldComponent extends AbstractFilterStringQueryFieldComponent { + + constructor(protected _translate: TranslateService, + @Optional() @Inject(DATA_FIELD_PORTAL_DATA) dataFieldPortalData: DataFieldPortalData) { + super(_translate, dataFieldPortalData); + } + +} From 88d7528c01b0a49c9638d479b76c6486bac9f0f5 Mon Sep 17 00:00:00 2001 From: chvostek Date: Fri, 29 May 2026 12:55:43 +0200 Subject: [PATCH 2/3] [NAE-2439] Implement new filter data types - introduce new field types --- .../abstract-filter-string-query-field.component.ts | 3 +-- .../src/lib/filter/user-filters.service.ts | 2 +- .../src/lib/task-content/model/field-type-resource.ts | 4 +++- .../lib/task-content/services/field-converter.service.ts | 6 ++++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/projects/netgrif-components-core/src/lib/data-fields/filter-field/filter-string-query-field/abstract-filter-string-query-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/filter-field/filter-string-query-field/abstract-filter-string-query-field.component.ts index 57eab9d2ca..e6a0f635b9 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/filter-field/filter-string-query-field/abstract-filter-string-query-field.component.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/filter-field/filter-string-query-field/abstract-filter-string-query-field.component.ts @@ -1,8 +1,7 @@ -import {Component, Inject, Injector, OnInit, Optional} from "@angular/core"; +import {Component, Inject, Optional} from "@angular/core"; import {FilterField, FilterFieldValidation} from "../models/filter-field"; import {AbstractBaseDataFieldComponent} from "../../base-component/abstract-base-data-field.component"; import {DATA_FIELD_PORTAL_DATA, DataFieldPortalData} from "../../models/data-field-portal-data-injection-token"; -import {FormControl} from "@angular/forms"; import {TranslateService} from "@ngx-translate/core"; @Component({ diff --git a/projects/netgrif-components-core/src/lib/filter/user-filters.service.ts b/projects/netgrif-components-core/src/lib/filter/user-filters.service.ts index 045f648af2..f379967cf7 100644 --- a/projects/netgrif-components-core/src/lib/filter/user-filters.service.ts +++ b/projects/netgrif-components-core/src/lib/filter/user-filters.service.ts @@ -281,7 +281,7 @@ export class UserFiltersService implements OnDestroy { value: searchService.filterType }, [UserFilterConstants.FILTER_FIELD_ID]: { - type: FieldTypeResource.FILTER, + type: FieldTypeResource.CASE_FILTER, value: searchService.rootPredicate.query.value, allowedNets, filterMetadata: this.filterMetadataFromSearchService( diff --git a/projects/netgrif-components-core/src/lib/task-content/model/field-type-resource.ts b/projects/netgrif-components-core/src/lib/task-content/model/field-type-resource.ts index 234078bfac..5213f37999 100644 --- a/projects/netgrif-components-core/src/lib/task-content/model/field-type-resource.ts +++ b/projects/netgrif-components-core/src/lib/task-content/model/field-type-resource.ts @@ -18,7 +18,9 @@ export enum FieldTypeResource { MULTICHOICE_MAP = 'multichoice_map', TASK_REF = 'taskRef', CASE_REF = 'caseRef', - FILTER = 'filter', + CASE_FILTER = 'caseFilter', + TASK_FILTER = 'taskFilter', + PROCESS_FILTER = 'processFilter', I18N = 'i18n', STRING_COLLECTION = 'stringCollection' } diff --git a/projects/netgrif-components-core/src/lib/task-content/services/field-converter.service.ts b/projects/netgrif-components-core/src/lib/task-content/services/field-converter.service.ts index 3800528065..d40a014751 100644 --- a/projects/netgrif-components-core/src/lib/task-content/services/field-converter.service.ts +++ b/projects/netgrif-components-core/src/lib/task-content/services/field-converter.service.ts @@ -108,7 +108,9 @@ export class FieldConverterService { case FieldTypeResource.CASE_REF: return new CaseRefField(item.stringId, item.name, item.value ? item.value : [], item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); - case FieldTypeResource.FILTER: + case FieldTypeResource.CASE_FILTER: + case FieldTypeResource.TASK_FILTER: + case FieldTypeResource.PROCESS_FILTER: return new FilterField(item.stringId, item.name, item.value ?? '', item.filterMetadata, item.allowedNets, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); case FieldTypeResource.I18N: @@ -146,7 +148,7 @@ export class FieldConverterService { } else if (item instanceof EnumerationField || item instanceof MultichoiceField) { return item.fieldType; } else if (item instanceof FilterField) { - return FieldTypeResource.FILTER; + return FieldTypeResource.CASE_FILTER; } else if (item instanceof I18nField) { return FieldTypeResource.I18N; } else if (item instanceof CaseRefField) { From 6debca3a6794f2bff17c3f3f15c6a4eaa5daa495 Mon Sep 17 00:00:00 2001 From: chvostek Date: Fri, 29 May 2026 15:09:22 +0200 Subject: [PATCH 3/3] [NAE-2439] Implement new filter data types - fix test --- ...ilter-string-query-field.component.spec.ts | 68 ++++++++++++++----- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.spec.ts b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.spec.ts index 5673a39803..ab200d93ce 100644 --- a/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.spec.ts +++ b/projects/netgrif-components/src/lib/data-fields/filter-field/filter-string-query-field/filter-string-query-field.component.spec.ts @@ -1,25 +1,57 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; -import { FilterStringQueryFieldComponent } from './filter-string-query-field.component'; +import {FilterStringQueryFieldComponent} from './filter-string-query-field.component'; +import { + MaterialModule, + TranslateLibModule, + FilterField, + DataFieldPortalData, + DATA_FIELD_PORTAL_DATA, + FilterType, + ConfigurationService, + TestConfigurationService, + WrappedBoolean +} from '@netgrif/components-core'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {HttpClientTestingModule} from "@angular/common/http/testing"; +import {FormControl, ReactiveFormsModule} from '@angular/forms'; describe('FilterStringQueryFieldComponent', () => { - let component: FilterStringQueryFieldComponent; - let fixture: ComponentFixture; + let component: FilterStringQueryFieldComponent; + let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ FilterStringQueryFieldComponent ] - }) - .compileComponents(); - }); + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [FilterStringQueryFieldComponent], + imports: [ + TranslateLibModule, + HttpClientTestingModule, + MaterialModule, + NoopAnimationsModule, + ReactiveFormsModule + ], + providers: [ + {provide: ConfigurationService, useClass: TestConfigurationService}, + {provide: DATA_FIELD_PORTAL_DATA, useValue: { + dataField: new FilterField('', '', '', { + filterType: FilterType.CASE, predicateMetadata: [], searchCategories: [] + }, [], {}, '', ''), + formControlRef: new FormControl(), + showLargeLayout: new WrappedBoolean() + } as DataFieldPortalData + } + ] + }) + .compileComponents(); + }); - beforeEach(() => { - fixture = TestBed.createComponent(FilterStringQueryFieldComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(FilterStringQueryFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); });