@valtimo/components 13.46.0 → 13.47.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/valtimo-components.mjs +934 -33
- package/fesm2022/valtimo-components.mjs.map +1 -1
- package/lib/components/drag-drop-list/drag-drop-list.component.d.ts +76 -0
- package/lib/components/drag-drop-list/drag-drop-list.component.d.ts.map +1 -0
- package/lib/components/left-sidebar/left-sidebar.component.d.ts +3 -1
- package/lib/components/left-sidebar/left-sidebar.component.d.ts.map +1 -1
- package/lib/components/mdi-icon-selector/mdi-icon-selector.component.d.ts +2 -1
- package/lib/components/mdi-icon-selector/mdi-icon-selector.component.d.ts.map +1 -1
- package/lib/components/menu/menu-configuration.model.d.ts +87 -0
- package/lib/components/menu/menu-configuration.model.d.ts.map +1 -0
- package/lib/components/menu/menu-configuration.resolver.d.ts +19 -0
- package/lib/components/menu/menu-configuration.resolver.d.ts.map +1 -0
- package/lib/components/menu/menu-configuration.seed.d.ts +16 -0
- package/lib/components/menu/menu-configuration.seed.d.ts.map +1 -0
- package/lib/components/menu/menu-item-catalog.d.ts +59 -0
- package/lib/components/menu/menu-item-catalog.d.ts.map +1 -0
- package/lib/components/multi-input/carbon-multi-input.component.d.ts +8 -1
- package/lib/components/multi-input/carbon-multi-input.component.d.ts.map +1 -1
- package/lib/components/select/select.component.d.ts +17 -0
- package/lib/components/select/select.component.d.ts.map +1 -1
- package/lib/components/value-path-selector/value-path-selector.component.d.ts +11 -0
- package/lib/components/value-path-selector/value-path-selector.component.d.ts.map +1 -1
- package/lib/constants/mdi.constants.d.ts.map +1 -1
- package/lib/services/admin-settings.service.d.ts +3 -0
- package/lib/services/admin-settings.service.d.ts.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +5 -0
- 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, sanitizeKey, toKebabCase } 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/
|
|
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$
|
|
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(),
|
|
@@ -4871,6 +4885,813 @@ function menuInitializer(injector, logger) {
|
|
|
4871
4885
|
});
|
|
4872
4886
|
}
|
|
4873
4887
|
|
|
4888
|
+
/*
|
|
4889
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
4890
|
+
*
|
|
4891
|
+
* Licensed under EUPL, Version 1.2 (the "License");
|
|
4892
|
+
* you may not use this file except in compliance with the License.
|
|
4893
|
+
* You may obtain a copy of the License at
|
|
4894
|
+
*
|
|
4895
|
+
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
4896
|
+
*
|
|
4897
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
4898
|
+
* distributed under the License is distributed on an "AS IS" basis,
|
|
4899
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
4900
|
+
* See the License for the specific language governing permissions and
|
|
4901
|
+
* limitations under the License.
|
|
4902
|
+
*/
|
|
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;
|
|
4948
|
+
}
|
|
4949
|
+
|
|
4950
|
+
/*
|
|
4951
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
4952
|
+
*
|
|
4953
|
+
* Licensed under EUPL, Version 1.2 (the "License");
|
|
4954
|
+
* you may not use this file except in compliance with the License.
|
|
4955
|
+
* You may obtain a copy of the License at
|
|
4956
|
+
*
|
|
4957
|
+
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
4958
|
+
*
|
|
4959
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
4960
|
+
* distributed under the License is distributed on an "AS IS" basis,
|
|
4961
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
4962
|
+
* See the License for the specific language governing permissions and
|
|
4963
|
+
* limitations under the License.
|
|
4964
|
+
*/
|
|
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;
|
|
5342
|
+
}
|
|
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;
|
|
5358
|
+
}
|
|
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;
|
|
5365
|
+
}
|
|
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: [],
|
|
5415
|
+
});
|
|
5416
|
+
result.push(adminItem);
|
|
5417
|
+
}
|
|
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 ?? [])];
|
|
5423
|
+
}
|
|
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);
|
|
5456
|
+
}
|
|
5457
|
+
else {
|
|
5458
|
+
console.warn(message);
|
|
5459
|
+
}
|
|
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
|
+
|
|
4874
5695
|
/*
|
|
4875
5696
|
* Copyright 2015-2025 Ritense BV, the Netherlands.
|
|
4876
5697
|
*
|
|
@@ -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']
|
|
@@ -11205,13 +12041,20 @@ class ValuePathSelectorComponent {
|
|
|
11205
12041
|
this.onPathSelected(mappedOption);
|
|
11206
12042
|
return mappedOption;
|
|
11207
12043
|
});
|
|
11208
|
-
}), tap(() =>
|
|
12044
|
+
}), tap(() => {
|
|
12045
|
+
this.loadingValuePathItems$.next(false);
|
|
12046
|
+
this.scheduleDisplayFlush();
|
|
12047
|
+
}));
|
|
11209
12048
|
this._subscriptions = new Subscription();
|
|
12049
|
+
this._destroyed = false;
|
|
11210
12050
|
}
|
|
11211
12051
|
ngOnInit() {
|
|
11212
12052
|
this._subscriptions.add(this._selectedPath$.subscribe(path => this.valueChangeEvent.emit(path)));
|
|
11213
12053
|
}
|
|
11214
12054
|
ngOnDestroy() {
|
|
12055
|
+
this._destroyed = true;
|
|
12056
|
+
if (this._displayFlushTimeoutId !== undefined)
|
|
12057
|
+
clearTimeout(this._displayFlushTimeoutId);
|
|
11215
12058
|
this._subscriptions.unsubscribe();
|
|
11216
12059
|
}
|
|
11217
12060
|
writeValue(value) {
|
|
@@ -11220,6 +12063,28 @@ class ValuePathSelectorComponent {
|
|
|
11220
12063
|
this._inputMode$.next(ValuePathSelectorInputMode.DROPDOWN);
|
|
11221
12064
|
this.clearComboBoxSearch();
|
|
11222
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
|
+
});
|
|
11223
12088
|
}
|
|
11224
12089
|
registerOnChange(fn) {
|
|
11225
12090
|
this._onChangeFunction = fn;
|
|
@@ -11311,7 +12176,7 @@ class ValuePathSelectorComponent {
|
|
|
11311
12176
|
}
|
|
11312
12177
|
return null;
|
|
11313
12178
|
}
|
|
11314
|
-
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$
|
|
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 }); }
|
|
11315
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: [
|
|
11316
12181
|
{
|
|
11317
12182
|
provide: NG_VALUE_ACCESSOR,
|
|
@@ -11340,7 +12205,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
11340
12205
|
useExisting: forwardRef(() => ValuePathSelectorComponent),
|
|
11341
12206
|
},
|
|
11342
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"] }]
|
|
11343
|
-
}], ctorParameters: () => [{ type: ValuePathSelectorService }, { type: i2.FormBuilder }, { type: i3$
|
|
12208
|
+
}], ctorParameters: () => [{ type: ValuePathSelectorService }, { type: i2.FormBuilder }, { type: i3$2.DocumentService }, { type: i1$3.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { _showMargin: [{
|
|
11344
12209
|
type: HostBinding,
|
|
11345
12210
|
args: ['class.value-path-selector--margin-bottom']
|
|
11346
12211
|
}], _showMarginLg: [{
|
|
@@ -13496,6 +14361,7 @@ class SelectComponent {
|
|
|
13496
14361
|
content: translated,
|
|
13497
14362
|
};
|
|
13498
14363
|
})));
|
|
14364
|
+
this._destroyed = false;
|
|
13499
14365
|
this._onChange = () => { };
|
|
13500
14366
|
this._onTouched = () => { };
|
|
13501
14367
|
}
|
|
@@ -13503,17 +14369,10 @@ class SelectComponent {
|
|
|
13503
14369
|
this.setDefaultSelection();
|
|
13504
14370
|
this.openSelectedSubscription();
|
|
13505
14371
|
this.openClearSubjectSubscription();
|
|
14372
|
+
this.openDisplayFlushSubscription();
|
|
13506
14373
|
}
|
|
13507
14374
|
ngAfterViewInit() {
|
|
13508
|
-
|
|
13509
|
-
// scheduled during its own view initialization. When this component lives under an OnPush
|
|
13510
|
-
// ancestor that is not marked dirty, that update is never flushed to the DOM, so a preselected
|
|
13511
|
-
// value only becomes visible after the user interacts with the control. Because this setTimeout
|
|
13512
|
-
// is scheduled after the combobox's (lifecycle hooks of child views run first), it runs once
|
|
13513
|
-
// the combobox has set its display value, and detectChanges() flushes it to the DOM. A
|
|
13514
|
-
// setTimeout is used instead of NgZone.onStable so the flush also works in apps with
|
|
13515
|
-
// long-running background tasks that keep the zone from ever stabilizing.
|
|
13516
|
-
this._displayFlushTimeoutId = setTimeout(() => this.changeDetectorRef.detectChanges());
|
|
14375
|
+
this.scheduleDisplayFlush();
|
|
13517
14376
|
}
|
|
13518
14377
|
ngOnChanges(changes) {
|
|
13519
14378
|
if (changes?.items?.currentValue ||
|
|
@@ -13524,8 +14383,10 @@ class SelectComponent {
|
|
|
13524
14383
|
}
|
|
13525
14384
|
}
|
|
13526
14385
|
ngOnDestroy() {
|
|
14386
|
+
this._destroyed = true;
|
|
13527
14387
|
this._selectedSubscription?.unsubscribe();
|
|
13528
14388
|
this._clearSubjectSubscription?.unsubscribe();
|
|
14389
|
+
this._displayFlushSubscription?.unsubscribe();
|
|
13529
14390
|
if (this._displayFlushTimeoutId !== undefined)
|
|
13530
14391
|
clearTimeout(this._displayFlushTimeoutId);
|
|
13531
14392
|
}
|
|
@@ -13592,6 +14453,35 @@ class SelectComponent {
|
|
|
13592
14453
|
});
|
|
13593
14454
|
}
|
|
13594
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
|
+
}
|
|
13595
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 }); }
|
|
13596
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: [
|
|
13597
14487
|
{
|
|
@@ -15177,6 +16067,12 @@ class CarbonMultiInputComponent {
|
|
|
15177
16067
|
this.addButtonType = 'primary';
|
|
15178
16068
|
this.addRowTranslationKey = '';
|
|
15179
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';
|
|
15180
16076
|
this.deleteRowText = '';
|
|
15181
16077
|
this.deleteRowTranslationKey = '';
|
|
15182
16078
|
this.$disabled = signal(false);
|
|
@@ -15388,13 +16284,13 @@ class CarbonMultiInputComponent {
|
|
|
15388
16284
|
}));
|
|
15389
16285
|
}
|
|
15390
16286
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonMultiInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15391
|
-
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: [
|
|
15392
16288
|
{
|
|
15393
16289
|
provide: NG_VALUE_ACCESSOR,
|
|
15394
16290
|
useExisting: forwardRef(() => CarbonMultiInputComponent),
|
|
15395
16291
|
multi: true,
|
|
15396
16292
|
},
|
|
15397
|
-
], 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 }); }
|
|
15398
16294
|
}
|
|
15399
16295
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonMultiInputComponent, decorators: [{
|
|
15400
16296
|
type: Component,
|
|
@@ -15404,7 +16300,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
15404
16300
|
useExisting: forwardRef(() => CarbonMultiInputComponent),
|
|
15405
16301
|
multi: true,
|
|
15406
16302
|
},
|
|
15407
|
-
], 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=\"
|
|
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"] }]
|
|
15408
16304
|
}], propDecorators: { addRowText: [{
|
|
15409
16305
|
type: Input
|
|
15410
16306
|
}], addButtonType: [{
|
|
@@ -15417,6 +16313,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
15417
16313
|
type: Input
|
|
15418
16314
|
}], defaultValues: [{
|
|
15419
16315
|
type: Input
|
|
16316
|
+
}], deleteButtonType: [{
|
|
16317
|
+
type: Input
|
|
15420
16318
|
}], deleteRowText: [{
|
|
15421
16319
|
type: Input
|
|
15422
16320
|
}], deleteRowTranslationKey: [{
|
|
@@ -16387,13 +17285,13 @@ class SearchFieldsComponent {
|
|
|
16387
17285
|
this.expand();
|
|
16388
17286
|
}
|
|
16389
17287
|
}
|
|
16390
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SearchFieldsComponent, deps: [{ token: i3$
|
|
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 }); }
|
|
16391
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" }] }); }
|
|
16392
17290
|
}
|
|
16393
17291
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SearchFieldsComponent, decorators: [{
|
|
16394
17292
|
type: Component,
|
|
16395
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"] }]
|
|
16396
|
-
}], ctorParameters: () => [{ type: i3$
|
|
17294
|
+
}], ctorParameters: () => [{ type: i3$2.DocumentService }, { type: i1.TranslateService }, { type: i2$3.IconService }], propDecorators: { loading: [{
|
|
16397
17295
|
type: Input
|
|
16398
17296
|
}], searchFields: [{
|
|
16399
17297
|
type: Input
|
|
@@ -17873,13 +18771,13 @@ class TableComponent {
|
|
|
17873
18771
|
}
|
|
17874
18772
|
});
|
|
17875
18773
|
}
|
|
17876
|
-
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 }); }
|
|
17877
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" }] }); }
|
|
17878
18776
|
}
|
|
17879
18777
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TableComponent, decorators: [{
|
|
17880
18778
|
type: Component,
|
|
17881
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"] }]
|
|
17882
|
-
}], ctorParameters: () => [{ type: i3.BreakpointObserver }], propDecorators: { items: [{
|
|
18780
|
+
}], ctorParameters: () => [{ type: i3$1.BreakpointObserver }], propDecorators: { items: [{
|
|
17883
18781
|
type: Input
|
|
17884
18782
|
}], columns: [{
|
|
17885
18783
|
type: Input
|
|
@@ -19293,7 +20191,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
19293
20191
|
}] } });
|
|
19294
20192
|
|
|
19295
20193
|
/*
|
|
19296
|
-
* Copyright 2015-
|
|
20194
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
19297
20195
|
*
|
|
19298
20196
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
19299
20197
|
* you may not use this file except in compliance with the License.
|
|
@@ -19315,6 +20213,7 @@ class MdiIconSelectorComponent {
|
|
|
19315
20213
|
this.placeholderTranslationKey = 'interface.iconPlaceholder';
|
|
19316
20214
|
this.appendInline = true;
|
|
19317
20215
|
this.dropUp = false;
|
|
20216
|
+
this.fullWidth = false;
|
|
19318
20217
|
this.$disabled = signal(false);
|
|
19319
20218
|
this.value$ = new BehaviorSubject(null);
|
|
19320
20219
|
this.items$ = combineLatest([
|
|
@@ -19345,13 +20244,13 @@ class MdiIconSelectorComponent {
|
|
|
19345
20244
|
this.onChangeFn(event.key);
|
|
19346
20245
|
}
|
|
19347
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 }); }
|
|
19348
|
-
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: [
|
|
19349
20248
|
{
|
|
19350
20249
|
provide: NG_VALUE_ACCESSOR,
|
|
19351
20250
|
useExisting: forwardRef(() => MdiIconSelectorComponent),
|
|
19352
20251
|
multi: true,
|
|
19353
20252
|
},
|
|
19354
|
-
], ngImport: i0, template: "<!--\n ~ Copyright 2015-
|
|
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 }); }
|
|
19355
20254
|
}
|
|
19356
20255
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MdiIconSelectorComponent, decorators: [{
|
|
19357
20256
|
type: Component,
|
|
@@ -19370,7 +20269,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
19370
20269
|
useExisting: forwardRef(() => MdiIconSelectorComponent),
|
|
19371
20270
|
multi: true,
|
|
19372
20271
|
},
|
|
19373
|
-
], template: "<!--\n ~ Copyright 2015-
|
|
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"] }]
|
|
19374
20273
|
}], ctorParameters: () => [{ type: i1.TranslateService }], propDecorators: { labelTranslationKey: [{
|
|
19375
20274
|
type: Input
|
|
19376
20275
|
}], tooltipTranslationKey: [{
|
|
@@ -19381,6 +20280,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
19381
20280
|
type: Input
|
|
19382
20281
|
}], dropUp: [{
|
|
19383
20282
|
type: Input
|
|
20283
|
+
}], fullWidth: [{
|
|
20284
|
+
type: Input
|
|
19384
20285
|
}] } });
|
|
19385
20286
|
|
|
19386
20287
|
/*
|
|
@@ -21127,5 +22028,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
21127
22028
|
* Generated bundle index. Do not edit.
|
|
21128
22029
|
*/
|
|
21129
22030
|
|
|
21130
|
-
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 };
|
|
21131
22032
|
//# sourceMappingURL=valtimo-components.mjs.map
|