@valtimo/components 13.49.0 → 13.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/assets/css/compatibility.scss +1 -1
  2. package/fesm2022/valtimo-components.mjs +397 -33
  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/page-header/page-header.component.d.ts +3 -1
  7. package/lib/components/page-header/page-header.component.d.ts.map +1 -1
  8. package/lib/components/side-panel/side-panel.component.d.ts +47 -0
  9. package/lib/components/side-panel/side-panel.component.d.ts.map +1 -0
  10. package/lib/constants/components.test-ids.d.ts +9 -0
  11. package/lib/constants/components.test-ids.d.ts.map +1 -1
  12. package/lib/directives/render-in-page-header/render-in-page-header.directive.d.ts +3 -1
  13. package/lib/directives/render-in-page-header/render-in-page-header.directive.d.ts.map +1 -1
  14. package/lib/models/index.d.ts +1 -0
  15. package/lib/models/index.d.ts.map +1 -1
  16. package/lib/models/side-panel.model.d.ts +48 -0
  17. package/lib/models/side-panel.model.d.ts.map +1 -0
  18. package/lib/services/index.d.ts +1 -0
  19. package/lib/services/index.d.ts.map +1 -1
  20. package/lib/services/page-title.service.d.ts +10 -0
  21. package/lib/services/page-title.service.d.ts.map +1 -1
  22. package/lib/services/side-panel.service.d.ts +40 -0
  23. package/lib/services/side-panel.service.d.ts.map +1 -0
  24. package/lib/utils/index.d.ts +1 -0
  25. package/lib/utils/index.d.ts.map +1 -1
  26. package/lib/utils/observer.utils.d.ts +15 -0
  27. package/lib/utils/observer.utils.d.ts.map +1 -0
  28. package/package.json +1 -1
  29. package/public_api.d.ts +1 -0
  30. 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';
@@ -779,6 +780,22 @@ var ValuePathSelectorInputMode;
779
780
  * limitations under the License.
780
781
  */
781
782
 
783
+ /*
784
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
785
+ *
786
+ * Licensed under EUPL, Version 1.2 (the "License");
787
+ * you may not use this file except in compliance with the License.
788
+ * You may obtain a copy of the License at
789
+ *
790
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
791
+ *
792
+ * Unless required by applicable law or agreed to in writing, software
793
+ * distributed under the License is distributed on an "AS IS" basis,
794
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
795
+ * See the License for the specific language governing permissions and
796
+ * limitations under the License.
797
+ */
798
+
782
799
  /*
783
800
  * Copyright 2015-2025 Ritense BV, the Netherlands.
784
801
  *
@@ -1185,6 +1202,15 @@ const SEARCH_FIELDS_TEST_IDS = {
1185
1202
  * itself is one level down.
1186
1203
  */
1187
1204
  const SEARCH_FIELD_TEST_ID_PREFIX = 'searchField-';
1205
+ const SIDE_PANEL_TEST_IDS = {
1206
+ panel: 'sidePanel',
1207
+ closeButton: 'sidePanelCloseButton',
1208
+ resizeHandle: 'sidePanelResizeHandle',
1209
+ subtitleLink: 'sidePanelSubtitleLink',
1210
+ pinnedIcon: 'sidePanelPinnedIcon',
1211
+ origin: 'sidePanelOrigin',
1212
+ originElsewhere: 'sidePanelOriginElsewhere',
1213
+ };
1188
1214
 
1189
1215
  /*
1190
1216
  * Copyright 2015-2025 Ritense BV, the Netherlands.
@@ -2017,6 +2043,12 @@ class PageTitleService {
2017
2043
  get pageActionsFullWidth$() {
2018
2044
  return this._pageActionsFullWidth$.asObservable();
2019
2045
  }
2046
+ get pageActionsWrap$() {
2047
+ return this._pageActionsWrap$.asObservable();
2048
+ }
2049
+ get pageActionsMinWidth$() {
2050
+ return this._pageActionsMinWidth$.asObservable();
2051
+ }
2020
2052
  get pageTitleHidden$() {
2021
2053
  return this._pageTitleHidden$.asObservable();
2022
2054
  }
@@ -2032,6 +2064,8 @@ class PageTitleService {
2032
2064
  this._customPageSubtitleSet$ = new BehaviorSubject(false);
2033
2065
  this._hasPageActions$ = new BehaviorSubject(false);
2034
2066
  this._pageActionsFullWidth$ = new BehaviorSubject(false);
2067
+ this._pageActionsWrap$ = new BehaviorSubject(false);
2068
+ this._pageActionsMinWidth$ = new BehaviorSubject(null);
2035
2069
  this._pageActionsViewContainerRef$ = new BehaviorSubject(null);
2036
2070
  this._pageTitleHidden$ = new BehaviorSubject(false);
2037
2071
  this._currentTitle$ = new BehaviorSubject('');
@@ -2067,6 +2101,16 @@ class PageTitleService {
2067
2101
  setPageActionsFullWidth(value) {
2068
2102
  this._pageActionsFullWidth$.next(value);
2069
2103
  }
2104
+ setPageActionsWrap(value) {
2105
+ this._pageActionsWrap$.next(value);
2106
+ }
2107
+ /**
2108
+ * The narrowest width wrapping page actions can adapt to. They stay beside the title as long as
2109
+ * this fits; null means their natural width.
2110
+ */
2111
+ setPageActionsMinWidth(width) {
2112
+ this._pageActionsMinWidth$.next(width);
2113
+ }
2070
2114
  setCustomPageTitleSet(set) {
2071
2115
  this._customPageTitleSet$.next(set);
2072
2116
  }
@@ -2097,6 +2141,8 @@ class PageTitleService {
2097
2141
  if (pageActionsViewContainerRef && !preventReset) {
2098
2142
  pageActionsViewContainerRef.clear();
2099
2143
  this.setHasPageActions(false);
2144
+ this.setPageActionsWrap(false);
2145
+ this.setPageActionsMinWidth(null);
2100
2146
  }
2101
2147
  }))
2102
2148
  .subscribe();
@@ -2901,6 +2947,163 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
2901
2947
  }]
2902
2948
  }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i1$2.ConfigService }] });
2903
2949
 
2950
+ /*
2951
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
2952
+ *
2953
+ * Licensed under EUPL, Version 1.2 (the "License");
2954
+ * you may not use this file except in compliance with the License.
2955
+ * You may obtain a copy of the License at
2956
+ *
2957
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2958
+ *
2959
+ * Unless required by applicable law or agreed to in writing, software
2960
+ * distributed under the License is distributed on an "AS IS" basis,
2961
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2962
+ * See the License for the specific language governing permissions and
2963
+ * limitations under the License.
2964
+ */
2965
+ const SIDE_PANEL_WIDTH_STORAGE_KEY = 'sidePanelWidth';
2966
+ const SIDE_PANEL_DEFAULT_WIDTH = 480;
2967
+ const SIDE_PANEL_MIN_WIDTH = 320;
2968
+ const SIDE_PANEL_MAX_WIDTH = 960;
2969
+ class SidePanelHandleImpl {
2970
+ constructor(_onHide, _onWithdraw) {
2971
+ this._onHide = _onHide;
2972
+ this._onWithdraw = _onWithdraw;
2973
+ this._dismissed$ = new Subject();
2974
+ this._replaced$ = new Subject();
2975
+ this._resized$ = new Subject();
2976
+ this.dismissed$ = this._dismissed$.asObservable();
2977
+ this.replaced$ = this._replaced$.asObservable();
2978
+ this.resized$ = this._resized$.asObservable();
2979
+ }
2980
+ hide() {
2981
+ this._onHide(this);
2982
+ }
2983
+ withdraw() {
2984
+ this._onWithdraw(this);
2985
+ }
2986
+ notifyDismissed() {
2987
+ this._dismissed$.next();
2988
+ }
2989
+ notifyReplaced() {
2990
+ this._replaced$.next();
2991
+ this._dismissed$.complete();
2992
+ this._replaced$.complete();
2993
+ this._resized$.complete();
2994
+ }
2995
+ notifyResized(width) {
2996
+ this._resized$.next(width);
2997
+ }
2998
+ }
2999
+ /**
3000
+ * App-wide side panel next to the routed content. Knows nothing about what it shows: providers
3001
+ * offer content, the latest offer takes over. Dismissing only hides; the content stays alive until
3002
+ * withdrawn or replaced.
3003
+ */
3004
+ class SidePanelService {
3005
+ constructor() {
3006
+ this._current$ = new BehaviorSubject(null);
3007
+ this._visible$ = new BehaviorSubject(false);
3008
+ this._preferredWidth$ = new BehaviorSubject(this.loadWidth());
3009
+ /** Width of content that brings its own; such content persists it, not the panel. */
3010
+ this._contentWidth$ = new BehaviorSubject(null);
3011
+ this._currentHandle = null;
3012
+ }
3013
+ get current$() {
3014
+ return this._current$.asObservable();
3015
+ }
3016
+ get visible$() {
3017
+ return this._visible$.asObservable();
3018
+ }
3019
+ /** The content's own width or else the user's preferred width, widened to the content's minimum. */
3020
+ get width$() {
3021
+ return combineLatest([this._preferredWidth$, this._contentWidth$, this._current$]).pipe(map(([preferred, contentWidth, current]) => this.clampWidth(Math.max(contentWidth ?? preferred, current?.minWidth ?? 0))), distinctUntilChanged());
3022
+ }
3023
+ dismiss() {
3024
+ if (!this._visible$.getValue())
3025
+ return;
3026
+ this._visible$.next(false);
3027
+ this._currentHandle?.notifyDismissed();
3028
+ }
3029
+ offer(offer) {
3030
+ const current = this._current$.getValue();
3031
+ if (this._currentHandle && current?.key === offer.key) {
3032
+ // Only a changed width from the provider wins over a resize it has not caught up with yet.
3033
+ if (offer.width !== current.width)
3034
+ this._contentWidth$.next(offer.width ?? null);
3035
+ this._current$.next(offer);
3036
+ this._visible$.next(true);
3037
+ return this._currentHandle;
3038
+ }
3039
+ this._currentHandle?.notifyReplaced();
3040
+ const handle = new SidePanelHandleImpl(hidden => this.hideHandle(hidden), withdrawn => this.withdrawHandle(withdrawn));
3041
+ this._currentHandle = handle;
3042
+ this._contentWidth$.next(offer.width ?? null);
3043
+ this._current$.next(offer);
3044
+ this._visible$.next(true);
3045
+ return handle;
3046
+ }
3047
+ /**
3048
+ * Shows retained content again, also when hidden via `SidePanelHandle.hide()`. Does not notify
3049
+ * the provider.
3050
+ */
3051
+ reopen() {
3052
+ if (this._current$.getValue())
3053
+ this._visible$.next(true);
3054
+ }
3055
+ /** Withdraws the current content only when it still carries [key]. */
3056
+ withdraw(key) {
3057
+ if (this._current$.getValue()?.key === key && this._currentHandle) {
3058
+ this.withdrawHandle(this._currentHandle);
3059
+ }
3060
+ }
3061
+ /** Resizes live. Call [endResize] once the user lets go. */
3062
+ setWidth(width) {
3063
+ const clamped = this.clampWidth(width);
3064
+ if (this._contentWidth$.getValue() !== null) {
3065
+ this._contentWidth$.next(clamped);
3066
+ return;
3067
+ }
3068
+ this._preferredWidth$.next(clamped);
3069
+ localStorage.setItem(SIDE_PANEL_WIDTH_STORAGE_KEY, `${clamped}`);
3070
+ }
3071
+ /** Reports the final width to the provider of the current content. */
3072
+ endResize() {
3073
+ this._currentHandle?.notifyResized(this._contentWidth$.getValue() ?? this._preferredWidth$.getValue());
3074
+ }
3075
+ clampWidth(width) {
3076
+ const max = Math.min(SIDE_PANEL_MAX_WIDTH, Math.floor(window.innerWidth * 0.6));
3077
+ return Math.round(Math.max(SIDE_PANEL_MIN_WIDTH, Math.min(width, max)));
3078
+ }
3079
+ hideHandle(handle) {
3080
+ if (handle === this._currentHandle && this._visible$.getValue())
3081
+ this._visible$.next(false);
3082
+ }
3083
+ loadWidth() {
3084
+ const stored = Number(localStorage.getItem(SIDE_PANEL_WIDTH_STORAGE_KEY));
3085
+ return Number.isFinite(stored) && stored > 0
3086
+ ? this.clampWidth(stored)
3087
+ : SIDE_PANEL_DEFAULT_WIDTH;
3088
+ }
3089
+ withdrawHandle(handle) {
3090
+ if (handle !== this._currentHandle)
3091
+ return;
3092
+ this._currentHandle = null;
3093
+ this._contentWidth$.next(null);
3094
+ this._current$.next(null);
3095
+ this._visible$.next(false);
3096
+ }
3097
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3098
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelService, providedIn: 'root' }); }
3099
+ }
3100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelService, decorators: [{
3101
+ type: Injectable,
3102
+ args: [{
3103
+ providedIn: 'root',
3104
+ }]
3105
+ }] });
3106
+
2904
3107
  /*
2905
3108
  * Copyright 2015-2025 Ritense BV, the Netherlands.
2906
3109
  *
@@ -3415,6 +3618,42 @@ const setRequiredOnSchema = (schema, path, property, isRequired) => {
3415
3618
  return schema;
3416
3619
  };
3417
3620
 
3621
+ /*
3622
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
3623
+ *
3624
+ * Licensed under EUPL, Version 1.2 (the "License");
3625
+ * you may not use this file except in compliance with the License.
3626
+ * You may obtain a copy of the License at
3627
+ *
3628
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
3629
+ *
3630
+ * Unless required by applicable law or agreed to in writing, software
3631
+ * distributed under the License is distributed on an "AS IS" basis,
3632
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3633
+ * See the License for the specific language governing permissions and
3634
+ * limitations under the License.
3635
+ */
3636
+ /**
3637
+ * Resize observations of [elements]. Lazy: the observer opens on subscribe and disconnects on
3638
+ * unsubscribe. Emits each batch of entries from inside the observer callback, when layout is
3639
+ * fresh, so reading sizes there forces no extra layout. Runs in whatever zone it is subscribed in.
3640
+ */
3641
+ const fromResizeObserver = (elements, options) => new Observable(subscriber => {
3642
+ const observer = new ResizeObserver(entries => subscriber.next(entries));
3643
+ (Array.isArray(elements) ? elements : [elements]).forEach(element => observer.observe(element, options));
3644
+ return () => observer.disconnect();
3645
+ });
3646
+ /** Mutation records of [target]. Lazy like [fromResizeObserver]. */
3647
+ const fromMutationObserver = (target, options) => new Observable(subscriber => {
3648
+ const observer = new MutationObserver(records => subscriber.next(records));
3649
+ observer.observe(target, options);
3650
+ return () => observer.disconnect();
3651
+ });
3652
+ /** The border-box inline size of a resize entry, in CSS pixels. */
3653
+ const borderBoxWidth = (entry) => entry.borderBoxSize?.[0]?.inlineSize ?? entry.target.getBoundingClientRect().width;
3654
+ /** The content-box inline size of a resize entry, in CSS pixels. */
3655
+ const contentBoxWidth = (entry) => entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;
3656
+
3418
3657
  /*
3419
3658
  * Copyright 2015-2025 Ritense BV, the Netherlands.
3420
3659
  *
@@ -4375,7 +4614,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
4375
4614
 
4376
4615
  class MenuService {
4377
4616
  get menuItems$() {
4378
- return this._menuItems$.pipe(distinctUntilChanged((prev, curr) => isEqual(prev, curr)));
4617
+ return this._menuItems$.pipe(distinctUntilChanged$1((prev, curr) => isEqual(prev, curr)));
4379
4618
  }
4380
4619
  get menuItemsLoaded$() {
4381
4620
  return this._menuItems$.pipe(map$1(items => Array.isArray(items) && items.length > 0));
@@ -4409,7 +4648,7 @@ class MenuService {
4409
4648
  });
4410
4649
  });
4411
4650
  return closestSequence;
4412
- }), distinctUntilChanged());
4651
+ }), distinctUntilChanged$1());
4413
4652
  }
4414
4653
  constructor(configService, http, logger, menuIncludeService, pendingChangesService, router, userProviderService, keycloakService) {
4415
4654
  this.configService = configService;
@@ -6160,6 +6399,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
6160
6399
  }]
6161
6400
  }] });
6162
6401
 
6402
+ /*
6403
+ * Copyright 2015-2026 Ritense BV, the Netherlands.
6404
+ *
6405
+ * Licensed under EUPL, Version 1.2 (the "License");
6406
+ * you may not use this file except in compliance with the License.
6407
+ * You may obtain a copy of the License at
6408
+ *
6409
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
6410
+ *
6411
+ * Unless required by applicable law or agreed to in writing, software
6412
+ * distributed under the License is distributed on an "AS IS" basis,
6413
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6414
+ * See the License for the specific language governing permissions and
6415
+ * limitations under the License.
6416
+ */
6417
+ const SIDE_PANEL_OFFSET_PROPERTY = '--valtimo-side-panel-offset';
6418
+ const SIDE_PANEL_KEYBOARD_RESIZE_STEP = 16;
6419
+ /**
6420
+ * Fixed panel at the right edge of the internal layout. Rendered once next to the router outlet so
6421
+ * its content survives navigation; showing and hiding is CSS only, because moving an iframe in the
6422
+ * DOM reloads it. Publishes its occupied width as `--valtimo-side-panel-offset` so the layout can
6423
+ * push the page content aside.
6424
+ */
6425
+ class SidePanelComponent {
6426
+ constructor(iconService, router, shellService, sidePanelService) {
6427
+ this.iconService = iconService;
6428
+ this.router = router;
6429
+ this.shellService = shellService;
6430
+ this.sidePanelService = sidePanelService;
6431
+ this.$current = toSignal(this.sidePanelService.current$, { initialValue: null });
6432
+ this.$offers = computed(() => {
6433
+ const current = this.$current();
6434
+ return current ? [current] : [];
6435
+ });
6436
+ /** The origin's label; null while a resolving label has not arrived. */
6437
+ this.$originLabel = toSignal(toObservable(this.$current).pipe(switchMap(current => {
6438
+ const label = current?.origin?.label;
6439
+ if (label === undefined)
6440
+ return of(null);
6441
+ return isObservable(label) ? label.pipe(startWith(null)) : of(label);
6442
+ })), { initialValue: null });
6443
+ /** The user is on a page other than the one the content belongs to. */
6444
+ this.$originElsewhere = computed(() => {
6445
+ const origin = this.$current()?.origin;
6446
+ if (!origin)
6447
+ return false;
6448
+ const originUrl = this.router.serializeUrl(this.router.createUrlTree(origin.route));
6449
+ const url = this._$url().split(/[?#]/)[0];
6450
+ return url !== originUrl && !url.startsWith(`${originUrl}/`);
6451
+ });
6452
+ this.$resizing = signal(false);
6453
+ this.$visible = toSignal(this.sidePanelService.visible$, { initialValue: false });
6454
+ this.$width = toSignal(this.sidePanelService.width$, { requireSync: true });
6455
+ this.testIds = SIDE_PANEL_TEST_IDS;
6456
+ this._endResize = null;
6457
+ this._$largeScreen = toSignal(this.shellService.largeScreen$, { initialValue: true });
6458
+ this._$url = toSignal(this.router.events.pipe(filter$1((event) => event instanceof NavigationEnd), map(event => event.urlAfterRedirects), startWith(this.router.url)), { requireSync: true });
6459
+ this.iconService.registerAll([Close16, PinFilled16]);
6460
+ // Small screens: overlay instead of push.
6461
+ effect(() => {
6462
+ const offset = this.$current() && this.$visible() && this._$largeScreen() ? this.$width() : 0;
6463
+ document.documentElement.style.setProperty(SIDE_PANEL_OFFSET_PROPERTY, `${offset}px`);
6464
+ });
6465
+ }
6466
+ ngOnDestroy() {
6467
+ this._endResize?.();
6468
+ document.documentElement.style.removeProperty(SIDE_PANEL_OFFSET_PROPERTY);
6469
+ }
6470
+ onClose() {
6471
+ this.sidePanelService.dismiss();
6472
+ }
6473
+ onResizeKey(delta) {
6474
+ this.sidePanelService.setWidth(this.$width() + delta * SIDE_PANEL_KEYBOARD_RESIZE_STEP);
6475
+ this.sidePanelService.endResize();
6476
+ }
6477
+ onResizeStart(event) {
6478
+ event.preventDefault();
6479
+ this.$resizing.set(true);
6480
+ document.body.style.setProperty('cursor', 'col-resize');
6481
+ document.body.style.setProperty('user-select', 'none');
6482
+ const onMove = (moveEvent) => this.sidePanelService.setWidth(window.innerWidth - moveEvent.clientX);
6483
+ const onUp = () => {
6484
+ this.$resizing.set(false);
6485
+ document.body.style.removeProperty('cursor');
6486
+ document.body.style.removeProperty('user-select');
6487
+ document.removeEventListener('mousemove', onMove);
6488
+ document.removeEventListener('mouseup', onUp);
6489
+ this.sidePanelService.endResize();
6490
+ this._endResize = null;
6491
+ };
6492
+ this._endResize = onUp;
6493
+ document.addEventListener('mousemove', onMove);
6494
+ document.addEventListener('mouseup', onUp);
6495
+ }
6496
+ 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 }); }
6497
+ 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 }); }
6498
+ }
6499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SidePanelComponent, decorators: [{
6500
+ type: Component,
6501
+ args: [{ standalone: true, selector: 'valtimo-side-panel', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
6502
+ NgComponentOutlet,
6503
+ RouterLink,
6504
+ TranslateModule,
6505
+ ButtonModule,
6506
+ IconModule,
6507
+ TagModule,
6508
+ TooltipModule$1,
6509
+ ], 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"] }]
6510
+ }], ctorParameters: () => [{ type: i2$3.IconService }, { type: i1$3.Router }, { type: ShellService }, { type: SidePanelService }] });
6511
+
6163
6512
  /*
6164
6513
  * Copyright 2015-2025 Ritense BV, the Netherlands.
6165
6514
  *
@@ -9160,29 +9509,29 @@ class PageHeaderComponent {
9160
9509
  this.titleAsBreadcrumb$ = this.pageHeaderService.titleAsBreadcrumb$;
9161
9510
  this.pageActionsHasContent$ = this.pageHeaderService.pageActionsHasContent$;
9162
9511
  this.pageTitleHidden$ = this.pageTitleService.pageTitleHidden$;
9512
+ this.pageActionsWrap$ = this.pageTitleService.pageActionsWrap$;
9513
+ this.pageActionsMinWidth$ = this.pageTitleService.pageActionsMinWidth$;
9514
+ this._pageHeadHeightSubscription = null;
9163
9515
  }
9164
9516
  ngAfterViewInit() {
9165
9517
  this.pageHeaderService.setContentViewContainerRef(this._contentrVcr);
9166
9518
  this.openPageHeadResizeObserver();
9167
9519
  }
9168
9520
  ngOnDestroy() {
9169
- this._pageHeadResizeObserver?.disconnect();
9521
+ this._pageHeadHeightSubscription?.unsubscribe();
9170
9522
  }
9171
9523
  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);
9524
+ // Width-only resizes emit too: FitPage re-fits when content above it reflows.
9525
+ this._pageHeadHeightSubscription = fromResizeObserver(this._pageHead.nativeElement)
9526
+ .pipe(map(entries => entries[entries.length - 1]?.contentRect.height), filter$1((height) => !!height))
9527
+ .subscribe(height => this.pageHeaderService.setPageHeadHeight(height));
9179
9528
  }
9180
9529
  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" }] }); }
9530
+ 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
9531
  }
9183
9532
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PageHeaderComponent, decorators: [{
9184
9533
  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"] }]
9534
+ 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
9535
  }], ctorParameters: () => [{ type: UserInterfaceService }, { type: PageHeaderService }, { type: PageTitleService }], propDecorators: { _contentrVcr: [{
9187
9536
  type: ViewChild,
9188
9537
  args: ['contentVcr', { static: true, read: ViewContainerRef }]
@@ -10578,12 +10927,12 @@ class FormioComponent {
10578
10927
  this.refreshForm = new EventEmitter();
10579
10928
  this.submission$ = new BehaviorSubject({});
10580
10929
  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)));
10930
+ 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
10931
  this.options$ = new BehaviorSubject(undefined);
10583
10932
  this.readOnly$ = new BehaviorSubject(false);
10584
10933
  this.errors$ = new BehaviorSubject([]);
10585
10934
  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)));
10935
+ this.currentLanguage$ = this.translateService.stream('key').pipe(map$1(() => this.translateService.currentLang), distinctUntilChanged$1(), tap$1(language => this.languageEventEmitter.emit(language)));
10587
10936
  this._overrideOptions$ = new BehaviorSubject({});
10588
10937
  this.formioOptions$ = combineLatest([
10589
10938
  this.options$,
@@ -10600,7 +10949,7 @@ class FormioComponent {
10600
10949
  }),
10601
10950
  };
10602
10951
  return deepmerge(defaultOptions, overrideOptions);
10603
- }), distinctUntilChanged((prev, curr) => isEqual(prev, curr)), tap$1(options => this.logger.debug('Form.IO options used', options)));
10952
+ }), distinctUntilChanged$1((prev, curr) => isEqual(prev, curr)), tap$1(options => this.logger.debug('Form.IO options used', options)));
10604
10953
  // Only renderOptions reaches form.io itself; getRendererOptions() drops everything else.
10605
10954
  this.renderOptions$ = this.currentLanguage$.pipe(map$1(language => ({ language })));
10606
10955
  this._storeTokenInLocalStorage = !this.configService.getFeatureToggle('disableFormioTokenInLocalStorage');
@@ -10874,7 +11223,7 @@ class FormioBuilderComponent {
10874
11223
  // eslint-disable-next-line @angular-eslint/no-output-native
10875
11224
  this.change = new EventEmitter();
10876
11225
  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)));
11226
+ this.currentLanguage$ = this.translateService.stream('key').pipe(map$1(() => this.translateService.currentLang), distinctUntilChanged$1(), tap$1(language => this.languageEventEmitter.emit(language)));
10878
11227
  this.languageEventEmitter = new EventEmitter();
10879
11228
  this.options$ = new BehaviorSubject(undefined);
10880
11229
  this._overrideOptions$ = new BehaviorSubject({});
@@ -10894,7 +11243,7 @@ class FormioBuilderComponent {
10894
11243
  }),
10895
11244
  };
10896
11245
  return deepmerge(defaultOptions, overrideOptions);
10897
- }), distinctUntilChanged((prev, curr) => isEqual(prev, curr)), tap$1(() => this.triggerRebuild.emit()));
11246
+ }), distinctUntilChanged$1((prev, curr) => isEqual(prev, curr)), tap$1(() => this.triggerRebuild.emit()));
10898
11247
  this.editFormModified$ = new BehaviorSubject(false);
10899
11248
  this.modifyEditForm = () => {
10900
11249
  const context$ = getContextObservable(this.route);
@@ -11956,7 +12305,7 @@ class ValuePathSelectorComponent {
11956
12305
  return this.formGroup.get('selectedPath');
11957
12306
  }
11958
12307
  get _selectedPath$() {
11959
- return this.selectedPath.valueChanges.pipe(startWith(this.selectedPath.value), distinctUntilChanged(), tap(value => {
12308
+ return this.selectedPath.valueChanges.pipe(startWith(this.selectedPath.value), distinctUntilChanged$1(), tap(value => {
11960
12309
  if (this._onChangeFunction) {
11961
12310
  this._onChangeFunction(value);
11962
12311
  }
@@ -18668,7 +19017,7 @@ class StatusSelectorComponent {
18668
19017
  selected: !!selectedStatuses.find(selectedStatusKey => selectedStatusKey === status.key),
18669
19018
  key: status.key,
18670
19019
  tagType: status.tagType,
18671
- }))), distinctUntilChanged((previous, current) => isEqual(previous, current)));
19020
+ }))), distinctUntilChanged$1((previous, current) => isEqual(previous, current)));
18672
19021
  }
18673
19022
  itemSelected(event) {
18674
19023
  const newSelectedItems = event?.filter(item => item?.selected) || [];
@@ -19865,7 +20214,7 @@ class CaseTagsSelectorComponent {
19865
20214
  selected: !!selectedCaseTags.find(selectedCaseTagKey => selectedCaseTagKey === caseTag.key),
19866
20215
  key: caseTag.key,
19867
20216
  tagType: caseTag.tagType,
19868
- }))), distinctUntilChanged((previous, current) => isEqual(previous, current)));
20217
+ }))), distinctUntilChanged$1((previous, current) => isEqual(previous, current)));
19869
20218
  }
19870
20219
  set caseTags(value) {
19871
20220
  this._caseTags$.next((value || []).map(caseTags => ({
@@ -20777,6 +21126,8 @@ class RenderInPageHeaderDirective {
20777
21126
  this.pageTitleService = pageTitleService;
20778
21127
  this.pageHeaderService = pageHeaderService;
20779
21128
  this.fullWidth = false;
21129
+ /** Lets the actions move below the page title when both don't fit on one row. */
21130
+ this.wrap = false;
20780
21131
  this._subscriptions = new Subscription();
20781
21132
  }
20782
21133
  ngOnInit() {
@@ -20797,11 +21148,12 @@ class RenderInPageHeaderDirective {
20797
21148
  pageActionsVcr.createEmbeddedView(this.templateRef);
20798
21149
  this.pageTitleService.setHasPageActions(true);
20799
21150
  this.pageTitleService.setPageActionsFullWidth(this.fullWidth);
21151
+ this.pageTitleService.setPageActionsWrap(this.wrap);
20800
21152
  }
20801
21153
  });
20802
21154
  }
20803
21155
  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 }); }
21156
+ 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
21157
  }
20806
21158
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RenderInPageHeaderDirective, decorators: [{
20807
21159
  type: Directive,
@@ -20811,6 +21163,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
20811
21163
  args: [TemplateRef]
20812
21164
  }], fullWidth: [{
20813
21165
  type: Input
21166
+ }], wrap: [{
21167
+ type: Input
20814
21168
  }] } });
20815
21169
 
20816
21170
  /*
@@ -21361,7 +21715,7 @@ class MuuriDirective {
21361
21715
  return this._muuriSubject$.getValue();
21362
21716
  }
21363
21717
  get _containerWidth$() {
21364
- return this._containerWidthSubject$.pipe(distinctUntilChanged());
21718
+ return this._containerWidthSubject$.pipe(distinctUntilChanged$1());
21365
21719
  }
21366
21720
  constructor(elementRef, renderer, ngZone) {
21367
21721
  this.elementRef = elementRef;
@@ -21778,6 +22132,11 @@ class AssignmentComponent {
21778
22132
  get assignButtonTranslationKey() {
21779
22133
  return this.mode === 'case' ? 'assignment.assignThisCase' : 'assignment.assignThisTask';
21780
22134
  }
22135
+ get assignedNames() {
22136
+ return [this._assigneeFullName || this._assigneeId, this._assignedTeamTitle]
22137
+ .filter(name => !!name)
22138
+ .join(' & ');
22139
+ }
21781
22140
  get hasEditChanges() {
21782
22141
  return (this.selectedUserId$.getValue() !== this._initialUserId ||
21783
22142
  this.selectedTeamKey$.getValue() !== this._initialTeamKey);
@@ -21792,6 +22151,8 @@ class AssignmentComponent {
21792
22151
  this._userProviderService = _userProviderService;
21793
22152
  this.mode = 'case';
21794
22153
  this.hasPermission = true;
22154
+ /** Icon-only, for tight layouts; names show as a tooltip. */
22155
+ this.compact = false;
21795
22156
  this.assignmentChangedEvent = new EventEmitter();
21796
22157
  this.unassignedEvent = new EventEmitter();
21797
22158
  this._assigneeId = null;
@@ -21817,7 +22178,7 @@ class AssignmentComponent {
21817
22178
  this._candidateTeamsSubscription = null;
21818
22179
  this._candidateUsersSubscription = null;
21819
22180
  this._subscriptions = new Subscription();
21820
- this._iconService.registerAll([UserFollow16, Group16, User16]);
22181
+ this._iconService.registerAll([Edit16, UserFollow16, Group16, User16]);
21821
22182
  this._subscriptions.add(this._userProviderService.getUserSubject().subscribe(user => {
21822
22183
  this._currentUser = user;
21823
22184
  }));
@@ -22012,7 +22373,7 @@ class AssignmentComponent {
22012
22373
  this._candidateTeamsSubscription = null;
22013
22374
  }
22014
22375
  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 }); }
22376
+ 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
22377
  }
22017
22378
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AssignmentComponent, decorators: [{
22018
22379
  type: Component,
@@ -22025,7 +22386,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
22025
22386
  LayerModule,
22026
22387
  ComboBoxModule,
22027
22388
  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"] }]
22389
+ NgbTooltipModule,
22390
+ ], 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
22391
  }], ctorParameters: () => [{ type: CdsThemeService }, { type: i2$3.IconService }, { type: i1.TranslateService }, { type: i6$1.UserProviderService }], propDecorators: { hostDisplay: [{
22030
22392
  type: HostBinding,
22031
22393
  args: ['style.display']
@@ -22033,6 +22395,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
22033
22395
  type: Input
22034
22396
  }], hasPermission: [{
22035
22397
  type: Input
22398
+ }], compact: [{
22399
+ type: Input
22036
22400
  }], assigneeId: [{
22037
22401
  type: Input
22038
22402
  }], assigneeFullName: [{
@@ -22286,5 +22650,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
22286
22650
  * Generated bundle index. Do not edit.
22287
22651
  */
22288
22652
 
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 };
22653
+ 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
22654
  //# sourceMappingURL=valtimo-components.mjs.map