@solcre-org/core-ui 2.20.23 → 2.20.25

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.
@@ -49,7 +49,7 @@
49
49
  "logout": "Cerrar sesión",
50
50
  "users": "Usuarios",
51
51
  "clients": "Clientes",
52
- "administration": "Administración"
52
+ "administration": "Configuración"
53
53
  },
54
54
  "dialog": {
55
55
  "confirm": "Confirmar",
@@ -17674,12 +17674,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17674
17674
  // Este archivo es generado automáticamente por scripts/update-version.js
17675
17675
  // No edites manualmente este archivo
17676
17676
  const VERSION = {
17677
- full: '2.20.23',
17677
+ full: '2.20.25',
17678
17678
  major: 2,
17679
17679
  minor: 20,
17680
- patch: 23,
17681
- timestamp: '2026-02-13T16:34:08.285Z',
17682
- buildDate: '13/2/2026'
17680
+ patch: 25,
17681
+ timestamp: '2026-02-24T16:27:26.749Z',
17682
+ buildDate: '24/2/2026'
17683
17683
  };
17684
17684
 
17685
17685
  class MainNavComponent {
@@ -22794,6 +22794,438 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
22794
22794
  }, template: "@if (showHeader()) {\n<div class=\"c-bookings-header\">\n <button class=\"c-bookings-header__today\" (click)=\"onTodayClick()\">\n {{ todayLabel() }}\n </button>\n\n <div class=\"c-bookings-header__date\">\n <button class=\"c-bookings-header__date-arrow icon-arrow-left\"\n [title]=\"viewMode() === 'week' ? 'Semana anterior' : 'D\u00EDa anterior'\" (click)=\"onPrevious()\"></button>\n <span>{{ formattedDate() }}</span>\n <button class=\"c-bookings-header__date-arrow icon-arrow-right\"\n [title]=\"viewMode() === 'week' ? 'Semana siguiente' : 'D\u00EDa siguiente'\" (click)=\"onNext()\"></button>\n </div>\n\n <div class=\"c-bookings-header__view-toggle\">\n <button class=\"c-bookings-header__view-btn\" [class.is-active]=\"viewMode() === 'day'\" (click)=\"setViewMode('day')\">\n {{ dayLabel() }}\n </button>\n <button class=\"c-bookings-header__view-btn\" [class.is-active]=\"viewMode() === 'week'\" (click)=\"setViewMode('week')\">\n {{ weekLabel() }}\n </button>\n <button class=\"c-bookings-header__view-btn\" [class.is-active]=\"viewMode() === 'month'\"\n (click)=\"setViewMode('month')\">\n {{ monthLabel() }}\n </button>\n </div>\n</div>\n} @if (viewMode() === 'day') {\n<!-- DAILY VIEW -->\n<div class=\"c-bookings-grid__wrapper\" [style.--cols]=\"columns().length\"\n [style.--row-height-rem]=\"mergedConfig().rowHeightRem\" style=\"position: relative\">\n @if (isToday() && currentTimePosition() !== null) {\n <div class=\"c-bookings-grid__current-time-line\" [style.--time-position-rem]=\"currentTimePosition()\"></div>\n } @if (showTimeColumn()) {\n <div class=\"c-bookings-grid__times\">\n <div class=\"c-bookings-grid__top\">\n <div class=\"c-bookings-grid__title\">{{ timeColumnLabel() }}</div>\n </div>\n\n @for (slot of timeSlots(); track slot.time) {\n <div class=\"c-bookings-grid__row\">\n @if (slot.displayTime) {\n <span class=\"c-bookings-grid__time\">{{ slot.time }}</span>\n }\n </div>\n }\n </div>\n } @for (column of columns(); track column.id) {\n <div class=\"c-bookings-grid__col\">\n <div class=\"c-bookings-grid__top\">\n <p class=\"c-bookings-grid__title\">{{ column.name }}</p>\n </div>\n\n @for (slot of timeSlots(); track slot.time) {\n <div class=\"c-bookings-grid__row\">\n @if (!isSlotOccupied(column.id, slot) && !mergedConfig().emptySlotEventsDisabled) {\n @if (isSlotDisabled(column.id, slot)) {\n <button class=\"c-bookings-grid__slot c-bookings-grid__slot--disabled\" disabled [title]=\"disabledSlotLabel()\">\n {{ disabledSlotLabel() }}\n </button>\n } @else {\n <button class=\"c-bookings-grid__slot\" [title]=\"emptySlotLabel()\" (click)=\"onSlotClick(column.id, slot)\">\n {{ emptySlotLabel() }}\n </button>\n }\n } @if (shouldShowEvent(column.id, slot)) { @let event =\n getEventForSlot(column.id, slot); @if (event) {\n <div [class]=\"getEventClasses(event)\" [attr.data-type]=\"event.type\" [attr.data-status]=\"event.status\"\n [style.--rows]=\"getEventRowSpan(event)\" (mouseenter)=\"onEventHover($event, event)\" (mouseleave)=\"onEventLeave()\"\n (click)=\"onEventClick(event, column)\">\n <p class=\"c-bookings-grid__title\">\n {{ event.title }}\n </p>\n <p class=\"c-bookings-grid__text\">\n {{ event.startTime }} - {{ event.endTime }}\n </p>\n @if (event.subtitle) {\n <p class=\"c-bookings-grid__text\">\n {{ event.subtitle }}\n </p>\n }\n\n @if (event.canCancel) {\n <button class=\"c-bookings-grid__link c-link--underlined\"\n (click)=\"$event.stopPropagation(); onCancelClick(event, column)\">\n <span class=\"icon-cross-thin\"></span>\n Cancelar\n </button>\n } @if (event.canApprove || event.canReject) {\n <div class=\"c-bookings-grid__quick-actions\">\n @if (event.canApprove) {\n <button class=\"c-icon-btn--fill context:success icon-check\" title=\"Aprobar\"\n [style.width.rem]=\"event.canApproveHeightRem\" [style.height.rem]=\"event.canApproveHeightRem\"\n (click)=\"$event.stopPropagation(); onApproveClick(event, column)\"></button>\n } @if (event.canReject) {\n <button class=\"c-icon-btn--fill context:error icon-cross\" title=\"Rechazar\"\n [style.width.rem]=\"event.canRejectHeightRem\" [style.height.rem]=\"event.canRejectHeightRem\"\n (click)=\"$event.stopPropagation(); onRejectClick(event, column)\"></button>\n }\n </div>\n }\n </div>\n } }\n </div>\n }\n </div>\n }\n</div>\n} @else if (viewMode() === 'week') {\n<!-- WEEKLY VIEW -->\n<div class=\"c-bookings-grid__wrapper c-bookings-grid__wrapper--weekly\" [style.--cols]=\"7\"\n [style.--row-height-rem]=\"mergedConfig().rowHeightRem\" style=\"position: relative\">\n @if (currentTimePosition() !== null && currentTimeDayIndex() >= 0) {\n <div class=\"c-bookings-grid__current-time-line c-bookings-grid__current-time-line--weekly\"\n [style.--time-position-rem]=\"currentTimePosition()\" [style.--day-index]=\"currentTimeDayIndex()\"></div>\n } @if (showTimeColumn()) {\n <div class=\"c-bookings-grid__times\">\n <div class=\"c-bookings-grid__top c-bookings-grid__top--weekly\">\n <div class=\"c-bookings-grid__title\">{{ timeColumnLabel() }}</div>\n </div>\n\n @for (slot of timeSlots(); track slot.time) {\n <div class=\"c-bookings-grid__row\">\n @if (slot.displayTime) {\n <span class=\"c-bookings-grid__time\">{{ slot.time }}</span>\n }\n </div>\n }\n </div>\n } @for (day of weekDays(); track day.date.getTime()) {\n <div class=\"c-bookings-grid__col\" [class.c-bookings-grid__col--weekend]=\"day.isWeekend\">\n <div class=\"c-bookings-grid__top c-bookings-grid__top--weekly\">\n <div class=\"c-bookings-grid__day-header\" [class.is-today]=\"day.isToday\">\n <span class=\"c-bookings-grid__day-name\">{{ day.dayName }}</span>\n <span class=\"c-bookings-grid__day-number\" [class.is-today]=\"day.isToday\">{{ day.dayNumber }}</span>\n </div>\n </div>\n\n @for (slot of timeSlots(); track slot.time) {\n <div class=\"c-bookings-grid__row\">\n @if (!isSlotOccupiedForDay(day.date, slot)) { @if\n (isSlotDisabledForDay(day.date, slot)) {\n <button class=\"c-bookings-grid__slot c-bookings-grid__slot--disabled\" disabled\n [title]=\"disabledSlotLabel()\"></button>\n } @else {\n <button class=\"c-bookings-grid__slot\" [title]=\"emptySlotLabel()\"\n (click)=\"onWeekSlotClick(day.date, slot)\"></button>\n } } @if (shouldShowEventForDay(day.date, slot)) { @let event =\n getEventForDaySlot(day.date, slot); @if (event) {\n <div [class]=\"getEventClasses(event)\" [attr.data-type]=\"event.type\" [attr.data-status]=\"event.status\"\n [style.--rows]=\"getEventRowSpan(event)\" (mouseenter)=\"onEventHover($event, event)\" (mouseleave)=\"onEventLeave()\"\n (click)=\"onWeekEventClick(event, day.date)\">\n <p class=\"c-bookings-grid__title\">\n {{ event.subtitle || event.title }}\n </p>\n <p class=\"c-bookings-grid__text\">\n {{ event.startTime }} - {{ event.endTime }}\n </p>\n </div>\n } }\n </div>\n }\n </div>\n }\n</div>\n} @else if (viewMode() === 'month') {\n<!-- MONTHLY VIEW -->\n<div class=\"c-bookings-grid__wrapper c-bookings-grid__wrapper--monthly\">\n <!-- Header Row -->\n <div class=\"c-bookings-grid__header-row\">\n @for (day of monthDays().slice(0, 7); track day.dayName) {\n <div class=\"c-bookings-grid__header-cell\">\n {{ day.dayName }}\n </div>\n }\n </div>\n\n <!-- Days Grid -->\n <div class=\"c-bookings-grid__month-grid\">\n @for (day of monthDays(); track day.date.getTime()) {\n <div class=\"c-bookings-grid__month-cell\" [class.is-today]=\"day.isToday\" [class.is-weekend]=\"day.isWeekend\"\n [class.is-other-month]=\"\n day.date.getUTCMonth() !== selectedDate().getUTCMonth()\n \" [class.is-disabled]=\"isDayDisabled(day.date)\" (click)=\"!isDayDisabled(day.date) && onMonthDayClick(day.date)\">\n <div class=\"c-bookings-grid__month-day-number\">\n {{ day.dayNumber }}\n </div>\n\n <div class=\"c-bookings-grid__month-events\">\n @let dayEvents = getEventsForDay(day.date); @for (event of\n dayEvents.slice(0, 3); track event.id) {\n <div class=\"c-bookings-grid__month-event\" [attr.data-type]=\"event.type\" [attr.data-status]=\"event.status\"\n [style.background-color]=\"event.metadata?.['color']\"\n [style.border-left]=\"event.metadata?.['color'] ? '3px solid ' + event.metadata?.['color'] : ''\"\n (click)=\"$event.stopPropagation(); onMonthEventClick(event, day.date)\">\n <span class=\"c-bookings-grid__month-event-title\">{{\n event.title\n }}</span>\n </div>\n } @if (dayEvents.length > 3) {\n <div class=\"c-bookings-grid__more-events\" (click)=\"openDayPopover(day.date, $event)\">\n {{ dayEvents.length - 3 }} m\u00E1s\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n @if (expandedDay()) {\n <div class=\"c-bookings-grid__popover-overlay\" (click)=\"closeDayPopover()\">\n <div class=\"c-bookings-grid__popover\" (click)=\"$event.stopPropagation()\">\n <div class=\"c-bookings-grid__popover-header\">\n <div class=\"c-bookings-grid__popover-date\">\n <span class=\"c-bookings-grid__popover-weekday\">{{\n expandedDay() | date : \"EEE\" : \"UTC\" : locale() | uppercase\n }}</span>\n <span class=\"c-bookings-grid__popover-daynum\">{{\n expandedDay() | date : \"d\" : \"UTC\"\n }}</span>\n </div>\n <button class=\"c-bookings-grid__popover-close\" (click)=\"closeDayPopover()\">\n <span class=\"icon-cross\"></span>\n </button>\n </div>\n <div class=\"c-bookings-grid__popover-content\">\n @for (event of getExpandedDayEvents(); track event.id) {\n <div class=\"c-bookings-grid__month-event c-bookings-grid__month-event--popover\" [attr.data-type]=\"event.type\"\n [attr.data-status]=\"event.status\" [style.background-color]=\"event.metadata?.['color']\"\n [style.border-left]=\"event.metadata?.['color'] ? '3px solid ' + event.metadata?.['color'] : ''\"\n (click)=\"onMonthEventClick(event, expandedDay()!)\">\n <span class=\"c-bookings-grid__month-event-title\">{{\n event.title\n }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n}", styles: [":host{display:block;width:100%;overflow:visible}.c-bookings-grid__month-cell.is-disabled{background-color:#f3f4f6;cursor:not-allowed;opacity:.7}.c-bookings-grid__month-cell.is-disabled:hover{background-color:#f3f4f6}.c-bookings-grid__month-cell.is-disabled .c-bookings-grid__month-day-number{color:#9ca3af}.c-bookings-grid__slot--disabled{background-color:#f3f4f6;cursor:not-allowed}.c-bookings-grid__slot--disabled:hover{background-color:#f3f4f6}.c-bookings-grid__row{height:calc(var(--row-height-rem, 4) * 1rem)}\n"] }]
22795
22795
  }] });
22796
22796
 
22797
+ class TreeService {
22798
+ setExpandedState(nodes, expanded) {
22799
+ return nodes.map(node => {
22800
+ if (node.children && node.children.length > 0) {
22801
+ return {
22802
+ ...node,
22803
+ isExpanded: expanded,
22804
+ children: this.setExpandedState(node.children, expanded)
22805
+ };
22806
+ }
22807
+ return node;
22808
+ });
22809
+ }
22810
+ findNodeById(nodes, id) {
22811
+ for (const node of nodes) {
22812
+ if (node.id === id)
22813
+ return node;
22814
+ if (node.children) {
22815
+ const found = this.findNodeById(node.children, id);
22816
+ if (found)
22817
+ return found;
22818
+ }
22819
+ }
22820
+ return null;
22821
+ }
22822
+ findParent(nodes, childId) {
22823
+ for (const node of nodes) {
22824
+ if (node.children?.some(c => c.id === childId)) {
22825
+ return node;
22826
+ }
22827
+ if (node.children) {
22828
+ const found = this.findParent(node.children, childId);
22829
+ if (found)
22830
+ return found;
22831
+ }
22832
+ }
22833
+ return null;
22834
+ }
22835
+ removeNode(nodes, nodeId) {
22836
+ return nodes
22837
+ .filter(n => n.id !== nodeId)
22838
+ .map(n => ({
22839
+ ...n,
22840
+ children: n.children ? this.removeNode(n.children, nodeId) : undefined
22841
+ }));
22842
+ }
22843
+ insertNode(nodes, nodeToInsert, targetId, position) {
22844
+ if (position === 'inside') {
22845
+ return nodes.map(n => {
22846
+ if (n.id === targetId) {
22847
+ return {
22848
+ ...n,
22849
+ children: [...(n.children || []), nodeToInsert],
22850
+ isExpanded: true
22851
+ };
22852
+ }
22853
+ return {
22854
+ ...n,
22855
+ children: n.children ? this.insertNode(n.children, nodeToInsert, targetId, position) : undefined
22856
+ };
22857
+ });
22858
+ }
22859
+ const result = [];
22860
+ for (const n of nodes) {
22861
+ if (n.id === targetId) {
22862
+ if (position === 'before') {
22863
+ result.push(nodeToInsert, n);
22864
+ }
22865
+ else {
22866
+ result.push(n, nodeToInsert);
22867
+ }
22868
+ }
22869
+ else {
22870
+ result.push({
22871
+ ...n,
22872
+ children: n.children ? this.insertNode(n.children, nodeToInsert, targetId, position) : undefined
22873
+ });
22874
+ }
22875
+ }
22876
+ return result;
22877
+ }
22878
+ getNodeDepth(nodes, nodeId, currentDepth = 0) {
22879
+ for (const node of nodes) {
22880
+ if (node.id === nodeId)
22881
+ return currentDepth;
22882
+ if (node.children) {
22883
+ const depth = this.getNodeDepth(node.children, nodeId, currentDepth + 1);
22884
+ if (depth >= 0)
22885
+ return depth;
22886
+ }
22887
+ }
22888
+ return -1;
22889
+ }
22890
+ getTotalNodeCount(nodes) {
22891
+ let count = 0;
22892
+ for (const node of nodes) {
22893
+ count++;
22894
+ if (node.children) {
22895
+ count += this.getTotalNodeCount(node.children);
22896
+ }
22897
+ }
22898
+ return count;
22899
+ }
22900
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
22901
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeService, providedIn: 'root' });
22902
+ }
22903
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeService, decorators: [{
22904
+ type: Injectable,
22905
+ args: [{
22906
+ providedIn: 'root'
22907
+ }]
22908
+ }] });
22909
+
22910
+ class TreeNodeComponent {
22911
+ node = input.required();
22912
+ level = input(0);
22913
+ config = input({});
22914
+ nodeTemplate = input(undefined);
22915
+ isDragOver = false;
22916
+ dropPosition = null;
22917
+ expanded = signal(false);
22918
+ constructor() {
22919
+ effect(() => {
22920
+ this.expanded.set(this.node().isExpanded ?? false);
22921
+ });
22922
+ }
22923
+ nodeToggled = output();
22924
+ nodeClicked = output();
22925
+ actionTriggered = output();
22926
+ nodeDragStart = output();
22927
+ nodeDragOver = output();
22928
+ nodeDrop = output();
22929
+ nodeDragEnd = output();
22930
+ hasChildren = computed(() => {
22931
+ return (this.node().children?.length ?? 0) > 0;
22932
+ });
22933
+ resolvedIcon = computed(() => {
22934
+ const n = this.node();
22935
+ const isExpanded = this.expanded();
22936
+ if (n.icon)
22937
+ return n.icon;
22938
+ const resolver = this.config().iconResolver;
22939
+ if (resolver)
22940
+ return resolver({ ...n, isExpanded }, this.level());
22941
+ if (this.hasChildren()) {
22942
+ return isExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder';
22943
+ }
22944
+ return 'fa-solid fa-file';
22945
+ });
22946
+ isAnimationsEnabled = computed(() => {
22947
+ return this.config().enableAnimations !== false;
22948
+ });
22949
+ isDragDropEnabled = computed(() => {
22950
+ return this.config().enableDragDrop === true;
22951
+ });
22952
+ visibleActions = computed(() => {
22953
+ const configActions = this.config().actions || [];
22954
+ const nodeActions = this.node().actions || [];
22955
+ const merged = [...configActions];
22956
+ for (const nodeAction of nodeActions) {
22957
+ const existingIndex = merged.findIndex(a => a.key === nodeAction.key);
22958
+ if (existingIndex >= 0) {
22959
+ merged[existingIndex] = nodeAction;
22960
+ }
22961
+ else {
22962
+ merged.push(nodeAction);
22963
+ }
22964
+ }
22965
+ const n = this.node();
22966
+ return merged.filter(action => {
22967
+ if (action.shouldShow) {
22968
+ return action.shouldShow(n);
22969
+ }
22970
+ return true;
22971
+ });
22972
+ });
22973
+ nodeClasses = computed(() => {
22974
+ const classes = ['c-tree-node'];
22975
+ if (this.node().customClass) {
22976
+ classes.push(this.node().customClass);
22977
+ }
22978
+ return classes.join(' ');
22979
+ });
22980
+ getActionButtonConfig(action) {
22981
+ const disabled = this.isActionDisabled(action);
22982
+ if (action.buttonConfig) {
22983
+ return {
22984
+ type: action.buttonConfig.type || ButtonType.ICON,
22985
+ icon: action.buttonConfig.icon || action.icon || '',
22986
+ ariaLabel: action.tooltip || action.label || action.key,
22987
+ customClass: action.class || '',
22988
+ disabled,
22989
+ ...action.buttonConfig
22990
+ };
22991
+ }
22992
+ return {
22993
+ type: ButtonType.ICON,
22994
+ icon: action.icon || '',
22995
+ ariaLabel: action.tooltip || action.label || action.key,
22996
+ customClass: action.class || '',
22997
+ disabled
22998
+ };
22999
+ }
23000
+ isActionDisabled(action) {
23001
+ if (action.shouldDisable) {
23002
+ return action.shouldDisable(this.node());
23003
+ }
23004
+ return false;
23005
+ }
23006
+ toggle() {
23007
+ const currentNode = this.node();
23008
+ if (this.hasChildren()) {
23009
+ const newValue = !this.expanded();
23010
+ currentNode.isExpanded = newValue;
23011
+ this.expanded.set(newValue);
23012
+ this.nodeToggled.emit(currentNode);
23013
+ }
23014
+ }
23015
+ onNodeClick() {
23016
+ if (this.config().expandOnClick && this.hasChildren()) {
23017
+ this.toggle();
23018
+ }
23019
+ this.nodeClicked.emit(this.node());
23020
+ }
23021
+ onActionClick(action, event) {
23022
+ event.originalEvent.stopPropagation();
23023
+ if (!this.isActionDisabled(action)) {
23024
+ action.callback(this.node());
23025
+ this.actionTriggered.emit({ action, node: this.node() });
23026
+ }
23027
+ }
23028
+ onDragStart(event) {
23029
+ if (!this.isDragDropEnabled())
23030
+ return;
23031
+ const n = this.node();
23032
+ if (n.draggable === false) {
23033
+ event.preventDefault();
23034
+ return;
23035
+ }
23036
+ event.dataTransfer?.setData('text/plain', String(n.id));
23037
+ event.stopPropagation();
23038
+ this.nodeDragStart.emit({ event, node: n });
23039
+ }
23040
+ onDragOver(event) {
23041
+ if (!this.isDragDropEnabled())
23042
+ return;
23043
+ const n = this.node();
23044
+ if (n.droppable === false)
23045
+ return;
23046
+ event.preventDefault();
23047
+ event.stopPropagation();
23048
+ const rect = event.currentTarget.getBoundingClientRect();
23049
+ const y = event.clientY - rect.top;
23050
+ const height = rect.height;
23051
+ let position;
23052
+ if (y < height * 0.25) {
23053
+ position = 'before';
23054
+ }
23055
+ else if (y > height * 0.75) {
23056
+ position = 'after';
23057
+ }
23058
+ else {
23059
+ position = 'inside';
23060
+ }
23061
+ this.isDragOver = true;
23062
+ this.dropPosition = position;
23063
+ this.nodeDragOver.emit({ event, node: n, position });
23064
+ }
23065
+ onDragLeave(event) {
23066
+ this.isDragOver = false;
23067
+ this.dropPosition = null;
23068
+ }
23069
+ onDrop(event) {
23070
+ if (!this.isDragDropEnabled())
23071
+ return;
23072
+ event.preventDefault();
23073
+ event.stopPropagation();
23074
+ const position = this.dropPosition || 'inside';
23075
+ this.isDragOver = false;
23076
+ this.dropPosition = null;
23077
+ this.nodeDrop.emit({ event, node: this.node(), position });
23078
+ }
23079
+ onDragEnd(event) {
23080
+ this.isDragOver = false;
23081
+ this.dropPosition = null;
23082
+ this.nodeDragEnd.emit({ event });
23083
+ }
23084
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23085
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: TreeNodeComponent, isStandalone: true, selector: "core-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeToggled: "nodeToggled", nodeClicked: "nodeClicked", actionTriggered: "actionTriggered", nodeDragStart: "nodeDragStart", nodeDragOver: "nodeDragOver", nodeDrop: "nodeDrop", nodeDragEnd: "nodeDragEnd" }, ngImport: i0, template: "<li\n [class]=\"nodeClasses()\"\n [attr.data-level]=\"level()\"\n [attr.data-node-id]=\"node().id\"\n [attr.draggable]=\"isDragDropEnabled() && node().draggable !== false\"\n (dragstart)=\"onDragStart($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n (dragend)=\"onDragEnd($event)\"\n [class.is-drag-over]=\"isDragOver\"\n [class.drop-before]=\"dropPosition === 'before'\"\n [class.drop-after]=\"dropPosition === 'after'\"\n [class.drop-inside]=\"dropPosition === 'inside'\"\n>\n <div class=\"c-tree-node__row\">\n <!-- Expand/Collapse toggle -->\n <button\n type=\"button\"\n class=\"c-tree-node__toggle\"\n [class.is-expanded]=\"expanded()\"\n [class.is-leaf]=\"!hasChildren()\"\n [disabled]=\"!hasChildren()\"\n (click)=\"toggle()\"\n >\n @if (hasChildren()) {\n <span class=\"c-tree-node__toggle-icon fa-solid fa-chevron-right\"></span>\n }\n </button>\n\n <!-- Node icon (dynamic) -->\n <span class=\"c-tree-node__icon\" [ngClass]=\"resolvedIcon()\"></span>\n\n <!-- Node content -->\n @if (nodeTemplate()) {\n <div class=\"c-tree-node__content\" (click)=\"onNodeClick()\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeTemplate()!;\n context: { $implicit: node(), level: level() }\n \"\n >\n </ng-container>\n </div>\n } @else {\n <div class=\"c-tree-node__content\" (click)=\"onNodeClick()\">\n <span class=\"c-tree-node__label\">{{ node().label }}</span>\n </div>\n }\n\n <!-- Node actions (custom actions like generic-table) -->\n @if (visibleActions().length > 0) {\n <div class=\"c-tree-node__actions\">\n @for (action of visibleActions(); track action.key) {\n <core-generic-button\n [config]=\"getActionButtonConfig(action)\"\n (buttonClick)=\"onActionClick(action, $event)\"\n >\n </core-generic-button>\n }\n </div>\n }\n </div>\n\n <!-- Children (recursive) -->\n @if (hasChildren()) {\n <ul\n class=\"c-tree-node__children\"\n [class.is-expanded]=\"expanded()\"\n [class.is-animated]=\"isAnimationsEnabled()\"\n >\n @for (child of node().children; track child.id) {\n <core-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [config]=\"config()\"\n [nodeTemplate]=\"nodeTemplate()\"\n (nodeToggled)=\"nodeToggled.emit($event)\"\n (nodeClicked)=\"nodeClicked.emit($event)\"\n (actionTriggered)=\"actionTriggered.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (nodeDragOver)=\"nodeDragOver.emit($event)\"\n (nodeDrop)=\"nodeDrop.emit($event)\"\n (nodeDragEnd)=\"nodeDragEnd.emit($event)\"\n />\n }\n </ul>\n }\n</li>\n", styles: ["@charset \"UTF-8\";:host{display:block}.c-tree-node{list-style:none;position:relative;margin:0}.c-tree-node__row{display:flex;align-items:center;gap:.875rem;padding:1rem 1.5rem;padding-left:calc(1.5rem + var(--tree-level, 0) * 2rem);border-bottom:1px solid var(--color-neutral-200, #e5e7eb);transition:background-color .15s ease;min-height:3.75rem;background:var(--color-white, #fff);cursor:default}.c-tree-node__row:hover{background-color:var(--color-neutral-50, #f9fafb)}.c-tree-node__row:hover .c-tree-node__actions{opacity:1;pointer-events:auto}.c-tree-node[data-level=\"0\"]>.c-tree-node__row{--tree-level: 0}.c-tree-node[data-level=\"1\"]>.c-tree-node__row{--tree-level: 1}.c-tree-node[data-level=\"2\"]>.c-tree-node__row{--tree-level: 2}.c-tree-node[data-level=\"3\"]>.c-tree-node__row{--tree-level: 3}.c-tree-node[data-level=\"4\"]>.c-tree-node__row{--tree-level: 4}.c-tree-node[data-level=\"5\"]>.c-tree-node__row{--tree-level: 5}.c-tree-node[data-level=\"6\"]>.c-tree-node__row{--tree-level: 6}.c-tree-node[data-level=\"1\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node[data-level=\"3\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node[data-level=\"5\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node__toggle{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;padding:0;background:transparent;border:none;cursor:pointer;color:var(--color-neutral-500, #6b7280);flex-shrink:0;border-radius:.25rem;transition:background-color .15s ease,color .15s ease}.c-tree-node__toggle:hover:not(:disabled){background-color:var(--color-neutral-100, #f3f4f6);color:var(--color-neutral-700, #374151)}.c-tree-node__toggle:disabled{cursor:default;opacity:0}.c-tree-node__toggle-icon{font-size:.7em;transition:transform .25s cubic-bezier(.4,0,.2,1)}.c-tree-node__toggle.is-expanded .c-tree-node__toggle-icon{transform:rotate(90deg)}.c-tree-node__icon{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;font-size:var(--fz-100);color:var(--color-primary, #3b82f6);flex-shrink:0;transition:color .15s ease,transform .15s ease}.c-tree-node__row:hover .c-tree-node__icon{color:var(--color-primary-dark, #2563eb)}.c-tree-node__content{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0;cursor:pointer;-webkit-user-select:none;user-select:none}.c-tree-node__label{font-weight:600;color:var(--color-neutral-800, #1f2937);font-size:var(--fz-100);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-tree-node[data-level=\"1\"] .c-tree-node__label,.c-tree-node[data-level=\"2\"] .c-tree-node__label,.c-tree-node[data-level=\"3\"] .c-tree-node__label,.c-tree-node[data-level=\"4\"] .c-tree-node__label,.c-tree-node[data-level=\"5\"] .c-tree-node__label,.c-tree-node[data-level=\"6\"] .c-tree-node__label{font-weight:500;font-size:var(--fz-100);color:var(--color-neutral-700, #374151)}.c-tree-node__actions{display:flex;align-items:center;gap:.375rem;margin-left:auto;flex-shrink:0;opacity:0;pointer-events:none;transition:opacity .2s ease;padding-left:.5rem}.c-tree-node__children{list-style:none;padding:0;margin:0;overflow:hidden;max-height:0;opacity:0}.c-tree-node__children.is-expanded{max-height:none;opacity:1}.c-tree-node__children.is-animated{transition:max-height .3s cubic-bezier(.4,0,.2,1),opacity .2s ease .05s}.c-tree-node__children.is-animated.is-expanded{transition:max-height .3s cubic-bezier(.4,0,.2,1),opacity .2s ease}.c-tree-node[draggable=true]{cursor:grab}.c-tree-node[draggable=true]:active{cursor:grabbing}.c-tree-node.is-drag-over .c-tree-node__row{background-color:var(--color-primary-50, #eff6ff)}.c-tree-node.drop-before:before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;background:var(--color-primary, #3b82f6);z-index:1;animation:dropIndicatorFadeIn .15s ease forwards}.c-tree-node.drop-after:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--color-primary, #3b82f6);z-index:1;animation:dropIndicatorFadeIn .15s ease forwards}.c-tree-node.drop-inside>.c-tree-node__row{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px;border-radius:.25rem}@keyframes dropIndicatorFadeIn{0%{opacity:0;transform:scaleX(.8)}to{opacity:1;transform:scaleX(1)}}:host-context(.c-tree--connectors) .c-tree-node:not([data-level=\"0\"]):before{content:\"\";position:absolute;left:calc(1.25rem + (var(--tree-level, 0) - 1) * 2rem + .75rem);top:0;bottom:0;width:1px;background:linear-gradient(to bottom,transparent 0%,var(--color-neutral-300, #d1d5db) 15%,var(--color-neutral-300, #d1d5db) 85%,transparent 100%);opacity:.5}\n"], dependencies: [{ kind: "component", type: TreeNodeComponent, selector: "core-tree-node", inputs: ["node", "level", "config", "nodeTemplate"], outputs: ["nodeToggled", "nodeClicked", "actionTriggered", "nodeDragStart", "nodeDragOver", "nodeDrop", "nodeDragEnd"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: GenericButtonComponent, selector: "core-generic-button", inputs: ["config", "data"], outputs: ["buttonClick"] }] });
23086
+ }
23087
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeNodeComponent, decorators: [{
23088
+ type: Component,
23089
+ args: [{ selector: 'core-tree-node', standalone: true, imports: [CommonModule, TranslateModule, GenericButtonComponent], template: "<li\n [class]=\"nodeClasses()\"\n [attr.data-level]=\"level()\"\n [attr.data-node-id]=\"node().id\"\n [attr.draggable]=\"isDragDropEnabled() && node().draggable !== false\"\n (dragstart)=\"onDragStart($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n (dragend)=\"onDragEnd($event)\"\n [class.is-drag-over]=\"isDragOver\"\n [class.drop-before]=\"dropPosition === 'before'\"\n [class.drop-after]=\"dropPosition === 'after'\"\n [class.drop-inside]=\"dropPosition === 'inside'\"\n>\n <div class=\"c-tree-node__row\">\n <!-- Expand/Collapse toggle -->\n <button\n type=\"button\"\n class=\"c-tree-node__toggle\"\n [class.is-expanded]=\"expanded()\"\n [class.is-leaf]=\"!hasChildren()\"\n [disabled]=\"!hasChildren()\"\n (click)=\"toggle()\"\n >\n @if (hasChildren()) {\n <span class=\"c-tree-node__toggle-icon fa-solid fa-chevron-right\"></span>\n }\n </button>\n\n <!-- Node icon (dynamic) -->\n <span class=\"c-tree-node__icon\" [ngClass]=\"resolvedIcon()\"></span>\n\n <!-- Node content -->\n @if (nodeTemplate()) {\n <div class=\"c-tree-node__content\" (click)=\"onNodeClick()\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeTemplate()!;\n context: { $implicit: node(), level: level() }\n \"\n >\n </ng-container>\n </div>\n } @else {\n <div class=\"c-tree-node__content\" (click)=\"onNodeClick()\">\n <span class=\"c-tree-node__label\">{{ node().label }}</span>\n </div>\n }\n\n <!-- Node actions (custom actions like generic-table) -->\n @if (visibleActions().length > 0) {\n <div class=\"c-tree-node__actions\">\n @for (action of visibleActions(); track action.key) {\n <core-generic-button\n [config]=\"getActionButtonConfig(action)\"\n (buttonClick)=\"onActionClick(action, $event)\"\n >\n </core-generic-button>\n }\n </div>\n }\n </div>\n\n <!-- Children (recursive) -->\n @if (hasChildren()) {\n <ul\n class=\"c-tree-node__children\"\n [class.is-expanded]=\"expanded()\"\n [class.is-animated]=\"isAnimationsEnabled()\"\n >\n @for (child of node().children; track child.id) {\n <core-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [config]=\"config()\"\n [nodeTemplate]=\"nodeTemplate()\"\n (nodeToggled)=\"nodeToggled.emit($event)\"\n (nodeClicked)=\"nodeClicked.emit($event)\"\n (actionTriggered)=\"actionTriggered.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (nodeDragOver)=\"nodeDragOver.emit($event)\"\n (nodeDrop)=\"nodeDrop.emit($event)\"\n (nodeDragEnd)=\"nodeDragEnd.emit($event)\"\n />\n }\n </ul>\n }\n</li>\n", styles: ["@charset \"UTF-8\";:host{display:block}.c-tree-node{list-style:none;position:relative;margin:0}.c-tree-node__row{display:flex;align-items:center;gap:.875rem;padding:1rem 1.5rem;padding-left:calc(1.5rem + var(--tree-level, 0) * 2rem);border-bottom:1px solid var(--color-neutral-200, #e5e7eb);transition:background-color .15s ease;min-height:3.75rem;background:var(--color-white, #fff);cursor:default}.c-tree-node__row:hover{background-color:var(--color-neutral-50, #f9fafb)}.c-tree-node__row:hover .c-tree-node__actions{opacity:1;pointer-events:auto}.c-tree-node[data-level=\"0\"]>.c-tree-node__row{--tree-level: 0}.c-tree-node[data-level=\"1\"]>.c-tree-node__row{--tree-level: 1}.c-tree-node[data-level=\"2\"]>.c-tree-node__row{--tree-level: 2}.c-tree-node[data-level=\"3\"]>.c-tree-node__row{--tree-level: 3}.c-tree-node[data-level=\"4\"]>.c-tree-node__row{--tree-level: 4}.c-tree-node[data-level=\"5\"]>.c-tree-node__row{--tree-level: 5}.c-tree-node[data-level=\"6\"]>.c-tree-node__row{--tree-level: 6}.c-tree-node[data-level=\"1\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node[data-level=\"3\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node[data-level=\"5\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node__toggle{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;padding:0;background:transparent;border:none;cursor:pointer;color:var(--color-neutral-500, #6b7280);flex-shrink:0;border-radius:.25rem;transition:background-color .15s ease,color .15s ease}.c-tree-node__toggle:hover:not(:disabled){background-color:var(--color-neutral-100, #f3f4f6);color:var(--color-neutral-700, #374151)}.c-tree-node__toggle:disabled{cursor:default;opacity:0}.c-tree-node__toggle-icon{font-size:.7em;transition:transform .25s cubic-bezier(.4,0,.2,1)}.c-tree-node__toggle.is-expanded .c-tree-node__toggle-icon{transform:rotate(90deg)}.c-tree-node__icon{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;font-size:var(--fz-100);color:var(--color-primary, #3b82f6);flex-shrink:0;transition:color .15s ease,transform .15s ease}.c-tree-node__row:hover .c-tree-node__icon{color:var(--color-primary-dark, #2563eb)}.c-tree-node__content{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0;cursor:pointer;-webkit-user-select:none;user-select:none}.c-tree-node__label{font-weight:600;color:var(--color-neutral-800, #1f2937);font-size:var(--fz-100);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-tree-node[data-level=\"1\"] .c-tree-node__label,.c-tree-node[data-level=\"2\"] .c-tree-node__label,.c-tree-node[data-level=\"3\"] .c-tree-node__label,.c-tree-node[data-level=\"4\"] .c-tree-node__label,.c-tree-node[data-level=\"5\"] .c-tree-node__label,.c-tree-node[data-level=\"6\"] .c-tree-node__label{font-weight:500;font-size:var(--fz-100);color:var(--color-neutral-700, #374151)}.c-tree-node__actions{display:flex;align-items:center;gap:.375rem;margin-left:auto;flex-shrink:0;opacity:0;pointer-events:none;transition:opacity .2s ease;padding-left:.5rem}.c-tree-node__children{list-style:none;padding:0;margin:0;overflow:hidden;max-height:0;opacity:0}.c-tree-node__children.is-expanded{max-height:none;opacity:1}.c-tree-node__children.is-animated{transition:max-height .3s cubic-bezier(.4,0,.2,1),opacity .2s ease .05s}.c-tree-node__children.is-animated.is-expanded{transition:max-height .3s cubic-bezier(.4,0,.2,1),opacity .2s ease}.c-tree-node[draggable=true]{cursor:grab}.c-tree-node[draggable=true]:active{cursor:grabbing}.c-tree-node.is-drag-over .c-tree-node__row{background-color:var(--color-primary-50, #eff6ff)}.c-tree-node.drop-before:before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;background:var(--color-primary, #3b82f6);z-index:1;animation:dropIndicatorFadeIn .15s ease forwards}.c-tree-node.drop-after:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--color-primary, #3b82f6);z-index:1;animation:dropIndicatorFadeIn .15s ease forwards}.c-tree-node.drop-inside>.c-tree-node__row{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px;border-radius:.25rem}@keyframes dropIndicatorFadeIn{0%{opacity:0;transform:scaleX(.8)}to{opacity:1;transform:scaleX(1)}}:host-context(.c-tree--connectors) .c-tree-node:not([data-level=\"0\"]):before{content:\"\";position:absolute;left:calc(1.25rem + (var(--tree-level, 0) - 1) * 2rem + .75rem);top:0;bottom:0;width:1px;background:linear-gradient(to bottom,transparent 0%,var(--color-neutral-300, #d1d5db) 15%,var(--color-neutral-300, #d1d5db) 85%,transparent 100%);opacity:.5}\n"] }]
23090
+ }], ctorParameters: () => [] });
23091
+
23092
+ class GenericTreeComponent {
23093
+ treeService = inject(TreeService);
23094
+ customNodeTemplate;
23095
+ nodes = input.required();
23096
+ config = input({});
23097
+ customClass = input('');
23098
+ emptyMessage = input('common.no_results');
23099
+ emptyIcon = input('fa-solid fa-folder-open');
23100
+ nodeToggled = output();
23101
+ nodeClicked = output();
23102
+ actionTriggered = output();
23103
+ nodeDrop = output();
23104
+ nodesChanged = output();
23105
+ isAllExpanded = signal(false);
23106
+ draggedNodeId = signal(null);
23107
+ _expansionInitialized = signal(false);
23108
+ constructor() {
23109
+ effect(() => {
23110
+ const currentNodes = this.nodes();
23111
+ const expandByDefault = this.mergedConfig().expandAllByDefault;
23112
+ if (currentNodes.length > 0 && expandByDefault && !untracked(() => this._expansionInitialized())) {
23113
+ this._expansionInitialized.set(true);
23114
+ const updated = untracked(() => this.treeService.setExpandedState(currentNodes, true));
23115
+ this.isAllExpanded.set(true);
23116
+ queueMicrotask(() => this.nodesChanged.emit(updated));
23117
+ }
23118
+ if (currentNodes.length === 0) {
23119
+ untracked(() => this._expansionInitialized.set(false));
23120
+ }
23121
+ });
23122
+ }
23123
+ mergedConfig = computed(() => {
23124
+ const defaults = {
23125
+ enableDragDrop: false,
23126
+ enableAnimations: true,
23127
+ showExpandToggle: true,
23128
+ showConnectors: false,
23129
+ emptyMessage: this.emptyMessage(),
23130
+ emptyIcon: this.emptyIcon(),
23131
+ expandAllByDefault: false,
23132
+ maxDropDepth: 0,
23133
+ actions: []
23134
+ };
23135
+ return { ...defaults, ...this.config() };
23136
+ });
23137
+ hasNodes = computed(() => this.nodes().length > 0);
23138
+ treeClasses = computed(() => {
23139
+ const classes = ['c-tree'];
23140
+ if (this.mergedConfig().showConnectors) {
23141
+ classes.push('c-tree--connectors');
23142
+ }
23143
+ if (this.mergedConfig().enableDragDrop) {
23144
+ classes.push('c-tree--draggable');
23145
+ }
23146
+ const custom = this.customClass();
23147
+ if (custom) {
23148
+ classes.push(custom);
23149
+ }
23150
+ return classes.join(' ');
23151
+ });
23152
+ effectiveNodeTemplate = computed(() => {
23153
+ return this.mergedConfig().nodeTemplate || this.customNodeTemplate || undefined;
23154
+ });
23155
+ toggleExpandAll() {
23156
+ const newState = !this.isAllExpanded();
23157
+ const updated = this.treeService.setExpandedState(this.nodes(), newState);
23158
+ this.isAllExpanded.set(newState);
23159
+ this.nodesChanged.emit(updated);
23160
+ }
23161
+ expandAll() {
23162
+ const updated = this.treeService.setExpandedState(this.nodes(), true);
23163
+ this.isAllExpanded.set(true);
23164
+ this.nodesChanged.emit(updated);
23165
+ }
23166
+ collapseAll() {
23167
+ const updated = this.treeService.setExpandedState(this.nodes(), false);
23168
+ this.isAllExpanded.set(false);
23169
+ this.nodesChanged.emit(updated);
23170
+ }
23171
+ onNodeToggled(node) {
23172
+ this.nodeToggled.emit(node);
23173
+ }
23174
+ onNodeClicked(node) {
23175
+ this.nodeClicked.emit(node);
23176
+ }
23177
+ onActionTriggered(event) {
23178
+ this.actionTriggered.emit(event);
23179
+ }
23180
+ onDragStart(event) {
23181
+ this.draggedNodeId.set(event.node.id);
23182
+ }
23183
+ onDragEnd() {
23184
+ this.draggedNodeId.set(null);
23185
+ }
23186
+ onNodeDrop(event) {
23187
+ const draggedId = this.draggedNodeId();
23188
+ if (draggedId === null || draggedId === event.node.id)
23189
+ return;
23190
+ const draggedNode = this.treeService.findNodeById(this.nodes(), draggedId);
23191
+ if (!draggedNode)
23192
+ return;
23193
+ const maxDepth = this.mergedConfig().maxDropDepth;
23194
+ if (maxDepth && maxDepth > 0 && event.position === 'inside') {
23195
+ const targetDepth = this.treeService.getNodeDepth(this.nodes(), event.node.id);
23196
+ if (targetDepth >= maxDepth)
23197
+ return;
23198
+ }
23199
+ let updatedNodes = this.treeService.removeNode(this.nodes(), draggedId);
23200
+ updatedNodes = this.treeService.insertNode(updatedNodes, draggedNode, event.node.id, event.position);
23201
+ const dropEvent = {
23202
+ draggedNode,
23203
+ targetNode: event.node,
23204
+ position: event.position,
23205
+ updatedNodes
23206
+ };
23207
+ this.nodeDrop.emit(dropEvent);
23208
+ this.nodesChanged.emit(updatedNodes);
23209
+ this.draggedNodeId.set(null);
23210
+ }
23211
+ trackByNodeId(index, node) {
23212
+ return node.id;
23213
+ }
23214
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: GenericTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23215
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: GenericTreeComponent, isStandalone: true, selector: "core-generic-tree", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, customClass: { classPropertyName: "customClass", publicName: "customClass", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyIcon: { classPropertyName: "emptyIcon", publicName: "emptyIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeToggled: "nodeToggled", nodeClicked: "nodeClicked", actionTriggered: "actionTriggered", nodeDrop: "nodeDrop", nodesChanged: "nodesChanged" }, queries: [{ propertyName: "customNodeTemplate", first: true, predicate: ["nodeTemplate"], descendants: true }], hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-tree-container\" [class]=\"customClass()\">\n @if (hasNodes()) {\n <ul [class]=\"treeClasses()\">\n @for (node of nodes(); track trackByNodeId($index, node)) {\n <core-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [config]=\"mergedConfig()\"\n [nodeTemplate]=\"effectiveNodeTemplate()\"\n (nodeToggled)=\"onNodeToggled($event)\"\n (nodeClicked)=\"onNodeClicked($event)\"\n (actionTriggered)=\"onActionTriggered($event)\"\n (nodeDragStart)=\"onDragStart($event)\"\n (nodeDragOver)=\"($event)\"\n (nodeDrop)=\"onNodeDrop($event)\"\n (nodeDragEnd)=\"onDragEnd()\"\n />\n }\n </ul>\n } @else {\n <div class=\"c-tree-empty\">\n <span class=\"{{ mergedConfig().emptyIcon }} c-tree-empty__icon\"></span>\n <p class=\"c-tree-empty__text\">\n {{ mergedConfig().emptyMessage! | translate }}\n </p>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.c-tree-container{background:var(--color-white, #fff);border-radius:var(--app-br, .5rem);border:1px solid var(--color-neutral-200, #e5e7eb);overflow:hidden}.c-tree{list-style:none;padding:0;margin:0}.c-tree-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 1rem;text-align:center}.c-tree-empty__icon{font-size:3rem;color:var(--color-neutral-400, #9ca3af);margin-bottom:1rem;opacity:.6}.c-tree-empty__text{margin:0;font-size:.875rem;color:var(--color-neutral-500, #6b7280)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: TreeNodeComponent, selector: "core-tree-node", inputs: ["node", "level", "config", "nodeTemplate"], outputs: ["nodeToggled", "nodeClicked", "actionTriggered", "nodeDragStart", "nodeDragOver", "nodeDrop", "nodeDragEnd"] }] });
23216
+ }
23217
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: GenericTreeComponent, decorators: [{
23218
+ type: Component,
23219
+ args: [{ selector: 'core-generic-tree', standalone: true, imports: [
23220
+ CommonModule,
23221
+ TranslateModule,
23222
+ TreeNodeComponent
23223
+ ], hostDirectives: [CoreHostDirective], template: "<div class=\"c-tree-container\" [class]=\"customClass()\">\n @if (hasNodes()) {\n <ul [class]=\"treeClasses()\">\n @for (node of nodes(); track trackByNodeId($index, node)) {\n <core-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [config]=\"mergedConfig()\"\n [nodeTemplate]=\"effectiveNodeTemplate()\"\n (nodeToggled)=\"onNodeToggled($event)\"\n (nodeClicked)=\"onNodeClicked($event)\"\n (actionTriggered)=\"onActionTriggered($event)\"\n (nodeDragStart)=\"onDragStart($event)\"\n (nodeDragOver)=\"($event)\"\n (nodeDrop)=\"onNodeDrop($event)\"\n (nodeDragEnd)=\"onDragEnd()\"\n />\n }\n </ul>\n } @else {\n <div class=\"c-tree-empty\">\n <span class=\"{{ mergedConfig().emptyIcon }} c-tree-empty__icon\"></span>\n <p class=\"c-tree-empty__text\">\n {{ mergedConfig().emptyMessage! | translate }}\n </p>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.c-tree-container{background:var(--color-white, #fff);border-radius:var(--app-br, .5rem);border:1px solid var(--color-neutral-200, #e5e7eb);overflow:hidden}.c-tree{list-style:none;padding:0;margin:0}.c-tree-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 1rem;text-align:center}.c-tree-empty__icon{font-size:3rem;color:var(--color-neutral-400, #9ca3af);margin-bottom:1rem;opacity:.6}.c-tree-empty__text{margin:0;font-size:.875rem;color:var(--color-neutral-500, #6b7280)}\n"] }]
23224
+ }], ctorParameters: () => [], propDecorators: { customNodeTemplate: [{
23225
+ type: ContentChild,
23226
+ args: ['nodeTemplate']
23227
+ }] } });
23228
+
22797
23229
  class CacheBustingInterceptor {
22798
23230
  intercept(req, next) {
22799
23231
  if (req.url.includes('/assets/i18n/') && req.url.endsWith('.json')) {
@@ -23075,5 +23507,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
23075
23507
  * Generated bundle index. Do not edit.
23076
23508
  */
23077
23509
 
23078
- export { AD_AUTH_CONFIG, AD_AUTH_INTERCEPTOR_CONFIG, ALL_COUNTRY_CODES, ActiveFiltersComponent, AdAuthService, AdInteractionType, AdLoginButtonComponent, AgeValidationHelper, AlertComponent, AlertContainerComponent, AlertService, AlertType, ApiConfigurationProvider, BaseFieldComponent, ButtonContext, ButtonSize, ButtonType, COMMON_COUNTRIES, CacheBustingInterceptor, CalendarEventType, CardComponent, CarouselComponent, ChatMessagePosition, ChatMessageType, CheckboxFieldComponent, ColorPickerFieldComponent, ConfigurationModel, ConfirmationDialogComponent, ConfirmationDialogService, CoreHostDirective, CoreManualRefreshComponent, CoreUiHttpLoaderFactory, CoreUiTranslateLoader, CoreUiTranslateService, CountryCode, CustomClassService, DEFAULT_AD_AUTH_INTERCEPTOR_CONFIG, DEFAULT_COUNTRIES, DEFAULT_SCHEDULER_CONFIG, DataListComponent, DataListItemComponent, DataStoreService, DateFieldComponent, DateRangeFieldComponent, DateUtility, DatetimeFieldComponent, DayState, DayType, DialogActions, DocumentAction, DocumentDisplayMode, DocumentFieldComponent, DocumentFieldValidators, DocumentPayloadMode, DropdownComponent, DropdownDirection, DropdownService, DynamicFieldDirective, DynamicFieldsHelper, FieldErrorsComponent, FieldType, FileFieldComponent, FileModel, FilePreviewActionType, FileTemplateModel, FileTemplateType, FileType, FileTypeModel, FileUploadService, FilterModalComponent, FilterService, FilterType, FixedActionPosition, FixedActionsMobileModalComponent, FixedActionsMobileModalService, GalleryAnimationType, GalleryLayoutType, GalleryModalComponent, GalleryModalGlobalService, GenericButtonComponent, GenericCalendarComponent, GenericChatComponent, GenericChatService, GenericDocumentationComponent, GenericFixedActionsComponent, GenericGalleryComponent, GenericModalComponent, GenericPaginationComponent, GenericRatingComponent, GenericSchedulerComponent, GenericSidebarComponent, GenericSkeletonComponent, GenericStepsComponent, GenericSwitchComponent, GenericTableComponent, GenericTabsComponent, GenericTimelineComponent, GlobalApiConfigService, HeaderComponent, HeaderConfigurationService, HeaderElementType, HeaderService, HttpLoaderFactory, ImageModalComponent, ImageModalService, ImagePreviewComponent, LATIN_AMERICA_COUNTRIES, LayoutAuth, LayoutBreakpoint, LayoutComponent, LayoutService, LayoutStateService, LayoutType, LoaderComponent, LoaderService, MODEL_REFERENCE_SORT_KEY, MainNavComponent, MainNavService, ManualRefreshService, MobileHeaderComponent, MobileResolutionService, ModalMode, ModelApiService, MultiEntryFieldComponent, MultiEntryOutputFormat, NumberFieldComponent, NumberFieldConfigType, NumberFieldType, NumberRange, PERMISSION_ACTIONS_PROVIDER, PERMISSION_PROVIDER, PERMISSION_RESOURCES_PROVIDER, PaginationService, PasswordFieldComponent, PermissionEnumsService, PermissionModel, PermissionService, PermissionWrapperService, PermissionsActions, PermissionsCustomActions, PermissionsInterceptor, PermissionsResources, PhoneFieldComponent, ProgressBarComponent, ProgressBarSize, RatingService, RatingSize, RatingType, RedirectUrlService, ResetPasswordModel, RoleModel, SOUTH_AMERICA_COUNTRIES, SelectFieldComponent, ServerSelectFieldComponent, ServerSelectService, SidebarCustomModalComponent, SidebarCustomModalService, SidebarHeight, SidebarMobileModalService, SidebarMobileType, SidebarPosition, SidebarService, SidebarState, SidebarTemplateRegistryService, SidebarVisibility, SidebarWidth, SkeletonAnimation, SkeletonService, SkeletonSize, SkeletonType, SmartFieldComponent, SortDirection, SortMode, StepSize, StepStatus, StepType, StepsService, SwitchFieldComponent, TableAction, TableActionService, TableDataService, TableFixedActionsService, TableSortService, TextAreaFieldComponent, TextFieldComponent, TimeFieldComponent, TimeInterval, TimelineService, TimelineStatus, TimelineType, TranslationMergeService, UruguayanDocumentValidationHelper, UsersModel, VERSION, WeekDay, adAuthGuard, adAuthInterceptor, adGuestGuard, adRoleGuard, ageValidator, calculateAge, equalToValidator, generateRandomUruguayanDocument, getCountryCodeStrings, getLatestBirthDateForAge, getRandomCi, getUruguayanDocumentValidationDigit, getValidationDigit, isSameDate, isValidCountryCode, provideAdAuth, provideAdAuthInterceptor, provideAdAuthWithInterceptor, provideCoreUiTranslateLoader, providePermissionActions, providePermissionEnums, providePermissionResources, providePermissionService, providePermissionServiceFactory, provideTranslateLoader, random, transform, transformUruguayanDocument, uruguayanDocumentValidator, validate, validateAge, validateCi, validateUruguayanDocument, validationDigit };
23510
+ export { AD_AUTH_CONFIG, AD_AUTH_INTERCEPTOR_CONFIG, ALL_COUNTRY_CODES, ActiveFiltersComponent, AdAuthService, AdInteractionType, AdLoginButtonComponent, AgeValidationHelper, AlertComponent, AlertContainerComponent, AlertService, AlertType, ApiConfigurationProvider, BaseFieldComponent, ButtonContext, ButtonSize, ButtonType, COMMON_COUNTRIES, CacheBustingInterceptor, CalendarEventType, CardComponent, CarouselComponent, ChatMessagePosition, ChatMessageType, CheckboxFieldComponent, ColorPickerFieldComponent, ConfigurationModel, ConfirmationDialogComponent, ConfirmationDialogService, CoreHostDirective, CoreManualRefreshComponent, CoreUiHttpLoaderFactory, CoreUiTranslateLoader, CoreUiTranslateService, CountryCode, CustomClassService, DEFAULT_AD_AUTH_INTERCEPTOR_CONFIG, DEFAULT_COUNTRIES, DEFAULT_SCHEDULER_CONFIG, DataListComponent, DataListItemComponent, DataStoreService, DateFieldComponent, DateRangeFieldComponent, DateUtility, DatetimeFieldComponent, DayState, DayType, DialogActions, DocumentAction, DocumentDisplayMode, DocumentFieldComponent, DocumentFieldValidators, DocumentPayloadMode, DropdownComponent, DropdownDirection, DropdownService, DynamicFieldDirective, DynamicFieldsHelper, FieldErrorsComponent, FieldType, FileFieldComponent, FileModel, FilePreviewActionType, FileTemplateModel, FileTemplateType, FileType, FileTypeModel, FileUploadService, FilterModalComponent, FilterService, FilterType, FixedActionPosition, FixedActionsMobileModalComponent, FixedActionsMobileModalService, GalleryAnimationType, GalleryLayoutType, GalleryModalComponent, GalleryModalGlobalService, GenericButtonComponent, GenericCalendarComponent, GenericChatComponent, GenericChatService, GenericDocumentationComponent, GenericFixedActionsComponent, GenericGalleryComponent, GenericModalComponent, GenericPaginationComponent, GenericRatingComponent, GenericSchedulerComponent, GenericSidebarComponent, GenericSkeletonComponent, GenericStepsComponent, GenericSwitchComponent, GenericTableComponent, GenericTabsComponent, GenericTimelineComponent, GenericTreeComponent, GlobalApiConfigService, HeaderComponent, HeaderConfigurationService, HeaderElementType, HeaderService, HttpLoaderFactory, ImageModalComponent, ImageModalService, ImagePreviewComponent, LATIN_AMERICA_COUNTRIES, LayoutAuth, LayoutBreakpoint, LayoutComponent, LayoutService, LayoutStateService, LayoutType, LoaderComponent, LoaderService, MODEL_REFERENCE_SORT_KEY, MainNavComponent, MainNavService, ManualRefreshService, MobileHeaderComponent, MobileResolutionService, ModalMode, ModelApiService, MultiEntryFieldComponent, MultiEntryOutputFormat, NumberFieldComponent, NumberFieldConfigType, NumberFieldType, NumberRange, PERMISSION_ACTIONS_PROVIDER, PERMISSION_PROVIDER, PERMISSION_RESOURCES_PROVIDER, PaginationService, PasswordFieldComponent, PermissionEnumsService, PermissionModel, PermissionService, PermissionWrapperService, PermissionsActions, PermissionsCustomActions, PermissionsInterceptor, PermissionsResources, PhoneFieldComponent, ProgressBarComponent, ProgressBarSize, RatingService, RatingSize, RatingType, RedirectUrlService, ResetPasswordModel, RoleModel, SOUTH_AMERICA_COUNTRIES, SelectFieldComponent, ServerSelectFieldComponent, ServerSelectService, SidebarCustomModalComponent, SidebarCustomModalService, SidebarHeight, SidebarMobileModalService, SidebarMobileType, SidebarPosition, SidebarService, SidebarState, SidebarTemplateRegistryService, SidebarVisibility, SidebarWidth, SkeletonAnimation, SkeletonService, SkeletonSize, SkeletonType, SmartFieldComponent, SortDirection, SortMode, StepSize, StepStatus, StepType, StepsService, SwitchFieldComponent, TableAction, TableActionService, TableDataService, TableFixedActionsService, TableSortService, TextAreaFieldComponent, TextFieldComponent, TimeFieldComponent, TimeInterval, TimelineService, TimelineStatus, TimelineType, TranslationMergeService, TreeNodeComponent, TreeService, UruguayanDocumentValidationHelper, UsersModel, VERSION, WeekDay, adAuthGuard, adAuthInterceptor, adGuestGuard, adRoleGuard, ageValidator, calculateAge, equalToValidator, generateRandomUruguayanDocument, getCountryCodeStrings, getLatestBirthDateForAge, getRandomCi, getUruguayanDocumentValidationDigit, getValidationDigit, isSameDate, isValidCountryCode, provideAdAuth, provideAdAuthInterceptor, provideAdAuthWithInterceptor, provideCoreUiTranslateLoader, providePermissionActions, providePermissionEnums, providePermissionResources, providePermissionService, providePermissionServiceFactory, provideTranslateLoader, random, transform, transformUruguayanDocument, uruguayanDocumentValidator, validate, validateAge, validateCi, validateUruguayanDocument, validationDigit };
23079
23511
  //# sourceMappingURL=solcre-org-core-ui.mjs.map