@maro-tech/table 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,16 +8,16 @@ import * as i4 from '@angular/router';
8
8
  import { Router, RouterModule } from '@angular/router';
9
9
  import * as i1$1 from 'lucide-angular';
10
10
  import { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';
11
- import { UiSelectComponent } from '@maro-tech/form';
11
+ import { InputSelectComponent } from '@maro-tech/form';
12
12
  import { UiButtonComponent, UiBadgeComponent } from '@maro-tech/core';
13
13
 
14
14
  class UiTableColumnDirective {
15
15
  columnName;
16
16
  template = inject((TemplateRef));
17
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
18
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.20", type: UiTableColumnDirective, isStandalone: true, selector: "[appUiTableColumn]", inputs: { columnName: ["appUiTableColumn", "columnName"] }, ngImport: i0 });
17
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
18
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.19", type: UiTableColumnDirective, isStandalone: true, selector: "[appUiTableColumn]", inputs: { columnName: ["appUiTableColumn", "columnName"] }, ngImport: i0 });
19
19
  }
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableColumnDirective, decorators: [{
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableColumnDirective, decorators: [{
21
21
  type: Directive,
22
22
  args: [{
23
23
  selector: '[appUiTableColumn]',
@@ -44,8 +44,8 @@ class UiTableActionsCellComponent {
44
44
  resolveAriaLabel(action) {
45
45
  return String(action.label?.trim() || (action.id === 'edit' ? 'Редагувати' : action.id === 'delete' ? 'Видалити' : action.id));
46
46
  }
47
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableActionsCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
48
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: UiTableActionsCellComponent, isStandalone: true, selector: "app-ui-table-actions-cell", inputs: { actions: "actions", row: "row" }, outputs: { actionClick: "actionClick" }, ngImport: i0, template: `
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableActionsCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
48
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableActionsCellComponent, isStandalone: true, selector: "app-ui-table-actions-cell", inputs: { actions: "actions", row: "row" }, outputs: { actionClick: "actionClick" }, ngImport: i0, template: `
49
49
  <div class="flex flex-wrap gap-2" (click)="$event.stopPropagation()">
50
50
  @for (action of actions; track action.id) {
51
51
  <ui-button
@@ -66,7 +66,7 @@ class UiTableActionsCellComponent {
66
66
  </div>
67
67
  `, isInline: true, dependencies: [{ kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["variant", "size", "disabled", "fullWidth", "type", "withShadow", "icon", "iconOnly", "ariaLabel"] }] });
68
68
  }
69
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableActionsCellComponent, decorators: [{
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableActionsCellComponent, decorators: [{
70
70
  type: Component,
71
71
  args: [{
72
72
  selector: 'app-ui-table-actions-cell',
@@ -104,8 +104,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
104
104
 
105
105
  class UiTableBadgeCellComponent {
106
106
  value = '';
107
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableBadgeCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
108
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: UiTableBadgeCellComponent, isStandalone: true, selector: "app-ui-table-badge-cell", inputs: { value: "value" }, ngImport: i0, template: `
107
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableBadgeCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
108
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableBadgeCellComponent, isStandalone: true, selector: "app-ui-table-badge-cell", inputs: { value: "value" }, ngImport: i0, template: `
109
109
  @if (value === null || value === undefined || value === '') {
110
110
 
111
111
  } @else {
@@ -115,7 +115,7 @@ class UiTableBadgeCellComponent {
115
115
  }
116
116
  `, isInline: true, dependencies: [{ kind: "component", type: UiBadgeComponent, selector: "ui-badge", inputs: ["variant", "color"] }] });
117
117
  }
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableBadgeCellComponent, decorators: [{
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableBadgeCellComponent, decorators: [{
119
119
  type: Component,
120
120
  args: [{
121
121
  selector: 'app-ui-table-badge-cell',
@@ -140,11 +140,11 @@ class UiTableEditableCellComponent {
140
140
  value = null;
141
141
  inputType = 'text';
142
142
  valueChange = new EventEmitter();
143
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableEditableCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
144
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: UiTableEditableCellComponent, isStandalone: true, selector: "app-ui-table-editable-cell", inputs: { column: "column", value: "value", inputType: "inputType" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
143
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableEditableCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
144
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableEditableCellComponent, isStandalone: true, selector: "app-ui-table-editable-cell", inputs: { column: "column", value: "value", inputType: "inputType" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
145
145
  <div class="min-w-0" (click)="$event.stopPropagation()">
146
146
  @if (column.editor === 'select') {
147
- <forms-select
147
+ <input-select
148
148
  [options]="column.options || []"
149
149
  [includeBlankOption]="column.includeBlankOption ?? true"
150
150
  [blankOptionLabel]="column.blankOptionLabel || 'Оберіть значення'"
@@ -153,7 +153,7 @@ class UiTableEditableCellComponent {
153
153
  [ngModel]="value"
154
154
  [ngModelOptions]="{ standalone: true }"
155
155
  (valueChange)="valueChange.emit($event)"
156
- ></forms-select>
156
+ ></input-select>
157
157
  } @else {
158
158
  <input
159
159
  class="w-full rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm text-slate-800 outline-none transition focus:border-slate-400"
@@ -165,18 +165,18 @@ class UiTableEditableCellComponent {
165
165
  />
166
166
  }
167
167
  </div>
168
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: UiSelectComponent, selector: "forms-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }] });
168
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputSelectComponent, selector: "input-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }] });
169
169
  }
170
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableEditableCellComponent, decorators: [{
170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableEditableCellComponent, decorators: [{
171
171
  type: Component,
172
172
  args: [{
173
173
  selector: 'app-ui-table-editable-cell',
174
174
  standalone: true,
175
- imports: [FormsModule, UiSelectComponent],
175
+ imports: [FormsModule, InputSelectComponent],
176
176
  template: `
177
177
  <div class="min-w-0" (click)="$event.stopPropagation()">
178
178
  @if (column.editor === 'select') {
179
- <forms-select
179
+ <input-select
180
180
  [options]="column.options || []"
181
181
  [includeBlankOption]="column.includeBlankOption ?? true"
182
182
  [blankOptionLabel]="column.blankOptionLabel || 'Оберіть значення'"
@@ -185,7 +185,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
185
185
  [ngModel]="value"
186
186
  [ngModelOptions]="{ standalone: true }"
187
187
  (valueChange)="valueChange.emit($event)"
188
- ></forms-select>
188
+ ></input-select>
189
189
  } @else {
190
190
  <input
191
191
  class="w-full rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm text-slate-800 outline-none transition focus:border-slate-400"
@@ -213,8 +213,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
213
213
  class UiTableImageCellComponent {
214
214
  src = '';
215
215
  alt = '';
216
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableImageCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
217
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: UiTableImageCellComponent, isStandalone: true, selector: "app-ui-table-image-cell", inputs: { src: "src", alt: "alt" }, ngImport: i0, template: `
216
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableImageCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
217
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableImageCellComponent, isStandalone: true, selector: "app-ui-table-image-cell", inputs: { src: "src", alt: "alt" }, ngImport: i0, template: `
218
218
  @if (src) {
219
219
  <span class="block">
220
220
  <img [src]="src" [alt]="alt" class="h-10 w-10 rounded-lg border border-slate-200 object-cover transition hover:opacity-80" />
@@ -225,7 +225,7 @@ class UiTableImageCellComponent {
225
225
 
226
226
  `, isInline: true });
227
227
  }
228
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableImageCellComponent, decorators: [{
228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableImageCellComponent, decorators: [{
229
229
  type: Component,
230
230
  args: [{
231
231
  selector: 'app-ui-table-image-cell',
@@ -250,8 +250,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
250
250
 
251
251
  class UiTableTextCellComponent {
252
252
  value = '';
253
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableTextCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
254
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: UiTableTextCellComponent, isStandalone: true, selector: "app-ui-table-text-cell", inputs: { value: "value" }, ngImport: i0, template: `
253
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableTextCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
254
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableTextCellComponent, isStandalone: true, selector: "app-ui-table-text-cell", inputs: { value: "value" }, ngImport: i0, template: `
255
255
  <span class="block whitespace-normal break-words">
256
256
  @if (value === null || value === undefined || value === '') {
257
257
 
@@ -261,7 +261,7 @@ class UiTableTextCellComponent {
261
261
  </span>
262
262
  `, isInline: true });
263
263
  }
264
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableTextCellComponent, decorators: [{
264
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableTextCellComponent, decorators: [{
265
265
  type: Component,
266
266
  args: [{
267
267
  selector: 'app-ui-table-text-cell',
@@ -781,12 +781,12 @@ class UiTableComponent {
781
781
  }
782
782
  resolveColumnWidth(column) {
783
783
  if (column.width == null || column.width === '') {
784
- return '500px';
784
+ return undefined;
785
785
  }
786
786
  if (typeof column.width === 'number') {
787
787
  return `${Math.max(1, Math.round(column.width))}px`;
788
788
  }
789
- return String(column.width).trim() || '500px';
789
+ return String(column.width).trim() || undefined;
790
790
  }
791
791
  resolveImageSrc(value, row) {
792
792
  return this.imageResolver(value, row);
@@ -804,16 +804,16 @@ class UiTableComponent {
804
804
  this.currentPageIndex = Math.max(0, this.totalPages - 1);
805
805
  }
806
806
  }
807
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
808
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: UiTableComponent, isStandalone: true, selector: "app-ui-table", inputs: { columns: "columns", isLoading: "isLoading", data: "data", disablePaging: "disablePaging", rowClickable: "rowClickable", imageResolver: "imageResolver" }, outputs: { pageChange: "pageChange", rowClick: "rowClick", actionClick: "actionClick", cellChange: "cellChange" }, queries: [{ propertyName: "columnTemplates", predicate: UiTableColumnDirective }], ngImport: i0, template: "<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n \u0414\u0456\u0457\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n \u041D\u0435\u043C\u0430\u0454 \u0434\u0430\u043D\u0438\u0445\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>\u0420\u044F\u0434\u043A\u0456\u0432 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456</span>\n <forms-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></forms-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1$1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: UiSelectComponent, selector: "forms-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: UiTableActionsCellComponent, selector: "app-ui-table-actions-cell", inputs: ["actions", "row"], outputs: ["actionClick"] }, { kind: "component", type: UiTableBadgeCellComponent, selector: "app-ui-table-badge-cell", inputs: ["value"] }, { kind: "component", type: UiTableEditableCellComponent, selector: "app-ui-table-editable-cell", inputs: ["column", "value", "inputType"], outputs: ["valueChange"] }, { kind: "component", type: UiTableImageCellComponent, selector: "app-ui-table-image-cell", inputs: ["src", "alt"] }, { kind: "component", type: UiTableTextCellComponent, selector: "app-ui-table-text-cell", inputs: ["value"] }] });
807
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
808
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableComponent, isStandalone: true, selector: "app-ui-table", inputs: { columns: "columns", isLoading: "isLoading", data: "data", disablePaging: "disablePaging", rowClickable: "rowClickable", imageResolver: "imageResolver" }, outputs: { pageChange: "pageChange", rowClick: "rowClick", actionClick: "actionClick", cellChange: "cellChange" }, queries: [{ propertyName: "columnTemplates", predicate: UiTableColumnDirective }], ngImport: i0, template: "<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n \u0414\u0456\u0457\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n \u041D\u0435\u043C\u0430\u0454 \u0434\u0430\u043D\u0438\u0445\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>\u0420\u044F\u0434\u043A\u0456\u0432 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456</span>\n <input-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></input-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1$1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: InputSelectComponent, selector: "input-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: UiTableActionsCellComponent, selector: "app-ui-table-actions-cell", inputs: ["actions", "row"], outputs: ["actionClick"] }, { kind: "component", type: UiTableBadgeCellComponent, selector: "app-ui-table-badge-cell", inputs: ["value"] }, { kind: "component", type: UiTableEditableCellComponent, selector: "app-ui-table-editable-cell", inputs: ["column", "value", "inputType"], outputs: ["valueChange"] }, { kind: "component", type: UiTableImageCellComponent, selector: "app-ui-table-image-cell", inputs: ["src", "alt"] }, { kind: "component", type: UiTableTextCellComponent, selector: "app-ui-table-text-cell", inputs: ["value"] }] });
809
809
  }
810
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiTableComponent, decorators: [{
810
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableComponent, decorators: [{
811
811
  type: Component,
812
812
  args: [{ selector: 'app-ui-table', standalone: true, imports: [
813
813
  LucideAngularModule,
814
814
  CommonModule,
815
815
  NgTemplateOutlet,
816
- UiSelectComponent,
816
+ InputSelectComponent,
817
817
  FormsModule,
818
818
  RouterModule,
819
819
  UiTableActionsCellComponent,
@@ -821,7 +821,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
821
821
  UiTableEditableCellComponent,
822
822
  UiTableImageCellComponent,
823
823
  UiTableTextCellComponent,
824
- ], template: "<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n \u0414\u0456\u0457\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n \u041D\u0435\u043C\u0430\u0454 \u0434\u0430\u043D\u0438\u0445\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>\u0420\u044F\u0434\u043A\u0456\u0432 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456</span>\n <forms-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></forms-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n" }]
824
+ ], template: "<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n \u0414\u0456\u0457\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n \u041D\u0435\u043C\u0430\u0454 \u0434\u0430\u043D\u0438\u0445\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>\u0420\u044F\u0434\u043A\u0456\u0432 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456</span>\n <input-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></input-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n" }]
825
825
  }], propDecorators: { columnTemplates: [{
826
826
  type: ContentChildren,
827
827
  args: [UiTableColumnDirective]
@@ -905,12 +905,12 @@ class UiPaginatorComponent {
905
905
  return;
906
906
  this.pageChange.emit(clamped);
907
907
  }
908
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiPaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
909
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: UiPaginatorComponent, isStandalone: true, selector: "app-ui-paginator", inputs: { pageIndex: "pageIndex", pageSize: "pageSize", total: "total", pageSizeOptions: "pageSizeOptions" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <forms-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></forms-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"\u041D\u0430\u0437\u0430\u0434\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">\u041D\u0430\u0437\u0430\u0434</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">\u2022\u2022\u2022</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"\u0414\u0430\u043B\u0456\"\n >\n <span class=\"sr-only\">\u0414\u0430\u043B\u0456</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: UiSelectComponent, selector: "forms-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1$1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] });
908
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiPaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
909
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiPaginatorComponent, isStandalone: true, selector: "app-ui-paginator", inputs: { pageIndex: "pageIndex", pageSize: "pageSize", total: "total", pageSizeOptions: "pageSizeOptions" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <input-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></input-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"\u041D\u0430\u0437\u0430\u0434\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">\u041D\u0430\u0437\u0430\u0434</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">\u2022\u2022\u2022</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"\u0414\u0430\u043B\u0456\"\n >\n <span class=\"sr-only\">\u0414\u0430\u043B\u0456</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputSelectComponent, selector: "input-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1$1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] });
910
910
  }
911
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: UiPaginatorComponent, decorators: [{
911
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiPaginatorComponent, decorators: [{
912
912
  type: Component,
913
- args: [{ selector: 'app-ui-paginator', standalone: true, imports: [CommonModule, FormsModule, UiSelectComponent, LucideAngularModule], template: "<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <forms-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></forms-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"\u041D\u0430\u0437\u0430\u0434\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">\u041D\u0430\u0437\u0430\u0434</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">\u2022\u2022\u2022</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"\u0414\u0430\u043B\u0456\"\n >\n <span class=\"sr-only\">\u0414\u0430\u043B\u0456</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n" }]
913
+ args: [{ selector: 'app-ui-paginator', standalone: true, imports: [CommonModule, FormsModule, InputSelectComponent, LucideAngularModule], template: "<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <input-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></input-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"\u041D\u0430\u0437\u0430\u0434\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">\u041D\u0430\u0437\u0430\u0434</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">\u2022\u2022\u2022</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"\u0414\u0430\u043B\u0456\"\n >\n <span class=\"sr-only\">\u0414\u0430\u043B\u0456</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n" }]
914
914
  }], propDecorators: { pageIndex: [{
915
915
  type: Input
916
916
  }], pageSize: [{
@@ -1 +1 @@
1
- {"version":3,"file":"maro-tech-table.mjs","sources":["../../../src/lib/table/ui-table-column.directive.ts","../../../src/lib/table/cells/ui-table-actions-cell.component.ts","../../../src/lib/table/cells/ui-table-badge-cell.component.ts","../../../src/lib/table/cells/ui-table-editable-cell.component.ts","../../../src/lib/table/cells/ui-table-image-cell.component.ts","../../../src/lib/table/cells/ui-table-text-cell.component.ts","../../../src/lib/table/ui-table.component.ts","../../../src/lib/table/ui-table.component.html","../../../src/lib/paginator/ui-paginator.component.ts","../../../src/lib/paginator/ui-paginator.component.html","../../../src/maro-tech-table.ts"],"sourcesContent":["import { Directive, Input, TemplateRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[appUiTableColumn]',\n standalone: true,\n})\nexport class UiTableColumnDirective {\n @Input('appUiTableColumn') columnName!: string;\n public readonly template = inject(TemplateRef<unknown>);\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiTableRowAction } from '../ui-table.models';\n\n@Component({\n selector: 'app-ui-table-actions-cell',\n standalone: true,\n imports: [UiButtonComponent],\n template: `\n <div class=\"flex flex-wrap gap-2\" (click)=\"$event.stopPropagation()\">\n @for (action of actions; track action.id) {\n <ui-button\n [variant]=\"action.variant || 'ghost'\"\n [icon]=\"action.icon || ''\"\n [iconOnly]=\"isIconOnlyAction(action)\"\n [ariaLabel]=\"resolveAriaLabel(action)\"\n size=\"sm\"\n type=\"button\"\n [disabled]=\"action.disabled || false\"\n (click)=\"onActionClick($event, action)\"\n >\n @if (action.label?.trim()) {\n {{ action.label }}\n }\n </ui-button>\n }\n </div>\n `,\n})\nexport class UiTableActionsCellComponent<T = Record<string, unknown>> {\n @Input() actions: UiTableRowAction[] = [];\n @Input({ required: true }) row!: T;\n\n @Output() actionClick = new EventEmitter<{ action: UiTableRowAction; row: T }>();\n\n onActionClick(event: Event, action: UiTableRowAction): void {\n event.stopPropagation();\n if (action.disabled) return;\n this.actionClick.emit({ action, row: this.row });\n }\n\n isIconOnlyAction(action: UiTableRowAction): boolean {\n return !String(action.label || '').trim();\n }\n\n resolveAriaLabel(action: UiTableRowAction): string {\n return String(action.label?.trim() || (action.id === 'edit' ? 'Редагувати' : action.id === 'delete' ? 'Видалити' : action.id));\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { UiBadgeComponent } from '@maro-tech/core';\n\n@Component({\n selector: 'app-ui-table-badge-cell',\n standalone: true,\n imports: [UiBadgeComponent],\n template: `\n @if (value === null || value === undefined || value === '') {\n —\n } @else {\n <ui-badge variant=\"neutral\">\n {{ value }}\n </ui-badge>\n }\n `,\n})\nexport class UiTableBadgeCellComponent {\n @Input() value: string | number | null | undefined = '';\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { UiSelectComponent } from '@maro-tech/form';\nimport { UiTableColumnConfig } from '../ui-table.models';\n\n@Component({\n selector: 'app-ui-table-editable-cell',\n standalone: true,\n imports: [FormsModule, UiSelectComponent],\n template: `\n <div class=\"min-w-0\" (click)=\"$event.stopPropagation()\">\n @if (column.editor === 'select') {\n <forms-select\n [options]=\"column.options || []\"\n [includeBlankOption]=\"column.includeBlankOption ?? true\"\n [blankOptionLabel]=\"column.blankOptionLabel || 'Оберіть значення'\"\n [searchable]=\"true\"\n [fullWidth]=\"true\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (valueChange)=\"valueChange.emit($event)\"\n ></forms-select>\n } @else {\n <input\n class=\"w-full rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm text-slate-800 outline-none transition focus:border-slate-400\"\n [type]=\"inputType\"\n [placeholder]=\"column.placeholder || ''\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"valueChange.emit($event)\"\n />\n }\n </div>\n `,\n})\nexport class UiTableEditableCellComponent {\n @Input({ required: true }) column!: UiTableColumnConfig;\n @Input() value: string | number | null = null;\n @Input() inputType: 'text' | 'number' = 'text';\n\n @Output() valueChange = new EventEmitter<unknown>();\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-ui-table-image-cell',\n standalone: true,\n imports: [],\n template: `\n @if (src) {\n <span class=\"block\">\n <img [src]=\"src\" [alt]=\"alt\" class=\"h-10 w-10 rounded-lg border border-slate-200 object-cover transition hover:opacity-80\" />\n </span>\n } @else {\n <span class=\"text-slate-400\">—</span>\n }\n\n `,\n})\nexport class UiTableImageCellComponent {\n @Input() src = '';\n @Input() alt = '';\n\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-ui-table-text-cell',\n standalone: true,\n template: `\n <span class=\"block whitespace-normal break-words\">\n @if (value === null || value === undefined || value === '') {\n —\n } @else {\n {{ value }}\n }\n </span>\n `,\n})\nexport class UiTableTextCellComponent {\n @Input() value: string | number | null | undefined = '';\n}\n","import { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { Component, ContentChildren, EventEmitter, Input, Output, QueryList, TemplateRef, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterModule, UrlTree } from '@angular/router';\nimport { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';\nimport { UiSelectComponent, UiSelectOption } from '@maro-tech/form';\nimport { SortDirection, UiTableCellChange, UiTableColumnConfig, UiTableFilter, UiTableResponse, UiTableRowAction } from './ui-table.models';\nimport { UiTableColumnDirective } from './ui-table-column.directive';\nimport { UiTableActionsCellComponent } from './cells/ui-table-actions-cell.component';\nimport { UiTableBadgeCellComponent } from './cells/ui-table-badge-cell.component';\nimport { UiTableEditableCellComponent } from './cells/ui-table-editable-cell.component';\nimport { UiTableImageCellComponent } from './cells/ui-table-image-cell.component';\nimport { UiTableTextCellComponent } from './cells/ui-table-text-cell.component';\n\ntype ConditionToken =\n | { type: 'identifier'; value: string }\n | { type: 'string'; value: string }\n | { type: 'number'; value: number }\n | { type: 'boolean'; value: boolean }\n | { type: 'null'; value: null }\n | { type: 'operator'; value: '==' | '!=' | '===' | '!==' | '&&' | '||' | '!' | '(' | ')' };\n\nconst getConditionPathValue = (source: any, pathRaw: string): any => {\n const path = String(pathRaw || '').trim();\n if (!path) return undefined;\n\n const parts = path.split('.');\n let current = source;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = current[part];\n }\n return current;\n};\n\nconst evaluateCondition = (conditionRaw: string | undefined, context: Record<string, unknown>): boolean => {\n const condition = String(conditionRaw || '').trim();\n if (!condition) return true;\n\n const tokens: ConditionToken[] = [];\n let index = 0;\n\n const pushOperator = (value: ConditionToken['value']): void => {\n tokens.push({ type: 'operator', value } as ConditionToken);\n };\n\n while (index < condition.length) {\n const char = condition[index];\n\n if (/\\s/.test(char)) {\n index += 1;\n continue;\n }\n\n const nextThree = condition.slice(index, index + 3);\n const nextTwo = condition.slice(index, index + 2);\n if (nextThree === '===') {\n pushOperator('===');\n index += 3;\n continue;\n }\n if (nextThree === '!==') {\n pushOperator('!==');\n index += 3;\n continue;\n }\n if (nextTwo === '==') {\n pushOperator('==');\n index += 2;\n continue;\n }\n if (nextTwo === '!=') {\n pushOperator('!=');\n index += 2;\n continue;\n }\n if (nextTwo === '&&') {\n pushOperator('&&');\n index += 2;\n continue;\n }\n if (nextTwo === '||') {\n pushOperator('||');\n index += 2;\n continue;\n }\n if (char === '!' || char === '(' || char === ')') {\n pushOperator(char as ConditionToken['value']);\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n const quote = char;\n index += 1;\n let value = '';\n let escaped = false;\n let closed = false;\n while (index < condition.length) {\n const current = condition[index];\n index += 1;\n if (escaped) {\n value += current;\n escaped = false;\n continue;\n }\n if (current === '\\\\') {\n escaped = true;\n continue;\n }\n if (current === quote) {\n closed = true;\n break;\n }\n value += current;\n }\n if (!closed) return true;\n tokens.push({ type: 'string', value });\n continue;\n }\n if (/[0-9.-]/.test(char)) {\n const match = condition.slice(index).match(/^-?\\d+(?:\\.\\d+)?/);\n if (match) {\n tokens.push({ type: 'number', value: Number(match[0]) });\n index += match[0].length;\n continue;\n }\n }\n if (/[A-Za-z_$]/.test(char)) {\n const match = condition.slice(index).match(/^[A-Za-z_$][A-Za-z0-9_.$-]*/);\n if (match) {\n const raw = match[0];\n const normalized = raw.toLowerCase();\n if (normalized === 'true' || normalized === 'false') {\n tokens.push({ type: 'boolean', value: normalized === 'true' });\n } else if (normalized === 'null') {\n tokens.push({ type: 'null', value: null });\n } else {\n tokens.push({ type: 'identifier', value: raw });\n }\n index += raw.length;\n continue;\n }\n }\n\n return true;\n }\n\n let tokenIndex = 0;\n const peek = (): ConditionToken | undefined => tokens[tokenIndex];\n const consume = (): ConditionToken | undefined => {\n const token = tokens[tokenIndex];\n tokenIndex += 1;\n return token;\n };\n const matchOperator = (...values: Array<ConditionToken['value']>): boolean => {\n const token = peek();\n if (token?.type !== 'operator') return false;\n if (!values.includes(token.value)) return false;\n tokenIndex += 1;\n return true;\n };\n const toBoolean = (value: unknown): boolean => {\n if (typeof value === 'string') return value.trim().length > 0;\n return Boolean(value);\n };\n const getValue = (identifierRaw: string): unknown => {\n const identifier = String(identifierRaw || '').trim();\n if (!identifier) return undefined;\n if (identifier === 'data') return context;\n if (identifier.startsWith('data.')) return getConditionPathValue(context, identifier.slice(5));\n return getConditionPathValue(context, identifier);\n };\n const parseExpression = (): unknown => parseOr();\n const parseOr = (): unknown => {\n let left = parseAnd();\n while (matchOperator('||')) {\n const right = parseAnd();\n left = toBoolean(left) || toBoolean(right);\n }\n return left;\n };\n const parseAnd = (): unknown => {\n let left = parseEquality();\n while (matchOperator('&&')) {\n const right = parseEquality();\n left = toBoolean(left) && toBoolean(right);\n }\n return left;\n };\n const parseEquality = (): unknown => {\n let left = parseUnary();\n while (true) {\n if (matchOperator('==')) {\n left = left == parseUnary();\n continue;\n }\n if (matchOperator('!=')) {\n left = left != parseUnary();\n continue;\n }\n if (matchOperator('===')) {\n left = left === parseUnary();\n continue;\n }\n if (matchOperator('!==')) {\n left = left !== parseUnary();\n continue;\n }\n break;\n }\n return left;\n };\n const parseUnary = (): unknown => {\n if (matchOperator('!')) {\n return !toBoolean(parseUnary());\n }\n return parsePrimary();\n };\n const parsePrimary = (): unknown => {\n const token = consume();\n if (!token) return undefined;\n if (token.type === 'operator' && token.value === '(') {\n const value = parseExpression();\n matchOperator(')');\n return value;\n }\n if (token.type === 'identifier') return getValue(token.value);\n return token.value;\n };\n\n return toBoolean(parseExpression());\n};\n\n@Component({\n selector: 'app-ui-table',\n standalone: true,\n imports: [\n LucideAngularModule,\n CommonModule,\n NgTemplateOutlet,\n UiSelectComponent,\n FormsModule,\n RouterModule,\n UiTableActionsCellComponent,\n UiTableBadgeCellComponent,\n UiTableEditableCellComponent,\n UiTableImageCellComponent,\n UiTableTextCellComponent,\n ],\n templateUrl: './ui-table.component.html',\n})\nexport class UiTableComponent<T> {\n readonly arrowDownIcon = ArrowDown;\n readonly arrowUpIcon = ArrowUp;\n readonly arrowUpDownIcon = ArrowUpDown;\n readonly chevronLeftIcon = ChevronLeft;\n readonly chevronRightIcon = ChevronRight;\n private readonly router = inject(Router);\n readonly columnsSignal = signal<UiTableColumnConfig[]>([]);\n readonly isLoadingSignal = signal(false);\n private _data: UiTableResponse<T> = {\n items: [],\n pagination: { page: 0, pageSize: 10, total: 0 },\n };\n readonly dataSignal = signal<UiTableResponse<T>>(this._data);\n readonly disablePagingSignal = signal(false);\n readonly rowClickableSignal = signal(true);\n\n currentPageIndex = 0;\n currentPageSize = this._data.pagination.pageSize;\n currentSortField = '';\n currentSortDirection: SortDirection = '';\n\n get currentSortIcon() {\n return this.currentSortDirection === 'asc' ? this.arrowUpIcon : this.arrowDownIcon;\n }\n readonly pageSizeOptions = [5, 10, 20];\n readonly pageSizeSelectOptions: UiSelectOption[] = this.pageSizeOptions.map((size) => ({\n label: String(size),\n value: String(size),\n }));\n\n @ContentChildren(UiTableColumnDirective)\n columnTemplates!: QueryList<UiTableColumnDirective>;\n\n @Input()\n set columns(value: UiTableColumnConfig[]) {\n this.columnsSignal.set(value ?? []);\n }\n\n @Input()\n set isLoading(value: boolean) {\n this.isLoadingSignal.set(!!value);\n }\n\n @Input()\n set data(value: UiTableResponse<T>) {\n const normalized = value ?? {\n items: [],\n pagination: { page: 0, pageSize: this.currentPageSize, total: 0 },\n };\n this._data = normalized;\n this.currentPageIndex = normalized.pagination.page ?? this.currentPageIndex;\n this.currentPageSize = normalized.pagination.pageSize ?? this.currentPageSize;\n this.dataSignal.set(normalized);\n this.ensurePageIndexInRange();\n }\n\n get data(): UiTableResponse<T> {\n return this._data;\n }\n\n @Input()\n set disablePaging(value: boolean) {\n this.disablePagingSignal.set(!!value);\n }\n\n get disablePaging(): boolean {\n return this.disablePagingSignal();\n }\n\n @Input()\n set rowClickable(value: boolean) {\n this.rowClickableSignal.set(!!value);\n }\n\n get rowClickable(): boolean {\n return this.rowClickableSignal();\n }\n\n @Input() imageResolver: (value: unknown, row?: T) => string = (value) => {\n const raw = String(value ?? '').trim();\n if (!raw) return '';\n if (raw.startsWith('http://') || raw.startsWith('https://') || raw.startsWith('/')) return raw;\n return `/api/files/${encodeURIComponent(raw)}/preview?scale=25`;\n };\n\n @Output() pageChange = new EventEmitter<UiTableFilter>();\n @Output() rowClick = new EventEmitter<T>();\n @Output() actionClick = new EventEmitter<{ action: UiTableRowAction; row: T }>();\n @Output() cellChange = new EventEmitter<UiTableCellChange<T>>();\n\n get totalPages(): number {\n const total = this.dataSignal().pagination.total ?? this.dataSignal().items.length ?? 0;\n const perPage = this.currentPageSize || 1;\n return Math.max(1, Math.ceil(total / perPage));\n }\n\n get totalCount(): number {\n return this.dataSignal().pagination.total ?? this.dataSignal().items.length ?? 0;\n }\n\n get visibleColumnCount(): number {\n return Math.max(1, this.columnsSignal().length + (this.hasAnyRowActions() ? 1 : 0));\n }\n\n get startItemIndex(): number {\n if (this.totalCount === 0) {\n return 0;\n }\n return this.currentPageIndex * this.currentPageSize + 1;\n }\n\n get endItemIndex(): number {\n if (this.totalCount === 0) {\n return 0;\n }\n return Math.min((this.currentPageIndex + 1) * this.currentPageSize, this.totalCount);\n }\n\n get visiblePageNumbers(): number[] {\n const pages: number[] = [];\n const maxButtons = 5;\n const total = this.totalPages;\n if (total <= maxButtons) {\n for (let i = 0; i < total; i += 1) {\n pages.push(i);\n }\n return pages;\n }\n\n let start = Math.max(0, this.currentPageIndex - Math.floor(maxButtons / 2));\n const maxStart = total - maxButtons;\n if (start > maxStart) {\n start = maxStart;\n }\n for (let i = 0; i < maxButtons; i += 1) {\n pages.push(start + i);\n }\n return pages;\n }\n\n toggleSort(column: UiTableColumnConfig): void {\n if (!column?.key || column.sortable === false) {\n return;\n }\n\n if (this.currentSortField === column.key) {\n if (this.currentSortDirection === 'asc') {\n this.currentSortDirection = 'desc';\n } else if (this.currentSortDirection === 'desc') {\n this.currentSortDirection = '';\n this.currentSortField = '';\n } else {\n this.currentSortDirection = 'asc';\n }\n } else {\n this.currentSortField = column.key;\n this.currentSortDirection = 'asc';\n }\n\n this.currentPageIndex = 0;\n this.emitPageChange();\n }\n\n changePage(index: number): void {\n const target = Math.max(0, Math.min(this.totalPages - 1, index));\n if (target === this.currentPageIndex) {\n return;\n }\n this.currentPageIndex = target;\n this.emitPageChange();\n }\n\n onPageSizeChange(pageSize: number | string): void {\n const numericSize = Number(pageSize);\n if (!numericSize || numericSize === this.currentPageSize) {\n return;\n }\n this.currentPageSize = numericSize;\n this.currentPageIndex = 0;\n this.ensurePageIndexInRange();\n this.emitPageChange();\n }\n\n processRowClick(rowData: T): void {\n this.rowClick.emit(rowData);\n }\n\n processActionClick(action: UiTableRowAction, rowData: T): void {\n if (action.disabled) return;\n this.actionClick.emit({ action, row: rowData });\n }\n\n processCellChange(column: UiTableColumnConfig, rowData: T, value: unknown): void {\n const currentValue = this.getCellValue(rowData, column.bindKey || column.key);\n if (this.normalizeCellValue(currentValue) === this.normalizeCellValue(value)) {\n return;\n }\n\n this.cellChange.emit({ column, row: rowData, value });\n }\n\n hasAnyRowActions(): boolean {\n return this.dataSignal().items.some((row) => this.getRowActions(row).length > 0);\n }\n\n getRowActions(row: T): UiTableRowAction[] {\n const raw = (row as Record<string, unknown>)['actions'];\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw\n .filter((item): item is UiTableRowAction => !!item && typeof item === 'object' && typeof (item as UiTableRowAction).id === 'string')\n .filter((item) => evaluateCondition(item.condition, row as unknown as Record<string, unknown>))\n .map((item) => ({\n id: item.id,\n label: typeof item.label === 'string' ? item.label : item.id,\n variant: item.variant,\n icon: typeof item.icon === 'string' ? item.icon : undefined,\n type: item.type,\n component: item.component,\n template: typeof item.template === 'string' ? item.template : undefined,\n disabled: !!item.disabled,\n api: typeof item.api === 'string' ? item.api : undefined,\n formId: typeof item.formId === 'string' ? item.formId : undefined,\n title: typeof item.title === 'string' ? item.title : undefined,\n text: typeof item.text === 'string' ? item.text : undefined,\n submit: typeof item.submit === 'string' || typeof item.submit === 'boolean' ? item.submit : undefined,\n danger: typeof item.danger === 'boolean' ? item.danger : undefined,\n method: item.method,\n payload: item.payload && typeof item.payload === 'object' && !Array.isArray(item.payload) ? item.payload : undefined,\n }));\n }\n\n getTemplateForColumn(column: string): TemplateRef<unknown> | undefined {\n return this.columnTemplates?.find((template) => template.columnName === column)?.template;\n }\n\n trackTableRow(index: number): number {\n return index;\n }\n\n trackPageNumber(_: number, pageIndex: number): number {\n return pageIndex;\n }\n\n getCellValue(row: T, column: string): unknown {\n return (row as Record<string, unknown>)[column];\n }\n\n isEditableColumn(row: T, column: UiTableColumnConfig): boolean {\n const context = row as Record<string, unknown>;\n return evaluateCondition(column.editableCondition, context);\n }\n\n resolveDisplayValue(row: T, column: UiTableColumnConfig): string {\n const rawValue = this.getCellValue(row, column.bindKey || column.key);\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return '—';\n }\n\n if (column.editor === 'select') {\n const value = String(rawValue).trim();\n const option = (column.options || []).find((item) => String(item.value ?? '').trim() === value);\n return String(option?.label || rawValue).trim() || '—';\n }\n\n return String(rawValue);\n }\n\n resolveLink(row: T, column: UiTableColumnConfig): string {\n const source = row as Record<string, unknown>;\n const linkConfig = column.link;\n const template = typeof linkConfig === 'string'\n ? linkConfig.trim()\n : String(linkConfig?.values[this.resolveLinkValue(source, linkConfig.by)] || '').trim();\n if (!template) return '';\n\n let hasMissingValue = false;\n const link = template.replace(/\\{([a-zA-Z0-9_.]+)\\}/g, (_match, key: string) => {\n const value = key.split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n if (value == null || value === '') {\n hasMissingValue = true;\n return '';\n }\n return encodeURIComponent(String(value));\n });\n\n return hasMissingValue ? '' : link;\n }\n\n resolveLinkTree(row: T, column: UiTableColumnConfig): UrlTree | null {\n const link = this.resolveLink(row, column);\n return link ? this.router.parseUrl(link) : null;\n }\n\n private resolveLinkValue(source: Record<string, unknown>, path: string): string {\n const value = path.split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n return value == null ? '' : String(value).trim();\n }\n\n resolveEditableValue(row: T, column: UiTableColumnConfig): string | number | null {\n const value = this.getCellValue(row, column.bindKey || column.key);\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n if (column.editor === 'number' || column.inputType === 'number') {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n return String(value);\n }\n\n resolveEditableInputType(column: UiTableColumnConfig): 'text' | 'number' {\n return column.editor === 'number' || column.inputType === 'number' ? 'number' : 'text';\n }\n\n private normalizeCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return String(value).trim();\n }\n\n resolveColumnWidth(column: UiTableColumnConfig): string | undefined {\n if (column.width == null || column.width === '') {\n return '500px';\n }\n\n if (typeof column.width === 'number') {\n return `${Math.max(1, Math.round(column.width))}px`;\n }\n\n return String(column.width).trim() || '500px';\n }\n\n resolveImageSrc(value: unknown, row?: T): string {\n return this.imageResolver(value, row);\n }\n\n private emitPageChange(): void {\n this.pageChange.emit({\n pageIndex: this.currentPageIndex,\n pageSize: this.currentPageSize,\n active: this.currentSortField,\n direction: this.currentSortDirection,\n });\n }\n\n private ensurePageIndexInRange(): void {\n if (this.currentPageIndex >= this.totalPages) {\n this.currentPageIndex = Math.max(0, this.totalPages - 1);\n }\n }\n}\n","<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n Дії\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n Немає даних\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>Рядків на сторінці</span>\n <forms-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></forms-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { UiSelectComponent, UiSelectOption } from '@maro-tech/form';\nimport { ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';\n\ntype PaginationItem = number | 'ellipsis';\n\n@Component({\n selector: 'app-ui-paginator',\n standalone: true,\n imports: [CommonModule, FormsModule, UiSelectComponent, LucideAngularModule],\n templateUrl: './ui-paginator.component.html',\n})\nexport class UiPaginatorComponent {\n readonly chevronLeftIcon = ChevronLeft;\n readonly chevronRightIcon = ChevronRight;\n @Input() pageIndex = 0;\n @Input() pageSize = 10;\n @Input() total = 0;\n @Input() pageSizeOptions: number[] = [5, 10, 20];\n\n @Output() pageChange = new EventEmitter<number>();\n @Output() pageSizeChange = new EventEmitter<number>();\n\n get totalPages(): number {\n const perPage = this.pageSize || 1;\n return Math.max(1, Math.ceil((this.total || 0) / perPage));\n }\n\n get startItemIndex(): number {\n if (!this.total) return 0;\n return this.pageIndex * this.pageSize + 1;\n }\n\n get endItemIndex(): number {\n if (!this.total) return 0;\n return Math.min((this.pageIndex + 1) * this.pageSize, this.total);\n }\n\n get selectOptions(): UiSelectOption[] {\n return this.pageSizeOptions.map((size) => ({ label: String(size), value: String(size) }));\n }\n\n get paginationItems(): PaginationItem[] {\n const total = this.totalPages;\n if (total <= 7) {\n return Array.from({ length: total }, (_value, index) => index);\n }\n\n const items: PaginationItem[] = [0];\n const start = Math.max(1, this.pageIndex - 1);\n const end = Math.min(total - 2, this.pageIndex + 1);\n\n if (start > 1) {\n items.push('ellipsis');\n }\n\n for (let page = start; page <= end; page++) {\n items.push(page);\n }\n\n if (end < total - 2) {\n items.push('ellipsis');\n }\n\n items.push(total - 1);\n return items;\n }\n\n onPageSizeModelChange(value: string | number): void {\n const numeric = Number(value);\n if (!numeric || numeric === this.pageSize) return;\n this.pageSizeChange.emit(numeric);\n }\n\n changePage(nextIndex: number): void {\n const clamped = Math.max(0, Math.min(this.totalPages - 1, nextIndex));\n if (clamped === this.pageIndex) return;\n this.pageChange.emit(clamped);\n }\n}\n","<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <forms-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></forms-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"Назад\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">Назад</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">•••</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"Далі\"\n >\n <span class=\"sr-only\">Далі</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i2"],"mappings":"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"}
1
+ {"version":3,"file":"maro-tech-table.mjs","sources":["../../../src/lib/table/ui-table-column.directive.ts","../../../src/lib/table/cells/ui-table-actions-cell.component.ts","../../../src/lib/table/cells/ui-table-badge-cell.component.ts","../../../src/lib/table/cells/ui-table-editable-cell.component.ts","../../../src/lib/table/cells/ui-table-image-cell.component.ts","../../../src/lib/table/cells/ui-table-text-cell.component.ts","../../../src/lib/table/ui-table.component.ts","../../../src/lib/table/ui-table.component.html","../../../src/lib/paginator/ui-paginator.component.ts","../../../src/lib/paginator/ui-paginator.component.html","../../../src/maro-tech-table.ts"],"sourcesContent":["import { Directive, Input, TemplateRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[appUiTableColumn]',\n standalone: true,\n})\nexport class UiTableColumnDirective {\n @Input('appUiTableColumn') columnName!: string;\n public readonly template = inject(TemplateRef<unknown>);\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiTableRowAction } from '../ui-table.models';\n\n@Component({\n selector: 'app-ui-table-actions-cell',\n standalone: true,\n imports: [UiButtonComponent],\n template: `\n <div class=\"flex flex-wrap gap-2\" (click)=\"$event.stopPropagation()\">\n @for (action of actions; track action.id) {\n <ui-button\n [variant]=\"action.variant || 'ghost'\"\n [icon]=\"action.icon || ''\"\n [iconOnly]=\"isIconOnlyAction(action)\"\n [ariaLabel]=\"resolveAriaLabel(action)\"\n size=\"sm\"\n type=\"button\"\n [disabled]=\"action.disabled || false\"\n (click)=\"onActionClick($event, action)\"\n >\n @if (action.label?.trim()) {\n {{ action.label }}\n }\n </ui-button>\n }\n </div>\n `,\n})\nexport class UiTableActionsCellComponent<T = Record<string, unknown>> {\n @Input() actions: UiTableRowAction[] = [];\n @Input({ required: true }) row!: T;\n\n @Output() actionClick = new EventEmitter<{ action: UiTableRowAction; row: T }>();\n\n onActionClick(event: Event, action: UiTableRowAction): void {\n event.stopPropagation();\n if (action.disabled) return;\n this.actionClick.emit({ action, row: this.row });\n }\n\n isIconOnlyAction(action: UiTableRowAction): boolean {\n return !String(action.label || '').trim();\n }\n\n resolveAriaLabel(action: UiTableRowAction): string {\n return String(action.label?.trim() || (action.id === 'edit' ? 'Редагувати' : action.id === 'delete' ? 'Видалити' : action.id));\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { UiBadgeComponent } from '@maro-tech/core';\n\n@Component({\n selector: 'app-ui-table-badge-cell',\n standalone: true,\n imports: [UiBadgeComponent],\n template: `\n @if (value === null || value === undefined || value === '') {\n —\n } @else {\n <ui-badge variant=\"neutral\">\n {{ value }}\n </ui-badge>\n }\n `,\n})\nexport class UiTableBadgeCellComponent {\n @Input() value: string | number | null | undefined = '';\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { InputSelectComponent } from '@maro-tech/form';\nimport { UiTableColumnConfig } from '../ui-table.models';\n\n@Component({\n selector: 'app-ui-table-editable-cell',\n standalone: true,\n imports: [FormsModule, InputSelectComponent],\n template: `\n <div class=\"min-w-0\" (click)=\"$event.stopPropagation()\">\n @if (column.editor === 'select') {\n <input-select\n [options]=\"column.options || []\"\n [includeBlankOption]=\"column.includeBlankOption ?? true\"\n [blankOptionLabel]=\"column.blankOptionLabel || 'Оберіть значення'\"\n [searchable]=\"true\"\n [fullWidth]=\"true\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (valueChange)=\"valueChange.emit($event)\"\n ></input-select>\n } @else {\n <input\n class=\"w-full rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm text-slate-800 outline-none transition focus:border-slate-400\"\n [type]=\"inputType\"\n [placeholder]=\"column.placeholder || ''\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"valueChange.emit($event)\"\n />\n }\n </div>\n `,\n})\nexport class UiTableEditableCellComponent {\n @Input({ required: true }) column!: UiTableColumnConfig;\n @Input() value: string | number | null = null;\n @Input() inputType: 'text' | 'number' = 'text';\n\n @Output() valueChange = new EventEmitter<unknown>();\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-ui-table-image-cell',\n standalone: true,\n imports: [],\n template: `\n @if (src) {\n <span class=\"block\">\n <img [src]=\"src\" [alt]=\"alt\" class=\"h-10 w-10 rounded-lg border border-slate-200 object-cover transition hover:opacity-80\" />\n </span>\n } @else {\n <span class=\"text-slate-400\">—</span>\n }\n\n `,\n})\nexport class UiTableImageCellComponent {\n @Input() src = '';\n @Input() alt = '';\n\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-ui-table-text-cell',\n standalone: true,\n template: `\n <span class=\"block whitespace-normal break-words\">\n @if (value === null || value === undefined || value === '') {\n —\n } @else {\n {{ value }}\n }\n </span>\n `,\n})\nexport class UiTableTextCellComponent {\n @Input() value: string | number | null | undefined = '';\n}\n","import { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { Component, ContentChildren, EventEmitter, Input, Output, QueryList, TemplateRef, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterModule, UrlTree } from '@angular/router';\nimport { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';\nimport { InputSelectComponent, UiSelectOption } from '@maro-tech/form';\nimport { SortDirection, UiTableCellChange, UiTableColumnConfig, UiTableFilter, UiTableResponse, UiTableRowAction } from './ui-table.models';\nimport { UiTableColumnDirective } from './ui-table-column.directive';\nimport { UiTableActionsCellComponent } from './cells/ui-table-actions-cell.component';\nimport { UiTableBadgeCellComponent } from './cells/ui-table-badge-cell.component';\nimport { UiTableEditableCellComponent } from './cells/ui-table-editable-cell.component';\nimport { UiTableImageCellComponent } from './cells/ui-table-image-cell.component';\nimport { UiTableTextCellComponent } from './cells/ui-table-text-cell.component';\n\ntype ConditionToken =\n | { type: 'identifier'; value: string }\n | { type: 'string'; value: string }\n | { type: 'number'; value: number }\n | { type: 'boolean'; value: boolean }\n | { type: 'null'; value: null }\n | { type: 'operator'; value: '==' | '!=' | '===' | '!==' | '&&' | '||' | '!' | '(' | ')' };\n\nconst getConditionPathValue = (source: any, pathRaw: string): any => {\n const path = String(pathRaw || '').trim();\n if (!path) return undefined;\n\n const parts = path.split('.');\n let current = source;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = current[part];\n }\n return current;\n};\n\nconst evaluateCondition = (conditionRaw: string | undefined, context: Record<string, unknown>): boolean => {\n const condition = String(conditionRaw || '').trim();\n if (!condition) return true;\n\n const tokens: ConditionToken[] = [];\n let index = 0;\n\n const pushOperator = (value: ConditionToken['value']): void => {\n tokens.push({ type: 'operator', value } as ConditionToken);\n };\n\n while (index < condition.length) {\n const char = condition[index];\n\n if (/\\s/.test(char)) {\n index += 1;\n continue;\n }\n\n const nextThree = condition.slice(index, index + 3);\n const nextTwo = condition.slice(index, index + 2);\n if (nextThree === '===') {\n pushOperator('===');\n index += 3;\n continue;\n }\n if (nextThree === '!==') {\n pushOperator('!==');\n index += 3;\n continue;\n }\n if (nextTwo === '==') {\n pushOperator('==');\n index += 2;\n continue;\n }\n if (nextTwo === '!=') {\n pushOperator('!=');\n index += 2;\n continue;\n }\n if (nextTwo === '&&') {\n pushOperator('&&');\n index += 2;\n continue;\n }\n if (nextTwo === '||') {\n pushOperator('||');\n index += 2;\n continue;\n }\n if (char === '!' || char === '(' || char === ')') {\n pushOperator(char as ConditionToken['value']);\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n const quote = char;\n index += 1;\n let value = '';\n let escaped = false;\n let closed = false;\n while (index < condition.length) {\n const current = condition[index];\n index += 1;\n if (escaped) {\n value += current;\n escaped = false;\n continue;\n }\n if (current === '\\\\') {\n escaped = true;\n continue;\n }\n if (current === quote) {\n closed = true;\n break;\n }\n value += current;\n }\n if (!closed) return true;\n tokens.push({ type: 'string', value });\n continue;\n }\n if (/[0-9.-]/.test(char)) {\n const match = condition.slice(index).match(/^-?\\d+(?:\\.\\d+)?/);\n if (match) {\n tokens.push({ type: 'number', value: Number(match[0]) });\n index += match[0].length;\n continue;\n }\n }\n if (/[A-Za-z_$]/.test(char)) {\n const match = condition.slice(index).match(/^[A-Za-z_$][A-Za-z0-9_.$-]*/);\n if (match) {\n const raw = match[0];\n const normalized = raw.toLowerCase();\n if (normalized === 'true' || normalized === 'false') {\n tokens.push({ type: 'boolean', value: normalized === 'true' });\n } else if (normalized === 'null') {\n tokens.push({ type: 'null', value: null });\n } else {\n tokens.push({ type: 'identifier', value: raw });\n }\n index += raw.length;\n continue;\n }\n }\n\n return true;\n }\n\n let tokenIndex = 0;\n const peek = (): ConditionToken | undefined => tokens[tokenIndex];\n const consume = (): ConditionToken | undefined => {\n const token = tokens[tokenIndex];\n tokenIndex += 1;\n return token;\n };\n const matchOperator = (...values: Array<ConditionToken['value']>): boolean => {\n const token = peek();\n if (token?.type !== 'operator') return false;\n if (!values.includes(token.value)) return false;\n tokenIndex += 1;\n return true;\n };\n const toBoolean = (value: unknown): boolean => {\n if (typeof value === 'string') return value.trim().length > 0;\n return Boolean(value);\n };\n const getValue = (identifierRaw: string): unknown => {\n const identifier = String(identifierRaw || '').trim();\n if (!identifier) return undefined;\n if (identifier === 'data') return context;\n if (identifier.startsWith('data.')) return getConditionPathValue(context, identifier.slice(5));\n return getConditionPathValue(context, identifier);\n };\n const parseExpression = (): unknown => parseOr();\n const parseOr = (): unknown => {\n let left = parseAnd();\n while (matchOperator('||')) {\n const right = parseAnd();\n left = toBoolean(left) || toBoolean(right);\n }\n return left;\n };\n const parseAnd = (): unknown => {\n let left = parseEquality();\n while (matchOperator('&&')) {\n const right = parseEquality();\n left = toBoolean(left) && toBoolean(right);\n }\n return left;\n };\n const parseEquality = (): unknown => {\n let left = parseUnary();\n while (true) {\n if (matchOperator('==')) {\n left = left == parseUnary();\n continue;\n }\n if (matchOperator('!=')) {\n left = left != parseUnary();\n continue;\n }\n if (matchOperator('===')) {\n left = left === parseUnary();\n continue;\n }\n if (matchOperator('!==')) {\n left = left !== parseUnary();\n continue;\n }\n break;\n }\n return left;\n };\n const parseUnary = (): unknown => {\n if (matchOperator('!')) {\n return !toBoolean(parseUnary());\n }\n return parsePrimary();\n };\n const parsePrimary = (): unknown => {\n const token = consume();\n if (!token) return undefined;\n if (token.type === 'operator' && token.value === '(') {\n const value = parseExpression();\n matchOperator(')');\n return value;\n }\n if (token.type === 'identifier') return getValue(token.value);\n return token.value;\n };\n\n return toBoolean(parseExpression());\n};\n\n@Component({\n selector: 'app-ui-table',\n standalone: true,\n imports: [\n LucideAngularModule,\n CommonModule,\n NgTemplateOutlet,\n InputSelectComponent,\n FormsModule,\n RouterModule,\n UiTableActionsCellComponent,\n UiTableBadgeCellComponent,\n UiTableEditableCellComponent,\n UiTableImageCellComponent,\n UiTableTextCellComponent,\n ],\n templateUrl: './ui-table.component.html',\n})\nexport class UiTableComponent<T> {\n readonly arrowDownIcon = ArrowDown;\n readonly arrowUpIcon = ArrowUp;\n readonly arrowUpDownIcon = ArrowUpDown;\n readonly chevronLeftIcon = ChevronLeft;\n readonly chevronRightIcon = ChevronRight;\n private readonly router = inject(Router);\n readonly columnsSignal = signal<UiTableColumnConfig[]>([]);\n readonly isLoadingSignal = signal(false);\n private _data: UiTableResponse<T> = {\n items: [],\n pagination: { page: 0, pageSize: 10, total: 0 },\n };\n readonly dataSignal = signal<UiTableResponse<T>>(this._data);\n readonly disablePagingSignal = signal(false);\n readonly rowClickableSignal = signal(true);\n\n currentPageIndex = 0;\n currentPageSize = this._data.pagination.pageSize;\n currentSortField = '';\n currentSortDirection: SortDirection = '';\n\n get currentSortIcon() {\n return this.currentSortDirection === 'asc' ? this.arrowUpIcon : this.arrowDownIcon;\n }\n readonly pageSizeOptions = [5, 10, 20];\n readonly pageSizeSelectOptions: UiSelectOption[] = this.pageSizeOptions.map((size) => ({\n label: String(size),\n value: String(size),\n }));\n\n @ContentChildren(UiTableColumnDirective)\n columnTemplates!: QueryList<UiTableColumnDirective>;\n\n @Input()\n set columns(value: UiTableColumnConfig[]) {\n this.columnsSignal.set(value ?? []);\n }\n\n @Input()\n set isLoading(value: boolean) {\n this.isLoadingSignal.set(!!value);\n }\n\n @Input()\n set data(value: UiTableResponse<T>) {\n const normalized = value ?? {\n items: [],\n pagination: { page: 0, pageSize: this.currentPageSize, total: 0 },\n };\n this._data = normalized;\n this.currentPageIndex = normalized.pagination.page ?? this.currentPageIndex;\n this.currentPageSize = normalized.pagination.pageSize ?? this.currentPageSize;\n this.dataSignal.set(normalized);\n this.ensurePageIndexInRange();\n }\n\n get data(): UiTableResponse<T> {\n return this._data;\n }\n\n @Input()\n set disablePaging(value: boolean) {\n this.disablePagingSignal.set(!!value);\n }\n\n get disablePaging(): boolean {\n return this.disablePagingSignal();\n }\n\n @Input()\n set rowClickable(value: boolean) {\n this.rowClickableSignal.set(!!value);\n }\n\n get rowClickable(): boolean {\n return this.rowClickableSignal();\n }\n\n @Input() imageResolver: (value: unknown, row?: T) => string = (value) => {\n const raw = String(value ?? '').trim();\n if (!raw) return '';\n if (raw.startsWith('http://') || raw.startsWith('https://') || raw.startsWith('/')) return raw;\n return `/api/files/${encodeURIComponent(raw)}/preview?scale=25`;\n };\n\n @Output() pageChange = new EventEmitter<UiTableFilter>();\n @Output() rowClick = new EventEmitter<T>();\n @Output() actionClick = new EventEmitter<{ action: UiTableRowAction; row: T }>();\n @Output() cellChange = new EventEmitter<UiTableCellChange<T>>();\n\n get totalPages(): number {\n const total = this.dataSignal().pagination.total ?? this.dataSignal().items.length ?? 0;\n const perPage = this.currentPageSize || 1;\n return Math.max(1, Math.ceil(total / perPage));\n }\n\n get totalCount(): number {\n return this.dataSignal().pagination.total ?? this.dataSignal().items.length ?? 0;\n }\n\n get visibleColumnCount(): number {\n return Math.max(1, this.columnsSignal().length + (this.hasAnyRowActions() ? 1 : 0));\n }\n\n get startItemIndex(): number {\n if (this.totalCount === 0) {\n return 0;\n }\n return this.currentPageIndex * this.currentPageSize + 1;\n }\n\n get endItemIndex(): number {\n if (this.totalCount === 0) {\n return 0;\n }\n return Math.min((this.currentPageIndex + 1) * this.currentPageSize, this.totalCount);\n }\n\n get visiblePageNumbers(): number[] {\n const pages: number[] = [];\n const maxButtons = 5;\n const total = this.totalPages;\n if (total <= maxButtons) {\n for (let i = 0; i < total; i += 1) {\n pages.push(i);\n }\n return pages;\n }\n\n let start = Math.max(0, this.currentPageIndex - Math.floor(maxButtons / 2));\n const maxStart = total - maxButtons;\n if (start > maxStart) {\n start = maxStart;\n }\n for (let i = 0; i < maxButtons; i += 1) {\n pages.push(start + i);\n }\n return pages;\n }\n\n toggleSort(column: UiTableColumnConfig): void {\n if (!column?.key || column.sortable === false) {\n return;\n }\n\n if (this.currentSortField === column.key) {\n if (this.currentSortDirection === 'asc') {\n this.currentSortDirection = 'desc';\n } else if (this.currentSortDirection === 'desc') {\n this.currentSortDirection = '';\n this.currentSortField = '';\n } else {\n this.currentSortDirection = 'asc';\n }\n } else {\n this.currentSortField = column.key;\n this.currentSortDirection = 'asc';\n }\n\n this.currentPageIndex = 0;\n this.emitPageChange();\n }\n\n changePage(index: number): void {\n const target = Math.max(0, Math.min(this.totalPages - 1, index));\n if (target === this.currentPageIndex) {\n return;\n }\n this.currentPageIndex = target;\n this.emitPageChange();\n }\n\n onPageSizeChange(pageSize: number | string): void {\n const numericSize = Number(pageSize);\n if (!numericSize || numericSize === this.currentPageSize) {\n return;\n }\n this.currentPageSize = numericSize;\n this.currentPageIndex = 0;\n this.ensurePageIndexInRange();\n this.emitPageChange();\n }\n\n processRowClick(rowData: T): void {\n this.rowClick.emit(rowData);\n }\n\n processActionClick(action: UiTableRowAction, rowData: T): void {\n if (action.disabled) return;\n this.actionClick.emit({ action, row: rowData });\n }\n\n processCellChange(column: UiTableColumnConfig, rowData: T, value: unknown): void {\n const currentValue = this.getCellValue(rowData, column.bindKey || column.key);\n if (this.normalizeCellValue(currentValue) === this.normalizeCellValue(value)) {\n return;\n }\n\n this.cellChange.emit({ column, row: rowData, value });\n }\n\n hasAnyRowActions(): boolean {\n return this.dataSignal().items.some((row) => this.getRowActions(row).length > 0);\n }\n\n getRowActions(row: T): UiTableRowAction[] {\n const raw = (row as Record<string, unknown>)['actions'];\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw\n .filter((item): item is UiTableRowAction => !!item && typeof item === 'object' && typeof (item as UiTableRowAction).id === 'string')\n .filter((item) => evaluateCondition(item.condition, row as unknown as Record<string, unknown>))\n .map((item) => ({\n id: item.id,\n label: typeof item.label === 'string' ? item.label : item.id,\n variant: item.variant,\n icon: typeof item.icon === 'string' ? item.icon : undefined,\n type: item.type,\n component: item.component,\n template: typeof item.template === 'string' ? item.template : undefined,\n disabled: !!item.disabled,\n api: typeof item.api === 'string' ? item.api : undefined,\n formId: typeof item.formId === 'string' ? item.formId : undefined,\n title: typeof item.title === 'string' ? item.title : undefined,\n text: typeof item.text === 'string' ? item.text : undefined,\n submit: typeof item.submit === 'string' || typeof item.submit === 'boolean' ? item.submit : undefined,\n danger: typeof item.danger === 'boolean' ? item.danger : undefined,\n method: item.method,\n payload: item.payload && typeof item.payload === 'object' && !Array.isArray(item.payload) ? item.payload : undefined,\n }));\n }\n\n getTemplateForColumn(column: string): TemplateRef<unknown> | undefined {\n return this.columnTemplates?.find((template) => template.columnName === column)?.template;\n }\n\n trackTableRow(index: number): number {\n return index;\n }\n\n trackPageNumber(_: number, pageIndex: number): number {\n return pageIndex;\n }\n\n getCellValue(row: T, column: string): unknown {\n return (row as Record<string, unknown>)[column];\n }\n\n isEditableColumn(row: T, column: UiTableColumnConfig): boolean {\n const context = row as Record<string, unknown>;\n return evaluateCondition(column.editableCondition, context);\n }\n\n resolveDisplayValue(row: T, column: UiTableColumnConfig): string {\n const rawValue = this.getCellValue(row, column.bindKey || column.key);\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return '—';\n }\n\n if (column.editor === 'select') {\n const value = String(rawValue).trim();\n const option = (column.options || []).find((item) => String(item.value ?? '').trim() === value);\n return String(option?.label || rawValue).trim() || '—';\n }\n\n return String(rawValue);\n }\n\n resolveLink(row: T, column: UiTableColumnConfig): string {\n const source = row as Record<string, unknown>;\n const linkConfig = column.link;\n const template = typeof linkConfig === 'string'\n ? linkConfig.trim()\n : String(linkConfig?.values[this.resolveLinkValue(source, linkConfig.by)] || '').trim();\n if (!template) return '';\n\n let hasMissingValue = false;\n const link = template.replace(/\\{([a-zA-Z0-9_.]+)\\}/g, (_match, key: string) => {\n const value = key.split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n if (value == null || value === '') {\n hasMissingValue = true;\n return '';\n }\n return encodeURIComponent(String(value));\n });\n\n return hasMissingValue ? '' : link;\n }\n\n resolveLinkTree(row: T, column: UiTableColumnConfig): UrlTree | null {\n const link = this.resolveLink(row, column);\n return link ? this.router.parseUrl(link) : null;\n }\n\n private resolveLinkValue(source: Record<string, unknown>, path: string): string {\n const value = path.split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n return value == null ? '' : String(value).trim();\n }\n\n resolveEditableValue(row: T, column: UiTableColumnConfig): string | number | null {\n const value = this.getCellValue(row, column.bindKey || column.key);\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n if (column.editor === 'number' || column.inputType === 'number') {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n return String(value);\n }\n\n resolveEditableInputType(column: UiTableColumnConfig): 'text' | 'number' {\n return column.editor === 'number' || column.inputType === 'number' ? 'number' : 'text';\n }\n\n private normalizeCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return String(value).trim();\n }\n\n resolveColumnWidth(column: UiTableColumnConfig): string | undefined {\n if (column.width == null || column.width === '') {\n return undefined;\n }\n\n if (typeof column.width === 'number') {\n return `${Math.max(1, Math.round(column.width))}px`;\n }\n\n return String(column.width).trim() || undefined;\n }\n\n resolveImageSrc(value: unknown, row?: T): string {\n return this.imageResolver(value, row);\n }\n\n private emitPageChange(): void {\n this.pageChange.emit({\n pageIndex: this.currentPageIndex,\n pageSize: this.currentPageSize,\n active: this.currentSortField,\n direction: this.currentSortDirection,\n });\n }\n\n private ensurePageIndexInRange(): void {\n if (this.currentPageIndex >= this.totalPages) {\n this.currentPageIndex = Math.max(0, this.totalPages - 1);\n }\n }\n}\n","<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n Дії\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n Немає даних\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>Рядків на сторінці</span>\n <input-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></input-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { InputSelectComponent, UiSelectOption } from '@maro-tech/form';\nimport { ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';\n\ntype PaginationItem = number | 'ellipsis';\n\n@Component({\n selector: 'app-ui-paginator',\n standalone: true,\n imports: [CommonModule, FormsModule, InputSelectComponent, LucideAngularModule],\n templateUrl: './ui-paginator.component.html',\n})\nexport class UiPaginatorComponent {\n readonly chevronLeftIcon = ChevronLeft;\n readonly chevronRightIcon = ChevronRight;\n @Input() pageIndex = 0;\n @Input() pageSize = 10;\n @Input() total = 0;\n @Input() pageSizeOptions: number[] = [5, 10, 20];\n\n @Output() pageChange = new EventEmitter<number>();\n @Output() pageSizeChange = new EventEmitter<number>();\n\n get totalPages(): number {\n const perPage = this.pageSize || 1;\n return Math.max(1, Math.ceil((this.total || 0) / perPage));\n }\n\n get startItemIndex(): number {\n if (!this.total) return 0;\n return this.pageIndex * this.pageSize + 1;\n }\n\n get endItemIndex(): number {\n if (!this.total) return 0;\n return Math.min((this.pageIndex + 1) * this.pageSize, this.total);\n }\n\n get selectOptions(): UiSelectOption[] {\n return this.pageSizeOptions.map((size) => ({ label: String(size), value: String(size) }));\n }\n\n get paginationItems(): PaginationItem[] {\n const total = this.totalPages;\n if (total <= 7) {\n return Array.from({ length: total }, (_value, index) => index);\n }\n\n const items: PaginationItem[] = [0];\n const start = Math.max(1, this.pageIndex - 1);\n const end = Math.min(total - 2, this.pageIndex + 1);\n\n if (start > 1) {\n items.push('ellipsis');\n }\n\n for (let page = start; page <= end; page++) {\n items.push(page);\n }\n\n if (end < total - 2) {\n items.push('ellipsis');\n }\n\n items.push(total - 1);\n return items;\n }\n\n onPageSizeModelChange(value: string | number): void {\n const numeric = Number(value);\n if (!numeric || numeric === this.pageSize) return;\n this.pageSizeChange.emit(numeric);\n }\n\n changePage(nextIndex: number): void {\n const clamped = Math.max(0, Math.min(this.totalPages - 1, nextIndex));\n if (clamped === this.pageIndex) return;\n this.pageChange.emit(clamped);\n }\n}\n","<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <input-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></input-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"Назад\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">Назад</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">•••</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"Далі\"\n >\n <span class=\"sr-only\">Далі</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i2"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maro-tech/table",
3
- "version": "0.0.3",
3
+ "version": "0.1.0",
4
4
  "private": false,
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.2.0",
@@ -8,7 +8,7 @@
8
8
  "@angular/forms": "^21.2.0",
9
9
  "@angular/router": "^21.2.0",
10
10
  "@maro-tech/core": "^0.0.4",
11
- "@maro-tech/form": "^0.0.17",
11
+ "@maro-tech/form": "^0.1.0",
12
12
  "lucide-angular": "^0.577.0",
13
13
  "rxjs": "~7.8.0"
14
14
  },