@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.
|
@@ -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.
|
|
17677
|
+
full: '2.20.25',
|
|
17678
17678
|
major: 2,
|
|
17679
17679
|
minor: 20,
|
|
17680
|
-
patch:
|
|
17681
|
-
timestamp: '2026-02-
|
|
17682
|
-
buildDate: '
|
|
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
|