@valtimo/components 13.45.1 → 13.47.0

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 (35) hide show
  1. package/fesm2022/valtimo-components.mjs +1325 -376
  2. package/fesm2022/valtimo-components.mjs.map +1 -1
  3. package/lib/components/auto-key-input/auto-key-input.component.d.ts +9 -1
  4. package/lib/components/auto-key-input/auto-key-input.component.d.ts.map +1 -1
  5. package/lib/components/drag-drop-list/drag-drop-list.component.d.ts +76 -0
  6. package/lib/components/drag-drop-list/drag-drop-list.component.d.ts.map +1 -0
  7. package/lib/components/form/form.component.d.ts +3 -1
  8. package/lib/components/form/form.component.d.ts.map +1 -1
  9. package/lib/components/form-io/components/form-io/form-io.component.d.ts +3 -0
  10. package/lib/components/form-io/components/form-io/form-io.component.d.ts.map +1 -1
  11. package/lib/components/form-io/components/form-io-builder/form-io-builder.component.d.ts.map +1 -1
  12. package/lib/components/left-sidebar/left-sidebar.component.d.ts +3 -1
  13. package/lib/components/left-sidebar/left-sidebar.component.d.ts.map +1 -1
  14. package/lib/components/mdi-icon-selector/mdi-icon-selector.component.d.ts +2 -1
  15. package/lib/components/mdi-icon-selector/mdi-icon-selector.component.d.ts.map +1 -1
  16. package/lib/components/menu/menu-configuration.model.d.ts +87 -0
  17. package/lib/components/menu/menu-configuration.model.d.ts.map +1 -0
  18. package/lib/components/menu/menu-configuration.resolver.d.ts +19 -0
  19. package/lib/components/menu/menu-configuration.resolver.d.ts.map +1 -0
  20. package/lib/components/menu/menu-configuration.seed.d.ts +16 -0
  21. package/lib/components/menu/menu-configuration.seed.d.ts.map +1 -0
  22. package/lib/components/menu/menu-item-catalog.d.ts +59 -0
  23. package/lib/components/menu/menu-item-catalog.d.ts.map +1 -0
  24. package/lib/components/multi-input/carbon-multi-input.component.d.ts +8 -1
  25. package/lib/components/multi-input/carbon-multi-input.component.d.ts.map +1 -1
  26. package/lib/components/select/select.component.d.ts +17 -0
  27. package/lib/components/select/select.component.d.ts.map +1 -1
  28. package/lib/components/value-path-selector/value-path-selector.component.d.ts +11 -0
  29. package/lib/components/value-path-selector/value-path-selector.component.d.ts.map +1 -1
  30. package/lib/constants/mdi.constants.d.ts.map +1 -1
  31. package/lib/services/admin-settings.service.d.ts +3 -0
  32. package/lib/services/admin-settings.service.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/public_api.d.ts +5 -0
  35. package/public_api.d.ts.map +1 -1
@@ -4,7 +4,7 @@ import { combineLatest, map, BehaviorSubject, switchMap, catchError, of, shareRe
4
4
  import * as i1 from '@ngx-translate/core';
5
5
  import { TranslateModule, TranslateLoader, TranslateService, TranslatePipe } from '@ngx-translate/core';
6
6
  import * as i1$2 from '@valtimo/shared';
7
- import { BaseApiService, VERSIONS, HttpLoaderFactory, getContextObservable, getCaseManagementRouteParams, getBuildingBlockManagementRouteParams } from '@valtimo/shared';
7
+ import { BaseApiService, IncludeFunction, ROLE_USER, ROLE_ADMIN, ROLE_DEVELOPER, VERSIONS, HttpLoaderFactory, getContextObservable, getCaseManagementRouteParams, getBuildingBlockManagementRouteParams, sanitizeKey, toKebabCase } from '@valtimo/shared';
8
8
  import * as i1$1 from '@angular/common/http';
9
9
  import { HttpClient, HttpParams } from '@angular/common/http';
10
10
  import { filter, map as map$1, take, tap as tap$1, debounceTime, distinctUntilChanged, takeUntil as takeUntil$1, startWith as startWith$1, switchMap as switchMap$1, delay } from 'rxjs/operators';
@@ -33,9 +33,11 @@ import * as i6$1 from '@valtimo/security';
33
33
  import * as i11 from '@ng-bootstrap/ng-bootstrap';
34
34
  import { NgbTooltipModule, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
35
35
  import { autoUpdate, computePosition, offset, flip, shift, hide } from '@floating-ui/dom';
36
- import * as i3 from '@angular/cdk/layout';
36
+ import * as i3 from '@angular/cdk/drag-drop';
37
+ import { DragDropModule } from '@angular/cdk/drag-drop';
38
+ import { Draggable16, OverflowMenuVertical16, ArrowDown16, ArrowUp16, SettingsView16, View16, ViewOff16, ChevronUp16, ChevronDown16, Close16, Add16, Edit16, Save16, WarningAltFilled16, WarningFilled16, TrashCan16, DocumentRequirements16, UserFollow16, Group16, User16 } from '@carbon/icons';
39
+ import * as i3$1 from '@angular/cdk/layout';
37
40
  import { LayoutModule } from '@angular/cdk/layout';
38
- import { OverflowMenuVertical16, ArrowDown16, ArrowUp16, SettingsView16, Draggable16, View16, ViewOff16, ChevronUp16, ChevronDown16, Close16, Add16, Edit16, Save16, WarningAltFilled16, WarningFilled16, TrashCan16, DocumentRequirements16, UserFollow16, Group16, User16 } from '@carbon/icons';
39
41
  import localeNl from '@angular/common/locales/nl';
40
42
  import moment$1 from 'moment/moment';
41
43
  import NavigatedViewer from 'bpmn-js/lib/NavigatedViewer';
@@ -44,7 +46,7 @@ import * as i1$5 from '@valtimo/resource';
44
46
  import { S3Resource, ResourceModule, UploadProviderService } from '@valtimo/resource';
45
47
  import { jwtDecode } from 'jwt-decode';
46
48
  import Dropzone from 'dropzone';
47
- import * as i3$1 from '@valtimo/document';
49
+ import * as i3$2 from '@valtimo/document';
48
50
  import { DocumentModule, InternalCaseStatusUtils, CaseTagsUtils } from '@valtimo/document';
49
51
  import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
50
52
  import { trigger, transition, style, animate } from '@angular/animations';
@@ -866,6 +868,7 @@ const POPULAR_MDI_ICONS = [
866
868
  'mdi-folder-account',
867
869
  'mdi-folder-multiple',
868
870
  'mdi-folder-star',
871
+ 'mdi-archive',
869
872
  'mdi-file',
870
873
  'mdi-file-document',
871
874
  'mdi-file-cog',
@@ -913,7 +916,9 @@ const POPULAR_MDI_ICONS = [
913
916
  'mdi-lightbulb',
914
917
  'mdi-check',
915
918
  'mdi-check-circle',
919
+ 'mdi-check-all',
916
920
  'mdi-close',
921
+ 'mdi-dot-circle',
917
922
  'mdi-lock',
918
923
  'mdi-lock-open',
919
924
  'mdi-lock-check',
@@ -931,6 +936,7 @@ const POPULAR_MDI_ICONS = [
931
936
  'mdi-view-dashboard',
932
937
  'mdi-view-list',
933
938
  'mdi-view-grid',
939
+ 'mdi-layers',
934
940
  'mdi-table',
935
941
  'mdi-chart-bar',
936
942
  'mdi-chart-line',
@@ -955,6 +961,8 @@ const POPULAR_MDI_ICONS = [
955
961
  'mdi-lan',
956
962
  'mdi-api',
957
963
  'mdi-application-braces',
964
+ 'mdi-xml',
965
+ 'mdi-code',
958
966
  'mdi-cube',
959
967
  'mdi-view-module',
960
968
  'mdi-puzzle',
@@ -1417,6 +1425,12 @@ class AdminSettingsService extends BaseApiService {
1417
1425
  }
1418
1426
  });
1419
1427
  }
1428
+ getMenuConfiguration() {
1429
+ return this.httpClient.get(this.getApiUrl('/v1/admin-settings/menu-configuration'));
1430
+ }
1431
+ updateMenuConfiguration(dto) {
1432
+ return this.httpClient.put(this.getApiUrl('/management/v1/admin-settings/menu-configuration'), dto);
1433
+ }
1420
1434
  getComputedAccentColor(cssVar) {
1421
1435
  return getComputedStyle(document.documentElement).getPropertyValue(cssVar).trim();
1422
1436
  }
@@ -4650,8 +4664,8 @@ class OverflowMenuComponent {
4650
4664
  // The pane is rendered with `position: fixed`, so positions must be
4651
4665
  // computed against the viewport. Without this the menu is offset by the
4652
4666
  // trigger's page position and lands far from lower rows (unclickable).
4653
- strategy: 'fixed',
4654
4667
  placement: this.placement,
4668
+ strategy: 'fixed',
4655
4669
  middleware: [
4656
4670
  offset({ mainAxis: this.offsetY, crossAxis: this.offsetX }),
4657
4671
  flip(),
@@ -4872,7 +4886,7 @@ function menuInitializer(injector, logger) {
4872
4886
  }
4873
4887
 
4874
4888
  /*
4875
- * Copyright 2015-2025 Ritense BV, the Netherlands.
4889
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
4876
4890
  *
4877
4891
  * Licensed under EUPL, Version 1.2 (the "License");
4878
4892
  * you may not use this file except in compliance with the License.
@@ -4886,27 +4900,55 @@ function menuInitializer(injector, logger) {
4886
4900
  * See the License for the specific language governing permissions and
4887
4901
  * limitations under the License.
4888
4902
  */
4889
- class VersionService {
4890
- constructor(http, configService) {
4891
- this.http = http;
4892
- this.configService = configService;
4893
- this.valtimoEndpointUri = configService.config.valtimoApi.endpointUri;
4894
- }
4895
- getVersion() {
4896
- return this.http.get(`${this.valtimoEndpointUri}v1/valtimo/version`);
4897
- }
4898
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, deps: [{ token: i1$1.HttpClient }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
4899
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, providedIn: 'root' }); }
4903
+ /**
4904
+ * Maps a **legacy** numeric `includeFunction` ordinal (configs saved before the switch to string
4905
+ * names) to the current enum member. The mapping follows the order the members held their ordinals
4906
+ * while configs were still persisted numerically: `OpenSearchEnabled` was only inserted (at
4907
+ * ordinal 1, shifting `ZgwFeaturesEnabled` from 1 to 2) just before the switch to names, so a
4908
+ * persisted `1` almost always predates that insertion and means `ZgwFeaturesEnabled`; a persisted
4909
+ * `2` can only come from a post-insertion save and also means `ZgwFeaturesEnabled`.
4910
+ */
4911
+ const LEGACY_INCLUDE_FUNCTION_BY_ORDINAL = {
4912
+ 0: IncludeFunction.ObjectManagementEnabled,
4913
+ 1: IncludeFunction.ZgwFeaturesEnabled,
4914
+ 2: IncludeFunction.ZgwFeaturesEnabled,
4915
+ };
4916
+ /**
4917
+ * Parses a persisted `includeFunction` value — the enum member name (current format) or a legacy
4918
+ * numeric ordinal — into the runtime `IncludeFunction`. Unknown values yield `undefined`.
4919
+ */
4920
+ function parseIncludeFunction(value) {
4921
+ if (value === null || value === undefined || value === '')
4922
+ return undefined;
4923
+ if (typeof value === 'number')
4924
+ return LEGACY_INCLUDE_FUNCTION_BY_ORDINAL[value];
4925
+ const parsed = IncludeFunction[value];
4926
+ return typeof parsed === 'number' ? parsed : undefined;
4927
+ }
4928
+ /**
4929
+ * Serialises a **persisted** include function value (enum name or legacy numeric ordinal) into the
4930
+ * enum-name form. Numbers are interpreted as legacy ordinals (see
4931
+ * [LEGACY_INCLUDE_FUNCTION_BY_ORDINAL]) — for a *runtime* enum value use [includeFunctionToName].
4932
+ */
4933
+ function serializeIncludeFunction(value) {
4934
+ const parsed = parseIncludeFunction(value);
4935
+ return parsed === undefined ? undefined : includeFunctionToName(parsed);
4936
+ }
4937
+ /** The persisted (name) form of a **runtime** `IncludeFunction` value (current enum ordinals, no legacy mapping). */
4938
+ function includeFunctionToName(value) {
4939
+ const name = IncludeFunction[value];
4940
+ return typeof name === 'string' ? name : undefined;
4941
+ }
4942
+ /** Current schema version written by this client. */
4943
+ const MENU_CONFIGURATION_VERSION = 1;
4944
+ /** Whether a fetched DTO actually holds a usable saved structure (non-empty `items`). */
4945
+ function hasSavedMenuConfiguration(dto) {
4946
+ const configuration = dto?.configuration;
4947
+ return Array.isArray(configuration?.items) && configuration.items.length > 0;
4900
4948
  }
4901
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, decorators: [{
4902
- type: Injectable,
4903
- args: [{
4904
- providedIn: 'root',
4905
- }]
4906
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i1$2.ConfigService }] });
4907
4949
 
4908
4950
  /*
4909
- * Copyright 2015-2025 Ritense BV, the Netherlands.
4951
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
4910
4952
  *
4911
4953
  * Licensed under EUPL, Version 1.2 (the "License");
4912
4954
  * you may not use this file except in compliance with the License.
@@ -4920,123 +4962,902 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
4920
4962
  * See the License for the specific language governing permissions and
4921
4963
  * limitations under the License.
4922
4964
  */
4923
- class RightSidebarComponent {
4924
- onPageClick(targetElement) {
4925
- combineLatest([this.shellService.panelExpanded$, this.shellService.mouseOnTopBar$])
4926
- .pipe(take$1(1))
4927
- .subscribe(([panelExpanded, mouseOnTopBar]) => {
4928
- const clickedInside = this.elementRef.nativeElement.contains(targetElement) || mouseOnTopBar;
4929
- if (!clickedInside && panelExpanded) {
4930
- this.shellService.setPanelExpanded(false);
4965
+ /** The text class `environment.ts` uses for the non-link group labels inside Admin. */
4966
+ const SECTION_HEADER_TEXT_CLASS = 'text-dark font-weight-bold c-default';
4967
+ /**
4968
+ * The curated catalog, seeded from `environment.ts`'s menu. The single source of truth for both the
4969
+ * builder's "Available items" panel and the runtime resolver (config JSON + catalog → `MenuItem[]`).
4970
+ */
4971
+ const MENU_ITEM_CATALOG = [
4972
+ // Main menu items (top level)
4973
+ {
4974
+ itemId: 'dashboard',
4975
+ defaultTitleKey: 'Dashboard',
4976
+ defaultIcon: 'icon mdi mdi-view-dashboard',
4977
+ link: '/',
4978
+ roles: [ROLE_USER],
4979
+ placement: 'top',
4980
+ category: 'main',
4981
+ },
4982
+ {
4983
+ itemId: 'cases',
4984
+ defaultTitleKey: 'Cases',
4985
+ defaultIcon: 'icon mdi mdi-layers',
4986
+ roles: [ROLE_USER],
4987
+ placement: 'top',
4988
+ category: 'main',
4989
+ },
4990
+ {
4991
+ itemId: 'objects',
4992
+ defaultTitleKey: 'Objects',
4993
+ defaultIcon: 'icon mdi mdi-archive',
4994
+ roles: [ROLE_ADMIN],
4995
+ includeFunction: IncludeFunction.ObjectManagementEnabled,
4996
+ placement: 'top',
4997
+ category: 'main',
4998
+ },
4999
+ {
5000
+ itemId: 'tasks',
5001
+ defaultTitleKey: 'Tasks',
5002
+ defaultIcon: 'icon mdi mdi-check-all',
5003
+ link: '/tasks',
5004
+ roles: [ROLE_USER],
5005
+ placement: 'top',
5006
+ category: 'main',
5007
+ },
5008
+ {
5009
+ itemId: 'analysis',
5010
+ defaultTitleKey: 'Analysis',
5011
+ defaultIcon: 'icon mdi mdi-chart-bar',
5012
+ link: '/analysis',
5013
+ roles: [ROLE_USER],
5014
+ placement: 'top',
5015
+ category: 'main',
5016
+ },
5017
+ {
5018
+ itemId: 'teams',
5019
+ defaultTitleKey: 'teams.title',
5020
+ defaultIcon: 'icon mdi mdi-account-group',
5021
+ link: '/teams',
5022
+ roles: [ROLE_USER],
5023
+ placement: 'top',
5024
+ category: 'main',
5025
+ },
5026
+ {
5027
+ itemId: 'admin',
5028
+ defaultTitleKey: 'Admin',
5029
+ defaultIcon: 'icon mdi mdi-tune',
5030
+ roles: [ROLE_ADMIN],
5031
+ placement: 'top',
5032
+ category: 'main',
5033
+ required: true,
5034
+ },
5035
+ {
5036
+ itemId: 'development',
5037
+ defaultTitleKey: 'Development',
5038
+ defaultIcon: 'icon mdi mdi-xml',
5039
+ roles: [ROLE_DEVELOPER, ROLE_ADMIN],
5040
+ placement: 'top',
5041
+ category: 'main',
5042
+ },
5043
+ // Admin pages (inside the Admin group)
5044
+ {
5045
+ itemId: 'adminSettings',
5046
+ defaultTitleKey: 'adminSettings.title',
5047
+ link: '/admin-settings',
5048
+ roles: [ROLE_ADMIN],
5049
+ placement: 'admin',
5050
+ category: 'admin',
5051
+ required: true,
5052
+ },
5053
+ {
5054
+ itemId: 'buildingBlockManagement',
5055
+ defaultTitleKey: 'buildingBlockManagement.title',
5056
+ link: '/building-block-management',
5057
+ roles: [ROLE_ADMIN],
5058
+ placement: 'admin',
5059
+ category: 'admin',
5060
+ },
5061
+ {
5062
+ itemId: 'caseManagement',
5063
+ defaultTitleKey: 'Cases',
5064
+ link: '/case-management',
5065
+ roles: [ROLE_ADMIN],
5066
+ placement: 'admin',
5067
+ category: 'admin',
5068
+ },
5069
+ {
5070
+ itemId: 'plugins',
5071
+ defaultTitleKey: 'Plugins',
5072
+ link: '/plugins',
5073
+ roles: [ROLE_ADMIN],
5074
+ placement: 'admin',
5075
+ category: 'admin',
5076
+ },
5077
+ {
5078
+ itemId: 'pluginHosts',
5079
+ defaultTitleKey: 'Plugin hosts',
5080
+ link: '/plugin-hosts',
5081
+ roles: [ROLE_ADMIN],
5082
+ placement: 'admin',
5083
+ category: 'admin',
5084
+ },
5085
+ {
5086
+ itemId: 'pluginApps',
5087
+ defaultTitleKey: 'Apps',
5088
+ link: '/plugin-apps',
5089
+ roles: [ROLE_ADMIN],
5090
+ placement: 'admin',
5091
+ category: 'admin',
5092
+ },
5093
+ {
5094
+ itemId: 'dashboardManagement',
5095
+ defaultTitleKey: 'Dashboard',
5096
+ link: '/dashboard-management',
5097
+ roles: [ROLE_ADMIN],
5098
+ placement: 'admin',
5099
+ category: 'admin',
5100
+ },
5101
+ {
5102
+ itemId: 'accessControl',
5103
+ defaultTitleKey: 'Access Control',
5104
+ link: '/access-control',
5105
+ roles: [ROLE_ADMIN],
5106
+ placement: 'admin',
5107
+ category: 'admin',
5108
+ },
5109
+ {
5110
+ itemId: 'translationManagement',
5111
+ defaultTitleKey: 'Translations',
5112
+ link: '/translation-management',
5113
+ roles: [ROLE_ADMIN],
5114
+ placement: 'admin',
5115
+ category: 'admin',
5116
+ },
5117
+ {
5118
+ itemId: 'choiceFields',
5119
+ defaultTitleKey: 'Choice fields',
5120
+ link: '/choice-fields',
5121
+ roles: [ROLE_ADMIN],
5122
+ placement: 'admin',
5123
+ category: 'admin',
5124
+ },
5125
+ {
5126
+ itemId: 'objectManagement',
5127
+ defaultTitleKey: 'Objects',
5128
+ link: '/object-management',
5129
+ roles: [ROLE_ADMIN],
5130
+ placement: 'admin',
5131
+ category: 'admin',
5132
+ },
5133
+ {
5134
+ itemId: 'formManagement',
5135
+ defaultTitleKey: 'Forms',
5136
+ link: '/form-management',
5137
+ roles: [ROLE_ADMIN],
5138
+ placement: 'admin',
5139
+ category: 'admin',
5140
+ },
5141
+ {
5142
+ itemId: 'notifications',
5143
+ defaultTitleKey: 'Notifications',
5144
+ link: '/notifications-api/notifications/failed',
5145
+ roles: [ROLE_ADMIN],
5146
+ placement: 'admin',
5147
+ category: 'admin',
5148
+ },
5149
+ {
5150
+ itemId: 'processes',
5151
+ defaultTitleKey: 'Processes',
5152
+ link: '/processes',
5153
+ roles: [ROLE_ADMIN],
5154
+ placement: 'admin',
5155
+ category: 'admin',
5156
+ },
5157
+ {
5158
+ itemId: 'decisionTables',
5159
+ defaultTitleKey: 'Decision tables',
5160
+ link: '/decision-tables',
5161
+ roles: [ROLE_ADMIN],
5162
+ placement: 'admin',
5163
+ category: 'admin',
5164
+ },
5165
+ {
5166
+ itemId: 'logging',
5167
+ defaultTitleKey: 'Logs',
5168
+ link: '/logging',
5169
+ roles: [ROLE_ADMIN],
5170
+ placement: 'admin',
5171
+ category: 'admin',
5172
+ },
5173
+ {
5174
+ itemId: 'opensearch',
5175
+ defaultTitleKey: 'adminSettings.opensearch.title',
5176
+ link: '/opensearch',
5177
+ roles: [ROLE_ADMIN],
5178
+ includeFunction: IncludeFunction.OpenSearchEnabled,
5179
+ placement: 'admin',
5180
+ category: 'admin',
5181
+ },
5182
+ {
5183
+ itemId: 'caseMigration',
5184
+ defaultTitleKey: 'Case migration (beta)',
5185
+ link: '/case-migration',
5186
+ roles: [ROLE_ADMIN],
5187
+ placement: 'admin',
5188
+ category: 'admin',
5189
+ },
5190
+ {
5191
+ itemId: 'processMigration',
5192
+ defaultTitleKey: 'Process migration',
5193
+ link: '/process-migration',
5194
+ roles: [ROLE_ADMIN],
5195
+ placement: 'admin',
5196
+ category: 'admin',
5197
+ },
5198
+ {
5199
+ itemId: 'taskManagement',
5200
+ defaultTitleKey: 'Tasks (legacy)',
5201
+ link: '/task-management',
5202
+ roles: [ROLE_ADMIN],
5203
+ placement: 'admin',
5204
+ category: 'admin',
5205
+ },
5206
+ {
5207
+ itemId: 'notificationTest',
5208
+ defaultTitleKey: 'Send notification',
5209
+ link: '/notification-test',
5210
+ roles: [ROLE_ADMIN],
5211
+ placement: 'admin',
5212
+ category: 'admin',
5213
+ },
5214
+ // Development pages (inside the Development group)
5215
+ {
5216
+ itemId: 'swagger',
5217
+ defaultTitleKey: 'Swagger',
5218
+ defaultIcon: 'icon mdi mdi-dot-circle',
5219
+ link: '/swagger',
5220
+ roles: [ROLE_DEVELOPER, ROLE_ADMIN],
5221
+ placement: 'development',
5222
+ category: 'development',
5223
+ },
5224
+ ];
5225
+ /** Normalises a route for comparison: lower-cased, single leading slash, no trailing slash. */
5226
+ function normaliseMenuLink(link) {
5227
+ if (!link)
5228
+ return '';
5229
+ const normalised = ('/' + link.toLowerCase().replace(/^\/+/, '')).replace(/\/+$/, '');
5230
+ return normalised === '' ? '/' : normalised;
5231
+ }
5232
+ /**
5233
+ * Joins a `MenuItem.link` array into the single route string the config stores. Multi-segment
5234
+ * links (e.g. `['/plugin-pages', 'id', 'key']`) are joined with `/`; surplus slashes on segment
5235
+ * boundaries are stripped so a segment that already starts with `/` never produces `//`. A single
5236
+ * segment (`['/tasks']`, `['/']`) passes through unchanged.
5237
+ */
5238
+ function menuLinkToString(link) {
5239
+ if (!Array.isArray(link) || link.length === 0)
5240
+ return '';
5241
+ if (link.length === 1)
5242
+ return link[0] ?? '';
5243
+ const [first, ...rest] = link;
5244
+ return [
5245
+ (first ?? '').replace(/\/+$/, ''),
5246
+ ...rest
5247
+ .map(segment => (segment ?? '').replace(/^\/+|\/+$/g, ''))
5248
+ .filter(segment => segment !== ''),
5249
+ ].join('/');
5250
+ }
5251
+ const _catalogById = new Map(MENU_ITEM_CATALOG.map(entry => [entry.itemId, entry]));
5252
+ function getMenuCatalogEntry(itemId) {
5253
+ return _catalogById.get(itemId);
5254
+ }
5255
+ /** Finds the catalog entry whose route matches the given link (linked entries only). */
5256
+ function findMenuCatalogEntryByLink(link) {
5257
+ const normalised = normaliseMenuLink(menuLinkToString(link));
5258
+ if (!normalised)
5259
+ return undefined;
5260
+ return MENU_ITEM_CATALOG.find(entry => entry.link && normaliseMenuLink(entry.link) === normalised);
5261
+ }
5262
+ /**
5263
+ * Finds the catalog **group** entry (a top-level item with no link: Cases, Objects, Admin,
5264
+ * Development) that matches a runtime menu item's title. Used to seed no-link group items without
5265
+ * colliding with same-titled linked Admin pages.
5266
+ */
5267
+ function findMenuCatalogGroupEntryByTitle(title) {
5268
+ return MENU_ITEM_CATALOG.find(entry => !entry.link && entry.placement === 'top' && entry.defaultTitleKey === title);
5269
+ }
5270
+
5271
+ /*
5272
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
5273
+ *
5274
+ * Licensed under EUPL, Version 1.2 (the "License");
5275
+ * you may not use this file except in compliance with the License.
5276
+ * You may obtain a copy of the License at
5277
+ *
5278
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
5279
+ *
5280
+ * Unless required by applicable law or agreed to in writing, software
5281
+ * distributed under the License is distributed on an "AS IS" basis,
5282
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5283
+ * See the License for the specific language governing permissions and
5284
+ * limitations under the License.
5285
+ */
5286
+ /** Route prefix a `plugin-page` node resolves to (handled by the plugin-page route in @valtimo/plugin). */
5287
+ const PLUGIN_PAGE_ROUTE = '/plugin-pages';
5288
+ /**
5289
+ * Resolves a persisted [MenuConfiguration] into the `MenuItem[]` the existing `MenuService`
5290
+ * consumes. Catalog nodes fill `link/roles/iconClass/includeFunction/title` from the registry
5291
+ * (overrides win); `section-header` → a non-link group label; `custom-link`/`plugin-page` → their
5292
+ * stored values. A preserved `roles` set always wins over the catalog default, so migrating a custom
5293
+ * item never broadens its access. Required items (Admin, Settings) are forced present so a saved
5294
+ * config can never lock an admin out of this page. Unknown catalog ids are skipped with a warning.
5295
+ *
5296
+ * The optional [logger] is threaded from the caller because this is a plain function (it runs in an
5297
+ * `APP_INITIALIZER` before a component tree exists); when absent, warnings fall back to the console.
5298
+ */
5299
+ function resolveMenuConfiguration(configuration, logger) {
5300
+ const pairs = (configuration?.items ?? [])
5301
+ .map(source => ({ source, resolved: resolveMenuConfigurationItem(source, logger) }))
5302
+ .filter((pair) => pair.resolved !== null);
5303
+ return ensureRequiredItems(pairs);
5304
+ }
5305
+ function resolveMenuConfigurationItem(item, logger) {
5306
+ switch (item.kind) {
5307
+ case 'catalog':
5308
+ return resolveCatalogItem(item, logger);
5309
+ case 'group': {
5310
+ const children = (item.children ?? [])
5311
+ .map(child => resolveMenuConfigurationItem(child, logger))
5312
+ .filter((child) => child !== null);
5313
+ return buildMenuItem({
5314
+ title: item.title,
5315
+ iconClass: item.icon,
5316
+ roles: item.roles,
5317
+ children,
5318
+ });
5319
+ }
5320
+ case 'section-header': {
5321
+ const header = { title: item.title, textClass: SECTION_HEADER_TEXT_CLASS };
5322
+ if (item.roles)
5323
+ header.roles = item.roles;
5324
+ const includeFunction = parseIncludeFunction(item.includeFunction);
5325
+ if (includeFunction !== undefined)
5326
+ header.includeFunction = includeFunction;
5327
+ return header;
5328
+ }
5329
+ case 'custom-link':
5330
+ return buildMenuItem({
5331
+ title: item.title,
5332
+ link: stringToLink(item.link),
5333
+ iconClass: item.icon,
5334
+ roles: item.roles,
5335
+ });
5336
+ case 'plugin-page':
5337
+ // Without a configuration id the entry can never route anywhere — skip it instead of
5338
+ // producing a broken menu entry.
5339
+ if (!item.configurationId) {
5340
+ warn(logger, `Plugin-page menu item "${item.title}" has no configurationId — skipping`);
5341
+ return null;
4931
5342
  }
4932
- });
4933
- }
4934
- constructor(translateService, userProviderService, formBuilder, versionService, shellService, elementRef, configService, userSettingsService, pageHeaderService, cdsThemeService) {
4935
- this.translateService = translateService;
4936
- this.userProviderService = userProviderService;
4937
- this.formBuilder = formBuilder;
4938
- this.versionService = versionService;
4939
- this.shellService = shellService;
4940
- this.elementRef = elementRef;
4941
- this.configService = configService;
4942
- this.userSettingsService = userSettingsService;
4943
- this.pageHeaderService = pageHeaderService;
4944
- this.cdsThemeService = cdsThemeService;
4945
- this.testIds = RIGHT_SIDEBAR_TEST_IDS;
4946
- this.panelExpanded$ = this.shellService.panelExpanded$;
4947
- this._selectedLanguage$ = new BehaviorSubject('');
4948
- this._languageOptions$ = new BehaviorSubject([]);
4949
- this.languageListItems$ = combineLatest([
4950
- this._languageOptions$,
4951
- this._selectedLanguage$,
4952
- this.translateService.stream('key'),
4953
- ]).pipe(map$1(([languageOptions, selectedLanguage]) => languageOptions.map(languageKey => ({
4954
- content: this.translateService.instant('settings.language.options.' + languageKey),
4955
- key: languageKey,
4956
- selected: selectedLanguage === languageKey,
4957
- }))));
4958
- this.backendVersion$ = this.versionService.getVersion();
4959
- this.userSubject$ = this.userProviderService.getUserSubject();
4960
- this.updatingUserSettings$ = new BehaviorSubject(true);
4961
- this.collapsibleWidescreenMenu$ = this.shellService.collapsibleWidescreenMenu$;
4962
- this.compactMode$ = this.pageHeaderService.compactMode$;
4963
- this.showUserNameInTopBar$ = this.pageHeaderService.showUserNameInTopBar$;
4964
- this._preferredTheme$ = this.cdsThemeService.preferredTheme$;
4965
- this.showValtimoVersions = true;
4966
- this.themeOptions$ = combineLatest([
4967
- this._preferredTheme$,
4968
- this.translateService.stream('key'),
4969
- ]).pipe(map$1(([preferredTheme]) => [
4970
- {
4971
- content: this.translateService.instant('settings.interface.themes.light'),
4972
- key: SelectableCarbonTheme.G10,
4973
- selected: preferredTheme === SelectableCarbonTheme.G10,
4974
- },
4975
- {
4976
- content: this.translateService.instant('settings.interface.themes.dark'),
4977
- key: SelectableCarbonTheme.G90,
4978
- selected: preferredTheme === SelectableCarbonTheme.G90,
4979
- },
4980
- {
4981
- content: this.translateService.instant('settings.interface.themes.system'),
4982
- key: SelectableCarbonTheme.SYSTEM,
4983
- selected: preferredTheme === SelectableCarbonTheme.SYSTEM,
4984
- },
4985
- ]));
4986
- this.allowUserThemeSwitching$ = this.configService.getFeatureToggleObservable('allowUserThemeSwitching', true);
4987
- this.enableCompactModeToggle$ = this.configService.getFeatureToggleObservable('enableCompactModeToggle', true);
4988
- this.enableShowUserNameToggle$ = this.configService.getFeatureToggleObservable('enableUserNameInTopBarToggle');
4989
- this.showPlantATreeButton$ = this.configService.getFeatureToggleObservable('showPlantATreeButton');
4990
- this.hideValtimoVersionsForNonAdmins$ = this.configService.getFeatureToggleObservable('hideValtimoVersionsForNonAdmins');
4991
- this._isAdmin$ = this.userProviderService
4992
- .getUserSubject()
4993
- .pipe(map$1(userIdentity => userIdentity?.roles.includes('ROLE_ADMIN')));
4994
- this._subscriptions = new Subscription();
4995
- }
4996
- ngOnInit() {
4997
- this.initNonToggleSettings();
4998
- this.initFrontendVersion();
4999
- this.openShowVersionsSubscription();
5000
- this.setLanguage();
5001
- this.getUserSettings();
5343
+ // TODO: an entry whose external-plugin page target no longer exists (configuration deleted,
5344
+ // or the plugin no longer exports the page bundle) still resolves to a dead /plugin-pages
5345
+ // route. Detecting that requires the async external-plugin page catalog, which this
5346
+ // synchronous resolver cannot access; consider filtering such entries in the caller once the
5347
+ // page list is available.
5348
+ return buildMenuItem({
5349
+ title: item.title,
5350
+ link: item.bundleKey
5351
+ ? [PLUGIN_PAGE_ROUTE, item.configurationId, item.bundleKey]
5352
+ : [PLUGIN_PAGE_ROUTE, item.configurationId],
5353
+ iconClass: item.icon,
5354
+ roles: item.roles,
5355
+ });
5356
+ default:
5357
+ return null;
5002
5358
  }
5003
- ngOnDestroy() {
5004
- this._subscriptions.unsubscribe();
5359
+ }
5360
+ function resolveCatalogItem(item, logger) {
5361
+ const entry = getMenuCatalogEntry(item.itemId);
5362
+ if (!entry) {
5363
+ warn(logger, `Unknown menu catalog itemId "${item.itemId}" — skipping`);
5364
+ return null;
5005
5365
  }
5006
- updateUserLanguage(langKey, saveSettings = true) {
5007
- const langKeyToUse = langKey?.item?.key
5008
- ? langKey?.item.key
5009
- : langKey;
5010
- this.translateService
5011
- .use(langKeyToUse)
5012
- .pipe(take$1(1))
5013
- .subscribe(() => {
5014
- localStorage.setItem('langKey', langKeyToUse);
5015
- this._selectedLanguage$.next(langKeyToUse);
5016
- if (saveSettings) {
5017
- this.saveUserSettings();
5018
- }
5366
+ const children = item.children
5367
+ ?.map(child => resolveMenuConfigurationItem(child, logger))
5368
+ .filter((child) => child !== null);
5369
+ return buildMenuItem({
5370
+ title: item.title ?? entry.defaultTitleKey,
5371
+ link: stringToLink(entry.link),
5372
+ iconClass: item.icon ?? entry.defaultIcon,
5373
+ roles: item.roles ?? entry.roles,
5374
+ // A required item must never carry an include function — it could hide the item at runtime and
5375
+ // lock the admin out of this page, defeating the whole point of marking it required.
5376
+ includeFunction: entry.required
5377
+ ? undefined
5378
+ : (parseIncludeFunction(item.includeFunction) ?? entry.includeFunction),
5379
+ children,
5380
+ });
5381
+ }
5382
+ function resolveCatalogItemById(itemId, logger) {
5383
+ return resolveCatalogItem({ kind: 'catalog', itemId }, logger);
5384
+ }
5385
+ /**
5386
+ * Forces the required items present so a saved config can never lock an admin out of this page:
5387
+ * the Admin section must exist, and the Settings link must be reachable **somewhere** in the menu.
5388
+ * Because Settings is now freely placeable (top level or any section), its presence is checked
5389
+ * across the whole tree — so moving it out of Admin never causes a duplicate to be injected. A
5390
+ * no-op when the saved config already holds both, so a round-tripped current menu is unchanged.
5391
+ *
5392
+ * The Admin group is matched by its stable catalog `itemId` (via the source config node), never by
5393
+ * title — the editor allows renaming, so a renamed Admin group must not trigger a duplicate. The
5394
+ * title match only remains as a fallback for the (title-keyed) seed path.
5395
+ */
5396
+ function ensureRequiredItems(pairs) {
5397
+ const result = pairs.map(pair => pair.resolved);
5398
+ const adminEntry = getMenuCatalogEntry('admin');
5399
+ const settingsEntry = getMenuCatalogEntry('adminSettings');
5400
+ if (!adminEntry || !settingsEntry)
5401
+ return result;
5402
+ let adminItem =
5403
+ // Primary: the persisted node's stable id — robust against title renames.
5404
+ pairs.find(pair => pair.source.kind === 'catalog' && pair.source.itemId === 'admin')
5405
+ ?.resolved ??
5406
+ // Fallback for configs whose Admin section was captured without the catalog id (e.g. seeded as
5407
+ // a plain group): recognise it by the catalog's default title on a link-less group.
5408
+ result.find(item => item.title === adminEntry.defaultTitleKey && !item.link);
5409
+ if (!adminItem) {
5410
+ adminItem = buildMenuItem({
5411
+ title: adminEntry.defaultTitleKey,
5412
+ iconClass: adminEntry.defaultIcon,
5413
+ roles: adminEntry.roles,
5414
+ children: [],
5019
5415
  });
5416
+ result.push(adminItem);
5020
5417
  }
5021
- setCollapsibleWidescreenMenu(collapsible, saveSettings = true) {
5022
- this.shellService.setCollapsibleWidescreenMenu(collapsible);
5023
- if (saveSettings) {
5024
- this.saveUserSettings();
5025
- }
5418
+ const settingsLink = normaliseMenuLink(settingsEntry.link);
5419
+ if (!menuContainsLink(result, settingsLink)) {
5420
+ const settingsItem = resolveCatalogItemById('adminSettings');
5421
+ if (settingsItem)
5422
+ adminItem.children = [settingsItem, ...(adminItem.children ?? [])];
5026
5423
  }
5027
- setCompactMode(compactMode, saveSettings = true) {
5028
- this.pageHeaderService.setCompactMode(compactMode);
5029
- if (saveSettings) {
5030
- this.saveUserSettings();
5031
- }
5424
+ return result;
5425
+ }
5426
+ /** Whether the resolved menu contains the given (normalised) link at any depth. */
5427
+ function menuContainsLink(items, normalisedLink) {
5428
+ return items.some(item => {
5429
+ if (normaliseMenuLink(menuLinkToString(item.link)) === normalisedLink)
5430
+ return true;
5431
+ return Array.isArray(item.children) && menuContainsLink(item.children, normalisedLink);
5432
+ });
5433
+ }
5434
+ /** Builds a `MenuItem` with only the keys that are actually set, so resolved items match the static menu shape. */
5435
+ function buildMenuItem(parts) {
5436
+ const item = { title: parts.title };
5437
+ const roles = parts.roles ?? [ROLE_USER];
5438
+ item.roles = roles;
5439
+ if (parts.link)
5440
+ item.link = parts.link;
5441
+ if (parts.iconClass)
5442
+ item.iconClass = parts.iconClass;
5443
+ if (parts.includeFunction !== undefined)
5444
+ item.includeFunction = parts.includeFunction;
5445
+ if (parts.children !== undefined)
5446
+ item.children = parts.children;
5447
+ return item;
5448
+ }
5449
+ function stringToLink(link) {
5450
+ return link ? [link] : undefined;
5451
+ }
5452
+ /** Warns via the injected NGXLogger when the caller supplied one, falling back to the console otherwise. */
5453
+ function warn(logger, message) {
5454
+ if (logger) {
5455
+ logger.warn(message);
5032
5456
  }
5033
- setShowUserName(showUserName, saveSettings = true) {
5034
- this.pageHeaderService.setShowUserNameInTopBar(showUserName);
5035
- if (saveSettings) {
5036
- this.saveUserSettings();
5037
- }
5457
+ else {
5458
+ console.warn(message);
5038
5459
  }
5039
- setPreferredTheme(selectedTheme, saveSettings = true) {
5460
+ }
5461
+
5462
+ /*
5463
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
5464
+ *
5465
+ * Licensed under EUPL, Version 1.2 (the "License");
5466
+ * you may not use this file except in compliance with the License.
5467
+ * You may obtain a copy of the License at
5468
+ *
5469
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
5470
+ *
5471
+ * Unless required by applicable law or agreed to in writing, software
5472
+ * distributed under the License is distributed on an "AS IS" basis,
5473
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5474
+ * See the License for the specific language governing permissions and
5475
+ * limitations under the License.
5476
+ */
5477
+ /**
5478
+ * Maps the **live** runtime menu (`config.menu.menuItems` — whatever an installation actually has,
5479
+ * downstream custom links included) into the editable persisted structure. Used both at runtime and
5480
+ * in the builder when the DB has no saved config, guaranteeing nothing in the current menu is lost
5481
+ * on first open. Round-trip safe with the resolver: `resolve(buildConfigFromRuntimeMenu(menu)) ≈ menu`.
5482
+ *
5483
+ * - A known route or group → a `catalog` node (title/icon recorded only when they differ from the
5484
+ * catalog default; `roles`/`includeFunction` preserved).
5485
+ * - A no-link, non-group label → a `section-header`.
5486
+ * - An unmatched link → a `custom-link` (title/link/icon/roles preserved).
5487
+ */
5488
+ function buildMenuConfigurationFromRuntimeMenu(menuItems) {
5489
+ return {
5490
+ version: MENU_CONFIGURATION_VERSION,
5491
+ items: (menuItems ?? []).map(item => seedMenuItem(item)),
5492
+ };
5493
+ }
5494
+ function seedMenuItem(item) {
5495
+ const hasLink = Array.isArray(item.link) && item.link.length > 0;
5496
+ if (!hasLink) {
5497
+ const groupEntry = findMenuCatalogGroupEntryByTitle(item.title);
5498
+ if (groupEntry)
5499
+ return seedCatalogNode(item, groupEntry);
5500
+ // A no-link item that carries its own children is a custom section (group); one without
5501
+ // children is a plain section-header label.
5502
+ if (Array.isArray(item.children))
5503
+ return seedGroupNode(item);
5504
+ const header = { kind: 'section-header', title: item.title };
5505
+ if (item.roles)
5506
+ header.roles = item.roles;
5507
+ const headerIncludeFunction = persistedIncludeFunctionOf(item);
5508
+ if (headerIncludeFunction !== undefined)
5509
+ header.includeFunction = headerIncludeFunction;
5510
+ return header;
5511
+ }
5512
+ const linkEntry = findMenuCatalogEntryByLink(item.link);
5513
+ if (linkEntry)
5514
+ return seedCatalogNode(item, linkEntry);
5515
+ const customLink = {
5516
+ kind: 'custom-link',
5517
+ title: item.title,
5518
+ link: menuLinkToString(item.link),
5519
+ };
5520
+ if (item.iconClass)
5521
+ customLink.icon = item.iconClass;
5522
+ if (item.roles)
5523
+ customLink.roles = item.roles;
5524
+ return customLink;
5525
+ }
5526
+ function seedGroupNode(item) {
5527
+ const node = { kind: 'group', title: item.title };
5528
+ if (item.iconClass)
5529
+ node.icon = item.iconClass;
5530
+ if (item.roles)
5531
+ node.roles = item.roles;
5532
+ node.children = (item.children ?? []).map(child => seedMenuItem(child));
5533
+ return node;
5534
+ }
5535
+ function seedCatalogNode(item, entry) {
5536
+ const node = { kind: 'catalog', itemId: entry.itemId };
5537
+ // Record title/icon only when they deviate from the catalog default, keeping the stored tree lean.
5538
+ if (item.title && item.title !== entry.defaultTitleKey)
5539
+ node.title = item.title;
5540
+ if (item.iconClass && item.iconClass !== entry.defaultIcon)
5541
+ node.icon = item.iconClass;
5542
+ const includeFunction = persistedIncludeFunctionOf(item);
5543
+ if (includeFunction !== undefined)
5544
+ node.includeFunction = includeFunction;
5545
+ if (item.roles)
5546
+ node.roles = item.roles;
5547
+ if (Array.isArray(item.children))
5548
+ node.children = item.children.map(child => seedMenuItem(child));
5549
+ return node;
5550
+ }
5551
+ /**
5552
+ * The runtime item's include function in its persisted form: the enum member **name**, so the
5553
+ * stored config survives enum reorders. The persisted config carries a single include function
5554
+ * (the builder edits one); a runtime item may declare several, so keep the first when an array is
5555
+ * supplied.
5556
+ */
5557
+ function persistedIncludeFunctionOf(item) {
5558
+ const includeFunction = Array.isArray(item.includeFunction)
5559
+ ? item.includeFunction[0]
5560
+ : item.includeFunction;
5561
+ return includeFunction === undefined ? undefined : includeFunctionToName(includeFunction);
5562
+ }
5563
+
5564
+ /*
5565
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
5566
+ *
5567
+ * Licensed under EUPL, Version 1.2 (the "License");
5568
+ * you may not use this file except in compliance with the License.
5569
+ * You may obtain a copy of the License at
5570
+ *
5571
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
5572
+ *
5573
+ * Unless required by applicable law or agreed to in writing, software
5574
+ * distributed under the License is distributed on an "AS IS" basis,
5575
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5576
+ * See the License for the specific language governing permissions and
5577
+ * limitations under the License.
5578
+ */
5579
+ /**
5580
+ * Reusable, presentational connected sortable list built on the (well-tested) Angular CDK
5581
+ * `@angular/cdk/drag-drop`. It owns only the drag mechanics, Carbon-styled handle and
5582
+ * placeholder/preview; the consumer renders each row via [itemTemplate] and mutates its own data in
5583
+ * response to [droppedEvent] (re-emitted verbatim from CDK). Compose several instances — connected
5584
+ * by [connectedTo] or a `cdkDropListGroup` wrapper — for nested or cross-list drag-and-drop.
5585
+ *
5586
+ * Set [sortingDisabled] on a "palette" list whose items should be copied (not moved) into another
5587
+ * list: leave its own array untouched in the [droppedEvent] handler and clone the dragged item
5588
+ * instead.
5589
+ */
5590
+ class DragDropListComponent {
5591
+ constructor(iconService) {
5592
+ this.iconService = iconService;
5593
+ this.items = [];
5594
+ this.connectedTo = [];
5595
+ this.disabled = false;
5596
+ this.sortingDisabled = false;
5597
+ this.showHandle = true;
5598
+ /**
5599
+ * When true the entire row is a drag surface (not just the handle), while interactive controls
5600
+ * inside the row — `button`, `a`, `input`, `select`, `textarea`, `[role="button"]` or anything
5601
+ * marked `[data-no-drag]` — never initiate a drag, so they stay clickable. The handle icon is then
5602
+ * shown only as a visual grab cue.
5603
+ */
5604
+ this.wholeRowDraggable = false;
5605
+ this.orientation = 'vertical';
5606
+ /**
5607
+ * Aria label for the drag handle. Accepts either an already-translated string or a translation
5608
+ * key — the template runs the value through the `translate` pipe, which passes unknown keys
5609
+ * (i.e. already-translated strings) through unchanged.
5610
+ */
5611
+ this.handleAriaLabel = 'interface.dragToReorder';
5612
+ /**
5613
+ * Optional content rendered *below* the styled row (e.g. a nested sub-list). It sits inside the
5614
+ * draggable element so it moves with the item, but outside the row surface — so the row's
5615
+ * background, hover and drag handle cover only the header, not the whole subtree.
5616
+ */
5617
+ this.expansionTemplate = null;
5618
+ this.emptyTemplate = null;
5619
+ this.enterPredicate = () => true;
5620
+ this.dragDisabled = () => false;
5621
+ this.droppedEvent = new EventEmitter();
5622
+ /** Emitted when a drag begins / ends anywhere in this list, so a host can reflect a global "dragging" state. */
5623
+ this.dragStartedEvent = new EventEmitter();
5624
+ this.dragEndedEvent = new EventEmitter();
5625
+ this.iconService.registerAll([Draggable16]);
5626
+ }
5627
+ trackByIndex(index) {
5628
+ return index;
5629
+ }
5630
+ /**
5631
+ * In whole-row mode the row element is the CDK drag surface. CDK listens for `mousedown`/
5632
+ * `touchstart` on that element in the bubble phase, so stopping propagation here — only when the
5633
+ * pointer went down on an interactive control — prevents a drag from starting on that control
5634
+ * while leaving its click intact. A pointer-down anywhere else bubbles through and drags the row.
5635
+ */
5636
+ onContentPointerDown(event) {
5637
+ if (!this.wholeRowDraggable)
5638
+ return;
5639
+ const target = event.target;
5640
+ if (target?.closest('button, a, input, select, textarea, [role="button"], [data-no-drag]')) {
5641
+ event.stopPropagation();
5642
+ }
5643
+ }
5644
+ /**
5645
+ * The expansion (nested sub-list) is never a drag surface for this row: swallow its pointer-downs so
5646
+ * a drag can only start from the header row. Nested rows have their own drag surface and handle
5647
+ * their own pointer-downs before the event reaches here.
5648
+ */
5649
+ onExpansionPointerDown(event) {
5650
+ if (this.wholeRowDraggable)
5651
+ event.stopPropagation();
5652
+ }
5653
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DragDropListComponent, deps: [{ token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
5654
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: DragDropListComponent, isStandalone: true, selector: "valtimo-drag-drop-list", inputs: { items: "items", listId: "listId", connectedTo: "connectedTo", disabled: "disabled", sortingDisabled: "sortingDisabled", showHandle: "showHandle", wholeRowDraggable: "wholeRowDraggable", orientation: "orientation", handleAriaLabel: "handleAriaLabel", itemTemplate: "itemTemplate", expansionTemplate: "expansionTemplate", emptyTemplate: "emptyTemplate", enterPredicate: "enterPredicate", dragDisabled: "dragDisabled" }, outputs: { droppedEvent: "droppedEvent", dragStartedEvent: "dragStartedEvent", dragEndedEvent: "dragEndedEvent" }, 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\n cdkDropList\n [cdkDropListConnectedTo]=\"connectedTo\"\n [cdkDropListData]=\"items\"\n [cdkDropListDisabled]=\"disabled\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [cdkDropListOrientation]=\"orientation\"\n [cdkDropListSortingDisabled]=\"sortingDisabled\"\n [id]=\"listId\"\n (cdkDropListDropped)=\"droppedEvent.emit($event)\"\n class=\"valtimo-drag-drop-list\"\n [class.valtimo-drag-drop-list--empty]=\"!items?.length\"\n>\n @for (item of items; track trackByIndex($index)) {\n <div\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"dragDisabled(item, $index)\"\n class=\"valtimo-drag-drop-list__item\"\n (cdkDragStarted)=\"dragStartedEvent.emit()\"\n (cdkDragEnded)=\"dragEndedEvent.emit()\"\n >\n <div class=\"valtimo-drag-drop-list__placeholder\" *cdkDragPlaceholder></div>\n\n <!-- The styled, draggable header row: background, hover and handle cover only this. -->\n <div\n class=\"valtimo-drag-drop-list__row\"\n [class.valtimo-drag-drop-list__row--grabbable]=\"\n wholeRowDraggable && !dragDisabled(item, $index)\n \"\n >\n @if (showHandle) {\n @if (wholeRowDraggable) {\n <span\n class=\"valtimo-drag-drop-list__handle valtimo-drag-drop-list__handle--static\"\n aria-hidden=\"true\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </span>\n } @else if (!dragDisabled(item, $index)) {\n <button\n cdkDragHandle\n [attr.aria-label]=\"handleAriaLabel | translate\"\n class=\"valtimo-drag-drop-list__handle\"\n type=\"button\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n }\n }\n\n <div\n class=\"valtimo-drag-drop-list__content\"\n (mousedown)=\"onContentPointerDown($event)\"\n (touchstart)=\"onContentPointerDown($event)\"\n >\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: $index}\"\n ></ng-container>\n </div>\n </div>\n\n @if (expansionTemplate) {\n <div\n class=\"valtimo-drag-drop-list__expansion\"\n (mousedown)=\"onExpansionPointerDown($event)\"\n (touchstart)=\"onExpansionPointerDown($event)\"\n >\n <ng-container\n *ngTemplateOutlet=\"expansionTemplate; context: {$implicit: item, index: $index}\"\n ></ng-container>\n </div>\n }\n </div>\n }\n\n @if (!items?.length && emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n</div>\n", styles: [".valtimo-drag-drop-list{display:flex;flex-direction:column;gap:var(--cds-spacing-03);min-height:var(--cds-spacing-09)}.valtimo-drag-drop-list--empty{border:1px dashed var(--cds-border-subtle);border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list.cdk-drop-list-receiving{outline:1px dashed var(--cds-border-subtle);outline-offset:calc(-1 * var(--cds-spacing-01));border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list.cdk-drop-list-dragging{outline:1px solid var(--cds-border-interactive);outline-offset:calc(-1 * var(--cds-spacing-01));border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list__item{display:flex;flex-direction:column}.valtimo-drag-drop-list__item.cdk-drag-disabled .valtimo-drag-drop-list__row{color:var(--cds-text-disabled);background-color:var(--cds-layer);cursor:default}.valtimo-drag-drop-list__row{display:flex;align-items:center;gap:var(--cds-spacing-03);padding:var(--cds-spacing-03) var(--cds-spacing-04);background-color:var(--cds-layer-02);color:var(--cds-text-primary)}.valtimo-drag-drop-list__row:hover{background-color:var(--cds-layer-hover-02)}.valtimo-drag-drop-list__row--grabbable{cursor:grab}.valtimo-drag-drop-list__row--grabbable:active{cursor:grabbing}.valtimo-drag-drop-list__handle{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--cds-icon-secondary);cursor:move}.valtimo-drag-drop-list__handle:hover{color:var(--cds-icon-primary)}.valtimo-drag-drop-list__handle:focus-visible{outline:2px solid var(--cds-focus);outline-offset:1px}.valtimo-drag-drop-list__handle--static{cursor:inherit;pointer-events:none}.valtimo-drag-drop-list__content{flex:1 1 auto;min-width:0}.valtimo-drag-drop-list__placeholder{box-sizing:border-box;min-height:var(--cds-spacing-07);border:1px dashed var(--cds-border-interactive);background-color:var(--cds-layer-accent-01);border-radius:var(--cds-spacing-02)}.cdk-drag-preview{box-sizing:border-box;box-shadow:var(--cds-spacing-01) var(--cds-spacing-02) var(--cds-spacing-03) #0003}.cdk-drag-preview .valtimo-drag-drop-list__expansion{display:none}.cdk-drag-animating,.cdk-drop-list-dragging .cdk-drag{transition:transform .2s cubic-bezier(0,0,.2,1)}\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: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i3.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5655
+ }
5656
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DragDropListComponent, decorators: [{
5657
+ type: Component,
5658
+ args: [{ standalone: true, selector: 'valtimo-drag-drop-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, DragDropModule, IconModule, TranslateModule], 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\n cdkDropList\n [cdkDropListConnectedTo]=\"connectedTo\"\n [cdkDropListData]=\"items\"\n [cdkDropListDisabled]=\"disabled\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [cdkDropListOrientation]=\"orientation\"\n [cdkDropListSortingDisabled]=\"sortingDisabled\"\n [id]=\"listId\"\n (cdkDropListDropped)=\"droppedEvent.emit($event)\"\n class=\"valtimo-drag-drop-list\"\n [class.valtimo-drag-drop-list--empty]=\"!items?.length\"\n>\n @for (item of items; track trackByIndex($index)) {\n <div\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"dragDisabled(item, $index)\"\n class=\"valtimo-drag-drop-list__item\"\n (cdkDragStarted)=\"dragStartedEvent.emit()\"\n (cdkDragEnded)=\"dragEndedEvent.emit()\"\n >\n <div class=\"valtimo-drag-drop-list__placeholder\" *cdkDragPlaceholder></div>\n\n <!-- The styled, draggable header row: background, hover and handle cover only this. -->\n <div\n class=\"valtimo-drag-drop-list__row\"\n [class.valtimo-drag-drop-list__row--grabbable]=\"\n wholeRowDraggable && !dragDisabled(item, $index)\n \"\n >\n @if (showHandle) {\n @if (wholeRowDraggable) {\n <span\n class=\"valtimo-drag-drop-list__handle valtimo-drag-drop-list__handle--static\"\n aria-hidden=\"true\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </span>\n } @else if (!dragDisabled(item, $index)) {\n <button\n cdkDragHandle\n [attr.aria-label]=\"handleAriaLabel | translate\"\n class=\"valtimo-drag-drop-list__handle\"\n type=\"button\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n }\n }\n\n <div\n class=\"valtimo-drag-drop-list__content\"\n (mousedown)=\"onContentPointerDown($event)\"\n (touchstart)=\"onContentPointerDown($event)\"\n >\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: $index}\"\n ></ng-container>\n </div>\n </div>\n\n @if (expansionTemplate) {\n <div\n class=\"valtimo-drag-drop-list__expansion\"\n (mousedown)=\"onExpansionPointerDown($event)\"\n (touchstart)=\"onExpansionPointerDown($event)\"\n >\n <ng-container\n *ngTemplateOutlet=\"expansionTemplate; context: {$implicit: item, index: $index}\"\n ></ng-container>\n </div>\n }\n </div>\n }\n\n @if (!items?.length && emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n</div>\n", styles: [".valtimo-drag-drop-list{display:flex;flex-direction:column;gap:var(--cds-spacing-03);min-height:var(--cds-spacing-09)}.valtimo-drag-drop-list--empty{border:1px dashed var(--cds-border-subtle);border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list.cdk-drop-list-receiving{outline:1px dashed var(--cds-border-subtle);outline-offset:calc(-1 * var(--cds-spacing-01));border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list.cdk-drop-list-dragging{outline:1px solid var(--cds-border-interactive);outline-offset:calc(-1 * var(--cds-spacing-01));border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list__item{display:flex;flex-direction:column}.valtimo-drag-drop-list__item.cdk-drag-disabled .valtimo-drag-drop-list__row{color:var(--cds-text-disabled);background-color:var(--cds-layer);cursor:default}.valtimo-drag-drop-list__row{display:flex;align-items:center;gap:var(--cds-spacing-03);padding:var(--cds-spacing-03) var(--cds-spacing-04);background-color:var(--cds-layer-02);color:var(--cds-text-primary)}.valtimo-drag-drop-list__row:hover{background-color:var(--cds-layer-hover-02)}.valtimo-drag-drop-list__row--grabbable{cursor:grab}.valtimo-drag-drop-list__row--grabbable:active{cursor:grabbing}.valtimo-drag-drop-list__handle{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--cds-icon-secondary);cursor:move}.valtimo-drag-drop-list__handle:hover{color:var(--cds-icon-primary)}.valtimo-drag-drop-list__handle:focus-visible{outline:2px solid var(--cds-focus);outline-offset:1px}.valtimo-drag-drop-list__handle--static{cursor:inherit;pointer-events:none}.valtimo-drag-drop-list__content{flex:1 1 auto;min-width:0}.valtimo-drag-drop-list__placeholder{box-sizing:border-box;min-height:var(--cds-spacing-07);border:1px dashed var(--cds-border-interactive);background-color:var(--cds-layer-accent-01);border-radius:var(--cds-spacing-02)}.cdk-drag-preview{box-sizing:border-box;box-shadow:var(--cds-spacing-01) var(--cds-spacing-02) var(--cds-spacing-03) #0003}.cdk-drag-preview .valtimo-drag-drop-list__expansion{display:none}.cdk-drag-animating,.cdk-drop-list-dragging .cdk-drag{transition:transform .2s cubic-bezier(0,0,.2,1)}\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"] }]
5659
+ }], ctorParameters: () => [{ type: i2$3.IconService }], propDecorators: { items: [{
5660
+ type: Input
5661
+ }], listId: [{
5662
+ type: Input
5663
+ }], connectedTo: [{
5664
+ type: Input
5665
+ }], disabled: [{
5666
+ type: Input
5667
+ }], sortingDisabled: [{
5668
+ type: Input
5669
+ }], showHandle: [{
5670
+ type: Input
5671
+ }], wholeRowDraggable: [{
5672
+ type: Input
5673
+ }], orientation: [{
5674
+ type: Input
5675
+ }], handleAriaLabel: [{
5676
+ type: Input
5677
+ }], itemTemplate: [{
5678
+ type: Input
5679
+ }], expansionTemplate: [{
5680
+ type: Input
5681
+ }], emptyTemplate: [{
5682
+ type: Input
5683
+ }], enterPredicate: [{
5684
+ type: Input
5685
+ }], dragDisabled: [{
5686
+ type: Input
5687
+ }], droppedEvent: [{
5688
+ type: Output
5689
+ }], dragStartedEvent: [{
5690
+ type: Output
5691
+ }], dragEndedEvent: [{
5692
+ type: Output
5693
+ }] } });
5694
+
5695
+ /*
5696
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
5697
+ *
5698
+ * Licensed under EUPL, Version 1.2 (the "License");
5699
+ * you may not use this file except in compliance with the License.
5700
+ * You may obtain a copy of the License at
5701
+ *
5702
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
5703
+ *
5704
+ * Unless required by applicable law or agreed to in writing, software
5705
+ * distributed under the License is distributed on an "AS IS" basis,
5706
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5707
+ * See the License for the specific language governing permissions and
5708
+ * limitations under the License.
5709
+ */
5710
+ class VersionService {
5711
+ constructor(http, configService) {
5712
+ this.http = http;
5713
+ this.configService = configService;
5714
+ this.valtimoEndpointUri = configService.config.valtimoApi.endpointUri;
5715
+ }
5716
+ getVersion() {
5717
+ return this.http.get(`${this.valtimoEndpointUri}v1/valtimo/version`);
5718
+ }
5719
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, deps: [{ token: i1$1.HttpClient }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
5720
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, providedIn: 'root' }); }
5721
+ }
5722
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, decorators: [{
5723
+ type: Injectable,
5724
+ args: [{
5725
+ providedIn: 'root',
5726
+ }]
5727
+ }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i1$2.ConfigService }] });
5728
+
5729
+ /*
5730
+ * Copyright 2015-2025 Ritense BV, the Netherlands.
5731
+ *
5732
+ * Licensed under EUPL, Version 1.2 (the "License");
5733
+ * you may not use this file except in compliance with the License.
5734
+ * You may obtain a copy of the License at
5735
+ *
5736
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
5737
+ *
5738
+ * Unless required by applicable law or agreed to in writing, software
5739
+ * distributed under the License is distributed on an "AS IS" basis,
5740
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5741
+ * See the License for the specific language governing permissions and
5742
+ * limitations under the License.
5743
+ */
5744
+ class RightSidebarComponent {
5745
+ onPageClick(targetElement) {
5746
+ combineLatest([this.shellService.panelExpanded$, this.shellService.mouseOnTopBar$])
5747
+ .pipe(take$1(1))
5748
+ .subscribe(([panelExpanded, mouseOnTopBar]) => {
5749
+ const clickedInside = this.elementRef.nativeElement.contains(targetElement) || mouseOnTopBar;
5750
+ if (!clickedInside && panelExpanded) {
5751
+ this.shellService.setPanelExpanded(false);
5752
+ }
5753
+ });
5754
+ }
5755
+ constructor(translateService, userProviderService, formBuilder, versionService, shellService, elementRef, configService, userSettingsService, pageHeaderService, cdsThemeService) {
5756
+ this.translateService = translateService;
5757
+ this.userProviderService = userProviderService;
5758
+ this.formBuilder = formBuilder;
5759
+ this.versionService = versionService;
5760
+ this.shellService = shellService;
5761
+ this.elementRef = elementRef;
5762
+ this.configService = configService;
5763
+ this.userSettingsService = userSettingsService;
5764
+ this.pageHeaderService = pageHeaderService;
5765
+ this.cdsThemeService = cdsThemeService;
5766
+ this.testIds = RIGHT_SIDEBAR_TEST_IDS;
5767
+ this.panelExpanded$ = this.shellService.panelExpanded$;
5768
+ this._selectedLanguage$ = new BehaviorSubject('');
5769
+ this._languageOptions$ = new BehaviorSubject([]);
5770
+ this.languageListItems$ = combineLatest([
5771
+ this._languageOptions$,
5772
+ this._selectedLanguage$,
5773
+ this.translateService.stream('key'),
5774
+ ]).pipe(map$1(([languageOptions, selectedLanguage]) => languageOptions.map(languageKey => ({
5775
+ content: this.translateService.instant('settings.language.options.' + languageKey),
5776
+ key: languageKey,
5777
+ selected: selectedLanguage === languageKey,
5778
+ }))));
5779
+ this.backendVersion$ = this.versionService.getVersion();
5780
+ this.userSubject$ = this.userProviderService.getUserSubject();
5781
+ this.updatingUserSettings$ = new BehaviorSubject(true);
5782
+ this.collapsibleWidescreenMenu$ = this.shellService.collapsibleWidescreenMenu$;
5783
+ this.compactMode$ = this.pageHeaderService.compactMode$;
5784
+ this.showUserNameInTopBar$ = this.pageHeaderService.showUserNameInTopBar$;
5785
+ this._preferredTheme$ = this.cdsThemeService.preferredTheme$;
5786
+ this.showValtimoVersions = true;
5787
+ this.themeOptions$ = combineLatest([
5788
+ this._preferredTheme$,
5789
+ this.translateService.stream('key'),
5790
+ ]).pipe(map$1(([preferredTheme]) => [
5791
+ {
5792
+ content: this.translateService.instant('settings.interface.themes.light'),
5793
+ key: SelectableCarbonTheme.G10,
5794
+ selected: preferredTheme === SelectableCarbonTheme.G10,
5795
+ },
5796
+ {
5797
+ content: this.translateService.instant('settings.interface.themes.dark'),
5798
+ key: SelectableCarbonTheme.G90,
5799
+ selected: preferredTheme === SelectableCarbonTheme.G90,
5800
+ },
5801
+ {
5802
+ content: this.translateService.instant('settings.interface.themes.system'),
5803
+ key: SelectableCarbonTheme.SYSTEM,
5804
+ selected: preferredTheme === SelectableCarbonTheme.SYSTEM,
5805
+ },
5806
+ ]));
5807
+ this.allowUserThemeSwitching$ = this.configService.getFeatureToggleObservable('allowUserThemeSwitching', true);
5808
+ this.enableCompactModeToggle$ = this.configService.getFeatureToggleObservable('enableCompactModeToggle', true);
5809
+ this.enableShowUserNameToggle$ = this.configService.getFeatureToggleObservable('enableUserNameInTopBarToggle');
5810
+ this.showPlantATreeButton$ = this.configService.getFeatureToggleObservable('showPlantATreeButton');
5811
+ this.hideValtimoVersionsForNonAdmins$ = this.configService.getFeatureToggleObservable('hideValtimoVersionsForNonAdmins');
5812
+ this._isAdmin$ = this.userProviderService
5813
+ .getUserSubject()
5814
+ .pipe(map$1(userIdentity => userIdentity?.roles.includes('ROLE_ADMIN')));
5815
+ this._subscriptions = new Subscription();
5816
+ }
5817
+ ngOnInit() {
5818
+ this.initNonToggleSettings();
5819
+ this.initFrontendVersion();
5820
+ this.openShowVersionsSubscription();
5821
+ this.setLanguage();
5822
+ this.getUserSettings();
5823
+ }
5824
+ ngOnDestroy() {
5825
+ this._subscriptions.unsubscribe();
5826
+ }
5827
+ updateUserLanguage(langKey, saveSettings = true) {
5828
+ const langKeyToUse = langKey?.item?.key
5829
+ ? langKey?.item.key
5830
+ : langKey;
5831
+ this.translateService
5832
+ .use(langKeyToUse)
5833
+ .pipe(take$1(1))
5834
+ .subscribe(() => {
5835
+ localStorage.setItem('langKey', langKeyToUse);
5836
+ this._selectedLanguage$.next(langKeyToUse);
5837
+ if (saveSettings) {
5838
+ this.saveUserSettings();
5839
+ }
5840
+ });
5841
+ }
5842
+ setCollapsibleWidescreenMenu(collapsible, saveSettings = true) {
5843
+ this.shellService.setCollapsibleWidescreenMenu(collapsible);
5844
+ if (saveSettings) {
5845
+ this.saveUserSettings();
5846
+ }
5847
+ }
5848
+ setCompactMode(compactMode, saveSettings = true) {
5849
+ this.pageHeaderService.setCompactMode(compactMode);
5850
+ if (saveSettings) {
5851
+ this.saveUserSettings();
5852
+ }
5853
+ }
5854
+ setShowUserName(showUserName, saveSettings = true) {
5855
+ this.pageHeaderService.setShowUserNameInTopBar(showUserName);
5856
+ if (saveSettings) {
5857
+ this.saveUserSettings();
5858
+ }
5859
+ }
5860
+ setPreferredTheme(selectedTheme, saveSettings = true) {
5040
5861
  if (selectedTheme?.item?.key) {
5041
5862
  this.cdsThemeService.setPreferredTheme(selectedTheme.item?.key);
5042
5863
  }
@@ -5349,6 +6170,12 @@ class LeftSidebarComponent {
5349
6170
  event.preventDefault();
5350
6171
  this.overflowMenuSequence$.next('');
5351
6172
  if (!event.ctrlKey && !event.metaKey) {
6173
+ // Custom links may point to an external/absolute URL, which the Angular router cannot
6174
+ // resolve — open those in a new tab instead of attempting (and failing) an internal navigation.
6175
+ if (this.isExternalLink(route)) {
6176
+ window.open(route[0], '_blank', 'noopener');
6177
+ return;
6178
+ }
5352
6179
  this.router.navigate(route, { queryParams: {} });
5353
6180
  combineLatest([
5354
6181
  this.shellService.sideBarExpanded$,
@@ -5375,9 +6202,18 @@ class LeftSidebarComponent {
5375
6202
  });
5376
6203
  }
5377
6204
  openInNewTab(link) {
6205
+ if (this.isExternalLink(link)) {
6206
+ window.open(link[0], '_blank', 'noopener');
6207
+ return;
6208
+ }
5378
6209
  const url = this.router.serializeUrl(this.router.createUrlTree(link || ['/']));
5379
6210
  window.open(url, '_blank');
5380
6211
  }
6212
+ /** A custom link whose first segment is an absolute/external URL (`http(s)://`, `//`, `mailto:`). */
6213
+ isExternalLink(link) {
6214
+ const first = link?.[0] ?? '';
6215
+ return /^(https?:)?\/\//i.test(first) || /^mailto:/i.test(first);
6216
+ }
5381
6217
  openBreakpointSubscription() {
5382
6218
  this._breakpointSubscription = this.breakpointObserver
5383
6219
  .observe(['(max-width: 1055px)', '(min-width: 1056px)'])
@@ -5420,13 +6256,13 @@ class LeftSidebarComponent {
5420
6256
  }
5421
6257
  });
5422
6258
  }
5423
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LeftSidebarComponent, deps: [{ token: i0.ElementRef }, { token: MenuService }, { token: ShellService }, { token: i3.BreakpointObserver }, { token: i1$3.Router }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
6259
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LeftSidebarComponent, deps: [{ token: i0.ElementRef }, { token: MenuService }, { token: ShellService }, { token: i3$1.BreakpointObserver }, { token: i1$3.Router }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
5424
6260
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: LeftSidebarComponent, isStandalone: false, selector: "valtimo-left-sidebar", host: { listeners: { "document:click": "onPageClick($event.target)" } }, viewQueries: [{ propertyName: "toggleButtonRef", first: true, predicate: ["toggleButton"], descendants: true }], 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<cds-sidenav\n *ngIf=\"{\n closestSequence: closestSequence$ | async,\n overflowMenuSequence: overflowMenuSequence$ | async,\n sideBarExpanded: sideBarExpanded$ | async,\n menuItemsLoaded: menuItemsLoaded$ | async,\n menuItems: menuItems$ | async,\n } as obs\"\n [allowExpansion]=\"false\"\n [expanded]=\"obs.sideBarExpanded\"\n>\n <ng-container *ngIf=\"obs.menuItemsLoaded; else loadingTemplate\">\n <ng-container *ngFor=\"let menuItem of obs.menuItems; trackBy: trackByMenuItem\">\n <ng-container *ngIf=\"!menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n menuItem: menuItem,\n closestSequence: obs.closestSequence,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n closestSequence: obs.closestSequence,\n menuItem: menuItem,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n\n <div [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\">\n <ng-container *ngTemplateOutlet=\"subMenuIcon; context: {menuItem: menuItem}\"></ng-container>\n\n <cds-sidenav-menu\n [title]=\"menuItem | menuItemTranslate | async\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n >\n <ng-container\n *ngFor=\"let childMenuItem of menuItem.children; trackBy: trackByMenuItem\"\n >\n <ng-container\n *ngIf=\"{\n disableCaseCount: disableCaseCount$ | async,\n count: childMenuItem?.count$ && (childMenuItem?.count$ | async),\n sequence: '' + menuItem.sequence + '.' + childMenuItem.sequence,\n } as vars\"\n >\n <cds-sidenav-item\n [attr.data-testid]=\"'sidenav-item-' + childMenuItem?.title\"\n [title]=\"\n menuItem.title === 'Cases' || menuItem.title === 'Dossiers'\n ? (childMenuItem | menuItemTranslate | async)\n : null\n \"\n [ngClass]=\"{\n 'cds--side-nav__item--empty': !childMenuItem.link,\n 'menu-item--hidden': childMenuItem.includeFunction !== undefined,\n 'menu-item--visible':\n childMenuItem.includeFunction !== undefined &&\n (includeFunctionObservables[childMenuItem.title] | async),\n }\"\n [active]=\"vars.sequence === obs.closestSequence\"\n [href]=\"vars?.count ? 'javascript:return false;' : 'javascript:void(0);'\"\n (click)=\"navigateToRoute(childMenuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(childMenuItem.link)\"\n >\n <valtimo-menu-item-text\n [accent]=\"!childMenuItem.link\"\n [menuItem]=\"childMenuItem\"\n [showOverFlowMenu]=\"obs.overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(childMenuItem.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n\n <ng-container\n *ngTemplateOutlet=\"countTemplate; context: {count: vars.count, disableCaseCount: vars.disableCaseCount}\"\n ></ng-container>\n </cds-sidenav-item>\n </ng-container>\n </ng-container>\n </cds-sidenav-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n</cds-sidenav>\n\n<ng-template #subMenuIcon let-menuItem=\"menuItem\">\n <div class=\"menu-item-icon-container\"><i class=\"{{ menuItem.iconClass }}\"></i></div>\n</ng-template>\n\n<ng-template\n #topMenuItem\n let-closestSequence=\"closestSequence\"\n let-menuItem=\"menuItem\"\n let-overflowMenuSequence=\"overflowMenuSequence\"\n>\n <ng-container *ngIf=\"{sequence: '' + menuItem.sequence} as vars\"\n ><cds-sidenav-item\n *ngIf=\"!menuItem.children\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\"\n [active]=\"vars.sequence === closestSequence\"\n (click)=\"navigateToRoute(menuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(menuItem.link.link)\"\n href=\"javascript:void(0)\"\n >\n <valtimo-menu-item-text\n [menuItem]=\"menuItem\"\n [showOverFlowMenu]=\"overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(menuItem.link.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n </cds-sidenav-item>\n </ng-container>\n</ng-template>\n\n<ng-template #countTemplate let-count=\"count\" let-disableCaseCount=\"disableCaseCount\">\n <ng-container *ngIf=\"count && !disableCaseCount\">\n <span class=\"case-count\">\n {{ count | caseCount }}\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n", styles: ["@media screen and (max-width:767px){.be-left-sidebar{width:100%!important}}.be-left-sidebar .left-sidebar-toggle{padding:20px}.be-left-sidebar .left-sidebar-toggle:before{font-size:1.615rem}.be-left-sidebar .sidebar-elements>li>a.be-toggle-left-sidebar{height:32px;display:flex;align-items:center}.be-left-sidebar .left-sidebar-content{padding-top:20px}.be-toggle-left-sidebar svg{margin-right:7px;min-width:21px;height:auto;overflow:visible}.be-toggle-left-sidebar svg path{transition:.27s ease;fill:#696969}::ng-deep .resize-border{position:absolute;width:3px;height:100%;top:0;right:0;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9)}::ng-deep .resize-hover{opacity:1}::ng-deep .resize-border--invisible{display:none}.no-transition{transition:none}.d-1{d:path(\"M3 18v-2h13v2z\")}.d-1-flipped{d:path(\"M3 18v-2h11v2z\")}.d-2{d:path(\"M3 13v-2h10v2H3\")}.d-2-flipped{d:path(\"M3 13v-2h12v2H3\")}.d-3{d:path(\"M3 6h13v2H3V6\")}.d-3-flipped{d:path(\"M3 6h11v2H3V6\")}.d-4{d:path(\"M21 15.61L19.59 17l-5.01-5 5.01-5L21 8.39 17.44 12 21 15.61\")}.d-4-flipped{d:path(\"M15.58 15.61L16.99 17 22 12l-5.01-5-1.41 1.39L19.14 12l-3.56 3.61\")}::ng-deep .cds--side-nav__menu{padding-left:0}::ng-deep .cds--side-nav__navigation{border-right:1px solid #e0e0e0;height:100%}::ng-deep .cds--side-nav--ux{width:0}::ng-deep .cds--side-nav--expanded{width:16rem}::ng-deep .cds--side-nav__header-divider{display:none!important}.menu-item-icon-container{position:relative;top:8px;left:13px;height:0}.menu-item-icon-container i{width:0px;height:16px}.menu-item--hidden{display:none}.menu-item--visible{display:block}::ng-deep .cds--side-nav__item--empty{pointer-events:none}::ng-deep .cds--side-nav__item--empty .menu-item-icon-container{display:none}::ng-deep .cds--side-nav__link[href*=\"javascript:return false;\"]{padding-right:3rem!important}.case-count{position:absolute;right:0;padding-right:1rem;height:100%;top:0;display:flex;align-items:center;justify-content:center;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;font-weight:500!important}::ng-deep .cds--side-nav__icon{margin-left:-16px}::ng-deep .cds--side-nav__item.cds--side-nav__item--icon a.cds--side-nav__link{padding-left:3.5rem}::ng-deep .cds--side-nav__submenu-title{padding-right:1.5rem}::ng-deep .cds--side-nav__items{display:flex!important;flex-direction:column!important;overflow:visible!important}::ng-deep .cds--side-nav__navigation{top:3rem;height:calc(100% - 3rem)!important;overflow-x:hidden!important;overflow-y:auto!important}::ng-deep .cds--side-nav__navigation:not(.cds--side-nav--expanded){width:0}.loading-container{display:flex;width:100%;justify-content:center}\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: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MenuItemTextComponent, selector: "valtimo-menu-item-text", inputs: ["menuItem", "accent", "showOverFlowMenu"], outputs: ["overflowMenuClosed", "openInNewTab"] }, { kind: "component", type: i2$3.SideNav, selector: "cds-sidenav, ibm-sidenav", inputs: ["ariaLabel", "expanded", "hidden", "rail", "allowExpansion", "navigationItems", "useRouter"] }, { kind: "component", type: i2$3.SideNavItem, selector: "cds-sidenav-item, ibm-sidenav-item", inputs: ["href", "useRouter", "active", "route", "isSubMenu", "routeExtras", "title"], outputs: ["navigation", "selected"] }, { kind: "component", type: i2$3.SideNavMenu, selector: "cds-sidenav-menu, ibm-sidenav-menu", inputs: ["useRouter", "title", "expanded", "hasActiveChild", "menuItems"] }, { kind: "directive", type: CtrlClickDirective, selector: "[ctrl-click]", outputs: ["ctrl-click"] }, { kind: "component", type: i2$3.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: MenuItemTranslationPipe, name: "menuItemTranslate" }, { kind: "pipe", type: CaseCountPipe, name: "caseCount" }] }); }
5425
6261
  }
5426
6262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LeftSidebarComponent, decorators: [{
5427
6263
  type: Component,
5428
6264
  args: [{ selector: 'valtimo-left-sidebar', standalone: false, 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<cds-sidenav\n *ngIf=\"{\n closestSequence: closestSequence$ | async,\n overflowMenuSequence: overflowMenuSequence$ | async,\n sideBarExpanded: sideBarExpanded$ | async,\n menuItemsLoaded: menuItemsLoaded$ | async,\n menuItems: menuItems$ | async,\n } as obs\"\n [allowExpansion]=\"false\"\n [expanded]=\"obs.sideBarExpanded\"\n>\n <ng-container *ngIf=\"obs.menuItemsLoaded; else loadingTemplate\">\n <ng-container *ngFor=\"let menuItem of obs.menuItems; trackBy: trackByMenuItem\">\n <ng-container *ngIf=\"!menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n menuItem: menuItem,\n closestSequence: obs.closestSequence,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n closestSequence: obs.closestSequence,\n menuItem: menuItem,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n\n <div [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\">\n <ng-container *ngTemplateOutlet=\"subMenuIcon; context: {menuItem: menuItem}\"></ng-container>\n\n <cds-sidenav-menu\n [title]=\"menuItem | menuItemTranslate | async\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n >\n <ng-container\n *ngFor=\"let childMenuItem of menuItem.children; trackBy: trackByMenuItem\"\n >\n <ng-container\n *ngIf=\"{\n disableCaseCount: disableCaseCount$ | async,\n count: childMenuItem?.count$ && (childMenuItem?.count$ | async),\n sequence: '' + menuItem.sequence + '.' + childMenuItem.sequence,\n } as vars\"\n >\n <cds-sidenav-item\n [attr.data-testid]=\"'sidenav-item-' + childMenuItem?.title\"\n [title]=\"\n menuItem.title === 'Cases' || menuItem.title === 'Dossiers'\n ? (childMenuItem | menuItemTranslate | async)\n : null\n \"\n [ngClass]=\"{\n 'cds--side-nav__item--empty': !childMenuItem.link,\n 'menu-item--hidden': childMenuItem.includeFunction !== undefined,\n 'menu-item--visible':\n childMenuItem.includeFunction !== undefined &&\n (includeFunctionObservables[childMenuItem.title] | async),\n }\"\n [active]=\"vars.sequence === obs.closestSequence\"\n [href]=\"vars?.count ? 'javascript:return false;' : 'javascript:void(0);'\"\n (click)=\"navigateToRoute(childMenuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(childMenuItem.link)\"\n >\n <valtimo-menu-item-text\n [accent]=\"!childMenuItem.link\"\n [menuItem]=\"childMenuItem\"\n [showOverFlowMenu]=\"obs.overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(childMenuItem.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n\n <ng-container\n *ngTemplateOutlet=\"countTemplate; context: {count: vars.count, disableCaseCount: vars.disableCaseCount}\"\n ></ng-container>\n </cds-sidenav-item>\n </ng-container>\n </ng-container>\n </cds-sidenav-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n</cds-sidenav>\n\n<ng-template #subMenuIcon let-menuItem=\"menuItem\">\n <div class=\"menu-item-icon-container\"><i class=\"{{ menuItem.iconClass }}\"></i></div>\n</ng-template>\n\n<ng-template\n #topMenuItem\n let-closestSequence=\"closestSequence\"\n let-menuItem=\"menuItem\"\n let-overflowMenuSequence=\"overflowMenuSequence\"\n>\n <ng-container *ngIf=\"{sequence: '' + menuItem.sequence} as vars\"\n ><cds-sidenav-item\n *ngIf=\"!menuItem.children\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\"\n [active]=\"vars.sequence === closestSequence\"\n (click)=\"navigateToRoute(menuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(menuItem.link.link)\"\n href=\"javascript:void(0)\"\n >\n <valtimo-menu-item-text\n [menuItem]=\"menuItem\"\n [showOverFlowMenu]=\"overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(menuItem.link.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n </cds-sidenav-item>\n </ng-container>\n</ng-template>\n\n<ng-template #countTemplate let-count=\"count\" let-disableCaseCount=\"disableCaseCount\">\n <ng-container *ngIf=\"count && !disableCaseCount\">\n <span class=\"case-count\">\n {{ count | caseCount }}\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n", styles: ["@media screen and (max-width:767px){.be-left-sidebar{width:100%!important}}.be-left-sidebar .left-sidebar-toggle{padding:20px}.be-left-sidebar .left-sidebar-toggle:before{font-size:1.615rem}.be-left-sidebar .sidebar-elements>li>a.be-toggle-left-sidebar{height:32px;display:flex;align-items:center}.be-left-sidebar .left-sidebar-content{padding-top:20px}.be-toggle-left-sidebar svg{margin-right:7px;min-width:21px;height:auto;overflow:visible}.be-toggle-left-sidebar svg path{transition:.27s ease;fill:#696969}::ng-deep .resize-border{position:absolute;width:3px;height:100%;top:0;right:0;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9)}::ng-deep .resize-hover{opacity:1}::ng-deep .resize-border--invisible{display:none}.no-transition{transition:none}.d-1{d:path(\"M3 18v-2h13v2z\")}.d-1-flipped{d:path(\"M3 18v-2h11v2z\")}.d-2{d:path(\"M3 13v-2h10v2H3\")}.d-2-flipped{d:path(\"M3 13v-2h12v2H3\")}.d-3{d:path(\"M3 6h13v2H3V6\")}.d-3-flipped{d:path(\"M3 6h11v2H3V6\")}.d-4{d:path(\"M21 15.61L19.59 17l-5.01-5 5.01-5L21 8.39 17.44 12 21 15.61\")}.d-4-flipped{d:path(\"M15.58 15.61L16.99 17 22 12l-5.01-5-1.41 1.39L19.14 12l-3.56 3.61\")}::ng-deep .cds--side-nav__menu{padding-left:0}::ng-deep .cds--side-nav__navigation{border-right:1px solid #e0e0e0;height:100%}::ng-deep .cds--side-nav--ux{width:0}::ng-deep .cds--side-nav--expanded{width:16rem}::ng-deep .cds--side-nav__header-divider{display:none!important}.menu-item-icon-container{position:relative;top:8px;left:13px;height:0}.menu-item-icon-container i{width:0px;height:16px}.menu-item--hidden{display:none}.menu-item--visible{display:block}::ng-deep .cds--side-nav__item--empty{pointer-events:none}::ng-deep .cds--side-nav__item--empty .menu-item-icon-container{display:none}::ng-deep .cds--side-nav__link[href*=\"javascript:return false;\"]{padding-right:3rem!important}.case-count{position:absolute;right:0;padding-right:1rem;height:100%;top:0;display:flex;align-items:center;justify-content:center;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;font-weight:500!important}::ng-deep .cds--side-nav__icon{margin-left:-16px}::ng-deep .cds--side-nav__item.cds--side-nav__item--icon a.cds--side-nav__link{padding-left:3.5rem}::ng-deep .cds--side-nav__submenu-title{padding-right:1.5rem}::ng-deep .cds--side-nav__items{display:flex!important;flex-direction:column!important;overflow:visible!important}::ng-deep .cds--side-nav__navigation{top:3rem;height:calc(100% - 3rem)!important;overflow-x:hidden!important;overflow-y:auto!important}::ng-deep .cds--side-nav__navigation:not(.cds--side-nav--expanded){width:0}.loading-container{display:flex;width:100%;justify-content:center}\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"] }]
5429
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: MenuService }, { type: ShellService }, { type: i3.BreakpointObserver }, { type: i1$3.Router }, { type: i1$2.ConfigService }], propDecorators: { toggleButtonRef: [{
6265
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: MenuService }, { type: ShellService }, { type: i3$1.BreakpointObserver }, { type: i1$3.Router }, { type: i1$2.ConfigService }], propDecorators: { toggleButtonRef: [{
5430
6266
  type: ViewChild,
5431
6267
  args: ['toggleButton']
5432
6268
  }], onPageClick: [{
@@ -7478,11 +8314,11 @@ class CarbonListComponent {
7478
8314
  }
7479
8315
  }
7480
8316
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonListComponent, deps: [{ token: EllipsisPipe }, { token: CarbonListFilterPipe }, { token: i2$3.IconService }, { token: i4.NGXLogger }, { token: i1.TranslateService }, { token: ViewContentService }, { token: KeyStateService }, { token: CarbonListDragAndDropService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
7481
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonListComponent, isStandalone: false, selector: "valtimo-carbon-list", inputs: { items: "items", fields: "fields", tableTranslations: "tableTranslations", paginatorConfig: "paginatorConfig", pagination: "pagination", loading: "loading", skeletonRowCount: "skeletonRowCount", actions: "actions", actionItems: "actionItems", showActionItems: "showActionItems", header: "header", hideColumnHeader: "hideColumnHeader", initialSortState: "initialSortState", sortState: "sortState", isSearchable: "isSearchable", initialSearchValue: "initialSearchValue", searchDebounceMs: "searchDebounceMs", invalidSearchFields: "invalidSearchFields", searchFields: "searchFields", enableSingleSelection: "enableSingleSelection", lastColumnTemplate: "lastColumnTemplate", paginationIdentifier: "paginationIdentifier", showSelectionColumn: "showSelectionColumn", striped: "striped", hideToolbar: "hideToolbar", lockedTooltipTranslationKey: "lockedTooltipTranslationKey", movingRowsEnabled: "movingRowsEnabled", dragAndDrop: "dragAndDrop", dragAndDropDisabled: "dragAndDropDisabled", expandedRowTemplate: "expandedRowTemplate", expandedRowKey: "expandedRowKey", trackByKey: "trackByKey" }, outputs: { rowClicked: "rowClicked", paginationClicked: "paginationClicked", paginationSet: "paginationSet", search: "search", sortChanged: "sortChanged", moveRow: "moveRow", itemsReordered: "itemsReordered" }, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], viewQueries: [{ propertyName: "actionsMenuTemplate", first: true, predicate: ["actionsMenuTemplate"], descendants: true }, { propertyName: "actionTemplate", first: true, predicate: ["actionTemplate"], descendants: true }, { propertyName: "booleanTemplate", first: true, predicate: ["booleanTemplate"], descendants: true }, { propertyName: "moveRowsTemplate", first: true, predicate: ["moveRowsTemplate"], descendants: true }, { propertyName: "dragAndDropTemplate", first: true, predicate: ["dragAndDropTemplate"], descendants: true }, { propertyName: "rowDisabled", first: true, predicate: ["rowDisabled"], descendants: true }, { propertyName: "tagTemplate", first: true, predicate: ["tagTemplate"], descendants: true }, { propertyName: "defaultTemplate", first: true, predicate: ["defaultTemplate"], descendants: true }, { propertyName: "_table", first: true, predicate: Table, descendants: true }], ngImport: i0, template: "<!--\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 -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n [portalToBody]=\"true\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\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: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i2$3.Pagination, selector: "cds-pagination, ibm-pagination", inputs: ["skeleton", "model", "disabled", "pageInputDisabled", "showPageInput", "pagesUnknown", "pageSelectThreshold", "translations", "itemsPerPageOptions"], outputs: ["selectPage"] }, { kind: "component", type: i2$3.TableToolbar, selector: "cds-table-toolbar, ibm-table-toolbar", inputs: ["model", "batchText", "ariaLabel", "cancelText", "size"], outputs: ["cancel"] }, { kind: "component", type: i2$3.TableContainer, selector: "cds-table-container, ibm-table-container" }, { kind: "component", type: i2$3.TableHeader, selector: "cds-table-header, ibm-table-header" }, { kind: "component", type: i2$3.TableToolbarActions, selector: "cds-table-toolbar-actions, ibm-table-toolbar-actions" }, { kind: "component", type: i2$3.TableToolbarSearch, selector: "cds-table-toolbar-search, ibm-table-toolbar-search" }, { kind: "component", type: i2$3.TableToolbarContent, selector: "cds-table-toolbar-content, ibm-table-toolbar-content" }, { kind: "component", type: i2$3.Table, selector: "cds-table, ibm-table", inputs: ["ariaLabelledby", "ariaDescribedby", "model", "size", "skeleton", "isDataGrid", "sortable", "noBorder", "showExpandAllToggle", "showSelectionColumn", "enableSingleSelect", "scrollLoadDistance", "expandButtonAriaLabel", "sortDescendingLabel", "sortAscendingLabel", "translations", "striped", "stickyHeader", "footerTemplate", "selectionLabelColumn"], outputs: ["sort", "selectAll", "deselectAll", "selectRow", "deselectRow", "rowClick", "scrollLoad"] }, { kind: "component", type: i2$3.TableBody, selector: "[cdsTableBody], [ibmTableBody]", inputs: ["model", "enableSingleSelect", "expandButtonAriaLabel", "checkboxRowLabel", "showSelectionColumn", "size", "selectionLabelColumn", "skeleton"], outputs: ["selectRow", "deselectRow", "rowClick"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i11.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2$3.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }, { kind: "component", type: OverflowMenuOptionComponent, selector: "v-overflow-menu-option", inputs: ["disabled", "type", "testId", "optionId"], outputs: ["selected"] }, { kind: "component", type: OverflowMenuTriggerComponent, selector: "v-overflow-menu-trigger", inputs: ["compact", "label"] }, { kind: "component", type: CarbonTagsModalComponent, selector: "valtimo-tags-modal", inputs: ["open", "tags"], outputs: ["closeEvent"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionItemDisabledPipe, name: "actionItemDisabled" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8317
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonListComponent, isStandalone: false, selector: "valtimo-carbon-list", inputs: { items: "items", fields: "fields", tableTranslations: "tableTranslations", paginatorConfig: "paginatorConfig", pagination: "pagination", loading: "loading", skeletonRowCount: "skeletonRowCount", actions: "actions", actionItems: "actionItems", showActionItems: "showActionItems", header: "header", hideColumnHeader: "hideColumnHeader", initialSortState: "initialSortState", sortState: "sortState", isSearchable: "isSearchable", initialSearchValue: "initialSearchValue", searchDebounceMs: "searchDebounceMs", invalidSearchFields: "invalidSearchFields", searchFields: "searchFields", enableSingleSelection: "enableSingleSelection", lastColumnTemplate: "lastColumnTemplate", paginationIdentifier: "paginationIdentifier", showSelectionColumn: "showSelectionColumn", striped: "striped", hideToolbar: "hideToolbar", lockedTooltipTranslationKey: "lockedTooltipTranslationKey", movingRowsEnabled: "movingRowsEnabled", dragAndDrop: "dragAndDrop", dragAndDropDisabled: "dragAndDropDisabled", expandedRowTemplate: "expandedRowTemplate", expandedRowKey: "expandedRowKey", trackByKey: "trackByKey" }, outputs: { rowClicked: "rowClicked", paginationClicked: "paginationClicked", paginationSet: "paginationSet", search: "search", sortChanged: "sortChanged", moveRow: "moveRow", itemsReordered: "itemsReordered" }, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], viewQueries: [{ propertyName: "actionsMenuTemplate", first: true, predicate: ["actionsMenuTemplate"], descendants: true }, { propertyName: "actionTemplate", first: true, predicate: ["actionTemplate"], descendants: true }, { propertyName: "booleanTemplate", first: true, predicate: ["booleanTemplate"], descendants: true }, { propertyName: "moveRowsTemplate", first: true, predicate: ["moveRowsTemplate"], descendants: true }, { propertyName: "dragAndDropTemplate", first: true, predicate: ["dragAndDropTemplate"], descendants: true }, { propertyName: "rowDisabled", first: true, predicate: ["rowDisabled"], descendants: true }, { propertyName: "tagTemplate", first: true, predicate: ["tagTemplate"], descendants: true }, { propertyName: "defaultTemplate", first: true, predicate: ["defaultTemplate"], descendants: true }, { propertyName: "_table", first: true, predicate: Table, descendants: true }], ngImport: i0, template: "<!--\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 -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n [portalToBody]=\"true\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n [portalToBody]=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\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: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i2$3.Pagination, selector: "cds-pagination, ibm-pagination", inputs: ["skeleton", "model", "disabled", "pageInputDisabled", "showPageInput", "pagesUnknown", "pageSelectThreshold", "translations", "itemsPerPageOptions"], outputs: ["selectPage"] }, { kind: "component", type: i2$3.TableToolbar, selector: "cds-table-toolbar, ibm-table-toolbar", inputs: ["model", "batchText", "ariaLabel", "cancelText", "size"], outputs: ["cancel"] }, { kind: "component", type: i2$3.TableContainer, selector: "cds-table-container, ibm-table-container" }, { kind: "component", type: i2$3.TableHeader, selector: "cds-table-header, ibm-table-header" }, { kind: "component", type: i2$3.TableToolbarActions, selector: "cds-table-toolbar-actions, ibm-table-toolbar-actions" }, { kind: "component", type: i2$3.TableToolbarSearch, selector: "cds-table-toolbar-search, ibm-table-toolbar-search" }, { kind: "component", type: i2$3.TableToolbarContent, selector: "cds-table-toolbar-content, ibm-table-toolbar-content" }, { kind: "component", type: i2$3.Table, selector: "cds-table, ibm-table", inputs: ["ariaLabelledby", "ariaDescribedby", "model", "size", "skeleton", "isDataGrid", "sortable", "noBorder", "showExpandAllToggle", "showSelectionColumn", "enableSingleSelect", "scrollLoadDistance", "expandButtonAriaLabel", "sortDescendingLabel", "sortAscendingLabel", "translations", "striped", "stickyHeader", "footerTemplate", "selectionLabelColumn"], outputs: ["sort", "selectAll", "deselectAll", "selectRow", "deselectRow", "rowClick", "scrollLoad"] }, { kind: "component", type: i2$3.TableBody, selector: "[cdsTableBody], [ibmTableBody]", inputs: ["model", "enableSingleSelect", "expandButtonAriaLabel", "checkboxRowLabel", "showSelectionColumn", "size", "selectionLabelColumn", "skeleton"], outputs: ["selectRow", "deselectRow", "rowClick"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i11.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2$3.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }, { kind: "component", type: OverflowMenuOptionComponent, selector: "v-overflow-menu-option", inputs: ["disabled", "type", "testId", "optionId"], outputs: ["selected"] }, { kind: "component", type: OverflowMenuTriggerComponent, selector: "v-overflow-menu-trigger", inputs: ["compact", "label"] }, { kind: "component", type: CarbonTagsModalComponent, selector: "valtimo-tags-modal", inputs: ["open", "tags"], outputs: ["closeEvent"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionItemDisabledPipe, name: "actionItemDisabled" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7482
8318
  }
7483
8319
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonListComponent, decorators: [{
7484
8320
  type: Component,
7485
- args: [{ selector: 'valtimo-carbon-list', changeDetection: ChangeDetectionStrategy.OnPush, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], standalone: false, template: "<!--\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 -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n [portalToBody]=\"true\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\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"] }]
8321
+ args: [{ selector: 'valtimo-carbon-list', changeDetection: ChangeDetectionStrategy.OnPush, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], standalone: false, template: "<!--\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 -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n [portalToBody]=\"true\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n [portalToBody]=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\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"] }]
7486
8322
  }], ctorParameters: () => [{ type: EllipsisPipe }, { type: CarbonListFilterPipe }, { type: i2$3.IconService }, { type: i4.NGXLogger }, { type: i1.TranslateService }, { type: ViewContentService }, { type: KeyStateService }, { type: CarbonListDragAndDropService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { actionsMenuTemplate: [{
7487
8323
  type: ViewChild,
7488
8324
  args: ['actionsMenuTemplate']
@@ -9661,7 +10497,7 @@ class FormioComponent {
9661
10497
  const formioTranslations = this.translateService.instant('formioTranslations');
9662
10498
  const defaultOptions = {
9663
10499
  ...options,
9664
- ...(formioTranslations === 'object' && {
10500
+ ...(typeof formioTranslations === 'object' && {
9665
10501
  i18n: {
9666
10502
  [language]: this.stateService.flattenTranslationsObject(formioTranslations),
9667
10503
  },
@@ -9669,6 +10505,8 @@ class FormioComponent {
9669
10505
  };
9670
10506
  return deepmerge(defaultOptions, overrideOptions);
9671
10507
  }), distinctUntilChanged((prev, curr) => isEqual(prev, curr)), tap$1(options => this.logger.debug('Form.IO options used', options)));
10508
+ // Only renderOptions reaches form.io itself; getRendererOptions() drops everything else.
10509
+ this.renderOptions$ = this.currentLanguage$.pipe(map$1(language => ({ language })));
9672
10510
  this._storeTokenInLocalStorage = !this.configService.getFeatureToggle('disableFormioTokenInLocalStorage');
9673
10511
  this._inMemoryTokenSet$ = new BehaviorSubject(false);
9674
10512
  // The form is only rendered once a token is available. In the default (legacy) mode the token
@@ -9807,11 +10645,11 @@ class FormioComponent {
9807
10645
  this._overrideOptions$.next(config.formioOptions);
9808
10646
  }
9809
10647
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormioComponent, deps: [{ token: i6$1.UserProviderService }, { token: i4.NGXLogger }, { token: FormIoStateService }, { token: i1$3.ActivatedRoute }, { token: i1.TranslateService }, { token: FormIoLocalStorageService }, { token: ValtimoModalService }, { token: i1$2.ConfigService }, { token: FormIoTagsService }, { token: i0.Injector }, { token: FormioTranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
9810
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormioComponent, isStandalone: false, selector: "valtimo-form-io", inputs: { options: "options", submission: "submission", form: "form", readOnly: "readOnly", errors: "errors", formRefresh$: "formRefresh$" }, outputs: { submit: "submit", change: "change", event: "event" }, host: { listeners: { "window:beforeunload": "handleBeforeUnload($event)" } }, providers: [FormIoLocalStorageService], usesOnChanges: true, 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<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.FormioComponent, selector: "formio" }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }] }); }
10648
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormioComponent, isStandalone: false, selector: "valtimo-form-io", inputs: { options: "options", submission: "submission", form: "form", readOnly: "readOnly", errors: "errors", formRefresh$: "formRefresh$" }, outputs: { submit: "submit", change: "change", event: "event" }, host: { listeners: { "window:beforeunload": "handleBeforeUnload($event)" } }, providers: [FormIoLocalStorageService], usesOnChanges: true, 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<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n renderOptions: renderOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [renderOptions]=\"obs.renderOptions\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.FormioComponent, selector: "formio" }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }] }); }
9811
10649
  }
9812
10650
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormioComponent, decorators: [{
9813
10651
  type: Component,
9814
- args: [{ selector: 'valtimo-form-io', providers: [FormIoLocalStorageService], standalone: false, 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<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n" }]
10652
+ args: [{ selector: 'valtimo-form-io', providers: [FormIoLocalStorageService], standalone: false, 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<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n renderOptions: renderOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [renderOptions]=\"obs.renderOptions\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n" }]
9815
10653
  }], ctorParameters: () => [{ type: i6$1.UserProviderService }, { type: i4.NGXLogger }, { type: FormIoStateService }, { type: i1$3.ActivatedRoute }, { type: i1.TranslateService }, { type: FormIoLocalStorageService }, { type: ValtimoModalService }, { type: i1$2.ConfigService }, { type: FormIoTagsService }, { type: i0.Injector }, { type: FormioTranslationService }], propDecorators: { options: [{
9816
10654
  type: Input
9817
10655
  }], submission: [{
@@ -9952,7 +10790,8 @@ class FormioBuilderComponent {
9952
10790
  const formioTranslations = this.translateService.instant('formioTranslations');
9953
10791
  const defaultOptions = {
9954
10792
  ...options,
9955
- ...(formioTranslations === 'object' && {
10793
+ language,
10794
+ ...(typeof formioTranslations === 'object' && {
9956
10795
  i18n: {
9957
10796
  [language]: this.stateService.flattenTranslationsObject(formioTranslations),
9958
10797
  },
@@ -11202,13 +12041,20 @@ class ValuePathSelectorComponent {
11202
12041
  this.onPathSelected(mappedOption);
11203
12042
  return mappedOption;
11204
12043
  });
11205
- }), tap(() => this.loadingValuePathItems$.next(false)));
12044
+ }), tap(() => {
12045
+ this.loadingValuePathItems$.next(false);
12046
+ this.scheduleDisplayFlush();
12047
+ }));
11206
12048
  this._subscriptions = new Subscription();
12049
+ this._destroyed = false;
11207
12050
  }
11208
12051
  ngOnInit() {
11209
12052
  this._subscriptions.add(this._selectedPath$.subscribe(path => this.valueChangeEvent.emit(path)));
11210
12053
  }
11211
12054
  ngOnDestroy() {
12055
+ this._destroyed = true;
12056
+ if (this._displayFlushTimeoutId !== undefined)
12057
+ clearTimeout(this._displayFlushTimeoutId);
11212
12058
  this._subscriptions.unsubscribe();
11213
12059
  }
11214
12060
  writeValue(value) {
@@ -11217,6 +12063,28 @@ class ValuePathSelectorComponent {
11217
12063
  this._inputMode$.next(ValuePathSelectorInputMode.DROPDOWN);
11218
12064
  this.clearComboBoxSearch();
11219
12065
  }
12066
+ this.scheduleDisplayFlush();
12067
+ }
12068
+ /**
12069
+ * The Carbon combobox computes its displayed value asynchronously after receiving items with a
12070
+ * `selected` entry. Under an OnPush ancestor that is not marked dirty, neither the items binding
12071
+ * nor Carbon's internal display update is ever flushed to the DOM, so the control's state is
12072
+ * correct while its input renders empty until the user interacts. Flush in two passes after
12073
+ * every options emission or written value: the first detectChanges renders the emission into the
12074
+ * combobox (which then schedules its internal update), the nested one flushes that update.
12075
+ */
12076
+ scheduleDisplayFlush() {
12077
+ if (this._displayFlushTimeoutId !== undefined)
12078
+ clearTimeout(this._displayFlushTimeoutId);
12079
+ this._displayFlushTimeoutId = setTimeout(() => {
12080
+ if (this._destroyed)
12081
+ return;
12082
+ this.changeDetectorRef.detectChanges();
12083
+ this._displayFlushTimeoutId = setTimeout(() => {
12084
+ if (!this._destroyed)
12085
+ this.changeDetectorRef.detectChanges();
12086
+ });
12087
+ });
11220
12088
  }
11221
12089
  registerOnChange(fn) {
11222
12090
  this._onChangeFunction = fn;
@@ -11308,7 +12176,7 @@ class ValuePathSelectorComponent {
11308
12176
  }
11309
12177
  return null;
11310
12178
  }
11311
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ValuePathSelectorComponent, deps: [{ token: ValuePathSelectorService }, { token: i2.FormBuilder }, { token: i3$1.DocumentService }, { token: i1$3.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
12179
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ValuePathSelectorComponent, deps: [{ token: ValuePathSelectorService }, { token: i2.FormBuilder }, { token: i3$2.DocumentService }, { token: i1$3.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
11312
12180
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: ValuePathSelectorComponent, isStandalone: true, selector: "valtimo-value-path-selector", inputs: { name: "name", appendInline: "appendInline", margin: "margin", marginLg: "marginLg", marginXl: "marginXl", disabled: "disabled", caseDefinitionKey: "caseDefinitionKey", caseDefinitionVersionTag: "caseDefinitionVersionTag", buildingBlockDefinitionKey: "buildingBlockDefinitionKey", buildingBlockDefinitionVersionTag: "buildingBlockDefinitionVersionTag", prefixes: "prefixes", excludePrefixes: "excludePrefixes", label: "label", tooltip: "tooltip", required: "required", showCaseDefinitionSelector: "showCaseDefinitionSelector", notation: "notation", dropUp: "dropUp", defaultValue: "defaultValue", type: "type", parentItem: "parentItem", filterItems: "filterItems" }, outputs: { valueChangeEvent: "valueChangeEvent", collectionSelected: "collectionSelected" }, host: { listeners: { "focusout": "onBlur()" }, properties: { "class.value-path-selector--margin-bottom": "this._showMargin", "class.value-path-selector--margin-bottom-lg": "this._showMarginLg", "class.value-path-selector--margin-bottom-xl": "this._showMarginXl" } }, providers: [
11313
12181
  {
11314
12182
  provide: NG_VALUE_ACCESSOR,
@@ -11337,7 +12205,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
11337
12205
  useExisting: forwardRef(() => ValuePathSelectorComponent),
11338
12206
  },
11339
12207
  ], 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<ng-container\n *ngIf=\"{\n inputModeIsDropdown: inputModeIsDropdown$ | async,\n valuePathListItems: valuePathListItems$ | async,\n loadingValuePathItems: loadingValuePathItems$ | async,\n disabled: disabled$ | async,\n showToggle: showToggle$ | async,\n } as obs\"\n>\n <v-input-label *ngIf=\"!!label\" [required]=\"required\" [title]=\"label\" [tooltip]=\"tooltip\">\n </v-input-label>\n\n <form\n [formGroup]=\"formGroup\"\n [ngClass]=\"{\n 'value-path-selector__form--case-def-input':\n showCaseDefinitionSelector && obs.inputModeIsDropdown && !obs.showToggle,\n }\"\n class=\"value-path-selector__form\"\n >\n <cds-toggle\n *ngIf=\"obs.showToggle\"\n [attr.data-test-id]=\"testIds.toggle\"\n size=\"sm\"\n [disabled]=\"obs.disabled\"\n [onText]=\"'valuePathSelector.dropdown' | translate\"\n [offText]=\"'valuePathSelector.manual' | translate\"\n [checked]=\"obs.inputModeIsDropdown\"\n (checkedChange)=\"onInputModeChange($event)\"\n ></cds-toggle>\n\n @if (obs.inputModeIsDropdown && obs.showToggle) {\n <cds-combo-box\n [attr.data-test-id]=\"testIds.path\"\n [appendInline]=\"appendInline\"\n [disabled]=\"\n obs.disabled ||\n obs.loadingValuePathItems ||\n !obs.valuePathListItems ||\n (obs.valuePathListItems || []).length === 0\n \"\n [dropUp]=\"dropUp\"\n (selected)=\"onPathSelected($event)\"\n (clear)=\"onPathCleared()\"\n [placeholder]=\"'valuePathSelector.placeholder' | translate\"\n >\n <cds-dropdown-list [items]=\"obs.valuePathListItems || []\"></cds-dropdown-list>\n </cds-combo-box>\n } @else {\n <input\n [attr.data-test-id]=\"testIds.input\"\n cdsText\n type=\"text\"\n formControlName=\"selectedPath\"\n />\n }\n </form>\n</ng-container>\n", styles: [":host{width:100%;display:flex;flex-direction:column}::ng-deep .value-path-selector--margin-bottom{margin-bottom:16px}::ng-deep .value-path-selector--margin-bottom-lg{margin-bottom:24px}::ng-deep .value-path-selector--margin-bottom-xl{margin-bottom:34px}.value-path-selector__form{display:flex;width:100%;align-items:center;gap:16px}::ng-deep .value-path-selector__form--case-def-input{display:flex!important}.value-path-selector__form ::ng-deep cds-dropdown,.value-path-selector__form ::ng-deep cds-combo-box{width:100%;min-width:0}.value-path-selector__form ::ng-deep .cds--toggle__label-text{display:none}.value-path-selector__form ::ng-deep .cds--toggle__label{display:flex}\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"] }]
11340
- }], ctorParameters: () => [{ type: ValuePathSelectorService }, { type: i2.FormBuilder }, { type: i3$1.DocumentService }, { type: i1$3.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { _showMargin: [{
12208
+ }], ctorParameters: () => [{ type: ValuePathSelectorService }, { type: i2.FormBuilder }, { type: i3$2.DocumentService }, { type: i1$3.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { _showMargin: [{
11341
12209
  type: HostBinding,
11342
12210
  args: ['class.value-path-selector--margin-bottom']
11343
12211
  }], _showMarginLg: [{
@@ -13493,6 +14361,7 @@ class SelectComponent {
13493
14361
  content: translated,
13494
14362
  };
13495
14363
  })));
14364
+ this._destroyed = false;
13496
14365
  this._onChange = () => { };
13497
14366
  this._onTouched = () => { };
13498
14367
  }
@@ -13500,17 +14369,10 @@ class SelectComponent {
13500
14369
  this.setDefaultSelection();
13501
14370
  this.openSelectedSubscription();
13502
14371
  this.openClearSubjectSubscription();
14372
+ this.openDisplayFlushSubscription();
13503
14373
  }
13504
14374
  ngAfterViewInit() {
13505
- // The underlying Carbon combobox computes its displayed value asynchronously, in a setTimeout
13506
- // scheduled during its own view initialization. When this component lives under an OnPush
13507
- // ancestor that is not marked dirty, that update is never flushed to the DOM, so a preselected
13508
- // value only becomes visible after the user interacts with the control. Because this setTimeout
13509
- // is scheduled after the combobox's (lifecycle hooks of child views run first), it runs once
13510
- // the combobox has set its display value, and detectChanges() flushes it to the DOM. A
13511
- // setTimeout is used instead of NgZone.onStable so the flush also works in apps with
13512
- // long-running background tasks that keep the zone from ever stabilizing.
13513
- this._displayFlushTimeoutId = setTimeout(() => this.changeDetectorRef.detectChanges());
14375
+ this.scheduleDisplayFlush();
13514
14376
  }
13515
14377
  ngOnChanges(changes) {
13516
14378
  if (changes?.items?.currentValue ||
@@ -13521,8 +14383,10 @@ class SelectComponent {
13521
14383
  }
13522
14384
  }
13523
14385
  ngOnDestroy() {
14386
+ this._destroyed = true;
13524
14387
  this._selectedSubscription?.unsubscribe();
13525
14388
  this._clearSubjectSubscription?.unsubscribe();
14389
+ this._displayFlushSubscription?.unsubscribe();
13526
14390
  if (this._displayFlushTimeoutId !== undefined)
13527
14391
  clearTimeout(this._displayFlushTimeoutId);
13528
14392
  }
@@ -13589,6 +14453,35 @@ class SelectComponent {
13589
14453
  });
13590
14454
  }
13591
14455
  }
14456
+ /**
14457
+ * The underlying Carbon combobox computes its displayed value asynchronously, in a setTimeout it
14458
+ * schedules while processing an items change. When this component lives under an OnPush ancestor
14459
+ * that is not marked dirty, that update is never flushed to the DOM, so a (pre)selected value
14460
+ * only becomes visible after the user interacts with the control. This applies to every items or
14461
+ * selection change — not only the first render: a value written or items arriving after view
14462
+ * init (prefill, late-loaded options, wizard step switches) hit the same race. Hence a flush is
14463
+ * scheduled on every emission, in two passes: the first detectChanges renders the emission into
14464
+ * the combobox (which then schedules its own internal display update), the nested one flushes
14465
+ * that internal update — covering both orderings of the competing timeouts. setTimeout is used
14466
+ * instead of NgZone.onStable so the flush also works in apps with long-running background tasks
14467
+ * that keep the zone from ever stabilizing.
14468
+ */
14469
+ openDisplayFlushSubscription() {
14470
+ this._displayFlushSubscription = combineLatest([this._listItems$, this.selected$]).subscribe(() => this.scheduleDisplayFlush());
14471
+ }
14472
+ scheduleDisplayFlush() {
14473
+ if (this._displayFlushTimeoutId !== undefined)
14474
+ clearTimeout(this._displayFlushTimeoutId);
14475
+ this._displayFlushTimeoutId = setTimeout(() => {
14476
+ if (this._destroyed)
14477
+ return;
14478
+ this.changeDetectorRef.detectChanges();
14479
+ this._displayFlushTimeoutId = setTimeout(() => {
14480
+ if (!this._destroyed)
14481
+ this.changeDetectorRef.detectChanges();
14482
+ });
14483
+ });
14484
+ }
13592
14485
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SelectComponent, deps: [{ token: i1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
13593
14486
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: SelectComponent, isStandalone: false, selector: "v-select", inputs: { items: "items", defaultSelection: "defaultSelection", defaultSelectionId: "defaultSelectionId", defaultSelectionIds: "defaultSelectionIds", disabled: "disabled", dropUp: "dropUp", invalid: "invalid", multiple: "multiple", margin: "margin", widthInPx: "widthInPx", notFoundText: "notFoundText", clearAllText: "clearAllText", clearText: "clearText", clearable: "clearable", name: "name", title: "title", titleTranslationKey: "titleTranslationKey", clearSelectionSubject$: "clearSelectionSubject$", tooltip: "tooltip", required: "required", loading: "loading", loadingText: "loadingText", placeholder: "placeholder", smallMargin: "smallMargin", carbonTheme: "carbonTheme", appendInline: "appendInline", warn: "warn", warnText: "warnText", dataTestId: "dataTestId" }, outputs: { selectedChange: "selectedChange" }, providers: [
13594
14487
  {
@@ -15174,6 +16067,12 @@ class CarbonMultiInputComponent {
15174
16067
  this.addButtonType = 'primary';
15175
16068
  this.addRowTranslationKey = '';
15176
16069
  this._defaultValues$ = new BehaviorSubject([]);
16070
+ /**
16071
+ * Carbon paints a danger button red in its resting state. A form with one delete button per row
16072
+ * can therefore read as a form full of errors, which 'danger--ghost' avoids without giving up the
16073
+ * destructive styling on hover.
16074
+ */
16075
+ this.deleteButtonType = 'danger';
15177
16076
  this.deleteRowText = '';
15178
16077
  this.deleteRowTranslationKey = '';
15179
16078
  this.$disabled = signal(false);
@@ -15385,13 +16284,13 @@ class CarbonMultiInputComponent {
15385
16284
  }));
15386
16285
  }
15387
16286
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonMultiInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15388
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonMultiInputComponent, isStandalone: false, selector: "valtimo-carbon-multi-input", inputs: { addRowText: "addRowText", addButtonType: "addButtonType", addRowTranslationKey: "addRowTranslationKey", arbitraryAmountTitles: "arbitraryAmountTitles", arbitraryValueAmount: "arbitraryValueAmount", defaultValues: "defaultValues", deleteRowText: "deleteRowText", deleteRowTranslationKey: "deleteRowTranslationKey", disabled: "disabled", dropdownColumnTitle: "dropdownColumnTitle", dropdownItems: "dropdownItems", dropdownWidth: "dropdownWidth", fullWidth: "fullWidth", hideAddButton: "hideAddButton", hideDeleteButton: "hideDeleteButton", initialAmountOfRows: "initialAmountOfRows", keyColumnTitle: "keyColumnTitle", margin: "margin", maxRows: "maxRows", minimumAmountOfRows: "minimumAmountOfRows", name: "name", required: "required", title: "title", titleTranslationKey: "titleTranslationKey", tooltip: "tooltip", type: "type", valueColumnTitle: "valueColumnTitle", valuePathSelectorCaseDefinitionKey: "valuePathSelectorCaseDefinitionKey", valuePathSelectorPrefixes: "valuePathSelectorPrefixes", valuePathSelectorShowCaseDefinitionSelector: "valuePathSelectorShowCaseDefinitionSelector", valuePathSelectorNotation: "valuePathSelectorNotation", keyColumnFlex: "keyColumnFlex", dropdownColumnFlex: "dropdownColumnFlex", valueColumnFlex: "valueColumnFlex" }, outputs: { valueChange: "valueChange", allValuesValidEvent: "allValuesValidEvent" }, providers: [
16287
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonMultiInputComponent, isStandalone: false, selector: "valtimo-carbon-multi-input", inputs: { addRowText: "addRowText", addButtonType: "addButtonType", addRowTranslationKey: "addRowTranslationKey", arbitraryAmountTitles: "arbitraryAmountTitles", arbitraryValueAmount: "arbitraryValueAmount", defaultValues: "defaultValues", deleteButtonType: "deleteButtonType", deleteRowText: "deleteRowText", deleteRowTranslationKey: "deleteRowTranslationKey", disabled: "disabled", dropdownColumnTitle: "dropdownColumnTitle", dropdownItems: "dropdownItems", dropdownWidth: "dropdownWidth", fullWidth: "fullWidth", hideAddButton: "hideAddButton", hideDeleteButton: "hideDeleteButton", initialAmountOfRows: "initialAmountOfRows", keyColumnTitle: "keyColumnTitle", margin: "margin", maxRows: "maxRows", minimumAmountOfRows: "minimumAmountOfRows", name: "name", required: "required", title: "title", titleTranslationKey: "titleTranslationKey", tooltip: "tooltip", type: "type", valueColumnTitle: "valueColumnTitle", valuePathSelectorCaseDefinitionKey: "valuePathSelectorCaseDefinitionKey", valuePathSelectorPrefixes: "valuePathSelectorPrefixes", valuePathSelectorShowCaseDefinitionSelector: "valuePathSelectorShowCaseDefinitionSelector", valuePathSelectorNotation: "valuePathSelectorNotation", keyColumnFlex: "keyColumnFlex", dropdownColumnFlex: "dropdownColumnFlex", valueColumnFlex: "valueColumnFlex" }, outputs: { valueChange: "valueChange", allValuesValidEvent: "allValuesValidEvent" }, providers: [
15389
16288
  {
15390
16289
  provide: NG_VALUE_ACCESSOR,
15391
16290
  useExisting: forwardRef(() => CarbonMultiInputComponent),
15392
16291
  multi: true,
15393
16292
  },
15394
- ], 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<div\n *ngIf=\"{\n addRowText:\n addRowText || addRowTranslationKey\n ? addRowTranslationKey\n ? (addRowTranslationKey | translate)\n : addRowText\n : ('interface.addRow' | translate),\n deleteRowText:\n deleteRowText || deleteRowTranslationKey\n ? deleteRowTranslationKey\n ? (deleteRowTranslationKey | translate)\n : deleteRowText\n : ('interface.deleteRow' | translate),\n } as vars\"\n [ngClass]=\"{'v-multi-input--margin': margin, 'v-multi-input--no-delete-button': hideDeleteButton}\"\n class=\"v-multi-input\"\n>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [name]=\"name\"\n [required]=\"required\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [title]=\"title\"\n [tooltip]=\"tooltip\"\n >\n </v-input-label>\n\n <div class=\"v-multi-input__rows\">\n <div\n *ngFor=\"let value of values$ | async as values; trackBy: trackByFn; index as i\"\n class=\"v-multi-input__row\"\n >\n @switch (type) {\n @case ('value') {\n <valtimo-single-value\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, 'value')\"\n ></valtimo-single-value>\n }\n @case ('keyValue') {\n <valtimo-key-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value>\n }\n @case ('keyDropdownValue') {\n <valtimo-key-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-dropdown-value>\n }\n @case ('arbitraryAmount') {\n <valtimo-arbitrary-amount-value\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [arbitraryAmountTitles]=\"arbitraryAmountTitles\"\n [amountOfArbitraryValuesArray$]=\"amountOfArbitraryValuesArray$\"\n (valueChange)=\"\n onValueChange($event.value, $event.inputValue, $event.type, $event.arbitraryIndex)\n \"\n ></valtimo-arbitrary-amount-value>\n }\n @case ('keyValuePathSelector') {\n <valtimo-key-value-path-selector\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value-path-selector>\n }\n @case ('valuePathSelectorValue') {\n <valtimo-value-path-selector-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorValue-' + i\"\n ></valtimo-value-path-selector-value>\n }\n @case ('valuePathSelectorDropdownValue') {\n <valtimo-value-path-selector-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorDropdownValue-' + i\"\n ></valtimo-value-path-selector-dropdown-value>\n }\n }\n\n <button\n *ngIf=\"!hideDeleteButton\"\n cdsButton=\"danger\"\n [disabled]=\"values?.length <= this.minimumAmountOfRows || $disabled()\"\n [iconOnly]=\"true\"\n size=\"md\"\n (click)=\"deleteRow(value.uuid)\"\n [title]=\"vars.deleteRowText\"\n [attr.data-test-id]=\"testIds.deleteButtonAt(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n\n <div class=\"v-multi-input__add-button\">\n <button\n *ngIf=\"!hideAddButton\"\n [cdsButton]=\"addButtonType\"\n size=\"md\"\n [disabled]=\"(addRowEnabled$ | async) === false || $disabled()\"\n (click)=\"addRow()\"\n [attr.data-test-id]=\"name ? testIds.addButtonNamed(name) : testIds.addButton\"\n >\n {{ vars.addRowText }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".v-multi-input--margin{margin-block-end:var(--v-input-margin)}.v-multi-input__row{display:flex;flex-direction:row;align-items:flex-end;margin-block-end:var(--v-multi-input-row-spacing-block)}.v-multi-input__input{margin-inline-end:var(--v-multi-input-input-spacing-inline)}.v-multi-input__input.--full-width{flex:1}.v-multi-input__separator{height:40px;width:12px;display:flex;justify-content:flex-start}.v-multi-input__separator:before{content:\"\";height:100%;width:1px;background-color:var(--cds-border-subtle-selected)}.v-multi-input--no-delete-button .v-multi-input__input:last-child{margin-inline-end:0}\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: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: KeyValueComponent, selector: "valtimo-key-value", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: SingleValueComponent, selector: "valtimo-single-value", inputs: ["value", "fullWidth", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: KeyDropdownValueComponent, selector: "valtimo-key-dropdown-value", inputs: ["keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "index", "value", "dropdownItems$", "dropdownWidth", "fullWidth", "disabled", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ArbitraryAmountValueComponent, selector: "valtimo-arbitrary-amount-value", inputs: ["index", "value", "fullWidth", "disabled", "arbitraryAmountTitles", "amountOfArbitraryValuesArray$"], outputs: ["valueChange"] }, { kind: "component", type: KeyValuePathSelectorComponent, selector: "valtimo-key-value-path-selector", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ValuePathSelectorValueComponent, selector: "valtimo-value-path-selector-value", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ValuePathSelectorDropdownValueComponent, selector: "valtimo-value-path-selector-dropdown-value", inputs: ["keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "index", "value", "dropdownItems$", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "dropdownWidth", "fullWidth", "disabled", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
16293
+ ], 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<div\n *ngIf=\"{\n addRowText:\n addRowText || addRowTranslationKey\n ? addRowTranslationKey\n ? (addRowTranslationKey | translate)\n : addRowText\n : ('interface.addRow' | translate),\n deleteRowText:\n deleteRowText || deleteRowTranslationKey\n ? deleteRowTranslationKey\n ? (deleteRowTranslationKey | translate)\n : deleteRowText\n : ('interface.deleteRow' | translate),\n } as vars\"\n [ngClass]=\"{'v-multi-input--margin': margin, 'v-multi-input--no-delete-button': hideDeleteButton}\"\n class=\"v-multi-input\"\n>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [name]=\"name\"\n [required]=\"required\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [title]=\"title\"\n [tooltip]=\"tooltip\"\n >\n </v-input-label>\n\n <div class=\"v-multi-input__rows\">\n <div\n *ngFor=\"let value of values$ | async as values; trackBy: trackByFn; index as i\"\n class=\"v-multi-input__row\"\n >\n @switch (type) {\n @case ('value') {\n <valtimo-single-value\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, 'value')\"\n ></valtimo-single-value>\n }\n @case ('keyValue') {\n <valtimo-key-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value>\n }\n @case ('keyDropdownValue') {\n <valtimo-key-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-dropdown-value>\n }\n @case ('arbitraryAmount') {\n <valtimo-arbitrary-amount-value\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [arbitraryAmountTitles]=\"arbitraryAmountTitles\"\n [amountOfArbitraryValuesArray$]=\"amountOfArbitraryValuesArray$\"\n (valueChange)=\"\n onValueChange($event.value, $event.inputValue, $event.type, $event.arbitraryIndex)\n \"\n ></valtimo-arbitrary-amount-value>\n }\n @case ('keyValuePathSelector') {\n <valtimo-key-value-path-selector\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value-path-selector>\n }\n @case ('valuePathSelectorValue') {\n <valtimo-value-path-selector-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorValue-' + i\"\n ></valtimo-value-path-selector-value>\n }\n @case ('valuePathSelectorDropdownValue') {\n <valtimo-value-path-selector-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorDropdownValue-' + i\"\n ></valtimo-value-path-selector-dropdown-value>\n }\n }\n\n <button\n *ngIf=\"!hideDeleteButton\"\n [cdsButton]=\"deleteButtonType\"\n [disabled]=\"values?.length <= this.minimumAmountOfRows || $disabled()\"\n [iconOnly]=\"true\"\n size=\"md\"\n (click)=\"deleteRow(value.uuid)\"\n [title]=\"vars.deleteRowText\"\n [attr.data-test-id]=\"testIds.deleteButtonAt(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n\n <div class=\"v-multi-input__add-button\">\n <button\n *ngIf=\"!hideAddButton\"\n [cdsButton]=\"addButtonType\"\n size=\"md\"\n [disabled]=\"(addRowEnabled$ | async) === false || $disabled()\"\n (click)=\"addRow()\"\n [attr.data-test-id]=\"name ? testIds.addButtonNamed(name) : testIds.addButton\"\n >\n {{ vars.addRowText }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".v-multi-input--margin{margin-block-end:var(--v-input-margin)}.v-multi-input__row{display:flex;flex-direction:row;align-items:flex-end;margin-block-end:var(--v-multi-input-row-spacing-block)}.v-multi-input__input{margin-inline-end:var(--v-multi-input-input-spacing-inline)}.v-multi-input__input.--full-width{flex:1}.v-multi-input__separator{height:40px;width:12px;display:flex;justify-content:flex-start}.v-multi-input__separator:before{content:\"\";height:100%;width:1px;background-color:var(--cds-border-subtle-selected)}.v-multi-input--no-delete-button .v-multi-input__input:last-child{margin-inline-end:0}\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: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: KeyValueComponent, selector: "valtimo-key-value", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: SingleValueComponent, selector: "valtimo-single-value", inputs: ["value", "fullWidth", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: KeyDropdownValueComponent, selector: "valtimo-key-dropdown-value", inputs: ["keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "index", "value", "dropdownItems$", "dropdownWidth", "fullWidth", "disabled", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ArbitraryAmountValueComponent, selector: "valtimo-arbitrary-amount-value", inputs: ["index", "value", "fullWidth", "disabled", "arbitraryAmountTitles", "amountOfArbitraryValuesArray$"], outputs: ["valueChange"] }, { kind: "component", type: KeyValuePathSelectorComponent, selector: "valtimo-key-value-path-selector", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ValuePathSelectorValueComponent, selector: "valtimo-value-path-selector-value", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ValuePathSelectorDropdownValueComponent, selector: "valtimo-value-path-selector-dropdown-value", inputs: ["keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "index", "value", "dropdownItems$", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "dropdownWidth", "fullWidth", "disabled", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
15395
16294
  }
15396
16295
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonMultiInputComponent, decorators: [{
15397
16296
  type: Component,
@@ -15401,7 +16300,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
15401
16300
  useExisting: forwardRef(() => CarbonMultiInputComponent),
15402
16301
  multi: true,
15403
16302
  },
15404
- ], 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<div\n *ngIf=\"{\n addRowText:\n addRowText || addRowTranslationKey\n ? addRowTranslationKey\n ? (addRowTranslationKey | translate)\n : addRowText\n : ('interface.addRow' | translate),\n deleteRowText:\n deleteRowText || deleteRowTranslationKey\n ? deleteRowTranslationKey\n ? (deleteRowTranslationKey | translate)\n : deleteRowText\n : ('interface.deleteRow' | translate),\n } as vars\"\n [ngClass]=\"{'v-multi-input--margin': margin, 'v-multi-input--no-delete-button': hideDeleteButton}\"\n class=\"v-multi-input\"\n>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [name]=\"name\"\n [required]=\"required\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [title]=\"title\"\n [tooltip]=\"tooltip\"\n >\n </v-input-label>\n\n <div class=\"v-multi-input__rows\">\n <div\n *ngFor=\"let value of values$ | async as values; trackBy: trackByFn; index as i\"\n class=\"v-multi-input__row\"\n >\n @switch (type) {\n @case ('value') {\n <valtimo-single-value\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, 'value')\"\n ></valtimo-single-value>\n }\n @case ('keyValue') {\n <valtimo-key-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value>\n }\n @case ('keyDropdownValue') {\n <valtimo-key-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-dropdown-value>\n }\n @case ('arbitraryAmount') {\n <valtimo-arbitrary-amount-value\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [arbitraryAmountTitles]=\"arbitraryAmountTitles\"\n [amountOfArbitraryValuesArray$]=\"amountOfArbitraryValuesArray$\"\n (valueChange)=\"\n onValueChange($event.value, $event.inputValue, $event.type, $event.arbitraryIndex)\n \"\n ></valtimo-arbitrary-amount-value>\n }\n @case ('keyValuePathSelector') {\n <valtimo-key-value-path-selector\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value-path-selector>\n }\n @case ('valuePathSelectorValue') {\n <valtimo-value-path-selector-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorValue-' + i\"\n ></valtimo-value-path-selector-value>\n }\n @case ('valuePathSelectorDropdownValue') {\n <valtimo-value-path-selector-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorDropdownValue-' + i\"\n ></valtimo-value-path-selector-dropdown-value>\n }\n }\n\n <button\n *ngIf=\"!hideDeleteButton\"\n cdsButton=\"danger\"\n [disabled]=\"values?.length <= this.minimumAmountOfRows || $disabled()\"\n [iconOnly]=\"true\"\n size=\"md\"\n (click)=\"deleteRow(value.uuid)\"\n [title]=\"vars.deleteRowText\"\n [attr.data-test-id]=\"testIds.deleteButtonAt(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n\n <div class=\"v-multi-input__add-button\">\n <button\n *ngIf=\"!hideAddButton\"\n [cdsButton]=\"addButtonType\"\n size=\"md\"\n [disabled]=\"(addRowEnabled$ | async) === false || $disabled()\"\n (click)=\"addRow()\"\n [attr.data-test-id]=\"name ? testIds.addButtonNamed(name) : testIds.addButton\"\n >\n {{ vars.addRowText }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".v-multi-input--margin{margin-block-end:var(--v-input-margin)}.v-multi-input__row{display:flex;flex-direction:row;align-items:flex-end;margin-block-end:var(--v-multi-input-row-spacing-block)}.v-multi-input__input{margin-inline-end:var(--v-multi-input-input-spacing-inline)}.v-multi-input__input.--full-width{flex:1}.v-multi-input__separator{height:40px;width:12px;display:flex;justify-content:flex-start}.v-multi-input__separator:before{content:\"\";height:100%;width:1px;background-color:var(--cds-border-subtle-selected)}.v-multi-input--no-delete-button .v-multi-input__input:last-child{margin-inline-end:0}\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"] }]
16303
+ ], 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<div\n *ngIf=\"{\n addRowText:\n addRowText || addRowTranslationKey\n ? addRowTranslationKey\n ? (addRowTranslationKey | translate)\n : addRowText\n : ('interface.addRow' | translate),\n deleteRowText:\n deleteRowText || deleteRowTranslationKey\n ? deleteRowTranslationKey\n ? (deleteRowTranslationKey | translate)\n : deleteRowText\n : ('interface.deleteRow' | translate),\n } as vars\"\n [ngClass]=\"{'v-multi-input--margin': margin, 'v-multi-input--no-delete-button': hideDeleteButton}\"\n class=\"v-multi-input\"\n>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [name]=\"name\"\n [required]=\"required\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [title]=\"title\"\n [tooltip]=\"tooltip\"\n >\n </v-input-label>\n\n <div class=\"v-multi-input__rows\">\n <div\n *ngFor=\"let value of values$ | async as values; trackBy: trackByFn; index as i\"\n class=\"v-multi-input__row\"\n >\n @switch (type) {\n @case ('value') {\n <valtimo-single-value\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, 'value')\"\n ></valtimo-single-value>\n }\n @case ('keyValue') {\n <valtimo-key-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value>\n }\n @case ('keyDropdownValue') {\n <valtimo-key-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-dropdown-value>\n }\n @case ('arbitraryAmount') {\n <valtimo-arbitrary-amount-value\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [arbitraryAmountTitles]=\"arbitraryAmountTitles\"\n [amountOfArbitraryValuesArray$]=\"amountOfArbitraryValuesArray$\"\n (valueChange)=\"\n onValueChange($event.value, $event.inputValue, $event.type, $event.arbitraryIndex)\n \"\n ></valtimo-arbitrary-amount-value>\n }\n @case ('keyValuePathSelector') {\n <valtimo-key-value-path-selector\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value-path-selector>\n }\n @case ('valuePathSelectorValue') {\n <valtimo-value-path-selector-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorValue-' + i\"\n ></valtimo-value-path-selector-value>\n }\n @case ('valuePathSelectorDropdownValue') {\n <valtimo-value-path-selector-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorDropdownValue-' + i\"\n ></valtimo-value-path-selector-dropdown-value>\n }\n }\n\n <button\n *ngIf=\"!hideDeleteButton\"\n [cdsButton]=\"deleteButtonType\"\n [disabled]=\"values?.length <= this.minimumAmountOfRows || $disabled()\"\n [iconOnly]=\"true\"\n size=\"md\"\n (click)=\"deleteRow(value.uuid)\"\n [title]=\"vars.deleteRowText\"\n [attr.data-test-id]=\"testIds.deleteButtonAt(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n\n <div class=\"v-multi-input__add-button\">\n <button\n *ngIf=\"!hideAddButton\"\n [cdsButton]=\"addButtonType\"\n size=\"md\"\n [disabled]=\"(addRowEnabled$ | async) === false || $disabled()\"\n (click)=\"addRow()\"\n [attr.data-test-id]=\"name ? testIds.addButtonNamed(name) : testIds.addButton\"\n >\n {{ vars.addRowText }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".v-multi-input--margin{margin-block-end:var(--v-input-margin)}.v-multi-input__row{display:flex;flex-direction:row;align-items:flex-end;margin-block-end:var(--v-multi-input-row-spacing-block)}.v-multi-input__input{margin-inline-end:var(--v-multi-input-input-spacing-inline)}.v-multi-input__input.--full-width{flex:1}.v-multi-input__separator{height:40px;width:12px;display:flex;justify-content:flex-start}.v-multi-input__separator:before{content:\"\";height:100%;width:1px;background-color:var(--cds-border-subtle-selected)}.v-multi-input--no-delete-button .v-multi-input__input:last-child{margin-inline-end:0}\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"] }]
15405
16304
  }], propDecorators: { addRowText: [{
15406
16305
  type: Input
15407
16306
  }], addButtonType: [{
@@ -15414,6 +16313,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
15414
16313
  type: Input
15415
16314
  }], defaultValues: [{
15416
16315
  type: Input
16316
+ }], deleteButtonType: [{
16317
+ type: Input
15417
16318
  }], deleteRowText: [{
15418
16319
  type: Input
15419
16320
  }], deleteRowTranslationKey: [{
@@ -15759,51 +16660,271 @@ class RadioComponent {
15759
16660
  this.valueChange.emit(value);
15760
16661
  });
15761
16662
  }
15762
- openClearSubscription() {
15763
- if (this.clear$) {
15764
- this.clearSubscription = this.clear$.subscribe(() => {
15765
- this.onValueChange('');
15766
- });
16663
+ openClearSubscription() {
16664
+ if (this.clear$) {
16665
+ this.clearSubscription = this.clear$.subscribe(() => {
16666
+ this.onValueChange('');
16667
+ });
16668
+ }
16669
+ }
16670
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16671
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: RadioComponent, isStandalone: false, selector: "v-radio", inputs: { name: "name", title: "title", titleTranslationKey: "titleTranslationKey", defaultValue: "defaultValue", widthPx: "widthPx", fullWidth: "fullWidth", margin: "margin", smallMargin: "smallMargin", disabled: "disabled", tooltip: "tooltip", required: "required", smallLabel: "smallLabel", rows: "rows", clear$: "clear$", radioValues: "radioValues" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, 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<div\n class=\"v-input-container\"\n [ngClass]=\"{\n 'v-input--margin': margin,\n 'v-input--small-margin': smallMargin,\n }\"\n (click)=\"stopRadioEventPropagation($event)\"\n>\n <ng-container *ngTemplateOutlet=\"inputTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"radioInput\"></ng-container>\n</div>\n\n<ng-template #inputTitle>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [title]=\"title\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [name]=\"name\"\n [tooltip]=\"tooltip\"\n [required]=\"required\"\n [small]=\"smallLabel\"\n >\n </v-input-label>\n</ng-template>\n\n<ng-template #radioInput>\n <cds-radio-group\n [name]=\"name\"\n [disabled]=\"disabled\"\n [ngModel]=\"radioValue$ | async\"\n (ngModelChange)=\"onValueChange($event)\"\n >\n <cds-radio *ngFor=\"let radio of radioValues\" [value]=\"radio.value\" [disabled]=\"radio.disabled\">\n {{ radio.titleTranslationKey ? (radio.titleTranslationKey | translate) : radio.title }}\n </cds-radio>\n </cds-radio-group>\n</ng-template>\n", styles: [".v-input-container{display:flex;flex-direction:column}.v-input__label{margin:0;font-size:var(--v-input-title-font-size);color:var(--v-input-title-font-color);line-height:var(--v-input-title-line-height);font-weight:var(--v-input-title-font-weight);margin-block-end:var(--v-input-title-margin)}.v-input{all:unset;font-size:var(--v-input-font-size);line-height:var(--v-input-line-height);color:var(--v-input-color);font-weight:var(--v-input-font-weight);padding-block-start:var(--v-input-padding-block);padding-block-end:var(--v-input-padding-block);padding-inline-start:var(--v-input-padding-inline);padding-inline-end:var(--v-input-padding-inline);background-color:var(--v-input-bg-color);border-radius:var(--v-input-border-radius);border:var(--v-input-border);transition:var(--v-input-transition);width:var(--v-input-default-width);box-sizing:border-box}.v-input:focus{outline:var(--v-input-focus-border);outline-offset:var(--v-outline-offset)}.v-input:disabled{color:var(--v-input-font-color-disabled);cursor:var(--v-input-disabled-cursor)}.v-input--full-width{width:100%}.v-input--margin{margin-block-end:var(--v-input-margin)}.v-input--small-margin{margin-block-end:var(--v-input-small-margin)}.v-input__password-container{display:flex;flex-direction:row;align-items:center}.v-input__password-icon{margin-inline-start:var(--v-input-password-icon-spacing)}.v-input--hide-spinbox::-webkit-outer-spin-button,.v-input--hide-spinbox::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.v-input--hide-spinbox{-moz-appearance:textfield}.v-input--checkbox{width:20px;height:20px;margin-block-end:var(--v-input-margin)}\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: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: i2$3.Radio, selector: "cds-radio, ibm-radio", inputs: ["checked", "name", "disabled", "labelPlacement", "ariaLabelledby", "ariaLabel", "required", "value", "skeleton", "id"], outputs: ["change"] }, { kind: "component", type: i2$3.RadioGroup, selector: "cds-radio-group, ibm-radio-group", inputs: ["selected", "value", "name", "disabled", "skeleton", "orientation", "labelPlacement", "legend", "ariaLabel", "ariaLabelledby", "helperText", "invalid", "invalidText", "warn", "warnText"], outputs: ["change"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
16672
+ }
16673
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RadioComponent, decorators: [{
16674
+ type: Component,
16675
+ args: [{ selector: 'v-radio', standalone: false, 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<div\n class=\"v-input-container\"\n [ngClass]=\"{\n 'v-input--margin': margin,\n 'v-input--small-margin': smallMargin,\n }\"\n (click)=\"stopRadioEventPropagation($event)\"\n>\n <ng-container *ngTemplateOutlet=\"inputTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"radioInput\"></ng-container>\n</div>\n\n<ng-template #inputTitle>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [title]=\"title\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [name]=\"name\"\n [tooltip]=\"tooltip\"\n [required]=\"required\"\n [small]=\"smallLabel\"\n >\n </v-input-label>\n</ng-template>\n\n<ng-template #radioInput>\n <cds-radio-group\n [name]=\"name\"\n [disabled]=\"disabled\"\n [ngModel]=\"radioValue$ | async\"\n (ngModelChange)=\"onValueChange($event)\"\n >\n <cds-radio *ngFor=\"let radio of radioValues\" [value]=\"radio.value\" [disabled]=\"radio.disabled\">\n {{ radio.titleTranslationKey ? (radio.titleTranslationKey | translate) : radio.title }}\n </cds-radio>\n </cds-radio-group>\n</ng-template>\n", styles: [".v-input-container{display:flex;flex-direction:column}.v-input__label{margin:0;font-size:var(--v-input-title-font-size);color:var(--v-input-title-font-color);line-height:var(--v-input-title-line-height);font-weight:var(--v-input-title-font-weight);margin-block-end:var(--v-input-title-margin)}.v-input{all:unset;font-size:var(--v-input-font-size);line-height:var(--v-input-line-height);color:var(--v-input-color);font-weight:var(--v-input-font-weight);padding-block-start:var(--v-input-padding-block);padding-block-end:var(--v-input-padding-block);padding-inline-start:var(--v-input-padding-inline);padding-inline-end:var(--v-input-padding-inline);background-color:var(--v-input-bg-color);border-radius:var(--v-input-border-radius);border:var(--v-input-border);transition:var(--v-input-transition);width:var(--v-input-default-width);box-sizing:border-box}.v-input:focus{outline:var(--v-input-focus-border);outline-offset:var(--v-outline-offset)}.v-input:disabled{color:var(--v-input-font-color-disabled);cursor:var(--v-input-disabled-cursor)}.v-input--full-width{width:100%}.v-input--margin{margin-block-end:var(--v-input-margin)}.v-input--small-margin{margin-block-end:var(--v-input-small-margin)}.v-input__password-container{display:flex;flex-direction:row;align-items:center}.v-input__password-icon{margin-inline-start:var(--v-input-password-icon-spacing)}.v-input--hide-spinbox::-webkit-outer-spin-button,.v-input--hide-spinbox::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.v-input--hide-spinbox{-moz-appearance:textfield}.v-input--checkbox{width:20px;height:20px;margin-block-end:var(--v-input-margin)}\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"] }]
16676
+ }], propDecorators: { name: [{
16677
+ type: Input
16678
+ }], title: [{
16679
+ type: Input
16680
+ }], titleTranslationKey: [{
16681
+ type: Input
16682
+ }], defaultValue: [{
16683
+ type: Input
16684
+ }], widthPx: [{
16685
+ type: Input
16686
+ }], fullWidth: [{
16687
+ type: Input
16688
+ }], margin: [{
16689
+ type: Input
16690
+ }], smallMargin: [{
16691
+ type: Input
16692
+ }], disabled: [{
16693
+ type: Input
16694
+ }], tooltip: [{
16695
+ type: Input
16696
+ }], required: [{
16697
+ type: Input
16698
+ }], smallLabel: [{
16699
+ type: Input
16700
+ }], rows: [{
16701
+ type: Input
16702
+ }], clear$: [{
16703
+ type: Input
16704
+ }], radioValues: [{
16705
+ type: Input
16706
+ }], valueChange: [{
16707
+ type: Output
16708
+ }] } });
16709
+
16710
+ /*
16711
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
16712
+ *
16713
+ * Licensed under EUPL, Version 1.2 (the "License");
16714
+ * you may not use this file except in compliance with the License.
16715
+ * You may obtain a copy of the License at
16716
+ *
16717
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
16718
+ *
16719
+ * Unless required by applicable law or agreed to in writing, software
16720
+ * distributed under the License is distributed on an "AS IS" basis,
16721
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16722
+ * See the License for the specific language governing permissions and
16723
+ * limitations under the License.
16724
+ */
16725
+ class AutoKeyInputComponent {
16726
+ set disabled(value) {
16727
+ this.$disabled.set(value);
16728
+ }
16729
+ // Seeds the value outside reactive forms, where writeValue is never called
16730
+ set defaultValue(value) {
16731
+ if (value)
16732
+ this.setValue(value);
16733
+ }
16734
+ set mode(value) {
16735
+ this._mode$.next(value);
16736
+ }
16737
+ get mode$() {
16738
+ return this._mode$.pipe(filter(mode => !!mode));
16739
+ }
16740
+ set usedKeys(value) {
16741
+ this._usedKeys$.next(value || []);
16742
+ }
16743
+ set sourceText(value) {
16744
+ this._sourceText$.next(value || '');
16745
+ }
16746
+ constructor(iconService) {
16747
+ this.iconService = iconService;
16748
+ this.labelTranslationKey = 'Key';
16749
+ this.placeholderTranslationKey = '';
16750
+ this.dataTestId = AUTO_KEY_INPUT_TEST_IDS.input;
16751
+ // Read by the legacy v-form, which keys its output by component name
16752
+ this.name = '';
16753
+ this.margin = false;
16754
+ this.testIds = AUTO_KEY_INPUT_TEST_IDS;
16755
+ // Value stream the legacy v-form collects; the reactive-forms path uses onChange
16756
+ this.inputValue$ = new BehaviorSubject('');
16757
+ this._mode$ = new BehaviorSubject(null);
16758
+ this._usedKeys$ = new BehaviorSubject([]);
16759
+ this._sourceText$ = new BehaviorSubject('');
16760
+ this.$disabled = signal(false);
16761
+ this.value = '';
16762
+ this.editingKey$ = new BehaviorSubject(true);
16763
+ this.duplicateInitialized = false;
16764
+ this.idError$ = new BehaviorSubject(null);
16765
+ this.onChange = (_) => { };
16766
+ this.onTouched = () => { };
16767
+ this.onValidatorChange = () => { };
16768
+ this.validate = (control) => this.idError$.getValue() ? { idError: { value: this.idError$.getValue() } } : null;
16769
+ this.subscription = new Subscription();
16770
+ this.iconService.registerAll([Edit16, Close16]);
16771
+ this.subscription.add(this.mode$.subscribe(mode => {
16772
+ this.editingKey$.next(mode === 'edit');
16773
+ if (mode === 'duplicate') {
16774
+ this.duplicateInitialized = false;
16775
+ }
16776
+ }));
16777
+ this.subscription.add(combineLatest([this.mode$, this.editingKey$, this._usedKeys$, this._sourceText$]).subscribe(([mode, editingKey, usedKeys, sourceText]) => {
16778
+ if (mode === 'add' || mode === 'duplicate') {
16779
+ this.updateKey(mode, editingKey, usedKeys, sourceText);
16780
+ }
16781
+ }));
16782
+ }
16783
+ ngOnChanges() {
16784
+ this.onValidatorChange();
16785
+ }
16786
+ ngOnDestroy() {
16787
+ this.subscription.unsubscribe();
16788
+ this.duplicateInitialized = false;
16789
+ this.idError$.next(null);
16790
+ }
16791
+ setDisabledState(disabled) {
16792
+ this.$disabled.set(disabled);
16793
+ }
16794
+ writeValue(value) {
16795
+ if (value === null || value === '') {
16796
+ this.resetInternalState();
16797
+ return;
16798
+ }
16799
+ this.setValue(value ?? '');
16800
+ }
16801
+ registerOnChange(fn) {
16802
+ this.onChange = fn;
16803
+ }
16804
+ registerOnTouched(fn) {
16805
+ this.onTouched = fn;
16806
+ }
16807
+ registerOnValidatorChange(fn) {
16808
+ this.onValidatorChange = fn;
16809
+ }
16810
+ onInputChange(event) {
16811
+ const input = event.target;
16812
+ const key = sanitizeKey(input.value);
16813
+ if (input.value !== key)
16814
+ this.reflectSanitizedKey(input, key);
16815
+ const usedKeys = this._usedKeys$.getValue();
16816
+ this.idError$.next(usedKeys.includes(key) ? 'caseManagement.statuses.keyDuplicated' : null);
16817
+ this.setValue(key);
16818
+ this.onChange(this.value);
16819
+ }
16820
+ enableKeyEditing() {
16821
+ this.editingKey$.next(true);
16822
+ }
16823
+ disableKeyEditing() {
16824
+ this.editingKey$.next(false);
16825
+ }
16826
+ getUniqueKey(sourceText, usedKeys) {
16827
+ const baseKey = toKebabCase(sourceText);
16828
+ if (!usedKeys.includes(baseKey) || this._mode$.getValue() === 'edit') {
16829
+ return baseKey;
16830
+ }
16831
+ return this.getUniqueKeyWithNumber(baseKey, usedKeys);
16832
+ }
16833
+ // Stripping a character leaves the model unchanged, so Angular skips the [value] binding
16834
+ reflectSanitizedKey(input, key) {
16835
+ const removed = input.value.length - key.length;
16836
+ const caret = Math.max((input.selectionStart ?? input.value.length) - removed, 0);
16837
+ input.value = key;
16838
+ input.setSelectionRange(caret, caret);
16839
+ }
16840
+ setValue(value) {
16841
+ this.value = value;
16842
+ if (this.inputValue$.getValue() !== value)
16843
+ this.inputValue$.next(value);
16844
+ }
16845
+ resetInternalState() {
16846
+ this.setValue('');
16847
+ this.idError$.next(null);
16848
+ this.disableKeyEditing();
16849
+ this.duplicateInitialized = false;
16850
+ }
16851
+ updateKey(mode, editingKey, usedKeys, sourceText) {
16852
+ if (editingKey) {
16853
+ return;
16854
+ }
16855
+ let newKey = sourceText ? this.getUniqueKey(sourceText, usedKeys) : '';
16856
+ if (mode === 'duplicate' && !this.duplicateInitialized && newKey) {
16857
+ newKey = `${newKey}-duplicate`;
16858
+ this.duplicateInitialized = true;
16859
+ }
16860
+ this.setValue(newKey);
16861
+ this.onChange(newKey);
16862
+ }
16863
+ getUniqueKeyWithNumber(base, usedKeys, suffix = 1) {
16864
+ const newKey = `${base}-${suffix}`;
16865
+ if (usedKeys.includes(newKey)) {
16866
+ return this.getUniqueKeyWithNumber(base, usedKeys, suffix + 1);
15767
16867
  }
16868
+ return newKey;
15768
16869
  }
15769
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15770
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: RadioComponent, isStandalone: false, selector: "v-radio", inputs: { name: "name", title: "title", titleTranslationKey: "titleTranslationKey", defaultValue: "defaultValue", widthPx: "widthPx", fullWidth: "fullWidth", margin: "margin", smallMargin: "smallMargin", disabled: "disabled", tooltip: "tooltip", required: "required", smallLabel: "smallLabel", rows: "rows", clear$: "clear$", radioValues: "radioValues" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, 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<div\n class=\"v-input-container\"\n [ngClass]=\"{\n 'v-input--margin': margin,\n 'v-input--small-margin': smallMargin,\n }\"\n (click)=\"stopRadioEventPropagation($event)\"\n>\n <ng-container *ngTemplateOutlet=\"inputTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"radioInput\"></ng-container>\n</div>\n\n<ng-template #inputTitle>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [title]=\"title\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [name]=\"name\"\n [tooltip]=\"tooltip\"\n [required]=\"required\"\n [small]=\"smallLabel\"\n >\n </v-input-label>\n</ng-template>\n\n<ng-template #radioInput>\n <cds-radio-group\n [name]=\"name\"\n [disabled]=\"disabled\"\n [ngModel]=\"radioValue$ | async\"\n (ngModelChange)=\"onValueChange($event)\"\n >\n <cds-radio *ngFor=\"let radio of radioValues\" [value]=\"radio.value\" [disabled]=\"radio.disabled\">\n {{ radio.titleTranslationKey ? (radio.titleTranslationKey | translate) : radio.title }}\n </cds-radio>\n </cds-radio-group>\n</ng-template>\n", styles: [".v-input-container{display:flex;flex-direction:column}.v-input__label{margin:0;font-size:var(--v-input-title-font-size);color:var(--v-input-title-font-color);line-height:var(--v-input-title-line-height);font-weight:var(--v-input-title-font-weight);margin-block-end:var(--v-input-title-margin)}.v-input{all:unset;font-size:var(--v-input-font-size);line-height:var(--v-input-line-height);color:var(--v-input-color);font-weight:var(--v-input-font-weight);padding-block-start:var(--v-input-padding-block);padding-block-end:var(--v-input-padding-block);padding-inline-start:var(--v-input-padding-inline);padding-inline-end:var(--v-input-padding-inline);background-color:var(--v-input-bg-color);border-radius:var(--v-input-border-radius);border:var(--v-input-border);transition:var(--v-input-transition);width:var(--v-input-default-width);box-sizing:border-box}.v-input:focus{outline:var(--v-input-focus-border);outline-offset:var(--v-outline-offset)}.v-input:disabled{color:var(--v-input-font-color-disabled);cursor:var(--v-input-disabled-cursor)}.v-input--full-width{width:100%}.v-input--margin{margin-block-end:var(--v-input-margin)}.v-input--small-margin{margin-block-end:var(--v-input-small-margin)}.v-input__password-container{display:flex;flex-direction:row;align-items:center}.v-input__password-icon{margin-inline-start:var(--v-input-password-icon-spacing)}.v-input--hide-spinbox::-webkit-outer-spin-button,.v-input--hide-spinbox::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.v-input--hide-spinbox{-moz-appearance:textfield}.v-input--checkbox{width:20px;height:20px;margin-block-end:var(--v-input-margin)}\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: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: i2$3.Radio, selector: "cds-radio, ibm-radio", inputs: ["checked", "name", "disabled", "labelPlacement", "ariaLabelledby", "ariaLabel", "required", "value", "skeleton", "id"], outputs: ["change"] }, { kind: "component", type: i2$3.RadioGroup, selector: "cds-radio-group, ibm-radio-group", inputs: ["selected", "value", "name", "disabled", "skeleton", "orientation", "labelPlacement", "legend", "ariaLabel", "ariaLabelledby", "helperText", "invalid", "invalidText", "warn", "warnText"], outputs: ["change"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
16870
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AutoKeyInputComponent, deps: [{ token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
16871
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: AutoKeyInputComponent, isStandalone: true, selector: "valtimo-auto-key-input", inputs: { labelTranslationKey: "labelTranslationKey", placeholderTranslationKey: "placeholderTranslationKey", dataTestId: "dataTestId", name: "name", disabled: "disabled", defaultValue: "defaultValue", margin: "margin", mode: "mode", usedKeys: "usedKeys", sourceText: "sourceText" }, host: { properties: { "class.auto-key-input--margin": "this.margin" } }, providers: [
16872
+ {
16873
+ provide: NG_VALUE_ACCESSOR,
16874
+ useExisting: forwardRef(() => AutoKeyInputComponent),
16875
+ multi: true,
16876
+ },
16877
+ {
16878
+ provide: NG_VALIDATORS,
16879
+ useExisting: forwardRef(() => AutoKeyInputComponent),
16880
+ multi: true,
16881
+ },
16882
+ ], usesOnChanges: true, 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<cds-label\n *ngIf=\"{\n mode: mode$ | async,\n idError: idError$ | async,\n editingKey: editingKey$ | async,\n } as obs\"\n [invalid]=\"!!obs.idError\"\n [invalidText]=\"obs.idError | translate\"\n>\n <span class=\"auto-key-label\">\n {{ labelTranslationKey | translate }}\n\n <ng-content></ng-content>\n </span>\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"\n obs.mode === 'add' && !obs.editingKey\n ? ('caseManagement.statuses.keyAutoGenerated' | translate)\n : (placeholderTranslationKey | translate)\n \"\n [readOnly]=\"!obs.editingKey || obs.mode === 'edit'\"\n [invalid]=\"!!obs.idError\"\n [attr.data-test-id]=\"dataTestId\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n\n <cds-icon-button\n *ngIf=\"(obs.mode === 'add' || obs.mode === 'duplicate') && !obs.editingKey\"\n [disabled]=\"$disabled()\"\n [attr.data-test-id]=\"testIds.editButton\"\n (click)=\"enableKeyEditing()\"\n kind=\"secondary\"\n size=\"md\"\n >\n <svg cdsIcon=\"edit\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n\n <cds-icon-button\n *ngIf=\"obs.mode === 'add' && obs.editingKey\"\n [disabled]=\"$disabled()\"\n (click)=\"disableKeyEditing()\"\n kind=\"secondary\"\n size=\"md\"\n >\n <svg cdsIcon=\"close\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n </div>\n</cds-label>\n", styles: [".auto-key-label{display:flex;align-items:center}:host(.auto-key-input--margin){display:block;margin-block-end:var(--v-input-margin)}.edit-key-input{display:flex;align-items:center;gap:8px;width:100%}.edit-key-input input[cdsText]{flex:1 1 auto}.edit-key-input cds-icon-button{flex-shrink:0;margin-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: InputModule$1 }, { kind: "component", type: i2$3.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2$3.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2$3.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: IconModule }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15771
16883
  }
15772
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RadioComponent, decorators: [{
16884
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AutoKeyInputComponent, decorators: [{
15773
16885
  type: Component,
15774
- args: [{ selector: 'v-radio', standalone: false, 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<div\n class=\"v-input-container\"\n [ngClass]=\"{\n 'v-input--margin': margin,\n 'v-input--small-margin': smallMargin,\n }\"\n (click)=\"stopRadioEventPropagation($event)\"\n>\n <ng-container *ngTemplateOutlet=\"inputTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"radioInput\"></ng-container>\n</div>\n\n<ng-template #inputTitle>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [title]=\"title\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [name]=\"name\"\n [tooltip]=\"tooltip\"\n [required]=\"required\"\n [small]=\"smallLabel\"\n >\n </v-input-label>\n</ng-template>\n\n<ng-template #radioInput>\n <cds-radio-group\n [name]=\"name\"\n [disabled]=\"disabled\"\n [ngModel]=\"radioValue$ | async\"\n (ngModelChange)=\"onValueChange($event)\"\n >\n <cds-radio *ngFor=\"let radio of radioValues\" [value]=\"radio.value\" [disabled]=\"radio.disabled\">\n {{ radio.titleTranslationKey ? (radio.titleTranslationKey | translate) : radio.title }}\n </cds-radio>\n </cds-radio-group>\n</ng-template>\n", styles: [".v-input-container{display:flex;flex-direction:column}.v-input__label{margin:0;font-size:var(--v-input-title-font-size);color:var(--v-input-title-font-color);line-height:var(--v-input-title-line-height);font-weight:var(--v-input-title-font-weight);margin-block-end:var(--v-input-title-margin)}.v-input{all:unset;font-size:var(--v-input-font-size);line-height:var(--v-input-line-height);color:var(--v-input-color);font-weight:var(--v-input-font-weight);padding-block-start:var(--v-input-padding-block);padding-block-end:var(--v-input-padding-block);padding-inline-start:var(--v-input-padding-inline);padding-inline-end:var(--v-input-padding-inline);background-color:var(--v-input-bg-color);border-radius:var(--v-input-border-radius);border:var(--v-input-border);transition:var(--v-input-transition);width:var(--v-input-default-width);box-sizing:border-box}.v-input:focus{outline:var(--v-input-focus-border);outline-offset:var(--v-outline-offset)}.v-input:disabled{color:var(--v-input-font-color-disabled);cursor:var(--v-input-disabled-cursor)}.v-input--full-width{width:100%}.v-input--margin{margin-block-end:var(--v-input-margin)}.v-input--small-margin{margin-block-end:var(--v-input-small-margin)}.v-input__password-container{display:flex;flex-direction:row;align-items:center}.v-input__password-icon{margin-inline-start:var(--v-input-password-icon-spacing)}.v-input--hide-spinbox::-webkit-outer-spin-button,.v-input--hide-spinbox::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.v-input--hide-spinbox{-moz-appearance:textfield}.v-input--checkbox{width:20px;height:20px;margin-block-end:var(--v-input-margin)}\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"] }]
15775
- }], propDecorators: { name: [{
15776
- type: Input
15777
- }], title: [{
15778
- type: Input
15779
- }], titleTranslationKey: [{
15780
- type: Input
15781
- }], defaultValue: [{
15782
- type: Input
15783
- }], widthPx: [{
16886
+ args: [{ selector: 'valtimo-auto-key-input', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
16887
+ CommonModule,
16888
+ ReactiveFormsModule,
16889
+ TranslateModule,
16890
+ InputModule$1,
16891
+ ButtonModule,
16892
+ IconModule,
16893
+ ], providers: [
16894
+ {
16895
+ provide: NG_VALUE_ACCESSOR,
16896
+ useExisting: forwardRef(() => AutoKeyInputComponent),
16897
+ multi: true,
16898
+ },
16899
+ {
16900
+ provide: NG_VALIDATORS,
16901
+ useExisting: forwardRef(() => AutoKeyInputComponent),
16902
+ multi: true,
16903
+ },
16904
+ ], 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<cds-label\n *ngIf=\"{\n mode: mode$ | async,\n idError: idError$ | async,\n editingKey: editingKey$ | async,\n } as obs\"\n [invalid]=\"!!obs.idError\"\n [invalidText]=\"obs.idError | translate\"\n>\n <span class=\"auto-key-label\">\n {{ labelTranslationKey | translate }}\n\n <ng-content></ng-content>\n </span>\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"\n obs.mode === 'add' && !obs.editingKey\n ? ('caseManagement.statuses.keyAutoGenerated' | translate)\n : (placeholderTranslationKey | translate)\n \"\n [readOnly]=\"!obs.editingKey || obs.mode === 'edit'\"\n [invalid]=\"!!obs.idError\"\n [attr.data-test-id]=\"dataTestId\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n\n <cds-icon-button\n *ngIf=\"(obs.mode === 'add' || obs.mode === 'duplicate') && !obs.editingKey\"\n [disabled]=\"$disabled()\"\n [attr.data-test-id]=\"testIds.editButton\"\n (click)=\"enableKeyEditing()\"\n kind=\"secondary\"\n size=\"md\"\n >\n <svg cdsIcon=\"edit\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n\n <cds-icon-button\n *ngIf=\"obs.mode === 'add' && obs.editingKey\"\n [disabled]=\"$disabled()\"\n (click)=\"disableKeyEditing()\"\n kind=\"secondary\"\n size=\"md\"\n >\n <svg cdsIcon=\"close\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n </div>\n</cds-label>\n", styles: [".auto-key-label{display:flex;align-items:center}:host(.auto-key-input--margin){display:block;margin-block-end:var(--v-input-margin)}.edit-key-input{display:flex;align-items:center;gap:8px;width:100%}.edit-key-input input[cdsText]{flex:1 1 auto}.edit-key-input cds-icon-button{flex-shrink:0;margin-left:4px}\n"] }]
16905
+ }], ctorParameters: () => [{ type: i2$3.IconService }], propDecorators: { labelTranslationKey: [{
15784
16906
  type: Input
15785
- }], fullWidth: [{
16907
+ }], placeholderTranslationKey: [{
15786
16908
  type: Input
15787
- }], margin: [{
16909
+ }], dataTestId: [{
15788
16910
  type: Input
15789
- }], smallMargin: [{
16911
+ }], name: [{
15790
16912
  type: Input
15791
16913
  }], disabled: [{
15792
16914
  type: Input
15793
- }], tooltip: [{
15794
- type: Input
15795
- }], required: [{
16915
+ }], defaultValue: [{
15796
16916
  type: Input
15797
- }], smallLabel: [{
16917
+ }], margin: [{
16918
+ type: HostBinding,
16919
+ args: ['class.auto-key-input--margin']
16920
+ }, {
15798
16921
  type: Input
15799
- }], rows: [{
16922
+ }], mode: [{
15800
16923
  type: Input
15801
- }], clear$: [{
16924
+ }], usedKeys: [{
15802
16925
  type: Input
15803
- }], radioValues: [{
16926
+ }], sourceText: [{
15804
16927
  type: Input
15805
- }], valueChange: [{
15806
- type: Output
15807
16928
  }] } });
15808
16929
 
15809
16930
  /*
@@ -15846,6 +16967,7 @@ class FormComponent {
15846
16967
  ...this.multiInputFormComponents?.toArray(),
15847
16968
  ...this.radioComponents?.toArray(),
15848
16969
  ...this.valuePathSelectorComponents?.toArray(),
16970
+ ...this.autoKeyInputComponents?.toArray(),
15849
16971
  ];
15850
16972
  this.componentValuesSubscription = combineLatest(valueComponents.map(component => {
15851
16973
  const inputComponent = component;
@@ -15902,13 +17024,14 @@ class FormComponent {
15902
17024
  this.multiInputFormComponents.changes.pipe(startWith(null)),
15903
17025
  this.radioComponents.changes.pipe(startWith(null)),
15904
17026
  this.valuePathSelectorComponents.changes.pipe(startWith(null)),
17027
+ this.autoKeyInputComponents.changes.pipe(startWith(null)),
15905
17028
  ]).subscribe(() => {
15906
17029
  this.closeComponentValuesSubscription();
15907
17030
  this.openComponentValuesSubscription();
15908
17031
  });
15909
17032
  }
15910
17033
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15911
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormComponent, isStandalone: false, selector: "v-form", inputs: { className: "className" }, outputs: { valueChange: "valueChange" }, queries: [{ propertyName: "inputComponents", predicate: InputComponent }, { propertyName: "selectComponents", predicate: SelectComponent }, { propertyName: "multiInputComponents", predicate: CarbonMultiInputComponent }, { propertyName: "datePickerComponents", predicate: DatePickerComponent }, { propertyName: "multiInputFormComponents", predicate: MultiInputFormComponent }, { propertyName: "radioComponents", predicate: RadioComponent }, { propertyName: "valuePathSelectorComponents", predicate: ValuePathSelectorComponent }], 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 [ngClass]=\"'v-form ' + className\" onsubmit=\"return false;\">\n <ng-content></ng-content>\n</form>\n", styles: [".v-form{display:flex;flex-direction:column}\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: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
17034
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormComponent, isStandalone: false, selector: "v-form", inputs: { className: "className" }, outputs: { valueChange: "valueChange" }, queries: [{ propertyName: "inputComponents", predicate: InputComponent }, { propertyName: "selectComponents", predicate: SelectComponent }, { propertyName: "multiInputComponents", predicate: CarbonMultiInputComponent }, { propertyName: "datePickerComponents", predicate: DatePickerComponent }, { propertyName: "multiInputFormComponents", predicate: MultiInputFormComponent }, { propertyName: "radioComponents", predicate: RadioComponent }, { propertyName: "valuePathSelectorComponents", predicate: ValuePathSelectorComponent }, { propertyName: "autoKeyInputComponents", predicate: AutoKeyInputComponent }], 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 [ngClass]=\"'v-form ' + className\" onsubmit=\"return false;\">\n <ng-content></ng-content>\n</form>\n", styles: [".v-form{display:flex;flex-direction:column}\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: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
15912
17035
  }
15913
17036
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormComponent, decorators: [{
15914
17037
  type: Component,
@@ -15934,6 +17057,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
15934
17057
  }], valuePathSelectorComponents: [{
15935
17058
  type: ContentChildren,
15936
17059
  args: [ValuePathSelectorComponent]
17060
+ }], autoKeyInputComponents: [{
17061
+ type: ContentChildren,
17062
+ args: [AutoKeyInputComponent]
15937
17063
  }], className: [{
15938
17064
  type: Input
15939
17065
  }], valueChange: [{
@@ -16159,13 +17285,13 @@ class SearchFieldsComponent {
16159
17285
  this.expand();
16160
17286
  }
16161
17287
  }
16162
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SearchFieldsComponent, deps: [{ token: i3$1.DocumentService }, { token: i1.TranslateService }, { token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
17288
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SearchFieldsComponent, deps: [{ token: i3$2.DocumentService }, { token: i1.TranslateService }, { token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
16163
17289
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: SearchFieldsComponent, isStandalone: false, selector: "valtimo-search-fields", inputs: { loading: "loading", searchFields: "searchFields", caseDefinitionKey: "caseDefinitionKey", setValuesSubject$: "setValuesSubject$", clearValuesSubject$: "clearValuesSubject$", defaultValues: "defaultValues", disableSaveSearch: "disableSaveSearch", inputDisabled: "inputDisabled", externalSearchField: "externalSearchField", canSaveSearch: "canSaveSearch" }, outputs: { doSearch: "doSearch", saveSearchEvent: "saveSearchEvent", clearEvent: "clearEvent" }, 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<ng-container *ngIf=\"loading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!loading\">\n <cds-accordion>\n <cds-accordion-item\n [attr.data-test-id]=\"testIds.accordionItem\"\n [title]=\"'searchFields.searchButtonText' | translate\"\n (selected)=\"toggleExpanded()\"\n [expanded]=\"expanded$ | async\"\n >\n <ng-container *ngTemplateOutlet=\"searchFieldsTemplate\"></ng-container>\n </cds-accordion-item>\n </cds-accordion>\n</ng-container>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\"><cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #searchFieldsTemplate>\n <ng-container *ngIf=\"searchFields$ | async as searchFields\">\n <ng-container\n *ngIf=\"{\n noSearchFields: (!searchFields || searchFields.length === 0) && !externalSearchField,\n } as vars\"\n >\n <div\n *ngIf=\"!vars.noSearchFields\"\n class=\"search-fields-container\"\n [ngClass]=\"{'search-fields-container--hidden': (expanded$ | async) === false}\"\n [cdsLayer]=\"1\"\n >\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let searchField of searchFields\">\n <div class=\"search-field-container\">\n <ng-container\n *ngTemplateOutlet=\"searchFieldTemplate; context: {searchField: searchField}\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n\n <div class=\"meta-container\" *ngIf=\"expanded$ | async\">\n <ng-container\n *ngTemplateOutlet=\"buttonsTemplate; context: {noSearchFields: vars.noSearchFields}\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #searchFieldTemplate let-searchField=\"searchField\">\n <ng-container\n *ngIf=\"{\n values: values$ | async,\n tooltipKey: 'searchFieldsTooltips.' + searchField.key,\n tooltip: 'searchFieldsTooltips.' + searchField.key | translate,\n searchField,\n title:\n searchField.title ||\n ('searchFields.' + searchField.key !== ('searchFields.' + searchField.key | translate)\n ? ('searchFields.' + searchField.key | translate)\n : searchField.key),\n } as vars\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateText;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumber;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDate;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateBoolean;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTime;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumberRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateTextRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTimeRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateSingleSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateMultiSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateText\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [attr.data-test-id]=\"searchFieldTestIdPrefix + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumber\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDate\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateTextRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumberRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateBoolean\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'boolean'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"booleanItems$ | async as booleanItems\"\n [items]=\"booleanItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"getDefaultBooleanSelectionId(values, searchField.key)\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTime\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event, true)\"\n [smallLabel]=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTimeRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event, true)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateSingleSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'single-select-dropdown' ||\n searchField.fieldType === 'single_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateMultiSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'multi-select-dropdown' ||\n searchField.fieldType === 'multi_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [multiple]=\"true\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"multipleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionIds]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template #toText>\n <div class=\"to-text\">\n <v-paragraph>{{ 'searchFields.to' | translate }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #buttonsTemplate let-noSearchFields=\"noSearchFields\">\n <ng-container\n *ngTemplateOutlet=\"noSearchFieldsTemplate; context: {noSearchFields: noSearchFields}\"\n ></ng-container>\n\n <div\n class=\"buttons-container\"\n *ngIf=\"\n !noSearchFields && {expanded: expanded$ | async, isSearchEmpty: isSearchEmpty$ | async} as obs\n \"\n >\n <div class=\"right-buttons\">\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"tertiary\"\n data-testid=\"search-fields-clear-button\"\n [attr.data-test-id]=\"testIds.clearButton\"\n (click)=\"clear()\"\n [disabled]=\"loading || noSearchFields || inputDisabled\"\n type=\"button\"\n id=\"clear\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded && canSaveSearch\"\n cdsButton=\"secondary\"\n data-testid=\"search-fields-save-button\"\n [attr.data-test-id]=\"testIds.saveButton\"\n [disabled]=\"disableSaveSearch && obs.isSearchEmpty\"\n (click)=\"saveSearch()\"\n type=\"button\"\n id=\"save\"\n >\n <svg cdsIcon=\"save\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.saveButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"primary\"\n data-testid=\"search-fields-search-button\"\n [attr.data-test-id]=\"testIds.searchButton\"\n (click)=\"search()\"\n [disabled]=\"\n loading || noSearchFields || (hasValidValues$ | async) === false || inputDisabled\n \"\n type=\"button\"\n id=\"search\"\n >\n <svg cdsIcon=\"search\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #noSearchFieldsTemplate let-noSearchFields=\"noSearchFields\">\n <div class=\"no-search-fields-message\" *ngIf=\"noSearchFields\">\n <v-paragraph dataTestId=\"search-fields-no-fields\" [attr.data-test-id]=\"testIds.noFieldsMessage\" [fullWidth]=\"true\" [center]=\"true\">{{\n 'searchFields.noneConfigured' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n", styles: ["::ng-deep .multiple-search-fields{display:flex!important;flex-direction:row!important;align-items:center}.to-text{margin-inline-start:8px;margin-inline-end:8px}.buttons-container{width:100%;display:flex;justify-content:flex-end}.right-buttons{display:flex;flex-direction:row;gap:16px}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(3,1fr)}.search-fields-container--hidden{display:none}.meta-container{width:100%;padding-bottom:16px}.loading-container{display:flex;width:100%;justify-content:center}.no-search-fields-message{display:flex;width:100%;justify-content:center;margin-top:16px}.search-fields-tile{padding:0}::ng-deep .cds--accordion{background-color:var(--cds-layer)}::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}::ng-deep .cds--accordion__content{padding:0 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: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: 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: FormComponent, selector: "v-form", inputs: ["className"], outputs: ["valueChange"] }, { kind: "component", type: DatePickerComponent, selector: "v-date-picker", inputs: ["name", "title", "placeholder", "titleTranslationKey", "widthPx", "fullWidth", "margin", "disabled", "tooltip", "required", "defaultDate", "defaultDateIsToday", "smallLabel", "clear$", "enableTime", "carbonTheme"], outputs: ["valueChange"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: ParagraphComponent, selector: "v-paragraph", inputs: ["center", "fullWidth", "margin", "italic", "loading", "dataTestId"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "component", type: i2$3.Accordion, selector: "cds-accordion, ibm-accordion", inputs: ["align", "size", "skeleton"] }, { kind: "component", type: i2$3.AccordionItem, selector: "cds-accordion-item, ibm-accordion-item", inputs: ["title", "context", "id", "skeleton", "expanded", "disabled"], outputs: ["selected"] }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i2$3.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
16164
17290
  }
16165
17291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SearchFieldsComponent, decorators: [{
16166
17292
  type: Component,
16167
17293
  args: [{ selector: 'valtimo-search-fields', standalone: false, 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<ng-container *ngIf=\"loading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!loading\">\n <cds-accordion>\n <cds-accordion-item\n [attr.data-test-id]=\"testIds.accordionItem\"\n [title]=\"'searchFields.searchButtonText' | translate\"\n (selected)=\"toggleExpanded()\"\n [expanded]=\"expanded$ | async\"\n >\n <ng-container *ngTemplateOutlet=\"searchFieldsTemplate\"></ng-container>\n </cds-accordion-item>\n </cds-accordion>\n</ng-container>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\"><cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #searchFieldsTemplate>\n <ng-container *ngIf=\"searchFields$ | async as searchFields\">\n <ng-container\n *ngIf=\"{\n noSearchFields: (!searchFields || searchFields.length === 0) && !externalSearchField,\n } as vars\"\n >\n <div\n *ngIf=\"!vars.noSearchFields\"\n class=\"search-fields-container\"\n [ngClass]=\"{'search-fields-container--hidden': (expanded$ | async) === false}\"\n [cdsLayer]=\"1\"\n >\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let searchField of searchFields\">\n <div class=\"search-field-container\">\n <ng-container\n *ngTemplateOutlet=\"searchFieldTemplate; context: {searchField: searchField}\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n\n <div class=\"meta-container\" *ngIf=\"expanded$ | async\">\n <ng-container\n *ngTemplateOutlet=\"buttonsTemplate; context: {noSearchFields: vars.noSearchFields}\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #searchFieldTemplate let-searchField=\"searchField\">\n <ng-container\n *ngIf=\"{\n values: values$ | async,\n tooltipKey: 'searchFieldsTooltips.' + searchField.key,\n tooltip: 'searchFieldsTooltips.' + searchField.key | translate,\n searchField,\n title:\n searchField.title ||\n ('searchFields.' + searchField.key !== ('searchFields.' + searchField.key | translate)\n ? ('searchFields.' + searchField.key | translate)\n : searchField.key),\n } as vars\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateText;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumber;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDate;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateBoolean;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTime;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumberRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateTextRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTimeRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateSingleSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateMultiSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateText\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [attr.data-test-id]=\"searchFieldTestIdPrefix + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumber\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDate\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateTextRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumberRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateBoolean\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'boolean'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"booleanItems$ | async as booleanItems\"\n [items]=\"booleanItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"getDefaultBooleanSelectionId(values, searchField.key)\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTime\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event, true)\"\n [smallLabel]=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTimeRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event, true)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateSingleSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'single-select-dropdown' ||\n searchField.fieldType === 'single_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateMultiSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'multi-select-dropdown' ||\n searchField.fieldType === 'multi_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [multiple]=\"true\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"multipleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionIds]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template #toText>\n <div class=\"to-text\">\n <v-paragraph>{{ 'searchFields.to' | translate }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #buttonsTemplate let-noSearchFields=\"noSearchFields\">\n <ng-container\n *ngTemplateOutlet=\"noSearchFieldsTemplate; context: {noSearchFields: noSearchFields}\"\n ></ng-container>\n\n <div\n class=\"buttons-container\"\n *ngIf=\"\n !noSearchFields && {expanded: expanded$ | async, isSearchEmpty: isSearchEmpty$ | async} as obs\n \"\n >\n <div class=\"right-buttons\">\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"tertiary\"\n data-testid=\"search-fields-clear-button\"\n [attr.data-test-id]=\"testIds.clearButton\"\n (click)=\"clear()\"\n [disabled]=\"loading || noSearchFields || inputDisabled\"\n type=\"button\"\n id=\"clear\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded && canSaveSearch\"\n cdsButton=\"secondary\"\n data-testid=\"search-fields-save-button\"\n [attr.data-test-id]=\"testIds.saveButton\"\n [disabled]=\"disableSaveSearch && obs.isSearchEmpty\"\n (click)=\"saveSearch()\"\n type=\"button\"\n id=\"save\"\n >\n <svg cdsIcon=\"save\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.saveButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"primary\"\n data-testid=\"search-fields-search-button\"\n [attr.data-test-id]=\"testIds.searchButton\"\n (click)=\"search()\"\n [disabled]=\"\n loading || noSearchFields || (hasValidValues$ | async) === false || inputDisabled\n \"\n type=\"button\"\n id=\"search\"\n >\n <svg cdsIcon=\"search\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #noSearchFieldsTemplate let-noSearchFields=\"noSearchFields\">\n <div class=\"no-search-fields-message\" *ngIf=\"noSearchFields\">\n <v-paragraph dataTestId=\"search-fields-no-fields\" [attr.data-test-id]=\"testIds.noFieldsMessage\" [fullWidth]=\"true\" [center]=\"true\">{{\n 'searchFields.noneConfigured' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n", styles: ["::ng-deep .multiple-search-fields{display:flex!important;flex-direction:row!important;align-items:center}.to-text{margin-inline-start:8px;margin-inline-end:8px}.buttons-container{width:100%;display:flex;justify-content:flex-end}.right-buttons{display:flex;flex-direction:row;gap:16px}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(3,1fr)}.search-fields-container--hidden{display:none}.meta-container{width:100%;padding-bottom:16px}.loading-container{display:flex;width:100%;justify-content:center}.no-search-fields-message{display:flex;width:100%;justify-content:center;margin-top:16px}.search-fields-tile{padding:0}::ng-deep .cds--accordion{background-color:var(--cds-layer)}::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}::ng-deep .cds--accordion__content{padding:0 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"] }]
16168
- }], ctorParameters: () => [{ type: i3$1.DocumentService }, { type: i1.TranslateService }, { type: i2$3.IconService }], propDecorators: { loading: [{
17294
+ }], ctorParameters: () => [{ type: i3$2.DocumentService }, { type: i1.TranslateService }, { type: i2$3.IconService }], propDecorators: { loading: [{
16169
17295
  type: Input
16170
17296
  }], searchFields: [{
16171
17297
  type: Input
@@ -17645,13 +18771,13 @@ class TableComponent {
17645
18771
  }
17646
18772
  });
17647
18773
  }
17648
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TableComponent, deps: [{ token: i3.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
18774
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TableComponent, deps: [{ token: i3$1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
17649
18775
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: TableComponent, isStandalone: false, selector: "v-table", inputs: { items: "items", columns: "columns", loading: "loading", showEditButtons: "showEditButtons", showPagination: "showPagination", editButtonTranslationKey: "editButtonTranslationKey", itemsTranslationKey: "itemsTranslationKey", noResultsTranslationKey: "noResultsTranslationKey", mobileBreakpointPx: "mobileBreakpointPx", amountOfLoadingRows: "amountOfLoadingRows", collectionSize: "collectionSize", page: "page", size: "size" }, outputs: { editButtonClicked: "editButtonClicked", paginationSizeSet: "paginationSizeSet", paginationPageSet: "paginationPageSet" }, 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<ng-container *ngIf=\"{items: items$ | async} as obs\">\n <div class=\"v-table-container\">\n <table class=\"v-table\">\n <ng-container *ngTemplateOutlet=\"tableHead\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableBody; context: {tableItems: obs.items}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableBodyLoading\"></ng-container>\n <ng-container\n *ngTemplateOutlet=\"tableBodyNoResults; context: {tableItems: obs.items}\"\n ></ng-container>\n </table>\n <ng-container *ngIf=\"showPagination\">\n <ng-container\n *ngTemplateOutlet=\"paginationContainer; context: {tableItems: obs.items}\"\n ></ng-container>\n </ng-container>\n </div>\n</ng-container>\n\n<ng-template #tableHead>\n <thead *ngIf=\"columns\">\n <tr>\n <th class=\"v-table__header\" *ngFor=\"let column of columns\">\n {{ column.labelTranslationKey | translate }}\n </th>\n <th *ngIf=\"showEditButtons\" class=\"v-table__header\"></th>\n </tr>\n </thead>\n</ng-template>\n\n<ng-template #tableBody let-tableItems=\"tableItems\">\n <tbody class=\"v-table__body\" *ngIf=\"!loading && tableItems && tableItems?.length > 0\">\n <tr *ngFor=\"let item of tableItems\" class=\"v-table__row\">\n <ng-container *ngTemplateOutlet=\"tableCell; context: {item: item}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableEditButtonCell; context: {item: item}\"></ng-container>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableBodyNoResults let-tableItems=\"tableItems\">\n <tbody class=\"v-table__body\" *ngIf=\"!loading && tableItems && tableItems?.length === 0\">\n <tr class=\"v-table__row\">\n <td class=\"v-table__cell\" *ngFor=\"let column of columns; let i = index\">\n <span *ngIf=\"i === 0\" class=\"v-table__cell-content\">\n {{\n noResultsTranslationKey\n ? (noResultsTranslationKey | translate)\n : ('interface.noResults' | translate)\n }}\n </span>\n </td>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableCell let-item=\"item\">\n <td *ngFor=\"let column of columns\" class=\"v-table__cell\">\n <span class=\"v-table__cell-content\">\n {{ item[column.dataKey] }}\n </span>\n </td>\n</ng-template>\n\n<ng-template #tableEditButtonCell let-item=\"item\">\n <td *ngIf=\"showEditButtons\" class=\"v-table__cell v-table__cell--with-button\">\n <span class=\"v-table__cell-button-container\">\n <button cdsButton=\"secondary\" (click)=\"editButtonClicked.emit(item)\">\n {{ editButtonTranslationKey || 'interface.edit' | translate }}\n </button>\n </span>\n </td>\n</ng-template>\n\n<ng-template #tableBodyLoading>\n <tbody class=\"v-table__body\" *ngIf=\"loading\">\n <tr *ngFor=\"let item of getArrayOfLength(amountOfLoadingRows)\" class=\"v-table__row\">\n <ng-container *ngTemplateOutlet=\"tableCellLoading\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableEditButtonCellLoading\"></ng-container>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableCellLoading>\n <td *ngFor=\"let column of columns\" class=\"v-table__cell\">\n <span class=\"v-table__cell-content\"\n ><ngx-skeleton-loader\n appearance=\"line\"\n [theme]=\"{\n width: 'var(--v-table-loading-skeleton-width)',\n height: 'var(--v-table-loading-skeleton-line-height)',\n margin: '0',\n 'background-color': 'var(--v-table-loading-skeleton-bg-color)',\n }\"\n ></ngx-skeleton-loader\n ></span>\n </td>\n</ng-template>\n\n<ng-template #tableEditButtonCellLoading>\n <td *ngIf=\"showEditButtons\" class=\"v-table__cell v-table__cell--with-button\">\n <span class=\"v-table__cell-button-container\">\n <button cdsButton=\"secondary\" [disabled]=\"true\">\n {{ editButtonTranslationKey || 'interface.edit' | translate }}\n </button>\n </span>\n </td>\n</ng-template>\n\n<ng-template #paginationContainer let-tableItems=\"tableItems\">\n <div *ngIf=\"pagination$ | async as paginationObject\" class=\"v-table__pagination-container\">\n <div class=\"v-table__pagination-size-container\">\n <ng-container\n *ngTemplateOutlet=\"paginationSizeSelect; context: {paginationObject: paginationObject}\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n paginationSizeAmountText;\n context: {paginationObject: paginationObject, tableItems: tableItems}\n \"\n ></ng-container>\n </div>\n <ng-container\n *ngTemplateOutlet=\"paginationNavigation; context: {paginationObject: paginationObject}\"\n ></ng-container>\n </div>\n</ng-template>\n\n<ng-template #paginationSizeSelect let-paginationObject=\"paginationObject\">\n <span class=\"v-table__pagination-size-text\">{{ 'interface.show' | translate }}</span>\n <span class=\"v-table__pagination-size-select\">\n <v-select\n [items]=\"paginationOptions\"\n [clearable]=\"false\"\n [defaultSelection]=\"(defaultPaginationSize$ | async) || paginationOptions[0]\"\n [disabled]=\"loading\"\n (selectedChange)=\"setPaginationSize($event)\"\n ></v-select>\n </span>\n <span class=\"v-table__pagination-size-text\">{{\n itemsTranslationKey ? (itemsTranslationKey | translate) : ('interface.items' | translate)\n }}</span>\n</ng-template>\n\n<ng-template\n #paginationSizeAmountText\n let-paginationObject=\"paginationObject\"\n let-tableItems=\"tableItems\"\n>\n <ng-container *ngTemplateOutlet=\"paginationSizeAmountTextLoading\"></ng-container>\n <span\n class=\"v-table__pagination-amount-text\"\n *ngIf=\"!loading && tableItems && paginationObject\"\n >{{\n tableItems.length +\n ' ' +\n ('interface.of' | translate) +\n ' ' +\n paginationObject.collectionSize +\n ' ' +\n (itemsTranslationKey\n ? (itemsTranslationKey | translate)\n : ('interface.items' | translate)) +\n ' ' +\n ('interface.visible' | translate)\n }}</span\n >\n</ng-template>\n\n<ng-template #paginationSizeAmountTextLoading>\n <span class=\"v-table__pagination-amount-text\" *ngIf=\"loading\"\n ><ngx-skeleton-loader\n appearance=\"line\"\n [theme]=\"{\n width: 'var(--v-table-loading-skeleton-width)',\n height: 'var(--v-table-loading-skeleton-line-height)',\n margin: '0',\n 'background-color': 'var(--v-table-loading-skeleton-pagination-size-bg-color)',\n }\"\n ></ngx-skeleton-loader\n ></span>\n</ng-template>\n\n<ng-template #paginationNavigation let-paginationObject=\"paginationObject\">\n <div\n class=\"v-table__pagination-navigation-container\"\n *ngIf=\"paginationObject && paginationObject.collectionSize > paginationObject.size\"\n >\n <span *ngIf=\"paginationObject.page > 1\">\n <button cdsButton=\"ghost\" (click)=\"setPage('previous')\" [disabled]=\"loading\">\n {{ 'interface.previous' | translate }}\n </button>\n </span>\n\n <span *ngIf=\"paginationObject.page * paginationObject.size < paginationObject.collectionSize\">\n <button cdsButton=\"ghost\" (click)=\"setPage('next')\" [disabled]=\"loading\">\n {{ 'interface.nextArrow' | translate }}\n </button>\n </span>\n </div>\n</ng-template>\n", styles: [".v-table-container{width:100%;display:flex;flex-direction:column}.v-table{width:100%;border-spacing:var(--v-table-border-spacing);table-layout:var(--v-table-layout)}.v-table__header{color:var(--v-table-header-font-color);text-transform:var(--v-table-header-text-transform);font-size:var(--v-table-header-font-size);font-weight:var(--v-table-header-font-weight);letter-spacing:var(--v-table-header-letter-spacing);padding-block-end:var(--v-table-header-padding-block-end);padding-inline-start:var(--v-table-cell-padding-inline);padding-inline-end:var(--v-table-cell-padding-inline)}.v-table__header:first-child{padding-inline-start:var(--v-table-first-cell-padding-inline-start)}.v-table__body{outline:var(--v-table-body-border);border-radius:var(--v-border-radius-md)}.v-table__row{border-bottom:var(--v-table-row-bottom-border)}.v-table__row:first-child .v-table__cell:first-child{border-top-left-radius:var(--v-border-radius-md)}.v-table__row:first-child .v-table__cell:last-child{border-top-right-radius:var(--v-border-radius-md)}.v-table__row:last-child{border-bottom:none}.v-table__row:last-child .v-table__cell:first-child{border-bottom-left-radius:var(--v-border-radius-md)}.v-table__row:last-child .v-table__cell:last-child{border-bottom-right-radius:var(--v-border-radius-md)}.v-table__cell{padding-block-start:var(--v-table-cell-padding-block);padding-block-end:var(--v-table-cell-padding-block);padding-inline-start:var(--v-table-cell-padding-inline);padding-inline-end:var(--v-table-cell-padding-inline);background-color:var(--v-table-background-color);font-size:var(--v-font-size-smaller);font-weight:var(--v-font-weight-bold);line-height:var(--v-line-height-smaller);width:var(--v-table-cell-width)}.v-table__cell:first-child{padding-inline-start:var(--v-table-first-cell-padding-inline-start)}.v-table__cell-content{display:flex;color:var(--v-table-cell-font-color);padding-block-start:var(--v-table-cell-content-padding-block);padding-block-end:var(--v-table-cell-content-padding-block)}.v-table__cell--with-button{width:.1%;white-space:nowrap}.v-table__cell-button-container{display:flex}ngx-skeleton-loader{display:flex}.v-table__pagination-container{display:flex;width:100%;flex-direction:row;justify-content:space-between;margin-block-start:var(--v-table-pagination-margin-block)}.v-table__pagination-size-container{display:flex;flex-direction:row;align-items:center}.v-table__pagination-size-container span:not(:last-child){margin-inline-end:var(--v-table-pagination-size-spacing-inline)}.v-table__pagination-size-text{color:var(--v-table-pagination-size-text-color);font-size:var(--v-table-pagination-size-text-font-size);font-weight:var(--v-table-pagination-size-text-font-weight)}.v-table__pagination-size-select{display:flex}.v-table__pagination-amount-text{margin-inline-start:var(--v-table-pagination-amount-text-margin-inline);color:var(--v-table-pagination-size-text-color);font-size:var(--v-table-pagination-size-text-font-size);font-weight:var(--v-table-pagination-amount-text-font-weight)}.v-table__pagination-navigation-container{display:flex;flex-direction:row}.v-table__pagination-navigation-container span:not(:last-child){margin-inline-end:var(--v-table-pagination-button-spacing-inline)}\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: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i2$1.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
17650
18776
  }
17651
18777
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TableComponent, decorators: [{
17652
18778
  type: Component,
17653
18779
  args: [{ selector: 'v-table', standalone: false, 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<ng-container *ngIf=\"{items: items$ | async} as obs\">\n <div class=\"v-table-container\">\n <table class=\"v-table\">\n <ng-container *ngTemplateOutlet=\"tableHead\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableBody; context: {tableItems: obs.items}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableBodyLoading\"></ng-container>\n <ng-container\n *ngTemplateOutlet=\"tableBodyNoResults; context: {tableItems: obs.items}\"\n ></ng-container>\n </table>\n <ng-container *ngIf=\"showPagination\">\n <ng-container\n *ngTemplateOutlet=\"paginationContainer; context: {tableItems: obs.items}\"\n ></ng-container>\n </ng-container>\n </div>\n</ng-container>\n\n<ng-template #tableHead>\n <thead *ngIf=\"columns\">\n <tr>\n <th class=\"v-table__header\" *ngFor=\"let column of columns\">\n {{ column.labelTranslationKey | translate }}\n </th>\n <th *ngIf=\"showEditButtons\" class=\"v-table__header\"></th>\n </tr>\n </thead>\n</ng-template>\n\n<ng-template #tableBody let-tableItems=\"tableItems\">\n <tbody class=\"v-table__body\" *ngIf=\"!loading && tableItems && tableItems?.length > 0\">\n <tr *ngFor=\"let item of tableItems\" class=\"v-table__row\">\n <ng-container *ngTemplateOutlet=\"tableCell; context: {item: item}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableEditButtonCell; context: {item: item}\"></ng-container>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableBodyNoResults let-tableItems=\"tableItems\">\n <tbody class=\"v-table__body\" *ngIf=\"!loading && tableItems && tableItems?.length === 0\">\n <tr class=\"v-table__row\">\n <td class=\"v-table__cell\" *ngFor=\"let column of columns; let i = index\">\n <span *ngIf=\"i === 0\" class=\"v-table__cell-content\">\n {{\n noResultsTranslationKey\n ? (noResultsTranslationKey | translate)\n : ('interface.noResults' | translate)\n }}\n </span>\n </td>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableCell let-item=\"item\">\n <td *ngFor=\"let column of columns\" class=\"v-table__cell\">\n <span class=\"v-table__cell-content\">\n {{ item[column.dataKey] }}\n </span>\n </td>\n</ng-template>\n\n<ng-template #tableEditButtonCell let-item=\"item\">\n <td *ngIf=\"showEditButtons\" class=\"v-table__cell v-table__cell--with-button\">\n <span class=\"v-table__cell-button-container\">\n <button cdsButton=\"secondary\" (click)=\"editButtonClicked.emit(item)\">\n {{ editButtonTranslationKey || 'interface.edit' | translate }}\n </button>\n </span>\n </td>\n</ng-template>\n\n<ng-template #tableBodyLoading>\n <tbody class=\"v-table__body\" *ngIf=\"loading\">\n <tr *ngFor=\"let item of getArrayOfLength(amountOfLoadingRows)\" class=\"v-table__row\">\n <ng-container *ngTemplateOutlet=\"tableCellLoading\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableEditButtonCellLoading\"></ng-container>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableCellLoading>\n <td *ngFor=\"let column of columns\" class=\"v-table__cell\">\n <span class=\"v-table__cell-content\"\n ><ngx-skeleton-loader\n appearance=\"line\"\n [theme]=\"{\n width: 'var(--v-table-loading-skeleton-width)',\n height: 'var(--v-table-loading-skeleton-line-height)',\n margin: '0',\n 'background-color': 'var(--v-table-loading-skeleton-bg-color)',\n }\"\n ></ngx-skeleton-loader\n ></span>\n </td>\n</ng-template>\n\n<ng-template #tableEditButtonCellLoading>\n <td *ngIf=\"showEditButtons\" class=\"v-table__cell v-table__cell--with-button\">\n <span class=\"v-table__cell-button-container\">\n <button cdsButton=\"secondary\" [disabled]=\"true\">\n {{ editButtonTranslationKey || 'interface.edit' | translate }}\n </button>\n </span>\n </td>\n</ng-template>\n\n<ng-template #paginationContainer let-tableItems=\"tableItems\">\n <div *ngIf=\"pagination$ | async as paginationObject\" class=\"v-table__pagination-container\">\n <div class=\"v-table__pagination-size-container\">\n <ng-container\n *ngTemplateOutlet=\"paginationSizeSelect; context: {paginationObject: paginationObject}\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n paginationSizeAmountText;\n context: {paginationObject: paginationObject, tableItems: tableItems}\n \"\n ></ng-container>\n </div>\n <ng-container\n *ngTemplateOutlet=\"paginationNavigation; context: {paginationObject: paginationObject}\"\n ></ng-container>\n </div>\n</ng-template>\n\n<ng-template #paginationSizeSelect let-paginationObject=\"paginationObject\">\n <span class=\"v-table__pagination-size-text\">{{ 'interface.show' | translate }}</span>\n <span class=\"v-table__pagination-size-select\">\n <v-select\n [items]=\"paginationOptions\"\n [clearable]=\"false\"\n [defaultSelection]=\"(defaultPaginationSize$ | async) || paginationOptions[0]\"\n [disabled]=\"loading\"\n (selectedChange)=\"setPaginationSize($event)\"\n ></v-select>\n </span>\n <span class=\"v-table__pagination-size-text\">{{\n itemsTranslationKey ? (itemsTranslationKey | translate) : ('interface.items' | translate)\n }}</span>\n</ng-template>\n\n<ng-template\n #paginationSizeAmountText\n let-paginationObject=\"paginationObject\"\n let-tableItems=\"tableItems\"\n>\n <ng-container *ngTemplateOutlet=\"paginationSizeAmountTextLoading\"></ng-container>\n <span\n class=\"v-table__pagination-amount-text\"\n *ngIf=\"!loading && tableItems && paginationObject\"\n >{{\n tableItems.length +\n ' ' +\n ('interface.of' | translate) +\n ' ' +\n paginationObject.collectionSize +\n ' ' +\n (itemsTranslationKey\n ? (itemsTranslationKey | translate)\n : ('interface.items' | translate)) +\n ' ' +\n ('interface.visible' | translate)\n }}</span\n >\n</ng-template>\n\n<ng-template #paginationSizeAmountTextLoading>\n <span class=\"v-table__pagination-amount-text\" *ngIf=\"loading\"\n ><ngx-skeleton-loader\n appearance=\"line\"\n [theme]=\"{\n width: 'var(--v-table-loading-skeleton-width)',\n height: 'var(--v-table-loading-skeleton-line-height)',\n margin: '0',\n 'background-color': 'var(--v-table-loading-skeleton-pagination-size-bg-color)',\n }\"\n ></ngx-skeleton-loader\n ></span>\n</ng-template>\n\n<ng-template #paginationNavigation let-paginationObject=\"paginationObject\">\n <div\n class=\"v-table__pagination-navigation-container\"\n *ngIf=\"paginationObject && paginationObject.collectionSize > paginationObject.size\"\n >\n <span *ngIf=\"paginationObject.page > 1\">\n <button cdsButton=\"ghost\" (click)=\"setPage('previous')\" [disabled]=\"loading\">\n {{ 'interface.previous' | translate }}\n </button>\n </span>\n\n <span *ngIf=\"paginationObject.page * paginationObject.size < paginationObject.collectionSize\">\n <button cdsButton=\"ghost\" (click)=\"setPage('next')\" [disabled]=\"loading\">\n {{ 'interface.nextArrow' | translate }}\n </button>\n </span>\n </div>\n</ng-template>\n", styles: [".v-table-container{width:100%;display:flex;flex-direction:column}.v-table{width:100%;border-spacing:var(--v-table-border-spacing);table-layout:var(--v-table-layout)}.v-table__header{color:var(--v-table-header-font-color);text-transform:var(--v-table-header-text-transform);font-size:var(--v-table-header-font-size);font-weight:var(--v-table-header-font-weight);letter-spacing:var(--v-table-header-letter-spacing);padding-block-end:var(--v-table-header-padding-block-end);padding-inline-start:var(--v-table-cell-padding-inline);padding-inline-end:var(--v-table-cell-padding-inline)}.v-table__header:first-child{padding-inline-start:var(--v-table-first-cell-padding-inline-start)}.v-table__body{outline:var(--v-table-body-border);border-radius:var(--v-border-radius-md)}.v-table__row{border-bottom:var(--v-table-row-bottom-border)}.v-table__row:first-child .v-table__cell:first-child{border-top-left-radius:var(--v-border-radius-md)}.v-table__row:first-child .v-table__cell:last-child{border-top-right-radius:var(--v-border-radius-md)}.v-table__row:last-child{border-bottom:none}.v-table__row:last-child .v-table__cell:first-child{border-bottom-left-radius:var(--v-border-radius-md)}.v-table__row:last-child .v-table__cell:last-child{border-bottom-right-radius:var(--v-border-radius-md)}.v-table__cell{padding-block-start:var(--v-table-cell-padding-block);padding-block-end:var(--v-table-cell-padding-block);padding-inline-start:var(--v-table-cell-padding-inline);padding-inline-end:var(--v-table-cell-padding-inline);background-color:var(--v-table-background-color);font-size:var(--v-font-size-smaller);font-weight:var(--v-font-weight-bold);line-height:var(--v-line-height-smaller);width:var(--v-table-cell-width)}.v-table__cell:first-child{padding-inline-start:var(--v-table-first-cell-padding-inline-start)}.v-table__cell-content{display:flex;color:var(--v-table-cell-font-color);padding-block-start:var(--v-table-cell-content-padding-block);padding-block-end:var(--v-table-cell-content-padding-block)}.v-table__cell--with-button{width:.1%;white-space:nowrap}.v-table__cell-button-container{display:flex}ngx-skeleton-loader{display:flex}.v-table__pagination-container{display:flex;width:100%;flex-direction:row;justify-content:space-between;margin-block-start:var(--v-table-pagination-margin-block)}.v-table__pagination-size-container{display:flex;flex-direction:row;align-items:center}.v-table__pagination-size-container span:not(:last-child){margin-inline-end:var(--v-table-pagination-size-spacing-inline)}.v-table__pagination-size-text{color:var(--v-table-pagination-size-text-color);font-size:var(--v-table-pagination-size-text-font-size);font-weight:var(--v-table-pagination-size-text-font-weight)}.v-table__pagination-size-select{display:flex}.v-table__pagination-amount-text{margin-inline-start:var(--v-table-pagination-amount-text-margin-inline);color:var(--v-table-pagination-size-text-color);font-size:var(--v-table-pagination-size-text-font-size);font-weight:var(--v-table-pagination-amount-text-font-weight)}.v-table__pagination-navigation-container{display:flex;flex-direction:row}.v-table__pagination-navigation-container span:not(:last-child){margin-inline-end:var(--v-table-pagination-button-spacing-inline)}\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"] }]
17654
- }], ctorParameters: () => [{ type: i3.BreakpointObserver }], propDecorators: { items: [{
18780
+ }], ctorParameters: () => [{ type: i3$1.BreakpointObserver }], propDecorators: { items: [{
17655
18781
  type: Input
17656
18782
  }], columns: [{
17657
18783
  type: Input
@@ -18698,186 +19824,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
18698
19824
  type: Output
18699
19825
  }] } });
18700
19826
 
18701
- /*
18702
- * Copyright 2015-2026 Ritense BV, the Netherlands.
18703
- *
18704
- * Licensed under EUPL, Version 1.2 (the "License");
18705
- * you may not use this file except in compliance with the License.
18706
- * You may obtain a copy of the License at
18707
- *
18708
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
18709
- *
18710
- * Unless required by applicable law or agreed to in writing, software
18711
- * distributed under the License is distributed on an "AS IS" basis,
18712
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18713
- * See the License for the specific language governing permissions and
18714
- * limitations under the License.
18715
- */
18716
- class AutoKeyInputComponent {
18717
- set mode(value) {
18718
- this._mode$.next(value);
18719
- }
18720
- get mode$() {
18721
- return this._mode$.pipe(filter(mode => !!mode));
18722
- }
18723
- set usedKeys(value) {
18724
- this._usedKeys$.next(value || []);
18725
- }
18726
- set sourceText(value) {
18727
- this._sourceText$.next(value || '');
18728
- }
18729
- constructor(iconService) {
18730
- this.iconService = iconService;
18731
- this.labelTranslationKey = 'Key';
18732
- this.placeholderTranslationKey = '';
18733
- this.testIds = AUTO_KEY_INPUT_TEST_IDS;
18734
- this._mode$ = new BehaviorSubject(null);
18735
- this._usedKeys$ = new BehaviorSubject([]);
18736
- this._sourceText$ = new BehaviorSubject('');
18737
- this.$disabled = signal(false);
18738
- this.value = '';
18739
- this.editingKey$ = new BehaviorSubject(true);
18740
- this.duplicateInitialized = false;
18741
- this.idError$ = new BehaviorSubject(null);
18742
- this.onChange = (_) => { };
18743
- this.onTouched = () => { };
18744
- this.onValidatorChange = () => { };
18745
- this.validate = (control) => this.idError$.getValue() ? { idError: { value: this.idError$.getValue() } } : null;
18746
- this.subscription = new Subscription();
18747
- this.iconService.registerAll([Edit16, Close16]);
18748
- this.subscription.add(this.mode$.subscribe(mode => {
18749
- this.editingKey$.next(mode === 'edit');
18750
- if (mode === 'duplicate') {
18751
- this.duplicateInitialized = false;
18752
- }
18753
- }));
18754
- this.subscription.add(combineLatest([this.mode$, this.editingKey$, this._usedKeys$, this._sourceText$]).subscribe(([mode, editingKey, usedKeys, sourceText]) => {
18755
- if (mode === 'add' || mode === 'duplicate') {
18756
- this.updateKey(mode, editingKey, usedKeys, sourceText);
18757
- }
18758
- }));
18759
- }
18760
- ngOnChanges() {
18761
- this.onValidatorChange();
18762
- }
18763
- ngOnDestroy() {
18764
- this.subscription.unsubscribe();
18765
- this.duplicateInitialized = false;
18766
- this.idError$.next(null);
18767
- }
18768
- setDisabledState(disabled) {
18769
- this.$disabled.set(disabled);
18770
- }
18771
- writeValue(value) {
18772
- if (value === null || value === '') {
18773
- this.resetInternalState();
18774
- return;
18775
- }
18776
- this.value = value ?? '';
18777
- }
18778
- registerOnChange(fn) {
18779
- this.onChange = fn;
18780
- }
18781
- registerOnTouched(fn) {
18782
- this.onTouched = fn;
18783
- }
18784
- registerOnValidatorChange(fn) {
18785
- this.onValidatorChange = fn;
18786
- }
18787
- onInputChange(event) {
18788
- const usedKeys = this._usedKeys$.getValue();
18789
- this.idError$.next(usedKeys.includes(event.target.value) ? 'caseManagement.statuses.keyDuplicated' : null);
18790
- this.onChange((this.value = event.target.value));
18791
- }
18792
- enableKeyEditing() {
18793
- this.editingKey$.next(true);
18794
- }
18795
- disableKeyEditing() {
18796
- this.editingKey$.next(false);
18797
- }
18798
- getUniqueKey(sourceText, usedKeys) {
18799
- const baseKey = sourceText
18800
- .toLowerCase()
18801
- .replace(/[^a-z0-9-_]+|-[^a-z0-9]+/g, '-')
18802
- .replace(/_[-_]+/g, '_')
18803
- .replace(/^[^a-z]+/g, '');
18804
- if (!usedKeys.includes(baseKey) || this._mode$.getValue() === 'edit') {
18805
- return baseKey;
18806
- }
18807
- return this.getUniqueKeyWithNumber(baseKey, usedKeys);
18808
- }
18809
- resetInternalState() {
18810
- this.value = '';
18811
- this.idError$.next(null);
18812
- this.disableKeyEditing();
18813
- this.duplicateInitialized = false;
18814
- }
18815
- updateKey(mode, editingKey, usedKeys, sourceText) {
18816
- if (editingKey) {
18817
- return;
18818
- }
18819
- let newKey = sourceText ? this.getUniqueKey(sourceText, usedKeys) : '';
18820
- if (mode === 'duplicate' && !this.duplicateInitialized && newKey) {
18821
- newKey = `${newKey}-duplicate`;
18822
- this.duplicateInitialized = true;
18823
- }
18824
- this.value = newKey;
18825
- this.onChange(newKey);
18826
- }
18827
- getUniqueKeyWithNumber(base, usedKeys, suffix = 1) {
18828
- const newKey = `${base}-${suffix}`;
18829
- if (usedKeys.includes(newKey)) {
18830
- return this.getUniqueKeyWithNumber(base, usedKeys, suffix + 1);
18831
- }
18832
- return newKey;
18833
- }
18834
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AutoKeyInputComponent, deps: [{ token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
18835
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: AutoKeyInputComponent, isStandalone: true, selector: "valtimo-auto-key-input", inputs: { labelTranslationKey: "labelTranslationKey", placeholderTranslationKey: "placeholderTranslationKey", mode: "mode", usedKeys: "usedKeys", sourceText: "sourceText" }, providers: [
18836
- {
18837
- provide: NG_VALUE_ACCESSOR,
18838
- useExisting: forwardRef(() => AutoKeyInputComponent),
18839
- multi: true,
18840
- },
18841
- {
18842
- provide: NG_VALIDATORS,
18843
- useExisting: forwardRef(() => AutoKeyInputComponent),
18844
- multi: true,
18845
- },
18846
- ], usesOnChanges: true, 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<cds-label\n *ngIf=\"{\n mode: mode$ | async,\n idError: idError$ | async,\n editingKey: editingKey$ | async,\n } as obs\"\n [invalid]=\"!!obs.idError\"\n [invalidText]=\"obs.idError | translate\"\n>\n {{ labelTranslationKey | translate }}\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"\n obs.mode === 'add' && !obs.editingKey\n ? ('caseManagement.statuses.keyAutoGenerated' | translate)\n : (placeholderTranslationKey | translate)\n \"\n [readOnly]=\"!obs.editingKey || obs.mode === 'edit'\"\n [invalid]=\"!!obs.idError\"\n [attr.data-test-id]=\"testIds.input\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n\n <cds-icon-button\n *ngIf=\"(obs.mode === 'add' || obs.mode === 'duplicate') && !obs.editingKey\"\n [disabled]=\"$disabled()\"\n [attr.data-test-id]=\"testIds.editButton\"\n (click)=\"enableKeyEditing()\"\n kind=\"secondary\"\n >\n <svg cdsIcon=\"edit\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n\n <cds-icon-button\n *ngIf=\"obs.mode === 'add' && obs.editingKey\"\n [disabled]=\"$disabled()\"\n (click)=\"disableKeyEditing()\"\n kind=\"secondary\"\n >\n <svg cdsIcon=\"close\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n </div>\n</cds-label>\n", styles: [".edit-key-input{display:flex;align-items:center;gap:8px;width:100%}.edit-key-input input[cdsText]{flex:1 1 auto}.edit-key-input cds-icon-button{flex-shrink:0;margin-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: InputModule$1 }, { kind: "component", type: i2$3.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2$3.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2$3.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: IconModule }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18847
- }
18848
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AutoKeyInputComponent, decorators: [{
18849
- type: Component,
18850
- args: [{ selector: 'valtimo-auto-key-input', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
18851
- CommonModule,
18852
- ReactiveFormsModule,
18853
- TranslateModule,
18854
- InputModule$1,
18855
- ButtonModule,
18856
- IconModule,
18857
- ], providers: [
18858
- {
18859
- provide: NG_VALUE_ACCESSOR,
18860
- useExisting: forwardRef(() => AutoKeyInputComponent),
18861
- multi: true,
18862
- },
18863
- {
18864
- provide: NG_VALIDATORS,
18865
- useExisting: forwardRef(() => AutoKeyInputComponent),
18866
- multi: true,
18867
- },
18868
- ], 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<cds-label\n *ngIf=\"{\n mode: mode$ | async,\n idError: idError$ | async,\n editingKey: editingKey$ | async,\n } as obs\"\n [invalid]=\"!!obs.idError\"\n [invalidText]=\"obs.idError | translate\"\n>\n {{ labelTranslationKey | translate }}\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"\n obs.mode === 'add' && !obs.editingKey\n ? ('caseManagement.statuses.keyAutoGenerated' | translate)\n : (placeholderTranslationKey | translate)\n \"\n [readOnly]=\"!obs.editingKey || obs.mode === 'edit'\"\n [invalid]=\"!!obs.idError\"\n [attr.data-test-id]=\"testIds.input\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n\n <cds-icon-button\n *ngIf=\"(obs.mode === 'add' || obs.mode === 'duplicate') && !obs.editingKey\"\n [disabled]=\"$disabled()\"\n [attr.data-test-id]=\"testIds.editButton\"\n (click)=\"enableKeyEditing()\"\n kind=\"secondary\"\n >\n <svg cdsIcon=\"edit\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n\n <cds-icon-button\n *ngIf=\"obs.mode === 'add' && obs.editingKey\"\n [disabled]=\"$disabled()\"\n (click)=\"disableKeyEditing()\"\n kind=\"secondary\"\n >\n <svg cdsIcon=\"close\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n </div>\n</cds-label>\n", styles: [".edit-key-input{display:flex;align-items:center;gap:8px;width:100%}.edit-key-input input[cdsText]{flex:1 1 auto}.edit-key-input cds-icon-button{flex-shrink:0;margin-left:4px}\n"] }]
18869
- }], ctorParameters: () => [{ type: i2$3.IconService }], propDecorators: { labelTranslationKey: [{
18870
- type: Input
18871
- }], placeholderTranslationKey: [{
18872
- type: Input
18873
- }], mode: [{
18874
- type: Input
18875
- }], usedKeys: [{
18876
- type: Input
18877
- }], sourceText: [{
18878
- type: Input
18879
- }] } });
18880
-
18881
19827
  /*
18882
19828
  * Copyright 2015-2025 Ritense BV, the Netherlands.
18883
19829
  *
@@ -19245,7 +20191,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
19245
20191
  }] } });
19246
20192
 
19247
20193
  /*
19248
- * Copyright 2015-2025 Ritense BV, the Netherlands.
20194
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
19249
20195
  *
19250
20196
  * Licensed under EUPL, Version 1.2 (the "License");
19251
20197
  * you may not use this file except in compliance with the License.
@@ -19267,6 +20213,7 @@ class MdiIconSelectorComponent {
19267
20213
  this.placeholderTranslationKey = 'interface.iconPlaceholder';
19268
20214
  this.appendInline = true;
19269
20215
  this.dropUp = false;
20216
+ this.fullWidth = false;
19270
20217
  this.$disabled = signal(false);
19271
20218
  this.value$ = new BehaviorSubject(null);
19272
20219
  this.items$ = combineLatest([
@@ -19297,13 +20244,13 @@ class MdiIconSelectorComponent {
19297
20244
  this.onChangeFn(event.key);
19298
20245
  }
19299
20246
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MdiIconSelectorComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
19300
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: MdiIconSelectorComponent, isStandalone: true, selector: "valtimo-mdi-icon-selector", inputs: { labelTranslationKey: "labelTranslationKey", tooltipTranslationKey: "tooltipTranslationKey", placeholderTranslationKey: "placeholderTranslationKey", appendInline: "appendInline", dropUp: "dropUp" }, providers: [
20247
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: MdiIconSelectorComponent, isStandalone: true, selector: "valtimo-mdi-icon-selector", inputs: { labelTranslationKey: "labelTranslationKey", tooltipTranslationKey: "tooltipTranslationKey", placeholderTranslationKey: "placeholderTranslationKey", appendInline: "appendInline", dropUp: "dropUp", fullWidth: "fullWidth" }, providers: [
19301
20248
  {
19302
20249
  provide: NG_VALUE_ACCESSOR,
19303
20250
  useExisting: forwardRef(() => MdiIconSelectorComponent),
19304
20251
  multi: true,
19305
20252
  },
19306
- ], 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<cds-text-label>\n <v-input-label\n [title]=\"labelTranslationKey | translate\"\n [tooltip]=\"tooltipTranslationKey | translate\"\n >\n </v-input-label>\n\n <div class=\"mdi-icon-selector\">\n <span class=\"mdi-icon-preview mdi\" [ngClass]=\"(value$ | async) || 'mdi-minus'\"></span>\n\n <cds-combo-box\n [items]=\"(items$ | async) || []\"\n [placeholder]=\"placeholderTranslationKey | translate\"\n [disabled]=\"$disabled()\"\n (selected)=\"onSelected($event)\"\n [appendInline]=\"appendInline\"\n [dropUp]=\"dropUp\"\n (blur)=\"onTouched()\"\n >\n <cds-dropdown-list [listTpl]=\"iconListTemplate\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n</cds-text-label>\n\n<ng-template #iconListTemplate let-item=\"item\">\n <div class=\"mdi-list-item\">\n <span class=\"mdi\" [ngClass]=\"item.key\" aria-hidden=\"true\"></span>\n\n <span>{{ item.content }}</span>\n </div>\n</ng-template>\n", styles: [".mdi-icon-selector{display:flex;align-items:center;gap:8px;width:350px}.mdi-icon-selector cds-combo-box{flex:1 1 auto;min-width:0}:host ::ng-deep .cds--list-box{background:var(--cds-layer-01)}.mdi-icon-preview{width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:18px}.mdi-list-item{display:flex;flex-direction:row;gap:8px;align-items:center}.mdi-list-item .mdi{font-size: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: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ComboBoxModule }, { kind: "component", type: i2$3.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i2$3.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: InputModule$1 }, { kind: "component", type: i2$3.TextInputLabelComponent, selector: "cds-text-label, ibm-text-label", inputs: ["labelInputID", "disabled", "skeleton", "labelTemplate", "textInputTemplate", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel", "fluid"] }, { kind: "ngmodule", type: IconModule }, { kind: "ngmodule", type: TagModule }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20253
+ ], 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<cds-text-label>\n <v-input-label\n [title]=\"labelTranslationKey | translate\"\n [tooltip]=\"tooltipTranslationKey | translate\"\n >\n </v-input-label>\n\n <div class=\"mdi-icon-selector\" [class.mdi-icon-selector--full-width]=\"fullWidth\">\n <span class=\"mdi-icon-preview mdi\" [ngClass]=\"(value$ | async) || 'mdi-minus'\"></span>\n\n <cds-combo-box\n [items]=\"(items$ | async) || []\"\n [placeholder]=\"placeholderTranslationKey | translate\"\n [disabled]=\"$disabled()\"\n (selected)=\"onSelected($event)\"\n [appendInline]=\"appendInline\"\n [dropUp]=\"dropUp\"\n (blur)=\"onTouched()\"\n >\n <cds-dropdown-list [listTpl]=\"iconListTemplate\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n</cds-text-label>\n\n<ng-template #iconListTemplate let-item=\"item\">\n <div class=\"mdi-list-item\">\n <span class=\"mdi\" [ngClass]=\"item.key\" aria-hidden=\"true\"></span>\n\n <span>{{ item.content }}</span>\n </div>\n</ng-template>\n", styles: [".mdi-icon-selector{display:flex;align-items:center;gap:8px;width:350px}.mdi-icon-selector cds-combo-box{flex:1 1 auto;min-width:0}.mdi-icon-selector--full-width{width:100%}:host ::ng-deep .cds--list-box{background:var(--cds-field)}.mdi-icon-preview{width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:18px}.mdi-list-item{display:flex;flex-direction:row;gap:8px;align-items:center}.mdi-list-item .mdi{font-size: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: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ComboBoxModule }, { kind: "component", type: i2$3.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i2$3.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: InputModule$1 }, { kind: "component", type: i2$3.TextInputLabelComponent, selector: "cds-text-label, ibm-text-label", inputs: ["labelInputID", "disabled", "skeleton", "labelTemplate", "textInputTemplate", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel", "fluid"] }, { kind: "ngmodule", type: IconModule }, { kind: "ngmodule", type: TagModule }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19307
20254
  }
19308
20255
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MdiIconSelectorComponent, decorators: [{
19309
20256
  type: Component,
@@ -19322,7 +20269,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
19322
20269
  useExisting: forwardRef(() => MdiIconSelectorComponent),
19323
20270
  multi: true,
19324
20271
  },
19325
- ], 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<cds-text-label>\n <v-input-label\n [title]=\"labelTranslationKey | translate\"\n [tooltip]=\"tooltipTranslationKey | translate\"\n >\n </v-input-label>\n\n <div class=\"mdi-icon-selector\">\n <span class=\"mdi-icon-preview mdi\" [ngClass]=\"(value$ | async) || 'mdi-minus'\"></span>\n\n <cds-combo-box\n [items]=\"(items$ | async) || []\"\n [placeholder]=\"placeholderTranslationKey | translate\"\n [disabled]=\"$disabled()\"\n (selected)=\"onSelected($event)\"\n [appendInline]=\"appendInline\"\n [dropUp]=\"dropUp\"\n (blur)=\"onTouched()\"\n >\n <cds-dropdown-list [listTpl]=\"iconListTemplate\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n</cds-text-label>\n\n<ng-template #iconListTemplate let-item=\"item\">\n <div class=\"mdi-list-item\">\n <span class=\"mdi\" [ngClass]=\"item.key\" aria-hidden=\"true\"></span>\n\n <span>{{ item.content }}</span>\n </div>\n</ng-template>\n", styles: [".mdi-icon-selector{display:flex;align-items:center;gap:8px;width:350px}.mdi-icon-selector cds-combo-box{flex:1 1 auto;min-width:0}:host ::ng-deep .cds--list-box{background:var(--cds-layer-01)}.mdi-icon-preview{width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:18px}.mdi-list-item{display:flex;flex-direction:row;gap:8px;align-items:center}.mdi-list-item .mdi{font-size: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"] }]
20272
+ ], 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<cds-text-label>\n <v-input-label\n [title]=\"labelTranslationKey | translate\"\n [tooltip]=\"tooltipTranslationKey | translate\"\n >\n </v-input-label>\n\n <div class=\"mdi-icon-selector\" [class.mdi-icon-selector--full-width]=\"fullWidth\">\n <span class=\"mdi-icon-preview mdi\" [ngClass]=\"(value$ | async) || 'mdi-minus'\"></span>\n\n <cds-combo-box\n [items]=\"(items$ | async) || []\"\n [placeholder]=\"placeholderTranslationKey | translate\"\n [disabled]=\"$disabled()\"\n (selected)=\"onSelected($event)\"\n [appendInline]=\"appendInline\"\n [dropUp]=\"dropUp\"\n (blur)=\"onTouched()\"\n >\n <cds-dropdown-list [listTpl]=\"iconListTemplate\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n</cds-text-label>\n\n<ng-template #iconListTemplate let-item=\"item\">\n <div class=\"mdi-list-item\">\n <span class=\"mdi\" [ngClass]=\"item.key\" aria-hidden=\"true\"></span>\n\n <span>{{ item.content }}</span>\n </div>\n</ng-template>\n", styles: [".mdi-icon-selector{display:flex;align-items:center;gap:8px;width:350px}.mdi-icon-selector cds-combo-box{flex:1 1 auto;min-width:0}.mdi-icon-selector--full-width{width:100%}:host ::ng-deep .cds--list-box{background:var(--cds-field)}.mdi-icon-preview{width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:18px}.mdi-list-item{display:flex;flex-direction:row;gap:8px;align-items:center}.mdi-list-item .mdi{font-size: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"] }]
19326
20273
  }], ctorParameters: () => [{ type: i1.TranslateService }], propDecorators: { labelTranslationKey: [{
19327
20274
  type: Input
19328
20275
  }], tooltipTranslationKey: [{
@@ -19333,6 +20280,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
19333
20280
  type: Input
19334
20281
  }], dropUp: [{
19335
20282
  type: Input
20283
+ }], fullWidth: [{
20284
+ type: Input
19336
20285
  }] } });
19337
20286
 
19338
20287
  /*
@@ -21079,5 +22028,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
21079
22028
  * Generated bundle index. Do not edit.
21080
22029
  */
21081
22030
 
21082
- export { ARBITRARY_AMOUNT_VALUE_TEST_IDS, AUTO_KEY_INPUT_TEST_IDS, AdminSettingsService, Alert, AlertComponent, AlertModule, AlertService, AlertType, AlertsOptionsImpl, AssignmentComponent, AutoKeyInputComponent, BOOLEAN_CONVERTER_VALUES, BpmnJsDiagramComponent, BpmnJsDiagramModule, BreadcrumbNavigationComponent, BreadcrumbNavigationModule, BreadcrumbService, CARBON_CONSTANTS, CARBON_THEME, CASES_WITHOUT_STATUS_KEY, COLOR_PICKER_TEST_IDS, CONFIRMATION_MODAL_TEST_IDS, CamundaFormComponent, CamundaFormModule, CarbonListComponent, CarbonListFilterPipe, CarbonListModule, CarbonMultiInputComponent, CarbonMultiInputModule, CarbonNoResultsComponent, CaseCountPipe, CaseTagsSelectorComponent, CdsThemeService, ChoiceFieldService, ColorPickerComponent, ComponentsPipesModule, ConfirmationModalComponent, ConfirmationModalModule, ContextMenuDirective, CtrlClickDirective, CurrentCarbonTheme, DEFAULT_LIST_TRANSLATIONS, DEFAULT_PAGINATION, DEFAULT_PAGINATOR_CONFIG, DataListComponent, DataListModule, DatePickerComponent, DatePickerModule, DateTimePickerComponent, DigitOnlyDirective, DropzoneComponent, DropzoneModule, EditorComponent, EditorModule, EllipsisPipe, ExpansionPanelComponent, ExpansionPanelModule, FieldAutoFocusDirective, FieldAutoFocusModule, FileSizeModule, FileSizePipe, FilterSidebarComponent, FilterSidebarModule, FitPageDirective, FormComponent, FormIoCurrencyComponent, FormIoCurrentUserComponent, FormIoDomService, FormIoIbanComponent, FormIoMailPreviewComponent, FormIoModule, FormIoStateService, FormIoTagsService, FormIoUploaderComponent, FormModule, FormioBuilderComponent, FormioComponent, FormioDummyComponent, FormioOptionsImpl, FormioValueResolverSelectorComponent, InputComponent, InputLabelComponent, InputLabelModule, InputModule, IsArrayPipe, JSON_EDITOR_TEST_IDS, JsonEditorComponent, KEY_DROPDOWN_VALUE_TEST_IDS, KEY_VALUE_PATH_SELECTOR_TEST_IDS, KEY_VALUE_TEST_IDS, KeyGeneratorService, LeftSidebarComponent, LeftSidebarModule, ListColumnViewComponent, MULTI_INPUT_TEST_IDS, MdiIconSelectorComponent, MdiIconViewerComponent, MenuItemTextComponent, MenuItemTranslationPipe, MenuModule, MenuRoutingModule, MenuService, ModalComponent, ModalModule, ModalService, MonacoTheme, MoveRowDirection, MultiInputFormComponent, MultiInputFormModule, MultiselectDropdownComponent, MultiselectDropdownModule, MuuriDirective, MuuriDirectiveModule, MuuriItemComponent, ObjectManagementSelectComponent, ObjectManagementSelectService, ObserveSizeDirective, OverflowMenuComponent, OverflowMenuModule, OverflowMenuOptionComponent, OverflowMenuTriggerComponent, POPULAR_MDI_ICONS, PageHeaderComponent, PageHeaderModule, PageHeaderService, PageSubtitleService, PageTitleComponent, PageTitleModule, PageTitleService, ParagraphComponent, ParagraphModule, PendingChangesComponent, PendingChangesService, ProgressBarComponent, ProgressBarModule, PromptComponent, PromptModule, PromptService, QUICK_SEARCH_SERVICE, QuickSearchComponent, QuickSearchStateService, RIGHT_SIDEBAR_TEST_IDS, RadioComponent, RadioModule, ReadOnlyDirective, RemoveClassnamesDirective, RenderInBodyComponent, RenderInPageHeaderDirective, RenderPageHeaderDirective, RightSidebarComponent, RightSidebarModule, SCHEMA_EDITOR_REQUIRED_PROPERTY_TEST_ID_PREFIX, SCHEMA_EDITOR_TEST_IDS, SEARCH_FIELDS_TEST_IDS, SEARCH_FIELD_TEST_ID_PREFIX, SINGLE_VALUE_TEST_IDS, STEPPER_FOOTER_STEP_TEST_IDS, SchemaEditorComponent, SearchFieldsComponent, SearchFieldsModule, SelectComponent, SelectModule, SelectableCarbonTheme, ShellService, SpinnerComponent, SpinnerModule, StatusSelectorComponent, StepperContainerComponent, StepperContentComponent, StepperFooterComponent, StepperFooterStepComponent, StepperHeaderComponent, StepperModule, StepperService, StepperStepComponent, TAG_ELLIPSIS_LIMIT, TableComponent, TableModule, TimelineComponent, TimelineItemImpl, TimelineModule, TooltipComponent, TooltipDirective, TooltipIconComponent, TooltipIconModule, TooltipModule, TopbarComponent, TopbarModule, UploaderComponent, UploaderDragDropDirective, UploaderModule, UserInterfaceService, VALUE_PATH_SELECTOR_DROPDOWN_VALUE_TEST_IDS, VALUE_PATH_SELECTOR_TEST_IDS, VALUE_PATH_SELECTOR_VALUE_TEST_IDS, VModalComponent, VModalModule, ValtimoCdsModalDirective, ValtimoModalService, ValuePathSelectorComponent, ValuePathSelectorInputMode, ValuePathSelectorPrefix, ValuePathSelectorService, ValuePathType, ViewContentService, ViewType, WIDGET_LAYOUT_TRANSLATION_KEYS, WIDGET_LAYOUT_VALUES, WIDGET_ROW_HEIGHT_DEFAULT, WIDGET_ROW_HEIGHT_GAP_FREE, WebcamComponent, WebcamModule, WidgetComponent, WidgetLayout, WidgetLayoutInfoComponent, WidgetModule, applyDataGridPatch, collectObjectLevels, createCustomFormioComponent, customUploaderType, enableCustomFormioComponents, menuInitializer, muuriGapFreeLayout, pendingChangesGuard, registerCustomFormioComponent, registerCustomTag, registerFormioCurrencyComponent, registerFormioCurrentUserComponent, registerFormioFileSelectorComponent, registerFormioIbanComponent, registerFormioMailPreviewComponent, registerFormioUploadComponent, registerFormioValueResolverSelectorComponent, registerObjectManagementSelectFormioComponent, resolveWidgetLayout, runAfterCarbonModalClosed, setRequiredOnSchema };
22031
+ export { ARBITRARY_AMOUNT_VALUE_TEST_IDS, AUTO_KEY_INPUT_TEST_IDS, AdminSettingsService, Alert, AlertComponent, AlertModule, AlertService, AlertType, AlertsOptionsImpl, AssignmentComponent, AutoKeyInputComponent, BOOLEAN_CONVERTER_VALUES, BpmnJsDiagramComponent, BpmnJsDiagramModule, BreadcrumbNavigationComponent, BreadcrumbNavigationModule, BreadcrumbService, CARBON_CONSTANTS, CARBON_THEME, CASES_WITHOUT_STATUS_KEY, COLOR_PICKER_TEST_IDS, CONFIRMATION_MODAL_TEST_IDS, CamundaFormComponent, CamundaFormModule, CarbonListComponent, CarbonListFilterPipe, CarbonListModule, CarbonMultiInputComponent, CarbonMultiInputModule, CarbonNoResultsComponent, CaseCountPipe, CaseTagsSelectorComponent, CdsThemeService, ChoiceFieldService, ColorPickerComponent, ComponentsPipesModule, ConfirmationModalComponent, ConfirmationModalModule, ContextMenuDirective, CtrlClickDirective, CurrentCarbonTheme, DEFAULT_LIST_TRANSLATIONS, DEFAULT_PAGINATION, DEFAULT_PAGINATOR_CONFIG, DataListComponent, DataListModule, DatePickerComponent, DatePickerModule, DateTimePickerComponent, DigitOnlyDirective, DragDropListComponent, DropzoneComponent, DropzoneModule, EditorComponent, EditorModule, EllipsisPipe, ExpansionPanelComponent, ExpansionPanelModule, FieldAutoFocusDirective, FieldAutoFocusModule, FileSizeModule, FileSizePipe, FilterSidebarComponent, FilterSidebarModule, FitPageDirective, FormComponent, FormIoCurrencyComponent, FormIoCurrentUserComponent, FormIoDomService, FormIoIbanComponent, FormIoMailPreviewComponent, FormIoModule, FormIoStateService, FormIoTagsService, FormIoUploaderComponent, FormModule, FormioBuilderComponent, FormioComponent, FormioDummyComponent, FormioOptionsImpl, FormioValueResolverSelectorComponent, InputComponent, InputLabelComponent, InputLabelModule, InputModule, IsArrayPipe, JSON_EDITOR_TEST_IDS, JsonEditorComponent, KEY_DROPDOWN_VALUE_TEST_IDS, KEY_VALUE_PATH_SELECTOR_TEST_IDS, KEY_VALUE_TEST_IDS, KeyGeneratorService, LeftSidebarComponent, LeftSidebarModule, ListColumnViewComponent, MENU_CONFIGURATION_VERSION, MENU_ITEM_CATALOG, MULTI_INPUT_TEST_IDS, MdiIconSelectorComponent, MdiIconViewerComponent, MenuItemTextComponent, MenuItemTranslationPipe, MenuModule, MenuRoutingModule, MenuService, ModalComponent, ModalModule, ModalService, MonacoTheme, MoveRowDirection, MultiInputFormComponent, MultiInputFormModule, MultiselectDropdownComponent, MultiselectDropdownModule, MuuriDirective, MuuriDirectiveModule, MuuriItemComponent, ObjectManagementSelectComponent, ObjectManagementSelectService, ObserveSizeDirective, OverflowMenuComponent, OverflowMenuModule, OverflowMenuOptionComponent, OverflowMenuTriggerComponent, PLUGIN_PAGE_ROUTE, POPULAR_MDI_ICONS, PageHeaderComponent, PageHeaderModule, PageHeaderService, PageSubtitleService, PageTitleComponent, PageTitleModule, PageTitleService, ParagraphComponent, ParagraphModule, PendingChangesComponent, PendingChangesService, ProgressBarComponent, ProgressBarModule, PromptComponent, PromptModule, PromptService, QUICK_SEARCH_SERVICE, QuickSearchComponent, QuickSearchStateService, RIGHT_SIDEBAR_TEST_IDS, RadioComponent, RadioModule, ReadOnlyDirective, RemoveClassnamesDirective, RenderInBodyComponent, RenderInPageHeaderDirective, RenderPageHeaderDirective, RightSidebarComponent, RightSidebarModule, SCHEMA_EDITOR_REQUIRED_PROPERTY_TEST_ID_PREFIX, SCHEMA_EDITOR_TEST_IDS, SEARCH_FIELDS_TEST_IDS, SEARCH_FIELD_TEST_ID_PREFIX, SECTION_HEADER_TEXT_CLASS, SINGLE_VALUE_TEST_IDS, STEPPER_FOOTER_STEP_TEST_IDS, SchemaEditorComponent, SearchFieldsComponent, SearchFieldsModule, SelectComponent, SelectModule, SelectableCarbonTheme, ShellService, SpinnerComponent, SpinnerModule, StatusSelectorComponent, StepperContainerComponent, StepperContentComponent, StepperFooterComponent, StepperFooterStepComponent, StepperHeaderComponent, StepperModule, StepperService, StepperStepComponent, TAG_ELLIPSIS_LIMIT, TableComponent, TableModule, TimelineComponent, TimelineItemImpl, TimelineModule, TooltipComponent, TooltipDirective, TooltipIconComponent, TooltipIconModule, TooltipModule, TopbarComponent, TopbarModule, UploaderComponent, UploaderDragDropDirective, UploaderModule, UserInterfaceService, VALUE_PATH_SELECTOR_DROPDOWN_VALUE_TEST_IDS, VALUE_PATH_SELECTOR_TEST_IDS, VALUE_PATH_SELECTOR_VALUE_TEST_IDS, VModalComponent, VModalModule, ValtimoCdsModalDirective, ValtimoModalService, ValuePathSelectorComponent, ValuePathSelectorInputMode, ValuePathSelectorPrefix, ValuePathSelectorService, ValuePathType, ViewContentService, ViewType, WIDGET_LAYOUT_TRANSLATION_KEYS, WIDGET_LAYOUT_VALUES, WIDGET_ROW_HEIGHT_DEFAULT, WIDGET_ROW_HEIGHT_GAP_FREE, WebcamComponent, WebcamModule, WidgetComponent, WidgetLayout, WidgetLayoutInfoComponent, WidgetModule, applyDataGridPatch, buildMenuConfigurationFromRuntimeMenu, collectObjectLevels, createCustomFormioComponent, customUploaderType, enableCustomFormioComponents, findMenuCatalogEntryByLink, findMenuCatalogGroupEntryByTitle, getMenuCatalogEntry, hasSavedMenuConfiguration, includeFunctionToName, menuInitializer, menuLinkToString, muuriGapFreeLayout, normaliseMenuLink, parseIncludeFunction, pendingChangesGuard, registerCustomFormioComponent, registerCustomTag, registerFormioCurrencyComponent, registerFormioCurrentUserComponent, registerFormioFileSelectorComponent, registerFormioIbanComponent, registerFormioMailPreviewComponent, registerFormioUploadComponent, registerFormioValueResolverSelectorComponent, registerObjectManagementSelectFormioComponent, resolveMenuConfiguration, resolveWidgetLayout, runAfterCarbonModalClosed, serializeIncludeFunction, setRequiredOnSchema };
21083
22032
  //# sourceMappingURL=valtimo-components.mjs.map