@valtimo/components 13.45.1 → 13.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/valtimo-components.mjs +1325 -376
- package/fesm2022/valtimo-components.mjs.map +1 -1
- package/lib/components/auto-key-input/auto-key-input.component.d.ts +9 -1
- package/lib/components/auto-key-input/auto-key-input.component.d.ts.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/form/form.component.d.ts +3 -1
- package/lib/components/form/form.component.d.ts.map +1 -1
- package/lib/components/form-io/components/form-io/form-io.component.d.ts +3 -0
- package/lib/components/form-io/components/form-io/form-io.component.d.ts.map +1 -1
- package/lib/components/form-io/components/form-io-builder/form-io-builder.component.d.ts.map +1 -1
- 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 } 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(),
|
|
@@ -4872,7 +4886,7 @@ function menuInitializer(injector, logger) {
|
|
|
4872
4886
|
}
|
|
4873
4887
|
|
|
4874
4888
|
/*
|
|
4875
|
-
* Copyright 2015-
|
|
4889
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
4876
4890
|
*
|
|
4877
4891
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
4878
4892
|
* you may not use this file except in compliance with the License.
|
|
@@ -4886,27 +4900,55 @@ function menuInitializer(injector, logger) {
|
|
|
4886
4900
|
* See the License for the specific language governing permissions and
|
|
4887
4901
|
* limitations under the License.
|
|
4888
4902
|
*/
|
|
4889
|
-
|
|
4890
|
-
|
|
4891
|
-
|
|
4892
|
-
|
|
4893
|
-
|
|
4894
|
-
|
|
4895
|
-
|
|
4896
|
-
|
|
4897
|
-
|
|
4898
|
-
|
|
4899
|
-
|
|
4903
|
+
/**
|
|
4904
|
+
* Maps a **legacy** numeric `includeFunction` ordinal (configs saved before the switch to string
|
|
4905
|
+
* names) to the current enum member. The mapping follows the order the members held their ordinals
|
|
4906
|
+
* while configs were still persisted numerically: `OpenSearchEnabled` was only inserted (at
|
|
4907
|
+
* ordinal 1, shifting `ZgwFeaturesEnabled` from 1 to 2) just before the switch to names, so a
|
|
4908
|
+
* persisted `1` almost always predates that insertion and means `ZgwFeaturesEnabled`; a persisted
|
|
4909
|
+
* `2` can only come from a post-insertion save and also means `ZgwFeaturesEnabled`.
|
|
4910
|
+
*/
|
|
4911
|
+
const LEGACY_INCLUDE_FUNCTION_BY_ORDINAL = {
|
|
4912
|
+
0: IncludeFunction.ObjectManagementEnabled,
|
|
4913
|
+
1: IncludeFunction.ZgwFeaturesEnabled,
|
|
4914
|
+
2: IncludeFunction.ZgwFeaturesEnabled,
|
|
4915
|
+
};
|
|
4916
|
+
/**
|
|
4917
|
+
* Parses a persisted `includeFunction` value — the enum member name (current format) or a legacy
|
|
4918
|
+
* numeric ordinal — into the runtime `IncludeFunction`. Unknown values yield `undefined`.
|
|
4919
|
+
*/
|
|
4920
|
+
function parseIncludeFunction(value) {
|
|
4921
|
+
if (value === null || value === undefined || value === '')
|
|
4922
|
+
return undefined;
|
|
4923
|
+
if (typeof value === 'number')
|
|
4924
|
+
return LEGACY_INCLUDE_FUNCTION_BY_ORDINAL[value];
|
|
4925
|
+
const parsed = IncludeFunction[value];
|
|
4926
|
+
return typeof parsed === 'number' ? parsed : undefined;
|
|
4927
|
+
}
|
|
4928
|
+
/**
|
|
4929
|
+
* Serialises a **persisted** include function value (enum name or legacy numeric ordinal) into the
|
|
4930
|
+
* enum-name form. Numbers are interpreted as legacy ordinals (see
|
|
4931
|
+
* [LEGACY_INCLUDE_FUNCTION_BY_ORDINAL]) — for a *runtime* enum value use [includeFunctionToName].
|
|
4932
|
+
*/
|
|
4933
|
+
function serializeIncludeFunction(value) {
|
|
4934
|
+
const parsed = parseIncludeFunction(value);
|
|
4935
|
+
return parsed === undefined ? undefined : includeFunctionToName(parsed);
|
|
4936
|
+
}
|
|
4937
|
+
/** The persisted (name) form of a **runtime** `IncludeFunction` value (current enum ordinals, no legacy mapping). */
|
|
4938
|
+
function includeFunctionToName(value) {
|
|
4939
|
+
const name = IncludeFunction[value];
|
|
4940
|
+
return typeof name === 'string' ? name : undefined;
|
|
4941
|
+
}
|
|
4942
|
+
/** Current schema version written by this client. */
|
|
4943
|
+
const MENU_CONFIGURATION_VERSION = 1;
|
|
4944
|
+
/** Whether a fetched DTO actually holds a usable saved structure (non-empty `items`). */
|
|
4945
|
+
function hasSavedMenuConfiguration(dto) {
|
|
4946
|
+
const configuration = dto?.configuration;
|
|
4947
|
+
return Array.isArray(configuration?.items) && configuration.items.length > 0;
|
|
4900
4948
|
}
|
|
4901
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, decorators: [{
|
|
4902
|
-
type: Injectable,
|
|
4903
|
-
args: [{
|
|
4904
|
-
providedIn: 'root',
|
|
4905
|
-
}]
|
|
4906
|
-
}], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i1$2.ConfigService }] });
|
|
4907
4949
|
|
|
4908
4950
|
/*
|
|
4909
|
-
* Copyright 2015-
|
|
4951
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
4910
4952
|
*
|
|
4911
4953
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
4912
4954
|
* you may not use this file except in compliance with the License.
|
|
@@ -4920,123 +4962,902 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
4920
4962
|
* See the License for the specific language governing permissions and
|
|
4921
4963
|
* limitations under the License.
|
|
4922
4964
|
*/
|
|
4923
|
-
class
|
|
4924
|
-
|
|
4925
|
-
|
|
4926
|
-
|
|
4927
|
-
|
|
4928
|
-
|
|
4929
|
-
|
|
4930
|
-
|
|
4965
|
+
/** The text class `environment.ts` uses for the non-link group labels inside Admin. */
|
|
4966
|
+
const SECTION_HEADER_TEXT_CLASS = 'text-dark font-weight-bold c-default';
|
|
4967
|
+
/**
|
|
4968
|
+
* The curated catalog, seeded from `environment.ts`'s menu. The single source of truth for both the
|
|
4969
|
+
* builder's "Available items" panel and the runtime resolver (config JSON + catalog → `MenuItem[]`).
|
|
4970
|
+
*/
|
|
4971
|
+
const MENU_ITEM_CATALOG = [
|
|
4972
|
+
// Main menu items (top level)
|
|
4973
|
+
{
|
|
4974
|
+
itemId: 'dashboard',
|
|
4975
|
+
defaultTitleKey: 'Dashboard',
|
|
4976
|
+
defaultIcon: 'icon mdi mdi-view-dashboard',
|
|
4977
|
+
link: '/',
|
|
4978
|
+
roles: [ROLE_USER],
|
|
4979
|
+
placement: 'top',
|
|
4980
|
+
category: 'main',
|
|
4981
|
+
},
|
|
4982
|
+
{
|
|
4983
|
+
itemId: 'cases',
|
|
4984
|
+
defaultTitleKey: 'Cases',
|
|
4985
|
+
defaultIcon: 'icon mdi mdi-layers',
|
|
4986
|
+
roles: [ROLE_USER],
|
|
4987
|
+
placement: 'top',
|
|
4988
|
+
category: 'main',
|
|
4989
|
+
},
|
|
4990
|
+
{
|
|
4991
|
+
itemId: 'objects',
|
|
4992
|
+
defaultTitleKey: 'Objects',
|
|
4993
|
+
defaultIcon: 'icon mdi mdi-archive',
|
|
4994
|
+
roles: [ROLE_ADMIN],
|
|
4995
|
+
includeFunction: IncludeFunction.ObjectManagementEnabled,
|
|
4996
|
+
placement: 'top',
|
|
4997
|
+
category: 'main',
|
|
4998
|
+
},
|
|
4999
|
+
{
|
|
5000
|
+
itemId: 'tasks',
|
|
5001
|
+
defaultTitleKey: 'Tasks',
|
|
5002
|
+
defaultIcon: 'icon mdi mdi-check-all',
|
|
5003
|
+
link: '/tasks',
|
|
5004
|
+
roles: [ROLE_USER],
|
|
5005
|
+
placement: 'top',
|
|
5006
|
+
category: 'main',
|
|
5007
|
+
},
|
|
5008
|
+
{
|
|
5009
|
+
itemId: 'analysis',
|
|
5010
|
+
defaultTitleKey: 'Analysis',
|
|
5011
|
+
defaultIcon: 'icon mdi mdi-chart-bar',
|
|
5012
|
+
link: '/analysis',
|
|
5013
|
+
roles: [ROLE_USER],
|
|
5014
|
+
placement: 'top',
|
|
5015
|
+
category: 'main',
|
|
5016
|
+
},
|
|
5017
|
+
{
|
|
5018
|
+
itemId: 'teams',
|
|
5019
|
+
defaultTitleKey: 'teams.title',
|
|
5020
|
+
defaultIcon: 'icon mdi mdi-account-group',
|
|
5021
|
+
link: '/teams',
|
|
5022
|
+
roles: [ROLE_USER],
|
|
5023
|
+
placement: 'top',
|
|
5024
|
+
category: 'main',
|
|
5025
|
+
},
|
|
5026
|
+
{
|
|
5027
|
+
itemId: 'admin',
|
|
5028
|
+
defaultTitleKey: 'Admin',
|
|
5029
|
+
defaultIcon: 'icon mdi mdi-tune',
|
|
5030
|
+
roles: [ROLE_ADMIN],
|
|
5031
|
+
placement: 'top',
|
|
5032
|
+
category: 'main',
|
|
5033
|
+
required: true,
|
|
5034
|
+
},
|
|
5035
|
+
{
|
|
5036
|
+
itemId: 'development',
|
|
5037
|
+
defaultTitleKey: 'Development',
|
|
5038
|
+
defaultIcon: 'icon mdi mdi-xml',
|
|
5039
|
+
roles: [ROLE_DEVELOPER, ROLE_ADMIN],
|
|
5040
|
+
placement: 'top',
|
|
5041
|
+
category: 'main',
|
|
5042
|
+
},
|
|
5043
|
+
// Admin pages (inside the Admin group)
|
|
5044
|
+
{
|
|
5045
|
+
itemId: 'adminSettings',
|
|
5046
|
+
defaultTitleKey: 'adminSettings.title',
|
|
5047
|
+
link: '/admin-settings',
|
|
5048
|
+
roles: [ROLE_ADMIN],
|
|
5049
|
+
placement: 'admin',
|
|
5050
|
+
category: 'admin',
|
|
5051
|
+
required: true,
|
|
5052
|
+
},
|
|
5053
|
+
{
|
|
5054
|
+
itemId: 'buildingBlockManagement',
|
|
5055
|
+
defaultTitleKey: 'buildingBlockManagement.title',
|
|
5056
|
+
link: '/building-block-management',
|
|
5057
|
+
roles: [ROLE_ADMIN],
|
|
5058
|
+
placement: 'admin',
|
|
5059
|
+
category: 'admin',
|
|
5060
|
+
},
|
|
5061
|
+
{
|
|
5062
|
+
itemId: 'caseManagement',
|
|
5063
|
+
defaultTitleKey: 'Cases',
|
|
5064
|
+
link: '/case-management',
|
|
5065
|
+
roles: [ROLE_ADMIN],
|
|
5066
|
+
placement: 'admin',
|
|
5067
|
+
category: 'admin',
|
|
5068
|
+
},
|
|
5069
|
+
{
|
|
5070
|
+
itemId: 'plugins',
|
|
5071
|
+
defaultTitleKey: 'Plugins',
|
|
5072
|
+
link: '/plugins',
|
|
5073
|
+
roles: [ROLE_ADMIN],
|
|
5074
|
+
placement: 'admin',
|
|
5075
|
+
category: 'admin',
|
|
5076
|
+
},
|
|
5077
|
+
{
|
|
5078
|
+
itemId: 'pluginHosts',
|
|
5079
|
+
defaultTitleKey: 'Plugin hosts',
|
|
5080
|
+
link: '/plugin-hosts',
|
|
5081
|
+
roles: [ROLE_ADMIN],
|
|
5082
|
+
placement: 'admin',
|
|
5083
|
+
category: 'admin',
|
|
5084
|
+
},
|
|
5085
|
+
{
|
|
5086
|
+
itemId: 'pluginApps',
|
|
5087
|
+
defaultTitleKey: 'Apps',
|
|
5088
|
+
link: '/plugin-apps',
|
|
5089
|
+
roles: [ROLE_ADMIN],
|
|
5090
|
+
placement: 'admin',
|
|
5091
|
+
category: 'admin',
|
|
5092
|
+
},
|
|
5093
|
+
{
|
|
5094
|
+
itemId: 'dashboardManagement',
|
|
5095
|
+
defaultTitleKey: 'Dashboard',
|
|
5096
|
+
link: '/dashboard-management',
|
|
5097
|
+
roles: [ROLE_ADMIN],
|
|
5098
|
+
placement: 'admin',
|
|
5099
|
+
category: 'admin',
|
|
5100
|
+
},
|
|
5101
|
+
{
|
|
5102
|
+
itemId: 'accessControl',
|
|
5103
|
+
defaultTitleKey: 'Access Control',
|
|
5104
|
+
link: '/access-control',
|
|
5105
|
+
roles: [ROLE_ADMIN],
|
|
5106
|
+
placement: 'admin',
|
|
5107
|
+
category: 'admin',
|
|
5108
|
+
},
|
|
5109
|
+
{
|
|
5110
|
+
itemId: 'translationManagement',
|
|
5111
|
+
defaultTitleKey: 'Translations',
|
|
5112
|
+
link: '/translation-management',
|
|
5113
|
+
roles: [ROLE_ADMIN],
|
|
5114
|
+
placement: 'admin',
|
|
5115
|
+
category: 'admin',
|
|
5116
|
+
},
|
|
5117
|
+
{
|
|
5118
|
+
itemId: 'choiceFields',
|
|
5119
|
+
defaultTitleKey: 'Choice fields',
|
|
5120
|
+
link: '/choice-fields',
|
|
5121
|
+
roles: [ROLE_ADMIN],
|
|
5122
|
+
placement: 'admin',
|
|
5123
|
+
category: 'admin',
|
|
5124
|
+
},
|
|
5125
|
+
{
|
|
5126
|
+
itemId: 'objectManagement',
|
|
5127
|
+
defaultTitleKey: 'Objects',
|
|
5128
|
+
link: '/object-management',
|
|
5129
|
+
roles: [ROLE_ADMIN],
|
|
5130
|
+
placement: 'admin',
|
|
5131
|
+
category: 'admin',
|
|
5132
|
+
},
|
|
5133
|
+
{
|
|
5134
|
+
itemId: 'formManagement',
|
|
5135
|
+
defaultTitleKey: 'Forms',
|
|
5136
|
+
link: '/form-management',
|
|
5137
|
+
roles: [ROLE_ADMIN],
|
|
5138
|
+
placement: 'admin',
|
|
5139
|
+
category: 'admin',
|
|
5140
|
+
},
|
|
5141
|
+
{
|
|
5142
|
+
itemId: 'notifications',
|
|
5143
|
+
defaultTitleKey: 'Notifications',
|
|
5144
|
+
link: '/notifications-api/notifications/failed',
|
|
5145
|
+
roles: [ROLE_ADMIN],
|
|
5146
|
+
placement: 'admin',
|
|
5147
|
+
category: 'admin',
|
|
5148
|
+
},
|
|
5149
|
+
{
|
|
5150
|
+
itemId: 'processes',
|
|
5151
|
+
defaultTitleKey: 'Processes',
|
|
5152
|
+
link: '/processes',
|
|
5153
|
+
roles: [ROLE_ADMIN],
|
|
5154
|
+
placement: 'admin',
|
|
5155
|
+
category: 'admin',
|
|
5156
|
+
},
|
|
5157
|
+
{
|
|
5158
|
+
itemId: 'decisionTables',
|
|
5159
|
+
defaultTitleKey: 'Decision tables',
|
|
5160
|
+
link: '/decision-tables',
|
|
5161
|
+
roles: [ROLE_ADMIN],
|
|
5162
|
+
placement: 'admin',
|
|
5163
|
+
category: 'admin',
|
|
5164
|
+
},
|
|
5165
|
+
{
|
|
5166
|
+
itemId: 'logging',
|
|
5167
|
+
defaultTitleKey: 'Logs',
|
|
5168
|
+
link: '/logging',
|
|
5169
|
+
roles: [ROLE_ADMIN],
|
|
5170
|
+
placement: 'admin',
|
|
5171
|
+
category: 'admin',
|
|
5172
|
+
},
|
|
5173
|
+
{
|
|
5174
|
+
itemId: 'opensearch',
|
|
5175
|
+
defaultTitleKey: 'adminSettings.opensearch.title',
|
|
5176
|
+
link: '/opensearch',
|
|
5177
|
+
roles: [ROLE_ADMIN],
|
|
5178
|
+
includeFunction: IncludeFunction.OpenSearchEnabled,
|
|
5179
|
+
placement: 'admin',
|
|
5180
|
+
category: 'admin',
|
|
5181
|
+
},
|
|
5182
|
+
{
|
|
5183
|
+
itemId: 'caseMigration',
|
|
5184
|
+
defaultTitleKey: 'Case migration (beta)',
|
|
5185
|
+
link: '/case-migration',
|
|
5186
|
+
roles: [ROLE_ADMIN],
|
|
5187
|
+
placement: 'admin',
|
|
5188
|
+
category: 'admin',
|
|
5189
|
+
},
|
|
5190
|
+
{
|
|
5191
|
+
itemId: 'processMigration',
|
|
5192
|
+
defaultTitleKey: 'Process migration',
|
|
5193
|
+
link: '/process-migration',
|
|
5194
|
+
roles: [ROLE_ADMIN],
|
|
5195
|
+
placement: 'admin',
|
|
5196
|
+
category: 'admin',
|
|
5197
|
+
},
|
|
5198
|
+
{
|
|
5199
|
+
itemId: 'taskManagement',
|
|
5200
|
+
defaultTitleKey: 'Tasks (legacy)',
|
|
5201
|
+
link: '/task-management',
|
|
5202
|
+
roles: [ROLE_ADMIN],
|
|
5203
|
+
placement: 'admin',
|
|
5204
|
+
category: 'admin',
|
|
5205
|
+
},
|
|
5206
|
+
{
|
|
5207
|
+
itemId: 'notificationTest',
|
|
5208
|
+
defaultTitleKey: 'Send notification',
|
|
5209
|
+
link: '/notification-test',
|
|
5210
|
+
roles: [ROLE_ADMIN],
|
|
5211
|
+
placement: 'admin',
|
|
5212
|
+
category: 'admin',
|
|
5213
|
+
},
|
|
5214
|
+
// Development pages (inside the Development group)
|
|
5215
|
+
{
|
|
5216
|
+
itemId: 'swagger',
|
|
5217
|
+
defaultTitleKey: 'Swagger',
|
|
5218
|
+
defaultIcon: 'icon mdi mdi-dot-circle',
|
|
5219
|
+
link: '/swagger',
|
|
5220
|
+
roles: [ROLE_DEVELOPER, ROLE_ADMIN],
|
|
5221
|
+
placement: 'development',
|
|
5222
|
+
category: 'development',
|
|
5223
|
+
},
|
|
5224
|
+
];
|
|
5225
|
+
/** Normalises a route for comparison: lower-cased, single leading slash, no trailing slash. */
|
|
5226
|
+
function normaliseMenuLink(link) {
|
|
5227
|
+
if (!link)
|
|
5228
|
+
return '';
|
|
5229
|
+
const normalised = ('/' + link.toLowerCase().replace(/^\/+/, '')).replace(/\/+$/, '');
|
|
5230
|
+
return normalised === '' ? '/' : normalised;
|
|
5231
|
+
}
|
|
5232
|
+
/**
|
|
5233
|
+
* Joins a `MenuItem.link` array into the single route string the config stores. Multi-segment
|
|
5234
|
+
* links (e.g. `['/plugin-pages', 'id', 'key']`) are joined with `/`; surplus slashes on segment
|
|
5235
|
+
* boundaries are stripped so a segment that already starts with `/` never produces `//`. A single
|
|
5236
|
+
* segment (`['/tasks']`, `['/']`) passes through unchanged.
|
|
5237
|
+
*/
|
|
5238
|
+
function menuLinkToString(link) {
|
|
5239
|
+
if (!Array.isArray(link) || link.length === 0)
|
|
5240
|
+
return '';
|
|
5241
|
+
if (link.length === 1)
|
|
5242
|
+
return link[0] ?? '';
|
|
5243
|
+
const [first, ...rest] = link;
|
|
5244
|
+
return [
|
|
5245
|
+
(first ?? '').replace(/\/+$/, ''),
|
|
5246
|
+
...rest
|
|
5247
|
+
.map(segment => (segment ?? '').replace(/^\/+|\/+$/g, ''))
|
|
5248
|
+
.filter(segment => segment !== ''),
|
|
5249
|
+
].join('/');
|
|
5250
|
+
}
|
|
5251
|
+
const _catalogById = new Map(MENU_ITEM_CATALOG.map(entry => [entry.itemId, entry]));
|
|
5252
|
+
function getMenuCatalogEntry(itemId) {
|
|
5253
|
+
return _catalogById.get(itemId);
|
|
5254
|
+
}
|
|
5255
|
+
/** Finds the catalog entry whose route matches the given link (linked entries only). */
|
|
5256
|
+
function findMenuCatalogEntryByLink(link) {
|
|
5257
|
+
const normalised = normaliseMenuLink(menuLinkToString(link));
|
|
5258
|
+
if (!normalised)
|
|
5259
|
+
return undefined;
|
|
5260
|
+
return MENU_ITEM_CATALOG.find(entry => entry.link && normaliseMenuLink(entry.link) === normalised);
|
|
5261
|
+
}
|
|
5262
|
+
/**
|
|
5263
|
+
* Finds the catalog **group** entry (a top-level item with no link: Cases, Objects, Admin,
|
|
5264
|
+
* Development) that matches a runtime menu item's title. Used to seed no-link group items without
|
|
5265
|
+
* colliding with same-titled linked Admin pages.
|
|
5266
|
+
*/
|
|
5267
|
+
function findMenuCatalogGroupEntryByTitle(title) {
|
|
5268
|
+
return MENU_ITEM_CATALOG.find(entry => !entry.link && entry.placement === 'top' && entry.defaultTitleKey === title);
|
|
5269
|
+
}
|
|
5270
|
+
|
|
5271
|
+
/*
|
|
5272
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
5273
|
+
*
|
|
5274
|
+
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5275
|
+
* you may not use this file except in compliance with the License.
|
|
5276
|
+
* You may obtain a copy of the License at
|
|
5277
|
+
*
|
|
5278
|
+
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
5279
|
+
*
|
|
5280
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
5281
|
+
* distributed under the License is distributed on an "AS IS" basis,
|
|
5282
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5283
|
+
* See the License for the specific language governing permissions and
|
|
5284
|
+
* limitations under the License.
|
|
5285
|
+
*/
|
|
5286
|
+
/** Route prefix a `plugin-page` node resolves to (handled by the plugin-page route in @valtimo/plugin). */
|
|
5287
|
+
const PLUGIN_PAGE_ROUTE = '/plugin-pages';
|
|
5288
|
+
/**
|
|
5289
|
+
* Resolves a persisted [MenuConfiguration] into the `MenuItem[]` the existing `MenuService`
|
|
5290
|
+
* consumes. Catalog nodes fill `link/roles/iconClass/includeFunction/title` from the registry
|
|
5291
|
+
* (overrides win); `section-header` → a non-link group label; `custom-link`/`plugin-page` → their
|
|
5292
|
+
* stored values. A preserved `roles` set always wins over the catalog default, so migrating a custom
|
|
5293
|
+
* item never broadens its access. Required items (Admin, Settings) are forced present so a saved
|
|
5294
|
+
* config can never lock an admin out of this page. Unknown catalog ids are skipped with a warning.
|
|
5295
|
+
*
|
|
5296
|
+
* The optional [logger] is threaded from the caller because this is a plain function (it runs in an
|
|
5297
|
+
* `APP_INITIALIZER` before a component tree exists); when absent, warnings fall back to the console.
|
|
5298
|
+
*/
|
|
5299
|
+
function resolveMenuConfiguration(configuration, logger) {
|
|
5300
|
+
const pairs = (configuration?.items ?? [])
|
|
5301
|
+
.map(source => ({ source, resolved: resolveMenuConfigurationItem(source, logger) }))
|
|
5302
|
+
.filter((pair) => pair.resolved !== null);
|
|
5303
|
+
return ensureRequiredItems(pairs);
|
|
5304
|
+
}
|
|
5305
|
+
function resolveMenuConfigurationItem(item, logger) {
|
|
5306
|
+
switch (item.kind) {
|
|
5307
|
+
case 'catalog':
|
|
5308
|
+
return resolveCatalogItem(item, logger);
|
|
5309
|
+
case 'group': {
|
|
5310
|
+
const children = (item.children ?? [])
|
|
5311
|
+
.map(child => resolveMenuConfigurationItem(child, logger))
|
|
5312
|
+
.filter((child) => child !== null);
|
|
5313
|
+
return buildMenuItem({
|
|
5314
|
+
title: item.title,
|
|
5315
|
+
iconClass: item.icon,
|
|
5316
|
+
roles: item.roles,
|
|
5317
|
+
children,
|
|
5318
|
+
});
|
|
5319
|
+
}
|
|
5320
|
+
case 'section-header': {
|
|
5321
|
+
const header = { title: item.title, textClass: SECTION_HEADER_TEXT_CLASS };
|
|
5322
|
+
if (item.roles)
|
|
5323
|
+
header.roles = item.roles;
|
|
5324
|
+
const includeFunction = parseIncludeFunction(item.includeFunction);
|
|
5325
|
+
if (includeFunction !== undefined)
|
|
5326
|
+
header.includeFunction = includeFunction;
|
|
5327
|
+
return header;
|
|
5328
|
+
}
|
|
5329
|
+
case 'custom-link':
|
|
5330
|
+
return buildMenuItem({
|
|
5331
|
+
title: item.title,
|
|
5332
|
+
link: stringToLink(item.link),
|
|
5333
|
+
iconClass: item.icon,
|
|
5334
|
+
roles: item.roles,
|
|
5335
|
+
});
|
|
5336
|
+
case 'plugin-page':
|
|
5337
|
+
// Without a configuration id the entry can never route anywhere — skip it instead of
|
|
5338
|
+
// producing a broken menu entry.
|
|
5339
|
+
if (!item.configurationId) {
|
|
5340
|
+
warn(logger, `Plugin-page menu item "${item.title}" has no configurationId — skipping`);
|
|
5341
|
+
return null;
|
|
4931
5342
|
}
|
|
4932
|
-
|
|
4933
|
-
|
|
4934
|
-
|
|
4935
|
-
|
|
4936
|
-
|
|
4937
|
-
|
|
4938
|
-
|
|
4939
|
-
|
|
4940
|
-
|
|
4941
|
-
|
|
4942
|
-
|
|
4943
|
-
|
|
4944
|
-
|
|
4945
|
-
|
|
4946
|
-
|
|
4947
|
-
this._selectedLanguage$ = new BehaviorSubject('');
|
|
4948
|
-
this._languageOptions$ = new BehaviorSubject([]);
|
|
4949
|
-
this.languageListItems$ = combineLatest([
|
|
4950
|
-
this._languageOptions$,
|
|
4951
|
-
this._selectedLanguage$,
|
|
4952
|
-
this.translateService.stream('key'),
|
|
4953
|
-
]).pipe(map$1(([languageOptions, selectedLanguage]) => languageOptions.map(languageKey => ({
|
|
4954
|
-
content: this.translateService.instant('settings.language.options.' + languageKey),
|
|
4955
|
-
key: languageKey,
|
|
4956
|
-
selected: selectedLanguage === languageKey,
|
|
4957
|
-
}))));
|
|
4958
|
-
this.backendVersion$ = this.versionService.getVersion();
|
|
4959
|
-
this.userSubject$ = this.userProviderService.getUserSubject();
|
|
4960
|
-
this.updatingUserSettings$ = new BehaviorSubject(true);
|
|
4961
|
-
this.collapsibleWidescreenMenu$ = this.shellService.collapsibleWidescreenMenu$;
|
|
4962
|
-
this.compactMode$ = this.pageHeaderService.compactMode$;
|
|
4963
|
-
this.showUserNameInTopBar$ = this.pageHeaderService.showUserNameInTopBar$;
|
|
4964
|
-
this._preferredTheme$ = this.cdsThemeService.preferredTheme$;
|
|
4965
|
-
this.showValtimoVersions = true;
|
|
4966
|
-
this.themeOptions$ = combineLatest([
|
|
4967
|
-
this._preferredTheme$,
|
|
4968
|
-
this.translateService.stream('key'),
|
|
4969
|
-
]).pipe(map$1(([preferredTheme]) => [
|
|
4970
|
-
{
|
|
4971
|
-
content: this.translateService.instant('settings.interface.themes.light'),
|
|
4972
|
-
key: SelectableCarbonTheme.G10,
|
|
4973
|
-
selected: preferredTheme === SelectableCarbonTheme.G10,
|
|
4974
|
-
},
|
|
4975
|
-
{
|
|
4976
|
-
content: this.translateService.instant('settings.interface.themes.dark'),
|
|
4977
|
-
key: SelectableCarbonTheme.G90,
|
|
4978
|
-
selected: preferredTheme === SelectableCarbonTheme.G90,
|
|
4979
|
-
},
|
|
4980
|
-
{
|
|
4981
|
-
content: this.translateService.instant('settings.interface.themes.system'),
|
|
4982
|
-
key: SelectableCarbonTheme.SYSTEM,
|
|
4983
|
-
selected: preferredTheme === SelectableCarbonTheme.SYSTEM,
|
|
4984
|
-
},
|
|
4985
|
-
]));
|
|
4986
|
-
this.allowUserThemeSwitching$ = this.configService.getFeatureToggleObservable('allowUserThemeSwitching', true);
|
|
4987
|
-
this.enableCompactModeToggle$ = this.configService.getFeatureToggleObservable('enableCompactModeToggle', true);
|
|
4988
|
-
this.enableShowUserNameToggle$ = this.configService.getFeatureToggleObservable('enableUserNameInTopBarToggle');
|
|
4989
|
-
this.showPlantATreeButton$ = this.configService.getFeatureToggleObservable('showPlantATreeButton');
|
|
4990
|
-
this.hideValtimoVersionsForNonAdmins$ = this.configService.getFeatureToggleObservable('hideValtimoVersionsForNonAdmins');
|
|
4991
|
-
this._isAdmin$ = this.userProviderService
|
|
4992
|
-
.getUserSubject()
|
|
4993
|
-
.pipe(map$1(userIdentity => userIdentity?.roles.includes('ROLE_ADMIN')));
|
|
4994
|
-
this._subscriptions = new Subscription();
|
|
4995
|
-
}
|
|
4996
|
-
ngOnInit() {
|
|
4997
|
-
this.initNonToggleSettings();
|
|
4998
|
-
this.initFrontendVersion();
|
|
4999
|
-
this.openShowVersionsSubscription();
|
|
5000
|
-
this.setLanguage();
|
|
5001
|
-
this.getUserSettings();
|
|
5343
|
+
// TODO: an entry whose external-plugin page target no longer exists (configuration deleted,
|
|
5344
|
+
// or the plugin no longer exports the page bundle) still resolves to a dead /plugin-pages
|
|
5345
|
+
// route. Detecting that requires the async external-plugin page catalog, which this
|
|
5346
|
+
// synchronous resolver cannot access; consider filtering such entries in the caller once the
|
|
5347
|
+
// page list is available.
|
|
5348
|
+
return buildMenuItem({
|
|
5349
|
+
title: item.title,
|
|
5350
|
+
link: item.bundleKey
|
|
5351
|
+
? [PLUGIN_PAGE_ROUTE, item.configurationId, item.bundleKey]
|
|
5352
|
+
: [PLUGIN_PAGE_ROUTE, item.configurationId],
|
|
5353
|
+
iconClass: item.icon,
|
|
5354
|
+
roles: item.roles,
|
|
5355
|
+
});
|
|
5356
|
+
default:
|
|
5357
|
+
return null;
|
|
5002
5358
|
}
|
|
5003
|
-
|
|
5004
|
-
|
|
5359
|
+
}
|
|
5360
|
+
function resolveCatalogItem(item, logger) {
|
|
5361
|
+
const entry = getMenuCatalogEntry(item.itemId);
|
|
5362
|
+
if (!entry) {
|
|
5363
|
+
warn(logger, `Unknown menu catalog itemId "${item.itemId}" — skipping`);
|
|
5364
|
+
return null;
|
|
5005
5365
|
}
|
|
5006
|
-
|
|
5007
|
-
|
|
5008
|
-
|
|
5009
|
-
|
|
5010
|
-
|
|
5011
|
-
|
|
5012
|
-
|
|
5013
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5366
|
+
const children = item.children
|
|
5367
|
+
?.map(child => resolveMenuConfigurationItem(child, logger))
|
|
5368
|
+
.filter((child) => child !== null);
|
|
5369
|
+
return buildMenuItem({
|
|
5370
|
+
title: item.title ?? entry.defaultTitleKey,
|
|
5371
|
+
link: stringToLink(entry.link),
|
|
5372
|
+
iconClass: item.icon ?? entry.defaultIcon,
|
|
5373
|
+
roles: item.roles ?? entry.roles,
|
|
5374
|
+
// A required item must never carry an include function — it could hide the item at runtime and
|
|
5375
|
+
// lock the admin out of this page, defeating the whole point of marking it required.
|
|
5376
|
+
includeFunction: entry.required
|
|
5377
|
+
? undefined
|
|
5378
|
+
: (parseIncludeFunction(item.includeFunction) ?? entry.includeFunction),
|
|
5379
|
+
children,
|
|
5380
|
+
});
|
|
5381
|
+
}
|
|
5382
|
+
function resolveCatalogItemById(itemId, logger) {
|
|
5383
|
+
return resolveCatalogItem({ kind: 'catalog', itemId }, logger);
|
|
5384
|
+
}
|
|
5385
|
+
/**
|
|
5386
|
+
* Forces the required items present so a saved config can never lock an admin out of this page:
|
|
5387
|
+
* the Admin section must exist, and the Settings link must be reachable **somewhere** in the menu.
|
|
5388
|
+
* Because Settings is now freely placeable (top level or any section), its presence is checked
|
|
5389
|
+
* across the whole tree — so moving it out of Admin never causes a duplicate to be injected. A
|
|
5390
|
+
* no-op when the saved config already holds both, so a round-tripped current menu is unchanged.
|
|
5391
|
+
*
|
|
5392
|
+
* The Admin group is matched by its stable catalog `itemId` (via the source config node), never by
|
|
5393
|
+
* title — the editor allows renaming, so a renamed Admin group must not trigger a duplicate. The
|
|
5394
|
+
* title match only remains as a fallback for the (title-keyed) seed path.
|
|
5395
|
+
*/
|
|
5396
|
+
function ensureRequiredItems(pairs) {
|
|
5397
|
+
const result = pairs.map(pair => pair.resolved);
|
|
5398
|
+
const adminEntry = getMenuCatalogEntry('admin');
|
|
5399
|
+
const settingsEntry = getMenuCatalogEntry('adminSettings');
|
|
5400
|
+
if (!adminEntry || !settingsEntry)
|
|
5401
|
+
return result;
|
|
5402
|
+
let adminItem =
|
|
5403
|
+
// Primary: the persisted node's stable id — robust against title renames.
|
|
5404
|
+
pairs.find(pair => pair.source.kind === 'catalog' && pair.source.itemId === 'admin')
|
|
5405
|
+
?.resolved ??
|
|
5406
|
+
// Fallback for configs whose Admin section was captured without the catalog id (e.g. seeded as
|
|
5407
|
+
// a plain group): recognise it by the catalog's default title on a link-less group.
|
|
5408
|
+
result.find(item => item.title === adminEntry.defaultTitleKey && !item.link);
|
|
5409
|
+
if (!adminItem) {
|
|
5410
|
+
adminItem = buildMenuItem({
|
|
5411
|
+
title: adminEntry.defaultTitleKey,
|
|
5412
|
+
iconClass: adminEntry.defaultIcon,
|
|
5413
|
+
roles: adminEntry.roles,
|
|
5414
|
+
children: [],
|
|
5019
5415
|
});
|
|
5416
|
+
result.push(adminItem);
|
|
5020
5417
|
}
|
|
5021
|
-
|
|
5022
|
-
|
|
5023
|
-
|
|
5024
|
-
|
|
5025
|
-
|
|
5418
|
+
const settingsLink = normaliseMenuLink(settingsEntry.link);
|
|
5419
|
+
if (!menuContainsLink(result, settingsLink)) {
|
|
5420
|
+
const settingsItem = resolveCatalogItemById('adminSettings');
|
|
5421
|
+
if (settingsItem)
|
|
5422
|
+
adminItem.children = [settingsItem, ...(adminItem.children ?? [])];
|
|
5026
5423
|
}
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5424
|
+
return result;
|
|
5425
|
+
}
|
|
5426
|
+
/** Whether the resolved menu contains the given (normalised) link at any depth. */
|
|
5427
|
+
function menuContainsLink(items, normalisedLink) {
|
|
5428
|
+
return items.some(item => {
|
|
5429
|
+
if (normaliseMenuLink(menuLinkToString(item.link)) === normalisedLink)
|
|
5430
|
+
return true;
|
|
5431
|
+
return Array.isArray(item.children) && menuContainsLink(item.children, normalisedLink);
|
|
5432
|
+
});
|
|
5433
|
+
}
|
|
5434
|
+
/** Builds a `MenuItem` with only the keys that are actually set, so resolved items match the static menu shape. */
|
|
5435
|
+
function buildMenuItem(parts) {
|
|
5436
|
+
const item = { title: parts.title };
|
|
5437
|
+
const roles = parts.roles ?? [ROLE_USER];
|
|
5438
|
+
item.roles = roles;
|
|
5439
|
+
if (parts.link)
|
|
5440
|
+
item.link = parts.link;
|
|
5441
|
+
if (parts.iconClass)
|
|
5442
|
+
item.iconClass = parts.iconClass;
|
|
5443
|
+
if (parts.includeFunction !== undefined)
|
|
5444
|
+
item.includeFunction = parts.includeFunction;
|
|
5445
|
+
if (parts.children !== undefined)
|
|
5446
|
+
item.children = parts.children;
|
|
5447
|
+
return item;
|
|
5448
|
+
}
|
|
5449
|
+
function stringToLink(link) {
|
|
5450
|
+
return link ? [link] : undefined;
|
|
5451
|
+
}
|
|
5452
|
+
/** Warns via the injected NGXLogger when the caller supplied one, falling back to the console otherwise. */
|
|
5453
|
+
function warn(logger, message) {
|
|
5454
|
+
if (logger) {
|
|
5455
|
+
logger.warn(message);
|
|
5032
5456
|
}
|
|
5033
|
-
|
|
5034
|
-
|
|
5035
|
-
if (saveSettings) {
|
|
5036
|
-
this.saveUserSettings();
|
|
5037
|
-
}
|
|
5457
|
+
else {
|
|
5458
|
+
console.warn(message);
|
|
5038
5459
|
}
|
|
5039
|
-
|
|
5460
|
+
}
|
|
5461
|
+
|
|
5462
|
+
/*
|
|
5463
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
5464
|
+
*
|
|
5465
|
+
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5466
|
+
* you may not use this file except in compliance with the License.
|
|
5467
|
+
* You may obtain a copy of the License at
|
|
5468
|
+
*
|
|
5469
|
+
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
5470
|
+
*
|
|
5471
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
5472
|
+
* distributed under the License is distributed on an "AS IS" basis,
|
|
5473
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5474
|
+
* See the License for the specific language governing permissions and
|
|
5475
|
+
* limitations under the License.
|
|
5476
|
+
*/
|
|
5477
|
+
/**
|
|
5478
|
+
* Maps the **live** runtime menu (`config.menu.menuItems` — whatever an installation actually has,
|
|
5479
|
+
* downstream custom links included) into the editable persisted structure. Used both at runtime and
|
|
5480
|
+
* in the builder when the DB has no saved config, guaranteeing nothing in the current menu is lost
|
|
5481
|
+
* on first open. Round-trip safe with the resolver: `resolve(buildConfigFromRuntimeMenu(menu)) ≈ menu`.
|
|
5482
|
+
*
|
|
5483
|
+
* - A known route or group → a `catalog` node (title/icon recorded only when they differ from the
|
|
5484
|
+
* catalog default; `roles`/`includeFunction` preserved).
|
|
5485
|
+
* - A no-link, non-group label → a `section-header`.
|
|
5486
|
+
* - An unmatched link → a `custom-link` (title/link/icon/roles preserved).
|
|
5487
|
+
*/
|
|
5488
|
+
function buildMenuConfigurationFromRuntimeMenu(menuItems) {
|
|
5489
|
+
return {
|
|
5490
|
+
version: MENU_CONFIGURATION_VERSION,
|
|
5491
|
+
items: (menuItems ?? []).map(item => seedMenuItem(item)),
|
|
5492
|
+
};
|
|
5493
|
+
}
|
|
5494
|
+
function seedMenuItem(item) {
|
|
5495
|
+
const hasLink = Array.isArray(item.link) && item.link.length > 0;
|
|
5496
|
+
if (!hasLink) {
|
|
5497
|
+
const groupEntry = findMenuCatalogGroupEntryByTitle(item.title);
|
|
5498
|
+
if (groupEntry)
|
|
5499
|
+
return seedCatalogNode(item, groupEntry);
|
|
5500
|
+
// A no-link item that carries its own children is a custom section (group); one without
|
|
5501
|
+
// children is a plain section-header label.
|
|
5502
|
+
if (Array.isArray(item.children))
|
|
5503
|
+
return seedGroupNode(item);
|
|
5504
|
+
const header = { kind: 'section-header', title: item.title };
|
|
5505
|
+
if (item.roles)
|
|
5506
|
+
header.roles = item.roles;
|
|
5507
|
+
const headerIncludeFunction = persistedIncludeFunctionOf(item);
|
|
5508
|
+
if (headerIncludeFunction !== undefined)
|
|
5509
|
+
header.includeFunction = headerIncludeFunction;
|
|
5510
|
+
return header;
|
|
5511
|
+
}
|
|
5512
|
+
const linkEntry = findMenuCatalogEntryByLink(item.link);
|
|
5513
|
+
if (linkEntry)
|
|
5514
|
+
return seedCatalogNode(item, linkEntry);
|
|
5515
|
+
const customLink = {
|
|
5516
|
+
kind: 'custom-link',
|
|
5517
|
+
title: item.title,
|
|
5518
|
+
link: menuLinkToString(item.link),
|
|
5519
|
+
};
|
|
5520
|
+
if (item.iconClass)
|
|
5521
|
+
customLink.icon = item.iconClass;
|
|
5522
|
+
if (item.roles)
|
|
5523
|
+
customLink.roles = item.roles;
|
|
5524
|
+
return customLink;
|
|
5525
|
+
}
|
|
5526
|
+
function seedGroupNode(item) {
|
|
5527
|
+
const node = { kind: 'group', title: item.title };
|
|
5528
|
+
if (item.iconClass)
|
|
5529
|
+
node.icon = item.iconClass;
|
|
5530
|
+
if (item.roles)
|
|
5531
|
+
node.roles = item.roles;
|
|
5532
|
+
node.children = (item.children ?? []).map(child => seedMenuItem(child));
|
|
5533
|
+
return node;
|
|
5534
|
+
}
|
|
5535
|
+
function seedCatalogNode(item, entry) {
|
|
5536
|
+
const node = { kind: 'catalog', itemId: entry.itemId };
|
|
5537
|
+
// Record title/icon only when they deviate from the catalog default, keeping the stored tree lean.
|
|
5538
|
+
if (item.title && item.title !== entry.defaultTitleKey)
|
|
5539
|
+
node.title = item.title;
|
|
5540
|
+
if (item.iconClass && item.iconClass !== entry.defaultIcon)
|
|
5541
|
+
node.icon = item.iconClass;
|
|
5542
|
+
const includeFunction = persistedIncludeFunctionOf(item);
|
|
5543
|
+
if (includeFunction !== undefined)
|
|
5544
|
+
node.includeFunction = includeFunction;
|
|
5545
|
+
if (item.roles)
|
|
5546
|
+
node.roles = item.roles;
|
|
5547
|
+
if (Array.isArray(item.children))
|
|
5548
|
+
node.children = item.children.map(child => seedMenuItem(child));
|
|
5549
|
+
return node;
|
|
5550
|
+
}
|
|
5551
|
+
/**
|
|
5552
|
+
* The runtime item's include function in its persisted form: the enum member **name**, so the
|
|
5553
|
+
* stored config survives enum reorders. The persisted config carries a single include function
|
|
5554
|
+
* (the builder edits one); a runtime item may declare several, so keep the first when an array is
|
|
5555
|
+
* supplied.
|
|
5556
|
+
*/
|
|
5557
|
+
function persistedIncludeFunctionOf(item) {
|
|
5558
|
+
const includeFunction = Array.isArray(item.includeFunction)
|
|
5559
|
+
? item.includeFunction[0]
|
|
5560
|
+
: item.includeFunction;
|
|
5561
|
+
return includeFunction === undefined ? undefined : includeFunctionToName(includeFunction);
|
|
5562
|
+
}
|
|
5563
|
+
|
|
5564
|
+
/*
|
|
5565
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
5566
|
+
*
|
|
5567
|
+
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5568
|
+
* you may not use this file except in compliance with the License.
|
|
5569
|
+
* You may obtain a copy of the License at
|
|
5570
|
+
*
|
|
5571
|
+
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
5572
|
+
*
|
|
5573
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
5574
|
+
* distributed under the License is distributed on an "AS IS" basis,
|
|
5575
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5576
|
+
* See the License for the specific language governing permissions and
|
|
5577
|
+
* limitations under the License.
|
|
5578
|
+
*/
|
|
5579
|
+
/**
|
|
5580
|
+
* Reusable, presentational connected sortable list built on the (well-tested) Angular CDK
|
|
5581
|
+
* `@angular/cdk/drag-drop`. It owns only the drag mechanics, Carbon-styled handle and
|
|
5582
|
+
* placeholder/preview; the consumer renders each row via [itemTemplate] and mutates its own data in
|
|
5583
|
+
* response to [droppedEvent] (re-emitted verbatim from CDK). Compose several instances — connected
|
|
5584
|
+
* by [connectedTo] or a `cdkDropListGroup` wrapper — for nested or cross-list drag-and-drop.
|
|
5585
|
+
*
|
|
5586
|
+
* Set [sortingDisabled] on a "palette" list whose items should be copied (not moved) into another
|
|
5587
|
+
* list: leave its own array untouched in the [droppedEvent] handler and clone the dragged item
|
|
5588
|
+
* instead.
|
|
5589
|
+
*/
|
|
5590
|
+
class DragDropListComponent {
|
|
5591
|
+
constructor(iconService) {
|
|
5592
|
+
this.iconService = iconService;
|
|
5593
|
+
this.items = [];
|
|
5594
|
+
this.connectedTo = [];
|
|
5595
|
+
this.disabled = false;
|
|
5596
|
+
this.sortingDisabled = false;
|
|
5597
|
+
this.showHandle = true;
|
|
5598
|
+
/**
|
|
5599
|
+
* When true the entire row is a drag surface (not just the handle), while interactive controls
|
|
5600
|
+
* inside the row — `button`, `a`, `input`, `select`, `textarea`, `[role="button"]` or anything
|
|
5601
|
+
* marked `[data-no-drag]` — never initiate a drag, so they stay clickable. The handle icon is then
|
|
5602
|
+
* shown only as a visual grab cue.
|
|
5603
|
+
*/
|
|
5604
|
+
this.wholeRowDraggable = false;
|
|
5605
|
+
this.orientation = 'vertical';
|
|
5606
|
+
/**
|
|
5607
|
+
* Aria label for the drag handle. Accepts either an already-translated string or a translation
|
|
5608
|
+
* key — the template runs the value through the `translate` pipe, which passes unknown keys
|
|
5609
|
+
* (i.e. already-translated strings) through unchanged.
|
|
5610
|
+
*/
|
|
5611
|
+
this.handleAriaLabel = 'interface.dragToReorder';
|
|
5612
|
+
/**
|
|
5613
|
+
* Optional content rendered *below* the styled row (e.g. a nested sub-list). It sits inside the
|
|
5614
|
+
* draggable element so it moves with the item, but outside the row surface — so the row's
|
|
5615
|
+
* background, hover and drag handle cover only the header, not the whole subtree.
|
|
5616
|
+
*/
|
|
5617
|
+
this.expansionTemplate = null;
|
|
5618
|
+
this.emptyTemplate = null;
|
|
5619
|
+
this.enterPredicate = () => true;
|
|
5620
|
+
this.dragDisabled = () => false;
|
|
5621
|
+
this.droppedEvent = new EventEmitter();
|
|
5622
|
+
/** Emitted when a drag begins / ends anywhere in this list, so a host can reflect a global "dragging" state. */
|
|
5623
|
+
this.dragStartedEvent = new EventEmitter();
|
|
5624
|
+
this.dragEndedEvent = new EventEmitter();
|
|
5625
|
+
this.iconService.registerAll([Draggable16]);
|
|
5626
|
+
}
|
|
5627
|
+
trackByIndex(index) {
|
|
5628
|
+
return index;
|
|
5629
|
+
}
|
|
5630
|
+
/**
|
|
5631
|
+
* In whole-row mode the row element is the CDK drag surface. CDK listens for `mousedown`/
|
|
5632
|
+
* `touchstart` on that element in the bubble phase, so stopping propagation here — only when the
|
|
5633
|
+
* pointer went down on an interactive control — prevents a drag from starting on that control
|
|
5634
|
+
* while leaving its click intact. A pointer-down anywhere else bubbles through and drags the row.
|
|
5635
|
+
*/
|
|
5636
|
+
onContentPointerDown(event) {
|
|
5637
|
+
if (!this.wholeRowDraggable)
|
|
5638
|
+
return;
|
|
5639
|
+
const target = event.target;
|
|
5640
|
+
if (target?.closest('button, a, input, select, textarea, [role="button"], [data-no-drag]')) {
|
|
5641
|
+
event.stopPropagation();
|
|
5642
|
+
}
|
|
5643
|
+
}
|
|
5644
|
+
/**
|
|
5645
|
+
* The expansion (nested sub-list) is never a drag surface for this row: swallow its pointer-downs so
|
|
5646
|
+
* a drag can only start from the header row. Nested rows have their own drag surface and handle
|
|
5647
|
+
* their own pointer-downs before the event reaches here.
|
|
5648
|
+
*/
|
|
5649
|
+
onExpansionPointerDown(event) {
|
|
5650
|
+
if (this.wholeRowDraggable)
|
|
5651
|
+
event.stopPropagation();
|
|
5652
|
+
}
|
|
5653
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DragDropListComponent, deps: [{ token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5654
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: DragDropListComponent, isStandalone: true, selector: "valtimo-drag-drop-list", inputs: { items: "items", listId: "listId", connectedTo: "connectedTo", disabled: "disabled", sortingDisabled: "sortingDisabled", showHandle: "showHandle", wholeRowDraggable: "wholeRowDraggable", orientation: "orientation", handleAriaLabel: "handleAriaLabel", itemTemplate: "itemTemplate", expansionTemplate: "expansionTemplate", emptyTemplate: "emptyTemplate", enterPredicate: "enterPredicate", dragDisabled: "dragDisabled" }, outputs: { droppedEvent: "droppedEvent", dragStartedEvent: "dragStartedEvent", dragEndedEvent: "dragEndedEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n cdkDropList\n [cdkDropListConnectedTo]=\"connectedTo\"\n [cdkDropListData]=\"items\"\n [cdkDropListDisabled]=\"disabled\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [cdkDropListOrientation]=\"orientation\"\n [cdkDropListSortingDisabled]=\"sortingDisabled\"\n [id]=\"listId\"\n (cdkDropListDropped)=\"droppedEvent.emit($event)\"\n class=\"valtimo-drag-drop-list\"\n [class.valtimo-drag-drop-list--empty]=\"!items?.length\"\n>\n @for (item of items; track trackByIndex($index)) {\n <div\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"dragDisabled(item, $index)\"\n class=\"valtimo-drag-drop-list__item\"\n (cdkDragStarted)=\"dragStartedEvent.emit()\"\n (cdkDragEnded)=\"dragEndedEvent.emit()\"\n >\n <div class=\"valtimo-drag-drop-list__placeholder\" *cdkDragPlaceholder></div>\n\n <!-- The styled, draggable header row: background, hover and handle cover only this. -->\n <div\n class=\"valtimo-drag-drop-list__row\"\n [class.valtimo-drag-drop-list__row--grabbable]=\"\n wholeRowDraggable && !dragDisabled(item, $index)\n \"\n >\n @if (showHandle) {\n @if (wholeRowDraggable) {\n <span\n class=\"valtimo-drag-drop-list__handle valtimo-drag-drop-list__handle--static\"\n aria-hidden=\"true\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </span>\n } @else if (!dragDisabled(item, $index)) {\n <button\n cdkDragHandle\n [attr.aria-label]=\"handleAriaLabel | translate\"\n class=\"valtimo-drag-drop-list__handle\"\n type=\"button\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n }\n }\n\n <div\n class=\"valtimo-drag-drop-list__content\"\n (mousedown)=\"onContentPointerDown($event)\"\n (touchstart)=\"onContentPointerDown($event)\"\n >\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: $index}\"\n ></ng-container>\n </div>\n </div>\n\n @if (expansionTemplate) {\n <div\n class=\"valtimo-drag-drop-list__expansion\"\n (mousedown)=\"onExpansionPointerDown($event)\"\n (touchstart)=\"onExpansionPointerDown($event)\"\n >\n <ng-container\n *ngTemplateOutlet=\"expansionTemplate; context: {$implicit: item, index: $index}\"\n ></ng-container>\n </div>\n }\n </div>\n }\n\n @if (!items?.length && emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n</div>\n", styles: [".valtimo-drag-drop-list{display:flex;flex-direction:column;gap:var(--cds-spacing-03);min-height:var(--cds-spacing-09)}.valtimo-drag-drop-list--empty{border:1px dashed var(--cds-border-subtle);border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list.cdk-drop-list-receiving{outline:1px dashed var(--cds-border-subtle);outline-offset:calc(-1 * var(--cds-spacing-01));border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list.cdk-drop-list-dragging{outline:1px solid var(--cds-border-interactive);outline-offset:calc(-1 * var(--cds-spacing-01));border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list__item{display:flex;flex-direction:column}.valtimo-drag-drop-list__item.cdk-drag-disabled .valtimo-drag-drop-list__row{color:var(--cds-text-disabled);background-color:var(--cds-layer);cursor:default}.valtimo-drag-drop-list__row{display:flex;align-items:center;gap:var(--cds-spacing-03);padding:var(--cds-spacing-03) var(--cds-spacing-04);background-color:var(--cds-layer-02);color:var(--cds-text-primary)}.valtimo-drag-drop-list__row:hover{background-color:var(--cds-layer-hover-02)}.valtimo-drag-drop-list__row--grabbable{cursor:grab}.valtimo-drag-drop-list__row--grabbable:active{cursor:grabbing}.valtimo-drag-drop-list__handle{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--cds-icon-secondary);cursor:move}.valtimo-drag-drop-list__handle:hover{color:var(--cds-icon-primary)}.valtimo-drag-drop-list__handle:focus-visible{outline:2px solid var(--cds-focus);outline-offset:1px}.valtimo-drag-drop-list__handle--static{cursor:inherit;pointer-events:none}.valtimo-drag-drop-list__content{flex:1 1 auto;min-width:0}.valtimo-drag-drop-list__placeholder{box-sizing:border-box;min-height:var(--cds-spacing-07);border:1px dashed var(--cds-border-interactive);background-color:var(--cds-layer-accent-01);border-radius:var(--cds-spacing-02)}.cdk-drag-preview{box-sizing:border-box;box-shadow:var(--cds-spacing-01) var(--cds-spacing-02) var(--cds-spacing-03) #0003}.cdk-drag-preview .valtimo-drag-drop-list__expansion{display:none}.cdk-drag-animating,.cdk-drop-list-dragging .cdk-drag{transition:transform .2s cubic-bezier(0,0,.2,1)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i3.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5655
|
+
}
|
|
5656
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DragDropListComponent, decorators: [{
|
|
5657
|
+
type: Component,
|
|
5658
|
+
args: [{ standalone: true, selector: 'valtimo-drag-drop-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, DragDropModule, IconModule, TranslateModule], template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n cdkDropList\n [cdkDropListConnectedTo]=\"connectedTo\"\n [cdkDropListData]=\"items\"\n [cdkDropListDisabled]=\"disabled\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [cdkDropListOrientation]=\"orientation\"\n [cdkDropListSortingDisabled]=\"sortingDisabled\"\n [id]=\"listId\"\n (cdkDropListDropped)=\"droppedEvent.emit($event)\"\n class=\"valtimo-drag-drop-list\"\n [class.valtimo-drag-drop-list--empty]=\"!items?.length\"\n>\n @for (item of items; track trackByIndex($index)) {\n <div\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"dragDisabled(item, $index)\"\n class=\"valtimo-drag-drop-list__item\"\n (cdkDragStarted)=\"dragStartedEvent.emit()\"\n (cdkDragEnded)=\"dragEndedEvent.emit()\"\n >\n <div class=\"valtimo-drag-drop-list__placeholder\" *cdkDragPlaceholder></div>\n\n <!-- The styled, draggable header row: background, hover and handle cover only this. -->\n <div\n class=\"valtimo-drag-drop-list__row\"\n [class.valtimo-drag-drop-list__row--grabbable]=\"\n wholeRowDraggable && !dragDisabled(item, $index)\n \"\n >\n @if (showHandle) {\n @if (wholeRowDraggable) {\n <span\n class=\"valtimo-drag-drop-list__handle valtimo-drag-drop-list__handle--static\"\n aria-hidden=\"true\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </span>\n } @else if (!dragDisabled(item, $index)) {\n <button\n cdkDragHandle\n [attr.aria-label]=\"handleAriaLabel | translate\"\n class=\"valtimo-drag-drop-list__handle\"\n type=\"button\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n }\n }\n\n <div\n class=\"valtimo-drag-drop-list__content\"\n (mousedown)=\"onContentPointerDown($event)\"\n (touchstart)=\"onContentPointerDown($event)\"\n >\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: $index}\"\n ></ng-container>\n </div>\n </div>\n\n @if (expansionTemplate) {\n <div\n class=\"valtimo-drag-drop-list__expansion\"\n (mousedown)=\"onExpansionPointerDown($event)\"\n (touchstart)=\"onExpansionPointerDown($event)\"\n >\n <ng-container\n *ngTemplateOutlet=\"expansionTemplate; context: {$implicit: item, index: $index}\"\n ></ng-container>\n </div>\n }\n </div>\n }\n\n @if (!items?.length && emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n</div>\n", styles: [".valtimo-drag-drop-list{display:flex;flex-direction:column;gap:var(--cds-spacing-03);min-height:var(--cds-spacing-09)}.valtimo-drag-drop-list--empty{border:1px dashed var(--cds-border-subtle);border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list.cdk-drop-list-receiving{outline:1px dashed var(--cds-border-subtle);outline-offset:calc(-1 * var(--cds-spacing-01));border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list.cdk-drop-list-dragging{outline:1px solid var(--cds-border-interactive);outline-offset:calc(-1 * var(--cds-spacing-01));border-radius:var(--cds-spacing-02)}.valtimo-drag-drop-list__item{display:flex;flex-direction:column}.valtimo-drag-drop-list__item.cdk-drag-disabled .valtimo-drag-drop-list__row{color:var(--cds-text-disabled);background-color:var(--cds-layer);cursor:default}.valtimo-drag-drop-list__row{display:flex;align-items:center;gap:var(--cds-spacing-03);padding:var(--cds-spacing-03) var(--cds-spacing-04);background-color:var(--cds-layer-02);color:var(--cds-text-primary)}.valtimo-drag-drop-list__row:hover{background-color:var(--cds-layer-hover-02)}.valtimo-drag-drop-list__row--grabbable{cursor:grab}.valtimo-drag-drop-list__row--grabbable:active{cursor:grabbing}.valtimo-drag-drop-list__handle{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--cds-icon-secondary);cursor:move}.valtimo-drag-drop-list__handle:hover{color:var(--cds-icon-primary)}.valtimo-drag-drop-list__handle:focus-visible{outline:2px solid var(--cds-focus);outline-offset:1px}.valtimo-drag-drop-list__handle--static{cursor:inherit;pointer-events:none}.valtimo-drag-drop-list__content{flex:1 1 auto;min-width:0}.valtimo-drag-drop-list__placeholder{box-sizing:border-box;min-height:var(--cds-spacing-07);border:1px dashed var(--cds-border-interactive);background-color:var(--cds-layer-accent-01);border-radius:var(--cds-spacing-02)}.cdk-drag-preview{box-sizing:border-box;box-shadow:var(--cds-spacing-01) var(--cds-spacing-02) var(--cds-spacing-03) #0003}.cdk-drag-preview .valtimo-drag-drop-list__expansion{display:none}.cdk-drag-animating,.cdk-drop-list-dragging .cdk-drag{transition:transform .2s cubic-bezier(0,0,.2,1)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
5659
|
+
}], ctorParameters: () => [{ type: i2$3.IconService }], propDecorators: { items: [{
|
|
5660
|
+
type: Input
|
|
5661
|
+
}], listId: [{
|
|
5662
|
+
type: Input
|
|
5663
|
+
}], connectedTo: [{
|
|
5664
|
+
type: Input
|
|
5665
|
+
}], disabled: [{
|
|
5666
|
+
type: Input
|
|
5667
|
+
}], sortingDisabled: [{
|
|
5668
|
+
type: Input
|
|
5669
|
+
}], showHandle: [{
|
|
5670
|
+
type: Input
|
|
5671
|
+
}], wholeRowDraggable: [{
|
|
5672
|
+
type: Input
|
|
5673
|
+
}], orientation: [{
|
|
5674
|
+
type: Input
|
|
5675
|
+
}], handleAriaLabel: [{
|
|
5676
|
+
type: Input
|
|
5677
|
+
}], itemTemplate: [{
|
|
5678
|
+
type: Input
|
|
5679
|
+
}], expansionTemplate: [{
|
|
5680
|
+
type: Input
|
|
5681
|
+
}], emptyTemplate: [{
|
|
5682
|
+
type: Input
|
|
5683
|
+
}], enterPredicate: [{
|
|
5684
|
+
type: Input
|
|
5685
|
+
}], dragDisabled: [{
|
|
5686
|
+
type: Input
|
|
5687
|
+
}], droppedEvent: [{
|
|
5688
|
+
type: Output
|
|
5689
|
+
}], dragStartedEvent: [{
|
|
5690
|
+
type: Output
|
|
5691
|
+
}], dragEndedEvent: [{
|
|
5692
|
+
type: Output
|
|
5693
|
+
}] } });
|
|
5694
|
+
|
|
5695
|
+
/*
|
|
5696
|
+
* Copyright 2015-2025 Ritense BV, the Netherlands.
|
|
5697
|
+
*
|
|
5698
|
+
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5699
|
+
* you may not use this file except in compliance with the License.
|
|
5700
|
+
* You may obtain a copy of the License at
|
|
5701
|
+
*
|
|
5702
|
+
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
5703
|
+
*
|
|
5704
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
5705
|
+
* distributed under the License is distributed on an "AS IS" basis,
|
|
5706
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5707
|
+
* See the License for the specific language governing permissions and
|
|
5708
|
+
* limitations under the License.
|
|
5709
|
+
*/
|
|
5710
|
+
class VersionService {
|
|
5711
|
+
constructor(http, configService) {
|
|
5712
|
+
this.http = http;
|
|
5713
|
+
this.configService = configService;
|
|
5714
|
+
this.valtimoEndpointUri = configService.config.valtimoApi.endpointUri;
|
|
5715
|
+
}
|
|
5716
|
+
getVersion() {
|
|
5717
|
+
return this.http.get(`${this.valtimoEndpointUri}v1/valtimo/version`);
|
|
5718
|
+
}
|
|
5719
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, deps: [{ token: i1$1.HttpClient }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5720
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, providedIn: 'root' }); }
|
|
5721
|
+
}
|
|
5722
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VersionService, decorators: [{
|
|
5723
|
+
type: Injectable,
|
|
5724
|
+
args: [{
|
|
5725
|
+
providedIn: 'root',
|
|
5726
|
+
}]
|
|
5727
|
+
}], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i1$2.ConfigService }] });
|
|
5728
|
+
|
|
5729
|
+
/*
|
|
5730
|
+
* Copyright 2015-2025 Ritense BV, the Netherlands.
|
|
5731
|
+
*
|
|
5732
|
+
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5733
|
+
* you may not use this file except in compliance with the License.
|
|
5734
|
+
* You may obtain a copy of the License at
|
|
5735
|
+
*
|
|
5736
|
+
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
5737
|
+
*
|
|
5738
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
5739
|
+
* distributed under the License is distributed on an "AS IS" basis,
|
|
5740
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5741
|
+
* See the License for the specific language governing permissions and
|
|
5742
|
+
* limitations under the License.
|
|
5743
|
+
*/
|
|
5744
|
+
class RightSidebarComponent {
|
|
5745
|
+
onPageClick(targetElement) {
|
|
5746
|
+
combineLatest([this.shellService.panelExpanded$, this.shellService.mouseOnTopBar$])
|
|
5747
|
+
.pipe(take$1(1))
|
|
5748
|
+
.subscribe(([panelExpanded, mouseOnTopBar]) => {
|
|
5749
|
+
const clickedInside = this.elementRef.nativeElement.contains(targetElement) || mouseOnTopBar;
|
|
5750
|
+
if (!clickedInside && panelExpanded) {
|
|
5751
|
+
this.shellService.setPanelExpanded(false);
|
|
5752
|
+
}
|
|
5753
|
+
});
|
|
5754
|
+
}
|
|
5755
|
+
constructor(translateService, userProviderService, formBuilder, versionService, shellService, elementRef, configService, userSettingsService, pageHeaderService, cdsThemeService) {
|
|
5756
|
+
this.translateService = translateService;
|
|
5757
|
+
this.userProviderService = userProviderService;
|
|
5758
|
+
this.formBuilder = formBuilder;
|
|
5759
|
+
this.versionService = versionService;
|
|
5760
|
+
this.shellService = shellService;
|
|
5761
|
+
this.elementRef = elementRef;
|
|
5762
|
+
this.configService = configService;
|
|
5763
|
+
this.userSettingsService = userSettingsService;
|
|
5764
|
+
this.pageHeaderService = pageHeaderService;
|
|
5765
|
+
this.cdsThemeService = cdsThemeService;
|
|
5766
|
+
this.testIds = RIGHT_SIDEBAR_TEST_IDS;
|
|
5767
|
+
this.panelExpanded$ = this.shellService.panelExpanded$;
|
|
5768
|
+
this._selectedLanguage$ = new BehaviorSubject('');
|
|
5769
|
+
this._languageOptions$ = new BehaviorSubject([]);
|
|
5770
|
+
this.languageListItems$ = combineLatest([
|
|
5771
|
+
this._languageOptions$,
|
|
5772
|
+
this._selectedLanguage$,
|
|
5773
|
+
this.translateService.stream('key'),
|
|
5774
|
+
]).pipe(map$1(([languageOptions, selectedLanguage]) => languageOptions.map(languageKey => ({
|
|
5775
|
+
content: this.translateService.instant('settings.language.options.' + languageKey),
|
|
5776
|
+
key: languageKey,
|
|
5777
|
+
selected: selectedLanguage === languageKey,
|
|
5778
|
+
}))));
|
|
5779
|
+
this.backendVersion$ = this.versionService.getVersion();
|
|
5780
|
+
this.userSubject$ = this.userProviderService.getUserSubject();
|
|
5781
|
+
this.updatingUserSettings$ = new BehaviorSubject(true);
|
|
5782
|
+
this.collapsibleWidescreenMenu$ = this.shellService.collapsibleWidescreenMenu$;
|
|
5783
|
+
this.compactMode$ = this.pageHeaderService.compactMode$;
|
|
5784
|
+
this.showUserNameInTopBar$ = this.pageHeaderService.showUserNameInTopBar$;
|
|
5785
|
+
this._preferredTheme$ = this.cdsThemeService.preferredTheme$;
|
|
5786
|
+
this.showValtimoVersions = true;
|
|
5787
|
+
this.themeOptions$ = combineLatest([
|
|
5788
|
+
this._preferredTheme$,
|
|
5789
|
+
this.translateService.stream('key'),
|
|
5790
|
+
]).pipe(map$1(([preferredTheme]) => [
|
|
5791
|
+
{
|
|
5792
|
+
content: this.translateService.instant('settings.interface.themes.light'),
|
|
5793
|
+
key: SelectableCarbonTheme.G10,
|
|
5794
|
+
selected: preferredTheme === SelectableCarbonTheme.G10,
|
|
5795
|
+
},
|
|
5796
|
+
{
|
|
5797
|
+
content: this.translateService.instant('settings.interface.themes.dark'),
|
|
5798
|
+
key: SelectableCarbonTheme.G90,
|
|
5799
|
+
selected: preferredTheme === SelectableCarbonTheme.G90,
|
|
5800
|
+
},
|
|
5801
|
+
{
|
|
5802
|
+
content: this.translateService.instant('settings.interface.themes.system'),
|
|
5803
|
+
key: SelectableCarbonTheme.SYSTEM,
|
|
5804
|
+
selected: preferredTheme === SelectableCarbonTheme.SYSTEM,
|
|
5805
|
+
},
|
|
5806
|
+
]));
|
|
5807
|
+
this.allowUserThemeSwitching$ = this.configService.getFeatureToggleObservable('allowUserThemeSwitching', true);
|
|
5808
|
+
this.enableCompactModeToggle$ = this.configService.getFeatureToggleObservable('enableCompactModeToggle', true);
|
|
5809
|
+
this.enableShowUserNameToggle$ = this.configService.getFeatureToggleObservable('enableUserNameInTopBarToggle');
|
|
5810
|
+
this.showPlantATreeButton$ = this.configService.getFeatureToggleObservable('showPlantATreeButton');
|
|
5811
|
+
this.hideValtimoVersionsForNonAdmins$ = this.configService.getFeatureToggleObservable('hideValtimoVersionsForNonAdmins');
|
|
5812
|
+
this._isAdmin$ = this.userProviderService
|
|
5813
|
+
.getUserSubject()
|
|
5814
|
+
.pipe(map$1(userIdentity => userIdentity?.roles.includes('ROLE_ADMIN')));
|
|
5815
|
+
this._subscriptions = new Subscription();
|
|
5816
|
+
}
|
|
5817
|
+
ngOnInit() {
|
|
5818
|
+
this.initNonToggleSettings();
|
|
5819
|
+
this.initFrontendVersion();
|
|
5820
|
+
this.openShowVersionsSubscription();
|
|
5821
|
+
this.setLanguage();
|
|
5822
|
+
this.getUserSettings();
|
|
5823
|
+
}
|
|
5824
|
+
ngOnDestroy() {
|
|
5825
|
+
this._subscriptions.unsubscribe();
|
|
5826
|
+
}
|
|
5827
|
+
updateUserLanguage(langKey, saveSettings = true) {
|
|
5828
|
+
const langKeyToUse = langKey?.item?.key
|
|
5829
|
+
? langKey?.item.key
|
|
5830
|
+
: langKey;
|
|
5831
|
+
this.translateService
|
|
5832
|
+
.use(langKeyToUse)
|
|
5833
|
+
.pipe(take$1(1))
|
|
5834
|
+
.subscribe(() => {
|
|
5835
|
+
localStorage.setItem('langKey', langKeyToUse);
|
|
5836
|
+
this._selectedLanguage$.next(langKeyToUse);
|
|
5837
|
+
if (saveSettings) {
|
|
5838
|
+
this.saveUserSettings();
|
|
5839
|
+
}
|
|
5840
|
+
});
|
|
5841
|
+
}
|
|
5842
|
+
setCollapsibleWidescreenMenu(collapsible, saveSettings = true) {
|
|
5843
|
+
this.shellService.setCollapsibleWidescreenMenu(collapsible);
|
|
5844
|
+
if (saveSettings) {
|
|
5845
|
+
this.saveUserSettings();
|
|
5846
|
+
}
|
|
5847
|
+
}
|
|
5848
|
+
setCompactMode(compactMode, saveSettings = true) {
|
|
5849
|
+
this.pageHeaderService.setCompactMode(compactMode);
|
|
5850
|
+
if (saveSettings) {
|
|
5851
|
+
this.saveUserSettings();
|
|
5852
|
+
}
|
|
5853
|
+
}
|
|
5854
|
+
setShowUserName(showUserName, saveSettings = true) {
|
|
5855
|
+
this.pageHeaderService.setShowUserNameInTopBar(showUserName);
|
|
5856
|
+
if (saveSettings) {
|
|
5857
|
+
this.saveUserSettings();
|
|
5858
|
+
}
|
|
5859
|
+
}
|
|
5860
|
+
setPreferredTheme(selectedTheme, saveSettings = true) {
|
|
5040
5861
|
if (selectedTheme?.item?.key) {
|
|
5041
5862
|
this.cdsThemeService.setPreferredTheme(selectedTheme.item?.key);
|
|
5042
5863
|
}
|
|
@@ -5349,6 +6170,12 @@ class LeftSidebarComponent {
|
|
|
5349
6170
|
event.preventDefault();
|
|
5350
6171
|
this.overflowMenuSequence$.next('');
|
|
5351
6172
|
if (!event.ctrlKey && !event.metaKey) {
|
|
6173
|
+
// Custom links may point to an external/absolute URL, which the Angular router cannot
|
|
6174
|
+
// resolve — open those in a new tab instead of attempting (and failing) an internal navigation.
|
|
6175
|
+
if (this.isExternalLink(route)) {
|
|
6176
|
+
window.open(route[0], '_blank', 'noopener');
|
|
6177
|
+
return;
|
|
6178
|
+
}
|
|
5352
6179
|
this.router.navigate(route, { queryParams: {} });
|
|
5353
6180
|
combineLatest([
|
|
5354
6181
|
this.shellService.sideBarExpanded$,
|
|
@@ -5375,9 +6202,18 @@ class LeftSidebarComponent {
|
|
|
5375
6202
|
});
|
|
5376
6203
|
}
|
|
5377
6204
|
openInNewTab(link) {
|
|
6205
|
+
if (this.isExternalLink(link)) {
|
|
6206
|
+
window.open(link[0], '_blank', 'noopener');
|
|
6207
|
+
return;
|
|
6208
|
+
}
|
|
5378
6209
|
const url = this.router.serializeUrl(this.router.createUrlTree(link || ['/']));
|
|
5379
6210
|
window.open(url, '_blank');
|
|
5380
6211
|
}
|
|
6212
|
+
/** A custom link whose first segment is an absolute/external URL (`http(s)://`, `//`, `mailto:`). */
|
|
6213
|
+
isExternalLink(link) {
|
|
6214
|
+
const first = link?.[0] ?? '';
|
|
6215
|
+
return /^(https?:)?\/\//i.test(first) || /^mailto:/i.test(first);
|
|
6216
|
+
}
|
|
5381
6217
|
openBreakpointSubscription() {
|
|
5382
6218
|
this._breakpointSubscription = this.breakpointObserver
|
|
5383
6219
|
.observe(['(max-width: 1055px)', '(min-width: 1056px)'])
|
|
@@ -5420,13 +6256,13 @@ class LeftSidebarComponent {
|
|
|
5420
6256
|
}
|
|
5421
6257
|
});
|
|
5422
6258
|
}
|
|
5423
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LeftSidebarComponent, deps: [{ token: i0.ElementRef }, { token: MenuService }, { token: ShellService }, { token: i3.BreakpointObserver }, { token: i1$3.Router }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6259
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LeftSidebarComponent, deps: [{ token: i0.ElementRef }, { token: MenuService }, { token: ShellService }, { token: i3$1.BreakpointObserver }, { token: i1$3.Router }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5424
6260
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: LeftSidebarComponent, isStandalone: false, selector: "valtimo-left-sidebar", host: { listeners: { "document:click": "onPageClick($event.target)" } }, viewQueries: [{ propertyName: "toggleButtonRef", first: true, predicate: ["toggleButton"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-sidenav\n *ngIf=\"{\n closestSequence: closestSequence$ | async,\n overflowMenuSequence: overflowMenuSequence$ | async,\n sideBarExpanded: sideBarExpanded$ | async,\n menuItemsLoaded: menuItemsLoaded$ | async,\n menuItems: menuItems$ | async,\n } as obs\"\n [allowExpansion]=\"false\"\n [expanded]=\"obs.sideBarExpanded\"\n>\n <ng-container *ngIf=\"obs.menuItemsLoaded; else loadingTemplate\">\n <ng-container *ngFor=\"let menuItem of obs.menuItems; trackBy: trackByMenuItem\">\n <ng-container *ngIf=\"!menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n menuItem: menuItem,\n closestSequence: obs.closestSequence,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n closestSequence: obs.closestSequence,\n menuItem: menuItem,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n\n <div [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\">\n <ng-container *ngTemplateOutlet=\"subMenuIcon; context: {menuItem: menuItem}\"></ng-container>\n\n <cds-sidenav-menu\n [title]=\"menuItem | menuItemTranslate | async\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n >\n <ng-container\n *ngFor=\"let childMenuItem of menuItem.children; trackBy: trackByMenuItem\"\n >\n <ng-container\n *ngIf=\"{\n disableCaseCount: disableCaseCount$ | async,\n count: childMenuItem?.count$ && (childMenuItem?.count$ | async),\n sequence: '' + menuItem.sequence + '.' + childMenuItem.sequence,\n } as vars\"\n >\n <cds-sidenav-item\n [attr.data-testid]=\"'sidenav-item-' + childMenuItem?.title\"\n [title]=\"\n menuItem.title === 'Cases' || menuItem.title === 'Dossiers'\n ? (childMenuItem | menuItemTranslate | async)\n : null\n \"\n [ngClass]=\"{\n 'cds--side-nav__item--empty': !childMenuItem.link,\n 'menu-item--hidden': childMenuItem.includeFunction !== undefined,\n 'menu-item--visible':\n childMenuItem.includeFunction !== undefined &&\n (includeFunctionObservables[childMenuItem.title] | async),\n }\"\n [active]=\"vars.sequence === obs.closestSequence\"\n [href]=\"vars?.count ? 'javascript:return false;' : 'javascript:void(0);'\"\n (click)=\"navigateToRoute(childMenuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(childMenuItem.link)\"\n >\n <valtimo-menu-item-text\n [accent]=\"!childMenuItem.link\"\n [menuItem]=\"childMenuItem\"\n [showOverFlowMenu]=\"obs.overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(childMenuItem.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n\n <ng-container\n *ngTemplateOutlet=\"countTemplate; context: {count: vars.count, disableCaseCount: vars.disableCaseCount}\"\n ></ng-container>\n </cds-sidenav-item>\n </ng-container>\n </ng-container>\n </cds-sidenav-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n</cds-sidenav>\n\n<ng-template #subMenuIcon let-menuItem=\"menuItem\">\n <div class=\"menu-item-icon-container\"><i class=\"{{ menuItem.iconClass }}\"></i></div>\n</ng-template>\n\n<ng-template\n #topMenuItem\n let-closestSequence=\"closestSequence\"\n let-menuItem=\"menuItem\"\n let-overflowMenuSequence=\"overflowMenuSequence\"\n>\n <ng-container *ngIf=\"{sequence: '' + menuItem.sequence} as vars\"\n ><cds-sidenav-item\n *ngIf=\"!menuItem.children\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\"\n [active]=\"vars.sequence === closestSequence\"\n (click)=\"navigateToRoute(menuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(menuItem.link.link)\"\n href=\"javascript:void(0)\"\n >\n <valtimo-menu-item-text\n [menuItem]=\"menuItem\"\n [showOverFlowMenu]=\"overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(menuItem.link.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n </cds-sidenav-item>\n </ng-container>\n</ng-template>\n\n<ng-template #countTemplate let-count=\"count\" let-disableCaseCount=\"disableCaseCount\">\n <ng-container *ngIf=\"count && !disableCaseCount\">\n <span class=\"case-count\">\n {{ count | caseCount }}\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n", styles: ["@media screen and (max-width:767px){.be-left-sidebar{width:100%!important}}.be-left-sidebar .left-sidebar-toggle{padding:20px}.be-left-sidebar .left-sidebar-toggle:before{font-size:1.615rem}.be-left-sidebar .sidebar-elements>li>a.be-toggle-left-sidebar{height:32px;display:flex;align-items:center}.be-left-sidebar .left-sidebar-content{padding-top:20px}.be-toggle-left-sidebar svg{margin-right:7px;min-width:21px;height:auto;overflow:visible}.be-toggle-left-sidebar svg path{transition:.27s ease;fill:#696969}::ng-deep .resize-border{position:absolute;width:3px;height:100%;top:0;right:0;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9)}::ng-deep .resize-hover{opacity:1}::ng-deep .resize-border--invisible{display:none}.no-transition{transition:none}.d-1{d:path(\"M3 18v-2h13v2z\")}.d-1-flipped{d:path(\"M3 18v-2h11v2z\")}.d-2{d:path(\"M3 13v-2h10v2H3\")}.d-2-flipped{d:path(\"M3 13v-2h12v2H3\")}.d-3{d:path(\"M3 6h13v2H3V6\")}.d-3-flipped{d:path(\"M3 6h11v2H3V6\")}.d-4{d:path(\"M21 15.61L19.59 17l-5.01-5 5.01-5L21 8.39 17.44 12 21 15.61\")}.d-4-flipped{d:path(\"M15.58 15.61L16.99 17 22 12l-5.01-5-1.41 1.39L19.14 12l-3.56 3.61\")}::ng-deep .cds--side-nav__menu{padding-left:0}::ng-deep .cds--side-nav__navigation{border-right:1px solid #e0e0e0;height:100%}::ng-deep .cds--side-nav--ux{width:0}::ng-deep .cds--side-nav--expanded{width:16rem}::ng-deep .cds--side-nav__header-divider{display:none!important}.menu-item-icon-container{position:relative;top:8px;left:13px;height:0}.menu-item-icon-container i{width:0px;height:16px}.menu-item--hidden{display:none}.menu-item--visible{display:block}::ng-deep .cds--side-nav__item--empty{pointer-events:none}::ng-deep .cds--side-nav__item--empty .menu-item-icon-container{display:none}::ng-deep .cds--side-nav__link[href*=\"javascript:return false;\"]{padding-right:3rem!important}.case-count{position:absolute;right:0;padding-right:1rem;height:100%;top:0;display:flex;align-items:center;justify-content:center;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;font-weight:500!important}::ng-deep .cds--side-nav__icon{margin-left:-16px}::ng-deep .cds--side-nav__item.cds--side-nav__item--icon a.cds--side-nav__link{padding-left:3.5rem}::ng-deep .cds--side-nav__submenu-title{padding-right:1.5rem}::ng-deep .cds--side-nav__items{display:flex!important;flex-direction:column!important;overflow:visible!important}::ng-deep .cds--side-nav__navigation{top:3rem;height:calc(100% - 3rem)!important;overflow-x:hidden!important;overflow-y:auto!important}::ng-deep .cds--side-nav__navigation:not(.cds--side-nav--expanded){width:0}.loading-container{display:flex;width:100%;justify-content:center}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MenuItemTextComponent, selector: "valtimo-menu-item-text", inputs: ["menuItem", "accent", "showOverFlowMenu"], outputs: ["overflowMenuClosed", "openInNewTab"] }, { kind: "component", type: i2$3.SideNav, selector: "cds-sidenav, ibm-sidenav", inputs: ["ariaLabel", "expanded", "hidden", "rail", "allowExpansion", "navigationItems", "useRouter"] }, { kind: "component", type: i2$3.SideNavItem, selector: "cds-sidenav-item, ibm-sidenav-item", inputs: ["href", "useRouter", "active", "route", "isSubMenu", "routeExtras", "title"], outputs: ["navigation", "selected"] }, { kind: "component", type: i2$3.SideNavMenu, selector: "cds-sidenav-menu, ibm-sidenav-menu", inputs: ["useRouter", "title", "expanded", "hasActiveChild", "menuItems"] }, { kind: "directive", type: CtrlClickDirective, selector: "[ctrl-click]", outputs: ["ctrl-click"] }, { kind: "component", type: i2$3.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: MenuItemTranslationPipe, name: "menuItemTranslate" }, { kind: "pipe", type: CaseCountPipe, name: "caseCount" }] }); }
|
|
5425
6261
|
}
|
|
5426
6262
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LeftSidebarComponent, decorators: [{
|
|
5427
6263
|
type: Component,
|
|
5428
6264
|
args: [{ selector: 'valtimo-left-sidebar', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-sidenav\n *ngIf=\"{\n closestSequence: closestSequence$ | async,\n overflowMenuSequence: overflowMenuSequence$ | async,\n sideBarExpanded: sideBarExpanded$ | async,\n menuItemsLoaded: menuItemsLoaded$ | async,\n menuItems: menuItems$ | async,\n } as obs\"\n [allowExpansion]=\"false\"\n [expanded]=\"obs.sideBarExpanded\"\n>\n <ng-container *ngIf=\"obs.menuItemsLoaded; else loadingTemplate\">\n <ng-container *ngFor=\"let menuItem of obs.menuItems; trackBy: trackByMenuItem\">\n <ng-container *ngIf=\"!menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n menuItem: menuItem,\n closestSequence: obs.closestSequence,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n closestSequence: obs.closestSequence,\n menuItem: menuItem,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n\n <div [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\">\n <ng-container *ngTemplateOutlet=\"subMenuIcon; context: {menuItem: menuItem}\"></ng-container>\n\n <cds-sidenav-menu\n [title]=\"menuItem | menuItemTranslate | async\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n >\n <ng-container\n *ngFor=\"let childMenuItem of menuItem.children; trackBy: trackByMenuItem\"\n >\n <ng-container\n *ngIf=\"{\n disableCaseCount: disableCaseCount$ | async,\n count: childMenuItem?.count$ && (childMenuItem?.count$ | async),\n sequence: '' + menuItem.sequence + '.' + childMenuItem.sequence,\n } as vars\"\n >\n <cds-sidenav-item\n [attr.data-testid]=\"'sidenav-item-' + childMenuItem?.title\"\n [title]=\"\n menuItem.title === 'Cases' || menuItem.title === 'Dossiers'\n ? (childMenuItem | menuItemTranslate | async)\n : null\n \"\n [ngClass]=\"{\n 'cds--side-nav__item--empty': !childMenuItem.link,\n 'menu-item--hidden': childMenuItem.includeFunction !== undefined,\n 'menu-item--visible':\n childMenuItem.includeFunction !== undefined &&\n (includeFunctionObservables[childMenuItem.title] | async),\n }\"\n [active]=\"vars.sequence === obs.closestSequence\"\n [href]=\"vars?.count ? 'javascript:return false;' : 'javascript:void(0);'\"\n (click)=\"navigateToRoute(childMenuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(childMenuItem.link)\"\n >\n <valtimo-menu-item-text\n [accent]=\"!childMenuItem.link\"\n [menuItem]=\"childMenuItem\"\n [showOverFlowMenu]=\"obs.overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(childMenuItem.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n\n <ng-container\n *ngTemplateOutlet=\"countTemplate; context: {count: vars.count, disableCaseCount: vars.disableCaseCount}\"\n ></ng-container>\n </cds-sidenav-item>\n </ng-container>\n </ng-container>\n </cds-sidenav-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n</cds-sidenav>\n\n<ng-template #subMenuIcon let-menuItem=\"menuItem\">\n <div class=\"menu-item-icon-container\"><i class=\"{{ menuItem.iconClass }}\"></i></div>\n</ng-template>\n\n<ng-template\n #topMenuItem\n let-closestSequence=\"closestSequence\"\n let-menuItem=\"menuItem\"\n let-overflowMenuSequence=\"overflowMenuSequence\"\n>\n <ng-container *ngIf=\"{sequence: '' + menuItem.sequence} as vars\"\n ><cds-sidenav-item\n *ngIf=\"!menuItem.children\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\"\n [active]=\"vars.sequence === closestSequence\"\n (click)=\"navigateToRoute(menuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(menuItem.link.link)\"\n href=\"javascript:void(0)\"\n >\n <valtimo-menu-item-text\n [menuItem]=\"menuItem\"\n [showOverFlowMenu]=\"overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(menuItem.link.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n </cds-sidenav-item>\n </ng-container>\n</ng-template>\n\n<ng-template #countTemplate let-count=\"count\" let-disableCaseCount=\"disableCaseCount\">\n <ng-container *ngIf=\"count && !disableCaseCount\">\n <span class=\"case-count\">\n {{ count | caseCount }}\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n", styles: ["@media screen and (max-width:767px){.be-left-sidebar{width:100%!important}}.be-left-sidebar .left-sidebar-toggle{padding:20px}.be-left-sidebar .left-sidebar-toggle:before{font-size:1.615rem}.be-left-sidebar .sidebar-elements>li>a.be-toggle-left-sidebar{height:32px;display:flex;align-items:center}.be-left-sidebar .left-sidebar-content{padding-top:20px}.be-toggle-left-sidebar svg{margin-right:7px;min-width:21px;height:auto;overflow:visible}.be-toggle-left-sidebar svg path{transition:.27s ease;fill:#696969}::ng-deep .resize-border{position:absolute;width:3px;height:100%;top:0;right:0;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9)}::ng-deep .resize-hover{opacity:1}::ng-deep .resize-border--invisible{display:none}.no-transition{transition:none}.d-1{d:path(\"M3 18v-2h13v2z\")}.d-1-flipped{d:path(\"M3 18v-2h11v2z\")}.d-2{d:path(\"M3 13v-2h10v2H3\")}.d-2-flipped{d:path(\"M3 13v-2h12v2H3\")}.d-3{d:path(\"M3 6h13v2H3V6\")}.d-3-flipped{d:path(\"M3 6h11v2H3V6\")}.d-4{d:path(\"M21 15.61L19.59 17l-5.01-5 5.01-5L21 8.39 17.44 12 21 15.61\")}.d-4-flipped{d:path(\"M15.58 15.61L16.99 17 22 12l-5.01-5-1.41 1.39L19.14 12l-3.56 3.61\")}::ng-deep .cds--side-nav__menu{padding-left:0}::ng-deep .cds--side-nav__navigation{border-right:1px solid #e0e0e0;height:100%}::ng-deep .cds--side-nav--ux{width:0}::ng-deep .cds--side-nav--expanded{width:16rem}::ng-deep .cds--side-nav__header-divider{display:none!important}.menu-item-icon-container{position:relative;top:8px;left:13px;height:0}.menu-item-icon-container i{width:0px;height:16px}.menu-item--hidden{display:none}.menu-item--visible{display:block}::ng-deep .cds--side-nav__item--empty{pointer-events:none}::ng-deep .cds--side-nav__item--empty .menu-item-icon-container{display:none}::ng-deep .cds--side-nav__link[href*=\"javascript:return false;\"]{padding-right:3rem!important}.case-count{position:absolute;right:0;padding-right:1rem;height:100%;top:0;display:flex;align-items:center;justify-content:center;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;font-weight:500!important}::ng-deep .cds--side-nav__icon{margin-left:-16px}::ng-deep .cds--side-nav__item.cds--side-nav__item--icon a.cds--side-nav__link{padding-left:3.5rem}::ng-deep .cds--side-nav__submenu-title{padding-right:1.5rem}::ng-deep .cds--side-nav__items{display:flex!important;flex-direction:column!important;overflow:visible!important}::ng-deep .cds--side-nav__navigation{top:3rem;height:calc(100% - 3rem)!important;overflow-x:hidden!important;overflow-y:auto!important}::ng-deep .cds--side-nav__navigation:not(.cds--side-nav--expanded){width:0}.loading-container{display:flex;width:100%;justify-content:center}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
5429
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: MenuService }, { type: ShellService }, { type: i3.BreakpointObserver }, { type: i1$3.Router }, { type: i1$2.ConfigService }], propDecorators: { toggleButtonRef: [{
|
|
6265
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: MenuService }, { type: ShellService }, { type: i3$1.BreakpointObserver }, { type: i1$3.Router }, { type: i1$2.ConfigService }], propDecorators: { toggleButtonRef: [{
|
|
5430
6266
|
type: ViewChild,
|
|
5431
6267
|
args: ['toggleButton']
|
|
5432
6268
|
}], onPageClick: [{
|
|
@@ -7478,11 +8314,11 @@ class CarbonListComponent {
|
|
|
7478
8314
|
}
|
|
7479
8315
|
}
|
|
7480
8316
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonListComponent, deps: [{ token: EllipsisPipe }, { token: CarbonListFilterPipe }, { token: i2$3.IconService }, { token: i4.NGXLogger }, { token: i1.TranslateService }, { token: ViewContentService }, { token: KeyStateService }, { token: CarbonListDragAndDropService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7481
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonListComponent, isStandalone: false, selector: "valtimo-carbon-list", inputs: { items: "items", fields: "fields", tableTranslations: "tableTranslations", paginatorConfig: "paginatorConfig", pagination: "pagination", loading: "loading", skeletonRowCount: "skeletonRowCount", actions: "actions", actionItems: "actionItems", showActionItems: "showActionItems", header: "header", hideColumnHeader: "hideColumnHeader", initialSortState: "initialSortState", sortState: "sortState", isSearchable: "isSearchable", initialSearchValue: "initialSearchValue", searchDebounceMs: "searchDebounceMs", invalidSearchFields: "invalidSearchFields", searchFields: "searchFields", enableSingleSelection: "enableSingleSelection", lastColumnTemplate: "lastColumnTemplate", paginationIdentifier: "paginationIdentifier", showSelectionColumn: "showSelectionColumn", striped: "striped", hideToolbar: "hideToolbar", lockedTooltipTranslationKey: "lockedTooltipTranslationKey", movingRowsEnabled: "movingRowsEnabled", dragAndDrop: "dragAndDrop", dragAndDropDisabled: "dragAndDropDisabled", expandedRowTemplate: "expandedRowTemplate", expandedRowKey: "expandedRowKey", trackByKey: "trackByKey" }, outputs: { rowClicked: "rowClicked", paginationClicked: "paginationClicked", paginationSet: "paginationSet", search: "search", sortChanged: "sortChanged", moveRow: "moveRow", itemsReordered: "itemsReordered" }, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], viewQueries: [{ propertyName: "actionsMenuTemplate", first: true, predicate: ["actionsMenuTemplate"], descendants: true }, { propertyName: "actionTemplate", first: true, predicate: ["actionTemplate"], descendants: true }, { propertyName: "booleanTemplate", first: true, predicate: ["booleanTemplate"], descendants: true }, { propertyName: "moveRowsTemplate", first: true, predicate: ["moveRowsTemplate"], descendants: true }, { propertyName: "dragAndDropTemplate", first: true, predicate: ["dragAndDropTemplate"], descendants: true }, { propertyName: "rowDisabled", first: true, predicate: ["rowDisabled"], descendants: true }, { propertyName: "tagTemplate", first: true, predicate: ["tagTemplate"], descendants: true }, { propertyName: "defaultTemplate", first: true, predicate: ["defaultTemplate"], descendants: true }, { propertyName: "_table", first: true, predicate: Table, descendants: true }], ngImport: i0, template: "<!--\n ~ /*\n ~ * Copyright 2015-2026 Ritense BV, the Netherlands.\n ~ *\n ~ * Licensed under EUPL, Version 1.2 (the \"License\");\n ~ * you may not use this file except in compliance with the License.\n ~ * You may obtain a copy of the License at\n ~ *\n ~ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~ *\n ~ * Unless required by applicable law or agreed to in writing, software\n ~ * distributed under the License is distributed on an \"AS IS\" basis,\n ~ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ * See the License for the specific language governing permissions and\n ~ * limitations under the License.\n ~ */\n -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n [portalToBody]=\"true\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i2$3.Pagination, selector: "cds-pagination, ibm-pagination", inputs: ["skeleton", "model", "disabled", "pageInputDisabled", "showPageInput", "pagesUnknown", "pageSelectThreshold", "translations", "itemsPerPageOptions"], outputs: ["selectPage"] }, { kind: "component", type: i2$3.TableToolbar, selector: "cds-table-toolbar, ibm-table-toolbar", inputs: ["model", "batchText", "ariaLabel", "cancelText", "size"], outputs: ["cancel"] }, { kind: "component", type: i2$3.TableContainer, selector: "cds-table-container, ibm-table-container" }, { kind: "component", type: i2$3.TableHeader, selector: "cds-table-header, ibm-table-header" }, { kind: "component", type: i2$3.TableToolbarActions, selector: "cds-table-toolbar-actions, ibm-table-toolbar-actions" }, { kind: "component", type: i2$3.TableToolbarSearch, selector: "cds-table-toolbar-search, ibm-table-toolbar-search" }, { kind: "component", type: i2$3.TableToolbarContent, selector: "cds-table-toolbar-content, ibm-table-toolbar-content" }, { kind: "component", type: i2$3.Table, selector: "cds-table, ibm-table", inputs: ["ariaLabelledby", "ariaDescribedby", "model", "size", "skeleton", "isDataGrid", "sortable", "noBorder", "showExpandAllToggle", "showSelectionColumn", "enableSingleSelect", "scrollLoadDistance", "expandButtonAriaLabel", "sortDescendingLabel", "sortAscendingLabel", "translations", "striped", "stickyHeader", "footerTemplate", "selectionLabelColumn"], outputs: ["sort", "selectAll", "deselectAll", "selectRow", "deselectRow", "rowClick", "scrollLoad"] }, { kind: "component", type: i2$3.TableBody, selector: "[cdsTableBody], [ibmTableBody]", inputs: ["model", "enableSingleSelect", "expandButtonAriaLabel", "checkboxRowLabel", "showSelectionColumn", "size", "selectionLabelColumn", "skeleton"], outputs: ["selectRow", "deselectRow", "rowClick"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i11.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2$3.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }, { kind: "component", type: OverflowMenuOptionComponent, selector: "v-overflow-menu-option", inputs: ["disabled", "type", "testId", "optionId"], outputs: ["selected"] }, { kind: "component", type: OverflowMenuTriggerComponent, selector: "v-overflow-menu-trigger", inputs: ["compact", "label"] }, { kind: "component", type: CarbonTagsModalComponent, selector: "valtimo-tags-modal", inputs: ["open", "tags"], outputs: ["closeEvent"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionItemDisabledPipe, name: "actionItemDisabled" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
8317
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonListComponent, isStandalone: false, selector: "valtimo-carbon-list", inputs: { items: "items", fields: "fields", tableTranslations: "tableTranslations", paginatorConfig: "paginatorConfig", pagination: "pagination", loading: "loading", skeletonRowCount: "skeletonRowCount", actions: "actions", actionItems: "actionItems", showActionItems: "showActionItems", header: "header", hideColumnHeader: "hideColumnHeader", initialSortState: "initialSortState", sortState: "sortState", isSearchable: "isSearchable", initialSearchValue: "initialSearchValue", searchDebounceMs: "searchDebounceMs", invalidSearchFields: "invalidSearchFields", searchFields: "searchFields", enableSingleSelection: "enableSingleSelection", lastColumnTemplate: "lastColumnTemplate", paginationIdentifier: "paginationIdentifier", showSelectionColumn: "showSelectionColumn", striped: "striped", hideToolbar: "hideToolbar", lockedTooltipTranslationKey: "lockedTooltipTranslationKey", movingRowsEnabled: "movingRowsEnabled", dragAndDrop: "dragAndDrop", dragAndDropDisabled: "dragAndDropDisabled", expandedRowTemplate: "expandedRowTemplate", expandedRowKey: "expandedRowKey", trackByKey: "trackByKey" }, outputs: { rowClicked: "rowClicked", paginationClicked: "paginationClicked", paginationSet: "paginationSet", search: "search", sortChanged: "sortChanged", moveRow: "moveRow", itemsReordered: "itemsReordered" }, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], viewQueries: [{ propertyName: "actionsMenuTemplate", first: true, predicate: ["actionsMenuTemplate"], descendants: true }, { propertyName: "actionTemplate", first: true, predicate: ["actionTemplate"], descendants: true }, { propertyName: "booleanTemplate", first: true, predicate: ["booleanTemplate"], descendants: true }, { propertyName: "moveRowsTemplate", first: true, predicate: ["moveRowsTemplate"], descendants: true }, { propertyName: "dragAndDropTemplate", first: true, predicate: ["dragAndDropTemplate"], descendants: true }, { propertyName: "rowDisabled", first: true, predicate: ["rowDisabled"], descendants: true }, { propertyName: "tagTemplate", first: true, predicate: ["tagTemplate"], descendants: true }, { propertyName: "defaultTemplate", first: true, predicate: ["defaultTemplate"], descendants: true }, { propertyName: "_table", first: true, predicate: Table, descendants: true }], ngImport: i0, template: "<!--\n ~ /*\n ~ * Copyright 2015-2026 Ritense BV, the Netherlands.\n ~ *\n ~ * Licensed under EUPL, Version 1.2 (the \"License\");\n ~ * you may not use this file except in compliance with the License.\n ~ * You may obtain a copy of the License at\n ~ *\n ~ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~ *\n ~ * Unless required by applicable law or agreed to in writing, software\n ~ * distributed under the License is distributed on an \"AS IS\" basis,\n ~ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ * See the License for the specific language governing permissions and\n ~ * limitations under the License.\n ~ */\n -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n [portalToBody]=\"true\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n [portalToBody]=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i2$3.Pagination, selector: "cds-pagination, ibm-pagination", inputs: ["skeleton", "model", "disabled", "pageInputDisabled", "showPageInput", "pagesUnknown", "pageSelectThreshold", "translations", "itemsPerPageOptions"], outputs: ["selectPage"] }, { kind: "component", type: i2$3.TableToolbar, selector: "cds-table-toolbar, ibm-table-toolbar", inputs: ["model", "batchText", "ariaLabel", "cancelText", "size"], outputs: ["cancel"] }, { kind: "component", type: i2$3.TableContainer, selector: "cds-table-container, ibm-table-container" }, { kind: "component", type: i2$3.TableHeader, selector: "cds-table-header, ibm-table-header" }, { kind: "component", type: i2$3.TableToolbarActions, selector: "cds-table-toolbar-actions, ibm-table-toolbar-actions" }, { kind: "component", type: i2$3.TableToolbarSearch, selector: "cds-table-toolbar-search, ibm-table-toolbar-search" }, { kind: "component", type: i2$3.TableToolbarContent, selector: "cds-table-toolbar-content, ibm-table-toolbar-content" }, { kind: "component", type: i2$3.Table, selector: "cds-table, ibm-table", inputs: ["ariaLabelledby", "ariaDescribedby", "model", "size", "skeleton", "isDataGrid", "sortable", "noBorder", "showExpandAllToggle", "showSelectionColumn", "enableSingleSelect", "scrollLoadDistance", "expandButtonAriaLabel", "sortDescendingLabel", "sortAscendingLabel", "translations", "striped", "stickyHeader", "footerTemplate", "selectionLabelColumn"], outputs: ["sort", "selectAll", "deselectAll", "selectRow", "deselectRow", "rowClick", "scrollLoad"] }, { kind: "component", type: i2$3.TableBody, selector: "[cdsTableBody], [ibmTableBody]", inputs: ["model", "enableSingleSelect", "expandButtonAriaLabel", "checkboxRowLabel", "showSelectionColumn", "size", "selectionLabelColumn", "skeleton"], outputs: ["selectRow", "deselectRow", "rowClick"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i11.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2$3.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }, { kind: "component", type: OverflowMenuOptionComponent, selector: "v-overflow-menu-option", inputs: ["disabled", "type", "testId", "optionId"], outputs: ["selected"] }, { kind: "component", type: OverflowMenuTriggerComponent, selector: "v-overflow-menu-trigger", inputs: ["compact", "label"] }, { kind: "component", type: CarbonTagsModalComponent, selector: "valtimo-tags-modal", inputs: ["open", "tags"], outputs: ["closeEvent"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionItemDisabledPipe, name: "actionItemDisabled" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7482
8318
|
}
|
|
7483
8319
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonListComponent, decorators: [{
|
|
7484
8320
|
type: Component,
|
|
7485
|
-
args: [{ selector: 'valtimo-carbon-list', changeDetection: ChangeDetectionStrategy.OnPush, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], standalone: false, template: "<!--\n ~ /*\n ~ * Copyright 2015-2026 Ritense BV, the Netherlands.\n ~ *\n ~ * Licensed under EUPL, Version 1.2 (the \"License\");\n ~ * you may not use this file except in compliance with the License.\n ~ * You may obtain a copy of the License at\n ~ *\n ~ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~ *\n ~ * Unless required by applicable law or agreed to in writing, software\n ~ * distributed under the License is distributed on an \"AS IS\" basis,\n ~ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ * See the License for the specific language governing permissions and\n ~ * limitations under the License.\n ~ */\n -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n [portalToBody]=\"true\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
8321
|
+
args: [{ selector: 'valtimo-carbon-list', changeDetection: ChangeDetectionStrategy.OnPush, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], standalone: false, template: "<!--\n ~ /*\n ~ * Copyright 2015-2026 Ritense BV, the Netherlands.\n ~ *\n ~ * Licensed under EUPL, Version 1.2 (the \"License\");\n ~ * you may not use this file except in compliance with the License.\n ~ * You may obtain a copy of the License at\n ~ *\n ~ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~ *\n ~ * Unless required by applicable law or agreed to in writing, software\n ~ * distributed under the License is distributed on an \"AS IS\" basis,\n ~ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ * See the License for the specific language governing permissions and\n ~ * limitations under the License.\n ~ */\n -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n [portalToBody]=\"true\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n [portalToBody]=\"true\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
7486
8322
|
}], ctorParameters: () => [{ type: EllipsisPipe }, { type: CarbonListFilterPipe }, { type: i2$3.IconService }, { type: i4.NGXLogger }, { type: i1.TranslateService }, { type: ViewContentService }, { type: KeyStateService }, { type: CarbonListDragAndDropService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { actionsMenuTemplate: [{
|
|
7487
8323
|
type: ViewChild,
|
|
7488
8324
|
args: ['actionsMenuTemplate']
|
|
@@ -9661,7 +10497,7 @@ class FormioComponent {
|
|
|
9661
10497
|
const formioTranslations = this.translateService.instant('formioTranslations');
|
|
9662
10498
|
const defaultOptions = {
|
|
9663
10499
|
...options,
|
|
9664
|
-
...(formioTranslations === 'object' && {
|
|
10500
|
+
...(typeof formioTranslations === 'object' && {
|
|
9665
10501
|
i18n: {
|
|
9666
10502
|
[language]: this.stateService.flattenTranslationsObject(formioTranslations),
|
|
9667
10503
|
},
|
|
@@ -9669,6 +10505,8 @@ class FormioComponent {
|
|
|
9669
10505
|
};
|
|
9670
10506
|
return deepmerge(defaultOptions, overrideOptions);
|
|
9671
10507
|
}), distinctUntilChanged((prev, curr) => isEqual(prev, curr)), tap$1(options => this.logger.debug('Form.IO options used', options)));
|
|
10508
|
+
// Only renderOptions reaches form.io itself; getRendererOptions() drops everything else.
|
|
10509
|
+
this.renderOptions$ = this.currentLanguage$.pipe(map$1(language => ({ language })));
|
|
9672
10510
|
this._storeTokenInLocalStorage = !this.configService.getFeatureToggle('disableFormioTokenInLocalStorage');
|
|
9673
10511
|
this._inMemoryTokenSet$ = new BehaviorSubject(false);
|
|
9674
10512
|
// The form is only rendered once a token is available. In the default (legacy) mode the token
|
|
@@ -9807,11 +10645,11 @@ class FormioComponent {
|
|
|
9807
10645
|
this._overrideOptions$.next(config.formioOptions);
|
|
9808
10646
|
}
|
|
9809
10647
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormioComponent, deps: [{ token: i6$1.UserProviderService }, { token: i4.NGXLogger }, { token: FormIoStateService }, { token: i1$3.ActivatedRoute }, { token: i1.TranslateService }, { token: FormIoLocalStorageService }, { token: ValtimoModalService }, { token: i1$2.ConfigService }, { token: FormIoTagsService }, { token: i0.Injector }, { token: FormioTranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9810
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormioComponent, isStandalone: false, selector: "valtimo-form-io", inputs: { options: "options", submission: "submission", form: "form", readOnly: "readOnly", errors: "errors", formRefresh$: "formRefresh$" }, outputs: { submit: "submit", change: "change", event: "event" }, host: { listeners: { "window:beforeunload": "handleBeforeUnload($event)" } }, providers: [FormIoLocalStorageService], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.FormioComponent, selector: "formio" }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }] }); }
|
|
10648
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormioComponent, isStandalone: false, selector: "valtimo-form-io", inputs: { options: "options", submission: "submission", form: "form", readOnly: "readOnly", errors: "errors", formRefresh$: "formRefresh$" }, outputs: { submit: "submit", change: "change", event: "event" }, host: { listeners: { "window:beforeunload": "handleBeforeUnload($event)" } }, providers: [FormIoLocalStorageService], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n renderOptions: renderOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [renderOptions]=\"obs.renderOptions\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.FormioComponent, selector: "formio" }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }] }); }
|
|
9811
10649
|
}
|
|
9812
10650
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormioComponent, decorators: [{
|
|
9813
10651
|
type: Component,
|
|
9814
|
-
args: [{ selector: 'valtimo-form-io', providers: [FormIoLocalStorageService], standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n" }]
|
|
10652
|
+
args: [{ selector: 'valtimo-form-io', providers: [FormIoLocalStorageService], standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n renderOptions: renderOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [renderOptions]=\"obs.renderOptions\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n" }]
|
|
9815
10653
|
}], ctorParameters: () => [{ type: i6$1.UserProviderService }, { type: i4.NGXLogger }, { type: FormIoStateService }, { type: i1$3.ActivatedRoute }, { type: i1.TranslateService }, { type: FormIoLocalStorageService }, { type: ValtimoModalService }, { type: i1$2.ConfigService }, { type: FormIoTagsService }, { type: i0.Injector }, { type: FormioTranslationService }], propDecorators: { options: [{
|
|
9816
10654
|
type: Input
|
|
9817
10655
|
}], submission: [{
|
|
@@ -9952,7 +10790,8 @@ class FormioBuilderComponent {
|
|
|
9952
10790
|
const formioTranslations = this.translateService.instant('formioTranslations');
|
|
9953
10791
|
const defaultOptions = {
|
|
9954
10792
|
...options,
|
|
9955
|
-
|
|
10793
|
+
language,
|
|
10794
|
+
...(typeof formioTranslations === 'object' && {
|
|
9956
10795
|
i18n: {
|
|
9957
10796
|
[language]: this.stateService.flattenTranslationsObject(formioTranslations),
|
|
9958
10797
|
},
|
|
@@ -11202,13 +12041,20 @@ class ValuePathSelectorComponent {
|
|
|
11202
12041
|
this.onPathSelected(mappedOption);
|
|
11203
12042
|
return mappedOption;
|
|
11204
12043
|
});
|
|
11205
|
-
}), tap(() =>
|
|
12044
|
+
}), tap(() => {
|
|
12045
|
+
this.loadingValuePathItems$.next(false);
|
|
12046
|
+
this.scheduleDisplayFlush();
|
|
12047
|
+
}));
|
|
11206
12048
|
this._subscriptions = new Subscription();
|
|
12049
|
+
this._destroyed = false;
|
|
11207
12050
|
}
|
|
11208
12051
|
ngOnInit() {
|
|
11209
12052
|
this._subscriptions.add(this._selectedPath$.subscribe(path => this.valueChangeEvent.emit(path)));
|
|
11210
12053
|
}
|
|
11211
12054
|
ngOnDestroy() {
|
|
12055
|
+
this._destroyed = true;
|
|
12056
|
+
if (this._displayFlushTimeoutId !== undefined)
|
|
12057
|
+
clearTimeout(this._displayFlushTimeoutId);
|
|
11212
12058
|
this._subscriptions.unsubscribe();
|
|
11213
12059
|
}
|
|
11214
12060
|
writeValue(value) {
|
|
@@ -11217,6 +12063,28 @@ class ValuePathSelectorComponent {
|
|
|
11217
12063
|
this._inputMode$.next(ValuePathSelectorInputMode.DROPDOWN);
|
|
11218
12064
|
this.clearComboBoxSearch();
|
|
11219
12065
|
}
|
|
12066
|
+
this.scheduleDisplayFlush();
|
|
12067
|
+
}
|
|
12068
|
+
/**
|
|
12069
|
+
* The Carbon combobox computes its displayed value asynchronously after receiving items with a
|
|
12070
|
+
* `selected` entry. Under an OnPush ancestor that is not marked dirty, neither the items binding
|
|
12071
|
+
* nor Carbon's internal display update is ever flushed to the DOM, so the control's state is
|
|
12072
|
+
* correct while its input renders empty until the user interacts. Flush in two passes after
|
|
12073
|
+
* every options emission or written value: the first detectChanges renders the emission into the
|
|
12074
|
+
* combobox (which then schedules its internal update), the nested one flushes that update.
|
|
12075
|
+
*/
|
|
12076
|
+
scheduleDisplayFlush() {
|
|
12077
|
+
if (this._displayFlushTimeoutId !== undefined)
|
|
12078
|
+
clearTimeout(this._displayFlushTimeoutId);
|
|
12079
|
+
this._displayFlushTimeoutId = setTimeout(() => {
|
|
12080
|
+
if (this._destroyed)
|
|
12081
|
+
return;
|
|
12082
|
+
this.changeDetectorRef.detectChanges();
|
|
12083
|
+
this._displayFlushTimeoutId = setTimeout(() => {
|
|
12084
|
+
if (!this._destroyed)
|
|
12085
|
+
this.changeDetectorRef.detectChanges();
|
|
12086
|
+
});
|
|
12087
|
+
});
|
|
11220
12088
|
}
|
|
11221
12089
|
registerOnChange(fn) {
|
|
11222
12090
|
this._onChangeFunction = fn;
|
|
@@ -11308,7 +12176,7 @@ class ValuePathSelectorComponent {
|
|
|
11308
12176
|
}
|
|
11309
12177
|
return null;
|
|
11310
12178
|
}
|
|
11311
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ValuePathSelectorComponent, deps: [{ token: ValuePathSelectorService }, { token: i2.FormBuilder }, { token: i3$
|
|
12179
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ValuePathSelectorComponent, deps: [{ token: ValuePathSelectorService }, { token: i2.FormBuilder }, { token: i3$2.DocumentService }, { token: i1$3.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
11312
12180
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: ValuePathSelectorComponent, isStandalone: true, selector: "valtimo-value-path-selector", inputs: { name: "name", appendInline: "appendInline", margin: "margin", marginLg: "marginLg", marginXl: "marginXl", disabled: "disabled", caseDefinitionKey: "caseDefinitionKey", caseDefinitionVersionTag: "caseDefinitionVersionTag", buildingBlockDefinitionKey: "buildingBlockDefinitionKey", buildingBlockDefinitionVersionTag: "buildingBlockDefinitionVersionTag", prefixes: "prefixes", excludePrefixes: "excludePrefixes", label: "label", tooltip: "tooltip", required: "required", showCaseDefinitionSelector: "showCaseDefinitionSelector", notation: "notation", dropUp: "dropUp", defaultValue: "defaultValue", type: "type", parentItem: "parentItem", filterItems: "filterItems" }, outputs: { valueChangeEvent: "valueChangeEvent", collectionSelected: "collectionSelected" }, host: { listeners: { "focusout": "onBlur()" }, properties: { "class.value-path-selector--margin-bottom": "this._showMargin", "class.value-path-selector--margin-bottom-lg": "this._showMarginLg", "class.value-path-selector--margin-bottom-xl": "this._showMarginXl" } }, providers: [
|
|
11313
12181
|
{
|
|
11314
12182
|
provide: NG_VALUE_ACCESSOR,
|
|
@@ -11337,7 +12205,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
11337
12205
|
useExisting: forwardRef(() => ValuePathSelectorComponent),
|
|
11338
12206
|
},
|
|
11339
12207
|
], template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n inputModeIsDropdown: inputModeIsDropdown$ | async,\n valuePathListItems: valuePathListItems$ | async,\n loadingValuePathItems: loadingValuePathItems$ | async,\n disabled: disabled$ | async,\n showToggle: showToggle$ | async,\n } as obs\"\n>\n <v-input-label *ngIf=\"!!label\" [required]=\"required\" [title]=\"label\" [tooltip]=\"tooltip\">\n </v-input-label>\n\n <form\n [formGroup]=\"formGroup\"\n [ngClass]=\"{\n 'value-path-selector__form--case-def-input':\n showCaseDefinitionSelector && obs.inputModeIsDropdown && !obs.showToggle,\n }\"\n class=\"value-path-selector__form\"\n >\n <cds-toggle\n *ngIf=\"obs.showToggle\"\n [attr.data-test-id]=\"testIds.toggle\"\n size=\"sm\"\n [disabled]=\"obs.disabled\"\n [onText]=\"'valuePathSelector.dropdown' | translate\"\n [offText]=\"'valuePathSelector.manual' | translate\"\n [checked]=\"obs.inputModeIsDropdown\"\n (checkedChange)=\"onInputModeChange($event)\"\n ></cds-toggle>\n\n @if (obs.inputModeIsDropdown && obs.showToggle) {\n <cds-combo-box\n [attr.data-test-id]=\"testIds.path\"\n [appendInline]=\"appendInline\"\n [disabled]=\"\n obs.disabled ||\n obs.loadingValuePathItems ||\n !obs.valuePathListItems ||\n (obs.valuePathListItems || []).length === 0\n \"\n [dropUp]=\"dropUp\"\n (selected)=\"onPathSelected($event)\"\n (clear)=\"onPathCleared()\"\n [placeholder]=\"'valuePathSelector.placeholder' | translate\"\n >\n <cds-dropdown-list [items]=\"obs.valuePathListItems || []\"></cds-dropdown-list>\n </cds-combo-box>\n } @else {\n <input\n [attr.data-test-id]=\"testIds.input\"\n cdsText\n type=\"text\"\n formControlName=\"selectedPath\"\n />\n }\n </form>\n</ng-container>\n", styles: [":host{width:100%;display:flex;flex-direction:column}::ng-deep .value-path-selector--margin-bottom{margin-bottom:16px}::ng-deep .value-path-selector--margin-bottom-lg{margin-bottom:24px}::ng-deep .value-path-selector--margin-bottom-xl{margin-bottom:34px}.value-path-selector__form{display:flex;width:100%;align-items:center;gap:16px}::ng-deep .value-path-selector__form--case-def-input{display:flex!important}.value-path-selector__form ::ng-deep cds-dropdown,.value-path-selector__form ::ng-deep cds-combo-box{width:100%;min-width:0}.value-path-selector__form ::ng-deep .cds--toggle__label-text{display:none}.value-path-selector__form ::ng-deep .cds--toggle__label{display:flex}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
11340
|
-
}], ctorParameters: () => [{ type: ValuePathSelectorService }, { type: i2.FormBuilder }, { type: i3$
|
|
12208
|
+
}], ctorParameters: () => [{ type: ValuePathSelectorService }, { type: i2.FormBuilder }, { type: i3$2.DocumentService }, { type: i1$3.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { _showMargin: [{
|
|
11341
12209
|
type: HostBinding,
|
|
11342
12210
|
args: ['class.value-path-selector--margin-bottom']
|
|
11343
12211
|
}], _showMarginLg: [{
|
|
@@ -13493,6 +14361,7 @@ class SelectComponent {
|
|
|
13493
14361
|
content: translated,
|
|
13494
14362
|
};
|
|
13495
14363
|
})));
|
|
14364
|
+
this._destroyed = false;
|
|
13496
14365
|
this._onChange = () => { };
|
|
13497
14366
|
this._onTouched = () => { };
|
|
13498
14367
|
}
|
|
@@ -13500,17 +14369,10 @@ class SelectComponent {
|
|
|
13500
14369
|
this.setDefaultSelection();
|
|
13501
14370
|
this.openSelectedSubscription();
|
|
13502
14371
|
this.openClearSubjectSubscription();
|
|
14372
|
+
this.openDisplayFlushSubscription();
|
|
13503
14373
|
}
|
|
13504
14374
|
ngAfterViewInit() {
|
|
13505
|
-
|
|
13506
|
-
// scheduled during its own view initialization. When this component lives under an OnPush
|
|
13507
|
-
// ancestor that is not marked dirty, that update is never flushed to the DOM, so a preselected
|
|
13508
|
-
// value only becomes visible after the user interacts with the control. Because this setTimeout
|
|
13509
|
-
// is scheduled after the combobox's (lifecycle hooks of child views run first), it runs once
|
|
13510
|
-
// the combobox has set its display value, and detectChanges() flushes it to the DOM. A
|
|
13511
|
-
// setTimeout is used instead of NgZone.onStable so the flush also works in apps with
|
|
13512
|
-
// long-running background tasks that keep the zone from ever stabilizing.
|
|
13513
|
-
this._displayFlushTimeoutId = setTimeout(() => this.changeDetectorRef.detectChanges());
|
|
14375
|
+
this.scheduleDisplayFlush();
|
|
13514
14376
|
}
|
|
13515
14377
|
ngOnChanges(changes) {
|
|
13516
14378
|
if (changes?.items?.currentValue ||
|
|
@@ -13521,8 +14383,10 @@ class SelectComponent {
|
|
|
13521
14383
|
}
|
|
13522
14384
|
}
|
|
13523
14385
|
ngOnDestroy() {
|
|
14386
|
+
this._destroyed = true;
|
|
13524
14387
|
this._selectedSubscription?.unsubscribe();
|
|
13525
14388
|
this._clearSubjectSubscription?.unsubscribe();
|
|
14389
|
+
this._displayFlushSubscription?.unsubscribe();
|
|
13526
14390
|
if (this._displayFlushTimeoutId !== undefined)
|
|
13527
14391
|
clearTimeout(this._displayFlushTimeoutId);
|
|
13528
14392
|
}
|
|
@@ -13589,6 +14453,35 @@ class SelectComponent {
|
|
|
13589
14453
|
});
|
|
13590
14454
|
}
|
|
13591
14455
|
}
|
|
14456
|
+
/**
|
|
14457
|
+
* The underlying Carbon combobox computes its displayed value asynchronously, in a setTimeout it
|
|
14458
|
+
* schedules while processing an items change. When this component lives under an OnPush ancestor
|
|
14459
|
+
* that is not marked dirty, that update is never flushed to the DOM, so a (pre)selected value
|
|
14460
|
+
* only becomes visible after the user interacts with the control. This applies to every items or
|
|
14461
|
+
* selection change — not only the first render: a value written or items arriving after view
|
|
14462
|
+
* init (prefill, late-loaded options, wizard step switches) hit the same race. Hence a flush is
|
|
14463
|
+
* scheduled on every emission, in two passes: the first detectChanges renders the emission into
|
|
14464
|
+
* the combobox (which then schedules its own internal display update), the nested one flushes
|
|
14465
|
+
* that internal update — covering both orderings of the competing timeouts. setTimeout is used
|
|
14466
|
+
* instead of NgZone.onStable so the flush also works in apps with long-running background tasks
|
|
14467
|
+
* that keep the zone from ever stabilizing.
|
|
14468
|
+
*/
|
|
14469
|
+
openDisplayFlushSubscription() {
|
|
14470
|
+
this._displayFlushSubscription = combineLatest([this._listItems$, this.selected$]).subscribe(() => this.scheduleDisplayFlush());
|
|
14471
|
+
}
|
|
14472
|
+
scheduleDisplayFlush() {
|
|
14473
|
+
if (this._displayFlushTimeoutId !== undefined)
|
|
14474
|
+
clearTimeout(this._displayFlushTimeoutId);
|
|
14475
|
+
this._displayFlushTimeoutId = setTimeout(() => {
|
|
14476
|
+
if (this._destroyed)
|
|
14477
|
+
return;
|
|
14478
|
+
this.changeDetectorRef.detectChanges();
|
|
14479
|
+
this._displayFlushTimeoutId = setTimeout(() => {
|
|
14480
|
+
if (!this._destroyed)
|
|
14481
|
+
this.changeDetectorRef.detectChanges();
|
|
14482
|
+
});
|
|
14483
|
+
});
|
|
14484
|
+
}
|
|
13592
14485
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SelectComponent, deps: [{ token: i1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
13593
14486
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: SelectComponent, isStandalone: false, selector: "v-select", inputs: { items: "items", defaultSelection: "defaultSelection", defaultSelectionId: "defaultSelectionId", defaultSelectionIds: "defaultSelectionIds", disabled: "disabled", dropUp: "dropUp", invalid: "invalid", multiple: "multiple", margin: "margin", widthInPx: "widthInPx", notFoundText: "notFoundText", clearAllText: "clearAllText", clearText: "clearText", clearable: "clearable", name: "name", title: "title", titleTranslationKey: "titleTranslationKey", clearSelectionSubject$: "clearSelectionSubject$", tooltip: "tooltip", required: "required", loading: "loading", loadingText: "loadingText", placeholder: "placeholder", smallMargin: "smallMargin", carbonTheme: "carbonTheme", appendInline: "appendInline", warn: "warn", warnText: "warnText", dataTestId: "dataTestId" }, outputs: { selectedChange: "selectedChange" }, providers: [
|
|
13594
14487
|
{
|
|
@@ -15174,6 +16067,12 @@ class CarbonMultiInputComponent {
|
|
|
15174
16067
|
this.addButtonType = 'primary';
|
|
15175
16068
|
this.addRowTranslationKey = '';
|
|
15176
16069
|
this._defaultValues$ = new BehaviorSubject([]);
|
|
16070
|
+
/**
|
|
16071
|
+
* Carbon paints a danger button red in its resting state. A form with one delete button per row
|
|
16072
|
+
* can therefore read as a form full of errors, which 'danger--ghost' avoids without giving up the
|
|
16073
|
+
* destructive styling on hover.
|
|
16074
|
+
*/
|
|
16075
|
+
this.deleteButtonType = 'danger';
|
|
15177
16076
|
this.deleteRowText = '';
|
|
15178
16077
|
this.deleteRowTranslationKey = '';
|
|
15179
16078
|
this.$disabled = signal(false);
|
|
@@ -15385,13 +16284,13 @@ class CarbonMultiInputComponent {
|
|
|
15385
16284
|
}));
|
|
15386
16285
|
}
|
|
15387
16286
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonMultiInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15388
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonMultiInputComponent, isStandalone: false, selector: "valtimo-carbon-multi-input", inputs: { addRowText: "addRowText", addButtonType: "addButtonType", addRowTranslationKey: "addRowTranslationKey", arbitraryAmountTitles: "arbitraryAmountTitles", arbitraryValueAmount: "arbitraryValueAmount", defaultValues: "defaultValues", deleteRowText: "deleteRowText", deleteRowTranslationKey: "deleteRowTranslationKey", disabled: "disabled", dropdownColumnTitle: "dropdownColumnTitle", dropdownItems: "dropdownItems", dropdownWidth: "dropdownWidth", fullWidth: "fullWidth", hideAddButton: "hideAddButton", hideDeleteButton: "hideDeleteButton", initialAmountOfRows: "initialAmountOfRows", keyColumnTitle: "keyColumnTitle", margin: "margin", maxRows: "maxRows", minimumAmountOfRows: "minimumAmountOfRows", name: "name", required: "required", title: "title", titleTranslationKey: "titleTranslationKey", tooltip: "tooltip", type: "type", valueColumnTitle: "valueColumnTitle", valuePathSelectorCaseDefinitionKey: "valuePathSelectorCaseDefinitionKey", valuePathSelectorPrefixes: "valuePathSelectorPrefixes", valuePathSelectorShowCaseDefinitionSelector: "valuePathSelectorShowCaseDefinitionSelector", valuePathSelectorNotation: "valuePathSelectorNotation", keyColumnFlex: "keyColumnFlex", dropdownColumnFlex: "dropdownColumnFlex", valueColumnFlex: "valueColumnFlex" }, outputs: { valueChange: "valueChange", allValuesValidEvent: "allValuesValidEvent" }, providers: [
|
|
16287
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonMultiInputComponent, isStandalone: false, selector: "valtimo-carbon-multi-input", inputs: { addRowText: "addRowText", addButtonType: "addButtonType", addRowTranslationKey: "addRowTranslationKey", arbitraryAmountTitles: "arbitraryAmountTitles", arbitraryValueAmount: "arbitraryValueAmount", defaultValues: "defaultValues", deleteButtonType: "deleteButtonType", deleteRowText: "deleteRowText", deleteRowTranslationKey: "deleteRowTranslationKey", disabled: "disabled", dropdownColumnTitle: "dropdownColumnTitle", dropdownItems: "dropdownItems", dropdownWidth: "dropdownWidth", fullWidth: "fullWidth", hideAddButton: "hideAddButton", hideDeleteButton: "hideDeleteButton", initialAmountOfRows: "initialAmountOfRows", keyColumnTitle: "keyColumnTitle", margin: "margin", maxRows: "maxRows", minimumAmountOfRows: "minimumAmountOfRows", name: "name", required: "required", title: "title", titleTranslationKey: "titleTranslationKey", tooltip: "tooltip", type: "type", valueColumnTitle: "valueColumnTitle", valuePathSelectorCaseDefinitionKey: "valuePathSelectorCaseDefinitionKey", valuePathSelectorPrefixes: "valuePathSelectorPrefixes", valuePathSelectorShowCaseDefinitionSelector: "valuePathSelectorShowCaseDefinitionSelector", valuePathSelectorNotation: "valuePathSelectorNotation", keyColumnFlex: "keyColumnFlex", dropdownColumnFlex: "dropdownColumnFlex", valueColumnFlex: "valueColumnFlex" }, outputs: { valueChange: "valueChange", allValuesValidEvent: "allValuesValidEvent" }, providers: [
|
|
15389
16288
|
{
|
|
15390
16289
|
provide: NG_VALUE_ACCESSOR,
|
|
15391
16290
|
useExisting: forwardRef(() => CarbonMultiInputComponent),
|
|
15392
16291
|
multi: true,
|
|
15393
16292
|
},
|
|
15394
|
-
], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n addRowText:\n addRowText || addRowTranslationKey\n ? addRowTranslationKey\n ? (addRowTranslationKey | translate)\n : addRowText\n : ('interface.addRow' | translate),\n deleteRowText:\n deleteRowText || deleteRowTranslationKey\n ? deleteRowTranslationKey\n ? (deleteRowTranslationKey | translate)\n : deleteRowText\n : ('interface.deleteRow' | translate),\n } as vars\"\n [ngClass]=\"{'v-multi-input--margin': margin, 'v-multi-input--no-delete-button': hideDeleteButton}\"\n class=\"v-multi-input\"\n>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [name]=\"name\"\n [required]=\"required\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [title]=\"title\"\n [tooltip]=\"tooltip\"\n >\n </v-input-label>\n\n <div class=\"v-multi-input__rows\">\n <div\n *ngFor=\"let value of values$ | async as values; trackBy: trackByFn; index as i\"\n class=\"v-multi-input__row\"\n >\n @switch (type) {\n @case ('value') {\n <valtimo-single-value\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, 'value')\"\n ></valtimo-single-value>\n }\n @case ('keyValue') {\n <valtimo-key-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value>\n }\n @case ('keyDropdownValue') {\n <valtimo-key-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-dropdown-value>\n }\n @case ('arbitraryAmount') {\n <valtimo-arbitrary-amount-value\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [arbitraryAmountTitles]=\"arbitraryAmountTitles\"\n [amountOfArbitraryValuesArray$]=\"amountOfArbitraryValuesArray$\"\n (valueChange)=\"\n onValueChange($event.value, $event.inputValue, $event.type, $event.arbitraryIndex)\n \"\n ></valtimo-arbitrary-amount-value>\n }\n @case ('keyValuePathSelector') {\n <valtimo-key-value-path-selector\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value-path-selector>\n }\n @case ('valuePathSelectorValue') {\n <valtimo-value-path-selector-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorValue-' + i\"\n ></valtimo-value-path-selector-value>\n }\n @case ('valuePathSelectorDropdownValue') {\n <valtimo-value-path-selector-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorDropdownValue-' + i\"\n ></valtimo-value-path-selector-dropdown-value>\n }\n }\n\n <button\n *ngIf=\"!hideDeleteButton\"\n cdsButton=\"danger\"\n [disabled]=\"values?.length <= this.minimumAmountOfRows || $disabled()\"\n [iconOnly]=\"true\"\n size=\"md\"\n (click)=\"deleteRow(value.uuid)\"\n [title]=\"vars.deleteRowText\"\n [attr.data-test-id]=\"testIds.deleteButtonAt(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n\n <div class=\"v-multi-input__add-button\">\n <button\n *ngIf=\"!hideAddButton\"\n [cdsButton]=\"addButtonType\"\n size=\"md\"\n [disabled]=\"(addRowEnabled$ | async) === false || $disabled()\"\n (click)=\"addRow()\"\n [attr.data-test-id]=\"name ? testIds.addButtonNamed(name) : testIds.addButton\"\n >\n {{ vars.addRowText }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".v-multi-input--margin{margin-block-end:var(--v-input-margin)}.v-multi-input__row{display:flex;flex-direction:row;align-items:flex-end;margin-block-end:var(--v-multi-input-row-spacing-block)}.v-multi-input__input{margin-inline-end:var(--v-multi-input-input-spacing-inline)}.v-multi-input__input.--full-width{flex:1}.v-multi-input__separator{height:40px;width:12px;display:flex;justify-content:flex-start}.v-multi-input__separator:before{content:\"\";height:100%;width:1px;background-color:var(--cds-border-subtle-selected)}.v-multi-input--no-delete-button .v-multi-input__input:last-child{margin-inline-end:0}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: KeyValueComponent, selector: "valtimo-key-value", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: SingleValueComponent, selector: "valtimo-single-value", inputs: ["value", "fullWidth", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: KeyDropdownValueComponent, selector: "valtimo-key-dropdown-value", inputs: ["keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "index", "value", "dropdownItems$", "dropdownWidth", "fullWidth", "disabled", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ArbitraryAmountValueComponent, selector: "valtimo-arbitrary-amount-value", inputs: ["index", "value", "fullWidth", "disabled", "arbitraryAmountTitles", "amountOfArbitraryValuesArray$"], outputs: ["valueChange"] }, { kind: "component", type: KeyValuePathSelectorComponent, selector: "valtimo-key-value-path-selector", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ValuePathSelectorValueComponent, selector: "valtimo-value-path-selector-value", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ValuePathSelectorDropdownValueComponent, selector: "valtimo-value-path-selector-dropdown-value", inputs: ["keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "index", "value", "dropdownItems$", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "dropdownWidth", "fullWidth", "disabled", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
16293
|
+
], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n addRowText:\n addRowText || addRowTranslationKey\n ? addRowTranslationKey\n ? (addRowTranslationKey | translate)\n : addRowText\n : ('interface.addRow' | translate),\n deleteRowText:\n deleteRowText || deleteRowTranslationKey\n ? deleteRowTranslationKey\n ? (deleteRowTranslationKey | translate)\n : deleteRowText\n : ('interface.deleteRow' | translate),\n } as vars\"\n [ngClass]=\"{'v-multi-input--margin': margin, 'v-multi-input--no-delete-button': hideDeleteButton}\"\n class=\"v-multi-input\"\n>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [name]=\"name\"\n [required]=\"required\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [title]=\"title\"\n [tooltip]=\"tooltip\"\n >\n </v-input-label>\n\n <div class=\"v-multi-input__rows\">\n <div\n *ngFor=\"let value of values$ | async as values; trackBy: trackByFn; index as i\"\n class=\"v-multi-input__row\"\n >\n @switch (type) {\n @case ('value') {\n <valtimo-single-value\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, 'value')\"\n ></valtimo-single-value>\n }\n @case ('keyValue') {\n <valtimo-key-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value>\n }\n @case ('keyDropdownValue') {\n <valtimo-key-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-dropdown-value>\n }\n @case ('arbitraryAmount') {\n <valtimo-arbitrary-amount-value\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [arbitraryAmountTitles]=\"arbitraryAmountTitles\"\n [amountOfArbitraryValuesArray$]=\"amountOfArbitraryValuesArray$\"\n (valueChange)=\"\n onValueChange($event.value, $event.inputValue, $event.type, $event.arbitraryIndex)\n \"\n ></valtimo-arbitrary-amount-value>\n }\n @case ('keyValuePathSelector') {\n <valtimo-key-value-path-selector\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value-path-selector>\n }\n @case ('valuePathSelectorValue') {\n <valtimo-value-path-selector-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorValue-' + i\"\n ></valtimo-value-path-selector-value>\n }\n @case ('valuePathSelectorDropdownValue') {\n <valtimo-value-path-selector-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorDropdownValue-' + i\"\n ></valtimo-value-path-selector-dropdown-value>\n }\n }\n\n <button\n *ngIf=\"!hideDeleteButton\"\n [cdsButton]=\"deleteButtonType\"\n [disabled]=\"values?.length <= this.minimumAmountOfRows || $disabled()\"\n [iconOnly]=\"true\"\n size=\"md\"\n (click)=\"deleteRow(value.uuid)\"\n [title]=\"vars.deleteRowText\"\n [attr.data-test-id]=\"testIds.deleteButtonAt(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n\n <div class=\"v-multi-input__add-button\">\n <button\n *ngIf=\"!hideAddButton\"\n [cdsButton]=\"addButtonType\"\n size=\"md\"\n [disabled]=\"(addRowEnabled$ | async) === false || $disabled()\"\n (click)=\"addRow()\"\n [attr.data-test-id]=\"name ? testIds.addButtonNamed(name) : testIds.addButton\"\n >\n {{ vars.addRowText }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".v-multi-input--margin{margin-block-end:var(--v-input-margin)}.v-multi-input__row{display:flex;flex-direction:row;align-items:flex-end;margin-block-end:var(--v-multi-input-row-spacing-block)}.v-multi-input__input{margin-inline-end:var(--v-multi-input-input-spacing-inline)}.v-multi-input__input.--full-width{flex:1}.v-multi-input__separator{height:40px;width:12px;display:flex;justify-content:flex-start}.v-multi-input__separator:before{content:\"\";height:100%;width:1px;background-color:var(--cds-border-subtle-selected)}.v-multi-input--no-delete-button .v-multi-input__input:last-child{margin-inline-end:0}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: KeyValueComponent, selector: "valtimo-key-value", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: SingleValueComponent, selector: "valtimo-single-value", inputs: ["value", "fullWidth", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: KeyDropdownValueComponent, selector: "valtimo-key-dropdown-value", inputs: ["keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "index", "value", "dropdownItems$", "dropdownWidth", "fullWidth", "disabled", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ArbitraryAmountValueComponent, selector: "valtimo-arbitrary-amount-value", inputs: ["index", "value", "fullWidth", "disabled", "arbitraryAmountTitles", "amountOfArbitraryValuesArray$"], outputs: ["valueChange"] }, { kind: "component", type: KeyValuePathSelectorComponent, selector: "valtimo-key-value-path-selector", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ValuePathSelectorValueComponent, selector: "valtimo-value-path-selector-value", inputs: ["keyColumnTitle", "valueColumnTitle", "index", "value", "fullWidth", "disabled", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "keyColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "component", type: ValuePathSelectorDropdownValueComponent, selector: "valtimo-value-path-selector-dropdown-value", inputs: ["keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "index", "value", "dropdownItems$", "caseDefinitionKey", "prefixes", "showCaseDefinitionSelector", "notation", "dropdownWidth", "fullWidth", "disabled", "keyColumnFlex", "dropdownColumnFlex", "valueColumnFlex"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
15395
16294
|
}
|
|
15396
16295
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonMultiInputComponent, decorators: [{
|
|
15397
16296
|
type: Component,
|
|
@@ -15401,7 +16300,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
15401
16300
|
useExisting: forwardRef(() => CarbonMultiInputComponent),
|
|
15402
16301
|
multi: true,
|
|
15403
16302
|
},
|
|
15404
|
-
], template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n addRowText:\n addRowText || addRowTranslationKey\n ? addRowTranslationKey\n ? (addRowTranslationKey | translate)\n : addRowText\n : ('interface.addRow' | translate),\n deleteRowText:\n deleteRowText || deleteRowTranslationKey\n ? deleteRowTranslationKey\n ? (deleteRowTranslationKey | translate)\n : deleteRowText\n : ('interface.deleteRow' | translate),\n } as vars\"\n [ngClass]=\"{'v-multi-input--margin': margin, 'v-multi-input--no-delete-button': hideDeleteButton}\"\n class=\"v-multi-input\"\n>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [name]=\"name\"\n [required]=\"required\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [title]=\"title\"\n [tooltip]=\"tooltip\"\n >\n </v-input-label>\n\n <div class=\"v-multi-input__rows\">\n <div\n *ngFor=\"let value of values$ | async as values; trackBy: trackByFn; index as i\"\n class=\"v-multi-input__row\"\n >\n @switch (type) {\n @case ('value') {\n <valtimo-single-value\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, 'value')\"\n ></valtimo-single-value>\n }\n @case ('keyValue') {\n <valtimo-key-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value>\n }\n @case ('keyDropdownValue') {\n <valtimo-key-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-dropdown-value>\n }\n @case ('arbitraryAmount') {\n <valtimo-arbitrary-amount-value\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [arbitraryAmountTitles]=\"arbitraryAmountTitles\"\n [amountOfArbitraryValuesArray$]=\"amountOfArbitraryValuesArray$\"\n (valueChange)=\"\n onValueChange($event.value, $event.inputValue, $event.type, $event.arbitraryIndex)\n \"\n ></valtimo-arbitrary-amount-value>\n }\n @case ('keyValuePathSelector') {\n <valtimo-key-value-path-selector\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value-path-selector>\n }\n @case ('valuePathSelectorValue') {\n <valtimo-value-path-selector-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorValue-' + i\"\n ></valtimo-value-path-selector-value>\n }\n @case ('valuePathSelectorDropdownValue') {\n <valtimo-value-path-selector-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorDropdownValue-' + i\"\n ></valtimo-value-path-selector-dropdown-value>\n }\n }\n\n <button\n *ngIf=\"!hideDeleteButton\"\n cdsButton=\"
|
|
16303
|
+
], template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n addRowText:\n addRowText || addRowTranslationKey\n ? addRowTranslationKey\n ? (addRowTranslationKey | translate)\n : addRowText\n : ('interface.addRow' | translate),\n deleteRowText:\n deleteRowText || deleteRowTranslationKey\n ? deleteRowTranslationKey\n ? (deleteRowTranslationKey | translate)\n : deleteRowText\n : ('interface.deleteRow' | translate),\n } as vars\"\n [ngClass]=\"{'v-multi-input--margin': margin, 'v-multi-input--no-delete-button': hideDeleteButton}\"\n class=\"v-multi-input\"\n>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [name]=\"name\"\n [required]=\"required\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [title]=\"title\"\n [tooltip]=\"tooltip\"\n >\n </v-input-label>\n\n <div class=\"v-multi-input__rows\">\n <div\n *ngFor=\"let value of values$ | async as values; trackBy: trackByFn; index as i\"\n class=\"v-multi-input__row\"\n >\n @switch (type) {\n @case ('value') {\n <valtimo-single-value\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, 'value')\"\n ></valtimo-single-value>\n }\n @case ('keyValue') {\n <valtimo-key-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value>\n }\n @case ('keyDropdownValue') {\n <valtimo-key-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-dropdown-value>\n }\n @case ('arbitraryAmount') {\n <valtimo-arbitrary-amount-value\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [arbitraryAmountTitles]=\"arbitraryAmountTitles\"\n [amountOfArbitraryValuesArray$]=\"amountOfArbitraryValuesArray$\"\n (valueChange)=\"\n onValueChange($event.value, $event.inputValue, $event.type, $event.arbitraryIndex)\n \"\n ></valtimo-arbitrary-amount-value>\n }\n @case ('keyValuePathSelector') {\n <valtimo-key-value-path-selector\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n ></valtimo-key-value-path-selector>\n }\n @case ('valuePathSelectorValue') {\n <valtimo-value-path-selector-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorValue-' + i\"\n ></valtimo-value-path-selector-value>\n }\n @case ('valuePathSelectorDropdownValue') {\n <valtimo-value-path-selector-dropdown-value\n [keyColumnTitle]=\"keyColumnTitle\"\n [dropdownColumnTitle]=\"dropdownColumnTitle\"\n [valueColumnTitle]=\"valueColumnTitle\"\n [index]=\"i\"\n [value]=\"value\"\n [fullWidth]=\"fullWidth\"\n [disabled]=\"$disabled()\"\n [caseDefinitionKey]=\"valuePathSelectorCaseDefinitionKey\"\n [prefixes]=\"valuePathSelectorPrefixes\"\n [dropdownItems$]=\"getDropdownItemsForRow(i)\"\n [dropdownWidth]=\"dropdownWidth\"\n [showCaseDefinitionSelector]=\"valuePathSelectorShowCaseDefinitionSelector\"\n [notation]=\"valuePathSelectorNotation\"\n [keyColumnFlex]=\"keyColumnFlex\"\n [dropdownColumnFlex]=\"dropdownColumnFlex\"\n [valueColumnFlex]=\"valueColumnFlex\"\n (valueChange)=\"onValueChange($event.value, $event.inputValue, $event.type)\"\n [attr.data-test-id]=\"'multiInputValuePathSelectorDropdownValue-' + i\"\n ></valtimo-value-path-selector-dropdown-value>\n }\n }\n\n <button\n *ngIf=\"!hideDeleteButton\"\n [cdsButton]=\"deleteButtonType\"\n [disabled]=\"values?.length <= this.minimumAmountOfRows || $disabled()\"\n [iconOnly]=\"true\"\n size=\"md\"\n (click)=\"deleteRow(value.uuid)\"\n [title]=\"vars.deleteRowText\"\n [attr.data-test-id]=\"testIds.deleteButtonAt(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n\n <div class=\"v-multi-input__add-button\">\n <button\n *ngIf=\"!hideAddButton\"\n [cdsButton]=\"addButtonType\"\n size=\"md\"\n [disabled]=\"(addRowEnabled$ | async) === false || $disabled()\"\n (click)=\"addRow()\"\n [attr.data-test-id]=\"name ? testIds.addButtonNamed(name) : testIds.addButton\"\n >\n {{ vars.addRowText }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n</div>\n", styles: [".v-multi-input--margin{margin-block-end:var(--v-input-margin)}.v-multi-input__row{display:flex;flex-direction:row;align-items:flex-end;margin-block-end:var(--v-multi-input-row-spacing-block)}.v-multi-input__input{margin-inline-end:var(--v-multi-input-input-spacing-inline)}.v-multi-input__input.--full-width{flex:1}.v-multi-input__separator{height:40px;width:12px;display:flex;justify-content:flex-start}.v-multi-input__separator:before{content:\"\";height:100%;width:1px;background-color:var(--cds-border-subtle-selected)}.v-multi-input--no-delete-button .v-multi-input__input:last-child{margin-inline-end:0}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
15405
16304
|
}], propDecorators: { addRowText: [{
|
|
15406
16305
|
type: Input
|
|
15407
16306
|
}], addButtonType: [{
|
|
@@ -15414,6 +16313,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
15414
16313
|
type: Input
|
|
15415
16314
|
}], defaultValues: [{
|
|
15416
16315
|
type: Input
|
|
16316
|
+
}], deleteButtonType: [{
|
|
16317
|
+
type: Input
|
|
15417
16318
|
}], deleteRowText: [{
|
|
15418
16319
|
type: Input
|
|
15419
16320
|
}], deleteRowTranslationKey: [{
|
|
@@ -15759,51 +16660,271 @@ class RadioComponent {
|
|
|
15759
16660
|
this.valueChange.emit(value);
|
|
15760
16661
|
});
|
|
15761
16662
|
}
|
|
15762
|
-
openClearSubscription() {
|
|
15763
|
-
if (this.clear$) {
|
|
15764
|
-
this.clearSubscription = this.clear$.subscribe(() => {
|
|
15765
|
-
this.onValueChange('');
|
|
15766
|
-
});
|
|
16663
|
+
openClearSubscription() {
|
|
16664
|
+
if (this.clear$) {
|
|
16665
|
+
this.clearSubscription = this.clear$.subscribe(() => {
|
|
16666
|
+
this.onValueChange('');
|
|
16667
|
+
});
|
|
16668
|
+
}
|
|
16669
|
+
}
|
|
16670
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
16671
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: RadioComponent, isStandalone: false, selector: "v-radio", inputs: { name: "name", title: "title", titleTranslationKey: "titleTranslationKey", defaultValue: "defaultValue", widthPx: "widthPx", fullWidth: "fullWidth", margin: "margin", smallMargin: "smallMargin", disabled: "disabled", tooltip: "tooltip", required: "required", smallLabel: "smallLabel", rows: "rows", clear$: "clear$", radioValues: "radioValues" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"v-input-container\"\n [ngClass]=\"{\n 'v-input--margin': margin,\n 'v-input--small-margin': smallMargin,\n }\"\n (click)=\"stopRadioEventPropagation($event)\"\n>\n <ng-container *ngTemplateOutlet=\"inputTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"radioInput\"></ng-container>\n</div>\n\n<ng-template #inputTitle>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [title]=\"title\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [name]=\"name\"\n [tooltip]=\"tooltip\"\n [required]=\"required\"\n [small]=\"smallLabel\"\n >\n </v-input-label>\n</ng-template>\n\n<ng-template #radioInput>\n <cds-radio-group\n [name]=\"name\"\n [disabled]=\"disabled\"\n [ngModel]=\"radioValue$ | async\"\n (ngModelChange)=\"onValueChange($event)\"\n >\n <cds-radio *ngFor=\"let radio of radioValues\" [value]=\"radio.value\" [disabled]=\"radio.disabled\">\n {{ radio.titleTranslationKey ? (radio.titleTranslationKey | translate) : radio.title }}\n </cds-radio>\n </cds-radio-group>\n</ng-template>\n", styles: [".v-input-container{display:flex;flex-direction:column}.v-input__label{margin:0;font-size:var(--v-input-title-font-size);color:var(--v-input-title-font-color);line-height:var(--v-input-title-line-height);font-weight:var(--v-input-title-font-weight);margin-block-end:var(--v-input-title-margin)}.v-input{all:unset;font-size:var(--v-input-font-size);line-height:var(--v-input-line-height);color:var(--v-input-color);font-weight:var(--v-input-font-weight);padding-block-start:var(--v-input-padding-block);padding-block-end:var(--v-input-padding-block);padding-inline-start:var(--v-input-padding-inline);padding-inline-end:var(--v-input-padding-inline);background-color:var(--v-input-bg-color);border-radius:var(--v-input-border-radius);border:var(--v-input-border);transition:var(--v-input-transition);width:var(--v-input-default-width);box-sizing:border-box}.v-input:focus{outline:var(--v-input-focus-border);outline-offset:var(--v-outline-offset)}.v-input:disabled{color:var(--v-input-font-color-disabled);cursor:var(--v-input-disabled-cursor)}.v-input--full-width{width:100%}.v-input--margin{margin-block-end:var(--v-input-margin)}.v-input--small-margin{margin-block-end:var(--v-input-small-margin)}.v-input__password-container{display:flex;flex-direction:row;align-items:center}.v-input__password-icon{margin-inline-start:var(--v-input-password-icon-spacing)}.v-input--hide-spinbox::-webkit-outer-spin-button,.v-input--hide-spinbox::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.v-input--hide-spinbox{-moz-appearance:textfield}.v-input--checkbox{width:20px;height:20px;margin-block-end:var(--v-input-margin)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: i2$3.Radio, selector: "cds-radio, ibm-radio", inputs: ["checked", "name", "disabled", "labelPlacement", "ariaLabelledby", "ariaLabel", "required", "value", "skeleton", "id"], outputs: ["change"] }, { kind: "component", type: i2$3.RadioGroup, selector: "cds-radio-group, ibm-radio-group", inputs: ["selected", "value", "name", "disabled", "skeleton", "orientation", "labelPlacement", "legend", "ariaLabel", "ariaLabelledby", "helperText", "invalid", "invalidText", "warn", "warnText"], outputs: ["change"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
|
|
16672
|
+
}
|
|
16673
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RadioComponent, decorators: [{
|
|
16674
|
+
type: Component,
|
|
16675
|
+
args: [{ selector: 'v-radio', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"v-input-container\"\n [ngClass]=\"{\n 'v-input--margin': margin,\n 'v-input--small-margin': smallMargin,\n }\"\n (click)=\"stopRadioEventPropagation($event)\"\n>\n <ng-container *ngTemplateOutlet=\"inputTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"radioInput\"></ng-container>\n</div>\n\n<ng-template #inputTitle>\n <v-input-label\n *ngIf=\"title || titleTranslationKey\"\n [title]=\"title\"\n [titleTranslationKey]=\"titleTranslationKey\"\n [name]=\"name\"\n [tooltip]=\"tooltip\"\n [required]=\"required\"\n [small]=\"smallLabel\"\n >\n </v-input-label>\n</ng-template>\n\n<ng-template #radioInput>\n <cds-radio-group\n [name]=\"name\"\n [disabled]=\"disabled\"\n [ngModel]=\"radioValue$ | async\"\n (ngModelChange)=\"onValueChange($event)\"\n >\n <cds-radio *ngFor=\"let radio of radioValues\" [value]=\"radio.value\" [disabled]=\"radio.disabled\">\n {{ radio.titleTranslationKey ? (radio.titleTranslationKey | translate) : radio.title }}\n </cds-radio>\n </cds-radio-group>\n</ng-template>\n", styles: [".v-input-container{display:flex;flex-direction:column}.v-input__label{margin:0;font-size:var(--v-input-title-font-size);color:var(--v-input-title-font-color);line-height:var(--v-input-title-line-height);font-weight:var(--v-input-title-font-weight);margin-block-end:var(--v-input-title-margin)}.v-input{all:unset;font-size:var(--v-input-font-size);line-height:var(--v-input-line-height);color:var(--v-input-color);font-weight:var(--v-input-font-weight);padding-block-start:var(--v-input-padding-block);padding-block-end:var(--v-input-padding-block);padding-inline-start:var(--v-input-padding-inline);padding-inline-end:var(--v-input-padding-inline);background-color:var(--v-input-bg-color);border-radius:var(--v-input-border-radius);border:var(--v-input-border);transition:var(--v-input-transition);width:var(--v-input-default-width);box-sizing:border-box}.v-input:focus{outline:var(--v-input-focus-border);outline-offset:var(--v-outline-offset)}.v-input:disabled{color:var(--v-input-font-color-disabled);cursor:var(--v-input-disabled-cursor)}.v-input--full-width{width:100%}.v-input--margin{margin-block-end:var(--v-input-margin)}.v-input--small-margin{margin-block-end:var(--v-input-small-margin)}.v-input__password-container{display:flex;flex-direction:row;align-items:center}.v-input__password-icon{margin-inline-start:var(--v-input-password-icon-spacing)}.v-input--hide-spinbox::-webkit-outer-spin-button,.v-input--hide-spinbox::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.v-input--hide-spinbox{-moz-appearance:textfield}.v-input--checkbox{width:20px;height:20px;margin-block-end:var(--v-input-margin)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
16676
|
+
}], propDecorators: { name: [{
|
|
16677
|
+
type: Input
|
|
16678
|
+
}], title: [{
|
|
16679
|
+
type: Input
|
|
16680
|
+
}], titleTranslationKey: [{
|
|
16681
|
+
type: Input
|
|
16682
|
+
}], defaultValue: [{
|
|
16683
|
+
type: Input
|
|
16684
|
+
}], widthPx: [{
|
|
16685
|
+
type: Input
|
|
16686
|
+
}], fullWidth: [{
|
|
16687
|
+
type: Input
|
|
16688
|
+
}], margin: [{
|
|
16689
|
+
type: Input
|
|
16690
|
+
}], smallMargin: [{
|
|
16691
|
+
type: Input
|
|
16692
|
+
}], disabled: [{
|
|
16693
|
+
type: Input
|
|
16694
|
+
}], tooltip: [{
|
|
16695
|
+
type: Input
|
|
16696
|
+
}], required: [{
|
|
16697
|
+
type: Input
|
|
16698
|
+
}], smallLabel: [{
|
|
16699
|
+
type: Input
|
|
16700
|
+
}], rows: [{
|
|
16701
|
+
type: Input
|
|
16702
|
+
}], clear$: [{
|
|
16703
|
+
type: Input
|
|
16704
|
+
}], radioValues: [{
|
|
16705
|
+
type: Input
|
|
16706
|
+
}], valueChange: [{
|
|
16707
|
+
type: Output
|
|
16708
|
+
}] } });
|
|
16709
|
+
|
|
16710
|
+
/*
|
|
16711
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
16712
|
+
*
|
|
16713
|
+
* Licensed under EUPL, Version 1.2 (the "License");
|
|
16714
|
+
* you may not use this file except in compliance with the License.
|
|
16715
|
+
* You may obtain a copy of the License at
|
|
16716
|
+
*
|
|
16717
|
+
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
16718
|
+
*
|
|
16719
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
16720
|
+
* distributed under the License is distributed on an "AS IS" basis,
|
|
16721
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16722
|
+
* See the License for the specific language governing permissions and
|
|
16723
|
+
* limitations under the License.
|
|
16724
|
+
*/
|
|
16725
|
+
class AutoKeyInputComponent {
|
|
16726
|
+
set disabled(value) {
|
|
16727
|
+
this.$disabled.set(value);
|
|
16728
|
+
}
|
|
16729
|
+
// Seeds the value outside reactive forms, where writeValue is never called
|
|
16730
|
+
set defaultValue(value) {
|
|
16731
|
+
if (value)
|
|
16732
|
+
this.setValue(value);
|
|
16733
|
+
}
|
|
16734
|
+
set mode(value) {
|
|
16735
|
+
this._mode$.next(value);
|
|
16736
|
+
}
|
|
16737
|
+
get mode$() {
|
|
16738
|
+
return this._mode$.pipe(filter(mode => !!mode));
|
|
16739
|
+
}
|
|
16740
|
+
set usedKeys(value) {
|
|
16741
|
+
this._usedKeys$.next(value || []);
|
|
16742
|
+
}
|
|
16743
|
+
set sourceText(value) {
|
|
16744
|
+
this._sourceText$.next(value || '');
|
|
16745
|
+
}
|
|
16746
|
+
constructor(iconService) {
|
|
16747
|
+
this.iconService = iconService;
|
|
16748
|
+
this.labelTranslationKey = 'Key';
|
|
16749
|
+
this.placeholderTranslationKey = '';
|
|
16750
|
+
this.dataTestId = AUTO_KEY_INPUT_TEST_IDS.input;
|
|
16751
|
+
// Read by the legacy v-form, which keys its output by component name
|
|
16752
|
+
this.name = '';
|
|
16753
|
+
this.margin = false;
|
|
16754
|
+
this.testIds = AUTO_KEY_INPUT_TEST_IDS;
|
|
16755
|
+
// Value stream the legacy v-form collects; the reactive-forms path uses onChange
|
|
16756
|
+
this.inputValue$ = new BehaviorSubject('');
|
|
16757
|
+
this._mode$ = new BehaviorSubject(null);
|
|
16758
|
+
this._usedKeys$ = new BehaviorSubject([]);
|
|
16759
|
+
this._sourceText$ = new BehaviorSubject('');
|
|
16760
|
+
this.$disabled = signal(false);
|
|
16761
|
+
this.value = '';
|
|
16762
|
+
this.editingKey$ = new BehaviorSubject(true);
|
|
16763
|
+
this.duplicateInitialized = false;
|
|
16764
|
+
this.idError$ = new BehaviorSubject(null);
|
|
16765
|
+
this.onChange = (_) => { };
|
|
16766
|
+
this.onTouched = () => { };
|
|
16767
|
+
this.onValidatorChange = () => { };
|
|
16768
|
+
this.validate = (control) => this.idError$.getValue() ? { idError: { value: this.idError$.getValue() } } : null;
|
|
16769
|
+
this.subscription = new Subscription();
|
|
16770
|
+
this.iconService.registerAll([Edit16, Close16]);
|
|
16771
|
+
this.subscription.add(this.mode$.subscribe(mode => {
|
|
16772
|
+
this.editingKey$.next(mode === 'edit');
|
|
16773
|
+
if (mode === 'duplicate') {
|
|
16774
|
+
this.duplicateInitialized = false;
|
|
16775
|
+
}
|
|
16776
|
+
}));
|
|
16777
|
+
this.subscription.add(combineLatest([this.mode$, this.editingKey$, this._usedKeys$, this._sourceText$]).subscribe(([mode, editingKey, usedKeys, sourceText]) => {
|
|
16778
|
+
if (mode === 'add' || mode === 'duplicate') {
|
|
16779
|
+
this.updateKey(mode, editingKey, usedKeys, sourceText);
|
|
16780
|
+
}
|
|
16781
|
+
}));
|
|
16782
|
+
}
|
|
16783
|
+
ngOnChanges() {
|
|
16784
|
+
this.onValidatorChange();
|
|
16785
|
+
}
|
|
16786
|
+
ngOnDestroy() {
|
|
16787
|
+
this.subscription.unsubscribe();
|
|
16788
|
+
this.duplicateInitialized = false;
|
|
16789
|
+
this.idError$.next(null);
|
|
16790
|
+
}
|
|
16791
|
+
setDisabledState(disabled) {
|
|
16792
|
+
this.$disabled.set(disabled);
|
|
16793
|
+
}
|
|
16794
|
+
writeValue(value) {
|
|
16795
|
+
if (value === null || value === '') {
|
|
16796
|
+
this.resetInternalState();
|
|
16797
|
+
return;
|
|
16798
|
+
}
|
|
16799
|
+
this.setValue(value ?? '');
|
|
16800
|
+
}
|
|
16801
|
+
registerOnChange(fn) {
|
|
16802
|
+
this.onChange = fn;
|
|
16803
|
+
}
|
|
16804
|
+
registerOnTouched(fn) {
|
|
16805
|
+
this.onTouched = fn;
|
|
16806
|
+
}
|
|
16807
|
+
registerOnValidatorChange(fn) {
|
|
16808
|
+
this.onValidatorChange = fn;
|
|
16809
|
+
}
|
|
16810
|
+
onInputChange(event) {
|
|
16811
|
+
const input = event.target;
|
|
16812
|
+
const key = sanitizeKey(input.value);
|
|
16813
|
+
if (input.value !== key)
|
|
16814
|
+
this.reflectSanitizedKey(input, key);
|
|
16815
|
+
const usedKeys = this._usedKeys$.getValue();
|
|
16816
|
+
this.idError$.next(usedKeys.includes(key) ? 'caseManagement.statuses.keyDuplicated' : null);
|
|
16817
|
+
this.setValue(key);
|
|
16818
|
+
this.onChange(this.value);
|
|
16819
|
+
}
|
|
16820
|
+
enableKeyEditing() {
|
|
16821
|
+
this.editingKey$.next(true);
|
|
16822
|
+
}
|
|
16823
|
+
disableKeyEditing() {
|
|
16824
|
+
this.editingKey$.next(false);
|
|
16825
|
+
}
|
|
16826
|
+
getUniqueKey(sourceText, usedKeys) {
|
|
16827
|
+
const baseKey = toKebabCase(sourceText);
|
|
16828
|
+
if (!usedKeys.includes(baseKey) || this._mode$.getValue() === 'edit') {
|
|
16829
|
+
return baseKey;
|
|
16830
|
+
}
|
|
16831
|
+
return this.getUniqueKeyWithNumber(baseKey, usedKeys);
|
|
16832
|
+
}
|
|
16833
|
+
// Stripping a character leaves the model unchanged, so Angular skips the [value] binding
|
|
16834
|
+
reflectSanitizedKey(input, key) {
|
|
16835
|
+
const removed = input.value.length - key.length;
|
|
16836
|
+
const caret = Math.max((input.selectionStart ?? input.value.length) - removed, 0);
|
|
16837
|
+
input.value = key;
|
|
16838
|
+
input.setSelectionRange(caret, caret);
|
|
16839
|
+
}
|
|
16840
|
+
setValue(value) {
|
|
16841
|
+
this.value = value;
|
|
16842
|
+
if (this.inputValue$.getValue() !== value)
|
|
16843
|
+
this.inputValue$.next(value);
|
|
16844
|
+
}
|
|
16845
|
+
resetInternalState() {
|
|
16846
|
+
this.setValue('');
|
|
16847
|
+
this.idError$.next(null);
|
|
16848
|
+
this.disableKeyEditing();
|
|
16849
|
+
this.duplicateInitialized = false;
|
|
16850
|
+
}
|
|
16851
|
+
updateKey(mode, editingKey, usedKeys, sourceText) {
|
|
16852
|
+
if (editingKey) {
|
|
16853
|
+
return;
|
|
16854
|
+
}
|
|
16855
|
+
let newKey = sourceText ? this.getUniqueKey(sourceText, usedKeys) : '';
|
|
16856
|
+
if (mode === 'duplicate' && !this.duplicateInitialized && newKey) {
|
|
16857
|
+
newKey = `${newKey}-duplicate`;
|
|
16858
|
+
this.duplicateInitialized = true;
|
|
16859
|
+
}
|
|
16860
|
+
this.setValue(newKey);
|
|
16861
|
+
this.onChange(newKey);
|
|
16862
|
+
}
|
|
16863
|
+
getUniqueKeyWithNumber(base, usedKeys, suffix = 1) {
|
|
16864
|
+
const newKey = `${base}-${suffix}`;
|
|
16865
|
+
if (usedKeys.includes(newKey)) {
|
|
16866
|
+
return this.getUniqueKeyWithNumber(base, usedKeys, suffix + 1);
|
|
15767
16867
|
}
|
|
16868
|
+
return newKey;
|
|
15768
16869
|
}
|
|
15769
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type:
|
|
15770
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type:
|
|
16870
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AutoKeyInputComponent, deps: [{ token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
16871
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: AutoKeyInputComponent, isStandalone: true, selector: "valtimo-auto-key-input", inputs: { labelTranslationKey: "labelTranslationKey", placeholderTranslationKey: "placeholderTranslationKey", dataTestId: "dataTestId", name: "name", disabled: "disabled", defaultValue: "defaultValue", margin: "margin", mode: "mode", usedKeys: "usedKeys", sourceText: "sourceText" }, host: { properties: { "class.auto-key-input--margin": "this.margin" } }, providers: [
|
|
16872
|
+
{
|
|
16873
|
+
provide: NG_VALUE_ACCESSOR,
|
|
16874
|
+
useExisting: forwardRef(() => AutoKeyInputComponent),
|
|
16875
|
+
multi: true,
|
|
16876
|
+
},
|
|
16877
|
+
{
|
|
16878
|
+
provide: NG_VALIDATORS,
|
|
16879
|
+
useExisting: forwardRef(() => AutoKeyInputComponent),
|
|
16880
|
+
multi: true,
|
|
16881
|
+
},
|
|
16882
|
+
], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-label\n *ngIf=\"{\n mode: mode$ | async,\n idError: idError$ | async,\n editingKey: editingKey$ | async,\n } as obs\"\n [invalid]=\"!!obs.idError\"\n [invalidText]=\"obs.idError | translate\"\n>\n <span class=\"auto-key-label\">\n {{ labelTranslationKey | translate }}\n\n <ng-content></ng-content>\n </span>\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"\n obs.mode === 'add' && !obs.editingKey\n ? ('caseManagement.statuses.keyAutoGenerated' | translate)\n : (placeholderTranslationKey | translate)\n \"\n [readOnly]=\"!obs.editingKey || obs.mode === 'edit'\"\n [invalid]=\"!!obs.idError\"\n [attr.data-test-id]=\"dataTestId\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n\n <cds-icon-button\n *ngIf=\"(obs.mode === 'add' || obs.mode === 'duplicate') && !obs.editingKey\"\n [disabled]=\"$disabled()\"\n [attr.data-test-id]=\"testIds.editButton\"\n (click)=\"enableKeyEditing()\"\n kind=\"secondary\"\n size=\"md\"\n >\n <svg cdsIcon=\"edit\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n\n <cds-icon-button\n *ngIf=\"obs.mode === 'add' && obs.editingKey\"\n [disabled]=\"$disabled()\"\n (click)=\"disableKeyEditing()\"\n kind=\"secondary\"\n size=\"md\"\n >\n <svg cdsIcon=\"close\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n </div>\n</cds-label>\n", styles: [".auto-key-label{display:flex;align-items:center}:host(.auto-key-input--margin){display:block;margin-block-end:var(--v-input-margin)}.edit-key-input{display:flex;align-items:center;gap:8px;width:100%}.edit-key-input input[cdsText]{flex:1 1 auto}.edit-key-input cds-icon-button{flex-shrink:0;margin-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: InputModule$1 }, { kind: "component", type: i2$3.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2$3.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2$3.IconButton, selector: "cds-icon-button, ibm-icon-button", inputs: ["buttonNgClass", "buttonAttributes", "buttonId", "kind", "size", "type", "isExpressive", "disabled", "description", "showTooltipWhenDisabled"], outputs: ["click", "focus", "blur", "tooltipClick"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
15771
16883
|
}
|
|
15772
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type:
|
|
16884
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AutoKeyInputComponent, decorators: [{
|
|
15773
16885
|
type: Component,
|
|
15774
|
-
args: [{ selector: '
|
|
15775
|
-
|
|
15776
|
-
|
|
15777
|
-
|
|
15778
|
-
|
|
15779
|
-
|
|
15780
|
-
|
|
15781
|
-
|
|
15782
|
-
|
|
15783
|
-
|
|
16886
|
+
args: [{ selector: 'valtimo-auto-key-input', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
16887
|
+
CommonModule,
|
|
16888
|
+
ReactiveFormsModule,
|
|
16889
|
+
TranslateModule,
|
|
16890
|
+
InputModule$1,
|
|
16891
|
+
ButtonModule,
|
|
16892
|
+
IconModule,
|
|
16893
|
+
], providers: [
|
|
16894
|
+
{
|
|
16895
|
+
provide: NG_VALUE_ACCESSOR,
|
|
16896
|
+
useExisting: forwardRef(() => AutoKeyInputComponent),
|
|
16897
|
+
multi: true,
|
|
16898
|
+
},
|
|
16899
|
+
{
|
|
16900
|
+
provide: NG_VALIDATORS,
|
|
16901
|
+
useExisting: forwardRef(() => AutoKeyInputComponent),
|
|
16902
|
+
multi: true,
|
|
16903
|
+
},
|
|
16904
|
+
], template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-label\n *ngIf=\"{\n mode: mode$ | async,\n idError: idError$ | async,\n editingKey: editingKey$ | async,\n } as obs\"\n [invalid]=\"!!obs.idError\"\n [invalidText]=\"obs.idError | translate\"\n>\n <span class=\"auto-key-label\">\n {{ labelTranslationKey | translate }}\n\n <ng-content></ng-content>\n </span>\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"\n obs.mode === 'add' && !obs.editingKey\n ? ('caseManagement.statuses.keyAutoGenerated' | translate)\n : (placeholderTranslationKey | translate)\n \"\n [readOnly]=\"!obs.editingKey || obs.mode === 'edit'\"\n [invalid]=\"!!obs.idError\"\n [attr.data-test-id]=\"dataTestId\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n\n <cds-icon-button\n *ngIf=\"(obs.mode === 'add' || obs.mode === 'duplicate') && !obs.editingKey\"\n [disabled]=\"$disabled()\"\n [attr.data-test-id]=\"testIds.editButton\"\n (click)=\"enableKeyEditing()\"\n kind=\"secondary\"\n size=\"md\"\n >\n <svg cdsIcon=\"edit\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n\n <cds-icon-button\n *ngIf=\"obs.mode === 'add' && obs.editingKey\"\n [disabled]=\"$disabled()\"\n (click)=\"disableKeyEditing()\"\n kind=\"secondary\"\n size=\"md\"\n >\n <svg cdsIcon=\"close\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n </div>\n</cds-label>\n", styles: [".auto-key-label{display:flex;align-items:center}:host(.auto-key-input--margin){display:block;margin-block-end:var(--v-input-margin)}.edit-key-input{display:flex;align-items:center;gap:8px;width:100%}.edit-key-input input[cdsText]{flex:1 1 auto}.edit-key-input cds-icon-button{flex-shrink:0;margin-left:4px}\n"] }]
|
|
16905
|
+
}], ctorParameters: () => [{ type: i2$3.IconService }], propDecorators: { labelTranslationKey: [{
|
|
15784
16906
|
type: Input
|
|
15785
|
-
}],
|
|
16907
|
+
}], placeholderTranslationKey: [{
|
|
15786
16908
|
type: Input
|
|
15787
|
-
}],
|
|
16909
|
+
}], dataTestId: [{
|
|
15788
16910
|
type: Input
|
|
15789
|
-
}],
|
|
16911
|
+
}], name: [{
|
|
15790
16912
|
type: Input
|
|
15791
16913
|
}], disabled: [{
|
|
15792
16914
|
type: Input
|
|
15793
|
-
}],
|
|
15794
|
-
type: Input
|
|
15795
|
-
}], required: [{
|
|
16915
|
+
}], defaultValue: [{
|
|
15796
16916
|
type: Input
|
|
15797
|
-
}],
|
|
16917
|
+
}], margin: [{
|
|
16918
|
+
type: HostBinding,
|
|
16919
|
+
args: ['class.auto-key-input--margin']
|
|
16920
|
+
}, {
|
|
15798
16921
|
type: Input
|
|
15799
|
-
}],
|
|
16922
|
+
}], mode: [{
|
|
15800
16923
|
type: Input
|
|
15801
|
-
}],
|
|
16924
|
+
}], usedKeys: [{
|
|
15802
16925
|
type: Input
|
|
15803
|
-
}],
|
|
16926
|
+
}], sourceText: [{
|
|
15804
16927
|
type: Input
|
|
15805
|
-
}], valueChange: [{
|
|
15806
|
-
type: Output
|
|
15807
16928
|
}] } });
|
|
15808
16929
|
|
|
15809
16930
|
/*
|
|
@@ -15846,6 +16967,7 @@ class FormComponent {
|
|
|
15846
16967
|
...this.multiInputFormComponents?.toArray(),
|
|
15847
16968
|
...this.radioComponents?.toArray(),
|
|
15848
16969
|
...this.valuePathSelectorComponents?.toArray(),
|
|
16970
|
+
...this.autoKeyInputComponents?.toArray(),
|
|
15849
16971
|
];
|
|
15850
16972
|
this.componentValuesSubscription = combineLatest(valueComponents.map(component => {
|
|
15851
16973
|
const inputComponent = component;
|
|
@@ -15902,13 +17024,14 @@ class FormComponent {
|
|
|
15902
17024
|
this.multiInputFormComponents.changes.pipe(startWith(null)),
|
|
15903
17025
|
this.radioComponents.changes.pipe(startWith(null)),
|
|
15904
17026
|
this.valuePathSelectorComponents.changes.pipe(startWith(null)),
|
|
17027
|
+
this.autoKeyInputComponents.changes.pipe(startWith(null)),
|
|
15905
17028
|
]).subscribe(() => {
|
|
15906
17029
|
this.closeComponentValuesSubscription();
|
|
15907
17030
|
this.openComponentValuesSubscription();
|
|
15908
17031
|
});
|
|
15909
17032
|
}
|
|
15910
17033
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15911
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormComponent, isStandalone: false, selector: "v-form", inputs: { className: "className" }, outputs: { valueChange: "valueChange" }, queries: [{ propertyName: "inputComponents", predicate: InputComponent }, { propertyName: "selectComponents", predicate: SelectComponent }, { propertyName: "multiInputComponents", predicate: CarbonMultiInputComponent }, { propertyName: "datePickerComponents", predicate: DatePickerComponent }, { propertyName: "multiInputFormComponents", predicate: MultiInputFormComponent }, { propertyName: "radioComponents", predicate: RadioComponent }, { propertyName: "valuePathSelectorComponents", predicate: ValuePathSelectorComponent }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [ngClass]=\"'v-form ' + className\" onsubmit=\"return false;\">\n <ng-content></ng-content>\n</form>\n", styles: [".v-form{display:flex;flex-direction:column}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
|
|
17034
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormComponent, isStandalone: false, selector: "v-form", inputs: { className: "className" }, outputs: { valueChange: "valueChange" }, queries: [{ propertyName: "inputComponents", predicate: InputComponent }, { propertyName: "selectComponents", predicate: SelectComponent }, { propertyName: "multiInputComponents", predicate: CarbonMultiInputComponent }, { propertyName: "datePickerComponents", predicate: DatePickerComponent }, { propertyName: "multiInputFormComponents", predicate: MultiInputFormComponent }, { propertyName: "radioComponents", predicate: RadioComponent }, { propertyName: "valuePathSelectorComponents", predicate: ValuePathSelectorComponent }, { propertyName: "autoKeyInputComponents", predicate: AutoKeyInputComponent }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [ngClass]=\"'v-form ' + className\" onsubmit=\"return false;\">\n <ng-content></ng-content>\n</form>\n", styles: [".v-form{display:flex;flex-direction:column}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
|
|
15912
17035
|
}
|
|
15913
17036
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormComponent, decorators: [{
|
|
15914
17037
|
type: Component,
|
|
@@ -15934,6 +17057,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
15934
17057
|
}], valuePathSelectorComponents: [{
|
|
15935
17058
|
type: ContentChildren,
|
|
15936
17059
|
args: [ValuePathSelectorComponent]
|
|
17060
|
+
}], autoKeyInputComponents: [{
|
|
17061
|
+
type: ContentChildren,
|
|
17062
|
+
args: [AutoKeyInputComponent]
|
|
15937
17063
|
}], className: [{
|
|
15938
17064
|
type: Input
|
|
15939
17065
|
}], valueChange: [{
|
|
@@ -16159,13 +17285,13 @@ class SearchFieldsComponent {
|
|
|
16159
17285
|
this.expand();
|
|
16160
17286
|
}
|
|
16161
17287
|
}
|
|
16162
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SearchFieldsComponent, deps: [{ token: i3$
|
|
17288
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SearchFieldsComponent, deps: [{ token: i3$2.DocumentService }, { token: i1.TranslateService }, { token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
16163
17289
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: SearchFieldsComponent, isStandalone: false, selector: "valtimo-search-fields", inputs: { loading: "loading", searchFields: "searchFields", caseDefinitionKey: "caseDefinitionKey", setValuesSubject$: "setValuesSubject$", clearValuesSubject$: "clearValuesSubject$", defaultValues: "defaultValues", disableSaveSearch: "disableSaveSearch", inputDisabled: "inputDisabled", externalSearchField: "externalSearchField", canSaveSearch: "canSaveSearch" }, outputs: { doSearch: "doSearch", saveSearchEvent: "saveSearchEvent", clearEvent: "clearEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<ng-container *ngIf=\"loading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!loading\">\n <cds-accordion>\n <cds-accordion-item\n [attr.data-test-id]=\"testIds.accordionItem\"\n [title]=\"'searchFields.searchButtonText' | translate\"\n (selected)=\"toggleExpanded()\"\n [expanded]=\"expanded$ | async\"\n >\n <ng-container *ngTemplateOutlet=\"searchFieldsTemplate\"></ng-container>\n </cds-accordion-item>\n </cds-accordion>\n</ng-container>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\"><cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #searchFieldsTemplate>\n <ng-container *ngIf=\"searchFields$ | async as searchFields\">\n <ng-container\n *ngIf=\"{\n noSearchFields: (!searchFields || searchFields.length === 0) && !externalSearchField,\n } as vars\"\n >\n <div\n *ngIf=\"!vars.noSearchFields\"\n class=\"search-fields-container\"\n [ngClass]=\"{'search-fields-container--hidden': (expanded$ | async) === false}\"\n [cdsLayer]=\"1\"\n >\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let searchField of searchFields\">\n <div class=\"search-field-container\">\n <ng-container\n *ngTemplateOutlet=\"searchFieldTemplate; context: {searchField: searchField}\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n\n <div class=\"meta-container\" *ngIf=\"expanded$ | async\">\n <ng-container\n *ngTemplateOutlet=\"buttonsTemplate; context: {noSearchFields: vars.noSearchFields}\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #searchFieldTemplate let-searchField=\"searchField\">\n <ng-container\n *ngIf=\"{\n values: values$ | async,\n tooltipKey: 'searchFieldsTooltips.' + searchField.key,\n tooltip: 'searchFieldsTooltips.' + searchField.key | translate,\n searchField,\n title:\n searchField.title ||\n ('searchFields.' + searchField.key !== ('searchFields.' + searchField.key | translate)\n ? ('searchFields.' + searchField.key | translate)\n : searchField.key),\n } as vars\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateText;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumber;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDate;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateBoolean;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTime;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumberRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateTextRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTimeRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateSingleSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateMultiSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateText\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [attr.data-test-id]=\"searchFieldTestIdPrefix + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumber\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDate\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateTextRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumberRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateBoolean\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'boolean'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"booleanItems$ | async as booleanItems\"\n [items]=\"booleanItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"getDefaultBooleanSelectionId(values, searchField.key)\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTime\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event, true)\"\n [smallLabel]=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTimeRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event, true)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateSingleSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'single-select-dropdown' ||\n searchField.fieldType === 'single_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateMultiSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'multi-select-dropdown' ||\n searchField.fieldType === 'multi_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [multiple]=\"true\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"multipleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionIds]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template #toText>\n <div class=\"to-text\">\n <v-paragraph>{{ 'searchFields.to' | translate }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #buttonsTemplate let-noSearchFields=\"noSearchFields\">\n <ng-container\n *ngTemplateOutlet=\"noSearchFieldsTemplate; context: {noSearchFields: noSearchFields}\"\n ></ng-container>\n\n <div\n class=\"buttons-container\"\n *ngIf=\"\n !noSearchFields && {expanded: expanded$ | async, isSearchEmpty: isSearchEmpty$ | async} as obs\n \"\n >\n <div class=\"right-buttons\">\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"tertiary\"\n data-testid=\"search-fields-clear-button\"\n [attr.data-test-id]=\"testIds.clearButton\"\n (click)=\"clear()\"\n [disabled]=\"loading || noSearchFields || inputDisabled\"\n type=\"button\"\n id=\"clear\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded && canSaveSearch\"\n cdsButton=\"secondary\"\n data-testid=\"search-fields-save-button\"\n [attr.data-test-id]=\"testIds.saveButton\"\n [disabled]=\"disableSaveSearch && obs.isSearchEmpty\"\n (click)=\"saveSearch()\"\n type=\"button\"\n id=\"save\"\n >\n <svg cdsIcon=\"save\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.saveButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"primary\"\n data-testid=\"search-fields-search-button\"\n [attr.data-test-id]=\"testIds.searchButton\"\n (click)=\"search()\"\n [disabled]=\"\n loading || noSearchFields || (hasValidValues$ | async) === false || inputDisabled\n \"\n type=\"button\"\n id=\"search\"\n >\n <svg cdsIcon=\"search\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #noSearchFieldsTemplate let-noSearchFields=\"noSearchFields\">\n <div class=\"no-search-fields-message\" *ngIf=\"noSearchFields\">\n <v-paragraph dataTestId=\"search-fields-no-fields\" [attr.data-test-id]=\"testIds.noFieldsMessage\" [fullWidth]=\"true\" [center]=\"true\">{{\n 'searchFields.noneConfigured' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n", styles: ["::ng-deep .multiple-search-fields{display:flex!important;flex-direction:row!important;align-items:center}.to-text{margin-inline-start:8px;margin-inline-end:8px}.buttons-container{width:100%;display:flex;justify-content:flex-end}.right-buttons{display:flex;flex-direction:row;gap:16px}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(3,1fr)}.search-fields-container--hidden{display:none}.meta-container{width:100%;padding-bottom:16px}.loading-container{display:flex;width:100%;justify-content:center}.no-search-fields-message{display:flex;width:100%;justify-content:center;margin-top:16px}.search-fields-tile{padding:0}::ng-deep .cds--accordion{background-color:var(--cds-layer)}::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}::ng-deep .cds--accordion__content{padding:0 16px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder", "dataTestId", "trim", "presetsTitle", "presetOptions"], outputs: ["valueChange"] }, { kind: "component", type: FormComponent, selector: "v-form", inputs: ["className"], outputs: ["valueChange"] }, { kind: "component", type: DatePickerComponent, selector: "v-date-picker", inputs: ["name", "title", "placeholder", "titleTranslationKey", "widthPx", "fullWidth", "margin", "disabled", "tooltip", "required", "defaultDate", "defaultDateIsToday", "smallLabel", "clear$", "enableTime", "carbonTheme"], outputs: ["valueChange"] }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: ParagraphComponent, selector: "v-paragraph", inputs: ["center", "fullWidth", "margin", "italic", "loading", "dataTestId"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "component", type: i2$3.Accordion, selector: "cds-accordion, ibm-accordion", inputs: ["align", "size", "skeleton"] }, { kind: "component", type: i2$3.AccordionItem, selector: "cds-accordion-item, ibm-accordion-item", inputs: ["title", "context", "id", "skeleton", "expanded", "disabled"], outputs: ["selected"] }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i2$3.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
|
|
16164
17290
|
}
|
|
16165
17291
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SearchFieldsComponent, decorators: [{
|
|
16166
17292
|
type: Component,
|
|
16167
17293
|
args: [{ selector: 'valtimo-search-fields', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<ng-container *ngIf=\"loading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!loading\">\n <cds-accordion>\n <cds-accordion-item\n [attr.data-test-id]=\"testIds.accordionItem\"\n [title]=\"'searchFields.searchButtonText' | translate\"\n (selected)=\"toggleExpanded()\"\n [expanded]=\"expanded$ | async\"\n >\n <ng-container *ngTemplateOutlet=\"searchFieldsTemplate\"></ng-container>\n </cds-accordion-item>\n </cds-accordion>\n</ng-container>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\"><cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #searchFieldsTemplate>\n <ng-container *ngIf=\"searchFields$ | async as searchFields\">\n <ng-container\n *ngIf=\"{\n noSearchFields: (!searchFields || searchFields.length === 0) && !externalSearchField,\n } as vars\"\n >\n <div\n *ngIf=\"!vars.noSearchFields\"\n class=\"search-fields-container\"\n [ngClass]=\"{'search-fields-container--hidden': (expanded$ | async) === false}\"\n [cdsLayer]=\"1\"\n >\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let searchField of searchFields\">\n <div class=\"search-field-container\">\n <ng-container\n *ngTemplateOutlet=\"searchFieldTemplate; context: {searchField: searchField}\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n\n <div class=\"meta-container\" *ngIf=\"expanded$ | async\">\n <ng-container\n *ngTemplateOutlet=\"buttonsTemplate; context: {noSearchFields: vars.noSearchFields}\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #searchFieldTemplate let-searchField=\"searchField\">\n <ng-container\n *ngIf=\"{\n values: values$ | async,\n tooltipKey: 'searchFieldsTooltips.' + searchField.key,\n tooltip: 'searchFieldsTooltips.' + searchField.key | translate,\n searchField,\n title:\n searchField.title ||\n ('searchFields.' + searchField.key !== ('searchFields.' + searchField.key | translate)\n ? ('searchFields.' + searchField.key | translate)\n : searchField.key),\n } as vars\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateText;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumber;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDate;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateBoolean;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTime;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumberRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateTextRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTimeRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateSingleSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateMultiSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateText\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [attr.data-test-id]=\"searchFieldTestIdPrefix + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumber\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDate\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateTextRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumberRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateBoolean\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'boolean'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"booleanItems$ | async as booleanItems\"\n [items]=\"booleanItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"getDefaultBooleanSelectionId(values, searchField.key)\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTime\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event, true)\"\n [smallLabel]=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTimeRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event, true)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateSingleSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'single-select-dropdown' ||\n searchField.fieldType === 'single_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateMultiSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'multi-select-dropdown' ||\n searchField.fieldType === 'multi_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [multiple]=\"true\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"multipleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionIds]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template #toText>\n <div class=\"to-text\">\n <v-paragraph>{{ 'searchFields.to' | translate }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #buttonsTemplate let-noSearchFields=\"noSearchFields\">\n <ng-container\n *ngTemplateOutlet=\"noSearchFieldsTemplate; context: {noSearchFields: noSearchFields}\"\n ></ng-container>\n\n <div\n class=\"buttons-container\"\n *ngIf=\"\n !noSearchFields && {expanded: expanded$ | async, isSearchEmpty: isSearchEmpty$ | async} as obs\n \"\n >\n <div class=\"right-buttons\">\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"tertiary\"\n data-testid=\"search-fields-clear-button\"\n [attr.data-test-id]=\"testIds.clearButton\"\n (click)=\"clear()\"\n [disabled]=\"loading || noSearchFields || inputDisabled\"\n type=\"button\"\n id=\"clear\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded && canSaveSearch\"\n cdsButton=\"secondary\"\n data-testid=\"search-fields-save-button\"\n [attr.data-test-id]=\"testIds.saveButton\"\n [disabled]=\"disableSaveSearch && obs.isSearchEmpty\"\n (click)=\"saveSearch()\"\n type=\"button\"\n id=\"save\"\n >\n <svg cdsIcon=\"save\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.saveButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"primary\"\n data-testid=\"search-fields-search-button\"\n [attr.data-test-id]=\"testIds.searchButton\"\n (click)=\"search()\"\n [disabled]=\"\n loading || noSearchFields || (hasValidValues$ | async) === false || inputDisabled\n \"\n type=\"button\"\n id=\"search\"\n >\n <svg cdsIcon=\"search\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #noSearchFieldsTemplate let-noSearchFields=\"noSearchFields\">\n <div class=\"no-search-fields-message\" *ngIf=\"noSearchFields\">\n <v-paragraph dataTestId=\"search-fields-no-fields\" [attr.data-test-id]=\"testIds.noFieldsMessage\" [fullWidth]=\"true\" [center]=\"true\">{{\n 'searchFields.noneConfigured' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n", styles: ["::ng-deep .multiple-search-fields{display:flex!important;flex-direction:row!important;align-items:center}.to-text{margin-inline-start:8px;margin-inline-end:8px}.buttons-container{width:100%;display:flex;justify-content:flex-end}.right-buttons{display:flex;flex-direction:row;gap:16px}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(3,1fr)}.search-fields-container--hidden{display:none}.meta-container{width:100%;padding-bottom:16px}.loading-container{display:flex;width:100%;justify-content:center}.no-search-fields-message{display:flex;width:100%;justify-content:center;margin-top:16px}.search-fields-tile{padding:0}::ng-deep .cds--accordion{background-color:var(--cds-layer)}::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}::ng-deep .cds--accordion__content{padding:0 16px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
16168
|
-
}], ctorParameters: () => [{ type: i3$
|
|
17294
|
+
}], ctorParameters: () => [{ type: i3$2.DocumentService }, { type: i1.TranslateService }, { type: i2$3.IconService }], propDecorators: { loading: [{
|
|
16169
17295
|
type: Input
|
|
16170
17296
|
}], searchFields: [{
|
|
16171
17297
|
type: Input
|
|
@@ -17645,13 +18771,13 @@ class TableComponent {
|
|
|
17645
18771
|
}
|
|
17646
18772
|
});
|
|
17647
18773
|
}
|
|
17648
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TableComponent, deps: [{ token: i3.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
18774
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TableComponent, deps: [{ token: i3$1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17649
18775
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: TableComponent, isStandalone: false, selector: "v-table", inputs: { items: "items", columns: "columns", loading: "loading", showEditButtons: "showEditButtons", showPagination: "showPagination", editButtonTranslationKey: "editButtonTranslationKey", itemsTranslationKey: "itemsTranslationKey", noResultsTranslationKey: "noResultsTranslationKey", mobileBreakpointPx: "mobileBreakpointPx", amountOfLoadingRows: "amountOfLoadingRows", collectionSize: "collectionSize", page: "page", size: "size" }, outputs: { editButtonClicked: "editButtonClicked", paginationSizeSet: "paginationSizeSet", paginationPageSet: "paginationPageSet" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"{items: items$ | async} as obs\">\n <div class=\"v-table-container\">\n <table class=\"v-table\">\n <ng-container *ngTemplateOutlet=\"tableHead\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableBody; context: {tableItems: obs.items}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableBodyLoading\"></ng-container>\n <ng-container\n *ngTemplateOutlet=\"tableBodyNoResults; context: {tableItems: obs.items}\"\n ></ng-container>\n </table>\n <ng-container *ngIf=\"showPagination\">\n <ng-container\n *ngTemplateOutlet=\"paginationContainer; context: {tableItems: obs.items}\"\n ></ng-container>\n </ng-container>\n </div>\n</ng-container>\n\n<ng-template #tableHead>\n <thead *ngIf=\"columns\">\n <tr>\n <th class=\"v-table__header\" *ngFor=\"let column of columns\">\n {{ column.labelTranslationKey | translate }}\n </th>\n <th *ngIf=\"showEditButtons\" class=\"v-table__header\"></th>\n </tr>\n </thead>\n</ng-template>\n\n<ng-template #tableBody let-tableItems=\"tableItems\">\n <tbody class=\"v-table__body\" *ngIf=\"!loading && tableItems && tableItems?.length > 0\">\n <tr *ngFor=\"let item of tableItems\" class=\"v-table__row\">\n <ng-container *ngTemplateOutlet=\"tableCell; context: {item: item}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableEditButtonCell; context: {item: item}\"></ng-container>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableBodyNoResults let-tableItems=\"tableItems\">\n <tbody class=\"v-table__body\" *ngIf=\"!loading && tableItems && tableItems?.length === 0\">\n <tr class=\"v-table__row\">\n <td class=\"v-table__cell\" *ngFor=\"let column of columns; let i = index\">\n <span *ngIf=\"i === 0\" class=\"v-table__cell-content\">\n {{\n noResultsTranslationKey\n ? (noResultsTranslationKey | translate)\n : ('interface.noResults' | translate)\n }}\n </span>\n </td>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableCell let-item=\"item\">\n <td *ngFor=\"let column of columns\" class=\"v-table__cell\">\n <span class=\"v-table__cell-content\">\n {{ item[column.dataKey] }}\n </span>\n </td>\n</ng-template>\n\n<ng-template #tableEditButtonCell let-item=\"item\">\n <td *ngIf=\"showEditButtons\" class=\"v-table__cell v-table__cell--with-button\">\n <span class=\"v-table__cell-button-container\">\n <button cdsButton=\"secondary\" (click)=\"editButtonClicked.emit(item)\">\n {{ editButtonTranslationKey || 'interface.edit' | translate }}\n </button>\n </span>\n </td>\n</ng-template>\n\n<ng-template #tableBodyLoading>\n <tbody class=\"v-table__body\" *ngIf=\"loading\">\n <tr *ngFor=\"let item of getArrayOfLength(amountOfLoadingRows)\" class=\"v-table__row\">\n <ng-container *ngTemplateOutlet=\"tableCellLoading\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableEditButtonCellLoading\"></ng-container>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableCellLoading>\n <td *ngFor=\"let column of columns\" class=\"v-table__cell\">\n <span class=\"v-table__cell-content\"\n ><ngx-skeleton-loader\n appearance=\"line\"\n [theme]=\"{\n width: 'var(--v-table-loading-skeleton-width)',\n height: 'var(--v-table-loading-skeleton-line-height)',\n margin: '0',\n 'background-color': 'var(--v-table-loading-skeleton-bg-color)',\n }\"\n ></ngx-skeleton-loader\n ></span>\n </td>\n</ng-template>\n\n<ng-template #tableEditButtonCellLoading>\n <td *ngIf=\"showEditButtons\" class=\"v-table__cell v-table__cell--with-button\">\n <span class=\"v-table__cell-button-container\">\n <button cdsButton=\"secondary\" [disabled]=\"true\">\n {{ editButtonTranslationKey || 'interface.edit' | translate }}\n </button>\n </span>\n </td>\n</ng-template>\n\n<ng-template #paginationContainer let-tableItems=\"tableItems\">\n <div *ngIf=\"pagination$ | async as paginationObject\" class=\"v-table__pagination-container\">\n <div class=\"v-table__pagination-size-container\">\n <ng-container\n *ngTemplateOutlet=\"paginationSizeSelect; context: {paginationObject: paginationObject}\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n paginationSizeAmountText;\n context: {paginationObject: paginationObject, tableItems: tableItems}\n \"\n ></ng-container>\n </div>\n <ng-container\n *ngTemplateOutlet=\"paginationNavigation; context: {paginationObject: paginationObject}\"\n ></ng-container>\n </div>\n</ng-template>\n\n<ng-template #paginationSizeSelect let-paginationObject=\"paginationObject\">\n <span class=\"v-table__pagination-size-text\">{{ 'interface.show' | translate }}</span>\n <span class=\"v-table__pagination-size-select\">\n <v-select\n [items]=\"paginationOptions\"\n [clearable]=\"false\"\n [defaultSelection]=\"(defaultPaginationSize$ | async) || paginationOptions[0]\"\n [disabled]=\"loading\"\n (selectedChange)=\"setPaginationSize($event)\"\n ></v-select>\n </span>\n <span class=\"v-table__pagination-size-text\">{{\n itemsTranslationKey ? (itemsTranslationKey | translate) : ('interface.items' | translate)\n }}</span>\n</ng-template>\n\n<ng-template\n #paginationSizeAmountText\n let-paginationObject=\"paginationObject\"\n let-tableItems=\"tableItems\"\n>\n <ng-container *ngTemplateOutlet=\"paginationSizeAmountTextLoading\"></ng-container>\n <span\n class=\"v-table__pagination-amount-text\"\n *ngIf=\"!loading && tableItems && paginationObject\"\n >{{\n tableItems.length +\n ' ' +\n ('interface.of' | translate) +\n ' ' +\n paginationObject.collectionSize +\n ' ' +\n (itemsTranslationKey\n ? (itemsTranslationKey | translate)\n : ('interface.items' | translate)) +\n ' ' +\n ('interface.visible' | translate)\n }}</span\n >\n</ng-template>\n\n<ng-template #paginationSizeAmountTextLoading>\n <span class=\"v-table__pagination-amount-text\" *ngIf=\"loading\"\n ><ngx-skeleton-loader\n appearance=\"line\"\n [theme]=\"{\n width: 'var(--v-table-loading-skeleton-width)',\n height: 'var(--v-table-loading-skeleton-line-height)',\n margin: '0',\n 'background-color': 'var(--v-table-loading-skeleton-pagination-size-bg-color)',\n }\"\n ></ngx-skeleton-loader\n ></span>\n</ng-template>\n\n<ng-template #paginationNavigation let-paginationObject=\"paginationObject\">\n <div\n class=\"v-table__pagination-navigation-container\"\n *ngIf=\"paginationObject && paginationObject.collectionSize > paginationObject.size\"\n >\n <span *ngIf=\"paginationObject.page > 1\">\n <button cdsButton=\"ghost\" (click)=\"setPage('previous')\" [disabled]=\"loading\">\n {{ 'interface.previous' | translate }}\n </button>\n </span>\n\n <span *ngIf=\"paginationObject.page * paginationObject.size < paginationObject.collectionSize\">\n <button cdsButton=\"ghost\" (click)=\"setPage('next')\" [disabled]=\"loading\">\n {{ 'interface.nextArrow' | translate }}\n </button>\n </span>\n </div>\n</ng-template>\n", styles: [".v-table-container{width:100%;display:flex;flex-direction:column}.v-table{width:100%;border-spacing:var(--v-table-border-spacing);table-layout:var(--v-table-layout)}.v-table__header{color:var(--v-table-header-font-color);text-transform:var(--v-table-header-text-transform);font-size:var(--v-table-header-font-size);font-weight:var(--v-table-header-font-weight);letter-spacing:var(--v-table-header-letter-spacing);padding-block-end:var(--v-table-header-padding-block-end);padding-inline-start:var(--v-table-cell-padding-inline);padding-inline-end:var(--v-table-cell-padding-inline)}.v-table__header:first-child{padding-inline-start:var(--v-table-first-cell-padding-inline-start)}.v-table__body{outline:var(--v-table-body-border);border-radius:var(--v-border-radius-md)}.v-table__row{border-bottom:var(--v-table-row-bottom-border)}.v-table__row:first-child .v-table__cell:first-child{border-top-left-radius:var(--v-border-radius-md)}.v-table__row:first-child .v-table__cell:last-child{border-top-right-radius:var(--v-border-radius-md)}.v-table__row:last-child{border-bottom:none}.v-table__row:last-child .v-table__cell:first-child{border-bottom-left-radius:var(--v-border-radius-md)}.v-table__row:last-child .v-table__cell:last-child{border-bottom-right-radius:var(--v-border-radius-md)}.v-table__cell{padding-block-start:var(--v-table-cell-padding-block);padding-block-end:var(--v-table-cell-padding-block);padding-inline-start:var(--v-table-cell-padding-inline);padding-inline-end:var(--v-table-cell-padding-inline);background-color:var(--v-table-background-color);font-size:var(--v-font-size-smaller);font-weight:var(--v-font-weight-bold);line-height:var(--v-line-height-smaller);width:var(--v-table-cell-width)}.v-table__cell:first-child{padding-inline-start:var(--v-table-first-cell-padding-inline-start)}.v-table__cell-content{display:flex;color:var(--v-table-cell-font-color);padding-block-start:var(--v-table-cell-content-padding-block);padding-block-end:var(--v-table-cell-content-padding-block)}.v-table__cell--with-button{width:.1%;white-space:nowrap}.v-table__cell-button-container{display:flex}ngx-skeleton-loader{display:flex}.v-table__pagination-container{display:flex;width:100%;flex-direction:row;justify-content:space-between;margin-block-start:var(--v-table-pagination-margin-block)}.v-table__pagination-size-container{display:flex;flex-direction:row;align-items:center}.v-table__pagination-size-container span:not(:last-child){margin-inline-end:var(--v-table-pagination-size-spacing-inline)}.v-table__pagination-size-text{color:var(--v-table-pagination-size-text-color);font-size:var(--v-table-pagination-size-text-font-size);font-weight:var(--v-table-pagination-size-text-font-weight)}.v-table__pagination-size-select{display:flex}.v-table__pagination-amount-text{margin-inline-start:var(--v-table-pagination-amount-text-margin-inline);color:var(--v-table-pagination-size-text-color);font-size:var(--v-table-pagination-size-text-font-size);font-weight:var(--v-table-pagination-amount-text-font-weight)}.v-table__pagination-navigation-container{display:flex;flex-direction:row}.v-table__pagination-navigation-container span:not(:last-child){margin-inline-end:var(--v-table-pagination-button-spacing-inline)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i2$1.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
|
|
17650
18776
|
}
|
|
17651
18777
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TableComponent, decorators: [{
|
|
17652
18778
|
type: Component,
|
|
17653
18779
|
args: [{ selector: 'v-table', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"{items: items$ | async} as obs\">\n <div class=\"v-table-container\">\n <table class=\"v-table\">\n <ng-container *ngTemplateOutlet=\"tableHead\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableBody; context: {tableItems: obs.items}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableBodyLoading\"></ng-container>\n <ng-container\n *ngTemplateOutlet=\"tableBodyNoResults; context: {tableItems: obs.items}\"\n ></ng-container>\n </table>\n <ng-container *ngIf=\"showPagination\">\n <ng-container\n *ngTemplateOutlet=\"paginationContainer; context: {tableItems: obs.items}\"\n ></ng-container>\n </ng-container>\n </div>\n</ng-container>\n\n<ng-template #tableHead>\n <thead *ngIf=\"columns\">\n <tr>\n <th class=\"v-table__header\" *ngFor=\"let column of columns\">\n {{ column.labelTranslationKey | translate }}\n </th>\n <th *ngIf=\"showEditButtons\" class=\"v-table__header\"></th>\n </tr>\n </thead>\n</ng-template>\n\n<ng-template #tableBody let-tableItems=\"tableItems\">\n <tbody class=\"v-table__body\" *ngIf=\"!loading && tableItems && tableItems?.length > 0\">\n <tr *ngFor=\"let item of tableItems\" class=\"v-table__row\">\n <ng-container *ngTemplateOutlet=\"tableCell; context: {item: item}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableEditButtonCell; context: {item: item}\"></ng-container>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableBodyNoResults let-tableItems=\"tableItems\">\n <tbody class=\"v-table__body\" *ngIf=\"!loading && tableItems && tableItems?.length === 0\">\n <tr class=\"v-table__row\">\n <td class=\"v-table__cell\" *ngFor=\"let column of columns; let i = index\">\n <span *ngIf=\"i === 0\" class=\"v-table__cell-content\">\n {{\n noResultsTranslationKey\n ? (noResultsTranslationKey | translate)\n : ('interface.noResults' | translate)\n }}\n </span>\n </td>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableCell let-item=\"item\">\n <td *ngFor=\"let column of columns\" class=\"v-table__cell\">\n <span class=\"v-table__cell-content\">\n {{ item[column.dataKey] }}\n </span>\n </td>\n</ng-template>\n\n<ng-template #tableEditButtonCell let-item=\"item\">\n <td *ngIf=\"showEditButtons\" class=\"v-table__cell v-table__cell--with-button\">\n <span class=\"v-table__cell-button-container\">\n <button cdsButton=\"secondary\" (click)=\"editButtonClicked.emit(item)\">\n {{ editButtonTranslationKey || 'interface.edit' | translate }}\n </button>\n </span>\n </td>\n</ng-template>\n\n<ng-template #tableBodyLoading>\n <tbody class=\"v-table__body\" *ngIf=\"loading\">\n <tr *ngFor=\"let item of getArrayOfLength(amountOfLoadingRows)\" class=\"v-table__row\">\n <ng-container *ngTemplateOutlet=\"tableCellLoading\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableEditButtonCellLoading\"></ng-container>\n </tr>\n </tbody>\n</ng-template>\n\n<ng-template #tableCellLoading>\n <td *ngFor=\"let column of columns\" class=\"v-table__cell\">\n <span class=\"v-table__cell-content\"\n ><ngx-skeleton-loader\n appearance=\"line\"\n [theme]=\"{\n width: 'var(--v-table-loading-skeleton-width)',\n height: 'var(--v-table-loading-skeleton-line-height)',\n margin: '0',\n 'background-color': 'var(--v-table-loading-skeleton-bg-color)',\n }\"\n ></ngx-skeleton-loader\n ></span>\n </td>\n</ng-template>\n\n<ng-template #tableEditButtonCellLoading>\n <td *ngIf=\"showEditButtons\" class=\"v-table__cell v-table__cell--with-button\">\n <span class=\"v-table__cell-button-container\">\n <button cdsButton=\"secondary\" [disabled]=\"true\">\n {{ editButtonTranslationKey || 'interface.edit' | translate }}\n </button>\n </span>\n </td>\n</ng-template>\n\n<ng-template #paginationContainer let-tableItems=\"tableItems\">\n <div *ngIf=\"pagination$ | async as paginationObject\" class=\"v-table__pagination-container\">\n <div class=\"v-table__pagination-size-container\">\n <ng-container\n *ngTemplateOutlet=\"paginationSizeSelect; context: {paginationObject: paginationObject}\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n paginationSizeAmountText;\n context: {paginationObject: paginationObject, tableItems: tableItems}\n \"\n ></ng-container>\n </div>\n <ng-container\n *ngTemplateOutlet=\"paginationNavigation; context: {paginationObject: paginationObject}\"\n ></ng-container>\n </div>\n</ng-template>\n\n<ng-template #paginationSizeSelect let-paginationObject=\"paginationObject\">\n <span class=\"v-table__pagination-size-text\">{{ 'interface.show' | translate }}</span>\n <span class=\"v-table__pagination-size-select\">\n <v-select\n [items]=\"paginationOptions\"\n [clearable]=\"false\"\n [defaultSelection]=\"(defaultPaginationSize$ | async) || paginationOptions[0]\"\n [disabled]=\"loading\"\n (selectedChange)=\"setPaginationSize($event)\"\n ></v-select>\n </span>\n <span class=\"v-table__pagination-size-text\">{{\n itemsTranslationKey ? (itemsTranslationKey | translate) : ('interface.items' | translate)\n }}</span>\n</ng-template>\n\n<ng-template\n #paginationSizeAmountText\n let-paginationObject=\"paginationObject\"\n let-tableItems=\"tableItems\"\n>\n <ng-container *ngTemplateOutlet=\"paginationSizeAmountTextLoading\"></ng-container>\n <span\n class=\"v-table__pagination-amount-text\"\n *ngIf=\"!loading && tableItems && paginationObject\"\n >{{\n tableItems.length +\n ' ' +\n ('interface.of' | translate) +\n ' ' +\n paginationObject.collectionSize +\n ' ' +\n (itemsTranslationKey\n ? (itemsTranslationKey | translate)\n : ('interface.items' | translate)) +\n ' ' +\n ('interface.visible' | translate)\n }}</span\n >\n</ng-template>\n\n<ng-template #paginationSizeAmountTextLoading>\n <span class=\"v-table__pagination-amount-text\" *ngIf=\"loading\"\n ><ngx-skeleton-loader\n appearance=\"line\"\n [theme]=\"{\n width: 'var(--v-table-loading-skeleton-width)',\n height: 'var(--v-table-loading-skeleton-line-height)',\n margin: '0',\n 'background-color': 'var(--v-table-loading-skeleton-pagination-size-bg-color)',\n }\"\n ></ngx-skeleton-loader\n ></span>\n</ng-template>\n\n<ng-template #paginationNavigation let-paginationObject=\"paginationObject\">\n <div\n class=\"v-table__pagination-navigation-container\"\n *ngIf=\"paginationObject && paginationObject.collectionSize > paginationObject.size\"\n >\n <span *ngIf=\"paginationObject.page > 1\">\n <button cdsButton=\"ghost\" (click)=\"setPage('previous')\" [disabled]=\"loading\">\n {{ 'interface.previous' | translate }}\n </button>\n </span>\n\n <span *ngIf=\"paginationObject.page * paginationObject.size < paginationObject.collectionSize\">\n <button cdsButton=\"ghost\" (click)=\"setPage('next')\" [disabled]=\"loading\">\n {{ 'interface.nextArrow' | translate }}\n </button>\n </span>\n </div>\n</ng-template>\n", styles: [".v-table-container{width:100%;display:flex;flex-direction:column}.v-table{width:100%;border-spacing:var(--v-table-border-spacing);table-layout:var(--v-table-layout)}.v-table__header{color:var(--v-table-header-font-color);text-transform:var(--v-table-header-text-transform);font-size:var(--v-table-header-font-size);font-weight:var(--v-table-header-font-weight);letter-spacing:var(--v-table-header-letter-spacing);padding-block-end:var(--v-table-header-padding-block-end);padding-inline-start:var(--v-table-cell-padding-inline);padding-inline-end:var(--v-table-cell-padding-inline)}.v-table__header:first-child{padding-inline-start:var(--v-table-first-cell-padding-inline-start)}.v-table__body{outline:var(--v-table-body-border);border-radius:var(--v-border-radius-md)}.v-table__row{border-bottom:var(--v-table-row-bottom-border)}.v-table__row:first-child .v-table__cell:first-child{border-top-left-radius:var(--v-border-radius-md)}.v-table__row:first-child .v-table__cell:last-child{border-top-right-radius:var(--v-border-radius-md)}.v-table__row:last-child{border-bottom:none}.v-table__row:last-child .v-table__cell:first-child{border-bottom-left-radius:var(--v-border-radius-md)}.v-table__row:last-child .v-table__cell:last-child{border-bottom-right-radius:var(--v-border-radius-md)}.v-table__cell{padding-block-start:var(--v-table-cell-padding-block);padding-block-end:var(--v-table-cell-padding-block);padding-inline-start:var(--v-table-cell-padding-inline);padding-inline-end:var(--v-table-cell-padding-inline);background-color:var(--v-table-background-color);font-size:var(--v-font-size-smaller);font-weight:var(--v-font-weight-bold);line-height:var(--v-line-height-smaller);width:var(--v-table-cell-width)}.v-table__cell:first-child{padding-inline-start:var(--v-table-first-cell-padding-inline-start)}.v-table__cell-content{display:flex;color:var(--v-table-cell-font-color);padding-block-start:var(--v-table-cell-content-padding-block);padding-block-end:var(--v-table-cell-content-padding-block)}.v-table__cell--with-button{width:.1%;white-space:nowrap}.v-table__cell-button-container{display:flex}ngx-skeleton-loader{display:flex}.v-table__pagination-container{display:flex;width:100%;flex-direction:row;justify-content:space-between;margin-block-start:var(--v-table-pagination-margin-block)}.v-table__pagination-size-container{display:flex;flex-direction:row;align-items:center}.v-table__pagination-size-container span:not(:last-child){margin-inline-end:var(--v-table-pagination-size-spacing-inline)}.v-table__pagination-size-text{color:var(--v-table-pagination-size-text-color);font-size:var(--v-table-pagination-size-text-font-size);font-weight:var(--v-table-pagination-size-text-font-weight)}.v-table__pagination-size-select{display:flex}.v-table__pagination-amount-text{margin-inline-start:var(--v-table-pagination-amount-text-margin-inline);color:var(--v-table-pagination-size-text-color);font-size:var(--v-table-pagination-size-text-font-size);font-weight:var(--v-table-pagination-amount-text-font-weight)}.v-table__pagination-navigation-container{display:flex;flex-direction:row}.v-table__pagination-navigation-container span:not(:last-child){margin-inline-end:var(--v-table-pagination-button-spacing-inline)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
17654
|
-
}], ctorParameters: () => [{ type: i3.BreakpointObserver }], propDecorators: { items: [{
|
|
18780
|
+
}], ctorParameters: () => [{ type: i3$1.BreakpointObserver }], propDecorators: { items: [{
|
|
17655
18781
|
type: Input
|
|
17656
18782
|
}], columns: [{
|
|
17657
18783
|
type: Input
|
|
@@ -18698,186 +19824,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
18698
19824
|
type: Output
|
|
18699
19825
|
}] } });
|
|
18700
19826
|
|
|
18701
|
-
/*
|
|
18702
|
-
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
18703
|
-
*
|
|
18704
|
-
* Licensed under EUPL, Version 1.2 (the "License");
|
|
18705
|
-
* you may not use this file except in compliance with the License.
|
|
18706
|
-
* You may obtain a copy of the License at
|
|
18707
|
-
*
|
|
18708
|
-
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
18709
|
-
*
|
|
18710
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
18711
|
-
* distributed under the License is distributed on an "AS IS" basis,
|
|
18712
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18713
|
-
* See the License for the specific language governing permissions and
|
|
18714
|
-
* limitations under the License.
|
|
18715
|
-
*/
|
|
18716
|
-
class AutoKeyInputComponent {
|
|
18717
|
-
set mode(value) {
|
|
18718
|
-
this._mode$.next(value);
|
|
18719
|
-
}
|
|
18720
|
-
get mode$() {
|
|
18721
|
-
return this._mode$.pipe(filter(mode => !!mode));
|
|
18722
|
-
}
|
|
18723
|
-
set usedKeys(value) {
|
|
18724
|
-
this._usedKeys$.next(value || []);
|
|
18725
|
-
}
|
|
18726
|
-
set sourceText(value) {
|
|
18727
|
-
this._sourceText$.next(value || '');
|
|
18728
|
-
}
|
|
18729
|
-
constructor(iconService) {
|
|
18730
|
-
this.iconService = iconService;
|
|
18731
|
-
this.labelTranslationKey = 'Key';
|
|
18732
|
-
this.placeholderTranslationKey = '';
|
|
18733
|
-
this.testIds = AUTO_KEY_INPUT_TEST_IDS;
|
|
18734
|
-
this._mode$ = new BehaviorSubject(null);
|
|
18735
|
-
this._usedKeys$ = new BehaviorSubject([]);
|
|
18736
|
-
this._sourceText$ = new BehaviorSubject('');
|
|
18737
|
-
this.$disabled = signal(false);
|
|
18738
|
-
this.value = '';
|
|
18739
|
-
this.editingKey$ = new BehaviorSubject(true);
|
|
18740
|
-
this.duplicateInitialized = false;
|
|
18741
|
-
this.idError$ = new BehaviorSubject(null);
|
|
18742
|
-
this.onChange = (_) => { };
|
|
18743
|
-
this.onTouched = () => { };
|
|
18744
|
-
this.onValidatorChange = () => { };
|
|
18745
|
-
this.validate = (control) => this.idError$.getValue() ? { idError: { value: this.idError$.getValue() } } : null;
|
|
18746
|
-
this.subscription = new Subscription();
|
|
18747
|
-
this.iconService.registerAll([Edit16, Close16]);
|
|
18748
|
-
this.subscription.add(this.mode$.subscribe(mode => {
|
|
18749
|
-
this.editingKey$.next(mode === 'edit');
|
|
18750
|
-
if (mode === 'duplicate') {
|
|
18751
|
-
this.duplicateInitialized = false;
|
|
18752
|
-
}
|
|
18753
|
-
}));
|
|
18754
|
-
this.subscription.add(combineLatest([this.mode$, this.editingKey$, this._usedKeys$, this._sourceText$]).subscribe(([mode, editingKey, usedKeys, sourceText]) => {
|
|
18755
|
-
if (mode === 'add' || mode === 'duplicate') {
|
|
18756
|
-
this.updateKey(mode, editingKey, usedKeys, sourceText);
|
|
18757
|
-
}
|
|
18758
|
-
}));
|
|
18759
|
-
}
|
|
18760
|
-
ngOnChanges() {
|
|
18761
|
-
this.onValidatorChange();
|
|
18762
|
-
}
|
|
18763
|
-
ngOnDestroy() {
|
|
18764
|
-
this.subscription.unsubscribe();
|
|
18765
|
-
this.duplicateInitialized = false;
|
|
18766
|
-
this.idError$.next(null);
|
|
18767
|
-
}
|
|
18768
|
-
setDisabledState(disabled) {
|
|
18769
|
-
this.$disabled.set(disabled);
|
|
18770
|
-
}
|
|
18771
|
-
writeValue(value) {
|
|
18772
|
-
if (value === null || value === '') {
|
|
18773
|
-
this.resetInternalState();
|
|
18774
|
-
return;
|
|
18775
|
-
}
|
|
18776
|
-
this.value = value ?? '';
|
|
18777
|
-
}
|
|
18778
|
-
registerOnChange(fn) {
|
|
18779
|
-
this.onChange = fn;
|
|
18780
|
-
}
|
|
18781
|
-
registerOnTouched(fn) {
|
|
18782
|
-
this.onTouched = fn;
|
|
18783
|
-
}
|
|
18784
|
-
registerOnValidatorChange(fn) {
|
|
18785
|
-
this.onValidatorChange = fn;
|
|
18786
|
-
}
|
|
18787
|
-
onInputChange(event) {
|
|
18788
|
-
const usedKeys = this._usedKeys$.getValue();
|
|
18789
|
-
this.idError$.next(usedKeys.includes(event.target.value) ? 'caseManagement.statuses.keyDuplicated' : null);
|
|
18790
|
-
this.onChange((this.value = event.target.value));
|
|
18791
|
-
}
|
|
18792
|
-
enableKeyEditing() {
|
|
18793
|
-
this.editingKey$.next(true);
|
|
18794
|
-
}
|
|
18795
|
-
disableKeyEditing() {
|
|
18796
|
-
this.editingKey$.next(false);
|
|
18797
|
-
}
|
|
18798
|
-
getUniqueKey(sourceText, usedKeys) {
|
|
18799
|
-
const baseKey = sourceText
|
|
18800
|
-
.toLowerCase()
|
|
18801
|
-
.replace(/[^a-z0-9-_]+|-[^a-z0-9]+/g, '-')
|
|
18802
|
-
.replace(/_[-_]+/g, '_')
|
|
18803
|
-
.replace(/^[^a-z]+/g, '');
|
|
18804
|
-
if (!usedKeys.includes(baseKey) || this._mode$.getValue() === 'edit') {
|
|
18805
|
-
return baseKey;
|
|
18806
|
-
}
|
|
18807
|
-
return this.getUniqueKeyWithNumber(baseKey, usedKeys);
|
|
18808
|
-
}
|
|
18809
|
-
resetInternalState() {
|
|
18810
|
-
this.value = '';
|
|
18811
|
-
this.idError$.next(null);
|
|
18812
|
-
this.disableKeyEditing();
|
|
18813
|
-
this.duplicateInitialized = false;
|
|
18814
|
-
}
|
|
18815
|
-
updateKey(mode, editingKey, usedKeys, sourceText) {
|
|
18816
|
-
if (editingKey) {
|
|
18817
|
-
return;
|
|
18818
|
-
}
|
|
18819
|
-
let newKey = sourceText ? this.getUniqueKey(sourceText, usedKeys) : '';
|
|
18820
|
-
if (mode === 'duplicate' && !this.duplicateInitialized && newKey) {
|
|
18821
|
-
newKey = `${newKey}-duplicate`;
|
|
18822
|
-
this.duplicateInitialized = true;
|
|
18823
|
-
}
|
|
18824
|
-
this.value = newKey;
|
|
18825
|
-
this.onChange(newKey);
|
|
18826
|
-
}
|
|
18827
|
-
getUniqueKeyWithNumber(base, usedKeys, suffix = 1) {
|
|
18828
|
-
const newKey = `${base}-${suffix}`;
|
|
18829
|
-
if (usedKeys.includes(newKey)) {
|
|
18830
|
-
return this.getUniqueKeyWithNumber(base, usedKeys, suffix + 1);
|
|
18831
|
-
}
|
|
18832
|
-
return newKey;
|
|
18833
|
-
}
|
|
18834
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AutoKeyInputComponent, deps: [{ token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
18835
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: AutoKeyInputComponent, isStandalone: true, selector: "valtimo-auto-key-input", inputs: { labelTranslationKey: "labelTranslationKey", placeholderTranslationKey: "placeholderTranslationKey", mode: "mode", usedKeys: "usedKeys", sourceText: "sourceText" }, providers: [
|
|
18836
|
-
{
|
|
18837
|
-
provide: NG_VALUE_ACCESSOR,
|
|
18838
|
-
useExisting: forwardRef(() => AutoKeyInputComponent),
|
|
18839
|
-
multi: true,
|
|
18840
|
-
},
|
|
18841
|
-
{
|
|
18842
|
-
provide: NG_VALIDATORS,
|
|
18843
|
-
useExisting: forwardRef(() => AutoKeyInputComponent),
|
|
18844
|
-
multi: true,
|
|
18845
|
-
},
|
|
18846
|
-
], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-label\n *ngIf=\"{\n mode: mode$ | async,\n idError: idError$ | async,\n editingKey: editingKey$ | async,\n } as obs\"\n [invalid]=\"!!obs.idError\"\n [invalidText]=\"obs.idError | translate\"\n>\n {{ labelTranslationKey | translate }}\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"\n obs.mode === 'add' && !obs.editingKey\n ? ('caseManagement.statuses.keyAutoGenerated' | translate)\n : (placeholderTranslationKey | translate)\n \"\n [readOnly]=\"!obs.editingKey || obs.mode === 'edit'\"\n [invalid]=\"!!obs.idError\"\n [attr.data-test-id]=\"testIds.input\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n\n <cds-icon-button\n *ngIf=\"(obs.mode === 'add' || obs.mode === 'duplicate') && !obs.editingKey\"\n [disabled]=\"$disabled()\"\n [attr.data-test-id]=\"testIds.editButton\"\n (click)=\"enableKeyEditing()\"\n kind=\"secondary\"\n >\n <svg cdsIcon=\"edit\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n\n <cds-icon-button\n *ngIf=\"obs.mode === 'add' && obs.editingKey\"\n [disabled]=\"$disabled()\"\n (click)=\"disableKeyEditing()\"\n kind=\"secondary\"\n >\n <svg cdsIcon=\"close\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n </div>\n</cds-label>\n", styles: [".edit-key-input{display:flex;align-items:center;gap:8px;width:100%}.edit-key-input input[cdsText]{flex:1 1 auto}.edit-key-input cds-icon-button{flex-shrink:0;margin-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: InputModule$1 }, { kind: "component", type: i2$3.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2$3.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2$3.IconButton, selector: "cds-icon-button, ibm-icon-button", inputs: ["buttonNgClass", "buttonAttributes", "buttonId", "kind", "size", "type", "isExpressive", "disabled", "description", "showTooltipWhenDisabled"], outputs: ["click", "focus", "blur", "tooltipClick"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
18847
|
-
}
|
|
18848
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AutoKeyInputComponent, decorators: [{
|
|
18849
|
-
type: Component,
|
|
18850
|
-
args: [{ selector: 'valtimo-auto-key-input', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
18851
|
-
CommonModule,
|
|
18852
|
-
ReactiveFormsModule,
|
|
18853
|
-
TranslateModule,
|
|
18854
|
-
InputModule$1,
|
|
18855
|
-
ButtonModule,
|
|
18856
|
-
IconModule,
|
|
18857
|
-
], providers: [
|
|
18858
|
-
{
|
|
18859
|
-
provide: NG_VALUE_ACCESSOR,
|
|
18860
|
-
useExisting: forwardRef(() => AutoKeyInputComponent),
|
|
18861
|
-
multi: true,
|
|
18862
|
-
},
|
|
18863
|
-
{
|
|
18864
|
-
provide: NG_VALIDATORS,
|
|
18865
|
-
useExisting: forwardRef(() => AutoKeyInputComponent),
|
|
18866
|
-
multi: true,
|
|
18867
|
-
},
|
|
18868
|
-
], template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-label\n *ngIf=\"{\n mode: mode$ | async,\n idError: idError$ | async,\n editingKey: editingKey$ | async,\n } as obs\"\n [invalid]=\"!!obs.idError\"\n [invalidText]=\"obs.idError | translate\"\n>\n {{ labelTranslationKey | translate }}\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"\n obs.mode === 'add' && !obs.editingKey\n ? ('caseManagement.statuses.keyAutoGenerated' | translate)\n : (placeholderTranslationKey | translate)\n \"\n [readOnly]=\"!obs.editingKey || obs.mode === 'edit'\"\n [invalid]=\"!!obs.idError\"\n [attr.data-test-id]=\"testIds.input\"\n (input)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n\n <cds-icon-button\n *ngIf=\"(obs.mode === 'add' || obs.mode === 'duplicate') && !obs.editingKey\"\n [disabled]=\"$disabled()\"\n [attr.data-test-id]=\"testIds.editButton\"\n (click)=\"enableKeyEditing()\"\n kind=\"secondary\"\n >\n <svg cdsIcon=\"edit\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n\n <cds-icon-button\n *ngIf=\"obs.mode === 'add' && obs.editingKey\"\n [disabled]=\"$disabled()\"\n (click)=\"disableKeyEditing()\"\n kind=\"secondary\"\n >\n <svg cdsIcon=\"close\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </cds-icon-button>\n </div>\n</cds-label>\n", styles: [".edit-key-input{display:flex;align-items:center;gap:8px;width:100%}.edit-key-input input[cdsText]{flex:1 1 auto}.edit-key-input cds-icon-button{flex-shrink:0;margin-left:4px}\n"] }]
|
|
18869
|
-
}], ctorParameters: () => [{ type: i2$3.IconService }], propDecorators: { labelTranslationKey: [{
|
|
18870
|
-
type: Input
|
|
18871
|
-
}], placeholderTranslationKey: [{
|
|
18872
|
-
type: Input
|
|
18873
|
-
}], mode: [{
|
|
18874
|
-
type: Input
|
|
18875
|
-
}], usedKeys: [{
|
|
18876
|
-
type: Input
|
|
18877
|
-
}], sourceText: [{
|
|
18878
|
-
type: Input
|
|
18879
|
-
}] } });
|
|
18880
|
-
|
|
18881
19827
|
/*
|
|
18882
19828
|
* Copyright 2015-2025 Ritense BV, the Netherlands.
|
|
18883
19829
|
*
|
|
@@ -19245,7 +20191,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
19245
20191
|
}] } });
|
|
19246
20192
|
|
|
19247
20193
|
/*
|
|
19248
|
-
* Copyright 2015-
|
|
20194
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
19249
20195
|
*
|
|
19250
20196
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
19251
20197
|
* you may not use this file except in compliance with the License.
|
|
@@ -19267,6 +20213,7 @@ class MdiIconSelectorComponent {
|
|
|
19267
20213
|
this.placeholderTranslationKey = 'interface.iconPlaceholder';
|
|
19268
20214
|
this.appendInline = true;
|
|
19269
20215
|
this.dropUp = false;
|
|
20216
|
+
this.fullWidth = false;
|
|
19270
20217
|
this.$disabled = signal(false);
|
|
19271
20218
|
this.value$ = new BehaviorSubject(null);
|
|
19272
20219
|
this.items$ = combineLatest([
|
|
@@ -19297,13 +20244,13 @@ class MdiIconSelectorComponent {
|
|
|
19297
20244
|
this.onChangeFn(event.key);
|
|
19298
20245
|
}
|
|
19299
20246
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MdiIconSelectorComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
19300
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: MdiIconSelectorComponent, isStandalone: true, selector: "valtimo-mdi-icon-selector", inputs: { labelTranslationKey: "labelTranslationKey", tooltipTranslationKey: "tooltipTranslationKey", placeholderTranslationKey: "placeholderTranslationKey", appendInline: "appendInline", dropUp: "dropUp" }, providers: [
|
|
20247
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: MdiIconSelectorComponent, isStandalone: true, selector: "valtimo-mdi-icon-selector", inputs: { labelTranslationKey: "labelTranslationKey", tooltipTranslationKey: "tooltipTranslationKey", placeholderTranslationKey: "placeholderTranslationKey", appendInline: "appendInline", dropUp: "dropUp", fullWidth: "fullWidth" }, providers: [
|
|
19301
20248
|
{
|
|
19302
20249
|
provide: NG_VALUE_ACCESSOR,
|
|
19303
20250
|
useExisting: forwardRef(() => MdiIconSelectorComponent),
|
|
19304
20251
|
multi: true,
|
|
19305
20252
|
},
|
|
19306
|
-
], ngImport: i0, template: "<!--\n ~ Copyright 2015-
|
|
20253
|
+
], ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-text-label>\n <v-input-label\n [title]=\"labelTranslationKey | translate\"\n [tooltip]=\"tooltipTranslationKey | translate\"\n >\n </v-input-label>\n\n <div class=\"mdi-icon-selector\" [class.mdi-icon-selector--full-width]=\"fullWidth\">\n <span class=\"mdi-icon-preview mdi\" [ngClass]=\"(value$ | async) || 'mdi-minus'\"></span>\n\n <cds-combo-box\n [items]=\"(items$ | async) || []\"\n [placeholder]=\"placeholderTranslationKey | translate\"\n [disabled]=\"$disabled()\"\n (selected)=\"onSelected($event)\"\n [appendInline]=\"appendInline\"\n [dropUp]=\"dropUp\"\n (blur)=\"onTouched()\"\n >\n <cds-dropdown-list [listTpl]=\"iconListTemplate\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n</cds-text-label>\n\n<ng-template #iconListTemplate let-item=\"item\">\n <div class=\"mdi-list-item\">\n <span class=\"mdi\" [ngClass]=\"item.key\" aria-hidden=\"true\"></span>\n\n <span>{{ item.content }}</span>\n </div>\n</ng-template>\n", styles: [".mdi-icon-selector{display:flex;align-items:center;gap:8px;width:350px}.mdi-icon-selector cds-combo-box{flex:1 1 auto;min-width:0}.mdi-icon-selector--full-width{width:100%}:host ::ng-deep .cds--list-box{background:var(--cds-field)}.mdi-icon-preview{width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:18px}.mdi-list-item{display:flex;flex-direction:row;gap:8px;align-items:center}.mdi-list-item .mdi{font-size:16px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ComboBoxModule }, { kind: "component", type: i2$3.ComboBox, selector: "cds-combo-box, ibm-combo-box", inputs: ["placeholder", "openMenuAria", "closeMenuAria", "clearSelectionsTitle", "clearSelectionsAria", "clearSelectionTitle", "clearSelectionAria", "id", "labelId", "items", "type", "size", "itemValueKey", "label", "hideLabel", "helperText", "appendInline", "invalid", "invalidText", "warn", "warnText", "maxLength", "theme", "selectionFeedback", "autocomplete", "dropUp", "disabled", "readonly", "fluid"], outputs: ["selected", "submit", "close", "search", "clear"] }, { kind: "component", type: i2$3.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: InputModule$1 }, { kind: "component", type: i2$3.TextInputLabelComponent, selector: "cds-text-label, ibm-text-label", inputs: ["labelInputID", "disabled", "skeleton", "labelTemplate", "textInputTemplate", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel", "fluid"] }, { kind: "ngmodule", type: IconModule }, { kind: "ngmodule", type: TagModule }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
19307
20254
|
}
|
|
19308
20255
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MdiIconSelectorComponent, decorators: [{
|
|
19309
20256
|
type: Component,
|
|
@@ -19322,7 +20269,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
19322
20269
|
useExisting: forwardRef(() => MdiIconSelectorComponent),
|
|
19323
20270
|
multi: true,
|
|
19324
20271
|
},
|
|
19325
|
-
], template: "<!--\n ~ Copyright 2015-
|
|
20272
|
+
], template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-text-label>\n <v-input-label\n [title]=\"labelTranslationKey | translate\"\n [tooltip]=\"tooltipTranslationKey | translate\"\n >\n </v-input-label>\n\n <div class=\"mdi-icon-selector\" [class.mdi-icon-selector--full-width]=\"fullWidth\">\n <span class=\"mdi-icon-preview mdi\" [ngClass]=\"(value$ | async) || 'mdi-minus'\"></span>\n\n <cds-combo-box\n [items]=\"(items$ | async) || []\"\n [placeholder]=\"placeholderTranslationKey | translate\"\n [disabled]=\"$disabled()\"\n (selected)=\"onSelected($event)\"\n [appendInline]=\"appendInline\"\n [dropUp]=\"dropUp\"\n (blur)=\"onTouched()\"\n >\n <cds-dropdown-list [listTpl]=\"iconListTemplate\"></cds-dropdown-list>\n </cds-combo-box>\n </div>\n</cds-text-label>\n\n<ng-template #iconListTemplate let-item=\"item\">\n <div class=\"mdi-list-item\">\n <span class=\"mdi\" [ngClass]=\"item.key\" aria-hidden=\"true\"></span>\n\n <span>{{ item.content }}</span>\n </div>\n</ng-template>\n", styles: [".mdi-icon-selector{display:flex;align-items:center;gap:8px;width:350px}.mdi-icon-selector cds-combo-box{flex:1 1 auto;min-width:0}.mdi-icon-selector--full-width{width:100%}:host ::ng-deep .cds--list-box{background:var(--cds-field)}.mdi-icon-preview{width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:18px}.mdi-list-item{display:flex;flex-direction:row;gap:8px;align-items:center}.mdi-list-item .mdi{font-size:16px}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
19326
20273
|
}], ctorParameters: () => [{ type: i1.TranslateService }], propDecorators: { labelTranslationKey: [{
|
|
19327
20274
|
type: Input
|
|
19328
20275
|
}], tooltipTranslationKey: [{
|
|
@@ -19333,6 +20280,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
19333
20280
|
type: Input
|
|
19334
20281
|
}], dropUp: [{
|
|
19335
20282
|
type: Input
|
|
20283
|
+
}], fullWidth: [{
|
|
20284
|
+
type: Input
|
|
19336
20285
|
}] } });
|
|
19337
20286
|
|
|
19338
20287
|
/*
|
|
@@ -21079,5 +22028,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
21079
22028
|
* Generated bundle index. Do not edit.
|
|
21080
22029
|
*/
|
|
21081
22030
|
|
|
21082
|
-
export { ARBITRARY_AMOUNT_VALUE_TEST_IDS, AUTO_KEY_INPUT_TEST_IDS, AdminSettingsService, Alert, AlertComponent, AlertModule, AlertService, AlertType, AlertsOptionsImpl, AssignmentComponent, AutoKeyInputComponent, BOOLEAN_CONVERTER_VALUES, BpmnJsDiagramComponent, BpmnJsDiagramModule, BreadcrumbNavigationComponent, BreadcrumbNavigationModule, BreadcrumbService, CARBON_CONSTANTS, CARBON_THEME, CASES_WITHOUT_STATUS_KEY, COLOR_PICKER_TEST_IDS, CONFIRMATION_MODAL_TEST_IDS, CamundaFormComponent, CamundaFormModule, CarbonListComponent, CarbonListFilterPipe, CarbonListModule, CarbonMultiInputComponent, CarbonMultiInputModule, CarbonNoResultsComponent, CaseCountPipe, CaseTagsSelectorComponent, CdsThemeService, ChoiceFieldService, ColorPickerComponent, ComponentsPipesModule, ConfirmationModalComponent, ConfirmationModalModule, ContextMenuDirective, CtrlClickDirective, CurrentCarbonTheme, DEFAULT_LIST_TRANSLATIONS, DEFAULT_PAGINATION, DEFAULT_PAGINATOR_CONFIG, DataListComponent, DataListModule, DatePickerComponent, DatePickerModule, DateTimePickerComponent, DigitOnlyDirective, DropzoneComponent, DropzoneModule, EditorComponent, EditorModule, EllipsisPipe, ExpansionPanelComponent, ExpansionPanelModule, FieldAutoFocusDirective, FieldAutoFocusModule, FileSizeModule, FileSizePipe, FilterSidebarComponent, FilterSidebarModule, FitPageDirective, FormComponent, FormIoCurrencyComponent, FormIoCurrentUserComponent, FormIoDomService, FormIoIbanComponent, FormIoMailPreviewComponent, FormIoModule, FormIoStateService, FormIoTagsService, FormIoUploaderComponent, FormModule, FormioBuilderComponent, FormioComponent, FormioDummyComponent, FormioOptionsImpl, FormioValueResolverSelectorComponent, InputComponent, InputLabelComponent, InputLabelModule, InputModule, IsArrayPipe, JSON_EDITOR_TEST_IDS, JsonEditorComponent, KEY_DROPDOWN_VALUE_TEST_IDS, KEY_VALUE_PATH_SELECTOR_TEST_IDS, KEY_VALUE_TEST_IDS, KeyGeneratorService, LeftSidebarComponent, LeftSidebarModule, ListColumnViewComponent, MULTI_INPUT_TEST_IDS, MdiIconSelectorComponent, MdiIconViewerComponent, MenuItemTextComponent, MenuItemTranslationPipe, MenuModule, MenuRoutingModule, MenuService, ModalComponent, ModalModule, ModalService, MonacoTheme, MoveRowDirection, MultiInputFormComponent, MultiInputFormModule, MultiselectDropdownComponent, MultiselectDropdownModule, MuuriDirective, MuuriDirectiveModule, MuuriItemComponent, ObjectManagementSelectComponent, ObjectManagementSelectService, ObserveSizeDirective, OverflowMenuComponent, OverflowMenuModule, OverflowMenuOptionComponent, OverflowMenuTriggerComponent, POPULAR_MDI_ICONS, PageHeaderComponent, PageHeaderModule, PageHeaderService, PageSubtitleService, PageTitleComponent, PageTitleModule, PageTitleService, ParagraphComponent, ParagraphModule, PendingChangesComponent, PendingChangesService, ProgressBarComponent, ProgressBarModule, PromptComponent, PromptModule, PromptService, QUICK_SEARCH_SERVICE, QuickSearchComponent, QuickSearchStateService, RIGHT_SIDEBAR_TEST_IDS, RadioComponent, RadioModule, ReadOnlyDirective, RemoveClassnamesDirective, RenderInBodyComponent, RenderInPageHeaderDirective, RenderPageHeaderDirective, RightSidebarComponent, RightSidebarModule, SCHEMA_EDITOR_REQUIRED_PROPERTY_TEST_ID_PREFIX, SCHEMA_EDITOR_TEST_IDS, SEARCH_FIELDS_TEST_IDS, SEARCH_FIELD_TEST_ID_PREFIX, SINGLE_VALUE_TEST_IDS, STEPPER_FOOTER_STEP_TEST_IDS, SchemaEditorComponent, SearchFieldsComponent, SearchFieldsModule, SelectComponent, SelectModule, SelectableCarbonTheme, ShellService, SpinnerComponent, SpinnerModule, StatusSelectorComponent, StepperContainerComponent, StepperContentComponent, StepperFooterComponent, StepperFooterStepComponent, StepperHeaderComponent, StepperModule, StepperService, StepperStepComponent, TAG_ELLIPSIS_LIMIT, TableComponent, TableModule, TimelineComponent, TimelineItemImpl, TimelineModule, TooltipComponent, TooltipDirective, TooltipIconComponent, TooltipIconModule, TooltipModule, TopbarComponent, TopbarModule, UploaderComponent, UploaderDragDropDirective, UploaderModule, UserInterfaceService, VALUE_PATH_SELECTOR_DROPDOWN_VALUE_TEST_IDS, VALUE_PATH_SELECTOR_TEST_IDS, VALUE_PATH_SELECTOR_VALUE_TEST_IDS, VModalComponent, VModalModule, ValtimoCdsModalDirective, ValtimoModalService, ValuePathSelectorComponent, ValuePathSelectorInputMode, ValuePathSelectorPrefix, ValuePathSelectorService, ValuePathType, ViewContentService, ViewType, WIDGET_LAYOUT_TRANSLATION_KEYS, WIDGET_LAYOUT_VALUES, WIDGET_ROW_HEIGHT_DEFAULT, WIDGET_ROW_HEIGHT_GAP_FREE, WebcamComponent, WebcamModule, WidgetComponent, WidgetLayout, WidgetLayoutInfoComponent, WidgetModule, applyDataGridPatch, collectObjectLevels, createCustomFormioComponent, customUploaderType, enableCustomFormioComponents, menuInitializer, muuriGapFreeLayout, pendingChangesGuard, registerCustomFormioComponent, registerCustomTag, registerFormioCurrencyComponent, registerFormioCurrentUserComponent, registerFormioFileSelectorComponent, registerFormioIbanComponent, registerFormioMailPreviewComponent, registerFormioUploadComponent, registerFormioValueResolverSelectorComponent, registerObjectManagementSelectFormioComponent, resolveWidgetLayout, runAfterCarbonModalClosed, setRequiredOnSchema };
|
|
22031
|
+
export { ARBITRARY_AMOUNT_VALUE_TEST_IDS, AUTO_KEY_INPUT_TEST_IDS, AdminSettingsService, Alert, AlertComponent, AlertModule, AlertService, AlertType, AlertsOptionsImpl, AssignmentComponent, AutoKeyInputComponent, BOOLEAN_CONVERTER_VALUES, BpmnJsDiagramComponent, BpmnJsDiagramModule, BreadcrumbNavigationComponent, BreadcrumbNavigationModule, BreadcrumbService, CARBON_CONSTANTS, CARBON_THEME, CASES_WITHOUT_STATUS_KEY, COLOR_PICKER_TEST_IDS, CONFIRMATION_MODAL_TEST_IDS, CamundaFormComponent, CamundaFormModule, CarbonListComponent, CarbonListFilterPipe, CarbonListModule, CarbonMultiInputComponent, CarbonMultiInputModule, CarbonNoResultsComponent, CaseCountPipe, CaseTagsSelectorComponent, CdsThemeService, ChoiceFieldService, ColorPickerComponent, ComponentsPipesModule, ConfirmationModalComponent, ConfirmationModalModule, ContextMenuDirective, CtrlClickDirective, CurrentCarbonTheme, DEFAULT_LIST_TRANSLATIONS, DEFAULT_PAGINATION, DEFAULT_PAGINATOR_CONFIG, DataListComponent, DataListModule, DatePickerComponent, DatePickerModule, DateTimePickerComponent, DigitOnlyDirective, DragDropListComponent, DropzoneComponent, DropzoneModule, EditorComponent, EditorModule, EllipsisPipe, ExpansionPanelComponent, ExpansionPanelModule, FieldAutoFocusDirective, FieldAutoFocusModule, FileSizeModule, FileSizePipe, FilterSidebarComponent, FilterSidebarModule, FitPageDirective, FormComponent, FormIoCurrencyComponent, FormIoCurrentUserComponent, FormIoDomService, FormIoIbanComponent, FormIoMailPreviewComponent, FormIoModule, FormIoStateService, FormIoTagsService, FormIoUploaderComponent, FormModule, FormioBuilderComponent, FormioComponent, FormioDummyComponent, FormioOptionsImpl, FormioValueResolverSelectorComponent, InputComponent, InputLabelComponent, InputLabelModule, InputModule, IsArrayPipe, JSON_EDITOR_TEST_IDS, JsonEditorComponent, KEY_DROPDOWN_VALUE_TEST_IDS, KEY_VALUE_PATH_SELECTOR_TEST_IDS, KEY_VALUE_TEST_IDS, KeyGeneratorService, LeftSidebarComponent, LeftSidebarModule, ListColumnViewComponent, MENU_CONFIGURATION_VERSION, MENU_ITEM_CATALOG, MULTI_INPUT_TEST_IDS, MdiIconSelectorComponent, MdiIconViewerComponent, MenuItemTextComponent, MenuItemTranslationPipe, MenuModule, MenuRoutingModule, MenuService, ModalComponent, ModalModule, ModalService, MonacoTheme, MoveRowDirection, MultiInputFormComponent, MultiInputFormModule, MultiselectDropdownComponent, MultiselectDropdownModule, MuuriDirective, MuuriDirectiveModule, MuuriItemComponent, ObjectManagementSelectComponent, ObjectManagementSelectService, ObserveSizeDirective, OverflowMenuComponent, OverflowMenuModule, OverflowMenuOptionComponent, OverflowMenuTriggerComponent, PLUGIN_PAGE_ROUTE, POPULAR_MDI_ICONS, PageHeaderComponent, PageHeaderModule, PageHeaderService, PageSubtitleService, PageTitleComponent, PageTitleModule, PageTitleService, ParagraphComponent, ParagraphModule, PendingChangesComponent, PendingChangesService, ProgressBarComponent, ProgressBarModule, PromptComponent, PromptModule, PromptService, QUICK_SEARCH_SERVICE, QuickSearchComponent, QuickSearchStateService, RIGHT_SIDEBAR_TEST_IDS, RadioComponent, RadioModule, ReadOnlyDirective, RemoveClassnamesDirective, RenderInBodyComponent, RenderInPageHeaderDirective, RenderPageHeaderDirective, RightSidebarComponent, RightSidebarModule, SCHEMA_EDITOR_REQUIRED_PROPERTY_TEST_ID_PREFIX, SCHEMA_EDITOR_TEST_IDS, SEARCH_FIELDS_TEST_IDS, SEARCH_FIELD_TEST_ID_PREFIX, SECTION_HEADER_TEXT_CLASS, SINGLE_VALUE_TEST_IDS, STEPPER_FOOTER_STEP_TEST_IDS, SchemaEditorComponent, SearchFieldsComponent, SearchFieldsModule, SelectComponent, SelectModule, SelectableCarbonTheme, ShellService, SpinnerComponent, SpinnerModule, StatusSelectorComponent, StepperContainerComponent, StepperContentComponent, StepperFooterComponent, StepperFooterStepComponent, StepperHeaderComponent, StepperModule, StepperService, StepperStepComponent, TAG_ELLIPSIS_LIMIT, TableComponent, TableModule, TimelineComponent, TimelineItemImpl, TimelineModule, TooltipComponent, TooltipDirective, TooltipIconComponent, TooltipIconModule, TooltipModule, TopbarComponent, TopbarModule, UploaderComponent, UploaderDragDropDirective, UploaderModule, UserInterfaceService, VALUE_PATH_SELECTOR_DROPDOWN_VALUE_TEST_IDS, VALUE_PATH_SELECTOR_TEST_IDS, VALUE_PATH_SELECTOR_VALUE_TEST_IDS, VModalComponent, VModalModule, ValtimoCdsModalDirective, ValtimoModalService, ValuePathSelectorComponent, ValuePathSelectorInputMode, ValuePathSelectorPrefix, ValuePathSelectorService, ValuePathType, ViewContentService, ViewType, WIDGET_LAYOUT_TRANSLATION_KEYS, WIDGET_LAYOUT_VALUES, WIDGET_ROW_HEIGHT_DEFAULT, WIDGET_ROW_HEIGHT_GAP_FREE, WebcamComponent, WebcamModule, WidgetComponent, WidgetLayout, WidgetLayoutInfoComponent, WidgetModule, applyDataGridPatch, buildMenuConfigurationFromRuntimeMenu, collectObjectLevels, createCustomFormioComponent, customUploaderType, enableCustomFormioComponents, findMenuCatalogEntryByLink, findMenuCatalogGroupEntryByTitle, getMenuCatalogEntry, hasSavedMenuConfiguration, includeFunctionToName, menuInitializer, menuLinkToString, muuriGapFreeLayout, normaliseMenuLink, parseIncludeFunction, pendingChangesGuard, registerCustomFormioComponent, registerCustomTag, registerFormioCurrencyComponent, registerFormioCurrentUserComponent, registerFormioFileSelectorComponent, registerFormioIbanComponent, registerFormioMailPreviewComponent, registerFormioUploadComponent, registerFormioValueResolverSelectorComponent, registerObjectManagementSelectFormioComponent, resolveMenuConfiguration, resolveWidgetLayout, runAfterCarbonModalClosed, serializeIncludeFunction, setRequiredOnSchema };
|
|
21083
22032
|
//# sourceMappingURL=valtimo-components.mjs.map
|