pdm-ui-kit 0.1.18 → 0.1.19

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.
@@ -1,17 +1,209 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  export class PdmTableComponent {
5
- constructor() {
5
+ constructor(renderer) {
6
+ this.renderer = renderer;
7
+ this.variant = 'default';
8
+ this.reorderRows = false;
9
+ this.dragHandleSelector = '[data-drag-handle],[data-slot=row-drag-handle],.row-drag-handle,[data-auto-drag-handle]';
6
10
  this.className = '';
11
+ this.rowOrderChange = new EventEmitter();
12
+ this.cleanupListeners = [];
13
+ this.draggedRow = null;
14
+ }
15
+ ngAfterViewInit() {
16
+ this.syncReorderBehavior();
17
+ }
18
+ ngOnChanges(changes) {
19
+ if (changes['reorderRows'] || changes['variant']) {
20
+ this.syncReorderBehavior();
21
+ }
22
+ }
23
+ ngOnDestroy() {
24
+ this.cleanupReorderBehavior();
25
+ }
26
+ get wrapperClasses() {
27
+ return [
28
+ 'relative w-full overflow-auto',
29
+ this.variant === 'interactive' ? 'overflow-x-auto overflow-y-hidden rounded-xl border border-border bg-background' : '',
30
+ this.variant === 'data' ? 'overflow-hidden rounded-md border border-border bg-background' : '',
31
+ this.className
32
+ ];
33
+ }
34
+ get tableClasses() {
35
+ return [
36
+ 'w-full caption-bottom text-sm',
37
+ this.variant === 'data'
38
+ ? 'border-collapse text-foreground [&_thead_tr]:border-b [&_thead_tr]:border-border [&_tbody_tr]:border-b [&_tbody_tr]:border-border [&_tbody_tr:last-child]:border-b-0 [&_th]:h-10 [&_th]:px-2 [&_th]:text-left [&_th]:align-middle [&_th]:font-medium [&_td]:p-2 [&_td]:align-middle'
39
+ : '',
40
+ this.variant === 'interactive'
41
+ ? 'text-foreground [&_thead]:sticky [&_thead]:top-0 [&_thead]:z-10 [&_thead]:bg-muted/70 [&_thead_tr]:border-b [&_thead_tr]:border-border [&_th]:h-12 [&_th]:px-4 [&_th]:text-left [&_th]:align-middle [&_th]:text-sm [&_th]:font-medium [&_th]:whitespace-nowrap [&_tbody_tr]:border-b [&_tbody_tr]:border-border [&_tbody_tr]:transition-colors [&_tbody_tr:hover]:bg-muted/50 [&_tbody_tr:last-child]:border-b-0 [&_td]:h-14 [&_td]:px-4 [&_td]:align-middle [&_td]:text-sm [&_td]:whitespace-nowrap [&_td:first-child]:w-10 [&_td:last-child]:w-10 [&_svg]:text-muted-foreground'
42
+ : ''
43
+ ];
44
+ }
45
+ syncReorderBehavior() {
46
+ this.cleanupReorderBehavior();
47
+ if (!this.isReorderEnabled) {
48
+ return;
49
+ }
50
+ const tbody = this.getTbody();
51
+ if (!tbody) {
52
+ return;
53
+ }
54
+ this.setRowsDraggable(tbody, true);
55
+ this.cleanupListeners.push(this.renderer.listen(tbody, 'mousedown', (event) => this.armDragFromHandle(event)), this.renderer.listen(tbody, 'dragstart', (event) => this.onDragStart(event)), this.renderer.listen(tbody, 'dragover', (event) => this.onDragOver(event, tbody)), this.renderer.listen(tbody, 'drop', (event) => this.onDrop(event)), this.renderer.listen(tbody, 'dragend', () => this.onDragEnd()));
56
+ this.observer = new MutationObserver(() => this.setRowsDraggable(tbody, true));
57
+ this.observer.observe(tbody, { childList: true });
58
+ }
59
+ cleanupReorderBehavior() {
60
+ this.cleanupListeners.forEach((dispose) => dispose());
61
+ this.cleanupListeners = [];
62
+ if (this.observer) {
63
+ this.observer.disconnect();
64
+ this.observer = undefined;
65
+ }
66
+ const tbody = this.getTbody();
67
+ if (tbody) {
68
+ this.setRowsDraggable(tbody, false);
69
+ }
70
+ this.draggedRow = null;
71
+ }
72
+ get isReorderEnabled() {
73
+ return this.reorderRows;
74
+ }
75
+ getTbody() {
76
+ return this.tableElement?.nativeElement.tBodies.item(0) ?? null;
77
+ }
78
+ setRowsDraggable(tbody, enabled) {
79
+ const rows = Array.from(tbody.rows);
80
+ rows.forEach((row) => {
81
+ this.syncAutoDragHandle(row, enabled);
82
+ row.draggable = false;
83
+ if (!enabled) {
84
+ delete row.dataset['dragging'];
85
+ delete row.dataset['dragArmed'];
86
+ }
87
+ });
88
+ }
89
+ syncAutoDragHandle(row, enabled) {
90
+ const firstCell = row.cells.item(0);
91
+ if (!firstCell) {
92
+ return;
93
+ }
94
+ const existingAutoHandle = firstCell.querySelector('[data-auto-drag-handle]');
95
+ if (!enabled) {
96
+ existingAutoHandle?.remove();
97
+ return;
98
+ }
99
+ const hasCustomHandle = !!firstCell.querySelector('[data-drag-handle],[data-slot=row-drag-handle],.row-drag-handle');
100
+ if (hasCustomHandle || existingAutoHandle) {
101
+ return;
102
+ }
103
+ const button = this.renderer.createElement('button');
104
+ this.renderer.setAttribute(button, 'type', 'button');
105
+ this.renderer.setAttribute(button, 'aria-label', 'Drag row');
106
+ this.renderer.setAttribute(button, 'data-auto-drag-handle', 'true');
107
+ this.renderer.addClass(button, 'inline-flex');
108
+ this.renderer.addClass(button, 'h-7');
109
+ this.renderer.addClass(button, 'w-7');
110
+ this.renderer.addClass(button, 'items-center');
111
+ this.renderer.addClass(button, 'justify-center');
112
+ this.renderer.addClass(button, 'cursor-grab');
113
+ this.renderer.addClass(button, 'active:cursor-grabbing');
114
+ this.renderer.addClass(button, 'text-muted-foreground');
115
+ const dots = this.renderer.createElement('span');
116
+ this.renderer.addClass(dots, 'text-sm');
117
+ this.renderer.addClass(dots, 'leading-none');
118
+ this.renderer.setProperty(dots, 'textContent', '⋮⋮');
119
+ this.renderer.appendChild(button, dots);
120
+ this.renderer.insertBefore(firstCell, button, firstCell.firstChild);
121
+ }
122
+ onDragStart(event) {
123
+ const target = event.target;
124
+ const row = target?.closest('tr');
125
+ if (!row) {
126
+ return;
127
+ }
128
+ const handle = target?.closest(this.dragHandleSelector);
129
+ const isArmed = row.dataset['dragArmed'] === 'true';
130
+ if ((!handle || !row.contains(handle)) && !isArmed) {
131
+ event.preventDefault();
132
+ return;
133
+ }
134
+ this.draggedRow = row;
135
+ this.draggedRow.dataset['dragging'] = 'true';
136
+ if (event.dataTransfer) {
137
+ event.dataTransfer.effectAllowed = 'move';
138
+ event.dataTransfer.setData('text/plain', '');
139
+ }
140
+ }
141
+ onDragOver(event, tbody) {
142
+ if (!this.draggedRow) {
143
+ return;
144
+ }
145
+ event.preventDefault();
146
+ const target = event.target;
147
+ const targetRow = target?.closest('tr');
148
+ if (!targetRow || targetRow === this.draggedRow) {
149
+ return;
150
+ }
151
+ const rect = targetRow.getBoundingClientRect();
152
+ const shouldInsertBefore = event.clientY < rect.top + rect.height / 2;
153
+ tbody.insertBefore(this.draggedRow, shouldInsertBefore ? targetRow : targetRow.nextSibling);
154
+ }
155
+ onDrop(event) {
156
+ event.preventDefault();
157
+ }
158
+ onDragEnd() {
159
+ const tbody = this.getTbody();
160
+ if (tbody) {
161
+ Array.from(tbody.rows).forEach((row) => {
162
+ row.draggable = false;
163
+ delete row.dataset['dragArmed'];
164
+ });
165
+ }
166
+ if (this.draggedRow) {
167
+ delete this.draggedRow.dataset['dragging'];
168
+ this.draggedRow = null;
169
+ }
170
+ if (!tbody) {
171
+ return;
172
+ }
173
+ const order = Array.from(tbody.rows).map((row, index) => row.getAttribute('data-row-id') || String(index));
174
+ this.rowOrderChange.emit(order);
175
+ }
176
+ armDragFromHandle(event) {
177
+ const target = event.target;
178
+ const handle = target?.closest(this.dragHandleSelector);
179
+ if (!handle) {
180
+ return;
181
+ }
182
+ const row = handle.closest('tr');
183
+ if (!row) {
184
+ return;
185
+ }
186
+ row.draggable = true;
187
+ row.dataset['dragArmed'] = 'true';
7
188
  }
8
189
  }
9
- PdmTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
- PdmTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTableComponent, selector: "pdm-table", inputs: { className: "className" }, ngImport: i0, template: "<div [ngClass]=\"['relative w-full overflow-auto', className]\">\n <table class=\"w-full caption-bottom text-sm\">\n <ng-content></ng-content>\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
190
+ PdmTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
191
+ PdmTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTableComponent, selector: "pdm-table", inputs: { variant: "variant", reorderRows: "reorderRows", dragHandleSelector: "dragHandleSelector", className: "className" }, outputs: { rowOrderChange: "rowOrderChange" }, viewQueries: [{ propertyName: "tableElement", first: true, predicate: ["tableElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11
192
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, decorators: [{
12
193
  type: Component,
13
- args: [{ selector: 'pdm-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['relative w-full overflow-auto', className]\">\n <table class=\"w-full caption-bottom text-sm\">\n <ng-content></ng-content>\n </table>\n</div>\n" }]
14
- }], propDecorators: { className: [{
194
+ args: [{ selector: 'pdm-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n" }]
195
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { variant: [{
196
+ type: Input
197
+ }], reorderRows: [{
198
+ type: Input
199
+ }], dragHandleSelector: [{
200
+ type: Input
201
+ }], className: [{
15
202
  type: Input
203
+ }], rowOrderChange: [{
204
+ type: Output
205
+ }], tableElement: [{
206
+ type: ViewChild,
207
+ args: ['tableElement']
16
208
  }] } });
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTzFFLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFNVyxjQUFTLEdBQUcsRUFBRSxDQUFDO0tBQ3pCOzs4R0FGWSxpQkFBaUI7a0dBQWpCLGlCQUFpQixxRkNQOUIsMEtBS0E7MkZERWEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLFdBQVcsbUJBRUosdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFBkbVRhYmxlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG59XG4iLCI8ZGl2IFtuZ0NsYXNzXT1cIlsncmVsYXRpdmUgdy1mdWxsIG92ZXJmbG93LWF1dG8nLCBjbGFzc05hbWVdXCI+XG4gIDx0YWJsZSBjbGFzcz1cInctZnVsbCBjYXB0aW9uLWJvdHRvbSB0ZXh0LXNtXCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3RhYmxlPlxuPC9kaXY+XG4iXX0=
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7OztBQVN2QixNQUFNLE9BQU8saUJBQWlCO0lBYTVCLFlBQTZCLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFadkMsWUFBTyxHQUFvQixTQUFTLENBQUM7UUFDckMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsdUJBQWtCLEdBQUcseUZBQXlGLENBQUM7UUFDL0csY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNkLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUloRCxxQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO1FBRXpDLGVBQVUsR0FBK0IsSUFBSSxDQUFDO0lBRUgsQ0FBQztJQUVwRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTztZQUNMLCtCQUErQjtZQUMvQixJQUFJLENBQUMsT0FBTyxLQUFLLGFB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O0lBQ3BDLENBQUM7OzhHQXpPVSxpQkFBaUI7a0dBQWpCLGlCQUFpQixpV0N0QjlCLHVSQUtBOzJGRGlCYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsV0FBVyxtQkFFSix1QkFBdUIsQ0FBQyxNQUFNO2dHQUd0QyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUVvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgUGRtVGFibGVWYXJpYW50ID0gJ2RlZmF1bHQnIHwgJ2RhdGEnIHwgJ2ludGVyYWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUGRtVGFibGVDb21wb25lbnQge1xuICBASW5wdXQoKSB2YXJpYW50OiBQZG1UYWJsZVZhcmlhbnQgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIHJlb3JkZXJSb3dzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRyYWdIYW5kbGVTZWxlY3RvciA9ICdbZGF0YS1kcmFnLWhhbmRsZV0sW2RhdGEtc2xvdD1yb3ctZHJhZy1oYW5kbGVdLC5yb3ctZHJhZy1oYW5kbGUsW2RhdGEtYXV0by1kcmFnLWhhbmRsZV0nO1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQE91dHB1dCgpIHJvd09yZGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcblxuICBAVmlld0NoaWxkKCd0YWJsZUVsZW1lbnQnKSB0YWJsZUVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxUYWJsZUVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgY2xlYW51cExpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcbiAgcHJpdmF0ZSBvYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgZHJhZ2dlZFJvdzogSFRNTFRhYmxlUm93RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jUmVvcmRlckJlaGF2aW9yKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3Jlb3JkZXJSb3dzJ10gfHwgY2hhbmdlc1sndmFyaWFudCddKSB7XG4gICAgICB0aGlzLnN5bmNSZW9yZGVyQmVoYXZpb3IoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBSZW9yZGVyQmVoYXZpb3IoKTtcbiAgfVxuXG4gIGdldCB3cmFwcGVyQ2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdyZWxhdGl2ZSB3LWZ1bGwgb3ZlcmZsb3ctYXV0bycsXG4gICAgICB0aGlzLnZhcmlhbnQgPT09ICdpbnRlcmFjdGl2ZScgPyAnb3ZlcmZsb3cteC1hdXRvIG92ZXJmbG93LXktaGlkZGVuIHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCcgOiAnJyxcbiAgICAgIHRoaXMudmFyaWFudCA9PT0gJ2RhdGEnID8gJ292ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLWJhY2tncm91bmQnIDogJycsXG4gICAgICB0aGlzLmNsYXNzTmFtZVxuICAgIF07XG4gIH1cblxuICBnZXQgdGFibGVDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3ctZnVsbCBjYXB0aW9uLWJvdHRvbSB0ZXh0LXNtJyxcbiAgICAgIHRoaXMudmFyaWFudCA9PT0gJ2RhdGEnXG4gICAgICAgID8gJ2JvcmRlci1jb2xsYXBzZSB0ZXh0LWZvcmVncm91bmQgWyZfdGhlYWRfdHJdOmJvcmRlci1iIFsmX3RoZWFkX3RyXTpib3JkZXItYm9yZGVyIFsmX3Rib2R5X3RyXTpib3JkZXItYiBbJl90Ym9keV90cl06Ym9yZGVyLWJvcmRlciBbJl90Ym9keV90cjpsYXN0LWNoaWxkXTpib3JkZXItYi0wIFsmX3RoXTpoLTEwIFsmX3RoXTpweC0yIFsmX3RoXTp0ZXh0LWxlZnQgWyZfdGhdOmFsaWduLW1pZGRsZSBbJl90aF06Zm9udC1tZWRpdW0gWyZfdGRdOnAtMiBbJl90ZF06YWxpZ24tbWlkZGxlJ1xuICAgICAgICA6ICcnLFxuICAgICAgdGhpcy52YXJpYW50ID09PSAnaW50ZXJhY3RpdmUnXG4gICAgICAgID8gJ3RleHQtZm9yZWdyb3VuZCBbJl90aGVhZF06c3RpY2t5IFsmX3RoZWFkXTp0b3AtMCBbJl90aGVhZF06ei0xMCBbJl90aGVhZF06YmctbXV0ZWQvNzAgWyZfdGhlYWRfdHJdOmJvcmRlci1iIFsmX3RoZWFkX3RyXTpib3JkZXItYm9yZGVyIFsmX3RoXTpoLTEyIFsmX3RoXTpweC00IFsmX3RoXTp0ZXh0LWxlZnQgWyZfdGhdOmFsaWduLW1pZGRsZSBbJl90aF06dGV4dC1zbSBbJl90aF06Zm9udC1tZWRpdW0gWyZfdGhdOndoaXRlc3BhY2Utbm93cmFwIFsmX3Rib2R5X3RyXTpib3JkZXItYiBbJl90Ym9keV90cl06Ym9yZGVyLWJvcmRlciBbJl90Ym9keV90cl06dHJhbnNpdGlvbi1jb2xvcnMgWyZfdGJvZHlfdHI6aG92ZXJdOmJnLW11dGVkLzUwIFsmX3Rib2R5X3RyOmxhc3QtY2hpbGRdOmJvcmRlci1iLTAgWyZfdGRdOmgtMTQgWyZfdGRdOnB4LTQgWyZfdGRdOmFsaWduLW1pZGRsZSBbJl90ZF06dGV4dC1zbSBbJl90ZF06d2hpdGVzcGFjZS1ub3dyYXAgWyZfdGQ6Zmlyc3QtY2hpbGRdOnctMTAgWyZfdGQ6bGFzdC1jaGlsZF06dy0xMCBbJl9zdmddOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCdcbiAgICAgICAgOiAnJ1xuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN5bmNSZW9yZGVyQmVoYXZpb3IoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwUmVvcmRlckJlaGF2aW9yKCk7XG5cbiAgICBpZiAoIXRoaXMuaXNSZW9yZGVyRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRib2R5ID0gdGhpcy5nZXRUYm9keSgpO1xuICAgIGlmICghdGJvZHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFJvd3NEcmFnZ2FibGUodGJvZHksIHRydWUpO1xuXG4gICAgdGhpcy5jbGVhbnVwTGlzdGVuZXJzLnB1c2goXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0Ym9keSwgJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4gdGhpcy5hcm1EcmFnRnJvbUhhbmRsZShldmVudCkpLFxuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGJvZHksICdkcmFnc3RhcnQnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5vbkRyYWdTdGFydChldmVudCkpLFxuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGJvZHksICdkcmFnb3ZlcicsIChldmVudDogRHJhZ0V2ZW50KSA9PiB0aGlzLm9uRHJhZ092ZXIoZXZlbnQsIHRib2R5KSksXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0Ym9keSwgJ2Ryb3AnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5vbkRyb3AoZXZlbnQpKSxcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRib2R5LCAnZHJhZ2VuZCcsICgpID0+IHRoaXMub25EcmFnRW5kKCkpXG4gICAgKTtcblxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB0aGlzLnNldFJvd3NEcmFnZ2FibGUodGJvZHksIHRydWUpKTtcbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGJvZHksIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwUmVvcmRlckJlaGF2aW9yKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cExpc3RlbmVycy5mb3JFYWNoKChkaXNwb3NlKSA9PiBkaXNwb3NlKCkpO1xuICAgIHRoaXMuY2xlYW51cExpc3RlbmVycyA9IFtdO1xuXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5vYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB0Ym9keSA9IHRoaXMuZ2V0VGJvZHkoKTtcbiAgICBpZiAodGJvZHkpIHtcbiAgICAgIHRoaXMuc2V0Um93c0RyYWdnYWJsZSh0Ym9keSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ2dlZFJvdyA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc1Jlb3JkZXJFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlb3JkZXJSb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYm9keSgpOiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRWxlbWVudD8ubmF0aXZlRWxlbWVudC50Qm9kaWVzLml0ZW0oMCkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Um93c0RyYWdnYWJsZSh0Ym9keTogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQsIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gQXJyYXkuZnJvbSh0Ym9keS5yb3dzKTtcbiAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgdGhpcy5zeW5jQXV0b0RyYWdIYW5kbGUocm93LCBlbmFibGVkKTtcbiAgICAgIHJvdy5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgICBkZWxldGUgcm93LmRhdGFzZXRbJ2RyYWdnaW5nJ107XG4gICAgICAgIGRlbGV0ZSByb3cuZGF0YXNldFsnZHJhZ0FybWVkJ107XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNBdXRvRHJhZ0hhbmRsZShyb3c6IEhUTUxUYWJsZVJvd0VsZW1lbnQsIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdENlbGwgPSByb3cuY2VsbHMuaXRlbSgwKTtcbiAgICBpZiAoIWZpcnN0Q2VsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nQXV0b0hhbmRsZSA9IGZpcnN0Q2VsbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hdXRvLWRyYWctaGFuZGxlXScpO1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgZXhpc3RpbmdBdXRvSGFuZGxlPy5yZW1vdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDdXN0b21IYW5kbGUgPSAhIWZpcnN0Q2VsbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kcmFnLWhhbmRsZV0sW2RhdGEtc2xvdD1yb3ctZHJhZy1oYW5kbGVdLC5yb3ctZHJhZy1oYW5kbGUnKTtcbiAgICBpZiAoaGFzQ3VzdG9tSGFuZGxlIHx8IGV4aXN0aW5nQXV0b0hhbmRsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYnV0dG9uJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnV0dG9uLCAndHlwZScsICdidXR0b24nKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidXR0b24sICdhcmlhLWxhYmVsJywgJ0RyYWcgcm93Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnV0dG9uLCAnZGF0YS1hdXRvLWRyYWctaGFuZGxlJywgJ3RydWUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ2lubGluZS1mbGV4Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhidXR0b24sICdoLTcnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ3ctNycpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAnaXRlbXMtY2VudGVyJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhidXR0b24sICdqdXN0aWZ5LWNlbnRlcicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAnY3Vyc29yLWdyYWInKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ2FjdGl2ZTpjdXJzb3ItZ3JhYmJpbmcnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCcpO1xuXG4gICAgY29uc3QgZG90cyA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZG90cywgJ3RleHQtc20nKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvdHMsICdsZWFkaW5nLW5vbmUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGRvdHMsICd0ZXh0Q29udGVudCcsICfii67ii64nKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGJ1dHRvbiwgZG90cyk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShmaXJzdENlbGwsIGJ1dHRvbiwgZmlyc3RDZWxsLmZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdTdGFydChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCByb3cgPSB0YXJnZXQ/LmNsb3Nlc3QoJ3RyJyk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGUgPSB0YXJnZXQ/LmNsb3Nlc3QodGhpcy5kcmFnSGFuZGxlU2VsZWN0b3IpO1xuICAgIGNvbnN0IGlzQXJtZWQgPSByb3cuZGF0YXNldFsnZHJhZ0FybWVkJ10gPT09ICd0cnVlJztcbiAgICBpZiAoKCFoYW5kbGUgfHwgIXJvdy5jb250YWlucyhoYW5kbGUpKSAmJiAhaXNBcm1lZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnZWRSb3cgPSByb3cgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcbiAgICB0aGlzLmRyYWdnZWRSb3cuZGF0YXNldFsnZHJhZ2dpbmcnXSA9ICd0cnVlJztcblxuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQsIHRib2R5OiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2VkUm93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IHRhcmdldFJvdyA9IHRhcmdldD8uY2xvc2VzdCgndHInKSBhcyBIVE1MVGFibGVSb3dFbGVtZW50IHwgbnVsbDtcblxuICAgIGlmICghdGFyZ2V0Um93IHx8IHRhcmdldFJvdyA9PT0gdGhpcy5kcmFnZ2VkUm93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHRhcmdldFJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzaG91bGRJbnNlcnRCZWZvcmUgPSBldmVudC5jbGllbnRZIDwgcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDI7XG4gICAgdGJvZHkuaW5zZXJ0QmVmb3JlKHRoaXMuZHJhZ2dlZFJvdywgc2hvdWxkSW5zZXJ0QmVmb3JlID8gdGFyZ2V0Um93IDogdGFyZ2V0Um93Lm5leHRTaWJsaW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdFbmQoKTogdm9pZCB7XG4gICAgY29uc3QgdGJvZHkgPSB0aGlzLmdldFRib2R5KCk7XG4gICAgaWYgKHRib2R5KSB7XG4gICAgICBBcnJheS5mcm9tKHRib2R5LnJvd3MpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICByb3cuZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICAgIGRlbGV0ZSByb3cuZGF0YXNldFsnZHJhZ0FybWVkJ107XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kcmFnZ2VkUm93KSB7XG4gICAgICBkZWxldGUgdGhpcy5kcmFnZ2VkUm93LmRhdGFzZXRbJ2RyYWdnaW5nJ107XG4gICAgICB0aGlzLmRyYWdnZWRSb3cgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghdGJvZHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IEFycmF5LmZyb20odGJvZHkucm93cykubWFwKChyb3csIGluZGV4KSA9PiByb3cuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdy1pZCcpIHx8IFN0cmluZyhpbmRleCkpO1xuICAgIHRoaXMucm93T3JkZXJDaGFuZ2UuZW1pdChvcmRlcik7XG4gIH1cblxuICBwcml2YXRlIGFybURyYWdGcm9tSGFuZGxlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBoYW5kbGUgPSB0YXJnZXQ/LmNsb3Nlc3QodGhpcy5kcmFnSGFuZGxlU2VsZWN0b3IpO1xuICAgIGlmICghaGFuZGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gaGFuZGxlLmNsb3Nlc3QoJ3RyJykgYXMgSFRNTFRhYmxlUm93RWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByb3cuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICByb3cuZGF0YXNldFsnZHJhZ0FybWVkJ10gPSAndHJ1ZSc7XG4gIH1cbn1cbiIsIjxkaXYgW25nQ2xhc3NdPVwid3JhcHBlckNsYXNzZXNcIiBbYXR0ci5kYXRhLXNsb3RdPVwidmFyaWFudCA9PT0gJ2ludGVyYWN0aXZlJyA/ICd0YWJsZS1jb250YWluZXInIDogbnVsbFwiPlxuICA8dGFibGUgI3RhYmxlRWxlbWVudCBbbmdDbGFzc109XCJ0YWJsZUNsYXNzZXNcIiBbYXR0ci5kYXRhLXNsb3RdPVwidmFyaWFudCA9PT0gJ2ludGVyYWN0aXZlJyA/ICd0YWJsZScgOiBudWxsXCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3RhYmxlPlxuPC9kaXY+XG4iXX0=
@@ -1,7 +1,7 @@
1
1
  import * as i1 from '@angular/common';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { EventEmitter, Component, ChangeDetectionStrategy, Input, Output, HostListener, ViewChildren, NgModule } from '@angular/core';
4
+ import { EventEmitter, Component, ChangeDetectionStrategy, Input, Output, HostListener, ViewChildren, ViewChild, NgModule } from '@angular/core';
5
5
 
6
6
  class PdmAccordionComponent {
7
7
  constructor() {
@@ -2755,17 +2755,210 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
2755
2755
  }] } });
2756
2756
 
2757
2757
  class PdmTableComponent {
2758
- constructor() {
2758
+ constructor(renderer) {
2759
+ this.renderer = renderer;
2760
+ this.variant = 'default';
2761
+ this.reorderRows = false;
2762
+ this.dragHandleSelector = '[data-drag-handle],[data-slot=row-drag-handle],.row-drag-handle,[data-auto-drag-handle]';
2759
2763
  this.className = '';
2764
+ this.rowOrderChange = new EventEmitter();
2765
+ this.cleanupListeners = [];
2766
+ this.draggedRow = null;
2767
+ }
2768
+ ngAfterViewInit() {
2769
+ this.syncReorderBehavior();
2770
+ }
2771
+ ngOnChanges(changes) {
2772
+ if (changes['reorderRows'] || changes['variant']) {
2773
+ this.syncReorderBehavior();
2774
+ }
2775
+ }
2776
+ ngOnDestroy() {
2777
+ this.cleanupReorderBehavior();
2778
+ }
2779
+ get wrapperClasses() {
2780
+ return [
2781
+ 'relative w-full overflow-auto',
2782
+ this.variant === 'interactive' ? 'overflow-x-auto overflow-y-hidden rounded-xl border border-border bg-background' : '',
2783
+ this.variant === 'data' ? 'overflow-hidden rounded-md border border-border bg-background' : '',
2784
+ this.className
2785
+ ];
2786
+ }
2787
+ get tableClasses() {
2788
+ return [
2789
+ 'w-full caption-bottom text-sm',
2790
+ this.variant === 'data'
2791
+ ? 'border-collapse text-foreground [&_thead_tr]:border-b [&_thead_tr]:border-border [&_tbody_tr]:border-b [&_tbody_tr]:border-border [&_tbody_tr:last-child]:border-b-0 [&_th]:h-10 [&_th]:px-2 [&_th]:text-left [&_th]:align-middle [&_th]:font-medium [&_td]:p-2 [&_td]:align-middle'
2792
+ : '',
2793
+ this.variant === 'interactive'
2794
+ ? 'text-foreground [&_thead]:sticky [&_thead]:top-0 [&_thead]:z-10 [&_thead]:bg-muted/70 [&_thead_tr]:border-b [&_thead_tr]:border-border [&_th]:h-12 [&_th]:px-4 [&_th]:text-left [&_th]:align-middle [&_th]:text-sm [&_th]:font-medium [&_th]:whitespace-nowrap [&_tbody_tr]:border-b [&_tbody_tr]:border-border [&_tbody_tr]:transition-colors [&_tbody_tr:hover]:bg-muted/50 [&_tbody_tr:last-child]:border-b-0 [&_td]:h-14 [&_td]:px-4 [&_td]:align-middle [&_td]:text-sm [&_td]:whitespace-nowrap [&_td:first-child]:w-10 [&_td:last-child]:w-10 [&_svg]:text-muted-foreground'
2795
+ : ''
2796
+ ];
2797
+ }
2798
+ syncReorderBehavior() {
2799
+ this.cleanupReorderBehavior();
2800
+ if (!this.isReorderEnabled) {
2801
+ return;
2802
+ }
2803
+ const tbody = this.getTbody();
2804
+ if (!tbody) {
2805
+ return;
2806
+ }
2807
+ this.setRowsDraggable(tbody, true);
2808
+ this.cleanupListeners.push(this.renderer.listen(tbody, 'mousedown', (event) => this.armDragFromHandle(event)), this.renderer.listen(tbody, 'dragstart', (event) => this.onDragStart(event)), this.renderer.listen(tbody, 'dragover', (event) => this.onDragOver(event, tbody)), this.renderer.listen(tbody, 'drop', (event) => this.onDrop(event)), this.renderer.listen(tbody, 'dragend', () => this.onDragEnd()));
2809
+ this.observer = new MutationObserver(() => this.setRowsDraggable(tbody, true));
2810
+ this.observer.observe(tbody, { childList: true });
2811
+ }
2812
+ cleanupReorderBehavior() {
2813
+ this.cleanupListeners.forEach((dispose) => dispose());
2814
+ this.cleanupListeners = [];
2815
+ if (this.observer) {
2816
+ this.observer.disconnect();
2817
+ this.observer = undefined;
2818
+ }
2819
+ const tbody = this.getTbody();
2820
+ if (tbody) {
2821
+ this.setRowsDraggable(tbody, false);
2822
+ }
2823
+ this.draggedRow = null;
2824
+ }
2825
+ get isReorderEnabled() {
2826
+ return this.reorderRows;
2827
+ }
2828
+ getTbody() {
2829
+ var _a, _b;
2830
+ return (_b = (_a = this.tableElement) === null || _a === void 0 ? void 0 : _a.nativeElement.tBodies.item(0)) !== null && _b !== void 0 ? _b : null;
2831
+ }
2832
+ setRowsDraggable(tbody, enabled) {
2833
+ const rows = Array.from(tbody.rows);
2834
+ rows.forEach((row) => {
2835
+ this.syncAutoDragHandle(row, enabled);
2836
+ row.draggable = false;
2837
+ if (!enabled) {
2838
+ delete row.dataset['dragging'];
2839
+ delete row.dataset['dragArmed'];
2840
+ }
2841
+ });
2842
+ }
2843
+ syncAutoDragHandle(row, enabled) {
2844
+ const firstCell = row.cells.item(0);
2845
+ if (!firstCell) {
2846
+ return;
2847
+ }
2848
+ const existingAutoHandle = firstCell.querySelector('[data-auto-drag-handle]');
2849
+ if (!enabled) {
2850
+ existingAutoHandle === null || existingAutoHandle === void 0 ? void 0 : existingAutoHandle.remove();
2851
+ return;
2852
+ }
2853
+ const hasCustomHandle = !!firstCell.querySelector('[data-drag-handle],[data-slot=row-drag-handle],.row-drag-handle');
2854
+ if (hasCustomHandle || existingAutoHandle) {
2855
+ return;
2856
+ }
2857
+ const button = this.renderer.createElement('button');
2858
+ this.renderer.setAttribute(button, 'type', 'button');
2859
+ this.renderer.setAttribute(button, 'aria-label', 'Drag row');
2860
+ this.renderer.setAttribute(button, 'data-auto-drag-handle', 'true');
2861
+ this.renderer.addClass(button, 'inline-flex');
2862
+ this.renderer.addClass(button, 'h-7');
2863
+ this.renderer.addClass(button, 'w-7');
2864
+ this.renderer.addClass(button, 'items-center');
2865
+ this.renderer.addClass(button, 'justify-center');
2866
+ this.renderer.addClass(button, 'cursor-grab');
2867
+ this.renderer.addClass(button, 'active:cursor-grabbing');
2868
+ this.renderer.addClass(button, 'text-muted-foreground');
2869
+ const dots = this.renderer.createElement('span');
2870
+ this.renderer.addClass(dots, 'text-sm');
2871
+ this.renderer.addClass(dots, 'leading-none');
2872
+ this.renderer.setProperty(dots, 'textContent', '⋮⋮');
2873
+ this.renderer.appendChild(button, dots);
2874
+ this.renderer.insertBefore(firstCell, button, firstCell.firstChild);
2875
+ }
2876
+ onDragStart(event) {
2877
+ const target = event.target;
2878
+ const row = target === null || target === void 0 ? void 0 : target.closest('tr');
2879
+ if (!row) {
2880
+ return;
2881
+ }
2882
+ const handle = target === null || target === void 0 ? void 0 : target.closest(this.dragHandleSelector);
2883
+ const isArmed = row.dataset['dragArmed'] === 'true';
2884
+ if ((!handle || !row.contains(handle)) && !isArmed) {
2885
+ event.preventDefault();
2886
+ return;
2887
+ }
2888
+ this.draggedRow = row;
2889
+ this.draggedRow.dataset['dragging'] = 'true';
2890
+ if (event.dataTransfer) {
2891
+ event.dataTransfer.effectAllowed = 'move';
2892
+ event.dataTransfer.setData('text/plain', '');
2893
+ }
2894
+ }
2895
+ onDragOver(event, tbody) {
2896
+ if (!this.draggedRow) {
2897
+ return;
2898
+ }
2899
+ event.preventDefault();
2900
+ const target = event.target;
2901
+ const targetRow = target === null || target === void 0 ? void 0 : target.closest('tr');
2902
+ if (!targetRow || targetRow === this.draggedRow) {
2903
+ return;
2904
+ }
2905
+ const rect = targetRow.getBoundingClientRect();
2906
+ const shouldInsertBefore = event.clientY < rect.top + rect.height / 2;
2907
+ tbody.insertBefore(this.draggedRow, shouldInsertBefore ? targetRow : targetRow.nextSibling);
2908
+ }
2909
+ onDrop(event) {
2910
+ event.preventDefault();
2911
+ }
2912
+ onDragEnd() {
2913
+ const tbody = this.getTbody();
2914
+ if (tbody) {
2915
+ Array.from(tbody.rows).forEach((row) => {
2916
+ row.draggable = false;
2917
+ delete row.dataset['dragArmed'];
2918
+ });
2919
+ }
2920
+ if (this.draggedRow) {
2921
+ delete this.draggedRow.dataset['dragging'];
2922
+ this.draggedRow = null;
2923
+ }
2924
+ if (!tbody) {
2925
+ return;
2926
+ }
2927
+ const order = Array.from(tbody.rows).map((row, index) => row.getAttribute('data-row-id') || String(index));
2928
+ this.rowOrderChange.emit(order);
2929
+ }
2930
+ armDragFromHandle(event) {
2931
+ const target = event.target;
2932
+ const handle = target === null || target === void 0 ? void 0 : target.closest(this.dragHandleSelector);
2933
+ if (!handle) {
2934
+ return;
2935
+ }
2936
+ const row = handle.closest('tr');
2937
+ if (!row) {
2938
+ return;
2939
+ }
2940
+ row.draggable = true;
2941
+ row.dataset['dragArmed'] = 'true';
2760
2942
  }
2761
2943
  }
2762
- PdmTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2763
- PdmTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTableComponent, selector: "pdm-table", inputs: { className: "className" }, ngImport: i0, template: "<div [ngClass]=\"['relative w-full overflow-auto', className]\">\n <table class=\"w-full caption-bottom text-sm\">\n <ng-content></ng-content>\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2944
+ PdmTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
2945
+ PdmTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTableComponent, selector: "pdm-table", inputs: { variant: "variant", reorderRows: "reorderRows", dragHandleSelector: "dragHandleSelector", className: "className" }, outputs: { rowOrderChange: "rowOrderChange" }, viewQueries: [{ propertyName: "tableElement", first: true, predicate: ["tableElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2764
2946
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, decorators: [{
2765
2947
  type: Component,
2766
- args: [{ selector: 'pdm-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['relative w-full overflow-auto', className]\">\n <table class=\"w-full caption-bottom text-sm\">\n <ng-content></ng-content>\n </table>\n</div>\n" }]
2767
- }], propDecorators: { className: [{
2948
+ args: [{ selector: 'pdm-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n" }]
2949
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { variant: [{
2950
+ type: Input
2951
+ }], reorderRows: [{
2768
2952
  type: Input
2953
+ }], dragHandleSelector: [{
2954
+ type: Input
2955
+ }], className: [{
2956
+ type: Input
2957
+ }], rowOrderChange: [{
2958
+ type: Output
2959
+ }], tableElement: [{
2960
+ type: ViewChild,
2961
+ args: ['tableElement']
2769
2962
  }] } });
2770
2963
 
2771
2964
  class PdmTabsComponent {