@valtimo/dashboard 13.46.0 → 13.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/fesm2022/valtimo-dashboard.mjs +502 -74
  2. package/fesm2022/valtimo-dashboard.mjs.map +1 -1
  3. package/lib/data-sources/task-count/components/index.d.ts +1 -0
  4. package/lib/data-sources/task-count/components/index.d.ts.map +1 -1
  5. package/lib/data-sources/task-count/components/task-count-condition-group/index.d.ts +2 -0
  6. package/lib/data-sources/task-count/components/task-count-condition-group/index.d.ts.map +1 -0
  7. package/lib/data-sources/task-count/components/task-count-condition-group/task-count-condition-group.component.d.ts +68 -0
  8. package/lib/data-sources/task-count/components/task-count-condition-group/task-count-condition-group.component.d.ts.map +1 -0
  9. package/lib/data-sources/task-count/components/task-count-configuration/task-count-configuration.component.d.ts +43 -18
  10. package/lib/data-sources/task-count/components/task-count-configuration/task-count-configuration.component.d.ts.map +1 -1
  11. package/lib/data-sources/task-count/constants/index.d.ts +2 -0
  12. package/lib/data-sources/task-count/constants/index.d.ts.map +1 -0
  13. package/lib/data-sources/task-count/constants/task-count.test-ids.d.ts +11 -0
  14. package/lib/data-sources/task-count/constants/task-count.test-ids.d.ts.map +1 -0
  15. package/lib/data-sources/task-count/models/task-count.model.d.ts +50 -3
  16. package/lib/data-sources/task-count/models/task-count.model.d.ts.map +1 -1
  17. package/lib/data-sources/task-count/task-count.module.d.ts +2 -1
  18. package/lib/data-sources/task-count/task-count.module.d.ts.map +1 -1
  19. package/lib/data-sources/task-count/task-count.specification.d.ts.map +1 -1
  20. package/lib/data-sources/task-count/utils/index.d.ts +2 -0
  21. package/lib/data-sources/task-count/utils/index.d.ts.map +1 -0
  22. package/lib/data-sources/task-count/utils/task-count-conditions.utils.d.ts +27 -0
  23. package/lib/data-sources/task-count/utils/task-count-conditions.utils.d.ts.map +1 -0
  24. package/lib/models/data-source.model.d.ts +40 -1
  25. package/lib/models/data-source.model.d.ts.map +1 -1
  26. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ViewChild, Component, InjectionToken, Injectable, Inject, ViewContainerRef, Input, ViewChildren, ViewEncapsulation, Pipe, EventEmitter, Output, ChangeDetectionStrategy, NgModule } from '@angular/core';
2
+ import { ViewChild, Component, InjectionToken, Injectable, Inject, ViewContainerRef, Input, ViewChildren, ViewEncapsulation, Pipe, EventEmitter, Output, ChangeDetectionStrategy, NgModule, signal } from '@angular/core';
3
3
  import moment from 'moment';
4
- import { BehaviorSubject, filter, map, Subject, Subscription, combineLatest, debounceTime, tap, startWith, distinctUntilChanged } from 'rxjs';
4
+ import { BehaviorSubject, filter, map, Subject, Subscription, combineLatest, debounceTime, tap, startWith, distinctUntilChanged, shareReplay } from 'rxjs';
5
5
  import { take, map as map$1, delay } from 'rxjs/operators';
6
6
  import * as i1 from '@valtimo/task';
7
7
  import { TaskModule } from '@valtimo/task';
@@ -19,15 +19,16 @@ import { HttpClient } from '@angular/common/http';
19
19
  import * as i2$1 from '@valtimo/shared';
20
20
  import { ROLE_USER } from '@valtimo/shared';
21
21
  import * as i4 from 'carbon-components-angular';
22
- import { InputModule, CheckboxModule, DropdownModule, ButtonModule, TilesModule, LayerModule, IconModule, TabsModule, ThemeModule, LoadingModule } from 'carbon-components-angular';
22
+ import { InputModule, CheckboxModule, DropdownModule, ButtonModule, TilesModule, LayerModule, IconModule, ContentSwitcherModule, NotificationModule, TabsModule, ThemeModule, LoadingModule } from 'carbon-components-angular';
23
23
  import * as i1$3 from '@angular/forms';
24
- import { Validators, ReactiveFormsModule } from '@angular/forms';
24
+ import { Validators, ReactiveFormsModule, FormGroup, FormControl, FormArray } from '@angular/forms';
25
25
  import { ScaleTypes } from '@carbon/charts';
26
26
  import * as i3$2 from '@carbon/charts-angular';
27
27
  import { ChartsModule } from '@carbon/charts-angular';
28
28
  import * as i2$2 from '@valtimo/document';
29
29
  import { isEqual } from 'lodash';
30
30
  import { Add16, TrashCan16 } from '@carbon/icons';
31
+ import { toObservable } from '@angular/core/rxjs-interop';
31
32
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
32
33
  import { AuthGuardService } from '@valtimo/security';
33
34
 
@@ -2825,7 +2826,7 @@ class CaseCountConfigurationComponent {
2825
2826
  }));
2826
2827
  }
2827
2828
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CaseCountConfigurationComponent, deps: [{ token: i1$3.FormBuilder }, { token: i2$2.DocumentService }, { token: i3$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
2828
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: CaseCountConfigurationComponent, isStandalone: false, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{documentItems: documentItems$ | async, operatorItems: operatorItems$} as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n type=\"valuePathSelectorDropdownValue\"\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"defaultConditionValues$ | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n (allValuesValidEvent)=\"onAllConditionsValid($event)\"\n (valueChange)=\"conditionsValueChange($event)\"\n valuePathSelectorNotation=\"dots\"\n [valuePathSelectorPrefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [valuePathSelectorShowCaseDefinitionSelector]=\"false\"\n [valuePathSelectorCaseDefinitionKey]=\"selectedDocumentDefinition$ | async\"\n [keyColumnFlex]=\"2\"\n [dropdownColumnFlex]=\"1\"\n [valueColumnFlex]=\"1\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "component", type: i4.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i4.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2829
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: CaseCountConfigurationComponent, isStandalone: false, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{documentItems: documentItems$ | async, operatorItems: operatorItems$} as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n type=\"valuePathSelectorDropdownValue\"\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"defaultConditionValues$ | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n (allValuesValidEvent)=\"onAllConditionsValid($event)\"\n (valueChange)=\"conditionsValueChange($event)\"\n valuePathSelectorNotation=\"dots\"\n [valuePathSelectorPrefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [valuePathSelectorShowCaseDefinitionSelector]=\"false\"\n [valuePathSelectorCaseDefinitionKey]=\"selectedDocumentDefinition$ | async\"\n [keyColumnFlex]=\"2\"\n [dropdownColumnFlex]=\"1\"\n [valueColumnFlex]=\"1\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "component", type: i4.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i4.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteButtonType", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2829
2830
  }
2830
2831
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CaseCountConfigurationComponent, decorators: [{
2831
2832
  type: Component,
@@ -3244,7 +3245,7 @@ class CaseCountsConfigurationComponent {
3244
3245
  };
3245
3246
  }
3246
3247
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CaseCountsConfigurationComponent, deps: [{ token: i1$3.FormBuilder }, { token: i2$2.DocumentService }, { token: i3$1.TranslateService }, { token: i4.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
3247
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CaseCountsConfigurationComponent, isStandalone: false, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-counts-configuration-form\"\n *ngIf=\"{\n documentItems: documentItems$ | async,\n operatorItems: operatorItems$,\n queryItemsValue: queryItemsValue$ | async,\n selectedDocumentDefinition: selectedDocumentDefinition$ | async,\n } as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <cds-label class=\"conditions__label\">{{\n 'counts' | widgetTranslate: dataSourceKey | async\n }}</cds-label>\n\n <p class=\"conditions__helper-text cds--form__helper-text\">\n {{ 'countsHelperText' | widgetTranslate: dataSourceKey | async }}\n </p>\n\n @for (_ of queryItemsList$ | async; track $index; let i = $index) {\n <cds-tile class=\"count-tile\" [cdsLayer]=\"1\">\n <div class=\"count-tile__input\" [cdsLayer]=\"0\">\n <v-input\n [title]=\"'countTitle' | widgetTranslate: dataSourceKey | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.queryItemsValue[i]?.label\"\n [disabled]=\"formDisabled\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"labelValueChange(i, $event)\"\n >\n </v-input>\n\n <valtimo-carbon-multi-input\n type=\"valuePathSelectorDropdownValue\"\n [disabled]=\"formDisabled\"\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.queryItemsValue[i]?.queryConditions\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"1\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"1\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n valuePathSelectorNotation=\"dots\"\n [valuePathSelectorPrefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [valuePathSelectorShowCaseDefinitionSelector]=\"false\"\n [valuePathSelectorCaseDefinitionKey]=\"obs.selectedDocumentDefinition\"\n [keyColumnFlex]=\"2\"\n [dropdownColumnFlex]=\"1\"\n [valueColumnFlex]=\"1\"\n (valueChange)=\"conditionsValueChange(i, $event)\"\n ></valtimo-carbon-multi-input>\n </div>\n\n <div class=\"count-tile__delete-button\">\n <cds-icon-button\n [disabled]=\"formDisabled || i < 2\"\n (click)=\"deleteCount(i)\"\n kind=\"danger\"\n size=\"sm\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </cds-icon-button>\n </div>\n </cds-tile>\n }\n\n <button\n class=\"add-count-button\"\n cdsButton=\"primary\"\n [disabled]=\"formDisabled\"\n (click)=\"addQueryItem()\"\n >\n {{ 'Aantal toevoegen' }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</form>\n", styles: ["::ng-deep .case-counts-configuration-form .conditions__label{display:flex;margin-bottom:8px}::ng-deep .case-counts-configuration-form .conditions__helper-text{font-style:italic;display:flex;margin-bottom:16px}::ng-deep .case-counts-configuration-form .count-tile{display:flex;flex-direction:row;gap:32px;justify-content:space-between;margin-bottom:16px}::ng-deep .case-counts-configuration-form .count-tile__input{width:100%}::ng-deep .case-counts-configuration-form .add-count-button{margin-bottom:16px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1$1.InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder", "dataTestId", "trim", "presetsTitle", "presetOptions"], outputs: ["valueChange"] }, { kind: "component", type: i4.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i4.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "directive", type: i4.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i4.IconButton, selector: "cds-icon-button, ibm-icon-button", inputs: ["buttonNgClass", "buttonAttributes", "buttonId", "kind", "size", "type", "isExpressive", "disabled", "description", "showTooltipWhenDisabled"], outputs: ["click", "focus", "blur", "tooltipClick"] }, { kind: "component", type: i4.Tile, selector: "cds-tile, ibm-tile", inputs: ["theme"] }, { kind: "directive", type: i4.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "directive", type: i4.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3248
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CaseCountsConfigurationComponent, isStandalone: false, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-counts-configuration-form\"\n *ngIf=\"{\n documentItems: documentItems$ | async,\n operatorItems: operatorItems$,\n queryItemsValue: queryItemsValue$ | async,\n selectedDocumentDefinition: selectedDocumentDefinition$ | async,\n } as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <cds-label class=\"conditions__label\">{{\n 'counts' | widgetTranslate: dataSourceKey | async\n }}</cds-label>\n\n <p class=\"conditions__helper-text cds--form__helper-text\">\n {{ 'countsHelperText' | widgetTranslate: dataSourceKey | async }}\n </p>\n\n @for (_ of queryItemsList$ | async; track $index; let i = $index) {\n <cds-tile class=\"count-tile\" [cdsLayer]=\"1\">\n <div class=\"count-tile__input\" [cdsLayer]=\"0\">\n <v-input\n [title]=\"'countTitle' | widgetTranslate: dataSourceKey | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.queryItemsValue[i]?.label\"\n [disabled]=\"formDisabled\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"labelValueChange(i, $event)\"\n >\n </v-input>\n\n <valtimo-carbon-multi-input\n type=\"valuePathSelectorDropdownValue\"\n [disabled]=\"formDisabled\"\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.queryItemsValue[i]?.queryConditions\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"1\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"1\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n valuePathSelectorNotation=\"dots\"\n [valuePathSelectorPrefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [valuePathSelectorShowCaseDefinitionSelector]=\"false\"\n [valuePathSelectorCaseDefinitionKey]=\"obs.selectedDocumentDefinition\"\n [keyColumnFlex]=\"2\"\n [dropdownColumnFlex]=\"1\"\n [valueColumnFlex]=\"1\"\n (valueChange)=\"conditionsValueChange(i, $event)\"\n ></valtimo-carbon-multi-input>\n </div>\n\n <div class=\"count-tile__delete-button\">\n <cds-icon-button\n [disabled]=\"formDisabled || i < 2\"\n (click)=\"deleteCount(i)\"\n kind=\"danger\"\n size=\"sm\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </cds-icon-button>\n </div>\n </cds-tile>\n }\n\n <button\n class=\"add-count-button\"\n cdsButton=\"primary\"\n [disabled]=\"formDisabled\"\n (click)=\"addQueryItem()\"\n >\n {{ 'Aantal toevoegen' }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</form>\n", styles: ["::ng-deep .case-counts-configuration-form .conditions__label{display:flex;margin-bottom:8px}::ng-deep .case-counts-configuration-form .conditions__helper-text{font-style:italic;display:flex;margin-bottom:16px}::ng-deep .case-counts-configuration-form .count-tile{display:flex;flex-direction:row;gap:32px;justify-content:space-between;margin-bottom:16px}::ng-deep .case-counts-configuration-form .count-tile__input{width:100%}::ng-deep .case-counts-configuration-form .add-count-button{margin-bottom:16px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1$1.InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder", "dataTestId", "trim", "presetsTitle", "presetOptions"], outputs: ["valueChange"] }, { kind: "component", type: i4.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i4.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteButtonType", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "directive", type: i4.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i4.IconButton, selector: "cds-icon-button, ibm-icon-button", inputs: ["buttonNgClass", "buttonAttributes", "buttonId", "kind", "size", "type", "isExpressive", "disabled", "description", "showTooltipWhenDisabled"], outputs: ["click", "focus", "blur", "tooltipClick"] }, { kind: "component", type: i4.Tile, selector: "cds-tile, ibm-tile", inputs: ["theme"] }, { kind: "directive", type: i4.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "directive", type: i4.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3248
3249
  }
3249
3250
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CaseCountsConfigurationComponent, decorators: [{
3250
3251
  type: Component,
@@ -3634,7 +3635,7 @@ class CaseGroupByConfigurationComponent {
3634
3635
  }));
3635
3636
  }
3636
3637
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CaseGroupByConfigurationComponent, deps: [{ token: i1$3.FormBuilder }, { token: i2$2.DocumentService }, { token: i3$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
3637
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: CaseGroupByConfigurationComponent, isStandalone: false, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{\n documentItems: documentItems$ | async,\n operatorItems: operatorItems$,\n selectedDocumentDefinition: selectedDocumentDefinition$ | async,\n formValue: formValue$ | async,\n } as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'pathHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'pathHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"full-width\"\n >\n {{ 'path' | widgetTranslate: dataSourceKey | async }}\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [caseDefinitionKey]=\"obs.selectedDocumentDefinition\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </cds-label>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n type=\"valuePathSelectorDropdownValue\"\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.formValue?.queryConditions\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n valuePathSelectorNotation=\"dots\"\n [valuePathSelectorPrefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [valuePathSelectorShowCaseDefinitionSelector]=\"false\"\n [valuePathSelectorCaseDefinitionKey]=\"obs.selectedDocumentDefinition\"\n [keyColumnFlex]=\"2\"\n [dropdownColumnFlex]=\"1\"\n [valueColumnFlex]=\"1\"\n (valueChange)=\"conditionsValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'enumHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'enum' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addDisplay' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.formValue?.enum\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'displayValue' | widgetTranslate: dataSourceKey | async\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}::ng-deep .case-count-configuration-form .full-width,::ng-deep .case-count-configuration-form .full-width .cds--label{width:100%}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "component", type: i4.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i4.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "component", type: i1$1.ValuePathSelectorComponent, selector: "valtimo-value-path-selector", inputs: ["name", "appendInline", "margin", "marginLg", "marginXl", "disabled", "caseDefinitionKey", "caseDefinitionVersionTag", "buildingBlockDefinitionKey", "buildingBlockDefinitionVersionTag", "prefixes", "excludePrefixes", "label", "tooltip", "required", "showCaseDefinitionSelector", "notation", "dropUp", "defaultValue", "type", "parentItem", "filterItems"], outputs: ["valueChangeEvent", "collectionSelected"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3638
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: CaseGroupByConfigurationComponent, isStandalone: false, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{\n documentItems: documentItems$ | async,\n operatorItems: operatorItems$,\n selectedDocumentDefinition: selectedDocumentDefinition$ | async,\n formValue: formValue$ | async,\n } as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'pathHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'pathHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"full-width\"\n >\n {{ 'path' | widgetTranslate: dataSourceKey | async }}\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [caseDefinitionKey]=\"obs.selectedDocumentDefinition\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </cds-label>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n type=\"valuePathSelectorDropdownValue\"\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.formValue?.queryConditions\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n valuePathSelectorNotation=\"dots\"\n [valuePathSelectorPrefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n [valuePathSelectorShowCaseDefinitionSelector]=\"false\"\n [valuePathSelectorCaseDefinitionKey]=\"obs.selectedDocumentDefinition\"\n [keyColumnFlex]=\"2\"\n [dropdownColumnFlex]=\"1\"\n [valueColumnFlex]=\"1\"\n (valueChange)=\"conditionsValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'enumHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'enum' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addDisplay' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.formValue?.enum\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'displayValue' | widgetTranslate: dataSourceKey | async\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}::ng-deep .case-count-configuration-form .full-width,::ng-deep .case-count-configuration-form .full-width .cds--label{width:100%}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "component", type: i4.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i4.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteButtonType", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "component", type: i1$1.ValuePathSelectorComponent, selector: "valtimo-value-path-selector", inputs: ["name", "appendInline", "margin", "marginLg", "marginXl", "disabled", "caseDefinitionKey", "caseDefinitionVersionTag", "buildingBlockDefinitionKey", "buildingBlockDefinitionVersionTag", "prefixes", "excludePrefixes", "label", "tooltip", "required", "showCaseDefinitionSelector", "notation", "dropUp", "defaultValue", "type", "parentItem", "filterItems"], outputs: ["valueChangeEvent", "collectionSelected"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3638
3639
  }
3639
3640
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CaseGroupByConfigurationComponent, decorators: [{
3640
3641
  type: Component,
@@ -3854,7 +3855,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
3854
3855
  */
3855
3856
 
3856
3857
  /*
3857
- * Copyright 2015-2025 Ritense BV, the Netherlands.
3858
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
3858
3859
  *
3859
3860
  * Licensed under EUPL, Version 1.2 (the "License");
3860
3861
  * you may not use this file except in compliance with the License.
@@ -3868,85 +3869,467 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
3868
3869
  * See the License for the specific language governing permissions and
3869
3870
  * limitations under the License.
3870
3871
  */
3871
- class TaskCountConfigurationComponent {
3872
- set disabled(disabledValue) {
3873
- if (disabledValue) {
3874
- this.form.disable();
3872
+ const TASK_COUNT_TEST_IDS = {
3873
+ caseDefinitionDropdown: 'taskCountCaseDefinitionDropdown',
3874
+ conditionGroup: 'taskCountConditionGroup',
3875
+ operatorSwitcher: 'taskCountGroupOperatorSwitcher',
3876
+ operatorAndButton: 'taskCountGroupOperatorAndButton',
3877
+ operatorOrButton: 'taskCountGroupOperatorOrButton',
3878
+ operatorMirror: 'taskCountGroupOperatorMirror',
3879
+ addGroupButton: 'taskCountAddGroupButton',
3880
+ deleteGroupButton: 'taskCountDeleteGroupButton',
3881
+ };
3882
+
3883
+ /*
3884
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
3885
+ *
3886
+ * Licensed under EUPL, Version 1.2 (the "License");
3887
+ * you may not use this file except in compliance with the License.
3888
+ * You may obtain a copy of the License at
3889
+ *
3890
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
3891
+ *
3892
+ * Unless required by applicable law or agreed to in writing, software
3893
+ * distributed under the License is distributed on an "AS IS" basis,
3894
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3895
+ * See the License for the specific language governing permissions and
3896
+ * limitations under the License.
3897
+ */
3898
+
3899
+ /*
3900
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
3901
+ *
3902
+ * Licensed under EUPL, Version 1.2 (the "License");
3903
+ * you may not use this file except in compliance with the License.
3904
+ * You may obtain a copy of the License at
3905
+ *
3906
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
3907
+ *
3908
+ * Unless required by applicable law or agreed to in writing, software
3909
+ * distributed under the License is distributed on an "AS IS" basis,
3910
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3911
+ * See the License for the specific language governing permissions and
3912
+ * limitations under the License.
3913
+ */
3914
+ /** The operators the condition rows offer. Anything else is preserved but not editable. */
3915
+ const EDITABLE_CONDITION_OPERATORS = [
3916
+ '!=',
3917
+ '==',
3918
+ '>',
3919
+ '>=',
3920
+ '<',
3921
+ '<=',
3922
+ ];
3923
+ function createConditionGroup(operator, rows = [], unsupportedNodes = []) {
3924
+ return new FormGroup({
3925
+ operator: new FormControl(operator, { nonNullable: true }),
3926
+ rows: new FormControl(rows, { nonNullable: true }),
3927
+ // The multi input drops incomplete rows from its value, so a group that is still being filled
3928
+ // in can only be recognised through the event the multi input emits for it. Until that event
3929
+ // arrives - and for a group that is never rendered - the rows themselves decide, so that a
3930
+ // group created with an empty row does not report itself as complete in the meantime.
3931
+ rowsComplete: new FormControl(rows.every(isRowComplete), {
3932
+ nonNullable: true,
3933
+ validators: [Validators.requiredTrue],
3934
+ }),
3935
+ groups: new FormArray([]),
3936
+ unsupportedNodes: new FormControl(unsupportedNodes, { nonNullable: true }),
3937
+ });
3938
+ }
3939
+ function createEmptyConditionRow() {
3940
+ return { key: '', dropdown: '', value: '' };
3941
+ }
3942
+ /**
3943
+ * Applies the conditions of a stored configuration to [root], leaving the form instance itself
3944
+ * intact so that subscriptions on it survive a prefill.
3945
+ *
3946
+ * A single group at the top level is adopted as the root group itself, so that its operator
3947
+ * survives a save/reload round-trip. Anything else - including a legacy flat list of conditions -
3948
+ * becomes a set of children combined with AND, matching the backend's list semantics.
3949
+ */
3950
+ function resetRootGroup(root, nodes) {
3951
+ const [firstNode] = nodes;
3952
+ if (nodes.length === 1 && isWireGroup(firstNode)) {
3953
+ applyWireGroup(root, firstNode);
3954
+ return;
3955
+ }
3956
+ root.controls.operator.setValue('and');
3957
+ applyWireChildren(root, nodes);
3958
+ }
3959
+ /**
3960
+ * Walks [group] once and collects the wire node to emit and whether the tree holds nodes the editor
3961
+ * cannot render.
3962
+ *
3963
+ * Groups without a single condition serialize to `null`: the backend rejects empty `and`/`or`
3964
+ * groups, because `cb.or()` without predicates evaluates to false and would silently zero out the
3965
+ * count.
3966
+ */
3967
+ function serializeConditionGroup(group) {
3968
+ const children = [];
3969
+ let hasUnsupportedNodes = group.unsupportedNodes.length > 0;
3970
+ group.rows.filter(isRowComplete).forEach(row => children.push(rowToLeaf(row)));
3971
+ group.groups.forEach(nestedGroup => {
3972
+ const nested = serializeConditionGroup(nestedGroup);
3973
+ hasUnsupportedNodes = hasUnsupportedNodes || nested.hasUnsupportedNodes;
3974
+ if (nested.node) {
3975
+ children.push(nested.node);
3976
+ }
3977
+ });
3978
+ children.push(...group.unsupportedNodes);
3979
+ return {
3980
+ node: children.length ? toWireGroup(group.operator, children) : null,
3981
+ hasUnsupportedNodes,
3982
+ };
3983
+ }
3984
+ function toWireGroup(operator, children) {
3985
+ return operator === 'or' ? { or: children } : { and: children };
3986
+ }
3987
+ function applyWireGroup(group, wireGroup) {
3988
+ if (isWireOrGroup(wireGroup)) {
3989
+ group.controls.operator.setValue('or');
3990
+ applyWireChildren(group, wireGroup.or);
3991
+ }
3992
+ else {
3993
+ group.controls.operator.setValue('and');
3994
+ applyWireChildren(group, wireGroup.and);
3995
+ }
3996
+ }
3997
+ function applyWireChildren(group, nodes) {
3998
+ const rows = [];
3999
+ const unsupportedNodes = [];
4000
+ group.controls.groups.clear();
4001
+ nodes.forEach(node => {
4002
+ if (isWireGroup(node)) {
4003
+ const nestedGroup = createConditionGroup('and');
4004
+ applyWireGroup(nestedGroup, node);
4005
+ group.controls.groups.push(nestedGroup);
4006
+ }
4007
+ else if (isEditableLeaf(node)) {
4008
+ rows.push(wireLeafToRow(node));
3875
4009
  }
3876
4010
  else {
3877
- this.form.enable();
4011
+ unsupportedNodes.push(node);
3878
4012
  }
4013
+ });
4014
+ group.controls.rows.setValue(rows);
4015
+ // The rows that were reported as incomplete are gone, and a group whose rows are all removed no
4016
+ // longer renders a multi input to report on them, so the flag is reset here rather than waited on.
4017
+ group.controls.rowsComplete.setValue(rows.every(isRowComplete));
4018
+ group.controls.unsupportedNodes.setValue(unsupportedNodes);
4019
+ }
4020
+ function isWireOrGroup(node) {
4021
+ return Array.isArray(node.or);
4022
+ }
4023
+ function isWireAndGroup(node) {
4024
+ return Array.isArray(node.and);
4025
+ }
4026
+ function isWireGroup(node) {
4027
+ return !!node && (isWireOrGroup(node) || isWireAndGroup(node));
4028
+ }
4029
+ /** A leaf is editable when every part of it fits the three inputs of a condition row. */
4030
+ function isEditableLeaf(leaf) {
4031
+ const value = leaf.value ?? leaf.queryValue;
4032
+ return (typeof (leaf.path ?? leaf.queryPath) === 'string' &&
4033
+ (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') &&
4034
+ EDITABLE_CONDITION_OPERATORS.includes((leaf.operator ?? leaf.queryOperator)));
4035
+ }
4036
+ function wireLeafToRow(leaf) {
4037
+ return {
4038
+ key: (leaf.path ?? leaf.queryPath),
4039
+ dropdown: (leaf.operator ?? leaf.queryOperator),
4040
+ value: String(leaf.value ?? leaf.queryValue),
4041
+ };
4042
+ }
4043
+ function rowToLeaf(row) {
4044
+ return {
4045
+ path: row.key,
4046
+ operator: row.dropdown,
4047
+ value: parseRowValue(row.value),
4048
+ };
4049
+ }
4050
+ /**
4051
+ * Rows only hold strings. Restore the type - the backend compares a string as text, so '100' > '50'
4052
+ * is false. Only values that round-trip unchanged convert, keeping "0050" and "50.10" strings.
4053
+ */
4054
+ function parseRowValue(value) {
4055
+ if (value === 'true' || value === 'false') {
4056
+ return value === 'true';
3879
4057
  }
3880
- get queryConditions() {
3881
- return this.form.get('queryConditions');
4058
+ const asNumber = Number(value);
4059
+ return Number.isFinite(asNumber) && String(asNumber) === value ? asNumber : value;
4060
+ }
4061
+ function isRowComplete(row) {
4062
+ return !!row.key && !!row.dropdown && !!row.value;
4063
+ }
4064
+
4065
+ /*
4066
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
4067
+ *
4068
+ * Licensed under EUPL, Version 1.2 (the "License");
4069
+ * you may not use this file except in compliance with the License.
4070
+ * You may obtain a copy of the License at
4071
+ *
4072
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4073
+ *
4074
+ * Unless required by applicable law or agreed to in writing, software
4075
+ * distributed under the License is distributed on an "AS IS" basis,
4076
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4077
+ * See the License for the specific language governing permissions and
4078
+ * limitations under the License.
4079
+ */
4080
+
4081
+ /*
4082
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
4083
+ *
4084
+ * Licensed under EUPL, Version 1.2 (the "License");
4085
+ * you may not use this file except in compliance with the License.
4086
+ * You may obtain a copy of the License at
4087
+ *
4088
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4089
+ *
4090
+ * Unless required by applicable law or agreed to in writing, software
4091
+ * distributed under the License is distributed on an "AS IS" basis,
4092
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4093
+ * See the License for the specific language governing permissions and
4094
+ * limitations under the License.
4095
+ */
4096
+ /**
4097
+ * A single condition group in the task count configuration: an AND/OR selector, the group's own
4098
+ * condition rows, and its nested groups. The component renders itself recursively, so groups can
4099
+ * be nested to any depth - matching the backend `AndConditionGroup`/`OrConditionGroup` tree.
4100
+ *
4101
+ * All state lives in the [group] form: the rows are bound to the multi input as a control, and a
4102
+ * nested group is a form in the `groups` array. Changes therefore reach the configuration component
4103
+ * through the form itself, without this component reporting them.
4104
+ */
4105
+ class TaskCountConditionGroupComponent {
4106
+ get operator() {
4107
+ return this.group.controls.operator.value;
4108
+ }
4109
+ get rowsControl() {
4110
+ return this.group.controls.rows;
4111
+ }
4112
+ get groups() {
4113
+ return this.group.controls.groups;
4114
+ }
4115
+ /**
4116
+ * Index of the connector that carries the interactive operator selector.
4117
+ *
4118
+ * The root renders a connector between every pair of sections, but a group has a single operator,
4119
+ * so all of them would set the same value. Only this one is a selector; the rest mirror it as
4120
+ * static text, to avoid suggesting that the sections can be joined by different operators.
4121
+ */
4122
+ get interactiveConnectorIndex() {
4123
+ return this.rowsControl.value.length ? 0 : 1;
4124
+ }
4125
+ constructor(iconService) {
4126
+ this.iconService = iconService;
4127
+ this.disabled = false;
4128
+ this.operatorItems = [];
4129
+ /** The outermost group cannot be deleted and starts out without condition rows. */
4130
+ this.root = false;
4131
+ this.deleteGroupEvent = new EventEmitter();
4132
+ this.testIds = TASK_COUNT_TEST_IDS;
4133
+ this.iconService.registerAll([Add16, TrashCan16]);
4134
+ }
4135
+ setOperator(operator) {
4136
+ if (this.operator === operator) {
4137
+ return;
4138
+ }
4139
+ this.group.controls.operator.setValue(operator);
4140
+ }
4141
+ /**
4142
+ * The multi input drops rows that are not filled in completely, so its value alone cannot tell a
4143
+ * half-filled group apart from a complete one. This event does, and marks the group invalid until
4144
+ * every row is either complete or removed.
4145
+ */
4146
+ onAllRowsValid(allRowsValid) {
4147
+ this.group.controls.rowsComplete.setValue(allRowsValid);
4148
+ }
4149
+ /**
4150
+ * Appends a section to this group, leaving the operator of the group untouched.
4151
+ *
4152
+ * How the sections relate is a single property of this group, shown on the connectors between
4153
+ * them and changed there with [setOperator]. An addition deliberately does not ask for it: the
4154
+ * operator of the group and the operator inside a section are two different levels, and the first
4155
+ * addition has nothing to relate the new section to yet. The new section starts out combining its
4156
+ * own conditions with 'and'; that operator is changed in the header of the section itself.
4157
+ */
4158
+ addGroup() {
4159
+ this.groups.push(createConditionGroup('and', [createEmptyConditionRow()]));
4160
+ }
4161
+ removeGroup(index) {
4162
+ this.groups.removeAt(index);
4163
+ }
4164
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TaskCountConditionGroupComponent, deps: [{ token: i4.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
4165
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: TaskCountConditionGroupComponent, isStandalone: true, selector: "valtimo-task-count-condition-group", inputs: { group: "group", dataSourceKey: "dataSourceKey", disabled: "disabled", operatorItems: "operatorItems", root: "root" }, outputs: { deleteGroupEvent: "deleteGroupEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<!-- The AND/OR selector for this group, in the header of a nested group or on the first connector\n between the root sections. -->\n<ng-template #operatorSwitcher>\n <cds-content-switcher\n class=\"condition-operator\"\n [attr.data-test-id]=\"testIds.operatorSwitcher\"\n size=\"sm\"\n >\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"operator === 'and'\"\n [attr.data-test-id]=\"testIds.operatorAndButton\"\n [disabled]=\"disabled\"\n (selected)=\"setOperator('and')\"\n >\n {{ 'and' | widgetTranslate: dataSourceKey | async }}\n </button>\n\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"operator === 'or'\"\n [attr.data-test-id]=\"testIds.operatorOrButton\"\n [disabled]=\"disabled\"\n (selected)=\"setOperator('or')\"\n >\n {{ 'or' | widgetTranslate: dataSourceKey | async }}\n </button>\n </cds-content-switcher>\n</ng-template>\n\n<!--\n The condition rows of this group. The multi input is a form control, so the rows are written and\n read through [rowsControl] and its disabled state follows the control - binding [disabled] here\n would set it on the form directive as well.\n-->\n<ng-template #conditionRows let-minimumAmountOfRows=\"minimumAmountOfRows\">\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems\"\n [formControl]=\"rowsControl\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"minimumAmountOfRows\"\n [minimumAmountOfRows]=\"minimumAmountOfRows\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n (allValuesValidEvent)=\"onAllRowsValid($event)\"\n addButtonType=\"tertiary\"\n deleteButtonType=\"danger--ghost\"\n type=\"keyDropdownValue\"\n ></valtimo-carbon-multi-input>\n</ng-template>\n\n@if (root) {\n <!--\n The root group is not a section of its own: it only groups the sections. Its single operator\n defines how all of the sections relate to each other, and is rendered as a connector between\n them - a selector on the first connector, static text on the ones after it. Connectors only\n appear once there is something to relate (two or more sections, or a section following\n root-level rows). Each section carries its own operator for the conditions inside it. \"Add\n condition group\" appends a new section. Direct root-level rows only exist for configuration\n authored in a file; they are kept editable so that saving does not drop them.\n -->\n <div class=\"condition-root\" [attr.data-test-id]=\"testIds.conditionGroup\">\n @if (rowsControl.value.length) {\n <ng-container\n *ngTemplateOutlet=\"conditionRows; context: {minimumAmountOfRows: 0}\"\n ></ng-container>\n }\n\n @for (nestedGroup of groups.controls; track nestedGroup; let index = $index) {\n @if (index === interactiveConnectorIndex) {\n <ng-container *ngTemplateOutlet=\"operatorSwitcher\"></ng-container>\n } @else if (index > interactiveConnectorIndex) {\n <p\n class=\"condition-root__operator-mirror\"\n [attr.data-test-id]=\"testIds.operatorMirror\"\n aria-hidden=\"true\"\n >\n {{ operator | widgetTranslate: dataSourceKey | async }}\n </p>\n }\n\n <valtimo-task-count-condition-group\n [dataSourceKey]=\"dataSourceKey\"\n [disabled]=\"disabled\"\n [group]=\"nestedGroup\"\n [operatorItems]=\"operatorItems\"\n (deleteGroupEvent)=\"removeGroup(index)\"\n ></valtimo-task-count-condition-group>\n }\n\n <button\n class=\"condition-root__add-button\"\n cdsButton=\"tertiary\"\n type=\"button\"\n [attr.data-test-id]=\"testIds.addGroupButton\"\n [disabled]=\"disabled\"\n (click)=\"addGroup()\"\n >\n {{ 'addGroup' | widgetTranslate: dataSourceKey | async }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n} @else {\n <cds-tile class=\"condition-group\" [attr.data-test-id]=\"testIds.conditionGroup\" [cdsLayer]=\"0\">\n <div class=\"condition-group__header\">\n <ng-container *ngTemplateOutlet=\"operatorSwitcher\"></ng-container>\n\n <cds-icon-button\n [attr.data-test-id]=\"testIds.deleteGroupButton\"\n [description]=\"'deleteGroup' | widgetTranslate: dataSourceKey | async\"\n [disabled]=\"disabled\"\n (click)=\"deleteGroupEvent.emit()\"\n kind=\"danger--ghost\"\n size=\"sm\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </cds-icon-button>\n </div>\n\n <ng-container\n *ngTemplateOutlet=\"conditionRows; context: {minimumAmountOfRows: 1}\"\n ></ng-container>\n\n @for (nestedGroup of groups.controls; track nestedGroup; let index = $index) {\n <valtimo-task-count-condition-group\n [dataSourceKey]=\"dataSourceKey\"\n [disabled]=\"disabled\"\n [group]=\"nestedGroup\"\n [operatorItems]=\"operatorItems\"\n (deleteGroupEvent)=\"removeGroup(index)\"\n ></valtimo-task-count-condition-group>\n }\n </cds-tile>\n}\n", styles: [":host{display:block}.condition-operator{max-width:160px;width:100%}.condition-operator .cds--content-switcher-btn{display:flex;align-items:center;justify-content:center;min-block-size:1.875rem;block-size:1.875rem;padding-block:0}.condition-root{display:flex;flex-direction:column;gap:16px}.condition-root__operator-mirror{max-width:160px;width:100%;margin:0;text-align:center;color:var(--cds-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.32px}.condition-root__add-button{align-self:flex-start}.condition-group{display:flex;flex-direction:column;gap:16px;background-color:var(--cds-layer-02)}.condition-group__header{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:16px}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "component", type: TaskCountConditionGroupComponent, selector: "valtimo-task-count-condition-group", inputs: ["group", "dataSourceKey", "disabled", "operatorItems", "root"], outputs: ["deleteGroupEvent"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i4.IconButton, selector: "cds-icon-button, ibm-icon-button", inputs: ["buttonNgClass", "buttonAttributes", "buttonId", "kind", "size", "type", "isExpressive", "disabled", "description", "showTooltipWhenDisabled"], outputs: ["click", "focus", "blur", "tooltipClick"] }, { kind: "ngmodule", type: CarbonMultiInputModule }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteButtonType", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ContentSwitcherModule }, { kind: "component", type: i4.ContentSwitcher, selector: "cds-content-switcher, ibm-content-switcher", inputs: ["ariaLabel", "size"], outputs: ["selected"] }, { kind: "directive", type: i4.ContentSwitcherOption, selector: "[cdsContentOption], [ibmContentOption]", inputs: ["active", "name"], outputs: ["selected", "onClick", "onFocus"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i4.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: LayerModule }, { kind: "directive", type: i4.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TilesModule }, { kind: "component", type: i4.Tile, selector: "cds-tile, ibm-tile", inputs: ["theme"] }, { kind: "ngmodule", type: WidgetTranslatePipeModule }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4166
+ }
4167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TaskCountConditionGroupComponent, decorators: [{
4168
+ type: Component,
4169
+ args: [{ standalone: true, selector: 'valtimo-task-count-condition-group', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
4170
+ ButtonModule,
4171
+ CarbonMultiInputModule,
4172
+ CommonModule,
4173
+ ContentSwitcherModule,
4174
+ IconModule,
4175
+ LayerModule,
4176
+ ReactiveFormsModule,
4177
+ TilesModule,
4178
+ WidgetTranslatePipeModule,
4179
+ ], template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<!-- The AND/OR selector for this group, in the header of a nested group or on the first connector\n between the root sections. -->\n<ng-template #operatorSwitcher>\n <cds-content-switcher\n class=\"condition-operator\"\n [attr.data-test-id]=\"testIds.operatorSwitcher\"\n size=\"sm\"\n >\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"operator === 'and'\"\n [attr.data-test-id]=\"testIds.operatorAndButton\"\n [disabled]=\"disabled\"\n (selected)=\"setOperator('and')\"\n >\n {{ 'and' | widgetTranslate: dataSourceKey | async }}\n </button>\n\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"operator === 'or'\"\n [attr.data-test-id]=\"testIds.operatorOrButton\"\n [disabled]=\"disabled\"\n (selected)=\"setOperator('or')\"\n >\n {{ 'or' | widgetTranslate: dataSourceKey | async }}\n </button>\n </cds-content-switcher>\n</ng-template>\n\n<!--\n The condition rows of this group. The multi input is a form control, so the rows are written and\n read through [rowsControl] and its disabled state follows the control - binding [disabled] here\n would set it on the form directive as well.\n-->\n<ng-template #conditionRows let-minimumAmountOfRows=\"minimumAmountOfRows\">\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems\"\n [formControl]=\"rowsControl\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"minimumAmountOfRows\"\n [minimumAmountOfRows]=\"minimumAmountOfRows\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n (allValuesValidEvent)=\"onAllRowsValid($event)\"\n addButtonType=\"tertiary\"\n deleteButtonType=\"danger--ghost\"\n type=\"keyDropdownValue\"\n ></valtimo-carbon-multi-input>\n</ng-template>\n\n@if (root) {\n <!--\n The root group is not a section of its own: it only groups the sections. Its single operator\n defines how all of the sections relate to each other, and is rendered as a connector between\n them - a selector on the first connector, static text on the ones after it. Connectors only\n appear once there is something to relate (two or more sections, or a section following\n root-level rows). Each section carries its own operator for the conditions inside it. \"Add\n condition group\" appends a new section. Direct root-level rows only exist for configuration\n authored in a file; they are kept editable so that saving does not drop them.\n -->\n <div class=\"condition-root\" [attr.data-test-id]=\"testIds.conditionGroup\">\n @if (rowsControl.value.length) {\n <ng-container\n *ngTemplateOutlet=\"conditionRows; context: {minimumAmountOfRows: 0}\"\n ></ng-container>\n }\n\n @for (nestedGroup of groups.controls; track nestedGroup; let index = $index) {\n @if (index === interactiveConnectorIndex) {\n <ng-container *ngTemplateOutlet=\"operatorSwitcher\"></ng-container>\n } @else if (index > interactiveConnectorIndex) {\n <p\n class=\"condition-root__operator-mirror\"\n [attr.data-test-id]=\"testIds.operatorMirror\"\n aria-hidden=\"true\"\n >\n {{ operator | widgetTranslate: dataSourceKey | async }}\n </p>\n }\n\n <valtimo-task-count-condition-group\n [dataSourceKey]=\"dataSourceKey\"\n [disabled]=\"disabled\"\n [group]=\"nestedGroup\"\n [operatorItems]=\"operatorItems\"\n (deleteGroupEvent)=\"removeGroup(index)\"\n ></valtimo-task-count-condition-group>\n }\n\n <button\n class=\"condition-root__add-button\"\n cdsButton=\"tertiary\"\n type=\"button\"\n [attr.data-test-id]=\"testIds.addGroupButton\"\n [disabled]=\"disabled\"\n (click)=\"addGroup()\"\n >\n {{ 'addGroup' | widgetTranslate: dataSourceKey | async }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n} @else {\n <cds-tile class=\"condition-group\" [attr.data-test-id]=\"testIds.conditionGroup\" [cdsLayer]=\"0\">\n <div class=\"condition-group__header\">\n <ng-container *ngTemplateOutlet=\"operatorSwitcher\"></ng-container>\n\n <cds-icon-button\n [attr.data-test-id]=\"testIds.deleteGroupButton\"\n [description]=\"'deleteGroup' | widgetTranslate: dataSourceKey | async\"\n [disabled]=\"disabled\"\n (click)=\"deleteGroupEvent.emit()\"\n kind=\"danger--ghost\"\n size=\"sm\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </cds-icon-button>\n </div>\n\n <ng-container\n *ngTemplateOutlet=\"conditionRows; context: {minimumAmountOfRows: 1}\"\n ></ng-container>\n\n @for (nestedGroup of groups.controls; track nestedGroup; let index = $index) {\n <valtimo-task-count-condition-group\n [dataSourceKey]=\"dataSourceKey\"\n [disabled]=\"disabled\"\n [group]=\"nestedGroup\"\n [operatorItems]=\"operatorItems\"\n (deleteGroupEvent)=\"removeGroup(index)\"\n ></valtimo-task-count-condition-group>\n }\n </cds-tile>\n}\n", styles: [":host{display:block}.condition-operator{max-width:160px;width:100%}.condition-operator .cds--content-switcher-btn{display:flex;align-items:center;justify-content:center;min-block-size:1.875rem;block-size:1.875rem;padding-block:0}.condition-root{display:flex;flex-direction:column;gap:16px}.condition-root__operator-mirror{max-width:160px;width:100%;margin:0;text-align:center;color:var(--cds-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.32px}.condition-root__add-button{align-self:flex-start}.condition-group{display:flex;flex-direction:column;gap:16px;background-color:var(--cds-layer-02)}.condition-group__header{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:16px}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
4180
+ }], ctorParameters: () => [{ type: i4.IconService }], propDecorators: { group: [{
4181
+ type: Input
4182
+ }], dataSourceKey: [{
4183
+ type: Input
4184
+ }], disabled: [{
4185
+ type: Input
4186
+ }], operatorItems: [{
4187
+ type: Input
4188
+ }], root: [{
4189
+ type: Input
4190
+ }], deleteGroupEvent: [{
4191
+ type: Output
4192
+ }] } });
4193
+
4194
+ /*
4195
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
4196
+ *
4197
+ * Licensed under EUPL, Version 1.2 (the "License");
4198
+ * you may not use this file except in compliance with the License.
4199
+ * You may obtain a copy of the License at
4200
+ *
4201
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4202
+ *
4203
+ * Unless required by applicable law or agreed to in writing, software
4204
+ * distributed under the License is distributed on an "AS IS" basis,
4205
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4206
+ * See the License for the specific language governing permissions and
4207
+ * limitations under the License.
4208
+ */
4209
+
4210
+ /*
4211
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
4212
+ *
4213
+ * Licensed under EUPL, Version 1.2 (the "License");
4214
+ * you may not use this file except in compliance with the License.
4215
+ * You may obtain a copy of the License at
4216
+ *
4217
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
4218
+ *
4219
+ * Unless required by applicable law or agreed to in writing, software
4220
+ * distributed under the License is distributed on an "AS IS" basis,
4221
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4222
+ * See the License for the specific language governing permissions and
4223
+ * limitations under the License.
4224
+ */
4225
+ class TaskCountConfigurationComponent {
4226
+ set disabled(disabledValue) {
4227
+ this.$disabled.set(disabledValue);
4228
+ this.applyDisabledState();
3882
4229
  }
3883
4230
  set prefillConfiguration(configurationValue) {
3884
- if (configurationValue) {
3885
- this.defaultConditionValues$.next(configurationValue.queryConditions.map(condition => ({
3886
- key: condition.queryPath,
3887
- dropdown: condition.queryOperator,
3888
- value: condition.queryValue,
3889
- })));
4231
+ if (!configurationValue) {
4232
+ return;
3890
4233
  }
4234
+ this._$selectedCaseDefinitionName.set(configurationValue.caseDefinitionName ?? undefined);
4235
+ resetRootGroup(this.conditionsForm, configurationValue.conditions ?? configurationValue.queryConditions ?? []);
4236
+ // Prefill runs after [disabled] and adds enabled groups, which re-enable their parents.
4237
+ this.applyDisabledState();
3891
4238
  }
3892
- constructor(fb, translateService) {
3893
- this.fb = fb;
4239
+ constructor(documentService, translateService, widgetTranslationService) {
4240
+ this.documentService = documentService;
3894
4241
  this.translateService = translateService;
3895
- this.form = this.fb.group({
3896
- queryConditions: this.fb.control(null),
3897
- });
3898
- this._OPERATORS = ['!=', '==', '>', '>=', '<', '<='];
3899
- this.operatorItems$ = this.translateService
4242
+ this.widgetTranslationService = widgetTranslationService;
4243
+ this.configurationEvent = new EventEmitter();
4244
+ this.$disabled = signal(false);
4245
+ /**
4246
+ * The whole condition tree. Kept for the lifetime of the component - a prefill resets its
4247
+ * contents - so that the subscription below survives it.
4248
+ */
4249
+ this.conditionsForm = createConditionGroup('and');
4250
+ this.testIds = TASK_COUNT_TEST_IDS;
4251
+ // Declared before the observables below, which read it at field-initialization time.
4252
+ this._$selectedCaseDefinitionName = signal(undefined);
4253
+ this._serializedConditions$ = this.conditionsForm.valueChanges.pipe(startWith(null), map(() => serializeConditionGroup(this.conditionsForm.getRawValue())), shareReplay({ bufferSize: 1, refCount: true }));
4254
+ this.hasUnsupportedConditions$ = this._serializedConditions$.pipe(map(serialized => serialized.hasUnsupportedNodes));
4255
+ /**
4256
+ * Emits once and then on every language change. Subscribing to a translation is the only way to
4257
+ * be notified, so the lists below are rebuilt whenever this fires.
4258
+ */
4259
+ this._languageChange$ = this.translateService
3900
4260
  .stream('key')
3901
- .pipe(map(() => this._OPERATORS.map(operator => ({
4261
+ .pipe(shareReplay({ bufferSize: 1, refCount: true }));
4262
+ this.caseDefinitionItems$ = combineLatest([
4263
+ this.documentService.getAllDefinitions(),
4264
+ toObservable(this._$selectedCaseDefinitionName),
4265
+ this._languageChange$,
4266
+ ]).pipe(map(([definitions, selectedCaseDefinitionName]) => [
4267
+ {
4268
+ content: this.widgetTranslationService.instant('allCaseDefinitions', this.dataSourceKey),
4269
+ selected: selectedCaseDefinitionName === undefined,
4270
+ caseDefinitionName: undefined,
4271
+ },
4272
+ ...definitions.content.map(definition => ({
4273
+ content: definition.id.name,
4274
+ selected: definition.id.name === selectedCaseDefinitionName,
4275
+ caseDefinitionName: definition.id.name,
4276
+ })),
4277
+ ]));
4278
+ this.operatorItems$ = this._languageChange$.pipe(map(() => EDITABLE_CONDITION_OPERATORS.map(operator => ({
3902
4279
  id: operator,
3903
4280
  content: this.translateService.instant('condition.operator.' + operator),
3904
4281
  selected: false,
3905
4282
  }))));
3906
- this.defaultConditionValues$ = new BehaviorSubject(null);
3907
- this.allConditionsValid$ = new BehaviorSubject(true);
3908
- this.configurationEvent = new EventEmitter();
4283
+ this.unsupportedConditionsNotification$ = this._languageChange$.pipe(map(() => ({
4284
+ type: 'info',
4285
+ lowContrast: true,
4286
+ title: this.widgetTranslationService.instant('unsupportedConditionsNotification', this.dataSourceKey),
4287
+ showClose: false,
4288
+ })));
3909
4289
  this._subscriptions = new Subscription();
3910
4290
  }
3911
4291
  ngOnInit() {
3912
- this.openFormSubscription();
4292
+ this._subscriptions.add(this.conditionsForm.valueChanges.subscribe(() => this.emit()));
4293
+ this.emit();
3913
4294
  }
3914
4295
  ngOnDestroy() {
3915
4296
  this._subscriptions.unsubscribe();
3916
4297
  }
3917
- conditionsValueChange(values) {
3918
- if (values.length === 0) {
3919
- this.queryConditions.setValue(null);
3920
- }
3921
- else {
3922
- this.queryConditions.setValue(values.map(value => ({
3923
- queryPath: value.key,
3924
- queryOperator: value.dropdown,
3925
- queryValue: value.value,
3926
- })));
4298
+ caseDefinitionSelected(event) {
4299
+ if (!event) {
4300
+ return;
3927
4301
  }
4302
+ this._$selectedCaseDefinitionName.set(event.item?.caseDefinitionName ?? undefined);
4303
+ this.emit();
4304
+ }
4305
+ /** Rows are a form control, so the multi input follows the form, not a [disabled] binding. */
4306
+ applyDisabledState() {
4307
+ this.$disabled()
4308
+ ? this.conditionsForm.disable({ emitEvent: false })
4309
+ : this.conditionsForm.enable({ emitEvent: false });
4310
+ }
4311
+ emit() {
4312
+ const { node } = serializeConditionGroup(this.conditionsForm.getRawValue());
4313
+ this.configurationEvent.emit({
4314
+ // A disabled form is neither valid nor invalid, so a read-only configuration is not reported
4315
+ // as an incomplete one.
4316
+ valid: !this.conditionsForm.invalid,
4317
+ data: {
4318
+ caseDefinitionName: this._$selectedCaseDefinitionName() ?? undefined,
4319
+ // Emitted as a single root node so that the operator of the outermost group survives a
4320
+ // save/reload round-trip. An empty root is omitted entirely: the backend rejects empty
4321
+ // `and`/`or` groups.
4322
+ conditions: node ? [node] : [],
4323
+ },
4324
+ });
3928
4325
  }
3929
- onAllConditionsValid(allConditionsValid) {
3930
- this.allConditionsValid$.next(allConditionsValid);
3931
- }
3932
- openFormSubscription() {
3933
- this._subscriptions.add(combineLatest([
3934
- this.form.valueChanges.pipe(startWith(this.form.value)),
3935
- this.allConditionsValid$,
3936
- ]).subscribe(([formValue, allConditionsValid]) => {
3937
- this.configurationEvent.emit({
3938
- valid: this.form.valid && allConditionsValid,
3939
- data: formValue,
3940
- });
3941
- }));
3942
- }
3943
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TaskCountConfigurationComponent, deps: [{ token: i1$3.FormBuilder }, { token: i3$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
3944
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: TaskCountConfigurationComponent, isStandalone: false, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"task-count-configuration-form\"\n *ngIf=\"{operatorItems: operatorItems$} as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"defaultConditionValues$ | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (allValuesValidEvent)=\"onAllConditionsValid($event)\"\n (valueChange)=\"conditionsValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .task-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .task-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["addRowText", "addButtonType", "addRowTranslationKey", "arbitraryAmountTitles", "arbitraryValueAmount", "defaultValues", "deleteRowText", "deleteRowTranslationKey", "disabled", "dropdownColumnTitle", "dropdownItems", "dropdownWidth", "fullWidth", "hideAddButton", "hideDeleteButton", "initialAmountOfRows", "keyColumnTitle", "margin", "maxRows", "minimumAmountOfRows", "name", "required", "title", "titleTranslationKey", "tooltip", "type", "valueColumnTitle", "valuePathSelectorCaseDefinitionKey", "valuePathSelectorPrefixes", "valuePathSelectorShowCaseDefinitionSelector", "valuePathSelectorNotation", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4326
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TaskCountConfigurationComponent, deps: [{ token: i2$2.DocumentService }, { token: i3$1.TranslateService }, { token: WidgetTranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
4327
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: TaskCountConfigurationComponent, isStandalone: false, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"task-count-configuration-form\">\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n [attr.data-test-id]=\"testIds.caseDefinitionDropdown\"\n [disabled]=\"$disabled()\"\n [helperText]=\"'caseDefinitionNameHelperText' | widgetTranslate: dataSourceKey | async\"\n [label]=\"'caseDefinitionName' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"caseDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"(caseDefinitionItems$ | async) || []\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (hasUnsupportedConditions$ | async) {\n <div class=\"form__element\">\n <cds-inline-notification\n [notificationObj]=\"unsupportedConditionsNotification$ | async\"\n ></cds-inline-notification>\n </div>\n }\n\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n\n <valtimo-task-count-condition-group\n [dataSourceKey]=\"dataSourceKey\"\n [disabled]=\"$disabled()\"\n [group]=\"conditionsForm\"\n [operatorItems]=\"(operatorItems$ | async) || []\"\n [root]=\"true\"\n ></valtimo-task-count-condition-group>\n</div>\n", styles: ["::ng-deep .task-count-configuration-form{margin-bottom:24px}::ng-deep .task-count-configuration-form .form__element{margin-bottom:16px}::ng-deep .task-count-configuration-form .conditions-label{display:flex;flex-direction:column;margin-bottom:16px}::ng-deep .task-count-configuration-form .conditions-label .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "component", type: i4.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "component", type: i4.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i4.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i4.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "component", type: TaskCountConditionGroupComponent, selector: "valtimo-task-count-condition-group", inputs: ["group", "dataSourceKey", "disabled", "operatorItems", "root"], outputs: ["deleteGroupEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3945
4328
  }
3946
4329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TaskCountConfigurationComponent, decorators: [{
3947
4330
  type: Component,
3948
- args: [{ standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"task-count-configuration-form\"\n *ngIf=\"{operatorItems: operatorItems$} as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"defaultConditionValues$ | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (allValuesValidEvent)=\"onAllConditionsValid($event)\"\n (valueChange)=\"conditionsValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .task-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .task-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
3949
- }], ctorParameters: () => [{ type: i1$3.FormBuilder }, { type: i3$1.TranslateService }], propDecorators: { dataSourceKey: [{
4331
+ args: [{ standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"task-count-configuration-form\">\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n [attr.data-test-id]=\"testIds.caseDefinitionDropdown\"\n [disabled]=\"$disabled()\"\n [helperText]=\"'caseDefinitionNameHelperText' | widgetTranslate: dataSourceKey | async\"\n [label]=\"'caseDefinitionName' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"caseDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"(caseDefinitionItems$ | async) || []\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (hasUnsupportedConditions$ | async) {\n <div class=\"form__element\">\n <cds-inline-notification\n [notificationObj]=\"unsupportedConditionsNotification$ | async\"\n ></cds-inline-notification>\n </div>\n }\n\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n\n <valtimo-task-count-condition-group\n [dataSourceKey]=\"dataSourceKey\"\n [disabled]=\"$disabled()\"\n [group]=\"conditionsForm\"\n [operatorItems]=\"(operatorItems$ | async) || []\"\n [root]=\"true\"\n ></valtimo-task-count-condition-group>\n</div>\n", styles: ["::ng-deep .task-count-configuration-form{margin-bottom:24px}::ng-deep .task-count-configuration-form .form__element{margin-bottom:16px}::ng-deep .task-count-configuration-form .conditions-label{display:flex;flex-direction:column;margin-bottom:16px}::ng-deep .task-count-configuration-form .conditions-label .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
4332
+ }], ctorParameters: () => [{ type: i2$2.DocumentService }, { type: i3$1.TranslateService }, { type: WidgetTranslationService }], propDecorators: { dataSourceKey: [{
3950
4333
  type: Input
3951
4334
  }], disabled: [{
3952
4335
  type: Input
@@ -3989,7 +4372,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
3989
4372
  */
3990
4373
 
3991
4374
  /*
3992
- * Copyright 2015-2025 Ritense BV, the Netherlands.
4375
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
3993
4376
  *
3994
4377
  * Licensed under EUPL, Version 1.2 (the "License");
3995
4378
  * you may not use this file except in compliance with the License.
@@ -4041,30 +4424,54 @@ const taskCountSpecification = {
4041
4424
  translations: {
4042
4425
  de: {
4043
4426
  title: 'Aufgabenanzahl',
4044
- path: 'Pfad',
4427
+ path: 'Pfad (erforderlich)',
4045
4428
  operator: 'Operator',
4046
4429
  value: 'Wert',
4047
- conditions: 'Bedingungen',
4048
- conditionsHelperText: `Geben Sie optionale Bedingungen zum Abrufen der Anzahl der Aufgaben. ${CONDITIONS_HELPER_TEXTS.DE('task:assignee')}`,
4430
+ caseDefinitionName: 'Falltyp',
4431
+ caseDefinitionNameHelperText: 'Optional. Zählt nur Aufgaben, die zu diesem Falltyp gehören.',
4432
+ allCaseDefinitions: 'Alle Falltypen',
4433
+ conditions: 'Bedingungen (optional)',
4434
+ conditionsHelperText: `Geben Sie optionale Bedingungen zum Abrufen der Anzahl der Aufgaben. ${CONDITIONS_HELPER_TEXTS.DE('task:assignee')} Bedingungen innerhalb einer Gruppe werden mit dem Operator der Gruppe verknüpft.`,
4049
4435
  addCondition: 'Bedingung hinzufügen',
4436
+ and: 'UND',
4437
+ or: 'ODER',
4438
+ addGroup: 'Bedingungsgruppe hinzufügen',
4439
+ deleteGroup: 'Bedingungsgruppe löschen',
4440
+ unsupportedConditionsNotification: 'Dieses Widget enthält Bedingungen, die nur über Konfigurationsdateien bearbeitet werden können. Sie bleiben beim Speichern erhalten.',
4050
4441
  },
4051
4442
  en: {
4052
4443
  title: 'Task count',
4053
4444
  path: 'Path (required)',
4054
4445
  operator: 'Operator',
4055
4446
  value: 'Value',
4056
- conditions: 'Conditions',
4057
- conditionsHelperText: `Specify optional conditions for retrieving the number of tasks. ${CONDITIONS_HELPER_TEXTS.EN('task:assignee')}`,
4447
+ caseDefinitionName: 'Case type',
4448
+ caseDefinitionNameHelperText: 'Optional. Only counts tasks that belong to this case type.',
4449
+ allCaseDefinitions: 'All case types',
4450
+ conditions: 'Conditions (optional)',
4451
+ conditionsHelperText: `Specify optional conditions for retrieving the number of tasks. ${CONDITIONS_HELPER_TEXTS.EN('task:assignee')} Conditions within a group are combined using the operator of that group.`,
4058
4452
  addCondition: 'Add condition',
4453
+ and: 'AND',
4454
+ or: 'OR',
4455
+ addGroup: 'Add condition group',
4456
+ deleteGroup: 'Delete condition group',
4457
+ unsupportedConditionsNotification: 'This widget contains conditions that can only be edited through configuration files. They are preserved when you save.',
4059
4458
  },
4060
4459
  nl: {
4061
4460
  title: 'Aantal taken',
4062
- path: 'Pad',
4461
+ path: 'Pad (verplicht)',
4063
4462
  operator: 'Operator',
4064
4463
  value: 'Waarde',
4065
- conditions: 'Condities',
4066
- conditionsHelperText: `Geef optionele condities op voor het ophalen van het aantal taken. ${CONDITIONS_HELPER_TEXTS.NL('task:assignee')}}`,
4464
+ caseDefinitionName: 'Zaaktype',
4465
+ caseDefinitionNameHelperText: 'Optioneel. Telt alleen taken die bij dit zaaktype horen.',
4466
+ allCaseDefinitions: 'Alle zaaktypes',
4467
+ conditions: 'Condities (optioneel)',
4468
+ conditionsHelperText: `Geef optionele condities op voor het ophalen van het aantal taken. ${CONDITIONS_HELPER_TEXTS.NL('task:assignee')} Condities binnen een groep worden gecombineerd met de operator van die groep.`,
4067
4469
  addCondition: 'Conditie toevoegen',
4470
+ and: 'EN',
4471
+ or: 'OF',
4472
+ addGroup: 'Conditiegroep toevoegen',
4473
+ deleteGroup: 'Conditiegroep verwijderen',
4474
+ unsupportedConditionsNotification: 'Dit widget bevat condities die alleen via configuratiebestanden bewerkt kunnen worden. Ze blijven behouden bij het opslaan.',
4068
4475
  },
4069
4476
  },
4070
4477
  };
@@ -4091,13 +4498,27 @@ class TaskCountDataSourceModule {
4091
4498
  WidgetTranslatePipeModule,
4092
4499
  InputModule,
4093
4500
  DropdownModule,
4094
- CarbonMultiInputModule], exports: [TaskCountConfigurationComponent] }); }
4501
+ CarbonMultiInputModule,
4502
+ ButtonModule,
4503
+ ContentSwitcherModule,
4504
+ IconModule,
4505
+ LayerModule,
4506
+ NotificationModule,
4507
+ TilesModule,
4508
+ TaskCountConditionGroupComponent], exports: [TaskCountConditionGroupComponent, TaskCountConfigurationComponent] }); }
4095
4509
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TaskCountDataSourceModule, providers: [{ provide: DATA_SOURCE_TOKEN, useValue: taskCountSpecification, multi: true }], imports: [CommonModule,
4096
4510
  ReactiveFormsModule,
4097
4511
  WidgetTranslatePipeModule,
4098
4512
  InputModule,
4099
4513
  DropdownModule,
4100
- CarbonMultiInputModule] }); }
4514
+ CarbonMultiInputModule,
4515
+ ButtonModule,
4516
+ ContentSwitcherModule,
4517
+ IconModule,
4518
+ LayerModule,
4519
+ NotificationModule,
4520
+ TilesModule,
4521
+ TaskCountConditionGroupComponent] }); }
4101
4522
  }
4102
4523
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TaskCountDataSourceModule, decorators: [{
4103
4524
  type: NgModule,
@@ -4110,8 +4531,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
4110
4531
  InputModule,
4111
4532
  DropdownModule,
4112
4533
  CarbonMultiInputModule,
4534
+ ButtonModule,
4535
+ ContentSwitcherModule,
4536
+ IconModule,
4537
+ LayerModule,
4538
+ NotificationModule,
4539
+ TilesModule,
4540
+ TaskCountConditionGroupComponent,
4113
4541
  ],
4114
- exports: [TaskCountConfigurationComponent],
4542
+ exports: [TaskCountConditionGroupComponent, TaskCountConfigurationComponent],
4115
4543
  providers: [{ provide: DATA_SOURCE_TOKEN, useValue: taskCountSpecification, multi: true }],
4116
4544
  }]
4117
4545
  }] });
@@ -4356,5 +4784,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
4356
4784
  * Generated bundle index. Do not edit.
4357
4785
  */
4358
4786
 
4359
- export { BigNumberConfigurationComponent, BigNumberDisplayComponent, BigNumberModule, CaseCountConfigurationComponent, CaseCountDataSourceModule, CaseCountsConfigurationComponent, CaseCountsDataSourceModule, CaseGroupByConfigurationComponent, CaseGroupByDataSourceModule, DASHBOARD_TEST_IDS, DASHBOARD_WIDGET_TEST_ID_PREFIX, DATA_FEATURES, DATA_SOURCE_TOKEN, DISPLAY_TYPE_TOKEN, DashboardComponent, DashboardModule, DashboardService, DataSourcesModule, DisplayWidgetTypesModule, DonutConfigurationComponent, DonutDisplayComponent, DonutModule, GaugeConfigurationComponent, GaugeDisplayComponent, GaugeModule, HttpLoaderFactory, MeterConfigurationComponent, MeterDisplayComponent, MeterModule, TaskCountConfigurationComponent, TaskCountDataSourceModule, WIDGET_1X_HEIGHT, WIDGET_1X_MIN_WIDTH, WidgetDashboardComponent, WidgetDashboardContentComponent, WidgetService, WidgetSeverity, WidgetTranslatePipe, WidgetTranslatePipeModule, WidgetTranslationService, bigNumberSpecification, caseCountDataSourceSpecification, caseCountsDataSourceSpecification, caseGroupByDataSourceSpecification, donutSpecification, gaugeSpecification, meterSpecification, taskCountSpecification };
4787
+ export { BigNumberConfigurationComponent, BigNumberDisplayComponent, BigNumberModule, CaseCountConfigurationComponent, CaseCountDataSourceModule, CaseCountsConfigurationComponent, CaseCountsDataSourceModule, CaseGroupByConfigurationComponent, CaseGroupByDataSourceModule, DASHBOARD_TEST_IDS, DASHBOARD_WIDGET_TEST_ID_PREFIX, DATA_FEATURES, DATA_SOURCE_TOKEN, DISPLAY_TYPE_TOKEN, DashboardComponent, DashboardModule, DashboardService, DataSourcesModule, DisplayWidgetTypesModule, DonutConfigurationComponent, DonutDisplayComponent, DonutModule, GaugeConfigurationComponent, GaugeDisplayComponent, GaugeModule, HttpLoaderFactory, MeterConfigurationComponent, MeterDisplayComponent, MeterModule, TaskCountConditionGroupComponent, TaskCountConfigurationComponent, TaskCountDataSourceModule, WIDGET_1X_HEIGHT, WIDGET_1X_MIN_WIDTH, WidgetDashboardComponent, WidgetDashboardContentComponent, WidgetService, WidgetSeverity, WidgetTranslatePipe, WidgetTranslatePipeModule, WidgetTranslationService, bigNumberSpecification, caseCountDataSourceSpecification, caseCountsDataSourceSpecification, caseGroupByDataSourceSpecification, donutSpecification, gaugeSpecification, meterSpecification, taskCountSpecification };
4360
4788
  //# sourceMappingURL=valtimo-dashboard.mjs.map