@alfresco/adf-process-services-cloud 9.2.0-38736972803 → 9.2.0-38778559181

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.
@@ -3,7 +3,7 @@ import { inject, Injectable, InjectionToken, EventEmitter, DestroyRef, Output, I
3
3
  import * as i3 from '@alfresco/adf-core';
4
4
  import { AppConfigService, JwtHelperService, OAuth2Service, TranslationService, DataTableSchema, UserPreferencesService, UserPreferenceValues, CustomEmptyContentTemplateDirective, ObjectDataTableAdapter, ColumnsSelectorComponent, MainMenuDataTableTemplateDirective, EmptyContentComponent, NoContentTemplateDirective, LoadingContentTemplateDirective, DataTableComponent, AdfDateFnsAdapter, MOMENT_DATE_FORMATS, AuthenticationService, StorageService, IconModule, DateFnsUtils, ADF_DATE_FORMATS, FullNamePipe, InitialUsernamePipe, FormFieldTypes, FormService, FormModel, ROW_ID_PREFIX, FormBaseComponent, ADF_DISPLAY_TEXT_SETTINGS, WidgetVisibilityService, FormExpressionService, UploadWidgetContentLinkModel, FormEvent, FormOutcomeModel, ConfirmDialogComponent, FormRulesEvent, FormOutcomeEvent, FormRendererComponent, ToolbarDividerComponent, ToolbarComponent, FormatSpacePipe, NotificationService, DownloadService, WidgetComponent, ThumbnailService, ErrorWidgetComponent, LocalizedDatePipe, UploadDirective, ContentLinkModel, getDynamicDateFieldRange, getDateFieldRange, isEmptyFieldValue, getValidationSummaryTranslationParameters, DEFAULT_DATE_FORMAT, FormFieldValueFormatterService, ADF_TYPED_VALUE_FORMATTING_ENABLED, FormFieldEvent, SelectFilterInputComponent, FormRenderingService, DynamicComponentMapper, CardViewUpdateService, ClipboardService, CardViewTextItemModel, CardViewSelectItemModel, CardViewDatetimeItemModel, CardViewDateItemModel, CardViewArrayItemModel, CardViewComponent, CustomLoadingContentTemplateDirective, isOutcomeButtonVisible, FormOutcomeNotFoundError, InplaceFormInputComponent, BaseViewerWidgetComponent, ErrorMessageModel, BaseDisplayTextWidgetComponent, ObjectDataColumn, ObjectDataRow, FormBaseModule, provideTranslations } from '@alfresco/adf-core';
5
5
  import { from, EMPTY, isObservable, of, Subject, throwError, BehaviorSubject, combineLatest, defer, merge, asapScheduler, firstValueFrom, forkJoin, catchError as catchError$1 } from 'rxjs';
6
- import { map, take, switchMap, catchError, distinctUntilChanged, filter, tap, finalize, debounceTime, shareReplay, mergeMap, expand, reduce, mapTo, concatMap } from 'rxjs/operators';
6
+ import { map, take, switchMap, catchError, distinctUntilChanged, filter, tap, finalize, debounceTime, shareReplay, scan, mergeMap, expand, reduce, mapTo, concatMap } from 'rxjs/operators';
7
7
  import { AlfrescoApiService, NodeAction, ContentNodeSelectorComponent, NodesApiService, ContentService, ContentNodeSelectorPanelService, NewVersionUploaderService, NewVersionUploaderDataAction, ContentMetadataComponent, AlfrescoViewerComponent } from '@alfresco/adf-content-services';
8
8
  import { AdfHttpClient } from '@alfresco/adf-core/api';
9
9
  import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
@@ -4193,6 +4193,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
4193
4193
  args: [{ providedIn: 'root' }]
4194
4194
  }] });
4195
4195
 
4196
+ /*!
4197
+ * @license
4198
+ * Copyright © 2005-2026 Hyland Software, Inc. and its affiliates. All rights reserved.
4199
+ *
4200
+ * Licensed under the Apache License, Version 2.0 (the "License");
4201
+ * you may not use this file except in compliance with the License.
4202
+ * You may obtain a copy of the License at
4203
+ *
4204
+ * http://www.apache.org/licenses/LICENSE-2.0
4205
+ *
4206
+ * Unless required by applicable law or agreed to in writing, software
4207
+ * distributed under the License is distributed on an "AS IS" BASIS,
4208
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4209
+ * See the License for the specific language governing permissions and
4210
+ * limitations under the License.
4211
+ */
4212
+
4196
4213
  /*!
4197
4214
  * @license
4198
4215
  * Copyright © 2005-2026 Hyland Software, Inc. and its affiliates. All rights reserved.
@@ -4376,6 +4393,259 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
4376
4393
  * limitations under the License.
4377
4394
  */
4378
4395
 
4396
+ /*!
4397
+ * @license
4398
+ * Copyright © 2005-2026 Hyland Software, Inc. and its affiliates. All rights reserved.
4399
+ *
4400
+ * Licensed under the Apache License, Version 2.0 (the "License");
4401
+ * you may not use this file except in compliance with the License.
4402
+ * You may obtain a copy of the License at
4403
+ *
4404
+ * http://www.apache.org/licenses/LICENSE-2.0
4405
+ *
4406
+ * Unless required by applicable law or agreed to in writing, software
4407
+ * distributed under the License is distributed on an "AS IS" BASIS,
4408
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4409
+ * See the License for the specific language governing permissions and
4410
+ * limitations under the License.
4411
+ */
4412
+ const PUSHED_COUNTER_SUBSCRIPTIONS_BY_ENTITY_TYPE = {
4413
+ [FilterCounterEntityType.TASK]: [
4414
+ {
4415
+ filterKey: 'my-tasks',
4416
+ graphQlFieldName: 'assignedTasks',
4417
+ subscriptionQuery: `
4418
+ subscription {
4419
+ assignedTasks {
4420
+ count
4421
+ asOf
4422
+ }
4423
+ }
4424
+ `
4425
+ },
4426
+ {
4427
+ filterKey: 'queued-tasks',
4428
+ graphQlFieldName: 'queuedTasks',
4429
+ subscriptionQuery: `
4430
+ subscription {
4431
+ queuedTasks {
4432
+ count
4433
+ asOf
4434
+ }
4435
+ }
4436
+ `
4437
+ }
4438
+ ],
4439
+ [FilterCounterEntityType.PROCESS_INSTANCE]: [
4440
+ {
4441
+ filterKey: 'running-processes',
4442
+ graphQlFieldName: 'runningProcesses',
4443
+ subscriptionQuery: `
4444
+ subscription {
4445
+ runningProcesses {
4446
+ count
4447
+ asOf
4448
+ }
4449
+ }
4450
+ `
4451
+ }
4452
+ ]
4453
+ };
4454
+ class QueryPushedFilterCountersCloudService extends BaseCloudService {
4455
+ constructor() {
4456
+ super(...arguments);
4457
+ this.notificationCloudService = inject(NotificationCloudService);
4458
+ this.taskListCloudService = inject(TaskListCloudService);
4459
+ this.processListCloudService = inject(ProcessListCloudService);
4460
+ this.injector = inject(Injector);
4461
+ this.taskFiltersPerApp = new Map();
4462
+ this.processFiltersPerApp = new Map();
4463
+ this.recountTriggerPerApp = new Map();
4464
+ this.entityTypeCountersPerApp = new Map();
4465
+ this.activeEntityTypesPerApp = new Map();
4466
+ this.activeSubscriberCountPerEntityType = new Map();
4467
+ this.initialCountersPerApp = new Map();
4468
+ this.applyCounterUpdate = (entries, event) => {
4469
+ if (event.source === 'initialFetch') {
4470
+ const mergedEntries = { ...entries };
4471
+ Object.entries(event.counters).forEach(([filterKey, count]) => {
4472
+ if (mergedEntries[filterKey]?.source === 'webSocketPush') {
4473
+ return;
4474
+ }
4475
+ mergedEntries[filterKey] = { count, source: 'initialFetch' };
4476
+ });
4477
+ return mergedEntries;
4478
+ }
4479
+ const existingEntry = entries[event.filterKey];
4480
+ const isOutOfOrderPush = existingEntry?.source === 'webSocketPush' &&
4481
+ existingEntry.asOf !== undefined &&
4482
+ event.asOf !== undefined &&
4483
+ event.asOf < existingEntry.asOf;
4484
+ if (isOutOfOrderPush) {
4485
+ return entries;
4486
+ }
4487
+ return { ...entries, [event.filterKey]: { count: event.count, asOf: event.asOf, source: 'webSocketPush' } };
4488
+ };
4489
+ }
4490
+ getTaskFilters(appName) {
4491
+ return this.shareFilters(this.taskFiltersPerApp, appName, () => this.injector.get(TaskFilterCloudService).getTaskListFilters(appName));
4492
+ }
4493
+ getProcessFilters(appName) {
4494
+ return this.shareFilters(this.processFiltersPerApp, appName, () => this.injector.get(ProcessFilterCloudService).getProcessFilters(appName));
4495
+ }
4496
+ getFilterCounters(appName, entityType) {
4497
+ if (!appName) {
4498
+ return EMPTY;
4499
+ }
4500
+ return defer(() => {
4501
+ this.activateEntityType(appName, entityType);
4502
+ return this.watchEntityTypeCounters(appName, entityType);
4503
+ }).pipe(map((counters) => ({ counters })), finalize(() => this.deactivateEntityType(appName, entityType)));
4504
+ }
4505
+ refreshFilterCounters(appName) {
4506
+ this.recountTrigger(appName).next();
4507
+ }
4508
+ getEngineEvents(_appName, _entityType) {
4509
+ return EMPTY;
4510
+ }
4511
+ watchEntityTypeCounters(appName, entityType) {
4512
+ const key = this.entityTypeKey(appName, entityType);
4513
+ let entityTypeCounters$ = this.entityTypeCountersPerApp.get(key);
4514
+ if (!entityTypeCounters$) {
4515
+ const initialCountersEvents$ = this.initialCounters(appName).pipe(map((counters) => ({
4516
+ source: 'initialFetch',
4517
+ counters: counters[entityType] ?? {}
4518
+ })));
4519
+ const pushedCounterEvents$ = this.pushedCounterUpdates(appName, entityType).pipe(map(({ filterKey, count, asOf }) => ({
4520
+ source: 'webSocketPush',
4521
+ filterKey,
4522
+ count,
4523
+ asOf
4524
+ })));
4525
+ entityTypeCounters$ = merge(initialCountersEvents$, pushedCounterEvents$).pipe(scan(this.applyCounterUpdate, {}), map((entries) => this.toEntityTypeCounters(entries)), shareReplay({ bufferSize: 1, refCount: true }));
4526
+ this.entityTypeCountersPerApp.set(key, entityTypeCounters$);
4527
+ }
4528
+ return entityTypeCounters$;
4529
+ }
4530
+ activateEntityType(appName, entityType) {
4531
+ const key = this.entityTypeKey(appName, entityType);
4532
+ const activeSubscriberCount = (this.activeSubscriberCountPerEntityType.get(key) ?? 0) + 1;
4533
+ this.activeSubscriberCountPerEntityType.set(key, activeSubscriberCount);
4534
+ if (activeSubscriberCount > 1) {
4535
+ return;
4536
+ }
4537
+ const activeEntityTypes = this.activeEntityTypes(appName);
4538
+ const joinsAlreadyActiveEntityTypes = activeEntityTypes.size > 0;
4539
+ activeEntityTypes.add(entityType);
4540
+ if (joinsAlreadyActiveEntityTypes) {
4541
+ this.refreshFilterCounters(appName);
4542
+ }
4543
+ }
4544
+ deactivateEntityType(appName, entityType) {
4545
+ const key = this.entityTypeKey(appName, entityType);
4546
+ const activeSubscriberCount = (this.activeSubscriberCountPerEntityType.get(key) ?? 1) - 1;
4547
+ if (activeSubscriberCount > 0) {
4548
+ this.activeSubscriberCountPerEntityType.set(key, activeSubscriberCount);
4549
+ return;
4550
+ }
4551
+ this.activeSubscriberCountPerEntityType.delete(key);
4552
+ this.activeEntityTypes(appName).delete(entityType);
4553
+ }
4554
+ activeEntityTypes(appName) {
4555
+ let activeEntityTypes = this.activeEntityTypesPerApp.get(appName);
4556
+ if (!activeEntityTypes) {
4557
+ activeEntityTypes = new Set();
4558
+ this.activeEntityTypesPerApp.set(appName, activeEntityTypes);
4559
+ }
4560
+ return activeEntityTypes;
4561
+ }
4562
+ initialCounters(appName) {
4563
+ let initialCounters$ = this.initialCountersPerApp.get(appName);
4564
+ if (!initialCounters$) {
4565
+ initialCounters$ = merge(of(undefined), this.recountTrigger(appName)).pipe(debounceTime(0), switchMap(() => this.fetchActiveEntityTypesCounters(appName)), shareReplay({ bufferSize: 1, refCount: true }));
4566
+ this.initialCountersPerApp.set(appName, initialCounters$);
4567
+ }
4568
+ return initialCounters$;
4569
+ }
4570
+ pushedCounterUpdates(appName, entityType) {
4571
+ return merge(...PUSHED_COUNTER_SUBSCRIPTIONS_BY_ENTITY_TYPE[entityType].map((subscription) => this.pushedCounterUpdate(appName, subscription)));
4572
+ }
4573
+ pushedCounterUpdate(appName, subscription) {
4574
+ return defer(() => this.notificationCloudService.makeGQLQuery(appName, subscription.subscriptionQuery)).pipe(map((result) => result.data?.[subscription.graphQlFieldName]), filter((value) => value?.count !== undefined), map((value) => ({ filterKey: subscription.filterKey, count: value.count, asOf: value.asOf })), catchError(() => EMPTY));
4575
+ }
4576
+ toEntityTypeCounters(entries) {
4577
+ return Object.fromEntries(Object.entries(entries).map(([filterKey, entry]) => [filterKey, entry.count]));
4578
+ }
4579
+ fetchActiveEntityTypesCounters(appName) {
4580
+ const activeEntityTypes = this.activeEntityTypes(appName);
4581
+ return combineLatest({
4582
+ [FilterCounterEntityType.TASK]: activeEntityTypes.has(FilterCounterEntityType.TASK)
4583
+ ? this.getTaskFilters(appName).pipe(catchError(() => of([])))
4584
+ : of([]),
4585
+ [FilterCounterEntityType.PROCESS_INSTANCE]: activeEntityTypes.has(FilterCounterEntityType.PROCESS_INSTANCE)
4586
+ ? this.getProcessFilters(appName).pipe(catchError(() => of([])))
4587
+ : of([])
4588
+ }).pipe(take(1), switchMap((filters) => this.fetchFilterCounters(appName, this.buildRequest(filters))), catchError(() => EMPTY));
4589
+ }
4590
+ buildRequest(filters) {
4591
+ const request = {};
4592
+ const taskQueries = this.buildQueries(filters[FilterCounterEntityType.TASK], (taskFilter) => this.taskListCloudService.buildQueryData(new TaskFilterCloudAdapter(taskFilter)));
4593
+ if (taskQueries.length) {
4594
+ request[FilterCounterEntityType.TASK] = taskQueries;
4595
+ }
4596
+ const processQueries = this.buildQueries(filters[FilterCounterEntityType.PROCESS_INSTANCE], (processFilter) => this.processListCloudService.buildQueryData(new ProcessFilterCloudAdapter(processFilter)));
4597
+ if (processQueries.length) {
4598
+ request[FilterCounterEntityType.PROCESS_INSTANCE] = processQueries;
4599
+ }
4600
+ return request;
4601
+ }
4602
+ buildQueries(filters, buildQuery) {
4603
+ return (filters ?? [])
4604
+ .filter((candidate) => candidate?.showCounter && !!candidate?.key)
4605
+ .map((candidate) => {
4606
+ try {
4607
+ return { ...buildQuery(candidate), requestId: candidate.key };
4608
+ }
4609
+ catch {
4610
+ return undefined;
4611
+ }
4612
+ })
4613
+ .filter((query) => !!query);
4614
+ }
4615
+ fetchFilterCounters(appName, request) {
4616
+ if (!Object.keys(request).length) {
4617
+ return of({});
4618
+ }
4619
+ const queryUrl = `${this.getBasePath(appName)}/query/v1/count`;
4620
+ return this.post(queryUrl, request).pipe(map((counters) => counters || {}));
4621
+ }
4622
+ shareFilters(cache, appName, loadFilters) {
4623
+ let filters$ = cache.get(appName);
4624
+ if (!filters$) {
4625
+ filters$ = defer(loadFilters).pipe(shareReplay({ bufferSize: 1, refCount: true }));
4626
+ cache.set(appName, filters$);
4627
+ }
4628
+ return filters$;
4629
+ }
4630
+ recountTrigger(appName) {
4631
+ let recountTrigger$ = this.recountTriggerPerApp.get(appName);
4632
+ if (!recountTrigger$) {
4633
+ recountTrigger$ = new Subject();
4634
+ this.recountTriggerPerApp.set(appName, recountTrigger$);
4635
+ }
4636
+ return recountTrigger$;
4637
+ }
4638
+ entityTypeKey(appName, entityType) {
4639
+ return `${appName}|${entityType}`;
4640
+ }
4641
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: QueryPushedFilterCountersCloudService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4642
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: QueryPushedFilterCountersCloudService, providedIn: 'root' }); }
4643
+ }
4644
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: QueryPushedFilterCountersCloudService, decorators: [{
4645
+ type: Injectable,
4646
+ args: [{ providedIn: 'root' }]
4647
+ }] });
4648
+
4379
4649
  /*!
4380
4650
  * @license
4381
4651
  * Copyright © 2005-2026 Hyland Software, Inc. and its affiliates. All rights reserved.
@@ -4718,6 +4988,13 @@ class TaskFiltersCloudComponent extends BaseTaskFiltersCloudComponent {
4718
4988
  *
4719
4989
  */
4720
4990
  this.searchApiMethod = 'GET';
4991
+ /**
4992
+ * (optional) Resolves the initial counters of the filters with a single call to
4993
+ * `POST /query/v1/count`, then keeps the counters of the `my-tasks` and `queued-tasks`
4994
+ * filters in sync with the counts pushed by the engine over the web socket, without any
4995
+ * further call to the count endpoint. Both filter components have to use the same value.
4996
+ */
4997
+ this.queryPushedCounter = false;
4721
4998
  /** Emitted when a filter is being selected based on the filterParam input. */
4722
4999
  this.filterSelected = new EventEmitter();
4723
5000
  /** Emitted when a filter is being clicked from the UI. */
@@ -4733,11 +5010,15 @@ class TaskFiltersCloudComponent extends BaseTaskFiltersCloudComponent {
4733
5010
  this.taskFilterCloudService = inject(TaskFilterCloudService);
4734
5011
  this.taskListCloudService = inject(TaskListCloudService);
4735
5012
  this.filterCountersCloudService = inject(FilterCountersCloudService);
5013
+ this.queryPushedFilterCountersCloudService = inject(QueryPushedFilterCountersCloudService);
4736
5014
  this.translationService = inject(TranslationService);
4737
5015
  this.appConfigService = inject(AppConfigService);
4738
5016
  this.activatedRoute = inject(ActivatedRoute);
4739
5017
  this.currentRouteFilterId = toSignal(this.activatedRoute.queryParamMap.pipe(map((params) => params.get('filterId'))));
4740
5018
  }
5019
+ get filterCountersService() {
5020
+ return this.queryPushedCounter ? this.queryPushedFilterCountersCloudService : this.filterCountersCloudService;
5021
+ }
4741
5022
  ngOnInit() {
4742
5023
  this.enableNotifications = this.appConfigService.get('notifications', true);
4743
5024
  this.notificationDebounceTime = this.appConfigService.get('notificationDebounceTime', 3000);
@@ -4756,6 +5037,10 @@ class TaskFiltersCloudComponent extends BaseTaskFiltersCloudComponent {
4756
5037
  else if (filter && filter.currentValue !== filter.previousValue) {
4757
5038
  this.selectFilterAndEmit(filter.currentValue);
4758
5039
  }
5040
+ else if (changes['queryPushedCounter'] && !changes['queryPushedCounter'].firstChange && this.filtersLoadedFor) {
5041
+ this.initFilterCounterNotifications();
5042
+ this.loadFilterCounters(this.filtersLoadedFor);
5043
+ }
4759
5044
  }
4760
5045
  /**
4761
5046
  * Loads the filter list filtered by appName
@@ -4764,7 +5049,7 @@ class TaskFiltersCloudComponent extends BaseTaskFiltersCloudComponent {
4764
5049
  */
4765
5050
  getFilters(appName) {
4766
5051
  this.filtersLoadedFor = appName;
4767
- const filters$ = this.filterCountersCloudService.getTaskFilters(appName);
5052
+ const filters$ = this.filterCountersService.getTaskFilters(appName);
4768
5053
  this.filters$ = filters$.pipe(catchError(() => of([])));
4769
5054
  filters$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
4770
5055
  next: (res) => {
@@ -4816,8 +5101,9 @@ class TaskFiltersCloudComponent extends BaseTaskFiltersCloudComponent {
4816
5101
  if (!this.appName) {
4817
5102
  return;
4818
5103
  }
5104
+ this.notificationsSubscription?.unsubscribe();
4819
5105
  if (this.enableNotifications) {
4820
- this.filterCountersCloudService
5106
+ this.notificationsSubscription = this.filterCountersService
4821
5107
  .getEngineEvents(this.appName, FilterCounterEntityType.TASK)
4822
5108
  .pipe(takeUntilDestroyed(this.destroyRef))
4823
5109
  .subscribe((events) => {
@@ -4920,7 +5206,7 @@ class TaskFiltersCloudComponent extends BaseTaskFiltersCloudComponent {
4920
5206
  this.countersSubscription?.unsubscribe();
4921
5207
  this.countersSubscription = combineLatest([
4922
5208
  this.countersFilters$.pipe(catchError(() => of([]))),
4923
- this.filterCountersCloudService.getFilterCounters(appName, FilterCounterEntityType.TASK)
5209
+ this.filterCountersService.getFilterCounters(appName, FilterCounterEntityType.TASK)
4924
5210
  ])
4925
5211
  .pipe(takeUntilDestroyed(this.destroyRef))
4926
5212
  .subscribe(([, { counters }]) => {
@@ -4955,16 +5241,18 @@ class TaskFiltersCloudComponent extends BaseTaskFiltersCloudComponent {
4955
5241
  this.currentFilter = undefined;
4956
5242
  }
4957
5243
  refreshFilterCounter() {
4958
- this.filterCountersCloudService.refreshFilterCounters(this.appName);
5244
+ this.filterCountersService.refreshFilterCounters(this.appName);
4959
5245
  }
4960
5246
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: TaskFiltersCloudComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4961
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: TaskFiltersCloudComponent, isStandalone: true, selector: "adf-cloud-task-filters", inputs: { searchApiMethod: "searchApiMethod" }, outputs: { filterSelected: "filterSelected", filterClicked: "filterClicked", filterCounterUpdated: "filterCounterUpdated", updatedFilter: "updatedFilter" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (filters$ | async; as filterList) {\n <mat-nav-list>\n @for (filter of filterList; track filter.id) {\n <a mat-list-item\n [activated]=\"filter.id === currentRouteFilterId()\"\n [routerLink]=\"[TASKS_ROUTE]\"\n [queryParams]=\"{ filterId: filter.id }\"\n [attr.data-automation-id]=\"filter.key + '_filter'\"\n class=\"adf-task-filters__entry\"\n [class.adf-active]=\"filter.id === currentRouteFilterId()\"\n [attr.aria-current]=\"filter.id === currentRouteFilterId() ? 'page' : null\"\n [id]=\"filter.id\"\n [title]=\"filter.name | translate\"\n [attr.aria-label]=\"filter.name | translate\"\n (click)=\"onFilterClick(filter)\">\n <span matListItemTitle>\n {{ filter.name | translate }}\n </span>\n @if (showIcons) {\n <mat-icon matListItemIcon\n data-automation-id=\"adf-filter-icon\"\n [adf-icon]=\"filter.icon\"\n aria-hidden=\"true\" />\n }\n @if (counters[filter.key]) {\n <span matListItemMeta\n [attr.data-automation-id]=\"filter.key + '_filter-counter'\"\n class=\"adf-task-filters__entry-counter\"\n [class.adf-active]=\"wasFilterUpdated(filter.key)\"\n >\n {{ counters[filter.key] }}\n </span>\n }\n </a>\n }\n </mat-nav-list>\n} @else {\n <div class=\"adf-app-list-spinner\">\n <mat-spinner [attr.aria-label]=\"'ADF_CLOUD_TASK_LIST.LOADING' | translate\" aria-live=\"polite\" />\n </div>\n}\n", styles: [".adf-task-filters__entry-counter{padding:0 5px;border-radius:var(--mat-sys-corner-large)}.adf-task-filters__entry-counter.adf-active{background-color:var(--mat-sys-secondary);--mat-list-list-item-trailing-supporting-text-color: var(--mat-sys-on-secondary)}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i2$1.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i2$1.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i2$1.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i2$1.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i2$1.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: IconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.IconDirective, selector: "mat-icon[adf-icon]", inputs: ["adf-icon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
5247
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: TaskFiltersCloudComponent, isStandalone: true, selector: "adf-cloud-task-filters", inputs: { searchApiMethod: "searchApiMethod", queryPushedCounter: "queryPushedCounter" }, outputs: { filterSelected: "filterSelected", filterClicked: "filterClicked", filterCounterUpdated: "filterCounterUpdated", updatedFilter: "updatedFilter" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (filters$ | async; as filterList) {\n <mat-nav-list>\n @for (filter of filterList; track filter.id) {\n <a mat-list-item\n [activated]=\"filter.id === currentRouteFilterId()\"\n [routerLink]=\"[TASKS_ROUTE]\"\n [queryParams]=\"{ filterId: filter.id }\"\n [attr.data-automation-id]=\"filter.key + '_filter'\"\n class=\"adf-task-filters__entry\"\n [class.adf-active]=\"filter.id === currentRouteFilterId()\"\n [attr.aria-current]=\"filter.id === currentRouteFilterId() ? 'page' : null\"\n [id]=\"filter.id\"\n [title]=\"filter.name | translate\"\n [attr.aria-label]=\"filter.name | translate\"\n (click)=\"onFilterClick(filter)\">\n <span matListItemTitle>\n {{ filter.name | translate }}\n </span>\n @if (showIcons) {\n <mat-icon matListItemIcon\n data-automation-id=\"adf-filter-icon\"\n [adf-icon]=\"filter.icon\"\n aria-hidden=\"true\" />\n }\n @if (counters[filter.key]) {\n <span matListItemMeta\n [attr.data-automation-id]=\"filter.key + '_filter-counter'\"\n class=\"adf-task-filters__entry-counter\"\n [class.adf-active]=\"wasFilterUpdated(filter.key)\"\n >\n {{ counters[filter.key] }}\n </span>\n }\n </a>\n }\n </mat-nav-list>\n} @else {\n <div class=\"adf-app-list-spinner\">\n <mat-spinner [attr.aria-label]=\"'ADF_CLOUD_TASK_LIST.LOADING' | translate\" aria-live=\"polite\" />\n </div>\n}\n", styles: [".adf-task-filters__entry-counter{padding:0 5px;border-radius:var(--mat-sys-corner-large)}.adf-task-filters__entry-counter.adf-active{background-color:var(--mat-sys-secondary);--mat-list-list-item-trailing-supporting-text-color: var(--mat-sys-on-secondary)}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i2$1.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i2$1.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i2$1.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i2$1.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i2$1.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: IconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.IconDirective, selector: "mat-icon[adf-icon]", inputs: ["adf-icon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
4962
5248
  }
4963
5249
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: TaskFiltersCloudComponent, decorators: [{
4964
5250
  type: Component,
4965
5251
  args: [{ selector: 'adf-cloud-task-filters', imports: [AsyncPipe, MatProgressSpinnerModule, TranslatePipe, MatListModule, RouterLink, IconModule], template: "@if (filters$ | async; as filterList) {\n <mat-nav-list>\n @for (filter of filterList; track filter.id) {\n <a mat-list-item\n [activated]=\"filter.id === currentRouteFilterId()\"\n [routerLink]=\"[TASKS_ROUTE]\"\n [queryParams]=\"{ filterId: filter.id }\"\n [attr.data-automation-id]=\"filter.key + '_filter'\"\n class=\"adf-task-filters__entry\"\n [class.adf-active]=\"filter.id === currentRouteFilterId()\"\n [attr.aria-current]=\"filter.id === currentRouteFilterId() ? 'page' : null\"\n [id]=\"filter.id\"\n [title]=\"filter.name | translate\"\n [attr.aria-label]=\"filter.name | translate\"\n (click)=\"onFilterClick(filter)\">\n <span matListItemTitle>\n {{ filter.name | translate }}\n </span>\n @if (showIcons) {\n <mat-icon matListItemIcon\n data-automation-id=\"adf-filter-icon\"\n [adf-icon]=\"filter.icon\"\n aria-hidden=\"true\" />\n }\n @if (counters[filter.key]) {\n <span matListItemMeta\n [attr.data-automation-id]=\"filter.key + '_filter-counter'\"\n class=\"adf-task-filters__entry-counter\"\n [class.adf-active]=\"wasFilterUpdated(filter.key)\"\n >\n {{ counters[filter.key] }}\n </span>\n }\n </a>\n }\n </mat-nav-list>\n} @else {\n <div class=\"adf-app-list-spinner\">\n <mat-spinner [attr.aria-label]=\"'ADF_CLOUD_TASK_LIST.LOADING' | translate\" aria-live=\"polite\" />\n </div>\n}\n", styles: [".adf-task-filters__entry-counter{padding:0 5px;border-radius:var(--mat-sys-corner-large)}.adf-task-filters__entry-counter.adf-active{background-color:var(--mat-sys-secondary);--mat-list-list-item-trailing-supporting-text-color: var(--mat-sys-on-secondary)}\n"] }]
4966
5252
  }], propDecorators: { searchApiMethod: [{
4967
5253
  type: Input
5254
+ }], queryPushedCounter: [{
5255
+ type: Input
4968
5256
  }], filterSelected: [{
4969
5257
  type: Output
4970
5258
  }], filterClicked: [{
@@ -7774,7 +8062,7 @@ const isDropdownCloudValidValue = (value, options) => !!value && isDropdownCloud
7774
8062
  const isDropdownCloudRestField = (field) => field?.optionType === 'rest' && !!field?.restUrl;
7775
8063
  const isDropdownCloudLinkedField = (field) => !!field?.rule?.ruleOn;
7776
8064
  const getOptionsFromPath = (data, path, id, label) => {
7777
- const properties = path.split('.');
8065
+ const properties = path.split('.').map((property) => property.trim());
7778
8066
  const currentProperty = properties.shift();
7779
8067
  if (data === null || typeof data !== 'object' || !Object.hasOwn(data, currentProperty)) {
7780
8068
  return { options: [], errors: [`${currentProperty} not found in ${JSON.stringify(data)}`] };
@@ -7792,7 +8080,11 @@ const resolveDropdownCloudVariableOptions = (field, variableConfig = field?.vari
7792
8080
  if (data == null) {
7793
8081
  return null;
7794
8082
  }
7795
- return getOptionsFromPath(data, variableConfig?.optionsPath ?? DEFAULT_VARIABLE_OPTION_PATH, variableConfig?.optionsId ?? DEFAULT_VARIABLE_OPTION_ID, variableConfig?.optionsLabel ?? DEFAULT_VARIABLE_OPTION_LABEL);
8083
+ const optionsPath = variableConfig?.optionsPath ?? DEFAULT_VARIABLE_OPTION_PATH;
8084
+ if (!optionsPath.trim()) {
8085
+ return { options: [], errors: ['Options path is empty'] };
8086
+ }
8087
+ return getOptionsFromPath(data, optionsPath, variableConfig?.optionsId ?? DEFAULT_VARIABLE_OPTION_ID, variableConfig?.optionsLabel ?? DEFAULT_VARIABLE_OPTION_LABEL);
7796
8088
  };
7797
8089
 
7798
8090
  /*!
@@ -11990,6 +12282,13 @@ class ProcessFiltersCloudComponent {
11990
12282
  *
11991
12283
  */
11992
12284
  this.searchApiMethod = 'GET';
12285
+ /**
12286
+ * (optional) Resolves the initial counters of the filters with a single call to
12287
+ * `POST /query/v1/count`, then keeps the counter of the `running-processes` filter in sync
12288
+ * with the counts pushed by the engine over the web socket, without any further call to the
12289
+ * count endpoint. Both filter components have to use the same value.
12290
+ */
12291
+ this.queryPushedCounter = false;
11993
12292
  /** (optional) Toggles showing an icon by the side of each filter */
11994
12293
  this.showIcons = false;
11995
12294
  /** Emitted when a filter is being selected based on the filterParam input. */
@@ -12014,9 +12313,13 @@ class ProcessFiltersCloudComponent {
12014
12313
  this.appConfigService = inject(AppConfigService);
12015
12314
  this.processListCloudService = inject(ProcessListCloudService);
12016
12315
  this.filterCountersCloudService = inject(FilterCountersCloudService);
12316
+ this.queryPushedFilterCountersCloudService = inject(QueryPushedFilterCountersCloudService);
12017
12317
  this.activatedRoute = inject(ActivatedRoute);
12018
12318
  this.currentRouteFilterId = toSignal(this.activatedRoute.queryParamMap.pipe(map((params) => params.get('filterId'))));
12019
12319
  }
12320
+ get filterCountersService() {
12321
+ return this.queryPushedCounter ? this.queryPushedFilterCountersCloudService : this.filterCountersCloudService;
12322
+ }
12020
12323
  ngOnInit() {
12021
12324
  this.enableNotifications = this.appConfigService.get('notifications', true);
12022
12325
  this.notificationDebounceTime = this.appConfigService.get('notificationDebounceTime', 3000);
@@ -12034,6 +12337,9 @@ class ProcessFiltersCloudComponent {
12034
12337
  else if (filter && filter.currentValue !== filter.previousValue) {
12035
12338
  this.selectFilterAndEmit(filter.currentValue);
12036
12339
  }
12340
+ else if (changes['queryPushedCounter'] && !changes['queryPushedCounter'].firstChange && this.filtersLoadedFor) {
12341
+ this.loadFilterCounters(this.filtersLoadedFor);
12342
+ }
12037
12343
  }
12038
12344
  /**
12039
12345
  * Fetch the filter list based on appName
@@ -12042,7 +12348,7 @@ class ProcessFiltersCloudComponent {
12042
12348
  */
12043
12349
  getFilters(appName) {
12044
12350
  this.filtersLoadedFor = appName;
12045
- const filters$ = this.filterCountersCloudService.getProcessFilters(appName);
12351
+ const filters$ = this.filterCountersService.getProcessFilters(appName);
12046
12352
  this.filters$ = filters$.pipe(catchError(() => of([])));
12047
12353
  filters$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
12048
12354
  next: (res) => {
@@ -12226,7 +12532,7 @@ class ProcessFiltersCloudComponent {
12226
12532
  this.countersSubscription?.unsubscribe();
12227
12533
  this.countersSubscription = combineLatest([
12228
12534
  this.countersFilters$.pipe(catchError(() => of([]))),
12229
- this.filterCountersCloudService.getFilterCounters(appName, FilterCounterEntityType.PROCESS_INSTANCE)
12535
+ this.filterCountersService.getFilterCounters(appName, FilterCounterEntityType.PROCESS_INSTANCE)
12230
12536
  ])
12231
12537
  .pipe(takeUntilDestroyed(this.destroyRef))
12232
12538
  .subscribe(([, { counters }]) => {
@@ -12249,7 +12555,7 @@ class ProcessFiltersCloudComponent {
12249
12555
  });
12250
12556
  }
12251
12557
  refreshFilterCounter() {
12252
- this.filterCountersCloudService.refreshFilterCounters(this.appName);
12558
+ this.filterCountersService.refreshFilterCounters(this.appName);
12253
12559
  }
12254
12560
  fetchProcessFilterCounter(filter) {
12255
12561
  return this.searchApiMethod === 'POST'
@@ -12257,7 +12563,7 @@ class ProcessFiltersCloudComponent {
12257
12563
  : this.processListCloudService.getProcessCounter(filter.appName, filter.status);
12258
12564
  }
12259
12565
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: ProcessFiltersCloudComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12260
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: ProcessFiltersCloudComponent, isStandalone: true, selector: "adf-cloud-process-filters", inputs: { appName: "appName", searchApiMethod: "searchApiMethod", filterParam: "filterParam", showIcons: "showIcons" }, outputs: { filterSelected: "filterSelected", filterClicked: "filterClicked", success: "success", error: "error", updatedFilter: "updatedFilter" }, usesOnChanges: true, ngImport: i0, template: "@if (filters$ | async; as filterList) {\n <mat-nav-list>\n @for (filter of filterList; track filter.id) {\n <a mat-list-item\n [activated]=\"filter.id === currentRouteFilterId()\"\n [routerLink]=\"[PROCESSES_ROUTE]\"\n [queryParams]=\"{ filterId: filter.id }\"\n [attr.data-automation-id]=\"filter.key + '_filter'\"\n class=\"adf-process-filters__entry\"\n [class.adf-active]=\"filter.id === currentRouteFilterId()\"\n [attr.aria-current]=\"filter.id === currentRouteFilterId() ? 'page' : null\"\n [id]=\"filter.id\"\n [title]=\"filter.name ?? '' | translate\"\n [attr.aria-label]=\"filter.name ?? '' | translate\"\n (click)=\"onFilterClick(filter)\">\n <span matListItemTitle>\n {{ filter.name ?? '' | translate }}\n </span>\n @if (showIcons) {\n <mat-icon matListItemIcon\n data-automation-id=\"adf-filter-icon\"\n [adf-icon]=\"filter.icon ?? ''\"\n aria-hidden=\"true\" />\n }\n @if (counters[filter.key ?? '']) {\n <span matListItemMeta\n [attr.data-automation-id]=\"filter.key + '_filter-counter'\"\n class=\"adf-process-filters__entry-counter\"\n [class.adf-active]=\"isFilterUpdated(filter.key ?? '')\"\n >\n {{ counters[filter.key ?? ''] }}\n </span>\n }\n </a>\n }\n </mat-nav-list>\n} @else {\n <div class=\"adf-app-list-spinner\">\n <mat-spinner [attr.aria-label]=\"'ADF_CLOUD_PROCESS_LIST.LOADING' | translate\" aria-live=\"polite\" />\n </div>\n}\n\n", styles: [".adf-process-filters__entry-counter{padding:0 5px;border-radius:var(--mat-sys-corner-large)}.adf-process-filters__entry-counter.adf-active{background-color:var(--mat-sys-secondary);--mat-list-list-item-trailing-supporting-text-color: var(--mat-sys-on-secondary)}\n"], dependencies: [{ kind: "ngmodule", type: IconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.IconDirective, selector: "mat-icon[adf-icon]", inputs: ["adf-icon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i2$1.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i2$1.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i2$1.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i2$1.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i2$1.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
12566
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: ProcessFiltersCloudComponent, isStandalone: true, selector: "adf-cloud-process-filters", inputs: { appName: "appName", searchApiMethod: "searchApiMethod", queryPushedCounter: "queryPushedCounter", filterParam: "filterParam", showIcons: "showIcons" }, outputs: { filterSelected: "filterSelected", filterClicked: "filterClicked", success: "success", error: "error", updatedFilter: "updatedFilter" }, usesOnChanges: true, ngImport: i0, template: "@if (filters$ | async; as filterList) {\n <mat-nav-list>\n @for (filter of filterList; track filter.id) {\n <a mat-list-item\n [activated]=\"filter.id === currentRouteFilterId()\"\n [routerLink]=\"[PROCESSES_ROUTE]\"\n [queryParams]=\"{ filterId: filter.id }\"\n [attr.data-automation-id]=\"filter.key + '_filter'\"\n class=\"adf-process-filters__entry\"\n [class.adf-active]=\"filter.id === currentRouteFilterId()\"\n [attr.aria-current]=\"filter.id === currentRouteFilterId() ? 'page' : null\"\n [id]=\"filter.id\"\n [title]=\"filter.name ?? '' | translate\"\n [attr.aria-label]=\"filter.name ?? '' | translate\"\n (click)=\"onFilterClick(filter)\">\n <span matListItemTitle>\n {{ filter.name ?? '' | translate }}\n </span>\n @if (showIcons) {\n <mat-icon matListItemIcon\n data-automation-id=\"adf-filter-icon\"\n [adf-icon]=\"filter.icon ?? ''\"\n aria-hidden=\"true\" />\n }\n @if (counters[filter.key ?? '']) {\n <span matListItemMeta\n [attr.data-automation-id]=\"filter.key + '_filter-counter'\"\n class=\"adf-process-filters__entry-counter\"\n [class.adf-active]=\"isFilterUpdated(filter.key ?? '')\"\n >\n {{ counters[filter.key ?? ''] }}\n </span>\n }\n </a>\n }\n </mat-nav-list>\n} @else {\n <div class=\"adf-app-list-spinner\">\n <mat-spinner [attr.aria-label]=\"'ADF_CLOUD_PROCESS_LIST.LOADING' | translate\" aria-live=\"polite\" />\n </div>\n}\n\n", styles: [".adf-process-filters__entry-counter{padding:0 5px;border-radius:var(--mat-sys-corner-large)}.adf-process-filters__entry-counter.adf-active{background-color:var(--mat-sys-secondary);--mat-list-list-item-trailing-supporting-text-color: var(--mat-sys-on-secondary)}\n"], dependencies: [{ kind: "ngmodule", type: IconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.IconDirective, selector: "mat-icon[adf-icon]", inputs: ["adf-icon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i2$1.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i2$1.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i2$1.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i2$1.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i2$1.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
12261
12567
  }
12262
12568
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: ProcessFiltersCloudComponent, decorators: [{
12263
12569
  type: Component,
@@ -12266,6 +12572,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
12266
12572
  type: Input
12267
12573
  }], searchApiMethod: [{
12268
12574
  type: Input
12575
+ }], queryPushedCounter: [{
12576
+ type: Input
12269
12577
  }], filterParam: [{
12270
12578
  type: Input
12271
12579
  }], showIcons: [{
@@ -15620,6 +15928,9 @@ class DataTablePathParserHelper {
15620
15928
  return undefined;
15621
15929
  }
15622
15930
  const properties = this.splitPathIntoProperties(path);
15931
+ if (properties.length === 0) {
15932
+ return undefined;
15933
+ }
15623
15934
  const currentProperty = properties.shift();
15624
15935
  const propertyIndexReferences = this.getIndexReferencesFromProperty(currentProperty);
15625
15936
  const purePropertyName = this.extractPurePropertyName(currentProperty);
@@ -15651,7 +15962,7 @@ class DataTablePathParserHelper {
15651
15962
  switch (char) {
15652
15963
  case separator:
15653
15964
  if (isPropertySeparatorOutsideBrackets()) {
15654
- properties.push(currentPropertyBuffer);
15965
+ properties.push(currentPropertyBuffer.trim());
15655
15966
  currentPropertyBuffer = '';
15656
15967
  }
15657
15968
  else {
@@ -15671,8 +15982,9 @@ class DataTablePathParserHelper {
15671
15982
  break;
15672
15983
  }
15673
15984
  }
15674
- if (currentPropertyBuffer) {
15675
- properties.push(currentPropertyBuffer);
15985
+ const lastProperty = currentPropertyBuffer.trim();
15986
+ if (lastProperty) {
15987
+ properties.push(lastProperty);
15676
15988
  }
15677
15989
  return properties;
15678
15990
  }
@@ -17108,5 +17420,5 @@ const DATE_FORMAT_CLOUD = 'YYYY-MM-DD';
17108
17420
  * Generated bundle index. Do not edit.
17109
17421
  */
17110
17422
 
17111
- export { ADF_FORM_TAB_NAV_ENABLED, ADF_TASK_RUNTIME_BUNDLE_FALLBACK_ENABLED, APP_CUSTOM_SCREEN_TOKEN, ApplicationVersionModel, ApplicationVersionResponseModel, AppsProcessCloudService, AssignmentType, AttachFileCloudWidgetComponent, BaseCloudService, CLOUD_FORM_FIELD_VALIDATORS, CloudFormRenderingService, ContentCloudNodeSelectorService, DATE_FORMAT_CLOUD, DEFAULT_OPTION, DEFAULT_TASK_PRIORITIES, DROPDOWN_CLOUD_WIDGET_SET_VALUE_DEBOUNCE, DateCloudFilterType, DateCloudWidgetComponent, DateRangeFilterService, DescriptorCustomUIAuthFlowType, DisplayModeService, DisplayRichTextWidgetComponent, DropdownCloudFieldValidator, DropdownCloudWidgetComponent, EditProcessFilterCloudComponent, EditServiceTaskFilterCloudComponent, EditTaskFilterCloudComponent, FORM_CLOUD_DIRECTIVES, FORM_CLOUD_FIELD_VALIDATORS_TOKEN, FORM_CLOUD_SERVICE_FIELD_VALIDATORS_TOKEN, FilePropertiesTableCloudComponent, FileViewerWidgetComponent, FilterCounterEntityType, FilterCountersCloudService, FormCloudComponent, FormCloudDisplayMode, FormCloudModule, FormCloudService, FormCustomOutcomesComponent, FormFieldType, FormSpinnerComponent, GroupCloudComponent, GroupCloudModule, GroupCloudWidgetComponent, HIDE_FILTER_LIMIT, IdentityGroupService, IdentityUserService, LocalPreferenceCloudService, NotificationCloudService, PROCESS_CLOUD_DIRECTIVES, PROCESS_FILTERS_CLOUD_DIRECTIVES, PROCESS_FILTERS_SERVICE_TOKEN, PROCESS_FILTER_ACTION_DELETE, PROCESS_FILTER_ACTION_RESTORE, PROCESS_FILTER_ACTION_SAVE, PROCESS_FILTER_ACTION_SAVE_AS, PROCESS_FILTER_ACTION_SAVE_DEFAULT, PROCESS_LISTS_PREFERENCES_SERVICE_TOKEN, PROCESS_SERVICES_CLOUD_DIRECTIVES, PeopleCloudComponent, PeopleCloudModule, PeopleCloudWidgetComponent, PeopleModeOptions, ProcessCloudContentService, ProcessCloudModule, ProcessCloudService, ProcessDefinitionCloud, ProcessFilterCloudAdapter, ProcessFilterCloudModel, ProcessFilterCloudService, ProcessFilterDialogCloudComponent, ProcessFiltersCloudComponent, ProcessFiltersCloudModule, ProcessHeaderCloudComponent, ProcessHeaderCloudModule, ProcessListCloudComponent, ProcessListCloudModule, ProcessListCloudPreferences, ProcessListCloudService, ProcessListCloudSortingModel, ProcessListRequestModel, ProcessListRequestSortingModel, ProcessPayloadCloud, ProcessQueryCloudRequestModel, ProcessServicesCloudModule, ProcessTaskListCloudService, PropertiesViewerWidgetComponent, PropertiesViewerWrapperComponent, RICH_TEXT_PARSER_TOKEN, RadioButtonsCloudWidgetComponent, ScreenRenderingService, ServiceTaskFilterCloudService, ServiceTaskFiltersCloudComponent, ServiceTaskListCloudComponent, ServiceTaskListCloudService, StartProcessCloudComponent, StartProcessCloudService, StartProcessScreenCloudComponent, StartTaskCloudRequestModel, TASK_ASSIGNED_STATE, TASK_CANCELLED_STATE, TASK_CLAIM_PERMISSION, TASK_COMPLETED_STATE, TASK_CREATED_STATE, TASK_FILTERS_CLOUD_DIRECTIVES, TASK_FILTERS_SERVICE_TOKEN, TASK_FORM_CLOUD_DIRECTIVES, TASK_LIST_CLOUD_DIRECTIVES, TASK_LIST_CLOUD_TOKEN, TASK_LIST_PREFERENCES_SERVICE_TOKEN, TASK_RELEASE_PERMISSION, TASK_SUSPENDED_STATE, TASK_UPDATE_PERMISSION, TASK_VIEW_PERMISSION, TaskAssignmentFilterCloudComponent, TaskCloudEntryModel, TaskCloudModule, TaskCloudNodePaging, TaskCloudPagingList, TaskCloudService, TaskFilterCloudAdapter, TaskFilterCloudModel, TaskFilterCloudService, TaskFilterDialogCloudComponent, TaskFiltersCloudComponent, TaskFiltersCloudModule, TaskFormCloudComponent, TaskFormModule, TaskHeaderCloudComponent, TaskHeaderCloudModule, TaskListCloudComponent, TaskListCloudModule, TaskListCloudService, TaskListCloudSortingModel, TaskListRequestModel, TaskListRequestSortingModel, TaskQueryCloudRequestModel, TaskStatusFilter, TaskVariableCloud, UploadCloudWidgetComponent, UserPreferenceCloudService, UserTaskCloudButtonsComponent, UserTaskCloudComponent, VariableMapperService, WebSocketService, getDateCloudWidgetRange, getExpressionEvaluationEnabled$, materializeSubmissionValues, processCloudPresetsDefaultModel, provideCloudFormRenderer, provideCloudPreferences, provideScreen, radioButtonsSchema, resolveTaskRuntimeBundleFallback$ };
17423
+ export { ADF_FORM_TAB_NAV_ENABLED, ADF_TASK_RUNTIME_BUNDLE_FALLBACK_ENABLED, APP_CUSTOM_SCREEN_TOKEN, ApplicationVersionModel, ApplicationVersionResponseModel, AppsProcessCloudService, AssignmentType, AttachFileCloudWidgetComponent, BaseCloudService, CLOUD_FORM_FIELD_VALIDATORS, CloudFormRenderingService, ContentCloudNodeSelectorService, DATE_FORMAT_CLOUD, DEFAULT_OPTION, DEFAULT_TASK_PRIORITIES, DROPDOWN_CLOUD_WIDGET_SET_VALUE_DEBOUNCE, DateCloudFilterType, DateCloudWidgetComponent, DateRangeFilterService, DescriptorCustomUIAuthFlowType, DisplayModeService, DisplayRichTextWidgetComponent, DropdownCloudFieldValidator, DropdownCloudWidgetComponent, EditProcessFilterCloudComponent, EditServiceTaskFilterCloudComponent, EditTaskFilterCloudComponent, FORM_CLOUD_DIRECTIVES, FORM_CLOUD_FIELD_VALIDATORS_TOKEN, FORM_CLOUD_SERVICE_FIELD_VALIDATORS_TOKEN, FilePropertiesTableCloudComponent, FileViewerWidgetComponent, FilterCounterEntityType, FilterCountersCloudService, FormCloudComponent, FormCloudDisplayMode, FormCloudModule, FormCloudService, FormCustomOutcomesComponent, FormFieldType, FormSpinnerComponent, GroupCloudComponent, GroupCloudModule, GroupCloudWidgetComponent, HIDE_FILTER_LIMIT, IdentityGroupService, IdentityUserService, LocalPreferenceCloudService, NotificationCloudService, PROCESS_CLOUD_DIRECTIVES, PROCESS_FILTERS_CLOUD_DIRECTIVES, PROCESS_FILTERS_SERVICE_TOKEN, PROCESS_FILTER_ACTION_DELETE, PROCESS_FILTER_ACTION_RESTORE, PROCESS_FILTER_ACTION_SAVE, PROCESS_FILTER_ACTION_SAVE_AS, PROCESS_FILTER_ACTION_SAVE_DEFAULT, PROCESS_LISTS_PREFERENCES_SERVICE_TOKEN, PROCESS_SERVICES_CLOUD_DIRECTIVES, PeopleCloudComponent, PeopleCloudModule, PeopleCloudWidgetComponent, PeopleModeOptions, ProcessCloudContentService, ProcessCloudModule, ProcessCloudService, ProcessDefinitionCloud, ProcessFilterCloudAdapter, ProcessFilterCloudModel, ProcessFilterCloudService, ProcessFilterDialogCloudComponent, ProcessFiltersCloudComponent, ProcessFiltersCloudModule, ProcessHeaderCloudComponent, ProcessHeaderCloudModule, ProcessListCloudComponent, ProcessListCloudModule, ProcessListCloudPreferences, ProcessListCloudService, ProcessListCloudSortingModel, ProcessListRequestModel, ProcessListRequestSortingModel, ProcessPayloadCloud, ProcessQueryCloudRequestModel, ProcessServicesCloudModule, ProcessTaskListCloudService, PropertiesViewerWidgetComponent, PropertiesViewerWrapperComponent, QueryPushedFilterCountersCloudService, RICH_TEXT_PARSER_TOKEN, RadioButtonsCloudWidgetComponent, ScreenRenderingService, ServiceTaskFilterCloudService, ServiceTaskFiltersCloudComponent, ServiceTaskListCloudComponent, ServiceTaskListCloudService, StartProcessCloudComponent, StartProcessCloudService, StartProcessScreenCloudComponent, StartTaskCloudRequestModel, TASK_ASSIGNED_STATE, TASK_CANCELLED_STATE, TASK_CLAIM_PERMISSION, TASK_COMPLETED_STATE, TASK_CREATED_STATE, TASK_FILTERS_CLOUD_DIRECTIVES, TASK_FILTERS_SERVICE_TOKEN, TASK_FORM_CLOUD_DIRECTIVES, TASK_LIST_CLOUD_DIRECTIVES, TASK_LIST_CLOUD_TOKEN, TASK_LIST_PREFERENCES_SERVICE_TOKEN, TASK_RELEASE_PERMISSION, TASK_SUSPENDED_STATE, TASK_UPDATE_PERMISSION, TASK_VIEW_PERMISSION, TaskAssignmentFilterCloudComponent, TaskCloudEntryModel, TaskCloudModule, TaskCloudNodePaging, TaskCloudPagingList, TaskCloudService, TaskFilterCloudAdapter, TaskFilterCloudModel, TaskFilterCloudService, TaskFilterDialogCloudComponent, TaskFiltersCloudComponent, TaskFiltersCloudModule, TaskFormCloudComponent, TaskFormModule, TaskHeaderCloudComponent, TaskHeaderCloudModule, TaskListCloudComponent, TaskListCloudModule, TaskListCloudService, TaskListCloudSortingModel, TaskListRequestModel, TaskListRequestSortingModel, TaskQueryCloudRequestModel, TaskStatusFilter, TaskVariableCloud, UploadCloudWidgetComponent, UserPreferenceCloudService, UserTaskCloudButtonsComponent, UserTaskCloudComponent, VariableMapperService, WebSocketService, getDateCloudWidgetRange, getExpressionEvaluationEnabled$, materializeSubmissionValues, processCloudPresetsDefaultModel, provideCloudFormRenderer, provideCloudPreferences, provideScreen, radioButtonsSchema, resolveTaskRuntimeBundleFallback$ };
17112
17424
  //# sourceMappingURL=adf-process-services-cloud.mjs.map