systelab-components
Version:
systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.
1 lines • 910 kB
Source Map (JSON)
{"version":3,"file":"systelab-components.mjs","sources":["../../../projects/systelab-components/src/lib/slider/slider.component.ts","../../../projects/systelab-components/src/lib/slider/slider.component.html","../../../projects/systelab-components/src/lib/switch/switch.component.ts","../../../projects/systelab-components/src/lib/switch/switch.component.html","../../../projects/systelab-components/src/lib/contextmenu/context-menu-action-data.ts","../../../projects/systelab-components/src/lib/contextmenu/abstract-context.component.ts","../../../projects/systelab-components/src/lib/contextmenu/abstract-context-menu.component.ts","../../../projects/systelab-components/src/lib/contextmenu/context-menu-item.component.ts","../../../projects/systelab-components/src/lib/contextmenu/context-menu-item.component.html","../../../projects/systelab-components/src/lib/contextmenu/context-menu-submenu-item.component.ts","../../../projects/systelab-components/src/lib/contextmenu/context-menu-submenu-item.component.html","../../../projects/systelab-components/src/lib/contextmenu/context-menu.component.ts","../../../projects/systelab-components/src/lib/contextmenu/context-menu.component.html","../../../projects/systelab-components/src/lib/twolist/datafilter.pipe.ts","../../../projects/systelab-components/src/lib/twolist/two-list-utilities.ts","../../../projects/systelab-components/src/lib/button/button.component.ts","../../../projects/systelab-components/src/lib/button/button.component.html","../../../projects/systelab-components/src/lib/sortable-list/abstract-sortable-list.component.ts","../../../projects/systelab-components/src/lib/twolist/two-list-sortable-list.component.ts","../../../projects/systelab-components/src/lib/sortable-list/abstract-sortable-list.component.html","../../../projects/systelab-components/src/lib/twolist/two-list.component.ts","../../../projects/systelab-components/src/lib/twolist/two-list.component.html","../../../projects/systelab-components/src/lib/grid/contextmenu/grid-context-menu-cell-renderer.component.ts","../../../projects/systelab-components/src/lib/grid/contextmenu/grid-context-menu-cell-renderer.component.html","../../../projects/systelab-components/src/lib/grid/contextmenu/grid-header-context-menu-renderer.component.ts","../../../projects/systelab-components/src/lib/grid/contextmenu/grid-header-context-menu-renderer.component.html","../../../projects/systelab-components/src/lib/grid/options/grid-column-options.ts","../../../projects/systelab-components/src/lib/modal/dialog/modal-context.ts","../../../projects/systelab-components/src/lib/modal/dialog/dialog-ref.ts","../../../projects/systelab-components/src/lib/tabs/tab.component.ts","../../../projects/systelab-components/src/lib/tabs/tabs.component.ts","../../../projects/systelab-components/src/lib/systelab-components.module.config.ts","../../../projects/systelab-components/src/lib/modal/systelab-dialog-config.ts","../../../projects/systelab-components/src/lib/modal/header/dialog-header.component.ts","../../../projects/systelab-components/src/lib/modal/header/dialog-header.component.html","../../../projects/systelab-components/src/lib/modal/bottom/dialog-bottom.component.ts","../../../projects/systelab-components/src/lib/modal/bottom/dialog-bottom.component.html","../../../projects/systelab-components/src/lib/grid/options/grid-column-options-dialog.component.ts","../../../projects/systelab-components/src/lib/grid/options/grid-column-options-dialog.component.html","../../../projects/systelab-components/src/lib/utilities/styles.util.service.ts","../../../projects/systelab-components/src/lib/utilities/color.util.service.ts","../../../projects/systelab-components/src/lib/combobox/renderer/combobox-favourite-renderer.component.ts","../../../projects/systelab-components/src/lib/combobox/renderer/combobox-favourite-renderer.component.html","../../../projects/systelab-components/src/lib/helper/autosize-grid-helper.ts","../../../projects/systelab-components/src/lib/combobox/abstract-combobox.component.ts","../../../projects/systelab-components/src/lib/combobox/renderer/combobox-input-renderer.ts","../../../projects/systelab-components/src/lib/colorpicker/color-cell-renderer.component.ts","../../../projects/systelab-components/src/lib/colorpicker/color-renderer.component.html","../../../projects/systelab-components/src/lib/combobox/renderer/combobox-input-renderer.component.ts","../../../projects/systelab-components/src/lib/colorpicker/colorpicker.component.ts","../../../projects/systelab-components/src/lib/combobox/abstract-combobox.component.html","../../../projects/systelab-components/src/lib/select/all-yes-no-combobox.component.ts","../../../projects/systelab-components/src/lib/select/no-yes-combobox-component.ts","../../../projects/systelab-components/src/lib/select/period-combobox.component.ts","../../../projects/systelab-components/src/lib/select/gender-combobox.component.ts","../../../projects/systelab-components/src/lib/modal/dialog/dialog.service.ts","../../../projects/systelab-components/src/lib/applicationframe/header/app-header.component.ts","../../../projects/systelab-components/src/lib/applicationframe/header/app-header.component.html","../../../projects/systelab-components/src/lib/applicationframe/sidebar/app-sidebar-large.component.ts","../../../projects/systelab-components/src/lib/applicationframe/sidebar/app-sidebar-large.component.html","../../../projects/systelab-components/src/lib/datepicker/date-transformer.service.ts","../../../projects/systelab-components/src/lib/datepicker/datepicker.component.ts","../../../projects/systelab-components/src/lib/datepicker/datepicker.component.html","../../../projects/systelab-components/src/lib/spinner/touch.spin-values.ts","../../../projects/systelab-components/src/lib/spinner/spinner.component.ts","../../../projects/systelab-components/src/lib/spinner/spinner.component.html","../../../projects/systelab-components/src/lib/datepicker/datepicker-time.component.ts","../../../projects/systelab-components/src/lib/datepicker/datepicker-time.component.html","../../../projects/systelab-components/src/lib/select/select.component.ts","../../../projects/systelab-components/src/lib/tooltip/tooltip.directive.ts","../../../projects/systelab-components/src/lib/applicationframe/sidebar/app-sidebar-small.component.ts","../../../projects/systelab-components/src/lib/applicationframe/sidebar/app-sidebar-small.component.html","../../../projects/systelab-components/src/lib/applicationframe/application-frame.component.ts","../../../projects/systelab-components/src/lib/applicationframe/application-frame.component.html","../../../projects/systelab-components/src/lib/grid/contextmenu/grid-context-menu-action-data.ts","../../../projects/systelab-components/src/lib/grid/abstract-grid.component.ts","../../../projects/systelab-components/src/lib/grid/abstract-api-grid.component.ts","../../../projects/systelab-components/src/lib/grid/contextmenu/grid-context-menu-component.ts","../../../projects/systelab-components/src/lib/grid/contextmenu/grid-header-context-menu.component.ts","../../../projects/systelab-components/src/lib/searcher/searcher.table.component.ts","../../../projects/systelab-components/src/lib/grid/abstract-grid.component.html","../../../projects/systelab-components/src/lib/directives/keyup-debounce.directive.ts","../../../projects/systelab-components/src/lib/searcher/searcher.dialog.component.ts","../../../projects/systelab-components/src/lib/searcher/searcher.dialog.component.html","../../../projects/systelab-components/src/lib/calendar/calendar-header.component.ts","../../../projects/systelab-components/src/lib/calendar/calendar-header.component.html","../../../projects/systelab-components/src/lib/calendar/calendar-table.component.ts","../../../projects/systelab-components/src/lib/calendar/calendar-table.component.html","../../../projects/systelab-components/src/lib/calendar/calendar-footer.component.ts","../../../projects/systelab-components/src/lib/calendar/calendar-footer.component.html","../../../projects/systelab-components/src/lib/calendar/calendar-dialog.component.ts","../../../projects/systelab-components/src/lib/calendar/calendar-dialog.component.html","../../../projects/systelab-components/src/lib/loading/loading.component.ts","../../../projects/systelab-components/src/lib/loading/loading.component.html","../../../projects/systelab-components/src/lib/toggle-button/toggle-button.component.ts","../../../projects/systelab-components/src/lib/toggle-button/toggle-button.component.html","../../../projects/systelab-components/src/lib/file-selector/file-selector.component.ts","../../../projects/systelab-components/src/lib/file-selector/file-selector.component.html","../../../projects/systelab-components/src/lib/timeline/timeline.component.ts","../../../projects/systelab-components/src/lib/timeline/timeline.component.html","../../../projects/systelab-components/src/lib/navbar/navbar.component.ts","../../../projects/systelab-components/src/lib/navbar/navbar.component.html","../../../projects/systelab-components/src/lib/modal/message-popup/message-with-icon.component.ts","../../../projects/systelab-components/src/lib/modal/message-popup/message-with-icon.component.html","../../../projects/systelab-components/src/lib/breadcrumb/breadcrumb.component.ts","../../../projects/systelab-components/src/lib/breadcrumb/breadcrumb.component.html","../../../projects/systelab-components/src/lib/week-selector/week-selector.component.ts","../../../projects/systelab-components/src/lib/week-selector/week-selector.component.html","../../../projects/systelab-components/src/lib/month-selector/month-selector.component.ts","../../../projects/systelab-components/src/lib/month-selector/month-selector.component.html","../../../projects/systelab-components/src/lib/signature-canvas/signature-canvas.component.ts","../../../projects/systelab-components/src/lib/signature-canvas/signature-canvas.component.html","../../../projects/systelab-components/src/lib/percentage-circle/percentage-circle.component.ts","../../../projects/systelab-components/src/lib/percentage-circle/percentage-circle.component.html","../../../projects/systelab-components/src/lib/loading/loading.service.ts","../../../projects/systelab-components/src/lib/select/time-unit-combobox.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/checkbox/checkbox-cell-renderer.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/checkbox/checkbox-cell-renderer.component.html","../../../projects/systelab-components/src/lib/wizard-steps/wizard-steps.component.ts","../../../projects/systelab-components/src/lib/wizard-steps/wizard-steps.component.html","../../../projects/systelab-components/src/lib/grid/custom-cells/spinner/spinner-cell-editor.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/spinner/spinner-cell-editor.component.html","../../../projects/systelab-components/src/lib/grid/custom-cells/spinner/spinner-cell-renderer.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/input/input-cell-editor.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/input/input-cell-editor.component.html","../../../projects/systelab-components/src/lib/grid/custom-cells/checkbox/checkbox-cell-editor.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/checkbox/checkbox-cell-editor.component.html","../../../projects/systelab-components/src/lib/grid/custom-cells/decimal-input/decimal-input-cell-editor.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/decimal-input/decimal-input-cell-editor.component.html","../../../projects/systelab-components/src/lib/listbox/renderer/abstract-tree-listbox-renderer.component.ts","../../../projects/systelab-components/src/lib/listbox/renderer/abstract-tree-listbox-renderer.component.html","../../../projects/systelab-components/src/lib/listbox/abstract-listbox.component.ts","../../../projects/systelab-components/src/lib/listbox/gender-listbox.component.ts","../../../projects/systelab-components/src/lib/listbox/abstract-listbox.component.html","../../../projects/systelab-components/src/lib/numpad/numpad.dialog.component.ts","../../../projects/systelab-components/src/lib/numpad/numpad.dialog.component.html","../../../projects/systelab-components/src/lib/directives/autofocus.directive.ts","../../../projects/systelab-components/src/lib/numpad/numpad.component.ts","../../../projects/systelab-components/src/lib/numpad/numpad.component.html","../../../projects/systelab-components/src/lib/listbox/listbox.component.ts","../../../projects/systelab-components/src/lib/contextpanel/context-panel.component.ts","../../../projects/systelab-components/src/lib/contextpanel/context-panel.component.html","../../../projects/systelab-components/src/lib/date-range-picker/date-range-picker.component.ts","../../../projects/systelab-components/src/lib/date-range-picker/date-range-picker.component.html","../../../projects/systelab-components/src/lib/modal/message-popup/message-popup-view.component.ts","../../../projects/systelab-components/src/lib/modal/message-popup/message-popup-view.component.html","../../../projects/systelab-components/src/lib/paginator/paginator-page.component.ts","../../../projects/systelab-components/src/lib/paginator/paginator-page.component.html","../../../projects/systelab-components/src/lib/paginator/paginator.component.ts","../../../projects/systelab-components/src/lib/paginator/paginator.component.html","../../../projects/systelab-components/src/lib/modal/message-popup/message-popup.service.ts","../../../projects/systelab-components/src/lib/chip-button/chip-button.component.ts","../../../projects/systelab-components/src/lib/chip-button/chip-button.component.html","../../../projects/systelab-components/src/lib/grid/custom-cells/stacked-bar/stacked-bar-cell-renderer.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/stacked-bar/stacked-bar-cell-renderer.component.html","../../../projects/systelab-components/src/lib/chips/chips.component.ts","../../../projects/systelab-components/src/lib/chips/chips.component.html","../../../projects/systelab-components/src/lib/spy-menu/spy-menu.component.ts","../../../projects/systelab-components/src/lib/spy-menu/spy-menu.component.html","../../../projects/systelab-components/src/lib/spy-menu/scroll-spy.directive.ts","../../../projects/systelab-components/src/lib/toast/toast-animation.ts","../../../projects/systelab-components/src/lib/toast/toast-config.ts","../../../projects/systelab-components/src/lib/toast/toast-ref.ts","../../../projects/systelab-components/src/lib/toast/toast.service.ts","../../../projects/systelab-components/src/lib/toast/toast.component.ts","../../../projects/systelab-components/src/lib/toast/toast.component.html","../../../projects/systelab-components/src/lib/toggle-selector/toggle-selector.component.ts","../../../projects/systelab-components/src/lib/toggle-selector/toggle-selector.component.html","../../../projects/systelab-components/src/lib/slider-double-range/slider-double-range.component.ts","../../../projects/systelab-components/src/lib/slider-double-range/slider-double-range.component.html","../../../projects/systelab-components/src/lib/directives/draggable.directive.ts","../../../projects/systelab-components/src/lib/directives/resizable.directive.ts","../../../projects/systelab-components/src/lib/image-viewer/image-viewer.component.ts","../../../projects/systelab-components/src/lib/image-viewer/image-viewer.component.html","../../../projects/systelab-components/src/lib/helper/translation-helper.ts","../../../projects/systelab-components/src/lib/helper/number-helper.ts","../../../projects/systelab-components/src/lib/directives/numpad-decimal-numeric.directive.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/positive-integer/positive-integer-input-cell-editor.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/positive-integer/positive-integer-input-cell-editor.component.html","../../../projects/systelab-components/src/lib/directives/test-id.directive.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/searcher-tree-header/searcher-tree-header-renderer.component.ts","../../../projects/systelab-components/src/lib/grid/custom-cells/searcher-tree-header/searcher-tree-header-renderer.component.html","../../../projects/systelab-components/src/lib/accordion/accordion.component.ts","../../../projects/systelab-components/src/lib/accordion/accordion.component.html","../../../projects/systelab-components/src/lib/lib.config.ts","../../../projects/systelab-components/src/lib/systelab-components.module.ts","../../../projects/systelab-components/src/lib/contextmenu/abstract-context-menu-option.ts","../../../projects/systelab-components/src/lib/contextmenu/context-menu-option.ts","../../../projects/systelab-components/src/lib/applicationframe/sidebar/app-sidebar.component.ts","../../../projects/systelab-components/src/lib/searcher/searcher.dialog.parameters.ts","../../../projects/systelab-components/src/lib/searcher/abstract-searcher.ts","../../../projects/systelab-components/src/lib/searcher/abstract-generic.searcher.component.ts","../../../projects/systelab-components/src/lib/searcher/abstract-searcher.component.ts","../../../projects/systelab-components/src/lib/combobox/abstract-api-combobox.component.ts","../../../projects/systelab-components/src/lib/combobox/autocomplete/autocomplete-api-combobox.component.ts","../../../projects/systelab-components/src/lib/combobox/tree/abstract-api-tree-combobox.component.ts","../../../projects/systelab-components/src/lib/grid/contextmenu/grid-context-menu-option.ts","../../../projects/systelab-components/src/lib/listbox/abstract-api-listbox.component.ts","../../../projects/systelab-components/src/lib/listbox/abstract-api-tree-listbox.component.ts","../../../projects/systelab-components/src/lib/add-remove-list/abstract-add-remove-list.component.ts","../../../projects/systelab-components/src/lib/tree/tree-node.ts","../../../projects/systelab-components/src/lib/tree/abstract-tree.component.ts","../../../projects/systelab-components/src/lib/spy-menu/spy-menu-item.ts","../../../projects/systelab-components/src/lib/forms/validators/email-validator.directive.ts","../../../projects/systelab-components/src/lib/forms/validators/phone-validator.directive.ts","../../../projects/systelab-components/src/lib/forms/validators/url-validator.directive.ts","../../../projects/systelab-components/src/lib/theme/theme.config.ts","../../../projects/systelab-components/src/lib/theme/theme.service.ts","../../../projects/systelab-components/src/public-api.ts","../../../projects/systelab-components/src/systelab-components.ts"],"sourcesContent":["import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\n\n@Component({\n selector: 'systelab-slider',\n templateUrl: 'slider.component.html',\n standalone: false\n})\nexport class SliderComponent {\n\n\t@Input() public min = 0;\n\t@Input() public max = 100;\n\t@Input() public step = 1;\n\t@Input() public continuous = true;\n\n\t@Input() public value = 0;\n\t@Output() public valueChange = new EventEmitter();\n\n\t@ViewChild('range', {static: false}) element: ElementRef;\n\n\tpublic sliderChangeEvent(event: any) {\n\t\tconst v = this.element.nativeElement.value;\n\t\tif (v !== this.value) {\n\t\t\tthis.value = v;\n\t\t\tthis.valueChange.emit(this.value);\n\t\t}\n\t}\n\n\tpublic sliderInputEvent(event: any) {\n\t\tif (this.continuous) {\n\t\t\tthis.value = this.element.nativeElement.value;\n\t\t\tthis.valueChange.emit(this.value);\n\t\t}\n\t}\n}\n","<input #range type=\"range\" min=\"{{ min }}\" max=\"{{ max }}\" value=\"{{ value }}\" step=\"{{ step }}\"\n (change)=\"sliderChangeEvent($event)\" (input)=\"sliderInputEvent($event)\" class=\"slab-slider\" id=\"myRange\" />","import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';\n\n@Component({\n selector: 'systelab-switch',\n templateUrl: 'switch.component.html',\n standalone: false\n})\nexport class SwitchComponent {\n\tprivate checked = false;\n\n\t@Input() get isChecked() {\n\t\treturn this.checked;\n\t}\n\n\tset isChecked(val: boolean) {\n\t\tthis.checked = val;\n\t\tthis.isCheckedChange.emit(this.checked);\n\t}\n\n\t@Output() public isCheckedChange = new EventEmitter();\n\n\t@Input() public disabled = false;\n\n\t@HostListener('click')\n\tpublic onToggle() {\n\t\tif (!this.disabled) {\n\t\t\tthis.isChecked = !this.isChecked;\n\t\t}\n\t}\n\n\tpublic doKeyDown(event: KeyboardEvent) {\n\t\tif (event.key === ' ') {\n\t\t\tif (!this.disabled) {\n\t\t\t\tthis.isChecked = !this.isChecked;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n}\n","<span class=\"slab-switch\" [tabIndex]=\"disabled?-1:0\" [class.checked]=\"isChecked\" [class.disabled]=\"disabled\" (keydown)=\"doKeyDown($event)\">\n <span class=\"slab-tick\"></span>\n <input type=\"checkbox\" name=\"checkbox\" [checked]=\"isChecked\" [disabled]=\"disabled\" style=\"display:none\">\n <span class=\"slab-switch-text\"></span>\n</span>\n","export class ContextMenuActionData {\n\n\tconstructor( public elementId: string, public actionId: string) {\n\t}\n\n}\n","import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output, Renderer2, ViewChild } from '@angular/core';\n\ndeclare var jQuery: any;\n\n@Directive()\nexport abstract class AbstractContextComponent<T> implements OnInit, OnDestroy {\n\n\t@ViewChild('dropdownparent', {static: true}) public dropdownParent: ElementRef;\n\t@ViewChild('dropdownmenu', {static: false}) public dropdownMenuElement: ElementRef;\n\t@ViewChild('dropdown', {static: false}) public dropdownElement: ElementRef;\n\t@ViewChild('ngcontent', {static: false}) public ngcontent: ElementRef;\n\n\t@Output() public action = new EventEmitter();\n\n\t@Input() public elementID = (Math.floor(Math.random() * (999999999999 - 1))).toString();\n\t@Input() public fontSize: string;\n\t@Input() public fontColor: string;\n\t@Input() public isEmbedded = false;\n\t@Input() public overflow = false;\n\n\tpublic destroyWheelListener: Function;\n\tpublic destroyMouseListener: Function;\n\tpublic destroyKeyListener: Function;\n\tpublic scrollHandler: any;\n\tpublic isOpened = false;\n\tprotected previousActionId: string;\n\tprotected previousShownMenu: Array<string> = [];\n\tprotected previousMenuWidth: Array<number> = [];\n\tprotected lastMenuLevel = 0;\n\n\tprotected constructor(protected el: ElementRef, protected myRenderer: Renderer2, protected cdr: ChangeDetectorRef) {\n\t}\n\n\tpublic ngOnInit(): void {\n\t\tjQuery(this.dropdownParent.nativeElement)\n\t\t\t.on('hide.bs.dropdown', this.actionsAfterCloseDropDown.bind(this));\n\t}\n\n\t@HostListener('window:resize', ['$event'])\n\tpublic onResize(event: any): void {\n\t\tif (this.isDropDownOpened()) {\n\t\t\tthis.closeDropDown();\n\t\t}\n\t}\n\n\tpublic isDropDownOpened(): boolean {\n\t\treturn this.dropdownParent.nativeElement.className.includes('show');\n\t}\n\n\tprotected loop(x: number, y: number): void {\n\t\tif (this.isDropDownOpened()) {\n\t\t\tthis.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'position', 'fixed');\n\t\t\tif (this.isEmbedded) {\n\t\t\t\tthis.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'transform', 'unset');\n\t\t\t}\n\t\t\tthis.myRenderer.setStyle(this.dropdownElement.nativeElement, 'position', 'absolute');\n\t\t\ty = y - this.dropdownParent.nativeElement.offsetHeight;\n\t\t\tif (y + this.dropdownElement.nativeElement.offsetHeight > window.innerHeight) {\n\t\t\t\ty = y - this.dropdownElement.nativeElement.offsetHeight;\n\t\t\t\tif (y < 0) {\n\t\t\t\t\ty = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (x + this.dropdownElement.nativeElement.offsetWidth > window.innerWidth) {\n\t\t\t\tx = x - this.dropdownElement.nativeElement.offsetWidth;\n\t\t\t}\n\t\t\tthis.myRenderer.setStyle(this.dropdownElement.nativeElement, 'top', y + 'px');\n\t\t\tthis.myRenderer.setStyle(this.dropdownElement.nativeElement, 'left', x + 'px');\n\t\t\tthis.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'visibility', 'visible');\n\t\t\tthis.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'backgroundColor', 'transparent');\n\t\t\tthis.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'border', '0');\n\t\t\tthis.addListeners();\n\n\t\t} else {\n\t\t\tsetTimeout(() => this.loop(x, y), 10);\n\t\t}\n\t}\n\n\tpublic showDropDown(x: number, y: number): void {\n\t\tsetTimeout(() => this.loop(x, y), 10);\n\t}\n\n\tpublic resetDropDownPositionAndHeight(): void {\n\t\tthis.myRenderer.setStyle(this.dropdownElement.nativeElement, 'top', null);\n\t\tthis.myRenderer.setStyle(this.dropdownElement.nativeElement, 'left', null);\n\t}\n\n\tprotected getFirstChildLeft(selectedChild: ElementRef): number {\n\t\tlet firstChildLeft = this.dropdownElement.nativeElement.offsetWidth + 15;\n\t\tconst firstChildAbsoluteLeft = this.dropdownElement.nativeElement.offsetLeft;\n\n\t\tif (firstChildAbsoluteLeft + this.dropdownElement.nativeElement.offsetWidth +\n\t\t\tselectedChild.nativeElement.offsetWidth > window.innerWidth) {\n\t\t\tfirstChildLeft = -selectedChild.nativeElement.offsetWidth + 10;\n\t\t}\n\t\treturn firstChildLeft;\n\t}\n\n\tprotected getFirstChildLeftWithLevels(selectedChild: ElementRef, optionLevel: number, previousMenuWidth: Array<number>): number {\n\t\tlet firstChildLeft;\n\t\tlet accumulativeLeft = 0;\n\t\tconst firstChildAbsoluteLeft = this.dropdownElement.nativeElement.offsetLeft;\n\n\t\tif (optionLevel < 1) {\n\t\t\tfirstChildLeft = this.dropdownElement.nativeElement.offsetWidth + 12;\n\t\t} else {\n\t\t\tfirstChildLeft = previousMenuWidth[optionLevel - 1] + 12;\n\t\t\tfor (let i = 0; i < optionLevel; i++) {\n\t\t\t\taccumulativeLeft = accumulativeLeft + previousMenuWidth[i];\n\t\t\t}\n\t\t}\n\n\t\tif (firstChildAbsoluteLeft + this.dropdownElement.nativeElement.offsetWidth + accumulativeLeft +\n\t\t\tselectedChild.nativeElement.offsetWidth > window.innerWidth) {\n\t\t\tfirstChildLeft = -selectedChild.nativeElement.offsetWidth + 15;\n\t\t}\n\t\treturn firstChildLeft;\n\t}\n\n\tprotected getFirstChildTop(event: any, selectedChild: ElementRef): number {\n\t\tconst firstChildAbsoluteTop = event.clientY;\n\t\tlet firstChildRelativeTop = event.target.offsetTop;\n\n\t\tif (firstChildAbsoluteTop + selectedChild.nativeElement.offsetHeight > window.innerHeight) {\n\t\t\tfirstChildRelativeTop = firstChildRelativeTop - selectedChild.nativeElement.offsetHeight;\n\t\t}\n\t\treturn firstChildRelativeTop;\n\t}\n\n\tpublic actionsAfterCloseDropDown(): void {\n\t\tthis.previousShownMenu = [];\n\t\tthis.previousMenuWidth = [];\n\t\tthis.lastMenuLevel = 0;\n\t\tthis.previousActionId = undefined;\n\t\tthis.isOpened = false;\n\t\tthis.cdr.detectChanges();\n\t\tthis.removeScrollHandler();\n\t\tif (this.destroyWheelListener) {\n\t\t\tthis.destroyWheelListener();\n\t\t}\n\t\tif (this.destroyKeyListener) {\n\t\t\tthis.destroyKeyListener();\n\t\t}\n\t\tif (this.destroyMouseListener) {\n\t\t\tthis.destroyMouseListener();\n\t\t}\n\t\tthis.resetDropDownPositionAndHeight();\n\t}\n\n\tpublic closeDropDown(): void {\n\t\tif (this.isDropDownOpened()) {\n\t\t\tthis.myRenderer.removeAttribute(this.dropdownParent.nativeElement, 'aria-expanded');\n\t\t\tthis.myRenderer.removeClass(this.dropdownParent.nativeElement, 'show');\n\t\t\tthis.myRenderer.removeClass(this.dropdownMenuElement.nativeElement, 'show');\n\t\t\tthis.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'visibility', 'hidden');\n\t\t}\n\t\tthis.actionsAfterCloseDropDown();\n\t}\n\n\tprotected addListeners(): void {\n\t\tthis.addScrollHandler();\n\t\tthis.destroyMouseListener = this.myRenderer.listen('window', 'click', (evt: MouseEvent) => {\n\t\t\tthis.handleMouseEvents(evt);\n\t\t});\n\t\tthis.destroyWheelListener = this.myRenderer.listen('window', 'scroll', (evt: WheelEvent) => {\n\t\t\tthis.handleWheelEvents(evt);\n\t\t});\n\t\tthis.destroyKeyListener = this.myRenderer.listen('document', 'keydown', (evt: KeyboardEvent) => {\n\t\t\tthis.handleKeyboardEvents(evt);\n\t\t});\n\t}\n\n\tprotected handleKeyboardEvents(event: KeyboardEvent): void {\n\t\tif (event.key === 'Escape') {\n\t\t\tif (this.isDropDownOpened()) {\n\t\t\t\tthis.closeDropDown();\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected handleWheelEvents(event: WheelEvent): void {\n\t\tthis.checkTargetAndClose(event.target);\n\t}\n\n\tprotected handleMouseEvents(event: MouseEvent): void {\n\t\tthis.checkTargetAndClose(event.target);\n\t}\n\n\tprotected scroll(event: any): void {\n\t\tthis.checkTargetAndClose(event.target);\n\t}\n\n\tprotected checkTargetAndClose(target: any): void {\n\t\tif (!this.checkIfNgContent(target)) {\n\t\t\tif (this.isDropDownOpened()) {\n\t\t\t\tthis.closeDropDown();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic ngContentStopPropagation(event: any): void {\n\t\tevent.stopPropagation();\n\t}\n\n\tprotected checkIfNgContent(target: any): boolean {\n\t\tlet currentElement = target;\n\t\twhile (currentElement !== this.dropdownElement && currentElement) {\n\t\t\tif (currentElement === this.ngcontent.nativeElement) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tcurrentElement = currentElement.parentElement;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprotected addScrollHandler(): void {\n\t\tthis.scrollHandler = this.scroll.bind(this);\n\t\twindow.addEventListener('scroll', this.scrollHandler, true);\n\t}\n\n\tprotected removeScrollHandler(): void {\n\t\twindow.removeEventListener('scroll', this.scrollHandler, true);\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\tthis.removeScrollHandler();\n\t}\n\n\tpublic dotsClicked(event: MouseEvent): void {\n\t\tif (!this.isDropDownOpened()) {\n\t\t\tthis.elementID = (Math.floor(Math.random() * (999999999999 - 1))).toString();\n\t\t\tthis.hideDivUntilIsPositioned(event.clientX, event.clientY);\n\t\t}\n\t}\n\n\tprotected hideDivUntilIsPositioned(x: number, y: number): void {\n\t\t// hide the div until is positioned in event x y position to avoid flick\n\t\tthis.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'visibility', 'hidden');\n\t\tthis.isOpened = true;\n\t\tthis.cdr.detectChanges();\n\t\tthis.showDropDown(x, y);\n\t}\n\n\tpublic open(event: MouseEvent): void {\n\t\tjQuery('#' + this.elementID)\n\t\t\t.dropdown('toggle');\n\t\tif (!this.isDropDownOpened()) {\n\t\t\t// Add class manually because is not set when jquery.dropdwon toogle is executed\n\t\t\tthis.myRenderer.addClass(this.dropdownParent.nativeElement, 'show');\n\t\t\tthis.hideDivUntilIsPositioned(event.clientX, event.clientY);\n\t\t}\n\t}\n\n\tpublic toggle(elementID: string): void {\n\t\tjQuery('#' + elementID)\n\t\t\t.toggle();\n\t}\n}\n","import { Directive, ElementRef, EventEmitter, Input, Output, QueryList, ViewChild, ViewChildren, OnInit } from '@angular/core';\nimport { AbstractContextComponent } from './abstract-context.component';\nimport { ContextMenuOption } from './context-menu-option';\n\n@Directive()\nexport abstract class AbstractContextMenuComponent<T> extends AbstractContextComponent<T> implements OnInit {\n\n\t@ViewChildren('childdropdownmenu') public childDropdownMenuElement: QueryList<ElementRef>;\n\t@ViewChild('scrollableList', {static: false}) public scrollableList: ElementRef;\n\n\t@Output() public override action = new EventEmitter();\n\n\tpublic readonly levelSeparator = '_|_';\n\tpublic hasIcons = false;\n\tprivate contextMenuOptionsList: Array<T>;\n\n\t@Input()\n\tset contextMenuOptions(value: Array<T>) {\n\t\tthis.contextMenuOptionsList = value;\n\t\tthis.checkIfHasIcons();\n\t}\n\n\tget contextMenuOptions(): Array<T> {\n\t\treturn this.contextMenuOptionsList;\n\t}\n\n\tpublic override ngOnInit(): void {\n\t\tsuper.ngOnInit();\n\t\tthis.checkIfHasIcons();\n\t}\n\n\tpublic override dotsClicked(event: MouseEvent): void {\n\t\tif (this.existsAtLeastOneActionEnabled()) {\n\t\t\tsuper.dotsClicked(event);\n\t\t} else {\n\t\t\tevent.stopPropagation();\n\t\t}\n\t}\n\n\tpublic override open(event: MouseEvent): void {\n\t\tif (this.existsAtLeastOneActionEnabled()) {\n\t\t\tsuper.open(event);\n\t\t} else {\n\t\t\tevent.stopPropagation();\n\t\t}\n\t}\n\n\tpublic doClick(event: any, elementID: string, action: ContextMenuOption, parent?: ContextMenuOption): void {\n\t\tif (this.isEnabled(elementID, action.actionId)) {\n\t\t\tthis.executeAction(event, elementID, action.actionId);\n\t\t}\n\t}\n\n\tpublic doClickWithAction(event: any, elementID: string, actionId: string): void {\n\t\tif (this.isEnabled(elementID, actionId)) {\n\t\t\tthis.executeAction(event, elementID, actionId);\n\t\t}\n\t}\n\n\tpublic doMouseOver(event: any, elementID: string, actionId: string): void {\n\t\tif (this.isEnabled(elementID, actionId)) {\n\t\t\tconst optionAcitionId = this.getOptionDetailsActionId(actionId);\n\n\t\t\tconst selectedChild = this.childDropdownMenuElement.toArray()\n\t\t\t\t.find((elem) => elem.nativeElement.id === (optionAcitionId + this.elementID));\n\n\t\t\tthis.showSubmenu(event, actionId, selectedChild, this.elementID);\n\t\t}\n\t}\n\n\tpublic getSelfReference(): AbstractContextMenuComponent<T> {\n\t\treturn this;\n\t}\n\n\tpublic getMenuLevel(actionId: string): number {\n\t\tconst actions: string[] = actionId ? actionId.split(this.levelSeparator) : [];\n\t\treturn actions.length - 1;\n\t}\n\n\tpublic getOptionDetailsActionId(actionId: string): string {\n\t\tconst option = this.getOption(actionId);\n\t\treturn option ? option.actionId : undefined;\n\t}\n\n\tpublic getOptionDetailsHasChildren(actionId: string): boolean {\n\t\tconst option = this.getOption(actionId);\n\t\treturn option ? option.hasChildren() : false;\n\t}\n\n\tpublic showSubmenu(event: any, actionId: string, selectedChild: ElementRef, elementId: string): void {\n\t\tconst optionActionId = this.getOptionDetailsActionId(actionId);\n\t\tconst optionHasChildren = this.getOptionDetailsHasChildren(actionId);\n\t\tconst optionLevel = this.getMenuLevel(actionId);\n\n\t\tif (optionHasChildren) {\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tif (this.previousActionId !== optionActionId) {\n\t\t\t\tthis.previousActionId = optionActionId;\n\t\t\t\tthis.hideSubmenus(optionLevel);\n\t\t\t\tthis.lastMenuLevel = optionLevel + 1;\n\n\t\t\t\tthis.previousShownMenu.push(optionActionId + elementId);\n\n\t\t\t\tthis.toggle(optionActionId + elementId);\n\n\t\t\t\tthis.previousMenuWidth[this.lastMenuLevel - 1] = selectedChild.nativeElement.offsetWidth;\n\n\t\t\t\tconst leftPosition = this.getFirstChildLeftWithLevels(selectedChild, optionLevel, this.previousMenuWidth);\n\n\t\t\t\tthis.myRenderer.setStyle(selectedChild.nativeElement, 'top', this.getFirstChildTop(event, selectedChild) + 'px');\n\n\t\t\t\tif (selectedChild.nativeElement.getBoundingClientRect().top < 0) {\n\t\t\t\t\tthis.myRenderer.setStyle(selectedChild.nativeElement, 'top', (0 - event.clientY + selectedChild.nativeElement.parentElement.offsetTop + 10) + 'px');\n\t\t\t\t}\n\n\t\t\t\tthis.myRenderer.setStyle(selectedChild.nativeElement, 'left', leftPosition + 'px');\n\t\t\t}\n\t\t} else {\n\t\t\tthis.hideSubmenus(optionLevel);\n\t\t\tthis.lastMenuLevel = optionLevel;\n\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\t\t\tthis.previousActionId = optionActionId;\n\n\t\t}\n\t}\n\n\tprotected checkIfHasIcons(): void {\n\t\tthis.hasIcons = false;\n\t}\n\n\tprotected override checkTargetAndClose(target: any): void {\n\t\tif (!this.checkIfNgContent(target)) {\n\t\t\tif (target !== this.scrollableList.nativeElement && this.isDropDownOpened()) {\n\t\t\t\tif (this.childDropdownMenuElement) {\n\t\t\t\t\tif (!this.childDropdownMenuElement.toArray()\n\t\t\t\t\t\t.some((elem) => target === elem.nativeElement)) {\n\t\t\t\t\t\tthis.closeDropDown();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.closeDropDown();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected hideSubmenus(untilLevel: number): void {\n\t\tif (untilLevel < this.lastMenuLevel) {\n\t\t\tfor (let i = this.lastMenuLevel; i > untilLevel; i--) {\n\t\t\t\tif (this.previousShownMenu[i - 1]) {\n\t\t\t\t\tthis.toggle(this.previousShownMenu[i - 1]);\n\t\t\t\t}\n\t\t\t\tthis.previousShownMenu.pop();\n\t\t\t\tthis.lastMenuLevel = i - 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic abstract openWithOptions(event: MouseEvent, newContextMenuOptions: Array<T>): void;\n\n\tpublic abstract isEnabled(elementId: string, actionId: string): boolean;\n\n\tpublic abstract isIconEnabled(elementId: string, actionId: string): boolean;\n\n\tpublic abstract executeAction(event: any, elementId: string, actionId: string, parentAction?: string): void;\n\n\tprotected abstract existsAtLeastOneActionEnabled(): boolean;\n\n\tprotected abstract getOption(actionId: string);\n}\n","import { Component, Input } from '@angular/core';\nimport { ContextMenuOption } from './context-menu-option';\n\n@Component({\n selector: 'systelab-context-menu-item',\n templateUrl: 'context-menu-item.component.html',\n standalone: false\n})\nexport class ContextMenuItemComponent {\n\n\t@Input() public action: ContextMenuOption;\n\t@Input() public hasIcons: boolean;\n\t@Input() public isEnabled: boolean;\n\t@Input() public isIconEnabled: boolean;\n\t@Input() public hasChildren: boolean;\n\n\tconstructor() {\n\t}\n\n}\n","@if (hasIcons && isIconEnabled) {\n <div\n class=\"slab-icon-container rounded d-flex text-center justify-content-center align-items-center\"\n [style.background-color]=\"action.backgroundIconColor\">\n <i class=\"slab-flex-1 slab-menu-icon {{action.iconClass}}\" [style.color]=\"action.iconColor\"\n [style.font-size]=\"action.iconFontSize\"\n [ngClass]=\"{'text-white': !action.iconColor}\"></i>\n </div>\n}\n<a class=\"slab-flex-1\" style=\"flex:1 1 auto\" [style.padding-left]=\"hasIcons && !isIconEnabled?'20px':'0'\"\n[ngClass]=\"{'ml-2': hasIcons}\">{{action.actionText}}</a>\n@if (hasChildren) {\n <span class=\"pl-3 slab-menu-caret icon-chevron-right small mt-1\" ></span>\n}\n@if (action.isDivider && isEnabled) {\n <div class=\"dropdown-divider\"></div>\n}","import { Component, ElementRef, Input, QueryList, ViewChildren, } from '@angular/core';\nimport { AbstractContextMenuComponent } from './abstract-context-menu.component';\nimport { ContextMenuOption } from './context-menu-option';\n\n@Component({\n selector: 'systelab-context-menu-submenu-item',\n templateUrl: 'context-menu-submenu-item.component.html',\n standalone: false\n})\nexport class ContextMenuSubmenuItemComponent {\n\n\t@Input() public action: ContextMenuOption;\n\t@Input() public actionName: string;\n\t@Input() public hasIcons: boolean;\n\t@Input() public hasChildren: boolean;\n\tpublic readonly levelSeparator = '_|_';\n\t@Input() public contextMenuOriginal: AbstractContextMenuComponent<ContextMenuOption>;\n\t@Input() public parentId: string;\n\n\t@Input() public elementID = (Math.floor(Math.random() * (999999999999 - 1))).toString();\n\n\t@ViewChildren('childdropdownmenu') public childDropdownMenuElement: QueryList<ElementRef>;\n\n\tconstructor() {\n\t}\n\n\tpublic doMouseOver(event: any, elementID: string, actionId: string): void {\n\t\tlet selectedChild;\n\n\t\tconst optionAcitionId = this.contextMenuOriginal.getOptionDetailsActionId(actionId);\n\n\t\tselectedChild = this.childDropdownMenuElement.toArray()\n\t\t\t.find((elem) => elem.nativeElement.id === (optionAcitionId + this.elementID));\n\n\t\tthis.contextMenuOriginal.showSubmenu(event, actionId, selectedChild, this.elementID);\n\t}\n\n\tpublic doClickWithAction(event: any, elementID: string, actionId: string): void {\n\t\tthis.contextMenuOriginal.executeAction(event, elementID, actionId);\n\t}\n\n\tpublic getAction(childActionId: String): string {\n\t\treturn this.actionName + this.levelSeparator + childActionId;\n\t}\n\n\tpublic isEnabled(elementId: string, actionId: string): boolean {\n\t\treturn (this.action && this.action.isActionEnabled) ? this.action.isActionEnabled(elementId, actionId) : true;\n\t}\n\n\tpublic isIconEnabled(elementId: string, actionId: string): boolean {\n\t\treturn (this.action && this.action.isIconEnabled) ? this.action.isIconEnabled(elementId, actionId) : true;\n\t}\n}\n","@for (childAction of action.childrenContextMenuOptions; track childAction.actionId) {\n <li class=\"d-flex align-items-center\" [class.disabled]=\"!true\"\n (click)=\"doClickWithAction($event, parentId, actionName + levelSeparator + childAction.actionId)\"\n (mouseover)=\"doMouseOver($event, elementID, actionName + levelSeparator + childAction.actionId)\">\n @if (isEnabled) {\n <div class=\"slab-flex-1\" style=\"flex:1 1 auto\">\n <systelab-context-menu-item class=\"d-flex align-items-center\" [action]=\"childAction\"\n [isEnabled]=\"isEnabled(elementID, childAction.actionId)\"\n [isIconEnabled]=\"isIconEnabled(elementID, childAction.actionId)\"\n [hasChildren]=\"childAction.hasChildren()\"\n [hasIcons]=\"hasIcons\"></systelab-context-menu-item>\n @if (childAction.hasChildren()) {\n <ul #childdropdownmenu id=\"{{childAction.actionId+elementID}}\"\n class=\"slab-dropdown dropdown-menu slab-dropdown-menu slab-dropdown-scroll slab-dropdown-absolute\">\n <systelab-context-menu-submenu-item [action]=\"childAction\"\n [actionName]=\"getAction(childAction.actionId)\"\n [hasChildren]=\"childAction.hasChildren()\"\n [hasIcons]=\"hasIcons\"\n [contextMenuOriginal]=\"contextMenuOriginal\"\n [parentId]=\"parentId\"\n ></systelab-context-menu-submenu-item>\n </ul>\n }\n </div>\n }\n </li>\n}\n","import { ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit, Renderer2 } from '@angular/core';\nimport { ContextMenuActionData } from './context-menu-action-data';\nimport { ContextMenuOption } from './context-menu-option';\nimport { AbstractContextMenuComponent } from './abstract-context-menu.component';\n\n@Component({\n selector: 'systelab-context-menu',\n templateUrl: 'context-menu.component.html',\n standalone: false\n})\nexport class ContextMenuComponent extends AbstractContextMenuComponent<ContextMenuOption> implements OnInit, OnDestroy {\n\n\tconstructor(protected override el: ElementRef, protected override myRenderer: Renderer2, protected override cdr: ChangeDetectorRef) {\n\t\tsuper(el, myRenderer, cdr);\n\t}\n\n\tpublic openWithOptions(event: MouseEvent, newContextMenuOptions: Array<ContextMenuOption>): void {\n\t\tthis.contextMenuOptions = newContextMenuOptions;\n\t\tthis.open(event);\n\t}\n\n\tpublic override getSelfReference(): AbstractContextMenuComponent<ContextMenuOption> {\n\t\treturn this;\n\t}\n\n\tprotected existsAtLeastOneActionEnabled(): boolean {\n\t\tif (this.contextMenuOptions) {\n\t\t\treturn this.contextMenuOptions.some(opt => this.isEnabled(this.elementID, opt.actionId));\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic isEnabled(elementId: string, actionId: string): boolean {\n\t\tconst option: ContextMenuOption = this.getOption(actionId);\n\t\treturn (option && option.isActionEnabled) ? option.isActionEnabled(elementId, actionId) : true;\n\t}\n\n\tpublic isIconEnabled(elementId: string, actionId: string): boolean {\n\t\tconst option: ContextMenuOption = this.getOption(actionId);\n\t\treturn (option && option.isIconEnabled) ? option.isIconEnabled(elementId, actionId) : true;\n\t}\n\n\tpublic executeAction(event: any, elementId: string, actionId: string): void {\n\n\t\tconst option: ContextMenuOption = this.getOption(actionId);\n\n\t\tif (option && option.hasChildren()) {\n\t\t\tthis.doMouseOver(event, elementId, actionId);\n\t\t} else {\n\t\t\t\tthis.closeDropDown();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\tif (option && option.action) {\n\t\t\t\toption.action(new ContextMenuActionData(elementId, actionId));\n\t\t\t} else {\n\t\t\t\tthis.action.emit(new ContextMenuActionData(elementId, actionId));\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected override checkIfHasIcons(): void {\n\t\tthis.hasIcons = this.contextMenuOptions.some(opt => opt.iconClass !== undefined && opt.iconClass !== null);\n\t}\n\n\tprotected getOption(actionId: string, parentAction?: string): ContextMenuOption {\n\t\tif (actionId) {\n\t\t\tconst actions: string[] = actionId.split(this.levelSeparator);\n\t\t\tlet level = 1;\n\n\t\t\tlet menuLevel: ContextMenuOption = this.contextMenuOptions.find(opt => opt.actionId === actions[level - 1]);\n\t\t\tlevel++;\n\t\t\twhile (level <= actions.length) {\n\t\t\t\tmenuLevel = menuLevel.childrenContextMenuOptions.find(opt => opt.actionId === actions[level - 1]);\n\t\t\t\tlevel++;\n\t\t\t}\n\t\t\treturn menuLevel;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n}\n","<div #dropdownparent id=\"{{elementID}}\" class=\"dropdown\">\n <div class=\"dropdown-toggle slab-context-menu\" data-toggle=\"dropdown\" (click)=\"dotsClicked($event)\">\n <i class=\"icon-context-menu\" [ngClass]=\"{'d-none': isEmbedded}\" [style.font-size]=\"fontSize\"\n [style.color]=\"fontColor\"></i>\n </div>\n <div #dropdownmenu class=\"dropdown-menu slab-dropdown-menu\">\n <div #dropdown class=\"slab-dropdown slab-dropdown-fixed\">\n @if (isOpened) {\n <div>\n <div #ngcontent (click)=\"ngContentStopPropagation($event)\">\n <ng-content></ng-content>\n </div>\n <ul #scrollableList class=\"slab-dropdown-scroll\" [ngClass]=\"{'slab-dropdown-overflow': overflow}\">\n @for (action of contextMenuOptions; track action.actionId) {\n <li class=\"d-flex align-items-center m-0\"\n [class.disabled]=\"!isEnabled(elementID, action.actionId) || action.isDivider\"\n (click)=\"doClickWithAction($event, elementID, action.actionId)\"\n (mouseover)=\"doMouseOver($event, elementID, action.actionId)\">\n @if (isEnabled(elementID, action.actionId)) {\n <div class=\"slab-flex-1\" style=\"flex:1 1 auto\">\n <systelab-context-menu-item class=\"d-flex align-items-center\" [action]=\"action\"\n [isEnabled]=\"isEnabled(elementID, action.actionId)\"\n [isIconEnabled]=\"isIconEnabled(elementID, action.actionId)\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"></systelab-context-menu-item>\n @if (action.hasChildren()) {\n <ul #childdropdownmenu id=\"{{action.actionId+elementID}}\"\n class=\"slab-dropdown dropdown-menu slab-dropdown-menu slab-dropdown-scroll slab-dropdown-absolute\">\n <systelab-context-menu-submenu-item [action]=\"action\"\n [actionName]=\"action.actionId\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"\n [contextMenuOriginal]=\"getSelfReference()\"\n [parentId]=\"elementID\"\n ></systelab-context-menu-submenu-item>\n </ul>\n }\n </div>\n }\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'datafilter',\n standalone: false\n})\n\nexport class DataFilterPipe implements PipeTransform {\n\n\tpublic transform(input: any[], searchString: string): any {\n\t\tconst result = [];\n\t\tif (!searchString) {\n\t\t\treturn input;\n\t\t}\n\n\t\tfor (const element of input) {\n\t\t\tif (element.displayName.toLowerCase()\n\t\t\t\t\t.indexOf(searchString.toLowerCase()) > -1) {\n\t\t\t\tresult.push(element);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n","export class TwoListItem {\n constructor(public displayName: string, public colId: string, public isSelected: boolean, public isVisible: boolean) {\n }\n}\n\nexport class CurrentSelectionStatus {\n constructor(public available: Array<TwoListItem>, public visible: Array<TwoListItem>) {\n }\n\n public selectAvailable(element: TwoListItem, filteredList: Array<TwoListItem>, isShiftKey: boolean, isControlKey: boolean): void {\n this.clear(this.visible);\n this.select(this.available, element, filteredList, isShiftKey, isControlKey);\n }\n\n public selectVisible(element: TwoListItem, filteredList: Array<TwoListItem>, isShiftKey: boolean, isControlKey: boolean): void {\n this.clear(this.available);\n this.select(this.visible, element, filteredList, isShiftKey, isControlKey);\n }\n\n public clearAll(): void {\n this.clear(this.available);\n this.clear(this.visible);\n }\n\n private select(\n selectedList: Array<TwoListItem>,\n element: TwoListItem,\n filteredList: Array<TwoListItem>,\n isShiftKey: boolean,\n isControlKey: boolean\n ): void {\n if (selectedList.length > 0 && isShiftKey) {\n this.selectRange(selectedList, element, filteredList);\n } else {\n this.selectSingle(selectedList, element, isControlKey);\n }\n }\n\n private selectRange(selectedList: Array<TwoListItem>, element: TwoListItem, filteredList: Array<TwoListItem>) {\n const indexOfLastSelected = filteredList.indexOf(selectedList[0]);\n const indexOfSelected = filteredList.indexOf(element);\n\n this.clear(selectedList);\n\n if (indexOfLastSelected < indexOfSelected) {\n for (let i = indexOfLastSelected; i <= indexOfSelected; i++) {\n filteredList[i].isSelected = true;\n selectedList.push(filteredList[i]);\n }\n } else {\n for (let i = indexOfLastSelected; i >= indexOfSelected; i--) {\n filteredList[i].isSelected = t