@valtimo/components 13.49.1 → 13.50.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/assets/css/compatibility.scss +1 -1
  2. package/fesm2022/valtimo-components.mjs +428 -34
  3. package/fesm2022/valtimo-components.mjs.map +1 -1
  4. package/lib/components/assign-user/assignment.component.d.ts +4 -1
  5. package/lib/components/assign-user/assignment.component.d.ts.map +1 -1
  6. package/lib/components/form-io/components/form-io-mail-preview/mail-preview.component.d.ts.map +1 -1
  7. package/lib/components/form-io/components/form-io-mail-preview/sanitize-email-html.d.ts +2 -0
  8. package/lib/components/form-io/components/form-io-mail-preview/sanitize-email-html.d.ts.map +1 -0
  9. package/lib/components/page-header/page-header.component.d.ts +3 -1
  10. package/lib/components/page-header/page-header.component.d.ts.map +1 -1
  11. package/lib/components/side-panel/side-panel.component.d.ts +47 -0
  12. package/lib/components/side-panel/side-panel.component.d.ts.map +1 -0
  13. package/lib/constants/components.test-ids.d.ts +9 -0
  14. package/lib/constants/components.test-ids.d.ts.map +1 -1
  15. package/lib/directives/render-in-page-header/render-in-page-header.directive.d.ts +3 -1
  16. package/lib/directives/render-in-page-header/render-in-page-header.directive.d.ts.map +1 -1
  17. package/lib/models/index.d.ts +1 -0
  18. package/lib/models/index.d.ts.map +1 -1
  19. package/lib/models/side-panel.model.d.ts +48 -0
  20. package/lib/models/side-panel.model.d.ts.map +1 -0
  21. package/lib/services/index.d.ts +1 -0
  22. package/lib/services/index.d.ts.map +1 -1
  23. package/lib/services/page-title.service.d.ts +10 -0
  24. package/lib/services/page-title.service.d.ts.map +1 -1
  25. package/lib/services/side-panel.service.d.ts +40 -0
  26. package/lib/services/side-panel.service.d.ts.map +1 -0
  27. package/lib/utils/index.d.ts +1 -0
  28. package/lib/utils/index.d.ts.map +1 -1
  29. package/lib/utils/observer.utils.d.ts +15 -0
  30. package/lib/utils/observer.utils.d.ts.map +1 -0
  31. package/package.json +2 -1
  32. package/public_api.d.ts +1 -0
  33. package/public_api.d.ts.map +1 -1
@@ -1,17 +1,17 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Pipe, NgModule, Injectable, RendererStyleFlags2, Inject, signal, computed, Input, Component, Directive, EventEmitter, Output, ViewContainerRef, ViewChild, HostBinding, HostListener, ChangeDetectionStrategy, ContentChildren, ViewEncapsulation, inject, TemplateRef, ContentChild, ElementRef, forwardRef } from '@angular/core';
3
- import { combineLatest, map, BehaviorSubject, switchMap, catchError, of, shareReplay, tap, Subscription, Observable, filter as filter$1, fromEvent, Subject, take as take$1, interval, takeUntil, merge, startWith, debounceTime as debounceTime$1, timer, first } from 'rxjs';
2
+ import { InjectionToken, Pipe, NgModule, Injectable, RendererStyleFlags2, Inject, signal, computed, Input, Component, Directive, EventEmitter, Output, ViewContainerRef, ViewChild, HostBinding, HostListener, ChangeDetectionStrategy, ContentChildren, ViewEncapsulation, effect, inject, TemplateRef, ContentChild, ElementRef, forwardRef } from '@angular/core';
3
+ import { combineLatest, map, BehaviorSubject, switchMap, catchError, of, shareReplay, tap, Subscription, Observable, filter as filter$1, fromEvent, Subject, take as take$1, interval, distinctUntilChanged, takeUntil, merge, isObservable, startWith, debounceTime as debounceTime$1, timer, first } from 'rxjs';
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
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
- 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';
10
+ import { filter, map as map$1, take, tap as tap$1, debounceTime, distinctUntilChanged as distinctUntilChanged$1, takeUntil as takeUntil$1, startWith as startWith$1, switchMap as switchMap$1, delay } from 'rxjs/operators';
11
11
  import * as i1$4 from '@angular/common';
12
- import { DOCUMENT, CommonModule, registerLocaleData, CurrencyPipe, DecimalPipe, PercentPipe } from '@angular/common';
12
+ import { DOCUMENT, CommonModule, NgComponentOutlet, registerLocaleData, CurrencyPipe, DecimalPipe, PercentPipe } from '@angular/common';
13
13
  import * as i1$3 from '@angular/router';
14
- import { NavigationEnd, NavigationStart, ResolveEnd, RouterModule } from '@angular/router';
14
+ import { NavigationEnd, NavigationStart, ResolveEnd, RouterModule, RouterLink } from '@angular/router';
15
15
  import * as i2 from '@angular/forms';
16
16
  import { Validators, UntypedFormControl, ReactiveFormsModule, FormsModule, FormControl, FormGroup, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
17
17
  import { deepmerge } from 'deepmerge-ts';
@@ -24,7 +24,7 @@ import moment from 'moment';
24
24
  import User20 from '@carbon/icons/es/user/20';
25
25
  import * as i2$2 from 'keycloak-angular';
26
26
  import * as i2$3 from 'carbon-components-angular';
27
- import { UIShellModule, IconModule, LinkModule, GridModule, TabsModule, StructuredListModule, ToggleModule, TagModule, DropdownModule, LayerModule, SkeletonModule, LoadingModule, Table, TableHeaderItem, TableModel, TableItem, PaginationModule, TableModule as TableModule$1, ContentSwitcherModule, ButtonModule, DialogModule, ModalModule as ModalModule$1, BreadcrumbModule, InputModule as InputModule$1, ComboBoxModule, ComboBox, CheckboxModule, AccordionModule, DatePickerModule as DatePickerModule$1, TimePickerModule, ModalButtonType, TilesModule, SelectModule as SelectModule$1, RadioModule as RadioModule$1, ModalService as ModalService$1, TooltipModule as TooltipModule$1, NotificationModule, ContextMenuModule, ToggletipModule } from 'carbon-components-angular';
27
+ import { UIShellModule, IconModule, LinkModule, GridModule, TabsModule, StructuredListModule, ToggleModule, TagModule, DropdownModule, LayerModule, ButtonModule, TooltipModule as TooltipModule$1, SkeletonModule, LoadingModule, Table, TableHeaderItem, TableModel, TableItem, PaginationModule, TableModule as TableModule$1, ContentSwitcherModule, DialogModule, ModalModule as ModalModule$1, BreadcrumbModule, InputModule as InputModule$1, ComboBoxModule, ComboBox, CheckboxModule, AccordionModule, DatePickerModule as DatePickerModule$1, TimePickerModule, ModalButtonType, TilesModule, SelectModule as SelectModule$1, RadioModule as RadioModule$1, ModalService as ModalService$1, NotificationModule, ContextMenuModule, ToggletipModule } from 'carbon-components-angular';
28
28
  import * as i6 from '@angular/platform-browser';
29
29
  import * as i2$1 from 'ngx-skeleton-loader';
30
30
  import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@@ -35,7 +35,8 @@ import { NgbTooltipModule, NgbPaginationModule } from '@ng-bootstrap/ng-bootstra
35
35
  import { autoUpdate, computePosition, offset, flip, shift, hide } from '@floating-ui/dom';
36
36
  import * as i3 from '@angular/cdk/drag-drop';
37
37
  import { DragDropModule } from '@angular/cdk/drag-drop';
38
- import { Draggable16, OverflowMenuVertical16, ArrowDown16, ArrowUp16, SettingsView16, View16, ViewOff16, ChevronUp16, ChevronDown16, Close16, Add16, Edit16, TrashCan16, Save16, WarningAltFilled16, WarningFilled16, DocumentRequirements16, UserFollow16, Group16, User16 } from '@carbon/icons';
38
+ import { Draggable16, Close16, PinFilled16, OverflowMenuVertical16, ArrowDown16, ArrowUp16, SettingsView16, View16, ViewOff16, ChevronUp16, ChevronDown16, Add16, Edit16, TrashCan16, Save16, WarningAltFilled16, WarningFilled16, DocumentRequirements16, UserFollow16, Group16, User16 } from '@carbon/icons';
39
+ import { toSignal, toObservable } from '@angular/core/rxjs-interop';
39
40
  import * as i3$1 from '@angular/cdk/layout';
40
41
  import { LayoutModule } from '@angular/cdk/layout';
41
42
  import localeNl from '@angular/common/locales/nl';
@@ -55,6 +56,7 @@ import { OverlayModule, Overlay } from '@angular/cdk/overlay';
55
56
  import Currency from '@tadashi/currency';
56
57
  import flatpickr from 'flatpickr';
57
58
  import { Dutch } from 'flatpickr/dist/l10n/nl';
59
+ import createDOMPurify from 'dompurify';
58
60
  import * as i2$4 from 'ngx-spinner';
59
61
  import { NgxSpinnerModule } from 'ngx-spinner';
60
62
  import Search16 from '@carbon/icons/es/search/16';
@@ -779,6 +781,22 @@ var ValuePathSelectorInputMode;
779
781
  * limitations under the License.
780
782
  */
781
783
 
784
+ /*
785
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
786
+ *
787
+ * Licensed under EUPL, Version 1.2 (the "License");
788
+ * you may not use this file except in compliance with the License.
789
+ * You may obtain a copy of the License at
790
+ *
791
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
792
+ *
793
+ * Unless required by applicable law or agreed to in writing, software
794
+ * distributed under the License is distributed on an "AS IS" basis,
795
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
796
+ * See the License for the specific language governing permissions and
797
+ * limitations under the License.
798
+ */
799
+
782
800
  /*
783
801
  * Copyright 2015-2025 Ritense BV, the Netherlands.
784
802
  *
@@ -1185,6 +1203,15 @@ const SEARCH_FIELDS_TEST_IDS = {
1185
1203
  * itself is one level down.
1186
1204
  */
1187
1205
  const SEARCH_FIELD_TEST_ID_PREFIX = 'searchField-';
1206
+ const SIDE_PANEL_TEST_IDS = {
1207
+ panel: 'sidePanel',
1208
+ closeButton: 'sidePanelCloseButton',
1209
+ resizeHandle: 'sidePanelResizeHandle',
1210
+ subtitleLink: 'sidePanelSubtitleLink',
1211
+ pinnedIcon: 'sidePanelPinnedIcon',
1212
+ origin: 'sidePanelOrigin',
1213
+ originElsewhere: 'sidePanelOriginElsewhere',
1214
+ };
1188
1215
 
1189
1216
  /*
1190
1217
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -2017,6 +2044,12 @@ class PageTitleService {
2017
2044
  get pageActionsFullWidth$() {
2018
2045
  return this._pageActionsFullWidth$.asObservable();
2019
2046
  }
2047
+ get pageActionsWrap$() {
2048
+ return this._pageActionsWrap$.asObservable();
2049
+ }
2050
+ get pageActionsMinWidth$() {
2051
+ return this._pageActionsMinWidth$.asObservable();
2052
+ }
2020
2053
  get pageTitleHidden$() {
2021
2054
  return this._pageTitleHidden$.asObservable();
2022
2055
  }
@@ -2032,6 +2065,8 @@ class PageTitleService {
2032
2065
  this._customPageSubtitleSet$ = new BehaviorSubject(false);
2033
2066
  this._hasPageActions$ = new BehaviorSubject(false);
2034
2067
  this._pageActionsFullWidth$ = new BehaviorSubject(false);
2068
+ this._pageActionsWrap$ = new BehaviorSubject(false);
2069
+ this._pageActionsMinWidth$ = new BehaviorSubject(null);
2035
2070
  this._pageActionsViewContainerRef$ = new BehaviorSubject(null);
2036
2071
  this._pageTitleHidden$ = new BehaviorSubject(false);
2037
2072
  this._currentTitle$ = new BehaviorSubject('');
@@ -2067,6 +2102,16 @@ class PageTitleService {
2067
2102
  setPageActionsFullWidth(value) {
2068
2103
  this._pageActionsFullWidth$.next(value);
2069
2104
  }
2105
+ setPageActionsWrap(value) {
2106
+ this._pageActionsWrap$.next(value);
2107
+ }
2108
+ /**
2109
+ * The narrowest width wrapping page actions can adapt to. They stay beside the title as long as
2110
+ * this fits; null means their natural width.
2111
+ */
2112
+ setPageActionsMinWidth(width) {
2113
+ this._pageActionsMinWidth$.next(width);
2114
+ }
2070
2115
  setCustomPageTitleSet(set) {
2071
2116
  this._customPageTitleSet$.next(set);
2072
2117
  }
@@ -2097,6 +2142,8 @@ class PageTitleService {
2097
2142
  if (pageActionsViewContainerRef && !preventReset) {
2098
2143
  pageActionsViewContainerRef.clear();
2099
2144
  this.setHasPageActions(false);
2145
+ this.setPageActionsWrap(false);
2146
+ this.setPageActionsMinWidth(null);
2100
2147
  }
2101
2148
  }))
2102
2149
  .subscribe();
@@ -2901,6 +2948,163 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
2901
2948
  }]
2902
2949
  }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i1$2.ConfigService }] });
2903
2950
 
2951
+ /*
2952
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
2953
+ *
2954
+ * Licensed under EUPL, Version 1.2 (the "License");
2955
+ * you may not use this file except in compliance with the License.
2956
+ * You may obtain a copy of the License at
2957
+ *
2958
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2959
+ *
2960
+ * Unless required by applicable law or agreed to in writing, software
2961
+ * distributed under the License is distributed on an "AS IS" basis,
2962
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2963
+ * See the License for the specific language governing permissions and
2964
+ * limitations under the License.
2965
+ */
2966
+ const SIDE_PANEL_WIDTH_STORAGE_KEY = 'sidePanelWidth';
2967
+ const SIDE_PANEL_DEFAULT_WIDTH = 480;
2968
+ const SIDE_PANEL_MIN_WIDTH = 320;
2969
+ const SIDE_PANEL_MAX_WIDTH = 960;
2970
+ class SidePanelHandleImpl {
2971
+ constructor(_onHide, _onWithdraw) {
2972
+ this._onHide = _onHide;
2973
+ this._onWithdraw = _onWithdraw;
2974
+ this._dismissed$ = new Subject();
2975
+ this._replaced$ = new Subject();
2976
+ this._resized$ = new Subject();
2977
+ this.dismissed$ = this._dismissed$.asObservable();
2978
+ this.replaced$ = this._replaced$.asObservable();
2979
+ this.resized$ = this._resized$.asObservable();
2980
+ }
2981
+ hide() {
2982
+ this._onHide(this);
2983
+ }
2984
+ withdraw() {
2985
+ this._onWithdraw(this);
2986
+ }
2987
+ notifyDismissed() {
2988
+ this._dismissed$.next();
2989
+ }
2990
+ notifyReplaced() {
2991
+ this._replaced$.next();
2992
+ this._dismissed$.complete();
2993
+ this._replaced$.complete();
2994
+ this._resized$.complete();
2995
+ }
2996
+ notifyResized(width) {
2997
+ this._resized$.next(width);
2998
+ }
2999
+ }
3000
+ /**
3001
+ * App-wide side panel next to the routed content. Knows nothing about what it shows: providers
3002
+ * offer content, the latest offer takes over. Dismissing only hides; the content stays alive until
3003
+ * withdrawn or replaced.
3004
+ */
3005
+ class SidePanelService {
3006
+ constructor() {
3007
+ this._current$ = new BehaviorSubject(null);
3008
+ this._visible$ = new BehaviorSubject(false);
3009
+ this._preferredWidth$ = new BehaviorSubject(this.loadWidth());
3010
+ /** Width of content that brings its own; such content persists it, not the panel. */
3011
+ this._contentWidth$ = new BehaviorSubject(null);
3012
+ this._currentHandle = null;
3013
+ }
3014
+ get current$() {
3015
+ return this._current$.asObservable();
3016
+ }
3017
+ get visible$() {
3018
+ return this._visible$.asObservable();
3019
+ }
3020
+ /** The content's own width or else the user's preferred width, widened to the content's minimum. */
3021
+ get width$() {
3022
+ return combineLatest([this._preferredWidth$, this._contentWidth$, this._current$]).pipe(map(([preferred, contentWidth, current]) => this.clampWidth(Math.max(contentWidth ?? preferred, current?.minWidth ?? 0))), distinctUntilChanged());
3023
+ }
3024
+ dismiss() {
3025
+ if (!this._visible$.getValue())
3026
+ return;
3027
+ this._visible$.next(false);
3028
+ this._currentHandle?.notifyDismissed();
3029
+ }
3030
+ offer(offer) {
3031
+ const current = this._current$.getValue();
3032
+ if (this._currentHandle && current?.key === offer.key) {
3033
+ // Only a changed width from the provider wins over a resize it has not caught up with yet.
3034
+ if (offer.width !== current.width)
3035
+ this._contentWidth$.next(offer.width ?? null);
3036
+ this._current$.next(offer);
3037
+ this._visible$.next(true);
3038
+ return this._currentHandle;
3039
+ }
3040
+ this._currentHandle?.notifyReplaced();
3041
+ const handle = new SidePanelHandleImpl(hidden => this.hideHandle(hidden), withdrawn => this.withdrawHandle(withdrawn));
3042
+ this._currentHandle = handle;
3043
+ this._contentWidth$.next(offer.width ?? null);
3044
+ this._current$.next(offer);
3045
+ this._visible$.next(true);
3046
+ return handle;
3047
+ }
3048
+ /**
3049
+ * Shows retained content again, also when hidden via `SidePanelHandle.hide()`. Does not notify
3050
+ * the provider.
3051
+ */
3052
+ reopen() {
3053
+ if (this._current$.getValue())
3054
+ this._visible$.next(true);
3055
+ }
3056
+ /** Withdraws the current content only when it still carries [key]. */
3057
+ withdraw(key) {
3058
+ if (this._current$.getValue()?.key === key && this._currentHandle) {
3059
+ this.withdrawHandle(this._currentHandle);
3060
+ }
3061
+ }
3062
+ /** Resizes live. Call [endResize] once the user lets go. */
3063
+ setWidth(width) {
3064
+ const clamped = this.clampWidth(width);
3065
+ if (this._contentWidth$.getValue() !== null) {
3066
+ this._contentWidth$.next(clamped);
3067
+ return;
3068
+ }
3069
+ this._preferredWidth$.next(clamped);
3070
+ localStorage.setItem(SIDE_PANEL_WIDTH_STORAGE_KEY, `${clamped}`);
3071
+ }
3072
+ /** Reports the final width to the provider of the current content. */
3073
+ endResize() {
3074
+ this._currentHandle?.notifyResized(this._contentWidth$.getValue() ?? this._preferredWidth$.getValue());
3075
+ }
3076
+ clampWidth(width) {
3077
+ const max = Math.min(SIDE_PANEL_MAX_WIDTH, Math.floor(window.innerWidth * 0.6));
3078
+ return Math.round(Math.max(SIDE_PANEL_MIN_WIDTH, Math.min(width, max)));
3079
+ }
3080
+ hideHandle(handle) {
3081
+ if (handle === this._currentHandle && this._visible$.getValue())
3082
+ this._visible$.next(false);
3083
+ }
3084
+ loadWidth() {
3085
+ const stored = Number(localStorage.getItem(SIDE_PANEL_WIDTH_STORAGE_KEY));
3086
+ return Number.isFinite(stored) && stored > 0
3087
+ ? this.clampWidth(stored)
3088
+ : SIDE_PANEL_DEFAULT_WIDTH;
3089
+ }
3090
+ withdrawHandle(handle) {
3091
+ if (handle !== this._currentHandle)
3092
+ return;
3093
+ this._currentHandle = null;
3094
+ this._contentWidth$.next(null);
3095
+ this._current$.next(null);
3096
+ this._visible$.next(false);
3097
+ }
3098
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3099
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelService, providedIn: 'root' }); }
3100
+ }
3101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelService, decorators: [{
3102
+ type: Injectable,
3103
+ args: [{
3104
+ providedIn: 'root',
3105
+ }]
3106
+ }] });
3107
+
2904
3108
  /*
2905
3109
  * Copyright 2015-2025 Ritense BV, the Netherlands.
2906
3110
  *
@@ -3415,6 +3619,42 @@ const setRequiredOnSchema = (schema, path, property, isRequired) => {
3415
3619
  return schema;
3416
3620
  };
3417
3621
 
3622
+ /*
3623
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
3624
+ *
3625
+ * Licensed under EUPL, Version 1.2 (the "License");
3626
+ * you may not use this file except in compliance with the License.
3627
+ * You may obtain a copy of the License at
3628
+ *
3629
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
3630
+ *
3631
+ * Unless required by applicable law or agreed to in writing, software
3632
+ * distributed under the License is distributed on an "AS IS" basis,
3633
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3634
+ * See the License for the specific language governing permissions and
3635
+ * limitations under the License.
3636
+ */
3637
+ /**
3638
+ * Resize observations of [elements]. Lazy: the observer opens on subscribe and disconnects on
3639
+ * unsubscribe. Emits each batch of entries from inside the observer callback, when layout is
3640
+ * fresh, so reading sizes there forces no extra layout. Runs in whatever zone it is subscribed in.
3641
+ */
3642
+ const fromResizeObserver = (elements, options) => new Observable(subscriber => {
3643
+ const observer = new ResizeObserver(entries => subscriber.next(entries));
3644
+ (Array.isArray(elements) ? elements : [elements]).forEach(element => observer.observe(element, options));
3645
+ return () => observer.disconnect();
3646
+ });
3647
+ /** Mutation records of [target]. Lazy like [fromResizeObserver]. */
3648
+ const fromMutationObserver = (target, options) => new Observable(subscriber => {
3649
+ const observer = new MutationObserver(records => subscriber.next(records));
3650
+ observer.observe(target, options);
3651
+ return () => observer.disconnect();
3652
+ });
3653
+ /** The border-box inline size of a resize entry, in CSS pixels. */
3654
+ const borderBoxWidth = (entry) => entry.borderBoxSize?.[0]?.inlineSize ?? entry.target.getBoundingClientRect().width;
3655
+ /** The content-box inline size of a resize entry, in CSS pixels. */
3656
+ const contentBoxWidth = (entry) => entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;
3657
+
3418
3658
  /*
3419
3659
  * Copyright 2015-2025 Ritense BV, the Netherlands.
3420
3660
  *
@@ -4375,7 +4615,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
4375
4615
 
4376
4616
  class MenuService {
4377
4617
  get menuItems$() {
4378
- return this._menuItems$.pipe(distinctUntilChanged((prev, curr) => isEqual(prev, curr)));
4618
+ return this._menuItems$.pipe(distinctUntilChanged$1((prev, curr) => isEqual(prev, curr)));
4379
4619
  }
4380
4620
  get menuItemsLoaded$() {
4381
4621
  return this._menuItems$.pipe(map$1(items => Array.isArray(items) && items.length > 0));
@@ -4409,7 +4649,7 @@ class MenuService {
4409
4649
  });
4410
4650
  });
4411
4651
  return closestSequence;
4412
- }), distinctUntilChanged());
4652
+ }), distinctUntilChanged$1());
4413
4653
  }
4414
4654
  constructor(configService, http, logger, menuIncludeService, pendingChangesService, router, userProviderService, keycloakService) {
4415
4655
  this.configService = configService;
@@ -6160,6 +6400,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
6160
6400
  }]
6161
6401
  }] });
6162
6402
 
6403
+ /*
6404
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
6405
+ *
6406
+ * Licensed under EUPL, Version 1.2 (the "License");
6407
+ * you may not use this file except in compliance with the License.
6408
+ * You may obtain a copy of the License at
6409
+ *
6410
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
6411
+ *
6412
+ * Unless required by applicable law or agreed to in writing, software
6413
+ * distributed under the License is distributed on an "AS IS" basis,
6414
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6415
+ * See the License for the specific language governing permissions and
6416
+ * limitations under the License.
6417
+ */
6418
+ const SIDE_PANEL_OFFSET_PROPERTY = '--valtimo-side-panel-offset';
6419
+ const SIDE_PANEL_KEYBOARD_RESIZE_STEP = 16;
6420
+ /**
6421
+ * Fixed panel at the right edge of the internal layout. Rendered once next to the router outlet so
6422
+ * its content survives navigation; showing and hiding is CSS only, because moving an iframe in the
6423
+ * DOM reloads it. Publishes its occupied width as `--valtimo-side-panel-offset` so the layout can
6424
+ * push the page content aside.
6425
+ */
6426
+ class SidePanelComponent {
6427
+ constructor(iconService, router, shellService, sidePanelService) {
6428
+ this.iconService = iconService;
6429
+ this.router = router;
6430
+ this.shellService = shellService;
6431
+ this.sidePanelService = sidePanelService;
6432
+ this.$current = toSignal(this.sidePanelService.current$, { initialValue: null });
6433
+ this.$offers = computed(() => {
6434
+ const current = this.$current();
6435
+ return current ? [current] : [];
6436
+ });
6437
+ /** The origin's label; null while a resolving label has not arrived. */
6438
+ this.$originLabel = toSignal(toObservable(this.$current).pipe(switchMap(current => {
6439
+ const label = current?.origin?.label;
6440
+ if (label === undefined)
6441
+ return of(null);
6442
+ return isObservable(label) ? label.pipe(startWith(null)) : of(label);
6443
+ })), { initialValue: null });
6444
+ /** The user is on a page other than the one the content belongs to. */
6445
+ this.$originElsewhere = computed(() => {
6446
+ const origin = this.$current()?.origin;
6447
+ if (!origin)
6448
+ return false;
6449
+ const originUrl = this.router.serializeUrl(this.router.createUrlTree(origin.route));
6450
+ const url = this._$url().split(/[?#]/)[0];
6451
+ return url !== originUrl && !url.startsWith(`${originUrl}/`);
6452
+ });
6453
+ this.$resizing = signal(false);
6454
+ this.$visible = toSignal(this.sidePanelService.visible$, { initialValue: false });
6455
+ this.$width = toSignal(this.sidePanelService.width$, { requireSync: true });
6456
+ this.testIds = SIDE_PANEL_TEST_IDS;
6457
+ this._endResize = null;
6458
+ this._$largeScreen = toSignal(this.shellService.largeScreen$, { initialValue: true });
6459
+ this._$url = toSignal(this.router.events.pipe(filter$1((event) => event instanceof NavigationEnd), map(event => event.urlAfterRedirects), startWith(this.router.url)), { requireSync: true });
6460
+ this.iconService.registerAll([Close16, PinFilled16]);
6461
+ // Small screens: overlay instead of push.
6462
+ effect(() => {
6463
+ const offset = this.$current() && this.$visible() && this._$largeScreen() ? this.$width() : 0;
6464
+ document.documentElement.style.setProperty(SIDE_PANEL_OFFSET_PROPERTY, `${offset}px`);
6465
+ });
6466
+ }
6467
+ ngOnDestroy() {
6468
+ this._endResize?.();
6469
+ document.documentElement.style.removeProperty(SIDE_PANEL_OFFSET_PROPERTY);
6470
+ }
6471
+ onClose() {
6472
+ this.sidePanelService.dismiss();
6473
+ }
6474
+ onResizeKey(delta) {
6475
+ this.sidePanelService.setWidth(this.$width() + delta * SIDE_PANEL_KEYBOARD_RESIZE_STEP);
6476
+ this.sidePanelService.endResize();
6477
+ }
6478
+ onResizeStart(event) {
6479
+ event.preventDefault();
6480
+ this.$resizing.set(true);
6481
+ document.body.style.setProperty('cursor', 'col-resize');
6482
+ document.body.style.setProperty('user-select', 'none');
6483
+ const onMove = (moveEvent) => this.sidePanelService.setWidth(window.innerWidth - moveEvent.clientX);
6484
+ const onUp = () => {
6485
+ this.$resizing.set(false);
6486
+ document.body.style.removeProperty('cursor');
6487
+ document.body.style.removeProperty('user-select');
6488
+ document.removeEventListener('mousemove', onMove);
6489
+ document.removeEventListener('mouseup', onUp);
6490
+ this.sidePanelService.endResize();
6491
+ this._endResize = null;
6492
+ };
6493
+ this._endResize = onUp;
6494
+ document.addEventListener('mousemove', onMove);
6495
+ document.addEventListener('mouseup', onUp);
6496
+ }
6497
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelComponent, deps: [{ token: i2$3.IconService }, { token: i1$3.Router }, { token: ShellService }, { token: SidePanelService }], target: i0.ɵɵFactoryTarget.Component }); }
6498
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: SidePanelComponent, isStandalone: true, selector: "valtimo-side-panel", 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<aside\n [attr.aria-hidden]=\"!$visible()\"\n [attr.data-test-id]=\"testIds.panel\"\n [class.valtimo-side-panel--resizing]=\"$resizing()\"\n [class.valtimo-side-panel--visible]=\"$visible() && !!$current()\"\n [style.width.px]=\"$width()\"\n class=\"valtimo-side-panel\"\n>\n <div\n [attr.aria-label]=\"'sidePanel.resize' | translate\"\n [attr.data-test-id]=\"testIds.resizeHandle\"\n (keydown.arrowLeft)=\"onResizeKey(1)\"\n (keydown.arrowRight)=\"onResizeKey(-1)\"\n (mousedown)=\"onResizeStart($event)\"\n aria-orientation=\"vertical\"\n class=\"valtimo-side-panel__resize-handle\"\n role=\"separator\"\n tabindex=\"0\"\n ></div>\n\n @if ($current(); as current) {\n <header class=\"valtimo-side-panel__header\">\n <div class=\"valtimo-side-panel__titles\">\n <div class=\"valtimo-side-panel__title-row\">\n @if (current.pinned) {\n <cds-tooltip [description]=\"'sidePanel.pinned' | translate\" align=\"bottom-left\">\n <span\n [attr.aria-label]=\"'sidePanel.pinned' | translate\"\n [attr.data-test-id]=\"testIds.pinnedIcon\"\n class=\"valtimo-side-panel__pin\"\n role=\"img\"\n tabindex=\"0\"\n >\n <svg cdsIcon=\"pin--filled\" size=\"16\"></svg>\n </span>\n </cds-tooltip>\n }\n\n <h2 class=\"valtimo-side-panel__title\">{{ current.title }}</h2>\n </div>\n\n @if (current.subtitle) {\n @if (current.subtitleLink) {\n <a\n [attr.data-test-id]=\"testIds.subtitleLink\"\n [routerLink]=\"current.subtitleLink\"\n class=\"valtimo-side-panel__subtitle\"\n >{{ current.subtitle }}</a\n >\n } @else {\n <span class=\"valtimo-side-panel__subtitle\">{{ current.subtitle }}</span>\n }\n }\n\n @if (current.origin; as origin) {\n <div [attr.data-test-id]=\"testIds.origin\" class=\"valtimo-side-panel__origin\">\n <span>{{ 'sidePanel.originFor' | translate }}</span>\n\n <a [routerLink]=\"origin.route\" class=\"valtimo-side-panel__origin-link\">{{\n $originLabel() ?? ('sidePanel.originFallback' | translate)\n }}</a>\n\n @if ($originElsewhere()) {\n <cds-tag\n [attr.data-test-id]=\"testIds.originElsewhere\"\n [title]=\"\n 'sidePanel.originElsewhereDescription'\n | translate: {label: $originLabel() ?? ('sidePanel.originFallback' | translate)}\n \"\n class=\"valtimo-side-panel__origin-tag\"\n size=\"sm\"\n type=\"warm-gray\"\n >{{ 'sidePanel.originElsewhere' | translate }}</cds-tag\n >\n }\n </div>\n }\n </div>\n\n <button\n [attr.aria-label]=\"'sidePanel.close' | translate\"\n [attr.data-test-id]=\"testIds.closeButton\"\n [iconOnly]=\"true\"\n (click)=\"onClose()\"\n cdsButton=\"ghost\"\n class=\"valtimo-side-panel__close\"\n >\n <svg cdsIcon=\"close\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n </header>\n }\n\n <div class=\"valtimo-side-panel__body\">\n @for (offer of $offers(); track offer.key) {\n <ng-container\n *ngComponentOutlet=\"offer.component; inputs: offer.inputs ?? {}; injector: offer.injector\"\n ></ng-container>\n }\n </div>\n</aside>\n", styles: [".valtimo-side-panel{position:fixed;inset-block:3rem 0;inset-inline-end:0;z-index:7999;display:flex;flex-direction:column;background-color:var(--cds-layer);border-inline-start:1px solid var(--cds-border-subtle);transform:translate(100%);visibility:hidden;transition:transform .11s cubic-bezier(.2,0,.38,.9),visibility 0s linear .11s}.valtimo-side-panel--visible{transform:none;visibility:visible;transition-delay:0s}.valtimo-side-panel--resizing{-webkit-user-select:none;user-select:none}.valtimo-side-panel--resizing ::ng-deep iframe{pointer-events:none}.valtimo-side-panel__resize-handle{position:absolute;top:0;left:0;z-index:1;width:3px;height:100%;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9);outline:none}.valtimo-side-panel__resize-handle:hover,.valtimo-side-panel__resize-handle:focus-visible{opacity:1}.valtimo-side-panel--resizing .valtimo-side-panel__resize-handle{opacity:1}.valtimo-side-panel__header{display:flex;align-items:center;justify-content:space-between;gap:var(--cds-spacing-03);min-height:3rem;padding-inline-start:var(--cds-spacing-05);border-block-end:1px solid var(--cds-border-subtle)}.valtimo-side-panel__titles{display:flex;flex-direction:column;gap:var(--cds-spacing-02);min-width:0;padding-block:var(--cds-spacing-03)}.valtimo-side-panel__close{flex:none;align-self:flex-start;align-items:center;justify-content:center;padding:0}.valtimo-side-panel__title-row{display:flex;align-items:center;gap:var(--cds-spacing-03);min-width:0}.valtimo-side-panel__pin{display:flex;color:var(--cds-icon-secondary);outline:none}.valtimo-side-panel__pin:focus-visible{outline:2px solid var(--cds-focus)}.valtimo-side-panel__pin svg{fill:currentColor}.valtimo-side-panel__origin{display:flex;flex-wrap:wrap;align-items:center;gap:var(--cds-spacing-02) var(--cds-spacing-03);font-size:var(--cds-body-compact-01-font-size);color:var(--cds-text-secondary)}.valtimo-side-panel__origin-link{color:var(--cds-link-primary)}.valtimo-side-panel__origin-tag{margin:0}.valtimo-side-panel__title{font-size:var(--cds-heading-compact-02-font-size);font-weight:var(--cds-heading-compact-02-font-weight);line-height:var(--cds-heading-compact-02-line-height);color:var(--cds-text-primary)}.valtimo-side-panel__subtitle{font-size:var(--cds-body-compact-01-font-size);color:var(--cds-text-secondary)}.valtimo-side-panel a.valtimo-side-panel__subtitle{color:var(--cds-link-primary)}.valtimo-side-panel__body{flex:1;min-height:0;overflow:auto;font-size:var(--cds-body-compact-01-font-size);font-weight:var(--cds-body-compact-01-font-weight);line-height:var(--cds-body-compact-01-line-height);letter-spacing:var(--cds-body-compact-01-letter-spacing)}.valtimo-side-panel__body ::ng-deep>*{display:block;height:100%}\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: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { 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: TagModule }, { kind: "component", type: i2$3.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "ngmodule", type: TooltipModule$1 }, { kind: "component", type: i2$3.Tooltip, selector: "cds-tooltip, ibm-tooltip", inputs: ["id", "enterDelayMs", "leaveDelayMs", "disabled", "description", "templateContext"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6499
+ }
6500
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelComponent, decorators: [{
6501
+ type: Component,
6502
+ args: [{ standalone: true, selector: 'valtimo-side-panel', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
6503
+ NgComponentOutlet,
6504
+ RouterLink,
6505
+ TranslateModule,
6506
+ ButtonModule,
6507
+ IconModule,
6508
+ TagModule,
6509
+ TooltipModule$1,
6510
+ ], 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<aside\n [attr.aria-hidden]=\"!$visible()\"\n [attr.data-test-id]=\"testIds.panel\"\n [class.valtimo-side-panel--resizing]=\"$resizing()\"\n [class.valtimo-side-panel--visible]=\"$visible() && !!$current()\"\n [style.width.px]=\"$width()\"\n class=\"valtimo-side-panel\"\n>\n <div\n [attr.aria-label]=\"'sidePanel.resize' | translate\"\n [attr.data-test-id]=\"testIds.resizeHandle\"\n (keydown.arrowLeft)=\"onResizeKey(1)\"\n (keydown.arrowRight)=\"onResizeKey(-1)\"\n (mousedown)=\"onResizeStart($event)\"\n aria-orientation=\"vertical\"\n class=\"valtimo-side-panel__resize-handle\"\n role=\"separator\"\n tabindex=\"0\"\n ></div>\n\n @if ($current(); as current) {\n <header class=\"valtimo-side-panel__header\">\n <div class=\"valtimo-side-panel__titles\">\n <div class=\"valtimo-side-panel__title-row\">\n @if (current.pinned) {\n <cds-tooltip [description]=\"'sidePanel.pinned' | translate\" align=\"bottom-left\">\n <span\n [attr.aria-label]=\"'sidePanel.pinned' | translate\"\n [attr.data-test-id]=\"testIds.pinnedIcon\"\n class=\"valtimo-side-panel__pin\"\n role=\"img\"\n tabindex=\"0\"\n >\n <svg cdsIcon=\"pin--filled\" size=\"16\"></svg>\n </span>\n </cds-tooltip>\n }\n\n <h2 class=\"valtimo-side-panel__title\">{{ current.title }}</h2>\n </div>\n\n @if (current.subtitle) {\n @if (current.subtitleLink) {\n <a\n [attr.data-test-id]=\"testIds.subtitleLink\"\n [routerLink]=\"current.subtitleLink\"\n class=\"valtimo-side-panel__subtitle\"\n >{{ current.subtitle }}</a\n >\n } @else {\n <span class=\"valtimo-side-panel__subtitle\">{{ current.subtitle }}</span>\n }\n }\n\n @if (current.origin; as origin) {\n <div [attr.data-test-id]=\"testIds.origin\" class=\"valtimo-side-panel__origin\">\n <span>{{ 'sidePanel.originFor' | translate }}</span>\n\n <a [routerLink]=\"origin.route\" class=\"valtimo-side-panel__origin-link\">{{\n $originLabel() ?? ('sidePanel.originFallback' | translate)\n }}</a>\n\n @if ($originElsewhere()) {\n <cds-tag\n [attr.data-test-id]=\"testIds.originElsewhere\"\n [title]=\"\n 'sidePanel.originElsewhereDescription'\n | translate: {label: $originLabel() ?? ('sidePanel.originFallback' | translate)}\n \"\n class=\"valtimo-side-panel__origin-tag\"\n size=\"sm\"\n type=\"warm-gray\"\n >{{ 'sidePanel.originElsewhere' | translate }}</cds-tag\n >\n }\n </div>\n }\n </div>\n\n <button\n [attr.aria-label]=\"'sidePanel.close' | translate\"\n [attr.data-test-id]=\"testIds.closeButton\"\n [iconOnly]=\"true\"\n (click)=\"onClose()\"\n cdsButton=\"ghost\"\n class=\"valtimo-side-panel__close\"\n >\n <svg cdsIcon=\"close\" class=\"cds--btn__icon\" size=\"16\"></svg>\n </button>\n </header>\n }\n\n <div class=\"valtimo-side-panel__body\">\n @for (offer of $offers(); track offer.key) {\n <ng-container\n *ngComponentOutlet=\"offer.component; inputs: offer.inputs ?? {}; injector: offer.injector\"\n ></ng-container>\n }\n </div>\n</aside>\n", styles: [".valtimo-side-panel{position:fixed;inset-block:3rem 0;inset-inline-end:0;z-index:7999;display:flex;flex-direction:column;background-color:var(--cds-layer);border-inline-start:1px solid var(--cds-border-subtle);transform:translate(100%);visibility:hidden;transition:transform .11s cubic-bezier(.2,0,.38,.9),visibility 0s linear .11s}.valtimo-side-panel--visible{transform:none;visibility:visible;transition-delay:0s}.valtimo-side-panel--resizing{-webkit-user-select:none;user-select:none}.valtimo-side-panel--resizing ::ng-deep iframe{pointer-events:none}.valtimo-side-panel__resize-handle{position:absolute;top:0;left:0;z-index:1;width:3px;height:100%;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9);outline:none}.valtimo-side-panel__resize-handle:hover,.valtimo-side-panel__resize-handle:focus-visible{opacity:1}.valtimo-side-panel--resizing .valtimo-side-panel__resize-handle{opacity:1}.valtimo-side-panel__header{display:flex;align-items:center;justify-content:space-between;gap:var(--cds-spacing-03);min-height:3rem;padding-inline-start:var(--cds-spacing-05);border-block-end:1px solid var(--cds-border-subtle)}.valtimo-side-panel__titles{display:flex;flex-direction:column;gap:var(--cds-spacing-02);min-width:0;padding-block:var(--cds-spacing-03)}.valtimo-side-panel__close{flex:none;align-self:flex-start;align-items:center;justify-content:center;padding:0}.valtimo-side-panel__title-row{display:flex;align-items:center;gap:var(--cds-spacing-03);min-width:0}.valtimo-side-panel__pin{display:flex;color:var(--cds-icon-secondary);outline:none}.valtimo-side-panel__pin:focus-visible{outline:2px solid var(--cds-focus)}.valtimo-side-panel__pin svg{fill:currentColor}.valtimo-side-panel__origin{display:flex;flex-wrap:wrap;align-items:center;gap:var(--cds-spacing-02) var(--cds-spacing-03);font-size:var(--cds-body-compact-01-font-size);color:var(--cds-text-secondary)}.valtimo-side-panel__origin-link{color:var(--cds-link-primary)}.valtimo-side-panel__origin-tag{margin:0}.valtimo-side-panel__title{font-size:var(--cds-heading-compact-02-font-size);font-weight:var(--cds-heading-compact-02-font-weight);line-height:var(--cds-heading-compact-02-line-height);color:var(--cds-text-primary)}.valtimo-side-panel__subtitle{font-size:var(--cds-body-compact-01-font-size);color:var(--cds-text-secondary)}.valtimo-side-panel a.valtimo-side-panel__subtitle{color:var(--cds-link-primary)}.valtimo-side-panel__body{flex:1;min-height:0;overflow:auto;font-size:var(--cds-body-compact-01-font-size);font-weight:var(--cds-body-compact-01-font-weight);line-height:var(--cds-body-compact-01-line-height);letter-spacing:var(--cds-body-compact-01-letter-spacing)}.valtimo-side-panel__body ::ng-deep>*{display:block;height:100%}\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"] }]
6511
+ }], ctorParameters: () => [{ type: i2$3.IconService }, { type: i1$3.Router }, { type: ShellService }, { type: SidePanelService }] });
6512
+
6163
6513
  /*
6164
6514
  * Copyright 2015-2025 Ritense BV, the Netherlands.
6165
6515
  *
@@ -9160,29 +9510,29 @@ class PageHeaderComponent {
9160
9510
  this.titleAsBreadcrumb$ = this.pageHeaderService.titleAsBreadcrumb$;
9161
9511
  this.pageActionsHasContent$ = this.pageHeaderService.pageActionsHasContent$;
9162
9512
  this.pageTitleHidden$ = this.pageTitleService.pageTitleHidden$;
9513
+ this.pageActionsWrap$ = this.pageTitleService.pageActionsWrap$;
9514
+ this.pageActionsMinWidth$ = this.pageTitleService.pageActionsMinWidth$;
9515
+ this._pageHeadHeightSubscription = null;
9163
9516
  }
9164
9517
  ngAfterViewInit() {
9165
9518
  this.pageHeaderService.setContentViewContainerRef(this._contentrVcr);
9166
9519
  this.openPageHeadResizeObserver();
9167
9520
  }
9168
9521
  ngOnDestroy() {
9169
- this._pageHeadResizeObserver?.disconnect();
9522
+ this._pageHeadHeightSubscription?.unsubscribe();
9170
9523
  }
9171
9524
  openPageHeadResizeObserver() {
9172
- this._pageHeadResizeObserver = new ResizeObserver(entries => {
9173
- const pageHeadEntry = Array.isArray(entries) && entries[0];
9174
- const pageHeadHeight = pageHeadEntry?.contentRect?.height;
9175
- if (pageHeadHeight)
9176
- this.pageHeaderService.setPageHeadHeight(pageHeadHeight);
9177
- });
9178
- this._pageHeadResizeObserver.observe(this._pageHead.nativeElement);
9525
+ // Width-only resizes emit too: FitPage re-fits when content above it reflows.
9526
+ this._pageHeadHeightSubscription = fromResizeObserver(this._pageHead.nativeElement)
9527
+ .pipe(map(entries => entries[entries.length - 1]?.contentRect.height), filter$1((height) => !!height))
9528
+ .subscribe(height => this.pageHeaderService.setPageHeadHeight(height));
9179
9529
  }
9180
9530
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PageHeaderComponent, deps: [{ token: UserInterfaceService }, { token: PageHeaderService }, { token: PageTitleService }], target: i0.ɵɵFactoryTarget.Component }); }
9181
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: PageHeaderComponent, isStandalone: false, selector: "valtimo-page-header", viewQueries: [{ propertyName: "_contentrVcr", first: true, predicate: ["contentVcr"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "_pageHead", first: true, predicate: ["pageHead"], descendants: true, read: ElementRef, static: 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<div\n #pageHead\n class=\"page-head\"\n [ngClass]=\"{\n 'page-head--hidden': (showPageHeader$ | async) === false,\n 'page-head--compact': compactMode$ | async,\n 'page-head--no-content': (compactMode$ | async) && (pageActionsHasContent$ | async) === false,\n 'page-head--no-margin': pageTitleHidden$ | async,\n 'page-head--small-title': smallTitle$ | async,\n 'page-head--title-as-breadcrumb': (titleAsBreadcrumb$ | async) && !(compactMode$ | async),\n }\"\n>\n <ng-container #contentVcr></ng-container>\n\n <valtimo-page-subtitle></valtimo-page-subtitle>\n\n <valtimo-page-actions></valtimo-page-actions>\n</div>\n\n<ng-container renderPageHeader>\n <ng-template>\n <div\n class=\"page-header-container\"\n [ngClass]=\"{\n 'page-header-container--compact': compactMode$ | async,\n 'page-header-container--small-title': smallTitle$ | async,\n 'page-header-container--title-as-breadcrumb':\n (titleAsBreadcrumb$ | async) && !(compactMode$ | async),\n }\"\n >\n <valtimo-breadcrumb-navigation></valtimo-breadcrumb-navigation>\n\n <valtimo-page-title></valtimo-page-title>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".page-head{display:flex;width:100%;justify-content:space-between;align-items:flex-end;margin-bottom:24px}.page-head--hidden{display:none}.page-head--compact{margin-bottom:16px}.page-head--small-title{align-items:flex-start;margin-bottom:0}.page-head--title-as-breadcrumb{flex-direction:column;align-items:stretch;justify-content:flex-start;margin-bottom:16px}.page-head--title-as-breadcrumb ::ng-deep .page-actions--visible{padding-left:0}.page-head--no-content,.page-head--no-margin{margin-bottom:0}.page-head:not(.page-head--title-as-breadcrumb) valtimo-page-actions{flex:1 0 auto;width:auto}.page-header-container{width:min-content;min-width:0}.page-header-container--compact{display:flex;width:100%;justify-content:space-between;align-items:center;padding-inline:16px}.page-header-container--small-title{display:flex;flex-direction:row;gap:8px;width:min-content}.page-header-container--title-as-breadcrumb{width:max-content}\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: "component", type: PageTitleComponent, selector: "valtimo-page-title" }, { kind: "component", type: BreadcrumbNavigationComponent, selector: "valtimo-breadcrumb-navigation" }, { kind: "directive", type: RenderPageHeaderDirective, selector: "[renderPageHeader]" }, { kind: "component", type: PageActionsComponent, selector: "valtimo-page-actions" }, { kind: "component", type: PageSubtitleComponent, selector: "valtimo-page-subtitle" }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }] }); }
9531
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: PageHeaderComponent, isStandalone: false, selector: "valtimo-page-header", viewQueries: [{ propertyName: "_contentrVcr", first: true, predicate: ["contentVcr"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "_pageHead", first: true, predicate: ["pageHead"], descendants: true, read: ElementRef, static: 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<div\n #pageHead\n class=\"page-head\"\n [ngClass]=\"{\n 'page-head--hidden': (showPageHeader$ | async) === false,\n 'page-head--compact': compactMode$ | async,\n 'page-head--no-content': (compactMode$ | async) && (pageActionsHasContent$ | async) === false,\n 'page-head--no-margin': pageTitleHidden$ | async,\n 'page-head--small-title': smallTitle$ | async,\n 'page-head--title-as-breadcrumb': (titleAsBreadcrumb$ | async) && !(compactMode$ | async),\n 'page-head--wrap-actions': pageActionsWrap$ | async,\n }\"\n>\n <ng-container #contentVcr></ng-container>\n\n <valtimo-page-subtitle></valtimo-page-subtitle>\n\n <valtimo-page-actions\n [style.flex-basis.px]=\"(pageActionsWrap$ | async) ? (pageActionsMinWidth$ | async) : null\"\n ></valtimo-page-actions>\n</div>\n\n<ng-container renderPageHeader>\n <ng-template>\n <div\n class=\"page-header-container\"\n [ngClass]=\"{\n 'page-header-container--compact': compactMode$ | async,\n 'page-header-container--small-title': smallTitle$ | async,\n 'page-header-container--title-as-breadcrumb':\n (titleAsBreadcrumb$ | async) && !(compactMode$ | async),\n }\"\n >\n <valtimo-breadcrumb-navigation></valtimo-breadcrumb-navigation>\n\n <valtimo-page-title></valtimo-page-title>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".page-head{display:flex;width:100%;justify-content:space-between;align-items:flex-end;margin-bottom:24px}.page-head--hidden{display:none}.page-head--compact{margin-bottom:16px}.page-head--small-title{align-items:flex-start;margin-bottom:0}.page-head--title-as-breadcrumb{flex-direction:column;align-items:stretch;justify-content:flex-start;margin-bottom:16px}.page-head--title-as-breadcrumb ::ng-deep .page-actions--visible{padding-left:0}.page-head--no-content,.page-head--no-margin{margin-bottom:0}.page-head:not(.page-head--title-as-breadcrumb) valtimo-page-actions{flex:1 0 auto;width:auto}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb){flex-wrap:wrap;align-items:center;column-gap:var(--cds-spacing-07);row-gap:var(--cds-spacing-03)}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb)>valtimo-page-subtitle{display:none}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb) .page-header-container{width:max-content;max-width:100%;align-items:baseline}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb) valtimo-page-actions{flex-shrink:1;min-width:0}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb) ::ng-deep .page-actions--visible{min-width:0;padding-left:0}.page-header-container{width:min-content;min-width:0}.page-header-container--compact{display:flex;width:100%;justify-content:space-between;align-items:center;padding-inline:16px}.page-header-container--small-title{display:flex;flex-direction:row;gap:8px;width:min-content}.page-header-container--title-as-breadcrumb{width:max-content}\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: "component", type: PageTitleComponent, selector: "valtimo-page-title" }, { kind: "component", type: BreadcrumbNavigationComponent, selector: "valtimo-breadcrumb-navigation" }, { kind: "directive", type: RenderPageHeaderDirective, selector: "[renderPageHeader]" }, { kind: "component", type: PageActionsComponent, selector: "valtimo-page-actions" }, { kind: "component", type: PageSubtitleComponent, selector: "valtimo-page-subtitle" }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }] }); }
9182
9532
  }
9183
9533
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PageHeaderComponent, decorators: [{
9184
9534
  type: Component,
9185
- args: [{ selector: 'valtimo-page-header', standalone: false, 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 #pageHead\n class=\"page-head\"\n [ngClass]=\"{\n 'page-head--hidden': (showPageHeader$ | async) === false,\n 'page-head--compact': compactMode$ | async,\n 'page-head--no-content': (compactMode$ | async) && (pageActionsHasContent$ | async) === false,\n 'page-head--no-margin': pageTitleHidden$ | async,\n 'page-head--small-title': smallTitle$ | async,\n 'page-head--title-as-breadcrumb': (titleAsBreadcrumb$ | async) && !(compactMode$ | async),\n }\"\n>\n <ng-container #contentVcr></ng-container>\n\n <valtimo-page-subtitle></valtimo-page-subtitle>\n\n <valtimo-page-actions></valtimo-page-actions>\n</div>\n\n<ng-container renderPageHeader>\n <ng-template>\n <div\n class=\"page-header-container\"\n [ngClass]=\"{\n 'page-header-container--compact': compactMode$ | async,\n 'page-header-container--small-title': smallTitle$ | async,\n 'page-header-container--title-as-breadcrumb':\n (titleAsBreadcrumb$ | async) && !(compactMode$ | async),\n }\"\n >\n <valtimo-breadcrumb-navigation></valtimo-breadcrumb-navigation>\n\n <valtimo-page-title></valtimo-page-title>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".page-head{display:flex;width:100%;justify-content:space-between;align-items:flex-end;margin-bottom:24px}.page-head--hidden{display:none}.page-head--compact{margin-bottom:16px}.page-head--small-title{align-items:flex-start;margin-bottom:0}.page-head--title-as-breadcrumb{flex-direction:column;align-items:stretch;justify-content:flex-start;margin-bottom:16px}.page-head--title-as-breadcrumb ::ng-deep .page-actions--visible{padding-left:0}.page-head--no-content,.page-head--no-margin{margin-bottom:0}.page-head:not(.page-head--title-as-breadcrumb) valtimo-page-actions{flex:1 0 auto;width:auto}.page-header-container{width:min-content;min-width:0}.page-header-container--compact{display:flex;width:100%;justify-content:space-between;align-items:center;padding-inline:16px}.page-header-container--small-title{display:flex;flex-direction:row;gap:8px;width:min-content}.page-header-container--title-as-breadcrumb{width:max-content}\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"] }]
9535
+ args: [{ selector: 'valtimo-page-header', standalone: false, 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 #pageHead\n class=\"page-head\"\n [ngClass]=\"{\n 'page-head--hidden': (showPageHeader$ | async) === false,\n 'page-head--compact': compactMode$ | async,\n 'page-head--no-content': (compactMode$ | async) && (pageActionsHasContent$ | async) === false,\n 'page-head--no-margin': pageTitleHidden$ | async,\n 'page-head--small-title': smallTitle$ | async,\n 'page-head--title-as-breadcrumb': (titleAsBreadcrumb$ | async) && !(compactMode$ | async),\n 'page-head--wrap-actions': pageActionsWrap$ | async,\n }\"\n>\n <ng-container #contentVcr></ng-container>\n\n <valtimo-page-subtitle></valtimo-page-subtitle>\n\n <valtimo-page-actions\n [style.flex-basis.px]=\"(pageActionsWrap$ | async) ? (pageActionsMinWidth$ | async) : null\"\n ></valtimo-page-actions>\n</div>\n\n<ng-container renderPageHeader>\n <ng-template>\n <div\n class=\"page-header-container\"\n [ngClass]=\"{\n 'page-header-container--compact': compactMode$ | async,\n 'page-header-container--small-title': smallTitle$ | async,\n 'page-header-container--title-as-breadcrumb':\n (titleAsBreadcrumb$ | async) && !(compactMode$ | async),\n }\"\n >\n <valtimo-breadcrumb-navigation></valtimo-breadcrumb-navigation>\n\n <valtimo-page-title></valtimo-page-title>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".page-head{display:flex;width:100%;justify-content:space-between;align-items:flex-end;margin-bottom:24px}.page-head--hidden{display:none}.page-head--compact{margin-bottom:16px}.page-head--small-title{align-items:flex-start;margin-bottom:0}.page-head--title-as-breadcrumb{flex-direction:column;align-items:stretch;justify-content:flex-start;margin-bottom:16px}.page-head--title-as-breadcrumb ::ng-deep .page-actions--visible{padding-left:0}.page-head--no-content,.page-head--no-margin{margin-bottom:0}.page-head:not(.page-head--title-as-breadcrumb) valtimo-page-actions{flex:1 0 auto;width:auto}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb){flex-wrap:wrap;align-items:center;column-gap:var(--cds-spacing-07);row-gap:var(--cds-spacing-03)}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb)>valtimo-page-subtitle{display:none}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb) .page-header-container{width:max-content;max-width:100%;align-items:baseline}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb) valtimo-page-actions{flex-shrink:1;min-width:0}.page-head--wrap-actions:not(.page-head--title-as-breadcrumb) ::ng-deep .page-actions--visible{min-width:0;padding-left:0}.page-header-container{width:min-content;min-width:0}.page-header-container--compact{display:flex;width:100%;justify-content:space-between;align-items:center;padding-inline:16px}.page-header-container--small-title{display:flex;flex-direction:row;gap:8px;width:min-content}.page-header-container--title-as-breadcrumb{width:max-content}\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"] }]
9186
9536
  }], ctorParameters: () => [{ type: UserInterfaceService }, { type: PageHeaderService }, { type: PageTitleService }], propDecorators: { _contentrVcr: [{
9187
9537
  type: ViewChild,
9188
9538
  args: ['contentVcr', { static: true, read: ViewContainerRef }]
@@ -10578,12 +10928,12 @@ class FormioComponent {
10578
10928
  this.refreshForm = new EventEmitter();
10579
10929
  this.submission$ = new BehaviorSubject({});
10580
10930
  this._form$ = new BehaviorSubject(undefined);
10581
- this.form$ = combineLatest([this._form$, this.translateService.stream('key')]).pipe(filter(([form]) => !!form), map$1(([form]) => this.formioTranslationService.translateFormDefinition(form)), distinctUntilChanged((prev, curr) => isEqual(prev, curr)));
10931
+ this.form$ = combineLatest([this._form$, this.translateService.stream('key')]).pipe(filter(([form]) => !!form), map$1(([form]) => this.formioTranslationService.translateFormDefinition(form)), distinctUntilChanged$1((prev, curr) => isEqual(prev, curr)));
10582
10932
  this.options$ = new BehaviorSubject(undefined);
10583
10933
  this.readOnly$ = new BehaviorSubject(false);
10584
10934
  this.errors$ = new BehaviorSubject([]);
10585
10935
  this.languageEventEmitter = new EventEmitter();
10586
- this.currentLanguage$ = this.translateService.stream('key').pipe(map$1(() => this.translateService.currentLang), distinctUntilChanged(), tap$1(language => this.languageEventEmitter.emit(language)));
10936
+ this.currentLanguage$ = this.translateService.stream('key').pipe(map$1(() => this.translateService.currentLang), distinctUntilChanged$1(), tap$1(language => this.languageEventEmitter.emit(language)));
10587
10937
  this._overrideOptions$ = new BehaviorSubject({});
10588
10938
  this.formioOptions$ = combineLatest([
10589
10939
  this.options$,
@@ -10600,7 +10950,7 @@ class FormioComponent {
10600
10950
  }),
10601
10951
  };
10602
10952
  return deepmerge(defaultOptions, overrideOptions);
10603
- }), distinctUntilChanged((prev, curr) => isEqual(prev, curr)), tap$1(options => this.logger.debug('Form.IO options used', options)));
10953
+ }), distinctUntilChanged$1((prev, curr) => isEqual(prev, curr)), tap$1(options => this.logger.debug('Form.IO options used', options)));
10604
10954
  // Only renderOptions reaches form.io itself; getRendererOptions() drops everything else.
10605
10955
  this.renderOptions$ = this.currentLanguage$.pipe(map$1(language => ({ language })));
10606
10956
  this._storeTokenInLocalStorage = !this.configService.getFeatureToggle('disableFormioTokenInLocalStorage');
@@ -10874,7 +11224,7 @@ class FormioBuilderComponent {
10874
11224
  // eslint-disable-next-line @angular-eslint/no-output-native
10875
11225
  this.change = new EventEmitter();
10876
11226
  this.triggerRebuild = new EventEmitter();
10877
- this.currentLanguage$ = this.translateService.stream('key').pipe(map$1(() => this.translateService.currentLang), distinctUntilChanged(), tap$1(language => this.languageEventEmitter.emit(language)));
11227
+ this.currentLanguage$ = this.translateService.stream('key').pipe(map$1(() => this.translateService.currentLang), distinctUntilChanged$1(), tap$1(language => this.languageEventEmitter.emit(language)));
10878
11228
  this.languageEventEmitter = new EventEmitter();
10879
11229
  this.options$ = new BehaviorSubject(undefined);
10880
11230
  this._overrideOptions$ = new BehaviorSubject({});
@@ -10894,7 +11244,7 @@ class FormioBuilderComponent {
10894
11244
  }),
10895
11245
  };
10896
11246
  return deepmerge(defaultOptions, overrideOptions);
10897
- }), distinctUntilChanged((prev, curr) => isEqual(prev, curr)), tap$1(() => this.triggerRebuild.emit()));
11247
+ }), distinctUntilChanged$1((prev, curr) => isEqual(prev, curr)), tap$1(() => this.triggerRebuild.emit()));
10898
11248
  this.editFormModified$ = new BehaviorSubject(false);
10899
11249
  this.modifyEditForm = () => {
10900
11250
  const context$ = getContextObservable(this.route);
@@ -11956,7 +12306,7 @@ class ValuePathSelectorComponent {
11956
12306
  return this.formGroup.get('selectedPath');
11957
12307
  }
11958
12308
  get _selectedPath$() {
11959
- return this.selectedPath.valueChanges.pipe(startWith(this.selectedPath.value), distinctUntilChanged(), tap(value => {
12309
+ return this.selectedPath.valueChanges.pipe(startWith(this.selectedPath.value), distinctUntilChanged$1(), tap(value => {
11960
12310
  if (this._onChangeFunction) {
11961
12311
  this._onChangeFunction(value);
11962
12312
  }
@@ -12754,6 +13104,35 @@ function registerFormioFlatpickr() {
12754
13104
  };
12755
13105
  }
12756
13106
 
13107
+ /*
13108
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
13109
+ *
13110
+ * Licensed under EUPL, Version 1.2 (the "License");
13111
+ * you may not use this file except in compliance with the License.
13112
+ * You may obtain a copy of the License at
13113
+ *
13114
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
13115
+ *
13116
+ * Unless required by applicable law or agreed to in writing, software
13117
+ * distributed under the License is distributed on an "AS IS" basis,
13118
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13119
+ * See the License for the specific language governing permissions and
13120
+ * limitations under the License.
13121
+ */
13122
+ const SANITIZE_CONFIG = {
13123
+ FORBID_TAGS: ['form', 'input', 'button', 'textarea', 'select'],
13124
+ };
13125
+ // Use an isolated DOMPurify instance so the anchor hook below does not leak onto
13126
+ // the shared singleton that formiojs (and other libraries) sanitize with.
13127
+ const purifier = createDOMPurify(window);
13128
+ purifier.addHook('afterSanitizeAttributes', node => {
13129
+ if (node.tagName === 'A') {
13130
+ node.setAttribute('target', '_blank');
13131
+ node.setAttribute('rel', 'noopener noreferrer');
13132
+ }
13133
+ });
13134
+ const sanitizeEmailHtml = (html) => purifier.sanitize(html, SANITIZE_CONFIG);
13135
+
12757
13136
  /*
12758
13137
  * Copyright 2015-2026 Ritense BV, the Netherlands.
12759
13138
  *
@@ -12772,7 +13151,7 @@ function registerFormioFlatpickr() {
12772
13151
  class FormIoMailPreviewComponent {
12773
13152
  set value(v) {
12774
13153
  this._value = v;
12775
- this.safeValue = this.sanitizer.bypassSecurityTrustHtml(v ?? 'Hier wordt het e-mailvoorbeeld getoond.');
13154
+ this.safeValue = this.sanitizer.bypassSecurityTrustHtml(sanitizeEmailHtml(v ?? 'Hier wordt het e-mailvoorbeeld getoond.'));
12776
13155
  }
12777
13156
  get value() {
12778
13157
  return this._value;
@@ -18668,7 +19047,7 @@ class StatusSelectorComponent {
18668
19047
  selected: !!selectedStatuses.find(selectedStatusKey => selectedStatusKey === status.key),
18669
19048
  key: status.key,
18670
19049
  tagType: status.tagType,
18671
- }))), distinctUntilChanged((previous, current) => isEqual(previous, current)));
19050
+ }))), distinctUntilChanged$1((previous, current) => isEqual(previous, current)));
18672
19051
  }
18673
19052
  itemSelected(event) {
18674
19053
  const newSelectedItems = event?.filter(item => item?.selected) || [];
@@ -19865,7 +20244,7 @@ class CaseTagsSelectorComponent {
19865
20244
  selected: !!selectedCaseTags.find(selectedCaseTagKey => selectedCaseTagKey === caseTag.key),
19866
20245
  key: caseTag.key,
19867
20246
  tagType: caseTag.tagType,
19868
- }))), distinctUntilChanged((previous, current) => isEqual(previous, current)));
20247
+ }))), distinctUntilChanged$1((previous, current) => isEqual(previous, current)));
19869
20248
  }
19870
20249
  set caseTags(value) {
19871
20250
  this._caseTags$.next((value || []).map(caseTags => ({
@@ -20777,6 +21156,8 @@ class RenderInPageHeaderDirective {
20777
21156
  this.pageTitleService = pageTitleService;
20778
21157
  this.pageHeaderService = pageHeaderService;
20779
21158
  this.fullWidth = false;
21159
+ /** Lets the actions move below the page title when both don't fit on one row. */
21160
+ this.wrap = false;
20780
21161
  this._subscriptions = new Subscription();
20781
21162
  }
20782
21163
  ngOnInit() {
@@ -20797,11 +21178,12 @@ class RenderInPageHeaderDirective {
20797
21178
  pageActionsVcr.createEmbeddedView(this.templateRef);
20798
21179
  this.pageTitleService.setHasPageActions(true);
20799
21180
  this.pageTitleService.setPageActionsFullWidth(this.fullWidth);
21181
+ this.pageTitleService.setPageActionsWrap(this.wrap);
20800
21182
  }
20801
21183
  });
20802
21184
  }
20803
21185
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RenderInPageHeaderDirective, deps: [{ token: PageTitleService }, { token: PageHeaderService }], target: i0.ɵɵFactoryTarget.Directive }); }
20804
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.25", type: RenderInPageHeaderDirective, isStandalone: true, selector: "[renderInPageHeader]", inputs: { fullWidth: "fullWidth" }, queries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0 }); }
21186
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.25", type: RenderInPageHeaderDirective, isStandalone: true, selector: "[renderInPageHeader]", inputs: { fullWidth: "fullWidth", wrap: "wrap" }, queries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0 }); }
20805
21187
  }
20806
21188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RenderInPageHeaderDirective, decorators: [{
20807
21189
  type: Directive,
@@ -20811,6 +21193,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
20811
21193
  args: [TemplateRef]
20812
21194
  }], fullWidth: [{
20813
21195
  type: Input
21196
+ }], wrap: [{
21197
+ type: Input
20814
21198
  }] } });
20815
21199
 
20816
21200
  /*
@@ -21361,7 +21745,7 @@ class MuuriDirective {
21361
21745
  return this._muuriSubject$.getValue();
21362
21746
  }
21363
21747
  get _containerWidth$() {
21364
- return this._containerWidthSubject$.pipe(distinctUntilChanged());
21748
+ return this._containerWidthSubject$.pipe(distinctUntilChanged$1());
21365
21749
  }
21366
21750
  constructor(elementRef, renderer, ngZone) {
21367
21751
  this.elementRef = elementRef;
@@ -21778,6 +22162,11 @@ class AssignmentComponent {
21778
22162
  get assignButtonTranslationKey() {
21779
22163
  return this.mode === 'case' ? 'assignment.assignThisCase' : 'assignment.assignThisTask';
21780
22164
  }
22165
+ get assignedNames() {
22166
+ return [this._assigneeFullName || this._assigneeId, this._assignedTeamTitle]
22167
+ .filter(name => !!name)
22168
+ .join(' & ');
22169
+ }
21781
22170
  get hasEditChanges() {
21782
22171
  return (this.selectedUserId$.getValue() !== this._initialUserId ||
21783
22172
  this.selectedTeamKey$.getValue() !== this._initialTeamKey);
@@ -21792,6 +22181,8 @@ class AssignmentComponent {
21792
22181
  this._userProviderService = _userProviderService;
21793
22182
  this.mode = 'case';
21794
22183
  this.hasPermission = true;
22184
+ /** Icon-only, for tight layouts; names show as a tooltip. */
22185
+ this.compact = false;
21795
22186
  this.assignmentChangedEvent = new EventEmitter();
21796
22187
  this.unassignedEvent = new EventEmitter();
21797
22188
  this._assigneeId = null;
@@ -21817,7 +22208,7 @@ class AssignmentComponent {
21817
22208
  this._candidateTeamsSubscription = null;
21818
22209
  this._candidateUsersSubscription = null;
21819
22210
  this._subscriptions = new Subscription();
21820
- this._iconService.registerAll([UserFollow16, Group16, User16]);
22211
+ this._iconService.registerAll([Edit16, UserFollow16, Group16, User16]);
21821
22212
  this._subscriptions.add(this._userProviderService.getUserSubject().subscribe(user => {
21822
22213
  this._currentUser = user;
21823
22214
  }));
@@ -22012,7 +22403,7 @@ class AssignmentComponent {
22012
22403
  this._candidateTeamsSubscription = null;
22013
22404
  }
22014
22405
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AssignmentComponent, deps: [{ token: CdsThemeService }, { token: i2$3.IconService }, { token: i1.TranslateService }, { token: i6$1.UserProviderService }], target: i0.ɵɵFactoryTarget.Component }); }
22015
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: AssignmentComponent, isStandalone: true, selector: "valtimo-assignment", inputs: { mode: "mode", hasPermission: "hasPermission", assigneeId: "assigneeId", assigneeFullName: "assigneeFullName", assignedTeamKey: "assignedTeamKey", assignedTeamTitle: "assignedTeamTitle", candidateUsers$: "candidateUsers$", candidateTeams$: "candidateTeams$" }, outputs: { assignmentChangedEvent: "assignmentChangedEvent", unassignedEvent: "unassignedEvent" }, host: { properties: { "style.display": "this.hostDisplay" } }, 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<ng-container\n *ngIf=\"{\n disabled: disabled$ | async,\n loading: loading$ | async,\n userItems: userItems$ | async,\n teamItems: teamItems$ | async,\n mouseIsOver: mouseIsOver$ | async,\n selectedUserId: selectedUserId$ | async,\n selectedTeamKey: selectedTeamKey$ | async,\n editToggletipOpen: editToggletipOpen$ | async,\n showUserComboBox: showUserComboBox$ | async,\n showTeamComboBox: showTeamComboBox$ | async,\n } as obs\"\n>\n <ng-container *ngIf=\"isAssigned || hasPermission\">\n <div\n class=\"assignment-container\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n >\n <!-- Assigned state: display pills with icons -->\n <div\n class=\"assigned-display element\"\n [ngClass]=\"{\n active: hasPermission\n ? isAssigned && !obs.mouseIsOver && !obs.editToggletipOpen\n : isAssigned,\n }\"\n >\n <span class=\"assignment-pill\" *ngIf=\"_assignedTeamKey\">\n <svg cdsIcon=\"group\" size=\"16\" class=\"pill-icon\"></svg>\n <span class=\"pill-text\">{{ _assignedTeamTitle }}</span>\n </span>\n\n <span class=\"assignment-pill\" *ngIf=\"_assigneeId\">\n <svg cdsIcon=\"user\" size=\"16\" class=\"pill-icon\"></svg>\n <span class=\"pill-text\">{{ _assigneeFullName || _assigneeId }}</span>\n </span>\n </div>\n\n <!-- Click to edit button (appears on hover when assigned) -->\n <cds-toggletip\n *ngIf=\"hasPermission && isAssigned\"\n align=\"bottom\"\n class=\"element\"\n [autoAlign]=\"true\"\n [isOpen]=\"open$ | async\"\n [ngClass]=\"{active: isAssigned && (obs.mouseIsOver || obs.editToggletipOpen)}\"\n (onOpen)=\"onOpenEditToggletip()\"\n (onClose)=\"onCloseEditToggletip()\"\n >\n <button\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"ghost\"\n size=\"sm\"\n class=\"click-to-edit-button\"\n >\n {{ 'assignment.clickToEdit' | translate }}\n </button>\n\n <div cdsToggletipContent class=\"assignment-popover-content\">\n <cds-combo-box\n *ngIf=\"obs.showUserComboBox && obs.userItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectUser' | translate\"\n [placeholder]=\"'assignment.selectUser' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.userItems\"\n [disabled]=\"obs.disabled\"\n itemValueKey=\"id\"\n (selected)=\"onUserSelect($event)\"\n (clear)=\"onUserClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <cds-combo-box\n *ngIf=\"obs.showTeamComboBox && obs.teamItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectTeam' | translate\"\n [placeholder]=\"'assignment.selectTeam' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.teamItems\"\n [disabled]=\"obs.disabled\"\n itemValueKey=\"id\"\n (selected)=\"onTeamSelect($event)\"\n (clear)=\"onTeamClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <button\n cdsButton\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n [cdsLayer]=\"1\"\n class=\"submit-button\"\n [disabled]=\"!hasEditChanges || obs.disabled\"\n (click)=\"onUpdate()\"\n >\n {{ 'assignment.update' | translate }}\n </button>\n\n <button\n cdsButton=\"danger--tertiary\"\n [cdsLayer]=\"1\"\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n [disabled]=\"obs.disabled\"\n (click)=\"onUnassign()\"\n >\n {{ 'assignment.unassignAll' | translate }}\n </button>\n </div>\n </cds-toggletip>\n\n <!-- Assign button: always rendered for layout sizing (position: relative via .main).\n When hasPermission is false it stays hidden and non-interactive. -->\n <cds-toggletip\n align=\"bottom\"\n class=\"element main\"\n [autoAlign]=\"true\"\n [isOpen]=\"open$ | async\"\n [ngClass]=\"{active: hasPermission && !isAssigned}\"\n (onOpen)=\"onOpenAssignToggletip()\"\n >\n <button\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"tertiary\"\n size=\"sm\"\n class=\"assign-button\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"user--follow\" size=\"16\"></svg>\n\n {{ assignButtonTranslationKey | translate }}\n </button>\n\n <div cdsToggletipContent class=\"assignment-popover-content\">\n <ng-container *ngIf=\"!obs.loading; else loadingTemplate\">\n <cds-combo-box\n *ngIf=\"obs.showUserComboBox && obs.userItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectUser' | translate\"\n [placeholder]=\"'assignment.selectUser' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.userItems\"\n [disabled]=\"obs.disabled\"\n (selected)=\"onUserSelect($event)\"\n (clear)=\"onUserClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <cds-combo-box\n *ngIf=\"obs.showTeamComboBox && obs.teamItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectTeam' | translate\"\n [placeholder]=\"'assignment.selectTeam' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.teamItems\"\n [disabled]=\"obs.disabled\"\n (selected)=\"onTeamSelect($event)\"\n (clear)=\"onTeamClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <button\n cdsButton\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n class=\"submit-button\"\n [disabled]=\"(!obs.selectedUserId && !obs.selectedTeamKey) || obs.disabled\"\n (click)=\"onConfirm()\"\n >\n {{ 'assignment.confirm' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"user--follow\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <ng-template #loadingTemplate>\n <span class=\"loading-text\" [attr.data-carbon-theme]=\"toggletipTheme$ | async\">\n {{ 'assignment.loading' | translate }}\n </span>\n </ng-template>\n </div>\n </cds-toggletip>\n </div>\n </ng-container>\n</ng-container>\n", styles: [":host ::ng-deep .cds--popover-content{max-inline-size:unset}.assignment-container{display:flex;align-items:center;justify-content:center;position:relative;font-weight:400;font-size:14px;line-height:18px;letter-spacing:.16px;color:var(--cds-link-01)}.assigned-display{display:flex;justify-content:flex-start;align-items:center;gap:8px;width:100%}.assignment-pill{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:calc(50% - 4px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.assignment-pill:only-child{max-width:100%}.assignment-pill .pill-icon{flex-shrink:0;fill:currentColor}.assignment-pill .pill-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.element{opacity:0;visibility:hidden;position:absolute;width:100%;transition:opacity .3s ease-in-out}.element.active{opacity:1;visibility:visible}.element.main{position:relative;width:auto}.assignment-popover-content{width:400px;max-inline-size:400px;display:flex;flex-direction:column;gap:16px}.assignment-popover-content .cds--btn{width:100%;max-width:unset}.assign-button{width:250px}.click-to-edit-button{width:100%}.submit-button{width:100%;max-width:unset}.loading-text{font-size:14px;color:var(--cds-text-secondary)}\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.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: ToggletipModule }, { kind: "component", type: i2$3.Toggletip, selector: "cds-toggletip, ibm-toggletip", inputs: ["id", "isOpen"] }, { kind: "directive", type: i2$3.ToggletipButton, selector: "[cdsToggletipButton], [ibmToggletipButton]", inputs: ["ariaLabel"] }, { kind: "directive", type: i2$3.ToggletipContent, selector: "[cdsToggletipContent], [ibmToggletipContent]" }, { 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: LayerModule }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { 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: "directive", type: RemoveClassnamesDirective, selector: "[removeClassnames]", inputs: ["removeClassnames"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22406
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: AssignmentComponent, isStandalone: true, selector: "valtimo-assignment", inputs: { mode: "mode", hasPermission: "hasPermission", compact: "compact", assigneeId: "assigneeId", assigneeFullName: "assigneeFullName", assignedTeamKey: "assignedTeamKey", assignedTeamTitle: "assignedTeamTitle", candidateUsers$: "candidateUsers$", candidateTeams$: "candidateTeams$" }, outputs: { assignmentChangedEvent: "assignmentChangedEvent", unassignedEvent: "unassignedEvent" }, host: { properties: { "style.display": "this.hostDisplay" } }, 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<ng-container\n *ngIf=\"{\n disabled: disabled$ | async,\n loading: loading$ | async,\n userItems: userItems$ | async,\n teamItems: teamItems$ | async,\n mouseIsOver: mouseIsOver$ | async,\n selectedUserId: selectedUserId$ | async,\n selectedTeamKey: selectedTeamKey$ | async,\n editToggletipOpen: editToggletipOpen$ | async,\n showUserComboBox: showUserComboBox$ | async,\n showTeamComboBox: showTeamComboBox$ | async,\n } as obs\"\n>\n <ng-container *ngIf=\"isAssigned || hasPermission\">\n <div\n [class.assignment-container--compact]=\"compact\"\n class=\"assignment-container\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n >\n <!-- Assigned state: display pills with icons -->\n <div\n class=\"assigned-display element\"\n [ngbTooltip]=\"compact ? assignedNames : null\"\n [ngClass]=\"{\n active: hasPermission\n ? isAssigned && !obs.mouseIsOver && !obs.editToggletipOpen\n : isAssigned,\n }\"\n >\n <span class=\"assignment-pill\" *ngIf=\"_assignedTeamKey\">\n <svg cdsIcon=\"group\" size=\"16\" class=\"pill-icon\"></svg>\n <span *ngIf=\"!compact\" class=\"pill-text\">{{ _assignedTeamTitle }}</span>\n </span>\n\n <span class=\"assignment-pill\" *ngIf=\"_assigneeId\">\n <svg cdsIcon=\"user\" size=\"16\" class=\"pill-icon\"></svg>\n <span *ngIf=\"!compact\" class=\"pill-text\">{{ _assigneeFullName || _assigneeId }}</span>\n </span>\n </div>\n\n <!-- Click to edit button (appears on hover when assigned) -->\n <cds-toggletip\n *ngIf=\"hasPermission && isAssigned\"\n align=\"bottom\"\n class=\"element\"\n [autoAlign]=\"true\"\n [isOpen]=\"open$ | async\"\n [ngClass]=\"{active: isAssigned && (obs.mouseIsOver || obs.editToggletipOpen)}\"\n (onOpen)=\"onOpenEditToggletip()\"\n (onClose)=\"onCloseEditToggletip()\"\n >\n <button\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"ghost\"\n [attr.aria-label]=\"compact ? ('assignment.clickToEdit' | translate) : null\"\n [iconOnly]=\"compact\"\n [ngbTooltip]=\"compact ? assignedNames : null\"\n [size]=\"compact ? 'md' : 'sm'\"\n class=\"click-to-edit-button\"\n >\n @if (compact) {\n <svg class=\"cds--btn__icon\" cdsIcon=\"edit\" size=\"16\"></svg>\n } @else {\n {{ 'assignment.clickToEdit' | translate }}\n }\n </button>\n\n <div cdsToggletipContent class=\"assignment-popover-content\">\n <cds-combo-box\n *ngIf=\"obs.showUserComboBox && obs.userItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectUser' | translate\"\n [placeholder]=\"'assignment.selectUser' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.userItems\"\n [disabled]=\"obs.disabled\"\n itemValueKey=\"id\"\n (selected)=\"onUserSelect($event)\"\n (clear)=\"onUserClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <cds-combo-box\n *ngIf=\"obs.showTeamComboBox && obs.teamItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectTeam' | translate\"\n [placeholder]=\"'assignment.selectTeam' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.teamItems\"\n [disabled]=\"obs.disabled\"\n itemValueKey=\"id\"\n (selected)=\"onTeamSelect($event)\"\n (clear)=\"onTeamClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <button\n cdsButton\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n [cdsLayer]=\"1\"\n class=\"submit-button\"\n [disabled]=\"!hasEditChanges || obs.disabled\"\n (click)=\"onUpdate()\"\n >\n {{ 'assignment.update' | translate }}\n </button>\n\n <button\n cdsButton=\"danger--tertiary\"\n [cdsLayer]=\"1\"\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n [disabled]=\"obs.disabled\"\n (click)=\"onUnassign()\"\n >\n {{ 'assignment.unassignAll' | translate }}\n </button>\n </div>\n </cds-toggletip>\n\n <!-- Assign button: always rendered for layout sizing (position: relative via .main).\n When hasPermission is false it stays hidden and non-interactive. -->\n <cds-toggletip\n align=\"bottom\"\n class=\"element main\"\n [autoAlign]=\"true\"\n [isOpen]=\"open$ | async\"\n [ngClass]=\"{active: hasPermission && !isAssigned}\"\n (onOpen)=\"onOpenAssignToggletip()\"\n >\n <button\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"tertiary\"\n [attr.aria-label]=\"compact ? (assignButtonTranslationKey | translate) : null\"\n [iconOnly]=\"compact\"\n [ngbTooltip]=\"compact ? (assignButtonTranslationKey | translate) : null\"\n [size]=\"compact ? 'md' : 'sm'\"\n class=\"assign-button\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"user--follow\" size=\"16\"></svg>\n\n @if (!compact) {\n {{ assignButtonTranslationKey | translate }}\n }\n </button>\n\n <div cdsToggletipContent class=\"assignment-popover-content\">\n <ng-container *ngIf=\"!obs.loading; else loadingTemplate\">\n <cds-combo-box\n *ngIf=\"obs.showUserComboBox && obs.userItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectUser' | translate\"\n [placeholder]=\"'assignment.selectUser' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.userItems\"\n [disabled]=\"obs.disabled\"\n (selected)=\"onUserSelect($event)\"\n (clear)=\"onUserClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <cds-combo-box\n *ngIf=\"obs.showTeamComboBox && obs.teamItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectTeam' | translate\"\n [placeholder]=\"'assignment.selectTeam' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.teamItems\"\n [disabled]=\"obs.disabled\"\n (selected)=\"onTeamSelect($event)\"\n (clear)=\"onTeamClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <button\n cdsButton\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n class=\"submit-button\"\n [disabled]=\"(!obs.selectedUserId && !obs.selectedTeamKey) || obs.disabled\"\n (click)=\"onConfirm()\"\n >\n {{ 'assignment.confirm' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"user--follow\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <ng-template #loadingTemplate>\n <span class=\"loading-text\" [attr.data-carbon-theme]=\"toggletipTheme$ | async\">\n {{ 'assignment.loading' | translate }}\n </span>\n </ng-template>\n </div>\n </cds-toggletip>\n </div>\n </ng-container>\n</ng-container>\n", styles: [":host ::ng-deep .cds--popover-content{max-inline-size:unset}.assignment-container{display:flex;align-items:center;justify-content:center;position:relative;font-weight:400;font-size:14px;line-height:18px;letter-spacing:.16px;color:var(--cds-link-01)}.assigned-display{display:flex;justify-content:flex-start;align-items:center;gap:8px;width:100%}.assignment-pill{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:calc(50% - 4px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.assignment-pill:only-child{max-width:100%}.assignment-pill .pill-icon{flex-shrink:0;fill:currentColor}.assignment-pill .pill-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.element{opacity:0;visibility:hidden;position:absolute;width:100%;transition:opacity .3s ease-in-out}.element.active{opacity:1;visibility:visible}.element.main{position:relative;width:auto}.assignment-popover-content{width:400px;max-inline-size:400px;display:flex;flex-direction:column;gap:16px}.assignment-popover-content .cds--btn{width:100%;max-width:unset}.assign-button{width:250px}.assignment-container--compact .assign-button,.assignment-container--compact .click-to-edit-button{inline-size:var(--cds-spacing-08);padding:0;align-items:center;justify-content:center}.assignment-container--compact .assigned-display{justify-content:center;gap:var(--cds-spacing-02)}.assignment-container--compact .assignment-pill{max-width:none}.click-to-edit-button{width:100%}.submit-button{width:100%;max-width:unset}.loading-text{font-size:14px;color:var(--cds-text-secondary)}\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.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: ToggletipModule }, { kind: "component", type: i2$3.Toggletip, selector: "cds-toggletip, ibm-toggletip", inputs: ["id", "isOpen"] }, { kind: "directive", type: i2$3.ToggletipButton, selector: "[cdsToggletipButton], [ibmToggletipButton]", inputs: ["ariaLabel"] }, { kind: "directive", type: i2$3.ToggletipContent, selector: "[cdsToggletipContent], [ibmToggletipContent]" }, { 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: LayerModule }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { 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: "directive", type: RemoveClassnamesDirective, selector: "[removeClassnames]", inputs: ["removeClassnames"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "directive", type: i11.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22016
22407
  }
22017
22408
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AssignmentComponent, decorators: [{
22018
22409
  type: Component,
@@ -22025,7 +22416,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
22025
22416
  LayerModule,
22026
22417
  ComboBoxModule,
22027
22418
  RemoveClassnamesDirective,
22028
- ], 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<ng-container\n *ngIf=\"{\n disabled: disabled$ | async,\n loading: loading$ | async,\n userItems: userItems$ | async,\n teamItems: teamItems$ | async,\n mouseIsOver: mouseIsOver$ | async,\n selectedUserId: selectedUserId$ | async,\n selectedTeamKey: selectedTeamKey$ | async,\n editToggletipOpen: editToggletipOpen$ | async,\n showUserComboBox: showUserComboBox$ | async,\n showTeamComboBox: showTeamComboBox$ | async,\n } as obs\"\n>\n <ng-container *ngIf=\"isAssigned || hasPermission\">\n <div\n class=\"assignment-container\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n >\n <!-- Assigned state: display pills with icons -->\n <div\n class=\"assigned-display element\"\n [ngClass]=\"{\n active: hasPermission\n ? isAssigned && !obs.mouseIsOver && !obs.editToggletipOpen\n : isAssigned,\n }\"\n >\n <span class=\"assignment-pill\" *ngIf=\"_assignedTeamKey\">\n <svg cdsIcon=\"group\" size=\"16\" class=\"pill-icon\"></svg>\n <span class=\"pill-text\">{{ _assignedTeamTitle }}</span>\n </span>\n\n <span class=\"assignment-pill\" *ngIf=\"_assigneeId\">\n <svg cdsIcon=\"user\" size=\"16\" class=\"pill-icon\"></svg>\n <span class=\"pill-text\">{{ _assigneeFullName || _assigneeId }}</span>\n </span>\n </div>\n\n <!-- Click to edit button (appears on hover when assigned) -->\n <cds-toggletip\n *ngIf=\"hasPermission && isAssigned\"\n align=\"bottom\"\n class=\"element\"\n [autoAlign]=\"true\"\n [isOpen]=\"open$ | async\"\n [ngClass]=\"{active: isAssigned && (obs.mouseIsOver || obs.editToggletipOpen)}\"\n (onOpen)=\"onOpenEditToggletip()\"\n (onClose)=\"onCloseEditToggletip()\"\n >\n <button\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"ghost\"\n size=\"sm\"\n class=\"click-to-edit-button\"\n >\n {{ 'assignment.clickToEdit' | translate }}\n </button>\n\n <div cdsToggletipContent class=\"assignment-popover-content\">\n <cds-combo-box\n *ngIf=\"obs.showUserComboBox && obs.userItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectUser' | translate\"\n [placeholder]=\"'assignment.selectUser' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.userItems\"\n [disabled]=\"obs.disabled\"\n itemValueKey=\"id\"\n (selected)=\"onUserSelect($event)\"\n (clear)=\"onUserClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <cds-combo-box\n *ngIf=\"obs.showTeamComboBox && obs.teamItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectTeam' | translate\"\n [placeholder]=\"'assignment.selectTeam' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.teamItems\"\n [disabled]=\"obs.disabled\"\n itemValueKey=\"id\"\n (selected)=\"onTeamSelect($event)\"\n (clear)=\"onTeamClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <button\n cdsButton\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n [cdsLayer]=\"1\"\n class=\"submit-button\"\n [disabled]=\"!hasEditChanges || obs.disabled\"\n (click)=\"onUpdate()\"\n >\n {{ 'assignment.update' | translate }}\n </button>\n\n <button\n cdsButton=\"danger--tertiary\"\n [cdsLayer]=\"1\"\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n [disabled]=\"obs.disabled\"\n (click)=\"onUnassign()\"\n >\n {{ 'assignment.unassignAll' | translate }}\n </button>\n </div>\n </cds-toggletip>\n\n <!-- Assign button: always rendered for layout sizing (position: relative via .main).\n When hasPermission is false it stays hidden and non-interactive. -->\n <cds-toggletip\n align=\"bottom\"\n class=\"element main\"\n [autoAlign]=\"true\"\n [isOpen]=\"open$ | async\"\n [ngClass]=\"{active: hasPermission && !isAssigned}\"\n (onOpen)=\"onOpenAssignToggletip()\"\n >\n <button\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"tertiary\"\n size=\"sm\"\n class=\"assign-button\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"user--follow\" size=\"16\"></svg>\n\n {{ assignButtonTranslationKey | translate }}\n </button>\n\n <div cdsToggletipContent class=\"assignment-popover-content\">\n <ng-container *ngIf=\"!obs.loading; else loadingTemplate\">\n <cds-combo-box\n *ngIf=\"obs.showUserComboBox && obs.userItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectUser' | translate\"\n [placeholder]=\"'assignment.selectUser' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.userItems\"\n [disabled]=\"obs.disabled\"\n (selected)=\"onUserSelect($event)\"\n (clear)=\"onUserClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <cds-combo-box\n *ngIf=\"obs.showTeamComboBox && obs.teamItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectTeam' | translate\"\n [placeholder]=\"'assignment.selectTeam' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.teamItems\"\n [disabled]=\"obs.disabled\"\n (selected)=\"onTeamSelect($event)\"\n (clear)=\"onTeamClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <button\n cdsButton\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n class=\"submit-button\"\n [disabled]=\"(!obs.selectedUserId && !obs.selectedTeamKey) || obs.disabled\"\n (click)=\"onConfirm()\"\n >\n {{ 'assignment.confirm' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"user--follow\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <ng-template #loadingTemplate>\n <span class=\"loading-text\" [attr.data-carbon-theme]=\"toggletipTheme$ | async\">\n {{ 'assignment.loading' | translate }}\n </span>\n </ng-template>\n </div>\n </cds-toggletip>\n </div>\n </ng-container>\n</ng-container>\n", styles: [":host ::ng-deep .cds--popover-content{max-inline-size:unset}.assignment-container{display:flex;align-items:center;justify-content:center;position:relative;font-weight:400;font-size:14px;line-height:18px;letter-spacing:.16px;color:var(--cds-link-01)}.assigned-display{display:flex;justify-content:flex-start;align-items:center;gap:8px;width:100%}.assignment-pill{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:calc(50% - 4px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.assignment-pill:only-child{max-width:100%}.assignment-pill .pill-icon{flex-shrink:0;fill:currentColor}.assignment-pill .pill-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.element{opacity:0;visibility:hidden;position:absolute;width:100%;transition:opacity .3s ease-in-out}.element.active{opacity:1;visibility:visible}.element.main{position:relative;width:auto}.assignment-popover-content{width:400px;max-inline-size:400px;display:flex;flex-direction:column;gap:16px}.assignment-popover-content .cds--btn{width:100%;max-width:unset}.assign-button{width:250px}.click-to-edit-button{width:100%}.submit-button{width:100%;max-width:unset}.loading-text{font-size:14px;color:var(--cds-text-secondary)}\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"] }]
22419
+ NgbTooltipModule,
22420
+ ], 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<ng-container\n *ngIf=\"{\n disabled: disabled$ | async,\n loading: loading$ | async,\n userItems: userItems$ | async,\n teamItems: teamItems$ | async,\n mouseIsOver: mouseIsOver$ | async,\n selectedUserId: selectedUserId$ | async,\n selectedTeamKey: selectedTeamKey$ | async,\n editToggletipOpen: editToggletipOpen$ | async,\n showUserComboBox: showUserComboBox$ | async,\n showTeamComboBox: showTeamComboBox$ | async,\n } as obs\"\n>\n <ng-container *ngIf=\"isAssigned || hasPermission\">\n <div\n [class.assignment-container--compact]=\"compact\"\n class=\"assignment-container\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n >\n <!-- Assigned state: display pills with icons -->\n <div\n class=\"assigned-display element\"\n [ngbTooltip]=\"compact ? assignedNames : null\"\n [ngClass]=\"{\n active: hasPermission\n ? isAssigned && !obs.mouseIsOver && !obs.editToggletipOpen\n : isAssigned,\n }\"\n >\n <span class=\"assignment-pill\" *ngIf=\"_assignedTeamKey\">\n <svg cdsIcon=\"group\" size=\"16\" class=\"pill-icon\"></svg>\n <span *ngIf=\"!compact\" class=\"pill-text\">{{ _assignedTeamTitle }}</span>\n </span>\n\n <span class=\"assignment-pill\" *ngIf=\"_assigneeId\">\n <svg cdsIcon=\"user\" size=\"16\" class=\"pill-icon\"></svg>\n <span *ngIf=\"!compact\" class=\"pill-text\">{{ _assigneeFullName || _assigneeId }}</span>\n </span>\n </div>\n\n <!-- Click to edit button (appears on hover when assigned) -->\n <cds-toggletip\n *ngIf=\"hasPermission && isAssigned\"\n align=\"bottom\"\n class=\"element\"\n [autoAlign]=\"true\"\n [isOpen]=\"open$ | async\"\n [ngClass]=\"{active: isAssigned && (obs.mouseIsOver || obs.editToggletipOpen)}\"\n (onOpen)=\"onOpenEditToggletip()\"\n (onClose)=\"onCloseEditToggletip()\"\n >\n <button\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"ghost\"\n [attr.aria-label]=\"compact ? ('assignment.clickToEdit' | translate) : null\"\n [iconOnly]=\"compact\"\n [ngbTooltip]=\"compact ? assignedNames : null\"\n [size]=\"compact ? 'md' : 'sm'\"\n class=\"click-to-edit-button\"\n >\n @if (compact) {\n <svg class=\"cds--btn__icon\" cdsIcon=\"edit\" size=\"16\"></svg>\n } @else {\n {{ 'assignment.clickToEdit' | translate }}\n }\n </button>\n\n <div cdsToggletipContent class=\"assignment-popover-content\">\n <cds-combo-box\n *ngIf=\"obs.showUserComboBox && obs.userItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectUser' | translate\"\n [placeholder]=\"'assignment.selectUser' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.userItems\"\n [disabled]=\"obs.disabled\"\n itemValueKey=\"id\"\n (selected)=\"onUserSelect($event)\"\n (clear)=\"onUserClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <cds-combo-box\n *ngIf=\"obs.showTeamComboBox && obs.teamItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectTeam' | translate\"\n [placeholder]=\"'assignment.selectTeam' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.teamItems\"\n [disabled]=\"obs.disabled\"\n itemValueKey=\"id\"\n (selected)=\"onTeamSelect($event)\"\n (clear)=\"onTeamClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <button\n cdsButton\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n [cdsLayer]=\"1\"\n class=\"submit-button\"\n [disabled]=\"!hasEditChanges || obs.disabled\"\n (click)=\"onUpdate()\"\n >\n {{ 'assignment.update' | translate }}\n </button>\n\n <button\n cdsButton=\"danger--tertiary\"\n [cdsLayer]=\"1\"\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n [disabled]=\"obs.disabled\"\n (click)=\"onUnassign()\"\n >\n {{ 'assignment.unassignAll' | translate }}\n </button>\n </div>\n </cds-toggletip>\n\n <!-- Assign button: always rendered for layout sizing (position: relative via .main).\n When hasPermission is false it stays hidden and non-interactive. -->\n <cds-toggletip\n align=\"bottom\"\n class=\"element main\"\n [autoAlign]=\"true\"\n [isOpen]=\"open$ | async\"\n [ngClass]=\"{active: hasPermission && !isAssigned}\"\n (onOpen)=\"onOpenAssignToggletip()\"\n >\n <button\n cdsToggletipButton\n [removeClassnames]=\"['cds--toggletip-button']\"\n cdsButton=\"tertiary\"\n [attr.aria-label]=\"compact ? (assignButtonTranslationKey | translate) : null\"\n [iconOnly]=\"compact\"\n [ngbTooltip]=\"compact ? (assignButtonTranslationKey | translate) : null\"\n [size]=\"compact ? 'md' : 'sm'\"\n class=\"assign-button\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"user--follow\" size=\"16\"></svg>\n\n @if (!compact) {\n {{ assignButtonTranslationKey | translate }}\n }\n </button>\n\n <div cdsToggletipContent class=\"assignment-popover-content\">\n <ng-container *ngIf=\"!obs.loading; else loadingTemplate\">\n <cds-combo-box\n *ngIf=\"obs.showUserComboBox && obs.userItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectUser' | translate\"\n [placeholder]=\"'assignment.selectUser' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.userItems\"\n [disabled]=\"obs.disabled\"\n (selected)=\"onUserSelect($event)\"\n (clear)=\"onUserClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <cds-combo-box\n *ngIf=\"obs.showTeamComboBox && obs.teamItems?.length > 0\"\n [attr.data-carbon-theme]=\"toggletipDropdownTheme$ | async\"\n [label]=\"'assignment.selectTeam' | translate\"\n [placeholder]=\"'assignment.selectTeam' | translate\"\n [appendInline]=\"true\"\n [dropUp]=\"false\"\n [cdsLayer]=\"1\"\n [items]=\"obs.teamItems\"\n [disabled]=\"obs.disabled\"\n (selected)=\"onTeamSelect($event)\"\n (clear)=\"onTeamClear()\"\n >\n <cds-dropdown-list onclick=\"event.stopPropagation()\"></cds-dropdown-list>\n </cds-combo-box>\n\n <button\n cdsButton\n [attr.data-carbon-theme]=\"toggletipTheme$ | async\"\n class=\"submit-button\"\n [disabled]=\"(!obs.selectedUserId && !obs.selectedTeamKey) || obs.disabled\"\n (click)=\"onConfirm()\"\n >\n {{ 'assignment.confirm' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"user--follow\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <ng-template #loadingTemplate>\n <span class=\"loading-text\" [attr.data-carbon-theme]=\"toggletipTheme$ | async\">\n {{ 'assignment.loading' | translate }}\n </span>\n </ng-template>\n </div>\n </cds-toggletip>\n </div>\n </ng-container>\n</ng-container>\n", styles: [":host ::ng-deep .cds--popover-content{max-inline-size:unset}.assignment-container{display:flex;align-items:center;justify-content:center;position:relative;font-weight:400;font-size:14px;line-height:18px;letter-spacing:.16px;color:var(--cds-link-01)}.assigned-display{display:flex;justify-content:flex-start;align-items:center;gap:8px;width:100%}.assignment-pill{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:calc(50% - 4px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.assignment-pill:only-child{max-width:100%}.assignment-pill .pill-icon{flex-shrink:0;fill:currentColor}.assignment-pill .pill-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.element{opacity:0;visibility:hidden;position:absolute;width:100%;transition:opacity .3s ease-in-out}.element.active{opacity:1;visibility:visible}.element.main{position:relative;width:auto}.assignment-popover-content{width:400px;max-inline-size:400px;display:flex;flex-direction:column;gap:16px}.assignment-popover-content .cds--btn{width:100%;max-width:unset}.assign-button{width:250px}.assignment-container--compact .assign-button,.assignment-container--compact .click-to-edit-button{inline-size:var(--cds-spacing-08);padding:0;align-items:center;justify-content:center}.assignment-container--compact .assigned-display{justify-content:center;gap:var(--cds-spacing-02)}.assignment-container--compact .assignment-pill{max-width:none}.click-to-edit-button{width:100%}.submit-button{width:100%;max-width:unset}.loading-text{font-size:14px;color:var(--cds-text-secondary)}\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"] }]
22029
22421
  }], ctorParameters: () => [{ type: CdsThemeService }, { type: i2$3.IconService }, { type: i1.TranslateService }, { type: i6$1.UserProviderService }], propDecorators: { hostDisplay: [{
22030
22422
  type: HostBinding,
22031
22423
  args: ['style.display']
@@ -22033,6 +22425,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
22033
22425
  type: Input
22034
22426
  }], hasPermission: [{
22035
22427
  type: Input
22428
+ }], compact: [{
22429
+ type: Input
22036
22430
  }], assigneeId: [{
22037
22431
  type: Input
22038
22432
  }], assigneeFullName: [{
@@ -22286,5 +22680,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
22286
22680
  * Generated bundle index. Do not edit.
22287
22681
  */
22288
22682
 
22289
- 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_CONDITION_TREE_TEST_IDS, VALUE_PATH_SELECTOR_DROPDOWN_VALUE_TEST_IDS, VALUE_PATH_SELECTOR_TEST_IDS, VALUE_PATH_SELECTOR_VALUE_TEST_IDS, VModalComponent, VModalModule, ValtimoCdsModalDirective, ValtimoModalService, ValueConditionTreeComponent, ValueConditionTreeService, 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 };
22683
+ 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, SIDE_PANEL_TEST_IDS, SINGLE_VALUE_TEST_IDS, STEPPER_FOOTER_STEP_TEST_IDS, SchemaEditorComponent, SearchFieldsComponent, SearchFieldsModule, SelectComponent, SelectModule, SelectableCarbonTheme, ShellService, SidePanelComponent, SidePanelService, 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_CONDITION_TREE_TEST_IDS, VALUE_PATH_SELECTOR_DROPDOWN_VALUE_TEST_IDS, VALUE_PATH_SELECTOR_TEST_IDS, VALUE_PATH_SELECTOR_VALUE_TEST_IDS, VModalComponent, VModalModule, ValtimoCdsModalDirective, ValtimoModalService, ValueConditionTreeComponent, ValueConditionTreeService, 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, borderBoxWidth, buildMenuConfigurationFromRuntimeMenu, collectObjectLevels, contentBoxWidth, createCustomFormioComponent, customUploaderType, enableCustomFormioComponents, findMenuCatalogEntryByLink, findMenuCatalogGroupEntryByTitle, fromMutationObserver, fromResizeObserver, getMenuCatalogEntry, hasSavedMenuConfiguration, includeFunctionToName, menuInitializer, menuLinkToString, muuriGapFreeLayout, normaliseMenuLink, parseIncludeFunction, pendingChangesGuard, registerCustomFormioComponent, registerCustomTag, registerFormioCurrencyComponent, registerFormioCurrentUserComponent, registerFormioFileSelectorComponent, registerFormioIbanComponent, registerFormioMailPreviewComponent, registerFormioUploadComponent, registerFormioValueResolverSelectorComponent, registerObjectManagementSelectFormioComponent, resolveMenuConfiguration, resolveWidgetLayout, runAfterCarbonModalClosed, serializeIncludeFunction, setRequiredOnSchema };
22290
22684
  //# sourceMappingURL=valtimo-components.mjs.map