@valtimo/components 13.37.0 → 13.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/valtimo-components.mjs +487 -84
- package/fesm2022/valtimo-components.mjs.map +1 -1
- package/lib/components/carbon-list/carbon-list.component.d.ts +57 -3
- package/lib/components/carbon-list/carbon-list.component.d.ts.map +1 -1
- package/lib/directives/tooltip/tooltip.directive.d.ts +3 -2
- package/lib/directives/tooltip/tooltip.directive.d.ts.map +1 -1
- package/lib/directives/valtimo-cds-modal/valtimo-cds-modal.directive.d.ts +9 -0
- package/lib/directives/valtimo-cds-modal/valtimo-cds-modal.directive.d.ts.map +1 -1
- package/lib/modules/custom-formio-component/create-custom-component.d.ts +1 -0
- package/lib/modules/custom-formio-component/create-custom-component.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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,
|
|
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, CheckboxModule, AccordionModule, DatePickerModule as DatePickerModule$1, TimePickerModule, ModalButtonType, TilesModule, RadioModule as RadioModule$1, ModalService as ModalService$1, TooltipModule as TooltipModule$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';
|
|
@@ -747,7 +747,7 @@ var ValuePathSelectorInputMode;
|
|
|
747
747
|
*/
|
|
748
748
|
|
|
749
749
|
/*
|
|
750
|
-
* Copyright 2015-
|
|
750
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
751
751
|
*
|
|
752
752
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
753
753
|
* you may not use this file except in compliance with the License.
|
|
@@ -2886,11 +2886,7 @@ function createCustomFormioComponent(customComponentOptions) {
|
|
|
2886
2886
|
superAttach = super.attach(element);
|
|
2887
2887
|
}
|
|
2888
2888
|
// Bind customOptions
|
|
2889
|
-
|
|
2890
|
-
if (this.component.customOptions.hasOwnProperty(key)) {
|
|
2891
|
-
this._customAngularElement[key] = this.component.customOptions[key];
|
|
2892
|
-
}
|
|
2893
|
-
}
|
|
2889
|
+
this.bindCustomOptions();
|
|
2894
2890
|
// Bind validate options
|
|
2895
2891
|
for (const key in this.component.validate) {
|
|
2896
2892
|
if (this.component.validate.hasOwnProperty(key)) {
|
|
@@ -2913,9 +2909,26 @@ function createCustomFormioComponent(customComponentOptions) {
|
|
|
2913
2909
|
component: this.component,
|
|
2914
2910
|
});
|
|
2915
2911
|
});
|
|
2916
|
-
// Ensure we bind the value (if it isn't a multiple-value component with no wrapper)
|
|
2917
|
-
|
|
2918
|
-
|
|
2912
|
+
// Ensure we bind the value (if it isn't a multiple-value component with no wrapper).
|
|
2913
|
+
// Use Array.isArray check in the empty condition because ![] is false in JS, meaning
|
|
2914
|
+
// array-type components (emptyValue: []) would never trigger restoreValue() after a
|
|
2915
|
+
// redrawOn:"data" redraw without this explicit empty-array check.
|
|
2916
|
+
const currentValue = this._customAngularElement.value;
|
|
2917
|
+
const hasNoCurrentValue = !currentValue || (Array.isArray(currentValue) && currentValue.length === 0);
|
|
2918
|
+
if (hasNoCurrentValue && !this.component.disableMultiValueWrapper) {
|
|
2919
|
+
const storedValue = this.dataValue;
|
|
2920
|
+
if (Array.isArray(storedValue) && storedValue.length > 0) {
|
|
2921
|
+
// Directly set array values instead of calling restoreValue() to avoid
|
|
2922
|
+
// restoreValue()'s defaultValue branch triggering onChange/validation side
|
|
2923
|
+
// effects when the component renders with no data yet (e.g. on initial render).
|
|
2924
|
+
this._customAngularElement.value = storedValue;
|
|
2925
|
+
}
|
|
2926
|
+
else if (!Array.isArray(currentValue)) {
|
|
2927
|
+
// Original behaviour for non-array components.
|
|
2928
|
+
this.restoreValue();
|
|
2929
|
+
}
|
|
2930
|
+
// For array components with no stored data: do nothing — matches original
|
|
2931
|
+
// behaviour where ![] === false prevented restoreValue() from being called.
|
|
2919
2932
|
}
|
|
2920
2933
|
}
|
|
2921
2934
|
return superAttach;
|
|
@@ -2931,9 +2944,33 @@ function createCustomFormioComponent(customComponentOptions) {
|
|
|
2931
2944
|
if (!this._customAngularElement || !('value' in this._customAngularElement)) {
|
|
2932
2945
|
return false;
|
|
2933
2946
|
}
|
|
2947
|
+
// Re-apply customOptions on every setValue. calculateValue expressions can mutate
|
|
2948
|
+
// this.component.customOptions (e.g. "component.customOptions.filename = 'test'") for
|
|
2949
|
+
// their side effect, and FormIO calls setValue() right after evaluating calculateValue.
|
|
2950
|
+
// customOptions are otherwise only bound during attach(), which is only re-run on a
|
|
2951
|
+
// redraw triggered by *another* component's data change — so without this, calculated
|
|
2952
|
+
// customOptions never reach the Angular element in a single-component form.
|
|
2953
|
+
this.bindCustomOptions();
|
|
2934
2954
|
this._customAngularElement.value = value;
|
|
2935
2955
|
return true;
|
|
2936
2956
|
}
|
|
2957
|
+
// Push the (possibly calculateValue-mutated) customOptions to the Angular element.
|
|
2958
|
+
bindCustomOptions() {
|
|
2959
|
+
if (!this._customAngularElement) {
|
|
2960
|
+
return;
|
|
2961
|
+
}
|
|
2962
|
+
for (const key in this.component.customOptions) {
|
|
2963
|
+
// Reject dangerous keys to prevent prototype pollution. customOptions can be
|
|
2964
|
+
// manipulated through form schemas or calculateValue expressions, so a key like
|
|
2965
|
+
// __proto__/constructor/prototype must never be assigned onto the element.
|
|
2966
|
+
if (Object.prototype.hasOwnProperty.call(this.component.customOptions, key) &&
|
|
2967
|
+
key !== '__proto__' &&
|
|
2968
|
+
key !== 'constructor' &&
|
|
2969
|
+
key !== 'prototype') {
|
|
2970
|
+
this._customAngularElement[key] = this.component.customOptions[key];
|
|
2971
|
+
}
|
|
2972
|
+
}
|
|
2973
|
+
}
|
|
2937
2974
|
};
|
|
2938
2975
|
}
|
|
2939
2976
|
|
|
@@ -5293,11 +5330,11 @@ class LeftSidebarComponent {
|
|
|
5293
5330
|
});
|
|
5294
5331
|
}
|
|
5295
5332
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LeftSidebarComponent, deps: [{ token: i0.ElementRef }, { token: MenuService }, { token: ShellService }, { token: i3.BreakpointObserver }, { token: i1$3.Router }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5296
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: LeftSidebarComponent, isStandalone: false, selector: "valtimo-left-sidebar", host: { listeners: { "document:click": "onPageClick($event.target)" } }, viewQueries: [{ propertyName: "toggleButtonRef", first: true, predicate: ["toggleButton"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-sidenav\n *ngIf=\"{\n closestSequence: closestSequence$ | async,\n overflowMenuSequence: overflowMenuSequence$ | async,\n sideBarExpanded: sideBarExpanded$ | async,\n menuItemsLoaded: menuItemsLoaded$ | async,\n menuItems: menuItems$ | async,\n } as obs\"\n [allowExpansion]=\"false\"\n [expanded]=\"obs.sideBarExpanded\"\n>\n <ng-container *ngIf=\"obs.menuItemsLoaded; else loadingTemplate\">\n <ng-container *ngFor=\"let menuItem of obs.menuItems\">\n <ng-container *ngIf=\"!menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n menuItem: menuItem,\n closestSequence: obs.closestSequence,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n closestSequence: obs.closestSequence,\n menuItem: menuItem,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n\n <div [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\">\n <ng-container *ngTemplateOutlet=\"subMenuIcon; context: {menuItem: menuItem}\"></ng-container>\n\n <cds-sidenav-menu\n [title]=\"menuItem | menuItemTranslate | async\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n >\n <ng-container *ngFor=\"let childMenuItem of menuItem.children\">\n <ng-container\n *ngIf=\"{\n disableCaseCount: disableCaseCount$ | async,\n count: childMenuItem?.count$ && (childMenuItem?.count$ | async),\n sequence: '' + menuItem.sequence + '.' + childMenuItem.sequence,\n } as vars\"\n >\n <cds-sidenav-item\n [attr.data-testid]=\"'sidenav-item-' + childMenuItem?.title\"\n [title]=\"\n menuItem.title === 'Cases' || menuItem.title === 'Dossiers'\n ? (childMenuItem | menuItemTranslate | async)\n : null\n \"\n [ngClass]=\"{\n 'cds--side-nav__item--empty': !childMenuItem.link,\n 'menu-item--hidden': childMenuItem.includeFunction !== undefined,\n 'menu-item--visible':\n childMenuItem.includeFunction !== undefined &&\n (includeFunctionObservables[childMenuItem.title] | async),\n }\"\n [active]=\"vars.sequence === obs.closestSequence\"\n [href]=\"vars?.count ? 'javascript:return false;' : 'javascript:void(0);'\"\n (click)=\"navigateToRoute(childMenuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(childMenuItem.link)\"\n >\n <valtimo-menu-item-text\n [accent]=\"!childMenuItem.link\"\n [menuItem]=\"childMenuItem\"\n [showOverFlowMenu]=\"obs.overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(childMenuItem.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n\n <ng-container\n *ngTemplateOutlet=\"countTemplate; context: {count: vars.count, disableCaseCount: vars.disableCaseCount}\"\n ></ng-container>\n </cds-sidenav-item>\n </ng-container>\n </ng-container>\n </cds-sidenav-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n</cds-sidenav>\n\n<ng-template #subMenuIcon let-menuItem=\"menuItem\">\n <div class=\"menu-item-icon-container\"><i class=\"{{ menuItem.iconClass }}\"></i></div>\n</ng-template>\n\n<ng-template\n #topMenuItem\n let-closestSequence=\"closestSequence\"\n let-menuItem=\"menuItem\"\n let-overflowMenuSequence=\"overflowMenuSequence\"\n>\n <ng-container *ngIf=\"{sequence: '' + menuItem.sequence} as vars\"\n ><cds-sidenav-item\n *ngIf=\"!menuItem.children\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\"\n [active]=\"vars.sequence === closestSequence\"\n (click)=\"navigateToRoute(menuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(menuItem.link.link)\"\n href=\"javascript:void(0)\"\n >\n <valtimo-menu-item-text\n [menuItem]=\"menuItem\"\n [showOverFlowMenu]=\"overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(menuItem.link.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n </cds-sidenav-item>\n </ng-container>\n</ng-template>\n\n<ng-template #countTemplate let-count=\"count\" let-disableCaseCount=\"disableCaseCount\">\n <ng-container *ngIf=\"count && !disableCaseCount\">\n <span class=\"case-count\">\n {{ count | caseCount }}\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n", styles: ["@media screen and (max-width: 767px){.be-left-sidebar{width:100%!important}}.be-left-sidebar .left-sidebar-toggle{padding:20px}.be-left-sidebar .left-sidebar-toggle:before{font-size:1.615rem}.be-left-sidebar .sidebar-elements>li>a.be-toggle-left-sidebar{height:32px;display:flex;align-items:center}.be-left-sidebar .left-sidebar-content{padding-top:20px}.be-toggle-left-sidebar svg{margin-right:7px;min-width:21px;height:auto;overflow:visible}.be-toggle-left-sidebar svg path{transition:.27s ease;fill:#696969}::ng-deep .resize-border{position:absolute;width:3px;height:100%;top:0;right:0;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9)}::ng-deep .resize-hover{opacity:1}::ng-deep .resize-border--invisible{display:none}.no-transition{transition:none}.d-1{d:path(\"M3 18v-2h13v2z\")}.d-1-flipped{d:path(\"M3 18v-2h11v2z\")}.d-2{d:path(\"M3 13v-2h10v2H3\")}.d-2-flipped{d:path(\"M3 13v-2h12v2H3\")}.d-3{d:path(\"M3 6h13v2H3V6\")}.d-3-flipped{d:path(\"M3 6h11v2H3V6\")}.d-4{d:path(\"M21 15.61L19.59 17l-5.01-5 5.01-5L21 8.39 17.44 12 21 15.61\")}.d-4-flipped{d:path(\"M15.58 15.61L16.99 17 22 12l-5.01-5-1.41 1.39L19.14 12l-3.56 3.61\")}::ng-deep .cds--side-nav__menu{padding-left:0}::ng-deep .cds--side-nav__navigation{border-right:1px solid #e0e0e0;height:100%}::ng-deep .cds--side-nav--ux{width:0}::ng-deep .cds--side-nav--expanded{width:16rem}::ng-deep .cds--side-nav__header-divider{display:none!important}.menu-item-icon-container{position:relative;top:8px;left:13px;height:0}.menu-item-icon-container i{width:0px;height:16px}.menu-item--hidden{display:none}.menu-item--visible{display:block}::ng-deep .cds--side-nav__item--empty{pointer-events:none}::ng-deep .cds--side-nav__item--empty .menu-item-icon-container{display:none}::ng-deep .cds--side-nav__link[href*=\"javascript:return false;\"]{padding-right:3rem!important}.case-count{position:absolute;right:0;padding-right:1rem;height:100%;top:0;display:flex;align-items:center;justify-content:center;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;font-weight:500!important}::ng-deep .cds--side-nav__icon{margin-left:-16px}::ng-deep .cds--side-nav__item.cds--side-nav__item--icon a.cds--side-nav__link{padding-left:3.5rem}::ng-deep .cds--side-nav__submenu-title{padding-right:1.5rem}::ng-deep .cds--side-nav__items{display:flex!important;flex-direction:column!important;overflow:visible!important}::ng-deep .cds--side-nav__navigation{top:3rem;height:calc(100% - 3rem)!important;overflow-x:hidden!important;overflow-y:auto!important}::ng-deep .cds--side-nav__navigation:not(.cds--side-nav--expanded){width:0}.loading-container{display:flex;width:100%;justify-content:center}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MenuItemTextComponent, selector: "valtimo-menu-item-text", inputs: ["menuItem", "accent", "showOverFlowMenu"], outputs: ["overflowMenuClosed", "openInNewTab"] }, { kind: "component", type: i2$3.SideNav, selector: "cds-sidenav, ibm-sidenav", inputs: ["ariaLabel", "expanded", "hidden", "rail", "allowExpansion", "navigationItems", "useRouter"] }, { kind: "component", type: i2$3.SideNavItem, selector: "cds-sidenav-item, ibm-sidenav-item", inputs: ["href", "useRouter", "active", "route", "isSubMenu", "routeExtras", "title"], outputs: ["navigation", "selected"] }, { kind: "component", type: i2$3.SideNavMenu, selector: "cds-sidenav-menu, ibm-sidenav-menu", inputs: ["useRouter", "title", "expanded", "hasActiveChild", "menuItems"] }, { kind: "directive", type: CtrlClickDirective, selector: "[ctrl-click]", outputs: ["ctrl-click"] }, { kind: "component", type: i2$3.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: MenuItemTranslationPipe, name: "menuItemTranslate" }, { kind: "pipe", type: CaseCountPipe, name: "caseCount" }] }); }
|
|
5333
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: LeftSidebarComponent, isStandalone: false, selector: "valtimo-left-sidebar", host: { listeners: { "document:click": "onPageClick($event.target)" } }, viewQueries: [{ propertyName: "toggleButtonRef", first: true, predicate: ["toggleButton"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-sidenav\n *ngIf=\"{\n closestSequence: closestSequence$ | async,\n overflowMenuSequence: overflowMenuSequence$ | async,\n sideBarExpanded: sideBarExpanded$ | async,\n menuItemsLoaded: menuItemsLoaded$ | async,\n menuItems: menuItems$ | async,\n } as obs\"\n [allowExpansion]=\"false\"\n [expanded]=\"obs.sideBarExpanded\"\n>\n <ng-container *ngIf=\"obs.menuItemsLoaded; else loadingTemplate\">\n <ng-container *ngFor=\"let menuItem of obs.menuItems\">\n <ng-container *ngIf=\"!menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n menuItem: menuItem,\n closestSequence: obs.closestSequence,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n closestSequence: obs.closestSequence,\n menuItem: menuItem,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n\n <div [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\">\n <ng-container *ngTemplateOutlet=\"subMenuIcon; context: {menuItem: menuItem}\"></ng-container>\n\n <cds-sidenav-menu\n [title]=\"menuItem | menuItemTranslate | async\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n >\n <ng-container *ngFor=\"let childMenuItem of menuItem.children\">\n <ng-container\n *ngIf=\"{\n disableCaseCount: disableCaseCount$ | async,\n count: childMenuItem?.count$ && (childMenuItem?.count$ | async),\n sequence: '' + menuItem.sequence + '.' + childMenuItem.sequence,\n } as vars\"\n >\n <cds-sidenav-item\n [attr.data-testid]=\"'sidenav-item-' + childMenuItem?.title\"\n [title]=\"\n menuItem.title === 'Cases' || menuItem.title === 'Dossiers'\n ? (childMenuItem | menuItemTranslate | async)\n : null\n \"\n [ngClass]=\"{\n 'cds--side-nav__item--empty': !childMenuItem.link,\n 'menu-item--hidden': childMenuItem.includeFunction !== undefined,\n 'menu-item--visible':\n childMenuItem.includeFunction !== undefined &&\n (includeFunctionObservables[childMenuItem.title] | async),\n }\"\n [active]=\"vars.sequence === obs.closestSequence\"\n [href]=\"vars?.count ? 'javascript:return false;' : 'javascript:void(0);'\"\n (click)=\"navigateToRoute(childMenuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(childMenuItem.link)\"\n >\n <valtimo-menu-item-text\n [accent]=\"!childMenuItem.link\"\n [menuItem]=\"childMenuItem\"\n [showOverFlowMenu]=\"obs.overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(childMenuItem.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n\n <ng-container\n *ngTemplateOutlet=\"countTemplate; context: {count: vars.count, disableCaseCount: vars.disableCaseCount}\"\n ></ng-container>\n </cds-sidenav-item>\n </ng-container>\n </ng-container>\n </cds-sidenav-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n</cds-sidenav>\n\n<ng-template #subMenuIcon let-menuItem=\"menuItem\">\n <div class=\"menu-item-icon-container\"><i class=\"{{ menuItem.iconClass }}\"></i></div>\n</ng-template>\n\n<ng-template\n #topMenuItem\n let-closestSequence=\"closestSequence\"\n let-menuItem=\"menuItem\"\n let-overflowMenuSequence=\"overflowMenuSequence\"\n>\n <ng-container *ngIf=\"{sequence: '' + menuItem.sequence} as vars\"\n ><cds-sidenav-item\n *ngIf=\"!menuItem.children\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\"\n [active]=\"vars.sequence === closestSequence\"\n (click)=\"navigateToRoute(menuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(menuItem.link.link)\"\n href=\"javascript:void(0)\"\n >\n <valtimo-menu-item-text\n [menuItem]=\"menuItem\"\n [showOverFlowMenu]=\"overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(menuItem.link.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n </cds-sidenav-item>\n </ng-container>\n</ng-template>\n\n<ng-template #countTemplate let-count=\"count\" let-disableCaseCount=\"disableCaseCount\">\n <ng-container *ngIf=\"count && !disableCaseCount\">\n <span class=\"case-count\">\n {{ count | caseCount }}\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n", styles: ["@media screen and (max-width:767px){.be-left-sidebar{width:100%!important}}.be-left-sidebar .left-sidebar-toggle{padding:20px}.be-left-sidebar .left-sidebar-toggle:before{font-size:1.615rem}.be-left-sidebar .sidebar-elements>li>a.be-toggle-left-sidebar{height:32px;display:flex;align-items:center}.be-left-sidebar .left-sidebar-content{padding-top:20px}.be-toggle-left-sidebar svg{margin-right:7px;min-width:21px;height:auto;overflow:visible}.be-toggle-left-sidebar svg path{transition:.27s ease;fill:#696969}::ng-deep .resize-border{position:absolute;width:3px;height:100%;top:0;right:0;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9)}::ng-deep .resize-hover{opacity:1}::ng-deep .resize-border--invisible{display:none}.no-transition{transition:none}.d-1{d:path(\"M3 18v-2h13v2z\")}.d-1-flipped{d:path(\"M3 18v-2h11v2z\")}.d-2{d:path(\"M3 13v-2h10v2H3\")}.d-2-flipped{d:path(\"M3 13v-2h12v2H3\")}.d-3{d:path(\"M3 6h13v2H3V6\")}.d-3-flipped{d:path(\"M3 6h11v2H3V6\")}.d-4{d:path(\"M21 15.61L19.59 17l-5.01-5 5.01-5L21 8.39 17.44 12 21 15.61\")}.d-4-flipped{d:path(\"M15.58 15.61L16.99 17 22 12l-5.01-5-1.41 1.39L19.14 12l-3.56 3.61\")}::ng-deep .cds--side-nav__menu{padding-left:0}::ng-deep .cds--side-nav__navigation{border-right:1px solid #e0e0e0;height:100%}::ng-deep .cds--side-nav--ux{width:0}::ng-deep .cds--side-nav--expanded{width:16rem}::ng-deep .cds--side-nav__header-divider{display:none!important}.menu-item-icon-container{position:relative;top:8px;left:13px;height:0}.menu-item-icon-container i{width:0px;height:16px}.menu-item--hidden{display:none}.menu-item--visible{display:block}::ng-deep .cds--side-nav__item--empty{pointer-events:none}::ng-deep .cds--side-nav__item--empty .menu-item-icon-container{display:none}::ng-deep .cds--side-nav__link[href*=\"javascript:return false;\"]{padding-right:3rem!important}.case-count{position:absolute;right:0;padding-right:1rem;height:100%;top:0;display:flex;align-items:center;justify-content:center;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;font-weight:500!important}::ng-deep .cds--side-nav__icon{margin-left:-16px}::ng-deep .cds--side-nav__item.cds--side-nav__item--icon a.cds--side-nav__link{padding-left:3.5rem}::ng-deep .cds--side-nav__submenu-title{padding-right:1.5rem}::ng-deep .cds--side-nav__items{display:flex!important;flex-direction:column!important;overflow:visible!important}::ng-deep .cds--side-nav__navigation{top:3rem;height:calc(100% - 3rem)!important;overflow-x:hidden!important;overflow-y:auto!important}::ng-deep .cds--side-nav__navigation:not(.cds--side-nav--expanded){width:0}.loading-container{display:flex;width:100%;justify-content:center}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MenuItemTextComponent, selector: "valtimo-menu-item-text", inputs: ["menuItem", "accent", "showOverFlowMenu"], outputs: ["overflowMenuClosed", "openInNewTab"] }, { kind: "component", type: i2$3.SideNav, selector: "cds-sidenav, ibm-sidenav", inputs: ["ariaLabel", "expanded", "hidden", "rail", "allowExpansion", "navigationItems", "useRouter"] }, { kind: "component", type: i2$3.SideNavItem, selector: "cds-sidenav-item, ibm-sidenav-item", inputs: ["href", "useRouter", "active", "route", "isSubMenu", "routeExtras", "title"], outputs: ["navigation", "selected"] }, { kind: "component", type: i2$3.SideNavMenu, selector: "cds-sidenav-menu, ibm-sidenav-menu", inputs: ["useRouter", "title", "expanded", "hasActiveChild", "menuItems"] }, { kind: "directive", type: CtrlClickDirective, selector: "[ctrl-click]", outputs: ["ctrl-click"] }, { kind: "component", type: i2$3.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: MenuItemTranslationPipe, name: "menuItemTranslate" }, { kind: "pipe", type: CaseCountPipe, name: "caseCount" }] }); }
|
|
5297
5334
|
}
|
|
5298
5335
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LeftSidebarComponent, decorators: [{
|
|
5299
5336
|
type: Component,
|
|
5300
|
-
args: [{ selector: 'valtimo-left-sidebar', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-sidenav\n *ngIf=\"{\n closestSequence: closestSequence$ | async,\n overflowMenuSequence: overflowMenuSequence$ | async,\n sideBarExpanded: sideBarExpanded$ | async,\n menuItemsLoaded: menuItemsLoaded$ | async,\n menuItems: menuItems$ | async,\n } as obs\"\n [allowExpansion]=\"false\"\n [expanded]=\"obs.sideBarExpanded\"\n>\n <ng-container *ngIf=\"obs.menuItemsLoaded; else loadingTemplate\">\n <ng-container *ngFor=\"let menuItem of obs.menuItems\">\n <ng-container *ngIf=\"!menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n menuItem: menuItem,\n closestSequence: obs.closestSequence,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n closestSequence: obs.closestSequence,\n menuItem: menuItem,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n\n <div [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\">\n <ng-container *ngTemplateOutlet=\"subMenuIcon; context: {menuItem: menuItem}\"></ng-container>\n\n <cds-sidenav-menu\n [title]=\"menuItem | menuItemTranslate | async\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n >\n <ng-container *ngFor=\"let childMenuItem of menuItem.children\">\n <ng-container\n *ngIf=\"{\n disableCaseCount: disableCaseCount$ | async,\n count: childMenuItem?.count$ && (childMenuItem?.count$ | async),\n sequence: '' + menuItem.sequence + '.' + childMenuItem.sequence,\n } as vars\"\n >\n <cds-sidenav-item\n [attr.data-testid]=\"'sidenav-item-' + childMenuItem?.title\"\n [title]=\"\n menuItem.title === 'Cases' || menuItem.title === 'Dossiers'\n ? (childMenuItem | menuItemTranslate | async)\n : null\n \"\n [ngClass]=\"{\n 'cds--side-nav__item--empty': !childMenuItem.link,\n 'menu-item--hidden': childMenuItem.includeFunction !== undefined,\n 'menu-item--visible':\n childMenuItem.includeFunction !== undefined &&\n (includeFunctionObservables[childMenuItem.title] | async),\n }\"\n [active]=\"vars.sequence === obs.closestSequence\"\n [href]=\"vars?.count ? 'javascript:return false;' : 'javascript:void(0);'\"\n (click)=\"navigateToRoute(childMenuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(childMenuItem.link)\"\n >\n <valtimo-menu-item-text\n [accent]=\"!childMenuItem.link\"\n [menuItem]=\"childMenuItem\"\n [showOverFlowMenu]=\"obs.overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(childMenuItem.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n\n <ng-container\n *ngTemplateOutlet=\"countTemplate; context: {count: vars.count, disableCaseCount: vars.disableCaseCount}\"\n ></ng-container>\n </cds-sidenav-item>\n </ng-container>\n </ng-container>\n </cds-sidenav-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n</cds-sidenav>\n\n<ng-template #subMenuIcon let-menuItem=\"menuItem\">\n <div class=\"menu-item-icon-container\"><i class=\"{{ menuItem.iconClass }}\"></i></div>\n</ng-template>\n\n<ng-template\n #topMenuItem\n let-closestSequence=\"closestSequence\"\n let-menuItem=\"menuItem\"\n let-overflowMenuSequence=\"overflowMenuSequence\"\n>\n <ng-container *ngIf=\"{sequence: '' + menuItem.sequence} as vars\"\n ><cds-sidenav-item\n *ngIf=\"!menuItem.children\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\"\n [active]=\"vars.sequence === closestSequence\"\n (click)=\"navigateToRoute(menuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(menuItem.link.link)\"\n href=\"javascript:void(0)\"\n >\n <valtimo-menu-item-text\n [menuItem]=\"menuItem\"\n [showOverFlowMenu]=\"overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(menuItem.link.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n </cds-sidenav-item>\n </ng-container>\n</ng-template>\n\n<ng-template #countTemplate let-count=\"count\" let-disableCaseCount=\"disableCaseCount\">\n <ng-container *ngIf=\"count && !disableCaseCount\">\n <span class=\"case-count\">\n {{ count | caseCount }}\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n", styles: ["@media screen and (max-width: 767px){.be-left-sidebar{width:100%!important}}.be-left-sidebar .left-sidebar-toggle{padding:20px}.be-left-sidebar .left-sidebar-toggle:before{font-size:1.615rem}.be-left-sidebar .sidebar-elements>li>a.be-toggle-left-sidebar{height:32px;display:flex;align-items:center}.be-left-sidebar .left-sidebar-content{padding-top:20px}.be-toggle-left-sidebar svg{margin-right:7px;min-width:21px;height:auto;overflow:visible}.be-toggle-left-sidebar svg path{transition:.27s ease;fill:#696969}::ng-deep .resize-border{position:absolute;width:3px;height:100%;top:0;right:0;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9)}::ng-deep .resize-hover{opacity:1}::ng-deep .resize-border--invisible{display:none}.no-transition{transition:none}.d-1{d:path(\"M3 18v-2h13v2z\")}.d-1-flipped{d:path(\"M3 18v-2h11v2z\")}.d-2{d:path(\"M3 13v-2h10v2H3\")}.d-2-flipped{d:path(\"M3 13v-2h12v2H3\")}.d-3{d:path(\"M3 6h13v2H3V6\")}.d-3-flipped{d:path(\"M3 6h11v2H3V6\")}.d-4{d:path(\"M21 15.61L19.59 17l-5.01-5 5.01-5L21 8.39 17.44 12 21 15.61\")}.d-4-flipped{d:path(\"M15.58 15.61L16.99 17 22 12l-5.01-5-1.41 1.39L19.14 12l-3.56 3.61\")}::ng-deep .cds--side-nav__menu{padding-left:0}::ng-deep .cds--side-nav__navigation{border-right:1px solid #e0e0e0;height:100%}::ng-deep .cds--side-nav--ux{width:0}::ng-deep .cds--side-nav--expanded{width:16rem}::ng-deep .cds--side-nav__header-divider{display:none!important}.menu-item-icon-container{position:relative;top:8px;left:13px;height:0}.menu-item-icon-container i{width:0px;height:16px}.menu-item--hidden{display:none}.menu-item--visible{display:block}::ng-deep .cds--side-nav__item--empty{pointer-events:none}::ng-deep .cds--side-nav__item--empty .menu-item-icon-container{display:none}::ng-deep .cds--side-nav__link[href*=\"javascript:return false;\"]{padding-right:3rem!important}.case-count{position:absolute;right:0;padding-right:1rem;height:100%;top:0;display:flex;align-items:center;justify-content:center;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;font-weight:500!important}::ng-deep .cds--side-nav__icon{margin-left:-16px}::ng-deep .cds--side-nav__item.cds--side-nav__item--icon a.cds--side-nav__link{padding-left:3.5rem}::ng-deep .cds--side-nav__submenu-title{padding-right:1.5rem}::ng-deep .cds--side-nav__items{display:flex!important;flex-direction:column!important;overflow:visible!important}::ng-deep .cds--side-nav__navigation{top:3rem;height:calc(100% - 3rem)!important;overflow-x:hidden!important;overflow-y:auto!important}::ng-deep .cds--side-nav__navigation:not(.cds--side-nav--expanded){width:0}.loading-container{display:flex;width:100%;justify-content:center}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
5337
|
+
args: [{ selector: 'valtimo-left-sidebar', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-sidenav\n *ngIf=\"{\n closestSequence: closestSequence$ | async,\n overflowMenuSequence: overflowMenuSequence$ | async,\n sideBarExpanded: sideBarExpanded$ | async,\n menuItemsLoaded: menuItemsLoaded$ | async,\n menuItems: menuItems$ | async,\n } as obs\"\n [allowExpansion]=\"false\"\n [expanded]=\"obs.sideBarExpanded\"\n>\n <ng-container *ngIf=\"obs.menuItemsLoaded; else loadingTemplate\">\n <ng-container *ngFor=\"let menuItem of obs.menuItems\">\n <ng-container *ngIf=\"!menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n menuItem: menuItem,\n closestSequence: obs.closestSequence,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"menuItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n topMenuItem;\n context: {\n closestSequence: obs.closestSequence,\n menuItem: menuItem,\n overflowMenuSequence: obs.overflowMenuSequence,\n }\n \"\n ></ng-container>\n\n <div [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\">\n <ng-container *ngTemplateOutlet=\"subMenuIcon; context: {menuItem: menuItem}\"></ng-container>\n\n <cds-sidenav-menu\n [title]=\"menuItem | menuItemTranslate | async\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n >\n <ng-container *ngFor=\"let childMenuItem of menuItem.children\">\n <ng-container\n *ngIf=\"{\n disableCaseCount: disableCaseCount$ | async,\n count: childMenuItem?.count$ && (childMenuItem?.count$ | async),\n sequence: '' + menuItem.sequence + '.' + childMenuItem.sequence,\n } as vars\"\n >\n <cds-sidenav-item\n [attr.data-testid]=\"'sidenav-item-' + childMenuItem?.title\"\n [title]=\"\n menuItem.title === 'Cases' || menuItem.title === 'Dossiers'\n ? (childMenuItem | menuItemTranslate | async)\n : null\n \"\n [ngClass]=\"{\n 'cds--side-nav__item--empty': !childMenuItem.link,\n 'menu-item--hidden': childMenuItem.includeFunction !== undefined,\n 'menu-item--visible':\n childMenuItem.includeFunction !== undefined &&\n (includeFunctionObservables[childMenuItem.title] | async),\n }\"\n [active]=\"vars.sequence === obs.closestSequence\"\n [href]=\"vars?.count ? 'javascript:return false;' : 'javascript:void(0);'\"\n (click)=\"navigateToRoute(childMenuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(childMenuItem.link)\"\n >\n <valtimo-menu-item-text\n [accent]=\"!childMenuItem.link\"\n [menuItem]=\"childMenuItem\"\n [showOverFlowMenu]=\"obs.overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(childMenuItem.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n\n <ng-container\n *ngTemplateOutlet=\"countTemplate; context: {count: vars.count, disableCaseCount: vars.disableCaseCount}\"\n ></ng-container>\n </cds-sidenav-item>\n </ng-container>\n </ng-container>\n </cds-sidenav-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n</cds-sidenav>\n\n<ng-template #subMenuIcon let-menuItem=\"menuItem\">\n <div class=\"menu-item-icon-container\"><i class=\"{{ menuItem.iconClass }}\"></i></div>\n</ng-template>\n\n<ng-template\n #topMenuItem\n let-closestSequence=\"closestSequence\"\n let-menuItem=\"menuItem\"\n let-overflowMenuSequence=\"overflowMenuSequence\"\n>\n <ng-container *ngIf=\"{sequence: '' + menuItem.sequence} as vars\"\n ><cds-sidenav-item\n *ngIf=\"!menuItem.children\"\n [attr.data-testid]=\"'sidenav-item-' + menuItem.title\"\n [ngClass]=\"{\n 'menu-item--hidden': menuItem.includeFunction !== undefined,\n 'menu-item--visible':\n menuItem.includeFunction !== undefined &&\n (includeFunctionObservables[menuItem.title] | async),\n }\"\n [active]=\"vars.sequence === closestSequence\"\n (click)=\"navigateToRoute(menuItem.link, $event)\"\n (contextmenu)=\"onRightClick(vars.sequence)\"\n (ctrl-click)=\"openInNewTab(menuItem.link.link)\"\n href=\"javascript:void(0)\"\n >\n <valtimo-menu-item-text\n [menuItem]=\"menuItem\"\n [showOverFlowMenu]=\"overflowMenuSequence === vars.sequence\"\n (openInNewTab)=\"openInNewTab(menuItem.link.link)\"\n (overflowMenuClosed)=\"onOverflowMenuClosed(vars.sequence)\"\n ></valtimo-menu-item-text>\n </cds-sidenav-item>\n </ng-container>\n</ng-template>\n\n<ng-template #countTemplate let-count=\"count\" let-disableCaseCount=\"disableCaseCount\">\n <ng-container *ngIf=\"count && !disableCaseCount\">\n <span class=\"case-count\">\n {{ count | caseCount }}\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n", styles: ["@media screen and (max-width:767px){.be-left-sidebar{width:100%!important}}.be-left-sidebar .left-sidebar-toggle{padding:20px}.be-left-sidebar .left-sidebar-toggle:before{font-size:1.615rem}.be-left-sidebar .sidebar-elements>li>a.be-toggle-left-sidebar{height:32px;display:flex;align-items:center}.be-left-sidebar .left-sidebar-content{padding-top:20px}.be-toggle-left-sidebar svg{margin-right:7px;min-width:21px;height:auto;overflow:visible}.be-toggle-left-sidebar svg path{transition:.27s ease;fill:#696969}::ng-deep .resize-border{position:absolute;width:3px;height:100%;top:0;right:0;cursor:col-resize;background-color:var(--cds-border-strong);opacity:0;transition:opacity .11s cubic-bezier(.2,0,1,.9)}::ng-deep .resize-hover{opacity:1}::ng-deep .resize-border--invisible{display:none}.no-transition{transition:none}.d-1{d:path(\"M3 18v-2h13v2z\")}.d-1-flipped{d:path(\"M3 18v-2h11v2z\")}.d-2{d:path(\"M3 13v-2h10v2H3\")}.d-2-flipped{d:path(\"M3 13v-2h12v2H3\")}.d-3{d:path(\"M3 6h13v2H3V6\")}.d-3-flipped{d:path(\"M3 6h11v2H3V6\")}.d-4{d:path(\"M21 15.61L19.59 17l-5.01-5 5.01-5L21 8.39 17.44 12 21 15.61\")}.d-4-flipped{d:path(\"M15.58 15.61L16.99 17 22 12l-5.01-5-1.41 1.39L19.14 12l-3.56 3.61\")}::ng-deep .cds--side-nav__menu{padding-left:0}::ng-deep .cds--side-nav__navigation{border-right:1px solid #e0e0e0;height:100%}::ng-deep .cds--side-nav--ux{width:0}::ng-deep .cds--side-nav--expanded{width:16rem}::ng-deep .cds--side-nav__header-divider{display:none!important}.menu-item-icon-container{position:relative;top:8px;left:13px;height:0}.menu-item-icon-container i{width:0px;height:16px}.menu-item--hidden{display:none}.menu-item--visible{display:block}::ng-deep .cds--side-nav__item--empty{pointer-events:none}::ng-deep .cds--side-nav__item--empty .menu-item-icon-container{display:none}::ng-deep .cds--side-nav__link[href*=\"javascript:return false;\"]{padding-right:3rem!important}.case-count{position:absolute;right:0;padding-right:1rem;height:100%;top:0;display:flex;align-items:center;justify-content:center;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;font-weight:500!important}::ng-deep .cds--side-nav__icon{margin-left:-16px}::ng-deep .cds--side-nav__item.cds--side-nav__item--icon a.cds--side-nav__link{padding-left:3.5rem}::ng-deep .cds--side-nav__submenu-title{padding-right:1.5rem}::ng-deep .cds--side-nav__items{display:flex!important;flex-direction:column!important;overflow:visible!important}::ng-deep .cds--side-nav__navigation{top:3rem;height:calc(100% - 3rem)!important;overflow-x:hidden!important;overflow-y:auto!important}::ng-deep .cds--side-nav__navigation:not(.cds--side-nav--expanded){width:0}.loading-container{display:flex;width:100%;justify-content:center}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
5301
5338
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: MenuService }, { type: ShellService }, { type: i3.BreakpointObserver }, { type: i1$3.Router }, { type: i1$2.ConfigService }], propDecorators: { toggleButtonRef: [{
|
|
5302
5339
|
type: ViewChild,
|
|
5303
5340
|
args: ['toggleButton']
|
|
@@ -6288,7 +6325,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
6288
6325
|
}] } });
|
|
6289
6326
|
|
|
6290
6327
|
/*
|
|
6291
|
-
* Copyright 2015-
|
|
6328
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
6292
6329
|
*
|
|
6293
6330
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
6294
6331
|
* you may not use this file except in compliance with the License.
|
|
@@ -6308,6 +6345,54 @@ class ValtimoCdsModalDirective {
|
|
|
6308
6345
|
this.elementRef = elementRef;
|
|
6309
6346
|
this.renderer = renderer;
|
|
6310
6347
|
this.minContentHeight = 0;
|
|
6348
|
+
/**
|
|
6349
|
+
* Closes the modal on ESC via the same path as the close (X) button.
|
|
6350
|
+
*
|
|
6351
|
+
* Carbon's built-in ESC handler mutates the modal's `open` field directly (bypassing the `[open]`
|
|
6352
|
+
* binding) and calls `modalService.destroy()`, which can desync state or destroy an unrelated
|
|
6353
|
+
* imperatively-created modal. Instead we preempt it and simulate a click on the close button,
|
|
6354
|
+
* which fires the modal's own `(closeSelect)` handler.
|
|
6355
|
+
*/
|
|
6356
|
+
this._onDocumentKeydown = (event) => {
|
|
6357
|
+
if (event.key !== 'Escape') {
|
|
6358
|
+
return;
|
|
6359
|
+
}
|
|
6360
|
+
const visibleModals = this.document.querySelectorAll('.cds--modal.is-visible');
|
|
6361
|
+
if (visibleModals.length === 0) {
|
|
6362
|
+
return;
|
|
6363
|
+
}
|
|
6364
|
+
// Only the directive owning the top-most (last rendered) visible modal reacts. Matching the modal
|
|
6365
|
+
// that directly owns the overlay (not merely an ancestor) ensures the correct handler acts when
|
|
6366
|
+
// modals are nested/stacked, so ESC closes only the top modal.
|
|
6367
|
+
const topModal = visibleModals[visibleModals.length - 1];
|
|
6368
|
+
if (topModal.closest('cds-modal') !== this.elementRef.nativeElement) {
|
|
6369
|
+
return;
|
|
6370
|
+
}
|
|
6371
|
+
// If a Carbon dropdown/combo-box menu is open, this ESC belongs to that menu, not the modal, so
|
|
6372
|
+
// we do not close the modal — Carbon's own keydown handler closes the menu (updating its state
|
|
6373
|
+
// and the DOM correctly, because it runs on the real event in Angular's zone). Detection spans
|
|
6374
|
+
// the whole document: with `appendInline=false` the expanded list-box is detached to the body,
|
|
6375
|
+
// and Carbon moves focus into it, so neither the marker nor the event target is inside the
|
|
6376
|
+
// modal. A second ESC (menu closed, marker gone) falls through and closes the modal.
|
|
6377
|
+
//
|
|
6378
|
+
// We also shield the modal: `cds-combo-box` closes on ESC but, unlike `cds-dropdown`, does not
|
|
6379
|
+
// stop propagation, so with focus still in its host the ESC would bubble up to the modal's ESC
|
|
6380
|
+
// handler and close it too. When the focused element is inside a list-box host, a one-time
|
|
6381
|
+
// keydown listener added here fires during the bubble phase after Carbon's own handler (which
|
|
6382
|
+
// was registered earlier) and stops propagation before the event reaches the modal. (When focus
|
|
6383
|
+
// is inside a detached menu the event never reaches the modal, so no shield is needed.)
|
|
6384
|
+
if (this.document.querySelector('.cds--list-box--expanded')) {
|
|
6385
|
+
const listBox = event.target?.closest?.('cds-combo-box, cds-dropdown, cds-multi-select');
|
|
6386
|
+
listBox?.addEventListener('keydown', (e) => e.stopPropagation(), { once: true });
|
|
6387
|
+
return;
|
|
6388
|
+
}
|
|
6389
|
+
event.stopImmediatePropagation();
|
|
6390
|
+
event.preventDefault();
|
|
6391
|
+
// Click this modal's own close (X) button — skipping close buttons of nested modals — so ESC
|
|
6392
|
+
// runs exactly the same handling as the close button. Does nothing if there is no close button.
|
|
6393
|
+
const closeButton = Array.from(this.elementRef.nativeElement.querySelectorAll('.cds--modal-close')).find(button => button.closest('cds-modal') === this.elementRef.nativeElement);
|
|
6394
|
+
closeButton?.click();
|
|
6395
|
+
};
|
|
6311
6396
|
}
|
|
6312
6397
|
ngAfterViewInit() {
|
|
6313
6398
|
this._mutationObserver = new MutationObserver((mutations) => {
|
|
@@ -6325,10 +6410,14 @@ class ValtimoCdsModalDirective {
|
|
|
6325
6410
|
}
|
|
6326
6411
|
this.applyStyleToModalElements();
|
|
6327
6412
|
setTimeout(() => this.applyStyleToModalElements(), 0);
|
|
6413
|
+
// Capture phase so this runs before Carbon's bubbling keydown HostListener, allowing us to
|
|
6414
|
+
// preempt it. Listening on the document (not the host) makes ESC work regardless of focus.
|
|
6415
|
+
this.document.addEventListener('keydown', this._onDocumentKeydown, true);
|
|
6328
6416
|
}
|
|
6329
6417
|
ngOnDestroy() {
|
|
6330
6418
|
this._mutationObserver?.disconnect();
|
|
6331
6419
|
this.removeDocumentOverflowHidden();
|
|
6420
|
+
this.document.removeEventListener('keydown', this._onDocumentKeydown, true);
|
|
6332
6421
|
}
|
|
6333
6422
|
handleMutations(mutations) {
|
|
6334
6423
|
const OPEN_ATTRIBUTE_NAME = 'ng-reflect-open';
|
|
@@ -6359,7 +6448,7 @@ class ValtimoCdsModalDirective {
|
|
|
6359
6448
|
return;
|
|
6360
6449
|
const contentElements = this.elementRef.nativeElement.querySelectorAll('.cds--modal-content');
|
|
6361
6450
|
for (const element of contentElements) {
|
|
6362
|
-
this.renderer.setStyle(element, 'min-height',
|
|
6451
|
+
this.renderer.setStyle(element, 'min-height', `min(${this.minContentHeight}px, calc(90dvh - 13rem))`, RendererStyleFlags2.Important);
|
|
6363
6452
|
}
|
|
6364
6453
|
}
|
|
6365
6454
|
preventModalCloseButtonTooltip() {
|
|
@@ -6473,7 +6562,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
6473
6562
|
}] });
|
|
6474
6563
|
|
|
6475
6564
|
/*
|
|
6476
|
-
* Copyright 2015-
|
|
6565
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
6477
6566
|
*
|
|
6478
6567
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
6479
6568
|
* you may not use this file except in compliance with the License.
|
|
@@ -6519,7 +6608,8 @@ class CarbonListComponent {
|
|
|
6519
6608
|
return this._pagination;
|
|
6520
6609
|
}
|
|
6521
6610
|
set skeletonRowCount(value) {
|
|
6522
|
-
this.
|
|
6611
|
+
this._skeletonRowCountSet = value != null;
|
|
6612
|
+
this._skeletonRowCount$.next(value ?? this._skeletonRowCount$.value);
|
|
6523
6613
|
}
|
|
6524
6614
|
set initialSortState(value) {
|
|
6525
6615
|
if (!value || this._isSortInit)
|
|
@@ -6532,6 +6622,14 @@ class CarbonListComponent {
|
|
|
6532
6622
|
return;
|
|
6533
6623
|
this.sort$.next(value);
|
|
6534
6624
|
}
|
|
6625
|
+
set initialSearchValue(value) {
|
|
6626
|
+
if (this._initialSearchValue !== value) {
|
|
6627
|
+
this._initialSearchValue = value;
|
|
6628
|
+
this.searchFormControl.setValue(value || '', { emitEvent: false });
|
|
6629
|
+
this._lastExecutedSearch = value;
|
|
6630
|
+
this.searchActive = !!value;
|
|
6631
|
+
}
|
|
6632
|
+
}
|
|
6535
6633
|
static { this.PAGINATION_SIZE = 'PaginationSize'; }
|
|
6536
6634
|
get selectedItems() {
|
|
6537
6635
|
const model = this._table.model;
|
|
@@ -6543,7 +6641,7 @@ class CarbonListComponent {
|
|
|
6543
6641
|
get model() {
|
|
6544
6642
|
return this._table.model;
|
|
6545
6643
|
}
|
|
6546
|
-
constructor(ellipsisPipe, filterPipe, iconService, logger, translateService, viewContentService, keyStateService, dragAndDropService, elementRef) {
|
|
6644
|
+
constructor(ellipsisPipe, filterPipe, iconService, logger, translateService, viewContentService, keyStateService, dragAndDropService, elementRef, cdr) {
|
|
6547
6645
|
this.ellipsisPipe = ellipsisPipe;
|
|
6548
6646
|
this.filterPipe = filterPipe;
|
|
6549
6647
|
this.iconService = iconService;
|
|
@@ -6553,8 +6651,10 @@ class CarbonListComponent {
|
|
|
6553
6651
|
this.keyStateService = keyStateService;
|
|
6554
6652
|
this.dragAndDropService = dragAndDropService;
|
|
6555
6653
|
this.elementRef = elementRef;
|
|
6654
|
+
this.cdr = cdr;
|
|
6556
6655
|
this._items$ = new BehaviorSubject([]);
|
|
6557
6656
|
this._skeletonRowCount$ = new BehaviorSubject(5);
|
|
6657
|
+
this._skeletonRowCountSet = false;
|
|
6558
6658
|
this.currentOpenActionId = null;
|
|
6559
6659
|
this._fields$ = new BehaviorSubject([]);
|
|
6560
6660
|
this._tableTranslations$ = new BehaviorSubject(DEFAULT_LIST_TRANSLATIONS);
|
|
@@ -6567,6 +6667,11 @@ class CarbonListComponent {
|
|
|
6567
6667
|
this.showActionItems = true;
|
|
6568
6668
|
this._isSortInit = false;
|
|
6569
6669
|
this.isSearchable = false;
|
|
6670
|
+
this._initialSearchValue = null;
|
|
6671
|
+
this.searchActive = false;
|
|
6672
|
+
this.searchDebounceMs = 500;
|
|
6673
|
+
this.invalidSearchFields = [];
|
|
6674
|
+
this.searchFields = [];
|
|
6570
6675
|
this.enableSingleSelection = false;
|
|
6571
6676
|
this.showSelectionColumn = false;
|
|
6572
6677
|
this.striped = false;
|
|
@@ -6608,7 +6713,14 @@ class CarbonListComponent {
|
|
|
6608
6713
|
this.ViewType = ViewType;
|
|
6609
6714
|
this.skeletonModel = Table.skeletonModel(5, 5);
|
|
6610
6715
|
this.searchFormControl = new FormControl('');
|
|
6716
|
+
this.showAutocomplete = false;
|
|
6717
|
+
this.filteredSuggestions = [];
|
|
6718
|
+
this.selectedSuggestionIndex = -1;
|
|
6719
|
+
this.autocompleteLeft = 0;
|
|
6720
|
+
this._lastExecutedSearch = null;
|
|
6721
|
+
this._searchInputElement = null;
|
|
6611
6722
|
this._subscriptions = new Subscription();
|
|
6723
|
+
this._expandedRowKeys = new Set();
|
|
6612
6724
|
this._viewInitialized$ = new BehaviorSubject(false);
|
|
6613
6725
|
this._translatedFields$ = this.translateService.stream('key').pipe(switchMap(() => this._fields$), filter((fields) => !!fields), map((fields) => fields.map((field) => ({
|
|
6614
6726
|
...field,
|
|
@@ -6634,63 +6746,28 @@ class CarbonListComponent {
|
|
|
6634
6746
|
this._fields$,
|
|
6635
6747
|
this._items$,
|
|
6636
6748
|
this._viewInitialized$,
|
|
6637
|
-
]).pipe(filter(([fields, items, viewInitialized]) => !!fields && !!items && viewInitialized), map(([fields, items]) =>
|
|
6638
|
-
...this.getDragAndDropItemsItems(item, index, items.length),
|
|
6639
|
-
...fields.map((field) => {
|
|
6640
|
-
switch (field.viewType) {
|
|
6641
|
-
case ViewType.TEMPLATE:
|
|
6642
|
-
return new TableItem({
|
|
6643
|
-
data: { item, index, length: items.length, ...field.templateData },
|
|
6644
|
-
item,
|
|
6645
|
-
template: field.template,
|
|
6646
|
-
});
|
|
6647
|
-
case ViewType.BOOLEAN:
|
|
6648
|
-
let data = this.resolveObject(field, item);
|
|
6649
|
-
data = !BOOLEAN_CONVERTER_VALUES.includes(data)
|
|
6650
|
-
? data
|
|
6651
|
-
: `${'viewTypeConverter.' + data}`;
|
|
6652
|
-
return new TableItem({
|
|
6653
|
-
data,
|
|
6654
|
-
template: this.booleanTemplate,
|
|
6655
|
-
item,
|
|
6656
|
-
});
|
|
6657
|
-
case ViewType.TAGS: {
|
|
6658
|
-
return new TableItem({
|
|
6659
|
-
data: {
|
|
6660
|
-
tags: this.resolveTagObject(item, field.key),
|
|
6661
|
-
tagAmount: field?.tagAmount || 1,
|
|
6662
|
-
},
|
|
6663
|
-
item,
|
|
6664
|
-
template: this.tagTemplate,
|
|
6665
|
-
});
|
|
6666
|
-
}
|
|
6667
|
-
default:
|
|
6668
|
-
const resolvedObject = this.resolveObject(field, item);
|
|
6669
|
-
return new TableItem({
|
|
6670
|
-
title: resolvedObject ?? '-',
|
|
6671
|
-
data: (field.tooltipCharLimit
|
|
6672
|
-
? this.ellipsisPipe.transform(resolvedObject, field.tooltipCharLimit)
|
|
6673
|
-
: resolvedObject) ?? '-',
|
|
6674
|
-
template: this.defaultTemplate,
|
|
6675
|
-
item,
|
|
6676
|
-
});
|
|
6677
|
-
}
|
|
6678
|
-
}),
|
|
6679
|
-
...this.getExtraItems(item, index, items.length),
|
|
6680
|
-
])), tap$1((data) => {
|
|
6749
|
+
]).pipe(filter(([fields, items, viewInitialized]) => !!fields && !!items && viewInitialized), map(([fields, items]) => this.buildRowsPreservingIdentity(fields, items)), tap$1((data) => {
|
|
6681
6750
|
this._completeDataSource = data;
|
|
6682
6751
|
}));
|
|
6752
|
+
/**
|
|
6753
|
+
* Cached rows from the previous `items` emission, keyed by the item's [trackByKey] (or
|
|
6754
|
+
* [expandedRowKey]) value. Used by [buildRowsPreservingIdentity] to keep row/cell instances —
|
|
6755
|
+
* and therefore their DOM — stable across emissions.
|
|
6756
|
+
*/
|
|
6757
|
+
this._reusableRowsByKey = new Map();
|
|
6683
6758
|
this._filteredItems$ = new BehaviorSubject(null);
|
|
6684
6759
|
this.model$ = combineLatest([
|
|
6685
6760
|
this._headerItems$,
|
|
6686
6761
|
this._tableItems$,
|
|
6687
6762
|
this._filteredItems$,
|
|
6688
|
-
]).pipe(map(([header, data, filteredData]) => {
|
|
6763
|
+
]).pipe(tap$1(() => this._captureExpandedRows()), map(([header, data, filteredData]) => {
|
|
6689
6764
|
const model = new TableModel();
|
|
6690
6765
|
model.header = header;
|
|
6691
6766
|
model.data = filteredData ?? data;
|
|
6767
|
+
this._restoreExpandedRows(model);
|
|
6692
6768
|
return model;
|
|
6693
6769
|
}), startWith(new TableModel()));
|
|
6770
|
+
this._searchOpen = false;
|
|
6694
6771
|
this.iconService.registerAll([ArrowDown16, ArrowUp16, SettingsView16, Draggable16]);
|
|
6695
6772
|
}
|
|
6696
6773
|
ngOnInit() {
|
|
@@ -6699,7 +6776,7 @@ class CarbonListComponent {
|
|
|
6699
6776
|
}
|
|
6700
6777
|
this._subscriptions.add(combineLatest([this._headerItems$, this._items$, this._skeletonRowCount$]).subscribe(([headers, items, skeletonRowCount]) => {
|
|
6701
6778
|
let rowCount = items?.length > 0 ? items?.length : skeletonRowCount;
|
|
6702
|
-
if (items?.length === 0 && this.pagination?.size) {
|
|
6779
|
+
if (items?.length === 0 && this.pagination?.size && !this._skeletonRowCountSet) {
|
|
6703
6780
|
rowCount = this.pagination.size;
|
|
6704
6781
|
}
|
|
6705
6782
|
if (!this.hideToolbar) {
|
|
@@ -6708,17 +6785,9 @@ class CarbonListComponent {
|
|
|
6708
6785
|
this.skeletonModel = Table.skeletonModel(rowCount + 1, headers.length);
|
|
6709
6786
|
}));
|
|
6710
6787
|
this._subscriptions.add(this.searchFormControl.valueChanges
|
|
6711
|
-
.pipe(debounceTime$1(
|
|
6788
|
+
.pipe(debounceTime$1(this.searchDebounceMs))
|
|
6712
6789
|
.subscribe((searchString) => {
|
|
6713
|
-
|
|
6714
|
-
this.search.emit(searchString);
|
|
6715
|
-
return;
|
|
6716
|
-
}
|
|
6717
|
-
if (!searchString) {
|
|
6718
|
-
this._filteredItems$.next(null);
|
|
6719
|
-
return;
|
|
6720
|
-
}
|
|
6721
|
-
this._filteredItems$.next(this.filterPipe.transform(this._completeDataSource, searchString ?? ''));
|
|
6790
|
+
this.executeSearch(searchString);
|
|
6722
6791
|
}));
|
|
6723
6792
|
}
|
|
6724
6793
|
ngAfterViewInit() {
|
|
@@ -6794,6 +6863,93 @@ class CarbonListComponent {
|
|
|
6794
6863
|
pageLength: this.pagination.size,
|
|
6795
6864
|
};
|
|
6796
6865
|
}
|
|
6866
|
+
buildRowsPreservingIdentity(fields, items) {
|
|
6867
|
+
const identityKey = this.trackByKey || this.expandedRowKey;
|
|
6868
|
+
if (!identityKey) {
|
|
6869
|
+
return items.map((item, index) => this.buildRow(fields, item, index, items.length));
|
|
6870
|
+
}
|
|
6871
|
+
const previousRows = this._reusableRowsByKey;
|
|
6872
|
+
const nextRows = new Map();
|
|
6873
|
+
const rows = items.map((item, index) => {
|
|
6874
|
+
const freshRow = this.buildRow(fields, item, index, items.length);
|
|
6875
|
+
const key = get(item, identityKey);
|
|
6876
|
+
// Duplicate or absent keys fall back to the fresh row (no identity to preserve).
|
|
6877
|
+
const previousRow = key != null && !nextRows.has(key) ? previousRows.get(key) : undefined;
|
|
6878
|
+
if (!previousRow || previousRow.length !== freshRow.length) {
|
|
6879
|
+
if (key != null && !nextRows.has(key))
|
|
6880
|
+
nextRows.set(key, freshRow);
|
|
6881
|
+
return freshRow;
|
|
6882
|
+
}
|
|
6883
|
+
// Same row identity: update the existing TableItem instances in place. Carbon's internal
|
|
6884
|
+
// ngFor tracks rows/cells by object identity, so reusing the instances keeps the DOM (incl.
|
|
6885
|
+
// the expanded row) while all bindings re-render with the fresh values.
|
|
6886
|
+
previousRow.forEach((cell, cellIndex) => {
|
|
6887
|
+
const freshCell = freshRow[cellIndex];
|
|
6888
|
+
cell.data = freshCell.data;
|
|
6889
|
+
cell.title = freshCell.title;
|
|
6890
|
+
cell.template = freshCell.template;
|
|
6891
|
+
// `item` is not declared on TableItem; it is smuggled in via the constructor object above.
|
|
6892
|
+
cell.item = freshCell.item;
|
|
6893
|
+
cell.expandedData = freshCell.expandedData;
|
|
6894
|
+
cell.expandedTemplate = freshCell.expandedTemplate;
|
|
6895
|
+
});
|
|
6896
|
+
nextRows.set(key, previousRow);
|
|
6897
|
+
return previousRow;
|
|
6898
|
+
});
|
|
6899
|
+
this._reusableRowsByKey = nextRows;
|
|
6900
|
+
return rows;
|
|
6901
|
+
}
|
|
6902
|
+
buildRow(fields, item, index, length) {
|
|
6903
|
+
const row = [
|
|
6904
|
+
...this.getDragAndDropItemsItems(item, index, length),
|
|
6905
|
+
...fields.map((field) => {
|
|
6906
|
+
switch (field.viewType) {
|
|
6907
|
+
case ViewType.TEMPLATE:
|
|
6908
|
+
return new TableItem({
|
|
6909
|
+
data: { item, index, length, ...field.templateData },
|
|
6910
|
+
item,
|
|
6911
|
+
template: field.template,
|
|
6912
|
+
});
|
|
6913
|
+
case ViewType.BOOLEAN:
|
|
6914
|
+
let data = this.resolveObject(field, item);
|
|
6915
|
+
data = !BOOLEAN_CONVERTER_VALUES.includes(data)
|
|
6916
|
+
? data
|
|
6917
|
+
: `${'viewTypeConverter.' + data}`;
|
|
6918
|
+
return new TableItem({
|
|
6919
|
+
data,
|
|
6920
|
+
template: this.booleanTemplate,
|
|
6921
|
+
item,
|
|
6922
|
+
});
|
|
6923
|
+
case ViewType.TAGS: {
|
|
6924
|
+
return new TableItem({
|
|
6925
|
+
data: {
|
|
6926
|
+
tags: this.resolveTagObject(item, field.key),
|
|
6927
|
+
tagAmount: field?.tagAmount || 1,
|
|
6928
|
+
},
|
|
6929
|
+
item,
|
|
6930
|
+
template: this.tagTemplate,
|
|
6931
|
+
});
|
|
6932
|
+
}
|
|
6933
|
+
default:
|
|
6934
|
+
const resolvedObject = this.resolveObject(field, item);
|
|
6935
|
+
return new TableItem({
|
|
6936
|
+
title: resolvedObject ?? '-',
|
|
6937
|
+
data: (field.tooltipCharLimit
|
|
6938
|
+
? this.ellipsisPipe.transform(resolvedObject, field.tooltipCharLimit)
|
|
6939
|
+
: resolvedObject) ?? '-',
|
|
6940
|
+
template: this.defaultTemplate,
|
|
6941
|
+
item,
|
|
6942
|
+
});
|
|
6943
|
+
}
|
|
6944
|
+
}),
|
|
6945
|
+
...this.getExtraItems(item, index, length),
|
|
6946
|
+
];
|
|
6947
|
+
if (this.expandedRowTemplate && row.length > 0) {
|
|
6948
|
+
row[0].expandedData = item;
|
|
6949
|
+
row[0].expandedTemplate = this.expandedRowTemplate;
|
|
6950
|
+
}
|
|
6951
|
+
return row;
|
|
6952
|
+
}
|
|
6797
6953
|
get dragAndDropHeaderColumns() {
|
|
6798
6954
|
const emptyHeader = new TableHeaderItem();
|
|
6799
6955
|
emptyHeader.sortable = false;
|
|
@@ -6977,13 +7133,240 @@ class CarbonListComponent {
|
|
|
6977
7133
|
type: 'blue',
|
|
6978
7134
|
}));
|
|
6979
7135
|
}
|
|
6980
|
-
|
|
6981
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonListComponent, isStandalone: false, selector: "valtimo-carbon-list", inputs: { items: "items", fields: "fields", tableTranslations: "tableTranslations", paginatorConfig: "paginatorConfig", pagination: "pagination", loading: "loading", skeletonRowCount: "skeletonRowCount", actions: "actions", actionItems: "actionItems", showActionItems: "showActionItems", header: "header", hideColumnHeader: "hideColumnHeader", initialSortState: "initialSortState", sortState: "sortState", isSearchable: "isSearchable", enableSingleSelection: "enableSingleSelection", lastColumnTemplate: "lastColumnTemplate", paginationIdentifier: "paginationIdentifier", showSelectionColumn: "showSelectionColumn", striped: "striped", hideToolbar: "hideToolbar", lockedTooltipTranslationKey: "lockedTooltipTranslationKey", movingRowsEnabled: "movingRowsEnabled", dragAndDrop: "dragAndDrop", dragAndDropDisabled: "dragAndDropDisabled" }, outputs: { rowClicked: "rowClicked", paginationClicked: "paginationClicked", paginationSet: "paginationSet", search: "search", sortChanged: "sortChanged", moveRow: "moveRow", itemsReordered: "itemsReordered" }, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], viewQueries: [{ propertyName: "actionsMenuTemplate", first: true, predicate: ["actionsMenuTemplate"], descendants: true }, { propertyName: "actionTemplate", first: true, predicate: ["actionTemplate"], descendants: true }, { propertyName: "booleanTemplate", first: true, predicate: ["booleanTemplate"], descendants: true }, { propertyName: "moveRowsTemplate", first: true, predicate: ["moveRowsTemplate"], descendants: true }, { propertyName: "dragAndDropTemplate", first: true, predicate: ["dragAndDropTemplate"], descendants: true }, { propertyName: "rowDisabled", first: true, predicate: ["rowDisabled"], descendants: true }, { propertyName: "tagTemplate", first: true, predicate: ["tagTemplate"], descendants: true }, { propertyName: "defaultTemplate", first: true, predicate: ["defaultTemplate"], descendants: true }, { propertyName: "_table", first: true, predicate: Table, descendants: true }], ngImport: i0, template: "<!--\n ~ 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<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <cds-table-toolbar-search\n *ngIf=\"isSearchable\"\n [expandable]=\"true\"\n [formControl]=\"searchFormControl\"\n data-test-id=\"carbonListSearch\"\n ></cds-table-toolbar-search>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i2$3.Pagination, selector: "cds-pagination, ibm-pagination", inputs: ["skeleton", "model", "disabled", "pageInputDisabled", "showPageInput", "pagesUnknown", "pageSelectThreshold", "translations", "itemsPerPageOptions"], outputs: ["selectPage"] }, { kind: "component", type: i2$3.TableToolbar, selector: "cds-table-toolbar, ibm-table-toolbar", inputs: ["model", "batchText", "ariaLabel", "cancelText", "size"], outputs: ["cancel"] }, { kind: "component", type: i2$3.TableContainer, selector: "cds-table-container, ibm-table-container" }, { kind: "component", type: i2$3.TableHeader, selector: "cds-table-header, ibm-table-header" }, { kind: "component", type: i2$3.TableToolbarActions, selector: "cds-table-toolbar-actions, ibm-table-toolbar-actions" }, { kind: "component", type: i2$3.TableToolbarSearch, selector: "cds-table-toolbar-search, ibm-table-toolbar-search" }, { kind: "component", type: i2$3.TableToolbarContent, selector: "cds-table-toolbar-content, ibm-table-toolbar-content" }, { kind: "component", type: i2$3.Table, selector: "cds-table, ibm-table", inputs: ["ariaLabelledby", "ariaDescribedby", "model", "size", "skeleton", "isDataGrid", "sortable", "noBorder", "showExpandAllToggle", "showSelectionColumn", "enableSingleSelect", "scrollLoadDistance", "expandButtonAriaLabel", "sortDescendingLabel", "sortAscendingLabel", "translations", "striped", "stickyHeader", "footerTemplate", "selectionLabelColumn"], outputs: ["sort", "selectAll", "deselectAll", "selectRow", "deselectRow", "rowClick", "scrollLoad"] }, { kind: "component", type: i2$3.TableBody, selector: "[cdsTableBody], [ibmTableBody]", inputs: ["model", "enableSingleSelect", "expandButtonAriaLabel", "checkboxRowLabel", "showSelectionColumn", "size", "selectionLabelColumn", "skeleton"], outputs: ["selectRow", "deselectRow", "rowClick"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i11.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2$3.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }, { kind: "component", type: OverflowMenuOptionComponent, selector: "v-overflow-menu-option", inputs: ["disabled", "type", "testId", "optionId"], outputs: ["selected"] }, { kind: "component", type: OverflowMenuTriggerComponent, selector: "v-overflow-menu-trigger", inputs: ["compact"] }, { kind: "component", type: CarbonTagsModalComponent, selector: "valtimo-tags-modal", inputs: ["open", "tags"], outputs: ["closeEvent"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionItemDisabledPipe, name: "actionItemDisabled" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7136
|
+
getSearchSegments() {
|
|
7137
|
+
const text = this.searchFormControl.value || '';
|
|
7138
|
+
if (!text)
|
|
7139
|
+
return [{ text, isInvalid: false }];
|
|
7140
|
+
const segments = [];
|
|
7141
|
+
const fieldPattern = /(\w+(?:\.\w+)*):("([^"]+)"|(\S+))/g;
|
|
7142
|
+
const invalidSet = new Set((this.invalidSearchFields || []).map(f => f.toLowerCase()));
|
|
7143
|
+
let lastIndex = 0;
|
|
7144
|
+
let match;
|
|
7145
|
+
while ((match = fieldPattern.exec(text)) !== null) {
|
|
7146
|
+
if (match.index > lastIndex) {
|
|
7147
|
+
segments.push({ text: text.substring(lastIndex, match.index), isInvalid: false });
|
|
7148
|
+
}
|
|
7149
|
+
const fieldName = match[1];
|
|
7150
|
+
const isInvalid = invalidSet.has(fieldName.toLowerCase());
|
|
7151
|
+
segments.push({ text: fieldName, isInvalid });
|
|
7152
|
+
const rest = match[0].substring(fieldName.length);
|
|
7153
|
+
segments.push({ text: rest, isInvalid: false });
|
|
7154
|
+
lastIndex = match.index + match[0].length;
|
|
7155
|
+
}
|
|
7156
|
+
if (lastIndex < text.length) {
|
|
7157
|
+
segments.push({ text: text.substring(lastIndex), isInvalid: false });
|
|
7158
|
+
}
|
|
7159
|
+
return segments;
|
|
7160
|
+
}
|
|
7161
|
+
getSearchInputElement() {
|
|
7162
|
+
if (!this._searchInputElement) {
|
|
7163
|
+
this._searchInputElement = this.elementRef.nativeElement.querySelector('.valtimo-search-container input');
|
|
7164
|
+
}
|
|
7165
|
+
return this._searchInputElement;
|
|
7166
|
+
}
|
|
7167
|
+
getCurrentFieldToken() {
|
|
7168
|
+
const value = this.searchFormControl.value || '';
|
|
7169
|
+
const input = this.getSearchInputElement();
|
|
7170
|
+
const cursor = input?.selectionStart ?? value.length;
|
|
7171
|
+
let start = value.lastIndexOf(' ', cursor - 1) + 1;
|
|
7172
|
+
const beforeCursor = value.substring(start, cursor);
|
|
7173
|
+
if (beforeCursor.includes(':'))
|
|
7174
|
+
return null;
|
|
7175
|
+
const nextSpace = value.indexOf(' ', cursor);
|
|
7176
|
+
const end = nextSpace === -1 ? value.length : nextSpace;
|
|
7177
|
+
const afterCursor = value.substring(cursor, end);
|
|
7178
|
+
if (afterCursor.includes(':'))
|
|
7179
|
+
return null;
|
|
7180
|
+
return { token: beforeCursor, start };
|
|
7181
|
+
}
|
|
7182
|
+
onSearchFocus() {
|
|
7183
|
+
const input = this.getSearchInputElement();
|
|
7184
|
+
if (input && document.activeElement === input) {
|
|
7185
|
+
this.updateAutocomplete();
|
|
7186
|
+
}
|
|
7187
|
+
}
|
|
7188
|
+
updateAutocomplete() {
|
|
7189
|
+
const input = this.getSearchInputElement();
|
|
7190
|
+
if (!input) {
|
|
7191
|
+
this.showAutocomplete = false;
|
|
7192
|
+
this.filteredSuggestions = [];
|
|
7193
|
+
return;
|
|
7194
|
+
}
|
|
7195
|
+
const tokenInfo = this.getCurrentFieldToken();
|
|
7196
|
+
if (!tokenInfo || !this.searchFields?.length) {
|
|
7197
|
+
this.showAutocomplete = false;
|
|
7198
|
+
this.filteredSuggestions = [];
|
|
7199
|
+
return;
|
|
7200
|
+
}
|
|
7201
|
+
const searchToken = tokenInfo.token.toLowerCase();
|
|
7202
|
+
this.filteredSuggestions = searchToken.length === 0
|
|
7203
|
+
? this.searchFields
|
|
7204
|
+
: this.searchFields.filter(field => field.key.toLowerCase().includes(searchToken) ||
|
|
7205
|
+
(field.title && field.title.toLowerCase().includes(searchToken)));
|
|
7206
|
+
this.showAutocomplete = this.filteredSuggestions.length > 0;
|
|
7207
|
+
this.selectedSuggestionIndex = -1;
|
|
7208
|
+
if (this.showAutocomplete) {
|
|
7209
|
+
this.autocompleteLeft = this.calculateTokenLeft(tokenInfo.start);
|
|
7210
|
+
}
|
|
7211
|
+
}
|
|
7212
|
+
calculateTokenLeft(tokenStart) {
|
|
7213
|
+
const input = this.getSearchInputElement();
|
|
7214
|
+
if (!input)
|
|
7215
|
+
return 48;
|
|
7216
|
+
const value = this.searchFormControl.value || '';
|
|
7217
|
+
const textBefore = value.substring(0, tokenStart);
|
|
7218
|
+
const canvas = document.createElement('canvas');
|
|
7219
|
+
const ctx = canvas.getContext('2d');
|
|
7220
|
+
if (!ctx)
|
|
7221
|
+
return 48;
|
|
7222
|
+
const style = window.getComputedStyle(input);
|
|
7223
|
+
ctx.font = `${style.fontSize} ${style.fontFamily}`;
|
|
7224
|
+
const textWidth = ctx.measureText(textBefore).width;
|
|
7225
|
+
return 48 + textWidth - 12;
|
|
7226
|
+
}
|
|
7227
|
+
selectSuggestion(field) {
|
|
7228
|
+
const tokenInfo = this.getCurrentFieldToken();
|
|
7229
|
+
if (!tokenInfo)
|
|
7230
|
+
return;
|
|
7231
|
+
const value = this.searchFormControl.value || '';
|
|
7232
|
+
const input = this.getSearchInputElement();
|
|
7233
|
+
const cursor = input?.selectionStart ?? value.length;
|
|
7234
|
+
const fieldPath = field.path?.replace(/^(doc|case):/, '') || field.key;
|
|
7235
|
+
const newValue = value.substring(0, tokenInfo.start) + fieldPath + ':' + value.substring(cursor);
|
|
7236
|
+
this.searchFormControl.setValue(newValue);
|
|
7237
|
+
this.showAutocomplete = false;
|
|
7238
|
+
setTimeout(() => {
|
|
7239
|
+
const newCursor = tokenInfo.start + fieldPath.length + 1;
|
|
7240
|
+
input?.setSelectionRange(newCursor, newCursor);
|
|
7241
|
+
input?.focus();
|
|
7242
|
+
});
|
|
7243
|
+
}
|
|
7244
|
+
onSearchKeydown(event) {
|
|
7245
|
+
if (event.key === 'Enter') {
|
|
7246
|
+
event.preventDefault();
|
|
7247
|
+
this.onSearchEnter();
|
|
7248
|
+
return;
|
|
7249
|
+
}
|
|
7250
|
+
if (!this.showAutocomplete || this.filteredSuggestions.length === 0)
|
|
7251
|
+
return;
|
|
7252
|
+
switch (event.key) {
|
|
7253
|
+
case 'ArrowDown':
|
|
7254
|
+
event.preventDefault();
|
|
7255
|
+
this.selectedSuggestionIndex =
|
|
7256
|
+
this.selectedSuggestionIndex < 0
|
|
7257
|
+
? 0
|
|
7258
|
+
: (this.selectedSuggestionIndex + 1) % this.filteredSuggestions.length;
|
|
7259
|
+
break;
|
|
7260
|
+
case 'ArrowUp':
|
|
7261
|
+
event.preventDefault();
|
|
7262
|
+
this.selectedSuggestionIndex =
|
|
7263
|
+
this.selectedSuggestionIndex < 0
|
|
7264
|
+
? this.filteredSuggestions.length - 1
|
|
7265
|
+
: (this.selectedSuggestionIndex - 1 + this.filteredSuggestions.length) %
|
|
7266
|
+
this.filteredSuggestions.length;
|
|
7267
|
+
break;
|
|
7268
|
+
case 'Tab':
|
|
7269
|
+
event.preventDefault();
|
|
7270
|
+
if (this.selectedSuggestionIndex >= 0) {
|
|
7271
|
+
this.selectSuggestion(this.filteredSuggestions[this.selectedSuggestionIndex]);
|
|
7272
|
+
}
|
|
7273
|
+
else {
|
|
7274
|
+
this.showAutocomplete = false;
|
|
7275
|
+
}
|
|
7276
|
+
break;
|
|
7277
|
+
case 'Escape':
|
|
7278
|
+
this.showAutocomplete = false;
|
|
7279
|
+
break;
|
|
7280
|
+
}
|
|
7281
|
+
}
|
|
7282
|
+
onSearchBlur() {
|
|
7283
|
+
setTimeout(() => {
|
|
7284
|
+
this.showAutocomplete = false;
|
|
7285
|
+
this._searchInputElement = null;
|
|
7286
|
+
}, 150);
|
|
7287
|
+
}
|
|
7288
|
+
onSearchClear() {
|
|
7289
|
+
this.showAutocomplete = false;
|
|
7290
|
+
}
|
|
7291
|
+
executeSearch(searchString) {
|
|
7292
|
+
if (searchString === this._lastExecutedSearch) {
|
|
7293
|
+
return;
|
|
7294
|
+
}
|
|
7295
|
+
this._lastExecutedSearch = searchString;
|
|
7296
|
+
if (this.search.observed) {
|
|
7297
|
+
this.search.emit(searchString);
|
|
7298
|
+
return;
|
|
7299
|
+
}
|
|
7300
|
+
if (!searchString) {
|
|
7301
|
+
this._filteredItems$.next(null);
|
|
7302
|
+
return;
|
|
7303
|
+
}
|
|
7304
|
+
this._filteredItems$.next(this.filterPipe.transform(this._completeDataSource, searchString ?? ''));
|
|
7305
|
+
}
|
|
7306
|
+
onSearchEnter() {
|
|
7307
|
+
if (this.showAutocomplete && this.selectedSuggestionIndex >= 0) {
|
|
7308
|
+
this.selectSuggestion(this.filteredSuggestions[this.selectedSuggestionIndex]);
|
|
7309
|
+
}
|
|
7310
|
+
else {
|
|
7311
|
+
this.showAutocomplete = false;
|
|
7312
|
+
this.executeSearch(this.searchFormControl.value);
|
|
7313
|
+
}
|
|
7314
|
+
}
|
|
7315
|
+
onSearchOpenChange(isOpen) {
|
|
7316
|
+
this._searchOpen = isOpen;
|
|
7317
|
+
this._searchInputElement = null;
|
|
7318
|
+
if (isOpen) {
|
|
7319
|
+
setTimeout(() => {
|
|
7320
|
+
this.updateAutocomplete();
|
|
7321
|
+
}, 0);
|
|
7322
|
+
}
|
|
7323
|
+
else {
|
|
7324
|
+
this.showAutocomplete = false;
|
|
7325
|
+
}
|
|
7326
|
+
}
|
|
7327
|
+
onSearchFocusOut(event) {
|
|
7328
|
+
const container = this.elementRef.nativeElement.querySelector('.valtimo-search-container');
|
|
7329
|
+
const relatedTarget = event.relatedTarget;
|
|
7330
|
+
if (!container?.contains(relatedTarget)) {
|
|
7331
|
+
setTimeout(() => {
|
|
7332
|
+
this.showAutocomplete = false;
|
|
7333
|
+
this.cdr.markForCheck();
|
|
7334
|
+
}, 150);
|
|
7335
|
+
}
|
|
7336
|
+
}
|
|
7337
|
+
_captureExpandedRows() {
|
|
7338
|
+
if (!this.expandedRowKey || !this._table?.model)
|
|
7339
|
+
return;
|
|
7340
|
+
const model = this._table.model;
|
|
7341
|
+
const items = this._items;
|
|
7342
|
+
for (let i = 0; i < items.length; i++) {
|
|
7343
|
+
const key = get(items[i], this.expandedRowKey);
|
|
7344
|
+
if (key && model.isRowExpanded(i)) {
|
|
7345
|
+
this._expandedRowKeys.add(key);
|
|
7346
|
+
}
|
|
7347
|
+
else if (key) {
|
|
7348
|
+
this._expandedRowKeys.delete(key);
|
|
7349
|
+
}
|
|
7350
|
+
}
|
|
7351
|
+
}
|
|
7352
|
+
_restoreExpandedRows(model) {
|
|
7353
|
+
if (!this.expandedRowKey || this._expandedRowKeys.size === 0)
|
|
7354
|
+
return;
|
|
7355
|
+
const items = this._items;
|
|
7356
|
+
for (let i = 0; i < items.length; i++) {
|
|
7357
|
+
const key = get(items[i], this.expandedRowKey);
|
|
7358
|
+
if (key && this._expandedRowKeys.has(key)) {
|
|
7359
|
+
model.expandRow(i, true);
|
|
7360
|
+
}
|
|
7361
|
+
}
|
|
7362
|
+
}
|
|
7363
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonListComponent, deps: [{ token: EllipsisPipe }, { token: CarbonListFilterPipe }, { token: i2$3.IconService }, { token: i4.NGXLogger }, { token: i1.TranslateService }, { token: ViewContentService }, { token: KeyStateService }, { token: CarbonListDragAndDropService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7364
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: CarbonListComponent, isStandalone: false, selector: "valtimo-carbon-list", inputs: { items: "items", fields: "fields", tableTranslations: "tableTranslations", paginatorConfig: "paginatorConfig", pagination: "pagination", loading: "loading", skeletonRowCount: "skeletonRowCount", actions: "actions", actionItems: "actionItems", showActionItems: "showActionItems", header: "header", hideColumnHeader: "hideColumnHeader", initialSortState: "initialSortState", sortState: "sortState", isSearchable: "isSearchable", initialSearchValue: "initialSearchValue", searchDebounceMs: "searchDebounceMs", invalidSearchFields: "invalidSearchFields", searchFields: "searchFields", enableSingleSelection: "enableSingleSelection", lastColumnTemplate: "lastColumnTemplate", paginationIdentifier: "paginationIdentifier", showSelectionColumn: "showSelectionColumn", striped: "striped", hideToolbar: "hideToolbar", lockedTooltipTranslationKey: "lockedTooltipTranslationKey", movingRowsEnabled: "movingRowsEnabled", dragAndDrop: "dragAndDrop", dragAndDropDisabled: "dragAndDropDisabled", expandedRowTemplate: "expandedRowTemplate", expandedRowKey: "expandedRowKey", trackByKey: "trackByKey" }, outputs: { rowClicked: "rowClicked", paginationClicked: "paginationClicked", paginationSet: "paginationSet", search: "search", sortChanged: "sortChanged", moveRow: "moveRow", itemsReordered: "itemsReordered" }, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], viewQueries: [{ propertyName: "actionsMenuTemplate", first: true, predicate: ["actionsMenuTemplate"], descendants: true }, { propertyName: "actionTemplate", first: true, predicate: ["actionTemplate"], descendants: true }, { propertyName: "booleanTemplate", first: true, predicate: ["booleanTemplate"], descendants: true }, { propertyName: "moveRowsTemplate", first: true, predicate: ["moveRowsTemplate"], descendants: true }, { propertyName: "dragAndDropTemplate", first: true, predicate: ["dragAndDropTemplate"], descendants: true }, { propertyName: "rowDisabled", first: true, predicate: ["rowDisabled"], descendants: true }, { propertyName: "tagTemplate", first: true, predicate: ["tagTemplate"], descendants: true }, { propertyName: "defaultTemplate", first: true, predicate: ["defaultTemplate"], descendants: true }, { propertyName: "_table", first: true, predicate: Table, descendants: true }], ngImport: i0, template: "<!--\n ~ /*\n ~ * Copyright 2015-2026 Ritense BV, the Netherlands.\n ~ *\n ~ * Licensed under EUPL, Version 1.2 (the \"License\");\n ~ * you may not use this file except in compliance with the License.\n ~ * You may obtain a copy of the License at\n ~ *\n ~ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~ *\n ~ * Unless required by applicable law or agreed to in writing, software\n ~ * distributed under the License is distributed on an \"AS IS\" basis,\n ~ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ * See the License for the specific language governing permissions and\n ~ * limitations under the License.\n ~ */\n -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i2$3.Pagination, selector: "cds-pagination, ibm-pagination", inputs: ["skeleton", "model", "disabled", "pageInputDisabled", "showPageInput", "pagesUnknown", "pageSelectThreshold", "translations", "itemsPerPageOptions"], outputs: ["selectPage"] }, { kind: "component", type: i2$3.TableToolbar, selector: "cds-table-toolbar, ibm-table-toolbar", inputs: ["model", "batchText", "ariaLabel", "cancelText", "size"], outputs: ["cancel"] }, { kind: "component", type: i2$3.TableContainer, selector: "cds-table-container, ibm-table-container" }, { kind: "component", type: i2$3.TableHeader, selector: "cds-table-header, ibm-table-header" }, { kind: "component", type: i2$3.TableToolbarActions, selector: "cds-table-toolbar-actions, ibm-table-toolbar-actions" }, { kind: "component", type: i2$3.TableToolbarSearch, selector: "cds-table-toolbar-search, ibm-table-toolbar-search" }, { kind: "component", type: i2$3.TableToolbarContent, selector: "cds-table-toolbar-content, ibm-table-toolbar-content" }, { kind: "component", type: i2$3.Table, selector: "cds-table, ibm-table", inputs: ["ariaLabelledby", "ariaDescribedby", "model", "size", "skeleton", "isDataGrid", "sortable", "noBorder", "showExpandAllToggle", "showSelectionColumn", "enableSingleSelect", "scrollLoadDistance", "expandButtonAriaLabel", "sortDescendingLabel", "sortAscendingLabel", "translations", "striped", "stickyHeader", "footerTemplate", "selectionLabelColumn"], outputs: ["sort", "selectAll", "deselectAll", "selectRow", "deselectRow", "rowClick", "scrollLoad"] }, { kind: "component", type: i2$3.TableBody, selector: "[cdsTableBody], [ibmTableBody]", inputs: ["model", "enableSingleSelect", "expandButtonAriaLabel", "checkboxRowLabel", "showSelectionColumn", "size", "selectionLabelColumn", "skeleton"], outputs: ["selectRow", "deselectRow", "rowClick"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i11.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2$3.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }, { kind: "component", type: OverflowMenuOptionComponent, selector: "v-overflow-menu-option", inputs: ["disabled", "type", "testId", "optionId"], outputs: ["selected"] }, { kind: "component", type: OverflowMenuTriggerComponent, selector: "v-overflow-menu-trigger", inputs: ["compact"] }, { kind: "component", type: CarbonTagsModalComponent, selector: "valtimo-tags-modal", inputs: ["open", "tags"], outputs: ["closeEvent"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionItemDisabledPipe, name: "actionItemDisabled" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6982
7365
|
}
|
|
6983
7366
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: CarbonListComponent, decorators: [{
|
|
6984
7367
|
type: Component,
|
|
6985
|
-
args: [{ selector: 'valtimo-carbon-list', changeDetection: ChangeDetectionStrategy.OnPush, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <cds-table-toolbar-search\n *ngIf=\"isSearchable\"\n [expandable]=\"true\"\n [formControl]=\"searchFormControl\"\n data-test-id=\"carbonListSearch\"\n ></cds-table-toolbar-search>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}\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"] }]
|
|
6986
|
-
}], ctorParameters: () => [{ type: EllipsisPipe }, { type: CarbonListFilterPipe }, { type: i2$3.IconService }, { type: i4.NGXLogger }, { type: i1.TranslateService }, { type: ViewContentService }, { type: KeyStateService }, { type: CarbonListDragAndDropService }, { type: i0.ElementRef }], propDecorators: { actionsMenuTemplate: [{
|
|
7368
|
+
args: [{ selector: 'valtimo-carbon-list', changeDetection: ChangeDetectionStrategy.OnPush, providers: [CarbonListFilterPipe, CarbonListDragAndDropService], standalone: false, template: "<!--\n ~ /*\n ~ * Copyright 2015-2026 Ritense BV, the Netherlands.\n ~ *\n ~ * Licensed under EUPL, Version 1.2 (the \"License\");\n ~ * you may not use this file except in compliance with the License.\n ~ * You may obtain a copy of the License at\n ~ *\n ~ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~ *\n ~ * Unless required by applicable law or agreed to in writing, software\n ~ * distributed under the License is distributed on an \"AS IS\" basis,\n ~ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ * See the License for the specific language governing permissions and\n ~ * limitations under the License.\n ~ */\n -->\n<cds-table-container\n *ngIf=\"{\n sort: sort$ | async,\n model: model$ | async,\n viewInitialized: viewInitialized$ | async,\n } as obs\"\n class=\"valtimo-carbon-list\"\n>\n <cds-table-header *ngIf=\"header\">\n <ng-content select=\"[header]\"></ng-content>\n </cds-table-header>\n\n <ng-content select=\"[tabs]\"></ng-content>\n\n <cds-table-toolbar\n *ngIf=\"!hideToolbar\"\n class=\"valtimo-carbon-list__toolbar\"\n [model]=\"obs.model\"\n [batchText]=\"batchText$ | async\"\n >\n <cds-table-toolbar-actions>\n <ng-content select=\"[carbonToolbarActions]\"> </ng-content>\n </cds-table-toolbar-actions>\n\n <cds-table-toolbar-content>\n <div *ngIf=\"isSearchable\" class=\"valtimo-search-container\" (focusout)=\"onSearchFocusOut($event)\">\n <cds-table-toolbar-search\n #toolbarSearch\n [expandable]=\"false\"\n [formControl]=\"searchFormControl\"\n [ngClass]=\"{'valtimo-search--invalid': invalidSearchFields.length > 0}\"\n data-test-id=\"carbonListSearch\"\n (input)=\"updateAutocomplete()\"\n (keydown)=\"onSearchKeydown($event)\"\n (clear)=\"onSearchClear()\"\n (open)=\"onSearchOpenChange($event)\"\n ></cds-table-toolbar-search>\n <div\n class=\"valtimo-search-overlay\"\n aria-hidden=\"true\"\n ><span\n *ngFor=\"let segment of getSearchSegments()\"\n [class.valtimo-search-overlay__invalid]=\"segment.isInvalid\"\n >{{ segment.text }}</span></div>\n <ul *ngIf=\"showAutocomplete && filteredSuggestions.length\" class=\"valtimo-search-autocomplete\" [style.left.px]=\"autocompleteLeft\">\n <li\n *ngFor=\"let field of filteredSuggestions; let i = index\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (mousedown)=\"selectSuggestion(field)\"\n >{{ field.title || field.key }}</li>\n </ul>\n </div>\n\n <ng-content select=\"[carbonToolbarContent]\"> </ng-content>\n </cds-table-toolbar-content>\n </cds-table-toolbar>\n\n <cds-table\n *ngIf=\"!!obs.sort\"\n [ngClass]=\"{\n 'valtimo-carbon-list__header--hidden': hideColumnHeader,\n 'valtimo-carbon-list--unclickable': !this.rowClicked.observed,\n }\"\n [enableSingleSelect]=\"enableSingleSelect\"\n [model]=\"loading || !obs.viewInitialized ? skeletonModel : obs.model\"\n [showSelectionColumn]=\"showSelectionColumn\"\n [skeleton]=\"loading\"\n [striped]=\"striped\"\n (sort)=\"onSort(obs.model.header[$event])\"\n (rowClick)=\"onRowClick($event)\"\n >\n <tbody cdsTableBody>\n <tr class=\"valtimo-carbon-list__no-results\" data-test-id=\"carbonListNoResults\">\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n <ng-content></ng-content>\n </td>\n\n <td [attr.colspan]=\"obs.model.header.length + (showSelectionColumn ? 1 : 0)\">\n {{ 'list.noResults' | translate }}\n </td>\n </tr>\n </tbody>\n </cds-table>\n\n <cds-pagination\n *ngIf=\"paginationModel && items?.length\"\n [itemsPerPageOptions]=\"paginatorConfig.itemsPerPageOptions\"\n [model]=\"paginationModel\"\n [showPageInput]=\"paginatorConfig.showPageInput\"\n [skeleton]=\"loading\"\n [translations]=\"paginationTranslations$ | async\"\n (selectPage)=\"onSelectPage($event)\"\n data-test-id=\"carbonListPagination\"\n ></cds-pagination>\n</cds-table-container>\n\n<ng-template #actionTemplate let-data=\"data\">\n <i\n class=\"clickable\"\n [ngClass]=\"data.iconClass\"\n (click)=\"$event.stopPropagation(); data.callback(data.item)\"\n ></i>\n</ng-template>\n\n<ng-template #booleanTemplate let-data=\"data\">\n {{ data | translate }}\n</ng-template>\n\n<ng-template #actionsMenuTemplate let-data=\"data\">\n <v-overflow-menu\n *ngIf=\"showActionItems\"\n [open]=\"currentOpenActionId === data.item\"\n (openChange)=\"handleActionOpenChange(data.item, $event)\"\n placement=\"bottom-end\"\n (click)=\"$event.stopPropagation()\"\n >\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n @for (action of data.actions; track action.label) {\n <v-overflow-menu-option\n [disabled]=\"action | actionItemDisabled: data.item | async\"\n [type]=\"action.type\"\n (selected)=\"action.callback(data.item)\"\n >\n <i *ngIf=\"!!action.iconClass\" [ngClass]=\"action.iconClass\"></i>\n\n {{ action.label | translate }}\n </v-overflow-menu-option>\n }\n </v-overflow-menu>\n</ng-template>\n\n<ng-template #rowDisabled let-data=\"data\">\n <div *ngIf=\"data.locked\" class=\"locked\">\n <span\n class=\"float-right badge badge-pill badge-secondary bg-grey\"\n ngbTooltip=\"{{ lockedTooltipTranslationKey | translate }}\"\n >\n <i class=\"icon mdi mdi-lock\"></i>\n </span>\n </div>\n</ng-template>\n\n<ng-template #moveRowsTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__move-rows\">\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === 0\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveUpClick($event, data)\"\n data-test-id=\"carbonListMoveUp\"\n >\n <svg cdsIcon=\"arrow--up\" size=\"16\"></svg>\n </button>\n\n <button\n cdsButton=\"tertiary\"\n [disabled]=\"data.index === data.length - 1\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (click)=\"onMoveDownClick($event, data)\"\n data-test-id=\"carbonListMoveDown\"\n >\n <svg cdsIcon=\"arrow--down\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #dragAndDropTemplate let-data=\"data\">\n <div class=\"valtimo-carbon-list__draggable\">\n <button\n cdsButton=\"ghost\"\n [disabled]=\"dragAndDropDisabled\"\n [iconOnly]=\"true\"\n size=\"sm\"\n (mousedown)=\"onDragStart($event, data)\"\n data-test-id=\"carbonListDragHandle\"\n >\n <svg cdsIcon=\"draggable\" size=\"16\"></svg>\n </button>\n </div>\n</ng-template>\n\n<ng-template #tagTemplate let-data=\"data\">\n @if (!data.tags) {\n -\n } @else {\n <div class=\"tag-template\">\n @if (data.tags.length === 0) {\n -\n } @else {\n @for (tag of data.tags.slice(0, data.tagAmount); track tag) {\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"tag.type\">\n {{ tag.ellipsisContent ?? tag.content }}\n </cds-tag>\n }\n\n <cds-tag\n *ngIf=\"data.tags.length > data.tagAmount\"\n class=\"cds-tag--no-margin valtimo-carbon-list__expand-tag\"\n type=\"high-contrast\"\n (click)=\"onTagClick($event, data.tags)\"\n data-test-id=\"carbonListExpandTags\"\n >\n {{ data.tags.length - data.tagAmount }} <svg cdsIcon=\"add\" size=\"16\"></svg>\n </cds-tag>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultTemplate let-data=\"data\">\n <span>{{ data }}</span>\n</ng-template>\n\n<valtimo-tags-modal\n [open]=\"tagModalOpen$ | async\"\n [tags]=\"tagModalData$ | async\"\n (closeEvent)=\"onCloseEvent()\"\n></valtimo-tags-modal>\n", styles: [".clickable{cursor:pointer}.container-fluid{background-color:var(--cds-layer)}.tile-holder{background-color:#f5f5f5;border:1px solid transparent}.tile-holder:hover{background-color:#eee;border:1px solid #dee2e6}th:first-child,td:first-child{padding-left:25px}::ng-deep tr:has(>td .locked){cursor:not-allowed}::ng-deep tr:has(>td .locked) td{color:var(--cds-text-on-color-disabled)}::ng-deep .valtimo-carbon-list__header--hidden thead{display:none}::ng-deep .valtimo-carbon-list--unclickable tr{cursor:default}.valtimo-carbon-list__toolbar:empty{display:none}.valtimo-carbon-list__no-results{cursor:default}.valtimo-carbon-list__no-results td:empty,.valtimo-carbon-list__no-results td:not(:empty)+td{display:none}.valtimo-carbon-list__move-rows,.valtimo-carbon-list__draggable{width:100%;justify-content:flex-end;display:flex;flex-direction:row;position:relative}.valtimo-carbon-list__move-rows button:not(:last-child),.valtimo-carbon-list__draggable button:not(:last-child){margin-right:8px}.valtimo-carbon-list__expand-tag{cursor:pointer}.valtimo-carbon-list label{margin-bottom:0!important}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag{margin:0}.valtimo-carbon-list ::ng-deep .tag-template .cds--tag svg{fill:var(--cds-background)}.valtimo-carbon-list ::ng-deep .tag-template>*:not(:last-child){margin-right:8px}.valtimo-carbon-list ::ng-deep .cds--tag{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;line-height:24px}.valtimo-carbon-list ::ng-deep .valtimo-carbon-list__draggable .cds--btn--ghost{cursor:move!important;padding-top:8px!important;padding-bottom:8px!important}::ng-deep .valtimo-carbon-list__drag-table-row{cursor:move!important}::ng-deep .valtimo-carbon-list__drag-table-row .valtimo-carbon-list__draggable .cds--btn--ghost{outline:0;border-color:var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60)));box-shadow:inset 0 0 0 1px var(--cds-button-focus-color, var(--cds-focus, var(--vcds-color-60))),inset 0 0 0 2px var(--cds-background, #f4f4f4)}.valtimo-carbon-list ::ng-deep cds-table{display:block;overflow-x:auto;overflow-y:hidden}.valtimo-carbon-list ::ng-deep .cds--expandable-row:not(.cds--parent-row) td{border-top:none;border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody .cds--expandable-row.cds--parent-row td{border-bottom-width:2px}.valtimo-carbon-list ::ng-deep tbody tr:first-child td{border-top:none!important}.valtimo-search-container{position:relative;flex:1}.valtimo-search-container ::ng-deep cds-table-toolbar-search{display:flex;justify-content:flex-end;width:100%}.valtimo-search-container ::ng-deep cds-table-toolbar-search .cds--toolbar-search-container-active{width:100%}.valtimo-search-container ::ng-deep .cds--toolbar-search-container-active input{color:transparent!important;caret-color:var(--cds-text-primary, #161616)}.valtimo-search-overlay{position:absolute;inset:0;display:flex;align-items:center;height:3rem;padding:0 3rem;font-family:IBM Plex Sans,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;letter-spacing:.16px;line-height:1.28572;color:var(--cds-text-primary, #161616);white-space:pre;pointer-events:none;overflow:hidden}.valtimo-search-overlay__invalid{text-decoration:underline wavy var(--cds-support-error, #da1e28);text-decoration-skip-ink:none;text-underline-offset:3px}.valtimo-search-autocomplete{position:absolute;top:100%;max-height:150px;min-width:120px;max-width:250px;width:auto;overflow-y:auto;background:var(--cds-layer);border:1px solid var(--cds-border-subtle);box-shadow:0 2px 6px #0000001a;z-index:9000;list-style:none;margin:0;padding:0}.valtimo-search-autocomplete li{padding:6px 12px;cursor:pointer;font-size:.875rem;white-space:nowrap}.valtimo-search-autocomplete li:hover,.valtimo-search-autocomplete li.selected{background:var(--cds-layer-hover)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
7369
|
+
}], ctorParameters: () => [{ type: EllipsisPipe }, { type: CarbonListFilterPipe }, { type: i2$3.IconService }, { type: i4.NGXLogger }, { type: i1.TranslateService }, { type: ViewContentService }, { type: KeyStateService }, { type: CarbonListDragAndDropService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { actionsMenuTemplate: [{
|
|
6987
7370
|
type: ViewChild,
|
|
6988
7371
|
args: ['actionsMenuTemplate']
|
|
6989
7372
|
}], actionTemplate: [{
|
|
@@ -7040,6 +7423,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
7040
7423
|
type: Input
|
|
7041
7424
|
}], isSearchable: [{
|
|
7042
7425
|
type: Input
|
|
7426
|
+
}], initialSearchValue: [{
|
|
7427
|
+
type: Input
|
|
7428
|
+
}], searchDebounceMs: [{
|
|
7429
|
+
type: Input
|
|
7430
|
+
}], invalidSearchFields: [{
|
|
7431
|
+
type: Input
|
|
7432
|
+
}], searchFields: [{
|
|
7433
|
+
type: Input
|
|
7043
7434
|
}], enableSingleSelection: [{
|
|
7044
7435
|
type: Input
|
|
7045
7436
|
}], lastColumnTemplate: [{
|
|
@@ -7060,6 +7451,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
7060
7451
|
type: Input
|
|
7061
7452
|
}], dragAndDropDisabled: [{
|
|
7062
7453
|
type: Input
|
|
7454
|
+
}], expandedRowTemplate: [{
|
|
7455
|
+
type: Input
|
|
7456
|
+
}], expandedRowKey: [{
|
|
7457
|
+
type: Input
|
|
7458
|
+
}], trackByKey: [{
|
|
7459
|
+
type: Input
|
|
7063
7460
|
}], rowClicked: [{
|
|
7064
7461
|
type: Output
|
|
7065
7462
|
}], paginationClicked: [{
|
|
@@ -8281,11 +8678,11 @@ class FilterSidebarComponent {
|
|
|
8281
8678
|
localStorage.setItem('filterSidebar', this.filterSidebar);
|
|
8282
8679
|
}
|
|
8283
8680
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FilterSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8284
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FilterSidebarComponent, isStandalone: false, selector: "valtimo-filter-sidebar", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div>\n <a\n class=\"toggle-filter-sidebar\"\n data-toggle=\"tooltip\"\n data-trigger=\"hover\"\n data-placement=\"right\"\n title=\"Show / hide\"\n href=\"javascript:void(0)\"\n (click)=\"toggleFilterSidebar()\"\n [ngClass]=\"this.filterSidebar === 'show' && 'toggle-expanded'\"\n >\n <div class=\"icon-container p-0 bg-transparent\">\n <i class=\"click-able icon shadow mdi mdi-filter-variant\"></i>\n </div>\n </a>\n <aside class=\"page-aside p-4 mb-4 bg-light filter-holder\" *ngIf=\"this.filterSidebar === 'show'\">\n <ng-content></ng-content>\n </aside>\n</div>\n", styles: [".filter-holder{border:0px solid transparent}.toggle-filter-sidebar{position:absolute;top:25px;margin-left:-50px;z-index:1;font-size:2rem;cursor:pointer}.icon-container .icon{background-color:#fff;color:#6b6b6b;line-height:2rem;cursor:pointer}.toggle-filter-sidebar:hover .icon-container .icon{color:#ff5800}@media screen and (min-width:
|
|
8681
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FilterSidebarComponent, isStandalone: false, selector: "valtimo-filter-sidebar", ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div>\n <a\n class=\"toggle-filter-sidebar\"\n data-toggle=\"tooltip\"\n data-trigger=\"hover\"\n data-placement=\"right\"\n title=\"Show / hide\"\n href=\"javascript:void(0)\"\n (click)=\"toggleFilterSidebar()\"\n [ngClass]=\"this.filterSidebar === 'show' && 'toggle-expanded'\"\n >\n <div class=\"icon-container p-0 bg-transparent\">\n <i class=\"click-able icon shadow mdi mdi-filter-variant\"></i>\n </div>\n </a>\n <aside class=\"page-aside p-4 mb-4 bg-light filter-holder\" *ngIf=\"this.filterSidebar === 'show'\">\n <ng-content></ng-content>\n </aside>\n</div>\n", styles: [".filter-holder{border:0px solid transparent}.toggle-filter-sidebar{position:absolute;top:25px;margin-left:-50px;z-index:1;font-size:2rem;cursor:pointer}.icon-container .icon{background-color:#fff;color:#6b6b6b;line-height:2rem;cursor:pointer}.toggle-filter-sidebar:hover .icon-container .icon{color:#ff5800}@media screen and (min-width:768px){.toggle-filter-sidebar{margin-left:-25px}.page-aside{position:absolute;left:0;margin-top:0;height:calc(100vh - 61px)}.toggle-expanded{margin-left:255px}}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
8285
8682
|
}
|
|
8286
8683
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FilterSidebarComponent, decorators: [{
|
|
8287
8684
|
type: Component,
|
|
8288
|
-
args: [{ selector: 'valtimo-filter-sidebar', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div>\n <a\n class=\"toggle-filter-sidebar\"\n data-toggle=\"tooltip\"\n data-trigger=\"hover\"\n data-placement=\"right\"\n title=\"Show / hide\"\n href=\"javascript:void(0)\"\n (click)=\"toggleFilterSidebar()\"\n [ngClass]=\"this.filterSidebar === 'show' && 'toggle-expanded'\"\n >\n <div class=\"icon-container p-0 bg-transparent\">\n <i class=\"click-able icon shadow mdi mdi-filter-variant\"></i>\n </div>\n </a>\n <aside class=\"page-aside p-4 mb-4 bg-light filter-holder\" *ngIf=\"this.filterSidebar === 'show'\">\n <ng-content></ng-content>\n </aside>\n</div>\n", styles: [".filter-holder{border:0px solid transparent}.toggle-filter-sidebar{position:absolute;top:25px;margin-left:-50px;z-index:1;font-size:2rem;cursor:pointer}.icon-container .icon{background-color:#fff;color:#6b6b6b;line-height:2rem;cursor:pointer}.toggle-filter-sidebar:hover .icon-container .icon{color:#ff5800}@media screen and (min-width:
|
|
8685
|
+
args: [{ selector: 'valtimo-filter-sidebar', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div>\n <a\n class=\"toggle-filter-sidebar\"\n data-toggle=\"tooltip\"\n data-trigger=\"hover\"\n data-placement=\"right\"\n title=\"Show / hide\"\n href=\"javascript:void(0)\"\n (click)=\"toggleFilterSidebar()\"\n [ngClass]=\"this.filterSidebar === 'show' && 'toggle-expanded'\"\n >\n <div class=\"icon-container p-0 bg-transparent\">\n <i class=\"click-able icon shadow mdi mdi-filter-variant\"></i>\n </div>\n </a>\n <aside class=\"page-aside p-4 mb-4 bg-light filter-holder\" *ngIf=\"this.filterSidebar === 'show'\">\n <ng-content></ng-content>\n </aside>\n</div>\n", styles: [".filter-holder{border:0px solid transparent}.toggle-filter-sidebar{position:absolute;top:25px;margin-left:-50px;z-index:1;font-size:2rem;cursor:pointer}.icon-container .icon{background-color:#fff;color:#6b6b6b;line-height:2rem;cursor:pointer}.toggle-filter-sidebar:hover .icon-container .icon{color:#ff5800}@media screen and (min-width:768px){.toggle-filter-sidebar{margin-left:-25px}.page-aside{position:absolute;left:0;margin-top:0;height:calc(100vh - 61px)}.toggle-expanded{margin-left:255px}}\n"] }]
|
|
8289
8686
|
}], ctorParameters: () => [] });
|
|
8290
8687
|
|
|
8291
8688
|
/*
|
|
@@ -10154,7 +10551,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
10154
10551
|
}] } });
|
|
10155
10552
|
|
|
10156
10553
|
/*
|
|
10157
|
-
* Copyright 2015-
|
|
10554
|
+
* Copyright 2015-2026 Ritense BV, the Netherlands.
|
|
10158
10555
|
*
|
|
10159
10556
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
10160
10557
|
* you may not use this file except in compliance with the License.
|
|
@@ -10203,6 +10600,12 @@ class TooltipDirective {
|
|
|
10203
10600
|
this.overlayRef.detach();
|
|
10204
10601
|
}
|
|
10205
10602
|
}
|
|
10603
|
+
ngOnDestroy() {
|
|
10604
|
+
// The overlay lives outside the host element. When the host is destroyed while the tooltip is
|
|
10605
|
+
// shown (e.g. a page removing the hovered element), no mouseleave ever fires, so without
|
|
10606
|
+
// disposal the tooltip stays on screen forever.
|
|
10607
|
+
this.overlayRef?.dispose();
|
|
10608
|
+
}
|
|
10206
10609
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TooltipDirective, deps: [{ token: i1$6.Overlay }, { token: i1$6.OverlayPositionBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
10207
10610
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.25", type: TooltipDirective, isStandalone: false, selector: "[vTooltip]", inputs: { text: ["vTooltip", "text"], onBottom: "onBottom", tooltipDisabled: "tooltipDisabled" }, host: { listeners: { "mouseenter": "show()", "mouseleave": "hide()" } }, ngImport: i0 }); }
|
|
10208
10611
|
}
|
|
@@ -11260,11 +11663,11 @@ class ModalComponent {
|
|
|
11260
11663
|
this.observer.observe(this.scrollModal.nativeElement, config);
|
|
11261
11664
|
}
|
|
11262
11665
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ModalComponent, deps: [{ token: ValtimoModalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
11263
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: ModalComponent, isStandalone: false, selector: "valtimo-modal", inputs: { elementId: "elementId", title: "title", subtitle: "subtitle", templateBelowSubtitle: "templateBelowSubtitle", showFooter: "showFooter" }, viewQueries: [{ propertyName: "scrollModal", first: true, predicate: ["scrollModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"modal fade custom-width\" [id]=\"elementId\" role=\"dialog\" aria-modal=\"true\" #scrollModal>\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header modal-header-colored colored-header-grey\">\n <div class=\"modal-title\">\n <h4 class=\"title-text mb-2\">{{ title }}</h4>\n <h5 class=\"subtitle-text\">{{ subtitle }}</h5>\n <ng-container *ngIf=\"templateBelowSubtitle\">\n <ng-container *ngTemplateOutlet=\"templateBelowSubtitle\"></ng-container>\n </ng-container>\n </div>\n <div class=\"text-right\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n </div>\n <div class=\"modal-body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"modal-footer\" *ngIf=\"showFooter\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n", styles: [".colored-header-grey{background-color:#f3f4f7}.title-text{color:#585555}.subtitle-text{color:#959595}.modal-header-image{height:auto;width:50%}.modal-header{padding-bottom:.66rem;border-bottom:1px solid #c5c6c9}@media
|
|
11666
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: ModalComponent, isStandalone: false, selector: "valtimo-modal", inputs: { elementId: "elementId", title: "title", subtitle: "subtitle", templateBelowSubtitle: "templateBelowSubtitle", showFooter: "showFooter" }, viewQueries: [{ propertyName: "scrollModal", first: true, predicate: ["scrollModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"modal fade custom-width\" [id]=\"elementId\" role=\"dialog\" aria-modal=\"true\" #scrollModal>\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header modal-header-colored colored-header-grey\">\n <div class=\"modal-title\">\n <h4 class=\"title-text mb-2\">{{ title }}</h4>\n <h5 class=\"subtitle-text\">{{ subtitle }}</h5>\n <ng-container *ngIf=\"templateBelowSubtitle\">\n <ng-container *ngTemplateOutlet=\"templateBelowSubtitle\"></ng-container>\n </ng-container>\n </div>\n <div class=\"text-right\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n </div>\n <div class=\"modal-body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"modal-footer\" *ngIf=\"showFooter\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n", styles: [".colored-header-grey{background-color:#f3f4f7}.title-text{color:#585555}.subtitle-text{color:#959595}.modal-header-image{height:auto;width:50%}.modal-header{padding-bottom:.66rem;border-bottom:1px solid #c5c6c9}@media(min-width:768px){.close{position:relative;left:25px;padding:0!important;margin-top:-20px!important}.close span{color:#fff}.modal-content{overflow:visible}}\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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
11264
11667
|
}
|
|
11265
11668
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ModalComponent, decorators: [{
|
|
11266
11669
|
type: Component,
|
|
11267
|
-
args: [{ selector: 'valtimo-modal', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"modal fade custom-width\" [id]=\"elementId\" role=\"dialog\" aria-modal=\"true\" #scrollModal>\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header modal-header-colored colored-header-grey\">\n <div class=\"modal-title\">\n <h4 class=\"title-text mb-2\">{{ title }}</h4>\n <h5 class=\"subtitle-text\">{{ subtitle }}</h5>\n <ng-container *ngIf=\"templateBelowSubtitle\">\n <ng-container *ngTemplateOutlet=\"templateBelowSubtitle\"></ng-container>\n </ng-container>\n </div>\n <div class=\"text-right\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n </div>\n <div class=\"modal-body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"modal-footer\" *ngIf=\"showFooter\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n", styles: [".colored-header-grey{background-color:#f3f4f7}.title-text{color:#585555}.subtitle-text{color:#959595}.modal-header-image{height:auto;width:50%}.modal-header{padding-bottom:.66rem;border-bottom:1px solid #c5c6c9}@media
|
|
11670
|
+
args: [{ selector: 'valtimo-modal', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"modal fade custom-width\" [id]=\"elementId\" role=\"dialog\" aria-modal=\"true\" #scrollModal>\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header modal-header-colored colored-header-grey\">\n <div class=\"modal-title\">\n <h4 class=\"title-text mb-2\">{{ title }}</h4>\n <h5 class=\"subtitle-text\">{{ subtitle }}</h5>\n <ng-container *ngIf=\"templateBelowSubtitle\">\n <ng-container *ngTemplateOutlet=\"templateBelowSubtitle\"></ng-container>\n </ng-container>\n </div>\n <div class=\"text-right\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n </div>\n <div class=\"modal-body\">\n <ng-content select=\"[body]\"></ng-content>\n </div>\n <div class=\"modal-footer\" *ngIf=\"showFooter\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n", styles: [".colored-header-grey{background-color:#f3f4f7}.title-text{color:#585555}.subtitle-text{color:#959595}.modal-header-image{height:auto;width:50%}.modal-header{padding-bottom:.66rem;border-bottom:1px solid #c5c6c9}@media(min-width:768px){.close{position:relative;left:25px;padding:0!important;margin-top:-20px!important}.close span{color:#fff}.modal-content{overflow:visible}}\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"] }]
|
|
11268
11671
|
}], ctorParameters: () => [{ type: ValtimoModalService }], propDecorators: { elementId: [{
|
|
11269
11672
|
type: Input
|
|
11270
11673
|
}], title: [{
|
|
@@ -13418,7 +13821,7 @@ class ObjectManagementSelectComponent {
|
|
|
13418
13821
|
this.valueChange.emit(this.accumulatedSelections);
|
|
13419
13822
|
}
|
|
13420
13823
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ObjectManagementSelectComponent, deps: [{ token: ObjectManagementSelectService }, { token: i2$3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
13421
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: ObjectManagementSelectComponent, isStandalone: true, selector: "valtimo-object-management-select", inputs: { disabled: "disabled", label: "label", validate: "validate", valueFormat: "valueFormat", objectManagementId: "objectManagementId", objectManagementTitle: "objectManagementTitle", columns: "columns", pageSize: "pageSize", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "_carbonList", first: true, predicate: ["carbonList"], descendants: true }, { propertyName: "_selectionList", first: true, predicate: ["selectionList"], descendants: 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-template #textFilter let-col>\n <div class=\"search-field-container\">\n <v-input\n [name]=\"col.path\"\n [title]=\"col.label | translate\"\n [fullWidth]=\"true\"\n [smallLabel]=\"true\"\n [disabled]=\"disabled\"\n [defaultValue]=\"filterValues[col.path] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-input>\n </div>\n</ng-template>\n\n<ng-template #dropdownFilter let-col>\n <div class=\"search-field-container\">\n <v-input-label [title]=\"col.label | translate\" [small]=\"true\"></v-input-label>\n <v-select\n [items]=\"dropdownOptionsMap[col.path]\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"col.path\"\n [disabled]=\"disabled\"\n [defaultSelectionId]=\"filterValues[col.path] ?? null\"\n [clearSelectionSubject$]=\"clearSelects$\"\n (selectedChange)=\"filterValues[col.path] = $event\"\n [appendInline]=\"false\"\n ></v-select>\n </div>\n</ng-template>\n\n<ng-template #dateFilter let-col>\n <div class=\"search-field-container\">\n <v-date-picker\n [title]=\"col.label | translate\"\n [name]=\"col.path\"\n fullWidth=\"true\"\n [smallLabel]=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n </div>\n</ng-template>\n\n<ng-template #dateRangeFilter let-col>\n <div class=\"search-field-container search-field-container--full\">\n <v-input-label [title]=\"col.label | translate\" [small]=\"true\"></v-input-label>\n <div class=\"date-range-fields\">\n <v-date-picker\n [name]=\"col.path + '_start'\"\n fullWidth=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path + '_start'] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path + '_start'] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n <span class=\"to-text\">{{ 'searchFields.to' | translate }}</span>\n <v-date-picker\n [name]=\"col.path + '_end'\"\n fullWidth=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path + '_end'] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path + '_end'] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n </div>\n </div>\n</ng-template>\n\n<div class=\"object-management-select\" data-test-id=\"object-management-select\">\n <cds-accordion *ngIf=\"showFilters\" class=\"filter-accordion\">\n <cds-accordion-item [title]=\"'searchFields.searchButtonText' | translate\" [expanded]=\"filtersExpanded\">\n <div class=\"search-fields-container\">\n <ng-container *ngFor=\"let col of filterableColumns\">\n <ng-container *ngIf=\"col.inputType === 'text' || !col.inputType\">\n <ng-container *ngTemplateOutlet=\"textFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'dropdown'\">\n <ng-container *ngTemplateOutlet=\"dropdownFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'date'\">\n <ng-container *ngTemplateOutlet=\"dateFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'dateRange'\">\n <ng-container *ngTemplateOutlet=\"dateRangeFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"buttons-container\">\n <button type=\"button\" cdsButton=\"tertiary\" (click)=\"onClearFilters()\" [disabled]=\"disabled\">\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n <button type=\"button\" cdsButton=\"primary\" (click)=\"onSearch()\" [disabled]=\"disabled\">\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </cds-accordion-item>\n </cds-accordion>\n\n <valtimo-carbon-list\n #carbonList\n [fields]=\"tableFields\"\n [items]=\"tableItems\"\n [loading]=\"loading\"\n [skeletonRowCount]=\"2\"\n [header]=\"false\"\n [hideToolbar]=\"false\"\n [isSearchable]=\"false\"\n [showSelectionColumn]=\"true\"\n [pagination]=\"pagination\"\n [initialSortState]=\"initialSortState\"\n (sortChanged)=\"onSort($event)\"\n (paginationClicked)=\"onPageChange($event)\"\n (paginationSet)=\"onPageSizeChange($event)\"\n data-test-id=\"object-management-select-list\"\n >\n <button\n type=\"button\"\n carbonToolbarContent\n cdsButton=\"ghost\"\n [title]=\"'searchFields.searchButtonText' | translate\"\n (click)=\"loadData()\"\n [disabled]=\"loading\"\n >\n <svg cdsIcon=\"search\" size=\"16\"></svg>\n </button>\n <button\n type=\"button\"\n carbonToolbarActions\n cdsButton=\"primary\"\n (click)=\"onAddSelection()\"\n [disabled]=\"disabled || !canAddMore\"\n data-test-id=\"object-management-select-add-button\"\n >\n {{ 'interface.add' | translate }}\n </button>\n </valtimo-carbon-list>\n\n <div class=\"selections-section\" *ngIf=\"accumulatedSelections.length > 0\">\n <valtimo-carbon-list\n #selectionList\n [fields]=\"selectionFields\"\n [items]=\"selectionTableItems\"\n [header]=\"true\"\n [hideToolbar]=\"false\"\n [isSearchable]=\"false\"\n [showSelectionColumn]=\"true\"\n (sortChanged)=\"onSelectionSort($event)\"\n data-test-id=\"object-management-select-selections\"\n >\n <span header>{{ 'interface.list.multipleSelect' | translate:{count: accumulatedSelections.length} }}</span>\n <button\n type=\"button\"\n carbonToolbarContent\n cdsButton=\"ghost\"\n (click)=\"onClearSelections()\"\n [disabled]=\"disabled\"\n >\n {{ 'interface.clearAll' | translate }}\n </button>\n <button\n type=\"button\"\n carbonToolbarActions\n cdsButton=\"danger\"\n (click)=\"onRemoveSelectedSelections()\"\n [disabled]=\"disabled\"\n data-test-id=\"object-management-select-remove-button\"\n >\n {{ 'interface.delete' | translate }}\n </button>\n </valtimo-carbon-list>\n </div>\n</div>\n", styles: [".object-management-select{display:flex;flex-direction:column;gap:0}.filter-accordion ::ng-deep .cds--accordion{background-color:var(--cds-layer)}.filter-accordion ::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle);border-block-start:1px solid var(--cds-border-subtle);border-block-end:none}.filter-accordion ::ng-deep .cds--accordion__heading{height:48px}.filter-accordion ::ng-deep .cds--accordion__content{padding:0 16px}::ng-deep .cds--table-toolbar{background-color:var(--cds-layer);border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(2,1fr)}@media (max-width: 480px){.search-fields-container{grid-template-columns:1fr}}.search-field-container--full{grid-column:span 2}@media (max-width: 480px){.search-field-container--full{grid-column:span 1}}.date-range-fields{display:grid;grid-template-columns:5fr 2fr 5fr;align-items:center;gap:8px}@media (max-width: 480px){.date-range-fields{grid-template-columns:1fr}}.to-text{text-align:center}.buttons-container{width:100%;display:flex;justify-content:flex-end;gap:16px;padding-bottom:16px}.selections-section{margin-top:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "skeletonRowCount", "actions", "actionItems", "showActionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "component", type: i2$3.Accordion, selector: "cds-accordion, ibm-accordion", inputs: ["align", "size", "skeleton"] }, { kind: "component", type: i2$3.AccordionItem, selector: "cds-accordion-item, ibm-accordion-item", inputs: ["title", "context", "id", "skeleton", "expanded", "disabled"], outputs: ["selected"] }, { kind: "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: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: InputModule }, { kind: "component", type: InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder", "dataTestId", "trim", "presetsTitle", "presetOptions"], outputs: ["valueChange"] }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: DatePickerModule }, { kind: "component", type: DatePickerComponent, selector: "v-date-picker", inputs: ["name", "title", "placeholder", "titleTranslationKey", "widthPx", "fullWidth", "margin", "disabled", "tooltip", "required", "defaultDate", "defaultDateIsToday", "smallLabel", "clear$", "enableTime", "carbonTheme"], outputs: ["valueChange"] }] }); }
|
|
13824
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: ObjectManagementSelectComponent, isStandalone: true, selector: "valtimo-object-management-select", inputs: { disabled: "disabled", label: "label", validate: "validate", valueFormat: "valueFormat", objectManagementId: "objectManagementId", objectManagementTitle: "objectManagementTitle", columns: "columns", pageSize: "pageSize", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "_carbonList", first: true, predicate: ["carbonList"], descendants: true }, { propertyName: "_selectionList", first: true, predicate: ["selectionList"], descendants: 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-template #textFilter let-col>\n <div class=\"search-field-container\">\n <v-input\n [name]=\"col.path\"\n [title]=\"col.label | translate\"\n [fullWidth]=\"true\"\n [smallLabel]=\"true\"\n [disabled]=\"disabled\"\n [defaultValue]=\"filterValues[col.path] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-input>\n </div>\n</ng-template>\n\n<ng-template #dropdownFilter let-col>\n <div class=\"search-field-container\">\n <v-input-label [title]=\"col.label | translate\" [small]=\"true\"></v-input-label>\n <v-select\n [items]=\"dropdownOptionsMap[col.path]\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"col.path\"\n [disabled]=\"disabled\"\n [defaultSelectionId]=\"filterValues[col.path] ?? null\"\n [clearSelectionSubject$]=\"clearSelects$\"\n (selectedChange)=\"filterValues[col.path] = $event\"\n [appendInline]=\"false\"\n ></v-select>\n </div>\n</ng-template>\n\n<ng-template #dateFilter let-col>\n <div class=\"search-field-container\">\n <v-date-picker\n [title]=\"col.label | translate\"\n [name]=\"col.path\"\n fullWidth=\"true\"\n [smallLabel]=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n </div>\n</ng-template>\n\n<ng-template #dateRangeFilter let-col>\n <div class=\"search-field-container search-field-container--full\">\n <v-input-label [title]=\"col.label | translate\" [small]=\"true\"></v-input-label>\n <div class=\"date-range-fields\">\n <v-date-picker\n [name]=\"col.path + '_start'\"\n fullWidth=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path + '_start'] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path + '_start'] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n <span class=\"to-text\">{{ 'searchFields.to' | translate }}</span>\n <v-date-picker\n [name]=\"col.path + '_end'\"\n fullWidth=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path + '_end'] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path + '_end'] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n </div>\n </div>\n</ng-template>\n\n<div class=\"object-management-select\" data-test-id=\"object-management-select\">\n <cds-accordion *ngIf=\"showFilters\" class=\"filter-accordion\">\n <cds-accordion-item [title]=\"'searchFields.searchButtonText' | translate\" [expanded]=\"filtersExpanded\">\n <div class=\"search-fields-container\">\n <ng-container *ngFor=\"let col of filterableColumns\">\n <ng-container *ngIf=\"col.inputType === 'text' || !col.inputType\">\n <ng-container *ngTemplateOutlet=\"textFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'dropdown'\">\n <ng-container *ngTemplateOutlet=\"dropdownFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'date'\">\n <ng-container *ngTemplateOutlet=\"dateFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'dateRange'\">\n <ng-container *ngTemplateOutlet=\"dateRangeFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"buttons-container\">\n <button type=\"button\" cdsButton=\"tertiary\" (click)=\"onClearFilters()\" [disabled]=\"disabled\">\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n <button type=\"button\" cdsButton=\"primary\" (click)=\"onSearch()\" [disabled]=\"disabled\">\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </cds-accordion-item>\n </cds-accordion>\n\n <valtimo-carbon-list\n #carbonList\n [fields]=\"tableFields\"\n [items]=\"tableItems\"\n [loading]=\"loading\"\n [skeletonRowCount]=\"2\"\n [header]=\"false\"\n [hideToolbar]=\"false\"\n [isSearchable]=\"false\"\n [showSelectionColumn]=\"true\"\n [pagination]=\"pagination\"\n [initialSortState]=\"initialSortState\"\n (sortChanged)=\"onSort($event)\"\n (paginationClicked)=\"onPageChange($event)\"\n (paginationSet)=\"onPageSizeChange($event)\"\n data-test-id=\"object-management-select-list\"\n >\n <button\n type=\"button\"\n carbonToolbarContent\n cdsButton=\"ghost\"\n [title]=\"'searchFields.searchButtonText' | translate\"\n (click)=\"loadData()\"\n [disabled]=\"loading\"\n >\n <svg cdsIcon=\"search\" size=\"16\"></svg>\n </button>\n <button\n type=\"button\"\n carbonToolbarActions\n cdsButton=\"primary\"\n (click)=\"onAddSelection()\"\n [disabled]=\"disabled || !canAddMore\"\n data-test-id=\"object-management-select-add-button\"\n >\n {{ 'interface.add' | translate }}\n </button>\n </valtimo-carbon-list>\n\n <div class=\"selections-section\" *ngIf=\"accumulatedSelections.length > 0\">\n <valtimo-carbon-list\n #selectionList\n [fields]=\"selectionFields\"\n [items]=\"selectionTableItems\"\n [header]=\"true\"\n [hideToolbar]=\"false\"\n [isSearchable]=\"false\"\n [showSelectionColumn]=\"true\"\n (sortChanged)=\"onSelectionSort($event)\"\n data-test-id=\"object-management-select-selections\"\n >\n <span header>{{ 'interface.list.multipleSelect' | translate:{count: accumulatedSelections.length} }}</span>\n <button\n type=\"button\"\n carbonToolbarContent\n cdsButton=\"ghost\"\n (click)=\"onClearSelections()\"\n [disabled]=\"disabled\"\n >\n {{ 'interface.clearAll' | translate }}\n </button>\n <button\n type=\"button\"\n carbonToolbarActions\n cdsButton=\"danger\"\n (click)=\"onRemoveSelectedSelections()\"\n [disabled]=\"disabled\"\n data-test-id=\"object-management-select-remove-button\"\n >\n {{ 'interface.delete' | translate }}\n </button>\n </valtimo-carbon-list>\n </div>\n</div>\n", styles: [".object-management-select{display:flex;flex-direction:column;gap:0}.filter-accordion ::ng-deep .cds--accordion{background-color:var(--cds-layer)}.filter-accordion ::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle);border-block-start:1px solid var(--cds-border-subtle);border-block-end:none}.filter-accordion ::ng-deep .cds--accordion__heading{height:48px}.filter-accordion ::ng-deep .cds--accordion__content{padding:0 16px}::ng-deep .cds--table-toolbar{background-color:var(--cds-layer);border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(2,1fr)}@media(max-width:480px){.search-fields-container{grid-template-columns:1fr}}.search-field-container--full{grid-column:span 2}@media(max-width:480px){.search-field-container--full{grid-column:span 1}}.date-range-fields{display:grid;grid-template-columns:5fr 2fr 5fr;align-items:center;gap:8px}@media(max-width:480px){.date-range-fields{grid-template-columns:1fr}}.to-text{text-align:center}.buttons-container{width:100%;display:flex;justify-content:flex-end;gap:16px;padding-bottom:16px}.selections-section{margin-top:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "skeletonRowCount", "actions", "actionItems", "showActionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "initialSearchValue", "searchDebounceMs", "invalidSearchFields", "searchFields", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled", "expandedRowTemplate", "expandedRowKey", "trackByKey"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "component", type: i2$3.Accordion, selector: "cds-accordion, ibm-accordion", inputs: ["align", "size", "skeleton"] }, { kind: "component", type: i2$3.AccordionItem, selector: "cds-accordion-item, ibm-accordion-item", inputs: ["title", "context", "id", "skeleton", "expanded", "disabled"], outputs: ["selected"] }, { kind: "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: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: InputModule }, { kind: "component", type: InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder", "dataTestId", "trim", "presetsTitle", "presetOptions"], outputs: ["valueChange"] }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "tooltipTranslationKey", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: DatePickerModule }, { kind: "component", type: DatePickerComponent, selector: "v-date-picker", inputs: ["name", "title", "placeholder", "titleTranslationKey", "widthPx", "fullWidth", "margin", "disabled", "tooltip", "required", "defaultDate", "defaultDateIsToday", "smallLabel", "clear$", "enableTime", "carbonTheme"], outputs: ["valueChange"] }] }); }
|
|
13422
13825
|
}
|
|
13423
13826
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ObjectManagementSelectComponent, decorators: [{
|
|
13424
13827
|
type: Component,
|
|
@@ -13434,7 +13837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
13434
13837
|
InputLabelModule,
|
|
13435
13838
|
SelectModule,
|
|
13436
13839
|
DatePickerModule,
|
|
13437
|
-
], 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-template #textFilter let-col>\n <div class=\"search-field-container\">\n <v-input\n [name]=\"col.path\"\n [title]=\"col.label | translate\"\n [fullWidth]=\"true\"\n [smallLabel]=\"true\"\n [disabled]=\"disabled\"\n [defaultValue]=\"filterValues[col.path] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-input>\n </div>\n</ng-template>\n\n<ng-template #dropdownFilter let-col>\n <div class=\"search-field-container\">\n <v-input-label [title]=\"col.label | translate\" [small]=\"true\"></v-input-label>\n <v-select\n [items]=\"dropdownOptionsMap[col.path]\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"col.path\"\n [disabled]=\"disabled\"\n [defaultSelectionId]=\"filterValues[col.path] ?? null\"\n [clearSelectionSubject$]=\"clearSelects$\"\n (selectedChange)=\"filterValues[col.path] = $event\"\n [appendInline]=\"false\"\n ></v-select>\n </div>\n</ng-template>\n\n<ng-template #dateFilter let-col>\n <div class=\"search-field-container\">\n <v-date-picker\n [title]=\"col.label | translate\"\n [name]=\"col.path\"\n fullWidth=\"true\"\n [smallLabel]=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n </div>\n</ng-template>\n\n<ng-template #dateRangeFilter let-col>\n <div class=\"search-field-container search-field-container--full\">\n <v-input-label [title]=\"col.label | translate\" [small]=\"true\"></v-input-label>\n <div class=\"date-range-fields\">\n <v-date-picker\n [name]=\"col.path + '_start'\"\n fullWidth=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path + '_start'] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path + '_start'] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n <span class=\"to-text\">{{ 'searchFields.to' | translate }}</span>\n <v-date-picker\n [name]=\"col.path + '_end'\"\n fullWidth=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path + '_end'] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path + '_end'] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n </div>\n </div>\n</ng-template>\n\n<div class=\"object-management-select\" data-test-id=\"object-management-select\">\n <cds-accordion *ngIf=\"showFilters\" class=\"filter-accordion\">\n <cds-accordion-item [title]=\"'searchFields.searchButtonText' | translate\" [expanded]=\"filtersExpanded\">\n <div class=\"search-fields-container\">\n <ng-container *ngFor=\"let col of filterableColumns\">\n <ng-container *ngIf=\"col.inputType === 'text' || !col.inputType\">\n <ng-container *ngTemplateOutlet=\"textFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'dropdown'\">\n <ng-container *ngTemplateOutlet=\"dropdownFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'date'\">\n <ng-container *ngTemplateOutlet=\"dateFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'dateRange'\">\n <ng-container *ngTemplateOutlet=\"dateRangeFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"buttons-container\">\n <button type=\"button\" cdsButton=\"tertiary\" (click)=\"onClearFilters()\" [disabled]=\"disabled\">\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n <button type=\"button\" cdsButton=\"primary\" (click)=\"onSearch()\" [disabled]=\"disabled\">\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </cds-accordion-item>\n </cds-accordion>\n\n <valtimo-carbon-list\n #carbonList\n [fields]=\"tableFields\"\n [items]=\"tableItems\"\n [loading]=\"loading\"\n [skeletonRowCount]=\"2\"\n [header]=\"false\"\n [hideToolbar]=\"false\"\n [isSearchable]=\"false\"\n [showSelectionColumn]=\"true\"\n [pagination]=\"pagination\"\n [initialSortState]=\"initialSortState\"\n (sortChanged)=\"onSort($event)\"\n (paginationClicked)=\"onPageChange($event)\"\n (paginationSet)=\"onPageSizeChange($event)\"\n data-test-id=\"object-management-select-list\"\n >\n <button\n type=\"button\"\n carbonToolbarContent\n cdsButton=\"ghost\"\n [title]=\"'searchFields.searchButtonText' | translate\"\n (click)=\"loadData()\"\n [disabled]=\"loading\"\n >\n <svg cdsIcon=\"search\" size=\"16\"></svg>\n </button>\n <button\n type=\"button\"\n carbonToolbarActions\n cdsButton=\"primary\"\n (click)=\"onAddSelection()\"\n [disabled]=\"disabled || !canAddMore\"\n data-test-id=\"object-management-select-add-button\"\n >\n {{ 'interface.add' | translate }}\n </button>\n </valtimo-carbon-list>\n\n <div class=\"selections-section\" *ngIf=\"accumulatedSelections.length > 0\">\n <valtimo-carbon-list\n #selectionList\n [fields]=\"selectionFields\"\n [items]=\"selectionTableItems\"\n [header]=\"true\"\n [hideToolbar]=\"false\"\n [isSearchable]=\"false\"\n [showSelectionColumn]=\"true\"\n (sortChanged)=\"onSelectionSort($event)\"\n data-test-id=\"object-management-select-selections\"\n >\n <span header>{{ 'interface.list.multipleSelect' | translate:{count: accumulatedSelections.length} }}</span>\n <button\n type=\"button\"\n carbonToolbarContent\n cdsButton=\"ghost\"\n (click)=\"onClearSelections()\"\n [disabled]=\"disabled\"\n >\n {{ 'interface.clearAll' | translate }}\n </button>\n <button\n type=\"button\"\n carbonToolbarActions\n cdsButton=\"danger\"\n (click)=\"onRemoveSelectedSelections()\"\n [disabled]=\"disabled\"\n data-test-id=\"object-management-select-remove-button\"\n >\n {{ 'interface.delete' | translate }}\n </button>\n </valtimo-carbon-list>\n </div>\n</div>\n", styles: [".object-management-select{display:flex;flex-direction:column;gap:0}.filter-accordion ::ng-deep .cds--accordion{background-color:var(--cds-layer)}.filter-accordion ::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle);border-block-start:1px solid var(--cds-border-subtle);border-block-end:none}.filter-accordion ::ng-deep .cds--accordion__heading{height:48px}.filter-accordion ::ng-deep .cds--accordion__content{padding:0 16px}::ng-deep .cds--table-toolbar{background-color:var(--cds-layer);border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(2,1fr)}@media
|
|
13840
|
+
], 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-template #textFilter let-col>\n <div class=\"search-field-container\">\n <v-input\n [name]=\"col.path\"\n [title]=\"col.label | translate\"\n [fullWidth]=\"true\"\n [smallLabel]=\"true\"\n [disabled]=\"disabled\"\n [defaultValue]=\"filterValues[col.path] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-input>\n </div>\n</ng-template>\n\n<ng-template #dropdownFilter let-col>\n <div class=\"search-field-container\">\n <v-input-label [title]=\"col.label | translate\" [small]=\"true\"></v-input-label>\n <v-select\n [items]=\"dropdownOptionsMap[col.path]\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"col.path\"\n [disabled]=\"disabled\"\n [defaultSelectionId]=\"filterValues[col.path] ?? null\"\n [clearSelectionSubject$]=\"clearSelects$\"\n (selectedChange)=\"filterValues[col.path] = $event\"\n [appendInline]=\"false\"\n ></v-select>\n </div>\n</ng-template>\n\n<ng-template #dateFilter let-col>\n <div class=\"search-field-container\">\n <v-date-picker\n [title]=\"col.label | translate\"\n [name]=\"col.path\"\n fullWidth=\"true\"\n [smallLabel]=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n </div>\n</ng-template>\n\n<ng-template #dateRangeFilter let-col>\n <div class=\"search-field-container search-field-container--full\">\n <v-input-label [title]=\"col.label | translate\" [small]=\"true\"></v-input-label>\n <div class=\"date-range-fields\">\n <v-date-picker\n [name]=\"col.path + '_start'\"\n fullWidth=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path + '_start'] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path + '_start'] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n <span class=\"to-text\">{{ 'searchFields.to' | translate }}</span>\n <v-date-picker\n [name]=\"col.path + '_end'\"\n fullWidth=\"true\"\n [disabled]=\"disabled\"\n [defaultDate]=\"filterValues[col.path + '_end'] || ''\"\n [clear$]=\"clearInputs$\"\n (valueChange)=\"filterValues[col.path + '_end'] = $event\"\n (keyup.enter)=\"onSearch()\"\n ></v-date-picker>\n </div>\n </div>\n</ng-template>\n\n<div class=\"object-management-select\" data-test-id=\"object-management-select\">\n <cds-accordion *ngIf=\"showFilters\" class=\"filter-accordion\">\n <cds-accordion-item [title]=\"'searchFields.searchButtonText' | translate\" [expanded]=\"filtersExpanded\">\n <div class=\"search-fields-container\">\n <ng-container *ngFor=\"let col of filterableColumns\">\n <ng-container *ngIf=\"col.inputType === 'text' || !col.inputType\">\n <ng-container *ngTemplateOutlet=\"textFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'dropdown'\">\n <ng-container *ngTemplateOutlet=\"dropdownFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'date'\">\n <ng-container *ngTemplateOutlet=\"dateFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"col.inputType === 'dateRange'\">\n <ng-container *ngTemplateOutlet=\"dateRangeFilter; context: { $implicit: col }\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"buttons-container\">\n <button type=\"button\" cdsButton=\"tertiary\" (click)=\"onClearFilters()\" [disabled]=\"disabled\">\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n <button type=\"button\" cdsButton=\"primary\" (click)=\"onSearch()\" [disabled]=\"disabled\">\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </cds-accordion-item>\n </cds-accordion>\n\n <valtimo-carbon-list\n #carbonList\n [fields]=\"tableFields\"\n [items]=\"tableItems\"\n [loading]=\"loading\"\n [skeletonRowCount]=\"2\"\n [header]=\"false\"\n [hideToolbar]=\"false\"\n [isSearchable]=\"false\"\n [showSelectionColumn]=\"true\"\n [pagination]=\"pagination\"\n [initialSortState]=\"initialSortState\"\n (sortChanged)=\"onSort($event)\"\n (paginationClicked)=\"onPageChange($event)\"\n (paginationSet)=\"onPageSizeChange($event)\"\n data-test-id=\"object-management-select-list\"\n >\n <button\n type=\"button\"\n carbonToolbarContent\n cdsButton=\"ghost\"\n [title]=\"'searchFields.searchButtonText' | translate\"\n (click)=\"loadData()\"\n [disabled]=\"loading\"\n >\n <svg cdsIcon=\"search\" size=\"16\"></svg>\n </button>\n <button\n type=\"button\"\n carbonToolbarActions\n cdsButton=\"primary\"\n (click)=\"onAddSelection()\"\n [disabled]=\"disabled || !canAddMore\"\n data-test-id=\"object-management-select-add-button\"\n >\n {{ 'interface.add' | translate }}\n </button>\n </valtimo-carbon-list>\n\n <div class=\"selections-section\" *ngIf=\"accumulatedSelections.length > 0\">\n <valtimo-carbon-list\n #selectionList\n [fields]=\"selectionFields\"\n [items]=\"selectionTableItems\"\n [header]=\"true\"\n [hideToolbar]=\"false\"\n [isSearchable]=\"false\"\n [showSelectionColumn]=\"true\"\n (sortChanged)=\"onSelectionSort($event)\"\n data-test-id=\"object-management-select-selections\"\n >\n <span header>{{ 'interface.list.multipleSelect' | translate:{count: accumulatedSelections.length} }}</span>\n <button\n type=\"button\"\n carbonToolbarContent\n cdsButton=\"ghost\"\n (click)=\"onClearSelections()\"\n [disabled]=\"disabled\"\n >\n {{ 'interface.clearAll' | translate }}\n </button>\n <button\n type=\"button\"\n carbonToolbarActions\n cdsButton=\"danger\"\n (click)=\"onRemoveSelectedSelections()\"\n [disabled]=\"disabled\"\n data-test-id=\"object-management-select-remove-button\"\n >\n {{ 'interface.delete' | translate }}\n </button>\n </valtimo-carbon-list>\n </div>\n</div>\n", styles: [".object-management-select{display:flex;flex-direction:column;gap:0}.filter-accordion ::ng-deep .cds--accordion{background-color:var(--cds-layer)}.filter-accordion ::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle);border-block-start:1px solid var(--cds-border-subtle);border-block-end:none}.filter-accordion ::ng-deep .cds--accordion__heading{height:48px}.filter-accordion ::ng-deep .cds--accordion__content{padding:0 16px}::ng-deep .cds--table-toolbar{background-color:var(--cds-layer);border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(2,1fr)}@media(max-width:480px){.search-fields-container{grid-template-columns:1fr}}.search-field-container--full{grid-column:span 2}@media(max-width:480px){.search-field-container--full{grid-column:span 1}}.date-range-fields{display:grid;grid-template-columns:5fr 2fr 5fr;align-items:center;gap:8px}@media(max-width:480px){.date-range-fields{grid-template-columns:1fr}}.to-text{text-align:center}.buttons-container{width:100%;display:flex;justify-content:flex-end;gap:16px;padding-bottom:16px}.selections-section{margin-top:1rem}\n"] }]
|
|
13438
13841
|
}], ctorParameters: () => [{ type: ObjectManagementSelectService }, { type: i2$3.IconService }], propDecorators: { disabled: [{
|
|
13439
13842
|
type: Input
|
|
13440
13843
|
}], label: [{
|