@cityway/bo-ui 1.0.10-beta010 → 1.0.10-beta012

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.
Binary file
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Input, Component, EventEmitter, Output, HostListener, Directive, input, output, computed, effect, ContentChild, inject, DestroyRef } from '@angular/core';
2
+ import { Input, Component, EventEmitter, Output, HostListener, Directive, input, output, computed, effect, contentChild, signal, ChangeDetectionStrategy, inject, DestroyRef } from '@angular/core';
3
3
  import * as i1$1 from '@ngx-translate/core';
4
4
  import { TranslateModule } from '@ngx-translate/core';
5
5
  import * as i1 from '@angular/common';
@@ -56,7 +56,7 @@ class ArrayAdapter {
56
56
  toDragItems(source) {
57
57
  return source;
58
58
  }
59
- fromDragItems(items, source) {
59
+ fromDragItems(items, source, _peers) {
60
60
  source.splice(0, source.length, ...items);
61
61
  }
62
62
  }
@@ -69,16 +69,39 @@ class FormArrayAdapter {
69
69
  toDragItems(source) {
70
70
  return source.controls.map((ctrl, i) => this.mapper(ctrl, i));
71
71
  }
72
- fromDragItems(items, source) {
73
- // Réordonner les controls selon le nouvel ordre des items
74
- const controls = items.map(item => source.controls.find(ctrl => this.mapper(ctrl, 0).id === item.id));
72
+ fromDragItems(items, source, peers = []) {
73
+ // Cherche le control correspondant à un id dans la source ou les FormArray voisines
74
+ // (cas du transfert inter-colonnes : le control n'est pas encore dans `source`)
75
+ const findCtrl = (id) => {
76
+ const inSource = source.controls.find(c => this.mapper(c, 0).id === id);
77
+ if (inSource)
78
+ return inSource;
79
+ for (const peer of peers) {
80
+ const found = peer.controls.find(c => this.mapper(c, 0).id === id);
81
+ if (found)
82
+ return found;
83
+ }
84
+ return undefined;
85
+ };
86
+ const controls = items
87
+ .map(item => findCtrl(item.id))
88
+ .filter((c) => c != null);
89
+ // Détacher des peers les controls qu'on va re-pousser ici (évite la double appartenance)
90
+ for (const peer of peers) {
91
+ for (const ctrl of controls) {
92
+ const idx = peer.controls.indexOf(ctrl);
93
+ if (idx >= 0)
94
+ peer.removeAt(idx, { emitEvent: false });
95
+ }
96
+ }
75
97
  while (source.length)
76
- source.removeAt(0);
98
+ source.removeAt(0, { emitEvent: false });
77
99
  controls.forEach((ctrl, i) => {
78
100
  if (this.reorderFn)
79
101
  this.reorderFn(ctrl, i + 1);
80
- source.push(ctrl);
102
+ source.push(ctrl, { emitEvent: false });
81
103
  });
104
+ source.updateValueAndValidity();
82
105
  }
83
106
  }
84
107
 
@@ -109,9 +132,11 @@ class DragNDropListComponent {
109
132
  this._available.forEach((item, i) => item.order = i + 1);
110
133
  this._active.forEach((item, i) => item.order = i + 1);
111
134
  }
112
- // Répercuter sur la source originale via l'adaptateur
113
- this.adapter.fromDragItems(this._available, this.availableItems);
114
- this.adapter.fromDragItems(this._active, this.activeItems);
135
+ // Répercuter sur la source originale via l'adaptateur.
136
+ // On passe la colonne voisine en `peers` pour permettre à l'adaptateur de
137
+ // retrouver un control transféré qui n'est pas encore dans la source cible.
138
+ this.adapter.fromDragItems(this._available, this.availableItems, [this.activeItems]);
139
+ this.adapter.fromDragItems(this._active, this.activeItems, [this.availableItems]);
115
140
  this.availableItemsChange.emit(this.availableItems);
116
141
  this.activeItemsChange.emit(this.activeItems);
117
142
  }
@@ -293,85 +318,102 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
293
318
 
294
319
  class TableComponent {
295
320
  constructor() {
296
- this.checkbox = false;
297
- this.columns = [];
298
- this.data = [];
299
- this.loading = false;
300
- this.rowClick = new EventEmitter();
301
- this.sortChange = new EventEmitter();
302
- this.selectionChange = new EventEmitter();
303
- this.paginationChange = new EventEmitter();
321
+ this.checkbox = input(false, ...(ngDevMode ? [{ debugName: "checkbox" }] : []));
322
+ this.title = input('', ...(ngDevMode ? [{ debugName: "title" }] : []));
323
+ this.columns = input([], ...(ngDevMode ? [{ debugName: "columns" }] : []));
324
+ this.data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
325
+ this.loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
326
+ this.rowClassFn = input(undefined, ...(ngDevMode ? [{ debugName: "rowClassFn" }] : []));
327
+ this.pagination = input(undefined, ...(ngDevMode ? [{ debugName: "pagination" }] : []));
328
+ this.rowClick = output();
329
+ this.cellClick = output();
330
+ this.sortChange = output();
331
+ this.selectionChange = output();
332
+ this.paginationChange = output();
333
+ this.actionsTemplate = contentChild('actionsTemplate', ...(ngDevMode ? [{ debugName: "actionsTemplate" }] : []));
304
334
  this.iconType = IconTypeEnum;
305
335
  this.iconSize = IconSizeEnum;
306
- this.currentSortKey = null;
307
- this.currentSortDirection = 'asc';
308
- this.selectedRows = new Set();
309
- }
310
- getRowClass(row) {
311
- return this.rowClassFn ? this.rowClassFn(row) : '';
336
+ this.currentSortKey = signal(null, ...(ngDevMode ? [{ debugName: "currentSortKey" }] : []));
337
+ this.currentSortDirection = signal('asc', ...(ngDevMode ? [{ debugName: "currentSortDirection" }] : []));
338
+ this.selectedRows = signal(new Set(), ...(ngDevMode ? [{ debugName: "selectedRows" }] : []));
339
+ this.allSelected = computed(() => {
340
+ const rows = this.data();
341
+ return rows.length > 0 && this.selectedRows().size === rows.length;
342
+ }, ...(ngDevMode ? [{ debugName: "allSelected" }] : []));
343
+ this.someSelected = computed(() => {
344
+ return this.selectedRows().size > 0 && !this.allSelected();
345
+ }, ...(ngDevMode ? [{ debugName: "someSelected" }] : []));
312
346
  }
313
347
  ngOnInit() {
314
- const defaultColumn = this.columns.find(c => c.defaultSort);
348
+ const defaultColumn = this.columns().find(c => c.defaultSort);
315
349
  if (defaultColumn) {
316
- this.currentSortKey = defaultColumn.key;
317
- this.currentSortDirection = defaultColumn.defaultSort;
350
+ this.currentSortKey.set(defaultColumn.key);
351
+ this.currentSortDirection.set(defaultColumn.defaultSort);
318
352
  }
319
353
  }
320
- get allSelected() {
321
- return this.data.length > 0 && this.selectedRows.size === this.data.length;
322
- }
323
- get someSelected() {
324
- return this.selectedRows.size > 0 && !this.allSelected;
354
+ getRowClass(row) {
355
+ const fn = this.rowClassFn();
356
+ return fn ? fn(row) : '';
325
357
  }
326
358
  setSortProperty(key) {
327
- if (this.currentSortKey === key) {
328
- this.currentSortDirection = this.currentSortDirection === 'asc' ? 'desc' : 'asc';
359
+ if (this.currentSortKey() === key) {
360
+ this.currentSortDirection.update(dir => dir === 'asc' ? 'desc' : 'asc');
329
361
  }
330
362
  else {
331
- this.currentSortKey = key;
332
- this.currentSortDirection = 'asc';
363
+ this.currentSortKey.set(key);
364
+ this.currentSortDirection.set('asc');
333
365
  }
334
- this.sortChange.emit({ key: this.currentSortKey, direction: this.currentSortDirection });
366
+ this.sortChange.emit({ key: this.currentSortKey(), direction: this.currentSortDirection() });
335
367
  }
336
368
  getSortClass(key) {
337
- if (this.currentSortKey !== key)
369
+ if (this.currentSortKey() !== key)
338
370
  return 'sorting-btn';
339
- return this.currentSortDirection === 'asc' ? 'sorting-btn sorting-asc' : 'sorting-btn sorting-desc';
371
+ return this.currentSortDirection() === 'asc' ? 'sorting-btn sorting-asc' : 'sorting-btn sorting-desc';
340
372
  }
341
373
  getBadge(column, value) {
342
374
  return column.badges?.find(b => b.value === value)
343
375
  ?? { value, type: BadgeTypeEnum.lightLight };
344
376
  }
345
- onCellClick(row) {
346
- this.rowClick.emit(row);
377
+ onCellClick(row, column) {
378
+ this.cellClick.emit({ row, column });
379
+ if (column.type === 'link') {
380
+ this.rowClick.emit(row);
381
+ }
382
+ }
383
+ isClickable(column) {
384
+ return column.type === 'link' || !!column.clickable;
347
385
  }
348
386
  toggleAll() {
349
- if (this.allSelected) {
350
- this.selectedRows.clear();
351
- }
352
- else {
353
- this.data.forEach(row => this.selectedRows.add(row));
354
- }
355
- this.selectionChange.emit([...this.selectedRows]);
387
+ this.selectedRows.update(current => {
388
+ if (current.size === this.data().length) {
389
+ return new Set();
390
+ }
391
+ return new Set(this.data());
392
+ });
393
+ this.selectionChange.emit([...this.selectedRows()]);
356
394
  }
357
395
  toggleRow(row) {
358
- if (this.selectedRows.has(row)) {
359
- this.selectedRows.delete(row);
360
- }
361
- else {
362
- this.selectedRows.add(row);
363
- }
364
- this.selectionChange.emit([...this.selectedRows]);
396
+ this.selectedRows.update(current => {
397
+ const next = new Set(current);
398
+ if (next.has(row)) {
399
+ next.delete(row);
400
+ }
401
+ else {
402
+ next.add(row);
403
+ }
404
+ return next;
405
+ });
406
+ this.selectionChange.emit([...this.selectedRows()]);
365
407
  }
366
408
  isSelected(row) {
367
- return this.selectedRows.has(row);
409
+ return this.selectedRows().has(row);
368
410
  }
369
411
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
370
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: TableComponent, isStandalone: true, selector: "cw-table", inputs: { checkbox: "checkbox", title: "title", columns: "columns", data: "data", loading: "loading", rowClassFn: "rowClassFn", pagination: "pagination" }, outputs: { rowClick: "rowClick", sortChange: "sortChange", selectionChange: "selectionChange", paginationChange: "paginationChange" }, queries: [{ propertyName: "actionsTemplate", first: true, predicate: ["actionsTemplate"], descendants: true }], ngImport: i0, template: "@if (checkbox && selectedRows.size > 0) {\r\n <div class=\"table-selection-info mb-2\">\r\n {{ selectedRows.size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\r\n </div>\r\n}\r\n\r\n<div class=\"table-responsive\" appDoubleScroll>\r\n <table class=\"table\">\r\n <caption class=\"visually-hidden\" [innerHTML]=\"'_COMMON._TABLE.CAPTION' | translate: { label: title } \"></caption>\r\n <thead>\r\n <tr>\r\n @if(checkbox) {\r\n <th scope=\"col\" width=\"10\">\r\n <div class=\"field-check\">\r\n <input class=\"field-check-input\" type=\"checkbox\" id=\"checkme\" [checked]=\"allSelected\"\r\n [indeterminate]=\"someSelected\" (change)=\"toggleAll()\">\r\n <label class=\"field-check-label\" for=\"checkme\">\r\n <span class=\"visually-hidden\">{{ '_COMMON._TABLE._THEAD.CHECK_LINE' | translate }}</span>\r\n </label>\r\n </div>\r\n </th>\r\n }\r\n\r\n @for (column of columns; track column.key) {\r\n @if (!column.hidden) {\r\n <th scope=\"col\" [class.p-0]=\"column.sort\">\r\n @if (column.sort) {\r\n <button [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\r\n {{ column.label | translate}}\r\n <span class=\"sorting-icons\"></span>\r\n </button>\r\n }\r\n @else {\r\n {{ column.label | translate }}\r\n }\r\n </th>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (loading) {\r\n <tr>\r\n <td colspan=\"100\">\r\n <cw-loader></cw-loader>\r\n </td>\r\n </tr>\r\n }\r\n @else if (!data || data.length === 0) {\r\n <tr>\r\n <td class=\"table-info no-result\" colspan=\"100\">\r\n {{ '_COMMON._TABLE.NO_RESULT' | translate }}\r\n </td>\r\n </tr>\r\n }\r\n @else {\r\n @for (row of data; track row) {\r\n <tr [class.tr-selected]=\"isSelected(row)\" [class]=\"getRowClass(row)\">\r\n @if (checkbox) {\r\n <td>\r\n <input class=\"field-check-input\" type=\"checkbox\" [checked]=\"isSelected(row)\" (change)=\"toggleRow(row)\" [id]=\"'check-' + row.id\"\r\n [attr.aria-label]=\"'S\u00E9lectionner la ligne ' + row.id\">\r\n <label class=\"visually-hidden\" [for]=\"'check-' + row.id\">S\u00E9lectionner la ligne {{row.id}}</label>\r\n </td>\r\n }\r\n @for (column of columns; track column.key) {\r\n @if (!column.hidden) {\r\n <td [class.text-end]=\"column.align === 'right'\" [class.text-center]=\"column.align === 'center'\">\r\n @switch (column.type) {\r\n @case ('link') {\r\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row)\">\r\n {{ row[column.key] | translate }}\r\n </a>\r\n }\r\n @case ('badge') {\r\n <cw-badge\r\n [type]=\"getBadge(column, row[column.key]).type\"\r\n [label]=\"getBadge(column, row[column.key]).label ?? row[column.key]\"\r\n [withIcon]=\"getBadge(column, row[column.key]).withIcon\"\r\n [iconPosition]=\"getBadge(column, row[column.key]).iconPosition\"></cw-badge>\r\n }\r\n @case ('icon') {\r\n <cw-icon\r\n [icon]=\"row[column.key].icon\"\r\n [label]=\"row[column.key].label\"\r\n [type]=\"iconType.default\"\r\n [iconSize]=\"iconSize['md']\"\r\n [iconCssClass]=\"row[column.key].iconCssClass\"\r\n ></cw-icon>\r\n }\r\n @case ('image') {\r\n <cw-image\r\n [source]=\"row[column.key].source\"\r\n [alt]=\"row[column.key].label\"\r\n [isAriaHidden]=\"true\"\r\n [cssClass]=\"row[column.key].iconCssClass\"\r\n width=\"32\"\r\n height=\"32\"\r\n ></cw-image>\r\n }\r\n @case ('actions') {\r\n <ng-container\r\n *ngTemplateOutlet=\"actionsTemplate; context: { $implicit: row }\">\r\n </ng-container>\r\n }\r\n @default {\r\n {{ row[column.key] | translate }}\r\n }\r\n }\r\n </td>\r\n }\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n@if (pagination) {\r\n <cw-pagination\r\n [pagination]=\"pagination\"\r\n (paginationChange)=\"paginationChange.emit($event)\">\r\n </cw-pagination>\r\n}\r\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: DoubleScrollDirective, selector: "[appDoubleScroll]" }, { kind: "component", type: LoaderComponent, selector: "cw-loader" }, { kind: "component", type: BadgeComponent, selector: "cw-badge", inputs: ["type", "label", "withIcon", "iconPosition", "cssClass", "skeletonMode", "dataTest"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PaginationComponent, selector: "cw-pagination", inputs: ["pagination"], outputs: ["paginationChange"] }, { kind: "component", type: IconComponent, selector: "cw-icon", inputs: ["icon", "label", "type", "iconSize", "iconCssClass", "iconUiType", "iconColorCustom", "spritePath"] }, { kind: "component", type: ImageComponent, selector: "cw-image", inputs: ["source", "alt", "isAriaHidden", "cssClass", "width", "height"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
412
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: TableComponent, isStandalone: true, selector: "cw-table", inputs: { checkbox: { classPropertyName: "checkbox", publicName: "checkbox", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, rowClassFn: { classPropertyName: "rowClassFn", publicName: "rowClassFn", isSignal: true, isRequired: false, transformFunction: null }, pagination: { classPropertyName: "pagination", publicName: "pagination", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", cellClick: "cellClick", sortChange: "sortChange", selectionChange: "selectionChange", paginationChange: "paginationChange" }, queries: [{ propertyName: "actionsTemplate", first: true, predicate: ["actionsTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (checkbox() && selectedRows().size > 0) {\n <div class=\"table-selection-info mb-2\">\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </div>\n}\n\n<div class=\"table-responsive\" appDoubleScroll>\n <table class=\"table\">\n <caption class=\"visually-hidden\" [innerHTML]=\"'_COMMON._TABLE.CAPTION' | translate: { label: title() } \"></caption>\n <thead>\n <tr>\n @if(checkbox()) {\n <th scope=\"col\" width=\"10\">\n <div class=\"field-check\">\n <input class=\"field-check-input\" type=\"checkbox\" id=\"checkme\" [checked]=\"allSelected()\"\n [indeterminate]=\"someSelected()\" (change)=\"toggleAll()\">\n <label class=\"field-check-label\" for=\"checkme\">\n <span class=\"visually-hidden\">{{ '_COMMON._TABLE._THEAD.CHECK_LINE' | translate }}</span>\n </label>\n </div>\n </th>\n }\n\n @for (column of columns(); track column.key) {\n @if (!column.hidden) {\n <th scope=\"col\" [class.p-0]=\"column.sort\">\n @if (column.sort) {\n <button [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <span class=\"sorting-icons\"></span>\n </button>\n }\n @else {\n {{ column.label | translate }}\n }\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td colspan=\"100\">\n <cw-loader></cw-loader>\n </td>\n </tr>\n }\n @else if (!data() || data().length === 0) {\n <tr>\n <td class=\"table-info no-result\" colspan=\"100\">\n {{ '_COMMON._TABLE.NO_RESULT' | translate }}\n </td>\n </tr>\n }\n @else {\n @for (row of data(); track row) {\n <tr [class.tr-selected]=\"isSelected(row)\" [class]=\"getRowClass(row)\">\n @if (checkbox()) {\n <td>\n <input class=\"field-check-input\" type=\"checkbox\" [checked]=\"isSelected(row)\" (change)=\"toggleRow(row)\" [id]=\"'check-' + row.id\"\n [attr.aria-label]=\"'S\u00E9lectionner la ligne ' + row.id\">\n <label class=\"visually-hidden\" [for]=\"'check-' + row.id\">S\u00E9lectionner la ligne {{row.id}}</label>\n </td>\n }\n @for (column of columns(); track column.key) {\n @if (!column.hidden) {\n <td [class.text-end]=\"column.align === 'right'\" [class.text-center]=\"column.align === 'center'\">\n @switch (column.type) {\n @case ('link') {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\">\n {{ row[column.key] | translate }}\n </a>\n }\n @case ('badge') {\n <cw-badge\n [type]=\"getBadge(column, row[column.key]).type\"\n [label]=\"getBadge(column, row[column.key]).label ?? row[column.key]\"\n [withIcon]=\"getBadge(column, row[column.key]).withIcon\"\n [iconPosition]=\"getBadge(column, row[column.key]).iconPosition\"></cw-badge>\n }\n @case ('icon') {\n @if (isClickable(column)) {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\" [attr.aria-label]=\"row[column.key].label\">\n <cw-icon\n [icon]=\"row[column.key].icon\"\n [label]=\"row[column.key].label\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['md']\"\n [iconCssClass]=\"row[column.key].iconCssClass\"\n ></cw-icon>\n </a>\n } @else {\n <cw-icon\n [icon]=\"row[column.key].icon\"\n [label]=\"row[column.key].label\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['md']\"\n [iconCssClass]=\"row[column.key].iconCssClass\"\n ></cw-icon>\n }\n }\n @case ('image') {\n @if (isClickable(column)) {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\" [attr.aria-label]=\"row[column.key].label\">\n <cw-image\n [source]=\"row[column.key].source\"\n [alt]=\"row[column.key].label\"\n [isAriaHidden]=\"true\"\n [cssClass]=\"row[column.key].iconCssClass\"\n width=\"32\"\n height=\"32\"\n ></cw-image>\n </a>\n } @else {\n <cw-image\n [source]=\"row[column.key].source\"\n [alt]=\"row[column.key].label\"\n [isAriaHidden]=\"true\"\n [cssClass]=\"row[column.key].iconCssClass\"\n width=\"32\"\n height=\"32\"\n ></cw-image>\n }\n }\n @case ('actions') {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\n @default {\n {{ row[column.key] | translate }}\n }\n }\n </td>\n }\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (pagination()) {\n <cw-pagination\n [pagination]=\"pagination()!\"\n (paginationChange)=\"paginationChange.emit($event)\">\n </cw-pagination>\n}\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: DoubleScrollDirective, selector: "[appDoubleScroll]" }, { kind: "component", type: LoaderComponent, selector: "cw-loader" }, { kind: "component", type: BadgeComponent, selector: "cw-badge", inputs: ["type", "label", "withIcon", "iconPosition", "cssClass", "skeletonMode", "dataTest"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PaginationComponent, selector: "cw-pagination", inputs: ["pagination"], outputs: ["paginationChange"] }, { kind: "component", type: IconComponent, selector: "cw-icon", inputs: ["icon", "label", "type", "iconSize", "iconCssClass", "iconUiType", "iconColorCustom", "spritePath"] }, { kind: "component", type: ImageComponent, selector: "cw-image", inputs: ["source", "alt", "isAriaHidden", "cssClass", "width", "height"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
371
413
  }
372
414
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: TableComponent, decorators: [{
373
415
  type: Component,
374
- args: [{ selector: 'cw-table', standalone: true, imports: [
416
+ args: [{ selector: 'cw-table', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
375
417
  TranslateModule,
376
418
  DoubleScrollDirective,
377
419
  LoaderComponent,
@@ -380,33 +422,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
380
422
  PaginationComponent,
381
423
  IconComponent,
382
424
  ImageComponent
383
- ], template: "@if (checkbox && selectedRows.size > 0) {\r\n <div class=\"table-selection-info mb-2\">\r\n {{ selectedRows.size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\r\n </div>\r\n}\r\n\r\n<div class=\"table-responsive\" appDoubleScroll>\r\n <table class=\"table\">\r\n <caption class=\"visually-hidden\" [innerHTML]=\"'_COMMON._TABLE.CAPTION' | translate: { label: title } \"></caption>\r\n <thead>\r\n <tr>\r\n @if(checkbox) {\r\n <th scope=\"col\" width=\"10\">\r\n <div class=\"field-check\">\r\n <input class=\"field-check-input\" type=\"checkbox\" id=\"checkme\" [checked]=\"allSelected\"\r\n [indeterminate]=\"someSelected\" (change)=\"toggleAll()\">\r\n <label class=\"field-check-label\" for=\"checkme\">\r\n <span class=\"visually-hidden\">{{ '_COMMON._TABLE._THEAD.CHECK_LINE' | translate }}</span>\r\n </label>\r\n </div>\r\n </th>\r\n }\r\n\r\n @for (column of columns; track column.key) {\r\n @if (!column.hidden) {\r\n <th scope=\"col\" [class.p-0]=\"column.sort\">\r\n @if (column.sort) {\r\n <button [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\r\n {{ column.label | translate}}\r\n <span class=\"sorting-icons\"></span>\r\n </button>\r\n }\r\n @else {\r\n {{ column.label | translate }}\r\n }\r\n </th>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (loading) {\r\n <tr>\r\n <td colspan=\"100\">\r\n <cw-loader></cw-loader>\r\n </td>\r\n </tr>\r\n }\r\n @else if (!data || data.length === 0) {\r\n <tr>\r\n <td class=\"table-info no-result\" colspan=\"100\">\r\n {{ '_COMMON._TABLE.NO_RESULT' | translate }}\r\n </td>\r\n </tr>\r\n }\r\n @else {\r\n @for (row of data; track row) {\r\n <tr [class.tr-selected]=\"isSelected(row)\" [class]=\"getRowClass(row)\">\r\n @if (checkbox) {\r\n <td>\r\n <input class=\"field-check-input\" type=\"checkbox\" [checked]=\"isSelected(row)\" (change)=\"toggleRow(row)\" [id]=\"'check-' + row.id\"\r\n [attr.aria-label]=\"'S\u00E9lectionner la ligne ' + row.id\">\r\n <label class=\"visually-hidden\" [for]=\"'check-' + row.id\">S\u00E9lectionner la ligne {{row.id}}</label>\r\n </td>\r\n }\r\n @for (column of columns; track column.key) {\r\n @if (!column.hidden) {\r\n <td [class.text-end]=\"column.align === 'right'\" [class.text-center]=\"column.align === 'center'\">\r\n @switch (column.type) {\r\n @case ('link') {\r\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row)\">\r\n {{ row[column.key] | translate }}\r\n </a>\r\n }\r\n @case ('badge') {\r\n <cw-badge\r\n [type]=\"getBadge(column, row[column.key]).type\"\r\n [label]=\"getBadge(column, row[column.key]).label ?? row[column.key]\"\r\n [withIcon]=\"getBadge(column, row[column.key]).withIcon\"\r\n [iconPosition]=\"getBadge(column, row[column.key]).iconPosition\"></cw-badge>\r\n }\r\n @case ('icon') {\r\n <cw-icon\r\n [icon]=\"row[column.key].icon\"\r\n [label]=\"row[column.key].label\"\r\n [type]=\"iconType.default\"\r\n [iconSize]=\"iconSize['md']\"\r\n [iconCssClass]=\"row[column.key].iconCssClass\"\r\n ></cw-icon>\r\n }\r\n @case ('image') {\r\n <cw-image\r\n [source]=\"row[column.key].source\"\r\n [alt]=\"row[column.key].label\"\r\n [isAriaHidden]=\"true\"\r\n [cssClass]=\"row[column.key].iconCssClass\"\r\n width=\"32\"\r\n height=\"32\"\r\n ></cw-image>\r\n }\r\n @case ('actions') {\r\n <ng-container\r\n *ngTemplateOutlet=\"actionsTemplate; context: { $implicit: row }\">\r\n </ng-container>\r\n }\r\n @default {\r\n {{ row[column.key] | translate }}\r\n }\r\n }\r\n </td>\r\n }\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n@if (pagination) {\r\n <cw-pagination\r\n [pagination]=\"pagination\"\r\n (paginationChange)=\"paginationChange.emit($event)\">\r\n </cw-pagination>\r\n}\r\n" }]
384
- }], propDecorators: { checkbox: [{
385
- type: Input
386
- }], title: [{
387
- type: Input
388
- }], columns: [{
389
- type: Input
390
- }], data: [{
391
- type: Input
392
- }], loading: [{
393
- type: Input
394
- }], rowClassFn: [{
395
- type: Input
396
- }], pagination: [{
397
- type: Input
398
- }], rowClick: [{
399
- type: Output
400
- }], sortChange: [{
401
- type: Output
402
- }], selectionChange: [{
403
- type: Output
404
- }], paginationChange: [{
405
- type: Output
406
- }], actionsTemplate: [{
407
- type: ContentChild,
408
- args: ['actionsTemplate']
409
- }] } });
425
+ ], template: "@if (checkbox() && selectedRows().size > 0) {\n <div class=\"table-selection-info mb-2\">\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </div>\n}\n\n<div class=\"table-responsive\" appDoubleScroll>\n <table class=\"table\">\n <caption class=\"visually-hidden\" [innerHTML]=\"'_COMMON._TABLE.CAPTION' | translate: { label: title() } \"></caption>\n <thead>\n <tr>\n @if(checkbox()) {\n <th scope=\"col\" width=\"10\">\n <div class=\"field-check\">\n <input class=\"field-check-input\" type=\"checkbox\" id=\"checkme\" [checked]=\"allSelected()\"\n [indeterminate]=\"someSelected()\" (change)=\"toggleAll()\">\n <label class=\"field-check-label\" for=\"checkme\">\n <span class=\"visually-hidden\">{{ '_COMMON._TABLE._THEAD.CHECK_LINE' | translate }}</span>\n </label>\n </div>\n </th>\n }\n\n @for (column of columns(); track column.key) {\n @if (!column.hidden) {\n <th scope=\"col\" [class.p-0]=\"column.sort\">\n @if (column.sort) {\n <button [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <span class=\"sorting-icons\"></span>\n </button>\n }\n @else {\n {{ column.label | translate }}\n }\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td colspan=\"100\">\n <cw-loader></cw-loader>\n </td>\n </tr>\n }\n @else if (!data() || data().length === 0) {\n <tr>\n <td class=\"table-info no-result\" colspan=\"100\">\n {{ '_COMMON._TABLE.NO_RESULT' | translate }}\n </td>\n </tr>\n }\n @else {\n @for (row of data(); track row) {\n <tr [class.tr-selected]=\"isSelected(row)\" [class]=\"getRowClass(row)\">\n @if (checkbox()) {\n <td>\n <input class=\"field-check-input\" type=\"checkbox\" [checked]=\"isSelected(row)\" (change)=\"toggleRow(row)\" [id]=\"'check-' + row.id\"\n [attr.aria-label]=\"'S\u00E9lectionner la ligne ' + row.id\">\n <label class=\"visually-hidden\" [for]=\"'check-' + row.id\">S\u00E9lectionner la ligne {{row.id}}</label>\n </td>\n }\n @for (column of columns(); track column.key) {\n @if (!column.hidden) {\n <td [class.text-end]=\"column.align === 'right'\" [class.text-center]=\"column.align === 'center'\">\n @switch (column.type) {\n @case ('link') {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\">\n {{ row[column.key] | translate }}\n </a>\n }\n @case ('badge') {\n <cw-badge\n [type]=\"getBadge(column, row[column.key]).type\"\n [label]=\"getBadge(column, row[column.key]).label ?? row[column.key]\"\n [withIcon]=\"getBadge(column, row[column.key]).withIcon\"\n [iconPosition]=\"getBadge(column, row[column.key]).iconPosition\"></cw-badge>\n }\n @case ('icon') {\n @if (isClickable(column)) {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\" [attr.aria-label]=\"row[column.key].label\">\n <cw-icon\n [icon]=\"row[column.key].icon\"\n [label]=\"row[column.key].label\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['md']\"\n [iconCssClass]=\"row[column.key].iconCssClass\"\n ></cw-icon>\n </a>\n } @else {\n <cw-icon\n [icon]=\"row[column.key].icon\"\n [label]=\"row[column.key].label\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['md']\"\n [iconCssClass]=\"row[column.key].iconCssClass\"\n ></cw-icon>\n }\n }\n @case ('image') {\n @if (isClickable(column)) {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\" [attr.aria-label]=\"row[column.key].label\">\n <cw-image\n [source]=\"row[column.key].source\"\n [alt]=\"row[column.key].label\"\n [isAriaHidden]=\"true\"\n [cssClass]=\"row[column.key].iconCssClass\"\n width=\"32\"\n height=\"32\"\n ></cw-image>\n </a>\n } @else {\n <cw-image\n [source]=\"row[column.key].source\"\n [alt]=\"row[column.key].label\"\n [isAriaHidden]=\"true\"\n [cssClass]=\"row[column.key].iconCssClass\"\n width=\"32\"\n height=\"32\"\n ></cw-image>\n }\n }\n @case ('actions') {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\n @default {\n {{ row[column.key] | translate }}\n }\n }\n </td>\n }\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (pagination()) {\n <cw-pagination\n [pagination]=\"pagination()!\"\n (paginationChange)=\"paginationChange.emit($event)\">\n </cw-pagination>\n}\n" }]
426
+ }], propDecorators: { checkbox: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkbox", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], rowClassFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowClassFn", required: false }] }], pagination: [{ type: i0.Input, args: [{ isSignal: true, alias: "pagination", required: false }] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], cellClick: [{ type: i0.Output, args: ["cellClick"] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], paginationChange: [{ type: i0.Output, args: ["paginationChange"] }], actionsTemplate: [{ type: i0.ContentChild, args: ['actionsTemplate', { isSignal: true }] }] } });
410
427
 
411
428
  const RANGE_TYPES = new Set([
412
429
  FormFieldTypeEnum.dateToDate,
@@ -1 +1 @@
1
- {"version":3,"file":"cityway-bo-ui.mjs","sources":["../../../projects/bo-ui/src/lib/components/custom-list/custom-list.component.ts","../../../projects/bo-ui/src/lib/components/custom-list/custom-list.component.html","../../../projects/bo-ui/src/lib/components/drag-n-drop-list/drag-drop.adapter.ts","../../../projects/bo-ui/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.ts","../../../projects/bo-ui/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.html","../../../projects/bo-ui/src/lib/directives/double-scroll.ts","../../../projects/bo-ui/src/lib/components/pagination/pagination.component.ts","../../../projects/bo-ui/src/lib/components/pagination/pagination.component.html","../../../projects/bo-ui/src/lib/components/table/table.component.ts","../../../projects/bo-ui/src/lib/components/table/table.component.html","../../../projects/bo-ui/src/lib/components/filter-bar/filter-bar.component.ts","../../../projects/bo-ui/src/lib/components/filter-bar/filter-bar.component.html","../../../projects/bo-ui/src/lib/utils/filter-params.util.ts","../../../projects/bo-ui/src/public-api.ts","../../../projects/bo-ui/src/cityway-bo-ui.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\r\nimport { DataCustomListGroup } from '../../models/custom-list.model';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'cw-custom-list',\r\n templateUrl: './custom-list.component.html',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslateModule\r\n ]\r\n})\r\n\r\nexport class CustomListComponent implements OnInit {\r\n\r\n @Input() customListData: DataCustomListGroup[] = [];\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n hasValue(value: any): boolean {\r\n if (value === null || value === undefined) {\r\n return false;\r\n };\r\n if (typeof value === 'string' && value.trim() === '') {\r\n return false;\r\n };\r\n if (Array.isArray(value) && value.length === 0) {\r\n return false;\r\n };\r\n if (typeof value === 'object' && Object.keys(value).length === 0) {\r\n return false;\r\n };\r\n\r\n return true;\r\n }\r\n\r\n}\r\n","<div class=\"card custom-card-light\">\r\n <div class=\"card-body d-flex-v gap-md\">\r\n @for (group of customListData; track group.title) {\r\n @if (group.title) {\r\n <h3>{{ group.title | translate }}</h3>\r\n }\r\n\r\n <ul class=\"custom-description-list list-unstyled fs fs-sm\">\r\n @for (field of group.fields; track field.label) {\r\n @if (!field.hideIfEmpty || hasValue(field.value)) {\r\n <li>\r\n <div class=\"fs fw-bold\" [innerHTML]=\"'_LABEL.COLON' | translate: { label: (field.label | translate) }\"></div>\r\n <div>\r\n @switch (field.type) {\r\n @case ('date') {\r\n {{ field.value | date: 'short' }}\r\n }\r\n @case ('boolean') {\r\n {{ (field.value ? '_COMMON._PRO_SENTENCE.YES' : '_COMMON._PRO_SENTENCE.NO') | translate }}\r\n }\r\n @case ('html') {\r\n <span [innerHTML]=\"field.value\"></span>\r\n }\r\n @default {\r\n {{ field.translateValue ? (field.value | translate) : field.value }}\r\n }\r\n }\r\n </div>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n }\r\n </div>\r\n</div>\r\n","import { AbstractControl, FormArray } from '@angular/forms';\r\nimport { DragItem } from '../../models/drag-item.model';\r\n\r\n\r\nexport interface DragDropAdapter<T = any> {\r\n toDragItems(source: T): DragItem[];\r\n fromDragItems(items: DragItem[], source: T): void;\r\n}\r\n\r\n// Adaptateur pour DragItem[] (identité)\r\nexport class ArrayAdapter implements DragDropAdapter<DragItem[]> {\r\n toDragItems(source: DragItem[]): DragItem[] {\r\n return source;\r\n }\r\n fromDragItems(items: DragItem[], source: DragItem[]): void {\r\n source.splice(0, source.length, ...items);\r\n }\r\n}\r\n\r\n// Adaptateur pour FormArray\r\nexport class FormArrayAdapter implements DragDropAdapter<FormArray> {\r\n\r\n constructor(\r\n private readonly mapper: (ctrl: AbstractControl, index: number) => DragItem,\r\n private readonly reorderFn?: (ctrl: AbstractControl, newOrder: number) => void\r\n ) {}\r\n\r\n toDragItems(source: FormArray): DragItem[] {\r\n return source.controls.map((ctrl, i) => this.mapper(ctrl, i));\r\n }\r\n\r\n fromDragItems(items: DragItem[], source: FormArray): void {\r\n // Réordonner les controls selon le nouvel ordre des items\r\n const controls = items.map(item =>\r\n source.controls.find(ctrl => this.mapper(ctrl, 0).id === item.id)!\r\n );\r\n while (source.length) source.removeAt(0);\r\n controls.forEach((ctrl, i) => {\r\n if (this.reorderFn) this.reorderFn(ctrl, i + 1);\r\n source.push(ctrl);\r\n });\r\n }\r\n}\r\n","import {\r\n CdkDragDrop, DragDropModule,\r\n moveItemInArray, transferArrayItem\r\n} from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, Output, TemplateRef } from '@angular/core';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { ArrayAdapter, DragDropAdapter } from './drag-drop.adapter';\r\nimport { DragItem, DragListColumn } from '../../models/drag-item.model';\r\nimport { CardComponent } from '@cityway/basic-ui';\r\n\r\n@Component({\r\n selector: 'cw-drag-n-drop-list',\r\n templateUrl: './drag-n-drop-list.component.html',\r\n standalone: true,\r\n imports: [CommonModule, TranslateModule, DragDropModule, CardComponent]\r\n})\r\nexport class DragNDropListComponent implements OnChanges {\r\n\r\n @Input() availableItems: any;\r\n @Input() activeItems: any;\r\n @Input() adapter: DragDropAdapter = new ArrayAdapter();\r\n @Input() itemTemplate?: TemplateRef<any>;\r\n\r\n @Input() availableColumn: DragListColumn = { title: 'Disponibles' };\r\n @Input() activeColumn: DragListColumn = { title: 'Activés' };\r\n @Input() reorderOnDrop = false;\r\n\r\n @Output() availableItemsChange = new EventEmitter<any>();\r\n @Output() activeItemsChange = new EventEmitter<any>();\r\n\r\n // Copies internes sur lesquelles le CDK travaille\r\n _available: DragItem[] = [];\r\n _active: DragItem[] = [];\r\n\r\n ngOnChanges(): void {\r\n this._available = this.adapter.toDragItems(this.availableItems);\r\n this._active = this.adapter.toDragItems(this.activeItems);\r\n }\r\n\r\n drop(event: CdkDragDrop<DragItem[]>): void {\r\n if (event.previousContainer === event.container) {\r\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\r\n } else {\r\n transferArrayItem(\r\n event.previousContainer.data,\r\n event.container.data,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n }\r\n\r\n if (this.reorderOnDrop) {\r\n this._available.forEach((item, i) => item.order = i + 1);\r\n this._active.forEach((item, i) => item.order = i + 1);\r\n }\r\n\r\n // Répercuter sur la source originale via l'adaptateur\r\n this.adapter.fromDragItems(this._available, this.availableItems);\r\n this.adapter.fromDragItems(this._active, this.activeItems);\r\n\r\n this.availableItemsChange.emit(this.availableItems);\r\n this.activeItemsChange.emit(this.activeItems);\r\n }\r\n}\r\n","<div class=\"drag-drop-list row\">\r\n <div class=\"col-lg-6 d-flex-v gap-4xs\">\r\n <div class=\"fs fs-md fw-bold\">{{ availableColumn.title | translate }}</div>\r\n @if (availableColumn.description) {\r\n <p class=\"fs fs-md\">{{ availableColumn.description | translate }}</p>\r\n }\r\n @if (availableColumn.descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-md\" [innerHTML]=\"availableColumn.descriptionRwd | translate\"></p>\r\n }\r\n <ul class=\"list-unstyled drag-drop-list-column drag-drop-list-column-available\" [ngClass]=\"availableColumn.cssClass\"\r\n cdkDropList #availableList=\"cdkDropList\"\r\n [cdkDropListData]=\"_available\"\r\n [cdkDropListConnectedTo]=\"[activeList]\"\r\n (cdkDropListDropped)=\"drop($event)\">\r\n @for (item of _available; track item.id) {\r\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\r\n <cw-card>\r\n <ng-container *ngTemplateOutlet=\"itemTemplate || defaultTemplate; context: { $implicit: item }\"/>\r\n </cw-card>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div class=\"col-lg-6 d-flex-v gap-4xs\">\r\n <div class=\"fs fs-md fw-bold\">{{ activeColumn.title | translate }}</div>\r\n @if (activeColumn.description) {\r\n <p class=\"fs fs-md\">{{ activeColumn.description | translate }}</p>\r\n }\r\n @if (activeColumn.descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-md\" [innerHTML]=\"activeColumn.descriptionRwd | translate\"></p>\r\n }\r\n <ul class=\"list-unstyled drag-drop-list-column drag-drop-list-column-active\" [ngClass]=\"activeColumn.cssClass\"\r\n cdkDropList #activeList=\"cdkDropList\"\r\n [cdkDropListData]=\"_active\"\r\n [cdkDropListConnectedTo]=\"[availableList]\"\r\n (cdkDropListDropped)=\"drop($event)\">\r\n @for (item of _active; track item.id) {\r\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\r\n <cw-card>\r\n <ng-container *ngTemplateOutlet=\"itemTemplate || defaultTemplate; context: { $implicit: item }\"/>\r\n </cw-card>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultTemplate let-item>\r\n <div class=\"default-item d-flex justify-content-between\">\r\n <span>\r\n {{ item.label }}\r\n @if (item.code) { <span class=\"text-muted\">({{ item.code }})</span> }\r\n </span>\r\n @if (item.order != null) {\r\n <span class=\"fw-bold\">#{{ item.order }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n","import { AfterViewChecked, Directive, ElementRef, HostListener, OnDestroy, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appDoubleScroll]'\r\n})\r\n\r\nexport class DoubleScrollDirective implements OnInit, AfterViewChecked, OnDestroy {\r\n\r\n scroll: any;\r\n div: any;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) {\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize() {\r\n this.adaptScrollWidth();\r\n }\r\n\r\n // Si scroll le tableau on scroll aussi div.table-responsive-double-scroll\r\n @HostListener('scroll', ['$event'])\r\n onScroll() {\r\n this.div.scrollLeft = this.el.nativeElement.scrollLeft;\r\n }\r\n\r\n ngOnInit() {\r\n\r\n // On applique un margin-top à 0 à la table.\r\n this.el.nativeElement.style.marginTop = '0';\r\n\r\n // On crée le div.table-responsive-double-scroll et on l'insère avant le tableau\r\n this.div = this.renderer.createElement('div');\r\n this.renderer.addClass(this.div, 'table-responsive-double-scroll');\r\n this.renderer.insertBefore(this.el.nativeElement.parentNode, this.div, this.el.nativeElement);\r\n\r\n // On crée le div.scroll et on l'insère dans le div.table-responsive-double-scroll\r\n this.scroll = this.renderer.createElement('div');\r\n this.renderer.addClass(this.scroll, 'scroll');\r\n this.renderer.appendChild(this.div, this.scroll);\r\n\r\n // Si on scroll div.table-responsive-double-scroll on scroll aussi le tableau\r\n this.div.addEventListener('scroll', function() {\r\n //this.nextSibling.scrollLeft = this.scrollLeft;\r\n this.nextSibling.style.transform = \"translateX(-\" + this.scrollLeft + \"px)\";\r\n });\r\n }\r\n\r\n adaptScrollWidth() {\r\n // On donne à div.scroll la taille du tableau\r\n if (this.el.nativeElement.firstChild.offsetWidth > this.el.nativeElement.offsetWidth) {\r\n this.scroll.style.width = (this.el.nativeElement.firstChild.offsetWidth + 17) + 'px';\r\n } else {\r\n this.scroll.style.widdth = 'auto';\r\n }\r\n }\r\n\r\n ngAfterViewChecked() {\r\n this.adaptScrollWidth();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.div.removeEventListener('scroll', null);\r\n }\r\n}\r\n","import { Component, computed, input, output, effect } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { PaginationChangeEvent, Pagination } from '../../models/pagination.model';\r\nimport {\r\n BoButtonTypeEnum,\r\n ButtonComponent,\r\n FormFieldComponent,\r\n FormFieldTypeEnum,\r\n SpriteIconEnum,\r\n ButtonIconSizeEnum,\r\n FormFieldOption\r\n} from '@cityway/basic-ui';\r\n\r\ntype PageItem = number | { type: 'jump-prev' | 'jump-next'; page: number };\r\n\r\n@Component({\r\n selector: 'cw-pagination',\r\n standalone: true,\r\n imports: [TranslateModule, ButtonComponent, FormFieldComponent, ReactiveFormsModule],\r\n templateUrl: './pagination.component.html',\r\n})\r\nexport class PaginationComponent {\r\n pagination = input.required<Pagination>();\r\n paginationChange = output<PaginationChangeEvent>();\r\n\r\n readonly spriteIcon = SpriteIconEnum;\r\n readonly typeField = FormFieldTypeEnum;\r\n readonly typeButton = BoButtonTypeEnum;\r\n readonly buttonIconSize = ButtonIconSizeEnum;\r\n\r\n readonly pageSizes = [25, 50, 100, 200, 300];\r\n\r\n readonly pageSizesOptions: FormFieldOption[] = this.pageSizes.map(size => ({\r\n label: size.toString(),\r\n value: size.toString()\r\n }));\r\n\r\n itemsPerPageControl = new FormControl<string | null>(null);\r\n\r\n constructor() {\r\n effect(() => {\r\n const value = this.pagination().itemsPerPage;\r\n if (value != null) {\r\n this.itemsPerPageControl.setValue(value.toString(), { emitEvent: false });\r\n }\r\n });\r\n\r\n this.itemsPerPageControl.valueChanges.subscribe(value => {\r\n if (value !== null) {\r\n this.onItemsPerPageChange(Number(value));\r\n }\r\n });\r\n }\r\n\r\n\r\n readonly visiblePages = computed<PageItem[]>(() => {\r\n const { currentPage, totalPages } = this.pagination();\r\n\r\n const pages: PageItem[] = [];\r\n const pageBuffer = 2;\r\n\r\n if (totalPages <= 7) {\r\n return Array.from({ length: totalPages }, (_, i) => i + 1);\r\n }\r\n\r\n // Toujours 1\r\n pages.push(1);\r\n\r\n if (currentPage <= 4) {\r\n for (let i = 2; i <= 5; i++) {\r\n pages.push(i);\r\n }\r\n pages.push({\r\n type: 'jump-next',\r\n page: currentPage + 5\r\n });\r\n }\r\n\r\n else if (currentPage >= totalPages - 3) {\r\n pages.push({\r\n type: 'jump-prev',\r\n page: currentPage - 5\r\n });\r\n\r\n for (let i = totalPages - 4; i < totalPages; i++) {\r\n pages.push(i);\r\n }\r\n }\r\n\r\n else {\r\n pages.push({\r\n type: 'jump-prev',\r\n page: currentPage - 5\r\n });\r\n\r\n for (let i = currentPage - pageBuffer; i <= currentPage + pageBuffer; i++) {\r\n pages.push(i);\r\n }\r\n\r\n pages.push({\r\n type: 'jump-next',\r\n page: currentPage + 5\r\n });\r\n }\r\n\r\n // Toujours last\r\n pages.push(totalPages);\r\n\r\n return pages;\r\n });\r\n\r\n emit(page: number): void {\r\n this.paginationChange.emit({\r\n page,\r\n itemsPerPage: Number(this.itemsPerPageControl.value) || this.pagination().itemsPerPage\r\n });\r\n }\r\n\r\n onItemsPerPageChange(value: number): void {\r\n this.paginationChange.emit({\r\n page: 1,\r\n itemsPerPage: value\r\n });\r\n }\r\n}\r\n","@if (pagination().totalPages > 0) {\r\n<div class=\"pagination d-flex-h gap-md justify-between fs fs-sm\">\r\n\r\n <!-- LEFT PART -->\r\n <div class=\"d-flex-h gap-sm\">\r\n {{ '_COMMON._PAGINATION.RESULT_P' | translate: {total: pagination().totalItems } }}\r\n -\r\n {{ '_COMMON._PAGINATION.DISPLAY' | translate }}\r\n\r\n <cw-form-field\r\n [label]=\"'_COMMON._PAGINATION.ITEMS_PER_PAGE'\"\r\n [type]=\"typeField.select\"\r\n [control]=\"itemsPerPageControl\"\r\n [options]=\"pageSizesOptions\"\r\n [displayLabel]=\"false\"\r\n [clearable]=\"false\">\r\n </cw-form-field>\r\n\r\n {{ '_COMMON._PAGINATION.ITEMS_PER_PAGE' | translate }}\r\n </div>\r\n\r\n <!-- PAGINATION -->\r\n <ul class=\"list-unstyled d-flex-h gap-none\">\r\n\r\n <!-- PREVIOUS -->\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n [withOnlyIcon]=\"true\"\r\n [withIcon]=\"spriteIcon.nextLeft\"\r\n [isDisabled]=\"pagination().currentPage <= 1\"\r\n [iconSize]=\"buttonIconSize.small\"\r\n cssClass=\"btn-pagination\"\r\n (btnAction)=\"emit(pagination().currentPage - 1)\">\r\n </cw-button>\r\n </li>\r\n\r\n <!-- PAGES -->\r\n @for (item of visiblePages(); track item) {\r\n\r\n <!-- NUMBER -->\r\n @if (typeof item === 'number') {\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n [label]=\"item.toString()\"\r\n [cssClass]=\"item === pagination().currentPage ? 'btn-pagination btn-pagination-active' : 'btn-pagination'\"\r\n (btnAction)=\"emit(item)\">\r\n </cw-button>\r\n </li>\r\n }\r\n\r\n <!-- JUMP PREV -->\r\n @else if (item.type === 'jump-prev') {\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n label=\"...\"\r\n cssClass=\"btn-pagination\"\r\n (btnAction)=\"emit(item.page)\">\r\n </cw-button>\r\n </li>\r\n }\r\n\r\n <!-- JUMP NEXT -->\r\n @else if (item.type === 'jump-next') {\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n label=\"...\"\r\n cssClass=\"btn-pagination\"\r\n (btnAction)=\"emit(item.page)\">\r\n </cw-button>\r\n </li>\r\n }\r\n }\r\n\r\n <!-- NEXT -->\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n [withOnlyIcon]=\"true\"\r\n [withIcon]=\"spriteIcon.nextRight\"\r\n [isDisabled]=\"pagination().currentPage >= pagination().totalPages\"\r\n [iconSize]=\"buttonIconSize.small\"\r\n cssClass=\"btn-pagination\"\r\n (btnAction)=\"emit(pagination().currentPage + 1)\">\r\n </cw-button>\r\n </li>\r\n\r\n </ul>\r\n</div>\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, ContentChild, EventEmitter, Input, Output, TemplateRef } from '@angular/core';\r\nimport { BadgeComponent, BadgeTypeEnum, IconComponent, IconSizeEnum, IconTypeEnum, ImageComponent, LoaderComponent } from '@cityway/basic-ui';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { DoubleScrollDirective } from '../../directives/double-scroll';\r\nimport { BadgeConfig, SortDirection, SortEvent, TableColumn } from '../../models/table.model';\r\nimport { PaginationChangeEvent, Pagination } from '../../models/pagination.model';\r\nimport { PaginationComponent } from '../pagination/pagination.component';\r\n\r\n@Component({\r\n selector: 'cw-table',\r\n templateUrl: './table.component.html',\r\n standalone: true,\r\n imports: [\r\n TranslateModule,\r\n DoubleScrollDirective,\r\n LoaderComponent,\r\n BadgeComponent,\r\n NgTemplateOutlet,\r\n PaginationComponent,\r\n IconComponent,\r\n ImageComponent\r\n ]\r\n})\r\nexport class TableComponent {\r\n\r\n @Input() checkbox = false;\r\n @Input() title: string;\r\n @Input() columns: TableColumn[] = [];\r\n @Input() data: any[] = [];\r\n @Input() loading = false;\r\n @Input() rowClassFn?: (row: any) => string;\r\n @Input() pagination?: Pagination;\r\n\r\n @Output() rowClick = new EventEmitter<any>();\r\n @Output() sortChange = new EventEmitter<SortEvent>();\r\n @Output() selectionChange = new EventEmitter<any[]>();\r\n @Output() paginationChange = new EventEmitter<PaginationChangeEvent>();\r\n\r\n @ContentChild('actionsTemplate') actionsTemplate?: TemplateRef<{ $implicit: any }>;\r\n\r\n readonly iconType = IconTypeEnum;\r\n readonly iconSize = IconSizeEnum;\r\n\r\n public currentSortKey: string | null = null;\r\n public currentSortDirection: SortDirection = 'asc';\r\n public selectedRows = new Set<any>();\r\n\r\n public getRowClass(row: any): string {\r\n return this.rowClassFn ? this.rowClassFn(row) : '';\r\n }\r\n\r\n ngOnInit(): void {\r\n const defaultColumn = this.columns.find(c => c.defaultSort);\r\n if (defaultColumn) {\r\n this.currentSortKey = defaultColumn.key;\r\n this.currentSortDirection = defaultColumn.defaultSort!;\r\n }\r\n }\r\n\r\n get allSelected(): boolean {\r\n return this.data.length > 0 && this.selectedRows.size === this.data.length;\r\n }\r\n\r\n get someSelected(): boolean {\r\n return this.selectedRows.size > 0 && !this.allSelected;\r\n }\r\n\r\n public setSortProperty(key: string): void {\r\n if (this.currentSortKey === key) {\r\n this.currentSortDirection = this.currentSortDirection === 'asc' ? 'desc' : 'asc';\r\n } else {\r\n this.currentSortKey = key;\r\n this.currentSortDirection = 'asc';\r\n }\r\n this.sortChange.emit({ key: this.currentSortKey, direction: this.currentSortDirection });\r\n }\r\n\r\n public getSortClass(key: string): string {\r\n if (this.currentSortKey !== key) return 'sorting-btn';\r\n return this.currentSortDirection === 'asc' ? 'sorting-btn sorting-asc' : 'sorting-btn sorting-desc';\r\n }\r\n\r\n public getBadge(column: TableColumn, value: string): BadgeConfig {\r\n return column.badges?.find(b => b.value === value)\r\n ?? { value, type: BadgeTypeEnum.lightLight };\r\n }\r\n\r\n public onCellClick(row: any): void {\r\n this.rowClick.emit(row);\r\n }\r\n\r\n public toggleAll(): void {\r\n if (this.allSelected) {\r\n this.selectedRows.clear();\r\n } else {\r\n this.data.forEach(row => this.selectedRows.add(row));\r\n }\r\n this.selectionChange.emit([...this.selectedRows]);\r\n }\r\n\r\n public toggleRow(row: any): void {\r\n if (this.selectedRows.has(row)) {\r\n this.selectedRows.delete(row);\r\n } else {\r\n this.selectedRows.add(row);\r\n }\r\n this.selectionChange.emit([...this.selectedRows]);\r\n }\r\n\r\n public isSelected(row: any): boolean {\r\n return this.selectedRows.has(row);\r\n }\r\n}\r\n","@if (checkbox && selectedRows.size > 0) {\r\n <div class=\"table-selection-info mb-2\">\r\n {{ selectedRows.size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\r\n </div>\r\n}\r\n\r\n<div class=\"table-responsive\" appDoubleScroll>\r\n <table class=\"table\">\r\n <caption class=\"visually-hidden\" [innerHTML]=\"'_COMMON._TABLE.CAPTION' | translate: { label: title } \"></caption>\r\n <thead>\r\n <tr>\r\n @if(checkbox) {\r\n <th scope=\"col\" width=\"10\">\r\n <div class=\"field-check\">\r\n <input class=\"field-check-input\" type=\"checkbox\" id=\"checkme\" [checked]=\"allSelected\"\r\n [indeterminate]=\"someSelected\" (change)=\"toggleAll()\">\r\n <label class=\"field-check-label\" for=\"checkme\">\r\n <span class=\"visually-hidden\">{{ '_COMMON._TABLE._THEAD.CHECK_LINE' | translate }}</span>\r\n </label>\r\n </div>\r\n </th>\r\n }\r\n\r\n @for (column of columns; track column.key) {\r\n @if (!column.hidden) {\r\n <th scope=\"col\" [class.p-0]=\"column.sort\">\r\n @if (column.sort) {\r\n <button [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\r\n {{ column.label | translate}}\r\n <span class=\"sorting-icons\"></span>\r\n </button>\r\n }\r\n @else {\r\n {{ column.label | translate }}\r\n }\r\n </th>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (loading) {\r\n <tr>\r\n <td colspan=\"100\">\r\n <cw-loader></cw-loader>\r\n </td>\r\n </tr>\r\n }\r\n @else if (!data || data.length === 0) {\r\n <tr>\r\n <td class=\"table-info no-result\" colspan=\"100\">\r\n {{ '_COMMON._TABLE.NO_RESULT' | translate }}\r\n </td>\r\n </tr>\r\n }\r\n @else {\r\n @for (row of data; track row) {\r\n <tr [class.tr-selected]=\"isSelected(row)\" [class]=\"getRowClass(row)\">\r\n @if (checkbox) {\r\n <td>\r\n <input class=\"field-check-input\" type=\"checkbox\" [checked]=\"isSelected(row)\" (change)=\"toggleRow(row)\" [id]=\"'check-' + row.id\"\r\n [attr.aria-label]=\"'Sélectionner la ligne ' + row.id\">\r\n <label class=\"visually-hidden\" [for]=\"'check-' + row.id\">Sélectionner la ligne {{row.id}}</label>\r\n </td>\r\n }\r\n @for (column of columns; track column.key) {\r\n @if (!column.hidden) {\r\n <td [class.text-end]=\"column.align === 'right'\" [class.text-center]=\"column.align === 'center'\">\r\n @switch (column.type) {\r\n @case ('link') {\r\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row)\">\r\n {{ row[column.key] | translate }}\r\n </a>\r\n }\r\n @case ('badge') {\r\n <cw-badge\r\n [type]=\"getBadge(column, row[column.key]).type\"\r\n [label]=\"getBadge(column, row[column.key]).label ?? row[column.key]\"\r\n [withIcon]=\"getBadge(column, row[column.key]).withIcon\"\r\n [iconPosition]=\"getBadge(column, row[column.key]).iconPosition\"></cw-badge>\r\n }\r\n @case ('icon') {\r\n <cw-icon\r\n [icon]=\"row[column.key].icon\"\r\n [label]=\"row[column.key].label\"\r\n [type]=\"iconType.default\"\r\n [iconSize]=\"iconSize['md']\"\r\n [iconCssClass]=\"row[column.key].iconCssClass\"\r\n ></cw-icon>\r\n }\r\n @case ('image') {\r\n <cw-image\r\n [source]=\"row[column.key].source\"\r\n [alt]=\"row[column.key].label\"\r\n [isAriaHidden]=\"true\"\r\n [cssClass]=\"row[column.key].iconCssClass\"\r\n width=\"32\"\r\n height=\"32\"\r\n ></cw-image>\r\n }\r\n @case ('actions') {\r\n <ng-container\r\n *ngTemplateOutlet=\"actionsTemplate; context: { $implicit: row }\">\r\n </ng-container>\r\n }\r\n @default {\r\n {{ row[column.key] | translate }}\r\n }\r\n }\r\n </td>\r\n }\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n@if (pagination) {\r\n <cw-pagination\r\n [pagination]=\"pagination\"\r\n (paginationChange)=\"paginationChange.emit($event)\">\r\n </cw-pagination>\r\n}\r\n","import { Component, DestroyRef, effect, inject, input, output } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { BoButtonTypeEnum, ButtonComponent, FormFieldComponent, FormFieldOption, FormFieldTypeEnum } from '@cityway/basic-ui';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { debounceTime } from 'rxjs';\r\nimport { FilterFieldConfig, FilterValues } from '../../models/filter-config.model';\r\n\r\nconst RANGE_TYPES = new Set([\r\n FormFieldTypeEnum.dateToDate,\r\n FormFieldTypeEnum.dateTimeToDateTime,\r\n FormFieldTypeEnum.timeToTime\r\n]);\r\n\r\n@Component({\r\n selector: 'cw-filter-bar',\r\n templateUrl: './filter-bar.component.html',\r\n imports: [\r\n ReactiveFormsModule,\r\n FormFieldComponent,\r\n ButtonComponent,\r\n TranslateModule\r\n ]\r\n})\r\nexport class FilterBarComponent {\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly filters = input.required<FilterFieldConfig[]>();\r\n readonly manual = input(false);\r\n readonly applyLabel = input('_COMMON._ACTION.FILTER');\r\n readonly resetLabel = input('_COMMON._ACTION.RESET');\r\n\r\n readonly filtersApplied = output<FilterValues>();\r\n readonly filtersReset = output<void>();\r\n\r\n readonly uiType = BoButtonTypeEnum;\r\n filterForm = new FormGroup({});\r\n\r\n private defaults: FilterValues = {};\r\n\r\n constructor() {\r\n effect(() => {\r\n this.buildForm(this.filters());\r\n });\r\n }\r\n\r\n private buildForm(configs: FilterFieldConfig[]): void {\r\n const group: Record<string, FormControl | FormGroup> = {};\r\n const defaults: FilterValues = {};\r\n\r\n for (const field of configs) {\r\n if (RANGE_TYPES.has(field.type)) {\r\n const def = field.defaultValue ?? { start: '', end: '' };\r\n group[field.key] = new FormGroup({\r\n start: new FormControl(def.start ?? ''),\r\n end: new FormControl(def.end ?? '')\r\n });\r\n defaults[field.key] = { ...def };\r\n } else {\r\n const def = field.defaultValue ?? '';\r\n group[field.key] = new FormControl(def);\r\n defaults[field.key] = def;\r\n }\r\n }\r\n\r\n this.defaults = defaults;\r\n this.filterForm = new FormGroup(group);\r\n\r\n if (!this.manual()) {\r\n this.filterForm.valueChanges\r\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\r\n .subscribe(values => this.filtersApplied.emit(values as FilterValues));\r\n }\r\n }\r\n\r\n getControl(key: string): FormControl | FormGroup {\r\n return this.filterForm.get(key) as FormControl | FormGroup;\r\n }\r\n\r\n resolveOptions(field: FilterFieldConfig): FormFieldOption[] {\r\n if (!field.options) return [];\r\n return typeof field.options === 'function' ? field.options() : field.options;\r\n }\r\n\r\n apply(): void {\r\n this.filtersApplied.emit(this.filterForm.value as FilterValues);\r\n }\r\n\r\n reset(): void {\r\n this.filterForm.reset(this.defaults);\r\n this.filtersReset.emit();\r\n if (this.manual()) {\r\n this.filtersApplied.emit(this.filterForm.value as FilterValues);\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"filterForm\" (ngSubmit)=\"apply()\">\r\n <div class=\"d-flex-h flex-wrap gap-gutter py-md\">\r\n @for (field of filters(); track field.key) {\r\n <div class=\"filter-field\" [class]=\"field.colClass ?? ''\">\r\n <cw-form-field\r\n [label]=\"field.label | translate\"\r\n [displayLabel]=\"false\"\r\n [type]=\"field.type\"\r\n [placeholder]=\"(field.placeholder ?? '') | translate\"\r\n [options]=\"resolveOptions(field)\"\r\n [control]=\"getControl(field.key)\">\r\n </cw-form-field>\r\n </div>\r\n }\r\n <div class=\"d-flex-h gap-md\">\r\n @if (manual()) {\r\n <cw-button\r\n [label]=\"applyLabel() | translate\"\r\n [type]=\"uiType.ghost\"\r\n (btnAction)=\"apply()\">\r\n </cw-button>\r\n }\r\n <cw-button\r\n [label]=\"resetLabel() | translate\"\r\n [type]=\"uiType.ghost\"\r\n (btnAction)=\"reset()\">\r\n </cw-button>\r\n </div>\r\n </div>\r\n</form>\r\n","import { HttpParams } from '@angular/common/http';\r\nimport { FilterValues } from '../models/filter-config.model';\r\n\r\nexport function buildFilterParams(\r\n filters: FilterValues,\r\n keyMap?: Record<string, string | { startKey: string; endKey: string }>\r\n): HttpParams {\r\n let params = new HttpParams();\r\n\r\n for (const [key, value] of Object.entries(filters)) {\r\n if (value == null || value === '') continue;\r\n\r\n const mapping = keyMap?.[key];\r\n\r\n if (typeof value === 'object' && 'start' in value && 'end' in value) {\r\n const rangeMap = mapping as { startKey: string; endKey: string } | undefined;\r\n if (value.start) params = params.set(rangeMap?.startKey ?? `${key}Start`, value.start);\r\n if (value.end) params = params.set(rangeMap?.endKey ?? `${key}End`, value.end);\r\n } else {\r\n const paramKey = typeof mapping === 'string' ? mapping : key;\r\n params = params.set(paramKey, String(value));\r\n }\r\n }\r\n\r\n return params;\r\n}\r\n","/*\r\n * Public API Surface of bo-ui\r\n */\r\n\r\n// LIB UI\r\n//---------------------------------------------------------\r\n// Lib ui components\r\nexport * from './lib/components/custom-list/custom-list.component';\r\nexport * from './lib/components/drag-n-drop-list/drag-n-drop-list.component';\r\nexport * from './lib/components/drag-n-drop-list/drag-drop.adapter';\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/filter-bar/filter-bar.component';\r\nexport * from './lib/components/pagination/pagination.component';\r\n// export * from './lib/components/wizard-stepper/wizard-stepper.component';\r\n// export * from './lib/components/wizard-stepper/components/wizard-step.component';\r\n\r\n\r\n// Lib Models\r\nexport * from './lib/models/custom-list.model';\r\nexport * from './lib/models/table.model';\r\nexport * from './lib/models/filter-config.model';\r\nexport * from './lib/models/drag-item.model';\r\nexport * from './lib/models/pagination.model';\r\n\r\n// Lib Utils\r\nexport * from './lib/utils/filter-params.util';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1"],"mappings":"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"}
1
+ {"version":3,"file":"cityway-bo-ui.mjs","sources":["../../../projects/bo-ui/src/lib/components/custom-list/custom-list.component.ts","../../../projects/bo-ui/src/lib/components/custom-list/custom-list.component.html","../../../projects/bo-ui/src/lib/components/drag-n-drop-list/drag-drop.adapter.ts","../../../projects/bo-ui/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.ts","../../../projects/bo-ui/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.html","../../../projects/bo-ui/src/lib/directives/double-scroll.ts","../../../projects/bo-ui/src/lib/components/pagination/pagination.component.ts","../../../projects/bo-ui/src/lib/components/pagination/pagination.component.html","../../../projects/bo-ui/src/lib/components/table/table.component.ts","../../../projects/bo-ui/src/lib/components/table/table.component.html","../../../projects/bo-ui/src/lib/components/filter-bar/filter-bar.component.ts","../../../projects/bo-ui/src/lib/components/filter-bar/filter-bar.component.html","../../../projects/bo-ui/src/lib/utils/filter-params.util.ts","../../../projects/bo-ui/src/public-api.ts","../../../projects/bo-ui/src/cityway-bo-ui.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\r\nimport { DataCustomListGroup } from '../../models/custom-list.model';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'cw-custom-list',\r\n templateUrl: './custom-list.component.html',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TranslateModule\r\n ]\r\n})\r\n\r\nexport class CustomListComponent implements OnInit {\r\n\r\n @Input() customListData: DataCustomListGroup[] = [];\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n hasValue(value: any): boolean {\r\n if (value === null || value === undefined) {\r\n return false;\r\n };\r\n if (typeof value === 'string' && value.trim() === '') {\r\n return false;\r\n };\r\n if (Array.isArray(value) && value.length === 0) {\r\n return false;\r\n };\r\n if (typeof value === 'object' && Object.keys(value).length === 0) {\r\n return false;\r\n };\r\n\r\n return true;\r\n }\r\n\r\n}\r\n","<div class=\"card custom-card-light\">\r\n <div class=\"card-body d-flex-v gap-md\">\r\n @for (group of customListData; track group.title) {\r\n @if (group.title) {\r\n <h3>{{ group.title | translate }}</h3>\r\n }\r\n\r\n <ul class=\"custom-description-list list-unstyled fs fs-sm\">\r\n @for (field of group.fields; track field.label) {\r\n @if (!field.hideIfEmpty || hasValue(field.value)) {\r\n <li>\r\n <div class=\"fs fw-bold\" [innerHTML]=\"'_LABEL.COLON' | translate: { label: (field.label | translate) }\"></div>\r\n <div>\r\n @switch (field.type) {\r\n @case ('date') {\r\n {{ field.value | date: 'short' }}\r\n }\r\n @case ('boolean') {\r\n {{ (field.value ? '_COMMON._PRO_SENTENCE.YES' : '_COMMON._PRO_SENTENCE.NO') | translate }}\r\n }\r\n @case ('html') {\r\n <span [innerHTML]=\"field.value\"></span>\r\n }\r\n @default {\r\n {{ field.translateValue ? (field.value | translate) : field.value }}\r\n }\r\n }\r\n </div>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n }\r\n </div>\r\n</div>\r\n","import { AbstractControl, FormArray } from '@angular/forms';\r\nimport { DragItem } from '../../models/drag-item.model';\r\n\r\n\r\nexport interface DragDropAdapter<T = any> {\r\n toDragItems(source: T): DragItem[];\r\n fromDragItems(items: DragItem[], source: T, peers?: T[]): void;\r\n}\r\n\r\n// Adaptateur pour DragItem[] (identité)\r\nexport class ArrayAdapter implements DragDropAdapter<DragItem[]> {\r\n toDragItems(source: DragItem[]): DragItem[] {\r\n return source;\r\n }\r\n fromDragItems(items: DragItem[], source: DragItem[], _peers?: DragItem[][]): void {\r\n source.splice(0, source.length, ...items);\r\n }\r\n}\r\n\r\n// Adaptateur pour FormArray\r\nexport class FormArrayAdapter implements DragDropAdapter<FormArray> {\r\n\r\n constructor(\r\n private readonly mapper: (ctrl: AbstractControl, index: number) => DragItem,\r\n private readonly reorderFn?: (ctrl: AbstractControl, newOrder: number) => void\r\n ) {}\r\n\r\n toDragItems(source: FormArray): DragItem[] {\r\n return source.controls.map((ctrl, i) => this.mapper(ctrl, i));\r\n }\r\n\r\n fromDragItems(items: DragItem[], source: FormArray, peers: FormArray[] = []): void {\r\n // Cherche le control correspondant à un id dans la source ou les FormArray voisines\r\n // (cas du transfert inter-colonnes : le control n'est pas encore dans `source`)\r\n const findCtrl = (id: DragItem['id']): AbstractControl | undefined => {\r\n const inSource = source.controls.find(c => this.mapper(c, 0).id === id);\r\n if (inSource) return inSource;\r\n for (const peer of peers) {\r\n const found = peer.controls.find(c => this.mapper(c, 0).id === id);\r\n if (found) return found;\r\n }\r\n return undefined;\r\n };\r\n\r\n const controls = items\r\n .map(item => findCtrl(item.id))\r\n .filter((c): c is AbstractControl => c != null);\r\n\r\n // Détacher des peers les controls qu'on va re-pousser ici (évite la double appartenance)\r\n for (const peer of peers) {\r\n for (const ctrl of controls) {\r\n const idx = peer.controls.indexOf(ctrl);\r\n if (idx >= 0) peer.removeAt(idx, { emitEvent: false });\r\n }\r\n }\r\n\r\n while (source.length) source.removeAt(0, { emitEvent: false });\r\n controls.forEach((ctrl, i) => {\r\n if (this.reorderFn) this.reorderFn(ctrl, i + 1);\r\n source.push(ctrl, { emitEvent: false });\r\n });\r\n source.updateValueAndValidity();\r\n }\r\n}\r\n","import {\r\n CdkDragDrop, DragDropModule,\r\n moveItemInArray, transferArrayItem\r\n} from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, Output, TemplateRef } from '@angular/core';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { ArrayAdapter, DragDropAdapter } from './drag-drop.adapter';\r\nimport { DragItem, DragListColumn } from '../../models/drag-item.model';\r\nimport { CardComponent } from '@cityway/basic-ui';\r\n\r\n@Component({\r\n selector: 'cw-drag-n-drop-list',\r\n templateUrl: './drag-n-drop-list.component.html',\r\n standalone: true,\r\n imports: [CommonModule, TranslateModule, DragDropModule, CardComponent]\r\n})\r\nexport class DragNDropListComponent implements OnChanges {\r\n\r\n @Input() availableItems: any;\r\n @Input() activeItems: any;\r\n @Input() adapter: DragDropAdapter = new ArrayAdapter();\r\n @Input() itemTemplate?: TemplateRef<any>;\r\n\r\n @Input() availableColumn: DragListColumn = { title: 'Disponibles' };\r\n @Input() activeColumn: DragListColumn = { title: 'Activés' };\r\n @Input() reorderOnDrop = false;\r\n\r\n @Output() availableItemsChange = new EventEmitter<any>();\r\n @Output() activeItemsChange = new EventEmitter<any>();\r\n\r\n // Copies internes sur lesquelles le CDK travaille\r\n _available: DragItem[] = [];\r\n _active: DragItem[] = [];\r\n\r\n ngOnChanges(): void {\r\n this._available = this.adapter.toDragItems(this.availableItems);\r\n this._active = this.adapter.toDragItems(this.activeItems);\r\n }\r\n\r\n drop(event: CdkDragDrop<DragItem[]>): void {\r\n if (event.previousContainer === event.container) {\r\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\r\n } else {\r\n transferArrayItem(\r\n event.previousContainer.data,\r\n event.container.data,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n }\r\n\r\n if (this.reorderOnDrop) {\r\n this._available.forEach((item, i) => item.order = i + 1);\r\n this._active.forEach((item, i) => item.order = i + 1);\r\n }\r\n\r\n // Répercuter sur la source originale via l'adaptateur.\r\n // On passe la colonne voisine en `peers` pour permettre à l'adaptateur de\r\n // retrouver un control transféré qui n'est pas encore dans la source cible.\r\n this.adapter.fromDragItems(this._available, this.availableItems, [this.activeItems]);\r\n this.adapter.fromDragItems(this._active, this.activeItems, [this.availableItems]);\r\n\r\n this.availableItemsChange.emit(this.availableItems);\r\n this.activeItemsChange.emit(this.activeItems);\r\n }\r\n}\r\n","<div class=\"drag-drop-list row\">\r\n <div class=\"col-lg-6 d-flex-v gap-4xs\">\r\n <div class=\"fs fs-md fw-bold\">{{ availableColumn.title | translate }}</div>\r\n @if (availableColumn.description) {\r\n <p class=\"fs fs-md\">{{ availableColumn.description | translate }}</p>\r\n }\r\n @if (availableColumn.descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-md\" [innerHTML]=\"availableColumn.descriptionRwd | translate\"></p>\r\n }\r\n <ul class=\"list-unstyled drag-drop-list-column drag-drop-list-column-available\" [ngClass]=\"availableColumn.cssClass\"\r\n cdkDropList #availableList=\"cdkDropList\"\r\n [cdkDropListData]=\"_available\"\r\n [cdkDropListConnectedTo]=\"[activeList]\"\r\n (cdkDropListDropped)=\"drop($event)\">\r\n @for (item of _available; track item.id) {\r\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\r\n <cw-card>\r\n <ng-container *ngTemplateOutlet=\"itemTemplate || defaultTemplate; context: { $implicit: item }\"/>\r\n </cw-card>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div class=\"col-lg-6 d-flex-v gap-4xs\">\r\n <div class=\"fs fs-md fw-bold\">{{ activeColumn.title | translate }}</div>\r\n @if (activeColumn.description) {\r\n <p class=\"fs fs-md\">{{ activeColumn.description | translate }}</p>\r\n }\r\n @if (activeColumn.descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-md\" [innerHTML]=\"activeColumn.descriptionRwd | translate\"></p>\r\n }\r\n <ul class=\"list-unstyled drag-drop-list-column drag-drop-list-column-active\" [ngClass]=\"activeColumn.cssClass\"\r\n cdkDropList #activeList=\"cdkDropList\"\r\n [cdkDropListData]=\"_active\"\r\n [cdkDropListConnectedTo]=\"[availableList]\"\r\n (cdkDropListDropped)=\"drop($event)\">\r\n @for (item of _active; track item.id) {\r\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\r\n <cw-card>\r\n <ng-container *ngTemplateOutlet=\"itemTemplate || defaultTemplate; context: { $implicit: item }\"/>\r\n </cw-card>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultTemplate let-item>\r\n <div class=\"default-item d-flex justify-content-between\">\r\n <span>\r\n {{ item.label }}\r\n @if (item.code) { <span class=\"text-muted\">({{ item.code }})</span> }\r\n </span>\r\n @if (item.order != null) {\r\n <span class=\"fw-bold\">#{{ item.order }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n","import { AfterViewChecked, Directive, ElementRef, HostListener, OnDestroy, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appDoubleScroll]'\r\n})\r\n\r\nexport class DoubleScrollDirective implements OnInit, AfterViewChecked, OnDestroy {\r\n\r\n scroll: any;\r\n div: any;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) {\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize() {\r\n this.adaptScrollWidth();\r\n }\r\n\r\n // Si scroll le tableau on scroll aussi div.table-responsive-double-scroll\r\n @HostListener('scroll', ['$event'])\r\n onScroll() {\r\n this.div.scrollLeft = this.el.nativeElement.scrollLeft;\r\n }\r\n\r\n ngOnInit() {\r\n\r\n // On applique un margin-top à 0 à la table.\r\n this.el.nativeElement.style.marginTop = '0';\r\n\r\n // On crée le div.table-responsive-double-scroll et on l'insère avant le tableau\r\n this.div = this.renderer.createElement('div');\r\n this.renderer.addClass(this.div, 'table-responsive-double-scroll');\r\n this.renderer.insertBefore(this.el.nativeElement.parentNode, this.div, this.el.nativeElement);\r\n\r\n // On crée le div.scroll et on l'insère dans le div.table-responsive-double-scroll\r\n this.scroll = this.renderer.createElement('div');\r\n this.renderer.addClass(this.scroll, 'scroll');\r\n this.renderer.appendChild(this.div, this.scroll);\r\n\r\n // Si on scroll div.table-responsive-double-scroll on scroll aussi le tableau\r\n this.div.addEventListener('scroll', function() {\r\n //this.nextSibling.scrollLeft = this.scrollLeft;\r\n this.nextSibling.style.transform = \"translateX(-\" + this.scrollLeft + \"px)\";\r\n });\r\n }\r\n\r\n adaptScrollWidth() {\r\n // On donne à div.scroll la taille du tableau\r\n if (this.el.nativeElement.firstChild.offsetWidth > this.el.nativeElement.offsetWidth) {\r\n this.scroll.style.width = (this.el.nativeElement.firstChild.offsetWidth + 17) + 'px';\r\n } else {\r\n this.scroll.style.widdth = 'auto';\r\n }\r\n }\r\n\r\n ngAfterViewChecked() {\r\n this.adaptScrollWidth();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.div.removeEventListener('scroll', null);\r\n }\r\n}\r\n","import { Component, computed, input, output, effect } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { PaginationChangeEvent, Pagination } from '../../models/pagination.model';\r\nimport {\r\n BoButtonTypeEnum,\r\n ButtonComponent,\r\n FormFieldComponent,\r\n FormFieldTypeEnum,\r\n SpriteIconEnum,\r\n ButtonIconSizeEnum,\r\n FormFieldOption\r\n} from '@cityway/basic-ui';\r\n\r\ntype PageItem = number | { type: 'jump-prev' | 'jump-next'; page: number };\r\n\r\n@Component({\r\n selector: 'cw-pagination',\r\n standalone: true,\r\n imports: [TranslateModule, ButtonComponent, FormFieldComponent, ReactiveFormsModule],\r\n templateUrl: './pagination.component.html',\r\n})\r\nexport class PaginationComponent {\r\n pagination = input.required<Pagination>();\r\n paginationChange = output<PaginationChangeEvent>();\r\n\r\n readonly spriteIcon = SpriteIconEnum;\r\n readonly typeField = FormFieldTypeEnum;\r\n readonly typeButton = BoButtonTypeEnum;\r\n readonly buttonIconSize = ButtonIconSizeEnum;\r\n\r\n readonly pageSizes = [25, 50, 100, 200, 300];\r\n\r\n readonly pageSizesOptions: FormFieldOption[] = this.pageSizes.map(size => ({\r\n label: size.toString(),\r\n value: size.toString()\r\n }));\r\n\r\n itemsPerPageControl = new FormControl<string | null>(null);\r\n\r\n constructor() {\r\n effect(() => {\r\n const value = this.pagination().itemsPerPage;\r\n if (value != null) {\r\n this.itemsPerPageControl.setValue(value.toString(), { emitEvent: false });\r\n }\r\n });\r\n\r\n this.itemsPerPageControl.valueChanges.subscribe(value => {\r\n if (value !== null) {\r\n this.onItemsPerPageChange(Number(value));\r\n }\r\n });\r\n }\r\n\r\n\r\n readonly visiblePages = computed<PageItem[]>(() => {\r\n const { currentPage, totalPages } = this.pagination();\r\n\r\n const pages: PageItem[] = [];\r\n const pageBuffer = 2;\r\n\r\n if (totalPages <= 7) {\r\n return Array.from({ length: totalPages }, (_, i) => i + 1);\r\n }\r\n\r\n // Toujours 1\r\n pages.push(1);\r\n\r\n if (currentPage <= 4) {\r\n for (let i = 2; i <= 5; i++) {\r\n pages.push(i);\r\n }\r\n pages.push({\r\n type: 'jump-next',\r\n page: currentPage + 5\r\n });\r\n }\r\n\r\n else if (currentPage >= totalPages - 3) {\r\n pages.push({\r\n type: 'jump-prev',\r\n page: currentPage - 5\r\n });\r\n\r\n for (let i = totalPages - 4; i < totalPages; i++) {\r\n pages.push(i);\r\n }\r\n }\r\n\r\n else {\r\n pages.push({\r\n type: 'jump-prev',\r\n page: currentPage - 5\r\n });\r\n\r\n for (let i = currentPage - pageBuffer; i <= currentPage + pageBuffer; i++) {\r\n pages.push(i);\r\n }\r\n\r\n pages.push({\r\n type: 'jump-next',\r\n page: currentPage + 5\r\n });\r\n }\r\n\r\n // Toujours last\r\n pages.push(totalPages);\r\n\r\n return pages;\r\n });\r\n\r\n emit(page: number): void {\r\n this.paginationChange.emit({\r\n page,\r\n itemsPerPage: Number(this.itemsPerPageControl.value) || this.pagination().itemsPerPage\r\n });\r\n }\r\n\r\n onItemsPerPageChange(value: number): void {\r\n this.paginationChange.emit({\r\n page: 1,\r\n itemsPerPage: value\r\n });\r\n }\r\n}\r\n","@if (pagination().totalPages > 0) {\r\n<div class=\"pagination d-flex-h gap-md justify-between fs fs-sm\">\r\n\r\n <!-- LEFT PART -->\r\n <div class=\"d-flex-h gap-sm\">\r\n {{ '_COMMON._PAGINATION.RESULT_P' | translate: {total: pagination().totalItems } }}\r\n -\r\n {{ '_COMMON._PAGINATION.DISPLAY' | translate }}\r\n\r\n <cw-form-field\r\n [label]=\"'_COMMON._PAGINATION.ITEMS_PER_PAGE'\"\r\n [type]=\"typeField.select\"\r\n [control]=\"itemsPerPageControl\"\r\n [options]=\"pageSizesOptions\"\r\n [displayLabel]=\"false\"\r\n [clearable]=\"false\">\r\n </cw-form-field>\r\n\r\n {{ '_COMMON._PAGINATION.ITEMS_PER_PAGE' | translate }}\r\n </div>\r\n\r\n <!-- PAGINATION -->\r\n <ul class=\"list-unstyled d-flex-h gap-none\">\r\n\r\n <!-- PREVIOUS -->\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n [withOnlyIcon]=\"true\"\r\n [withIcon]=\"spriteIcon.nextLeft\"\r\n [isDisabled]=\"pagination().currentPage <= 1\"\r\n [iconSize]=\"buttonIconSize.small\"\r\n cssClass=\"btn-pagination\"\r\n (btnAction)=\"emit(pagination().currentPage - 1)\">\r\n </cw-button>\r\n </li>\r\n\r\n <!-- PAGES -->\r\n @for (item of visiblePages(); track item) {\r\n\r\n <!-- NUMBER -->\r\n @if (typeof item === 'number') {\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n [label]=\"item.toString()\"\r\n [cssClass]=\"item === pagination().currentPage ? 'btn-pagination btn-pagination-active' : 'btn-pagination'\"\r\n (btnAction)=\"emit(item)\">\r\n </cw-button>\r\n </li>\r\n }\r\n\r\n <!-- JUMP PREV -->\r\n @else if (item.type === 'jump-prev') {\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n label=\"...\"\r\n cssClass=\"btn-pagination\"\r\n (btnAction)=\"emit(item.page)\">\r\n </cw-button>\r\n </li>\r\n }\r\n\r\n <!-- JUMP NEXT -->\r\n @else if (item.type === 'jump-next') {\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n label=\"...\"\r\n cssClass=\"btn-pagination\"\r\n (btnAction)=\"emit(item.page)\">\r\n </cw-button>\r\n </li>\r\n }\r\n }\r\n\r\n <!-- NEXT -->\r\n <li>\r\n <cw-button\r\n [type]=\"typeButton.ghost\"\r\n [withOnlyIcon]=\"true\"\r\n [withIcon]=\"spriteIcon.nextRight\"\r\n [isDisabled]=\"pagination().currentPage >= pagination().totalPages\"\r\n [iconSize]=\"buttonIconSize.small\"\r\n cssClass=\"btn-pagination\"\r\n (btnAction)=\"emit(pagination().currentPage + 1)\">\r\n </cw-button>\r\n </li>\r\n\r\n </ul>\r\n</div>\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n output,\n signal,\n TemplateRef\n} from '@angular/core';\nimport { BadgeComponent, BadgeTypeEnum, IconComponent, IconSizeEnum, IconTypeEnum, ImageComponent, LoaderComponent } from '@cityway/basic-ui';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DoubleScrollDirective } from '../../directives/double-scroll';\nimport { BadgeConfig, CellClickEvent, SortDirection, SortEvent, TableColumn } from '../../models/table.model';\nimport { PaginationChangeEvent, Pagination } from '../../models/pagination.model';\nimport { PaginationComponent } from '../pagination/pagination.component';\n\n@Component({\n selector: 'cw-table',\n templateUrl: './table.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n TranslateModule,\n DoubleScrollDirective,\n LoaderComponent,\n BadgeComponent,\n NgTemplateOutlet,\n PaginationComponent,\n IconComponent,\n ImageComponent\n ]\n})\nexport class TableComponent {\n\n readonly checkbox = input(false);\n readonly title = input<string>('');\n readonly columns = input<TableColumn[]>([]);\n readonly data = input<any[]>([]);\n readonly loading = input(false);\n readonly rowClassFn = input<((row: any) => string) | undefined>(undefined);\n readonly pagination = input<Pagination | undefined>(undefined);\n\n readonly rowClick = output<any>();\n readonly cellClick = output<CellClickEvent>();\n readonly sortChange = output<SortEvent>();\n readonly selectionChange = output<any[]>();\n readonly paginationChange = output<PaginationChangeEvent>();\n\n readonly actionsTemplate = contentChild<TemplateRef<{ $implicit: any }>>('actionsTemplate');\n\n readonly iconType = IconTypeEnum;\n readonly iconSize = IconSizeEnum;\n\n readonly currentSortKey = signal<string | null>(null);\n readonly currentSortDirection = signal<SortDirection>('asc');\n readonly selectedRows = signal<Set<any>>(new Set<any>());\n\n readonly allSelected = computed(() => {\n const rows = this.data();\n return rows.length > 0 && this.selectedRows().size === rows.length;\n });\n\n readonly someSelected = computed(() => {\n return this.selectedRows().size > 0 && !this.allSelected();\n });\n\n ngOnInit(): void {\n const defaultColumn = this.columns().find(c => c.defaultSort);\n if (defaultColumn) {\n this.currentSortKey.set(defaultColumn.key);\n this.currentSortDirection.set(defaultColumn.defaultSort!);\n }\n }\n\n public getRowClass(row: any): string {\n const fn = this.rowClassFn();\n return fn ? fn(row) : '';\n }\n\n public setSortProperty(key: string): void {\n if (this.currentSortKey() === key) {\n this.currentSortDirection.update(dir => dir === 'asc' ? 'desc' : 'asc');\n } else {\n this.currentSortKey.set(key);\n this.currentSortDirection.set('asc');\n }\n this.sortChange.emit({ key: this.currentSortKey()!, direction: this.currentSortDirection() });\n }\n\n public getSortClass(key: string): string {\n if (this.currentSortKey() !== key) return 'sorting-btn';\n return this.currentSortDirection() === 'asc' ? 'sorting-btn sorting-asc' : 'sorting-btn sorting-desc';\n }\n\n public getBadge(column: TableColumn, value: string): BadgeConfig {\n return column.badges?.find(b => b.value === value)\n ?? { value, type: BadgeTypeEnum.lightLight };\n }\n\n public onCellClick(row: any, column: TableColumn): void {\n this.cellClick.emit({ row, column });\n if (column.type === 'link') {\n this.rowClick.emit(row);\n }\n }\n\n public isClickable(column: TableColumn): boolean {\n return column.type === 'link' || !!column.clickable;\n }\n\n public toggleAll(): void {\n this.selectedRows.update(current => {\n if (current.size === this.data().length) {\n return new Set<any>();\n }\n return new Set<any>(this.data());\n });\n this.selectionChange.emit([...this.selectedRows()]);\n }\n\n public toggleRow(row: any): void {\n this.selectedRows.update(current => {\n const next = new Set(current);\n if (next.has(row)) {\n next.delete(row);\n } else {\n next.add(row);\n }\n return next;\n });\n this.selectionChange.emit([...this.selectedRows()]);\n }\n\n public isSelected(row: any): boolean {\n return this.selectedRows().has(row);\n }\n}\n","@if (checkbox() && selectedRows().size > 0) {\n <div class=\"table-selection-info mb-2\">\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </div>\n}\n\n<div class=\"table-responsive\" appDoubleScroll>\n <table class=\"table\">\n <caption class=\"visually-hidden\" [innerHTML]=\"'_COMMON._TABLE.CAPTION' | translate: { label: title() } \"></caption>\n <thead>\n <tr>\n @if(checkbox()) {\n <th scope=\"col\" width=\"10\">\n <div class=\"field-check\">\n <input class=\"field-check-input\" type=\"checkbox\" id=\"checkme\" [checked]=\"allSelected()\"\n [indeterminate]=\"someSelected()\" (change)=\"toggleAll()\">\n <label class=\"field-check-label\" for=\"checkme\">\n <span class=\"visually-hidden\">{{ '_COMMON._TABLE._THEAD.CHECK_LINE' | translate }}</span>\n </label>\n </div>\n </th>\n }\n\n @for (column of columns(); track column.key) {\n @if (!column.hidden) {\n <th scope=\"col\" [class.p-0]=\"column.sort\">\n @if (column.sort) {\n <button [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <span class=\"sorting-icons\"></span>\n </button>\n }\n @else {\n {{ column.label | translate }}\n }\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td colspan=\"100\">\n <cw-loader></cw-loader>\n </td>\n </tr>\n }\n @else if (!data() || data().length === 0) {\n <tr>\n <td class=\"table-info no-result\" colspan=\"100\">\n {{ '_COMMON._TABLE.NO_RESULT' | translate }}\n </td>\n </tr>\n }\n @else {\n @for (row of data(); track row) {\n <tr [class.tr-selected]=\"isSelected(row)\" [class]=\"getRowClass(row)\">\n @if (checkbox()) {\n <td>\n <input class=\"field-check-input\" type=\"checkbox\" [checked]=\"isSelected(row)\" (change)=\"toggleRow(row)\" [id]=\"'check-' + row.id\"\n [attr.aria-label]=\"'Sélectionner la ligne ' + row.id\">\n <label class=\"visually-hidden\" [for]=\"'check-' + row.id\">Sélectionner la ligne {{row.id}}</label>\n </td>\n }\n @for (column of columns(); track column.key) {\n @if (!column.hidden) {\n <td [class.text-end]=\"column.align === 'right'\" [class.text-center]=\"column.align === 'center'\">\n @switch (column.type) {\n @case ('link') {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\">\n {{ row[column.key] | translate }}\n </a>\n }\n @case ('badge') {\n <cw-badge\n [type]=\"getBadge(column, row[column.key]).type\"\n [label]=\"getBadge(column, row[column.key]).label ?? row[column.key]\"\n [withIcon]=\"getBadge(column, row[column.key]).withIcon\"\n [iconPosition]=\"getBadge(column, row[column.key]).iconPosition\"></cw-badge>\n }\n @case ('icon') {\n @if (isClickable(column)) {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\" [attr.aria-label]=\"row[column.key].label\">\n <cw-icon\n [icon]=\"row[column.key].icon\"\n [label]=\"row[column.key].label\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['md']\"\n [iconCssClass]=\"row[column.key].iconCssClass\"\n ></cw-icon>\n </a>\n } @else {\n <cw-icon\n [icon]=\"row[column.key].icon\"\n [label]=\"row[column.key].label\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['md']\"\n [iconCssClass]=\"row[column.key].iconCssClass\"\n ></cw-icon>\n }\n }\n @case ('image') {\n @if (isClickable(column)) {\n <a href=\"javascript:void(0)\" (click)=\"onCellClick(row, column)\" [attr.aria-label]=\"row[column.key].label\">\n <cw-image\n [source]=\"row[column.key].source\"\n [alt]=\"row[column.key].label\"\n [isAriaHidden]=\"true\"\n [cssClass]=\"row[column.key].iconCssClass\"\n width=\"32\"\n height=\"32\"\n ></cw-image>\n </a>\n } @else {\n <cw-image\n [source]=\"row[column.key].source\"\n [alt]=\"row[column.key].label\"\n [isAriaHidden]=\"true\"\n [cssClass]=\"row[column.key].iconCssClass\"\n width=\"32\"\n height=\"32\"\n ></cw-image>\n }\n }\n @case ('actions') {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\n @default {\n {{ row[column.key] | translate }}\n }\n }\n </td>\n }\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (pagination()) {\n <cw-pagination\n [pagination]=\"pagination()!\"\n (paginationChange)=\"paginationChange.emit($event)\">\n </cw-pagination>\n}\n","import { Component, DestroyRef, effect, inject, input, output } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { BoButtonTypeEnum, ButtonComponent, FormFieldComponent, FormFieldOption, FormFieldTypeEnum } from '@cityway/basic-ui';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { debounceTime } from 'rxjs';\r\nimport { FilterFieldConfig, FilterValues } from '../../models/filter-config.model';\r\n\r\nconst RANGE_TYPES = new Set([\r\n FormFieldTypeEnum.dateToDate,\r\n FormFieldTypeEnum.dateTimeToDateTime,\r\n FormFieldTypeEnum.timeToTime\r\n]);\r\n\r\n@Component({\r\n selector: 'cw-filter-bar',\r\n templateUrl: './filter-bar.component.html',\r\n imports: [\r\n ReactiveFormsModule,\r\n FormFieldComponent,\r\n ButtonComponent,\r\n TranslateModule\r\n ]\r\n})\r\nexport class FilterBarComponent {\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly filters = input.required<FilterFieldConfig[]>();\r\n readonly manual = input(false);\r\n readonly applyLabel = input('_COMMON._ACTION.FILTER');\r\n readonly resetLabel = input('_COMMON._ACTION.RESET');\r\n\r\n readonly filtersApplied = output<FilterValues>();\r\n readonly filtersReset = output<void>();\r\n\r\n readonly uiType = BoButtonTypeEnum;\r\n filterForm = new FormGroup({});\r\n\r\n private defaults: FilterValues = {};\r\n\r\n constructor() {\r\n effect(() => {\r\n this.buildForm(this.filters());\r\n });\r\n }\r\n\r\n private buildForm(configs: FilterFieldConfig[]): void {\r\n const group: Record<string, FormControl | FormGroup> = {};\r\n const defaults: FilterValues = {};\r\n\r\n for (const field of configs) {\r\n if (RANGE_TYPES.has(field.type)) {\r\n const def = field.defaultValue ?? { start: '', end: '' };\r\n group[field.key] = new FormGroup({\r\n start: new FormControl(def.start ?? ''),\r\n end: new FormControl(def.end ?? '')\r\n });\r\n defaults[field.key] = { ...def };\r\n } else {\r\n const def = field.defaultValue ?? '';\r\n group[field.key] = new FormControl(def);\r\n defaults[field.key] = def;\r\n }\r\n }\r\n\r\n this.defaults = defaults;\r\n this.filterForm = new FormGroup(group);\r\n\r\n if (!this.manual()) {\r\n this.filterForm.valueChanges\r\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\r\n .subscribe(values => this.filtersApplied.emit(values as FilterValues));\r\n }\r\n }\r\n\r\n getControl(key: string): FormControl | FormGroup {\r\n return this.filterForm.get(key) as FormControl | FormGroup;\r\n }\r\n\r\n resolveOptions(field: FilterFieldConfig): FormFieldOption[] {\r\n if (!field.options) return [];\r\n return typeof field.options === 'function' ? field.options() : field.options;\r\n }\r\n\r\n apply(): void {\r\n this.filtersApplied.emit(this.filterForm.value as FilterValues);\r\n }\r\n\r\n reset(): void {\r\n this.filterForm.reset(this.defaults);\r\n this.filtersReset.emit();\r\n if (this.manual()) {\r\n this.filtersApplied.emit(this.filterForm.value as FilterValues);\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"filterForm\" (ngSubmit)=\"apply()\">\r\n <div class=\"d-flex-h flex-wrap gap-gutter py-md\">\r\n @for (field of filters(); track field.key) {\r\n <div class=\"filter-field\" [class]=\"field.colClass ?? ''\">\r\n <cw-form-field\r\n [label]=\"field.label | translate\"\r\n [displayLabel]=\"false\"\r\n [type]=\"field.type\"\r\n [placeholder]=\"(field.placeholder ?? '') | translate\"\r\n [options]=\"resolveOptions(field)\"\r\n [control]=\"getControl(field.key)\">\r\n </cw-form-field>\r\n </div>\r\n }\r\n <div class=\"d-flex-h gap-md\">\r\n @if (manual()) {\r\n <cw-button\r\n [label]=\"applyLabel() | translate\"\r\n [type]=\"uiType.ghost\"\r\n (btnAction)=\"apply()\">\r\n </cw-button>\r\n }\r\n <cw-button\r\n [label]=\"resetLabel() | translate\"\r\n [type]=\"uiType.ghost\"\r\n (btnAction)=\"reset()\">\r\n </cw-button>\r\n </div>\r\n </div>\r\n</form>\r\n","import { HttpParams } from '@angular/common/http';\r\nimport { FilterValues } from '../models/filter-config.model';\r\n\r\nexport function buildFilterParams(\r\n filters: FilterValues,\r\n keyMap?: Record<string, string | { startKey: string; endKey: string }>\r\n): HttpParams {\r\n let params = new HttpParams();\r\n\r\n for (const [key, value] of Object.entries(filters)) {\r\n if (value == null || value === '') continue;\r\n\r\n const mapping = keyMap?.[key];\r\n\r\n if (typeof value === 'object' && 'start' in value && 'end' in value) {\r\n const rangeMap = mapping as { startKey: string; endKey: string } | undefined;\r\n if (value.start) params = params.set(rangeMap?.startKey ?? `${key}Start`, value.start);\r\n if (value.end) params = params.set(rangeMap?.endKey ?? `${key}End`, value.end);\r\n } else {\r\n const paramKey = typeof mapping === 'string' ? mapping : key;\r\n params = params.set(paramKey, String(value));\r\n }\r\n }\r\n\r\n return params;\r\n}\r\n","/*\r\n * Public API Surface of bo-ui\r\n */\r\n\r\n// LIB UI\r\n//---------------------------------------------------------\r\n// Lib ui components\r\nexport * from './lib/components/custom-list/custom-list.component';\r\nexport * from './lib/components/drag-n-drop-list/drag-n-drop-list.component';\r\nexport * from './lib/components/drag-n-drop-list/drag-drop.adapter';\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/filter-bar/filter-bar.component';\r\nexport * from './lib/components/pagination/pagination.component';\r\n// export * from './lib/components/wizard-stepper/wizard-stepper.component';\r\n// export * from './lib/components/wizard-stepper/components/wizard-step.component';\r\n\r\n\r\n// Lib Models\r\nexport * from './lib/models/custom-list.model';\r\nexport * from './lib/models/table.model';\r\nexport * from './lib/models/filter-config.model';\r\nexport * from './lib/models/drag-item.model';\r\nexport * from './lib/models/pagination.model';\r\n\r\n// Lib Utils\r\nexport * from './lib/utils/filter-params.util';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
2
  import { OnInit, OnChanges, TemplateRef, EventEmitter, Signal } from '@angular/core';
3
3
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
4
4
  import { FormArray, AbstractControl, FormGroup, FormControl } from '@angular/forms';
@@ -23,8 +23,8 @@ declare class CustomListComponent implements OnInit {
23
23
  constructor();
24
24
  ngOnInit(): void;
25
25
  hasValue(value: any): boolean;
26
- static ɵfac: i0.ɵɵFactoryDeclaration<CustomListComponent, never>;
27
- static ɵcmp: i0.ɵɵComponentDeclaration<CustomListComponent, "cw-custom-list", never, { "customListData": { "alias": "customListData"; "required": false; }; }, {}, never, never, true, never>;
26
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CustomListComponent, never>;
27
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CustomListComponent, "cw-custom-list", never, { "customListData": { "alias": "customListData"; "required": false; }; }, {}, never, never, true, never>;
28
28
  }
29
29
 
30
30
  interface DragItem {
@@ -44,18 +44,18 @@ interface DragListColumn {
44
44
 
45
45
  interface DragDropAdapter<T = any> {
46
46
  toDragItems(source: T): DragItem[];
47
- fromDragItems(items: DragItem[], source: T): void;
47
+ fromDragItems(items: DragItem[], source: T, peers?: T[]): void;
48
48
  }
49
49
  declare class ArrayAdapter implements DragDropAdapter<DragItem[]> {
50
50
  toDragItems(source: DragItem[]): DragItem[];
51
- fromDragItems(items: DragItem[], source: DragItem[]): void;
51
+ fromDragItems(items: DragItem[], source: DragItem[], _peers?: DragItem[][]): void;
52
52
  }
53
53
  declare class FormArrayAdapter implements DragDropAdapter<FormArray> {
54
54
  private readonly mapper;
55
55
  private readonly reorderFn?;
56
56
  constructor(mapper: (ctrl: AbstractControl, index: number) => DragItem, reorderFn?: (ctrl: AbstractControl, newOrder: number) => void);
57
57
  toDragItems(source: FormArray): DragItem[];
58
- fromDragItems(items: DragItem[], source: FormArray): void;
58
+ fromDragItems(items: DragItem[], source: FormArray, peers?: FormArray[]): void;
59
59
  }
60
60
 
61
61
  declare class DragNDropListComponent implements OnChanges {
@@ -72,8 +72,8 @@ declare class DragNDropListComponent implements OnChanges {
72
72
  _active: DragItem[];
73
73
  ngOnChanges(): void;
74
74
  drop(event: CdkDragDrop<DragItem[]>): void;
75
- static ɵfac: i0.ɵɵFactoryDeclaration<DragNDropListComponent, never>;
76
- static ɵcmp: i0.ɵɵComponentDeclaration<DragNDropListComponent, "cw-drag-n-drop-list", never, { "availableItems": { "alias": "availableItems"; "required": false; }; "activeItems": { "alias": "activeItems"; "required": false; }; "adapter": { "alias": "adapter"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "availableColumn": { "alias": "availableColumn"; "required": false; }; "activeColumn": { "alias": "activeColumn"; "required": false; }; "reorderOnDrop": { "alias": "reorderOnDrop"; "required": false; }; }, { "availableItemsChange": "availableItemsChange"; "activeItemsChange": "activeItemsChange"; }, never, never, true, never>;
75
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DragNDropListComponent, never>;
76
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DragNDropListComponent, "cw-drag-n-drop-list", never, { "availableItems": { "alias": "availableItems"; "required": false; }; "activeItems": { "alias": "activeItems"; "required": false; }; "adapter": { "alias": "adapter"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "availableColumn": { "alias": "availableColumn"; "required": false; }; "activeColumn": { "alias": "activeColumn"; "required": false; }; "reorderOnDrop": { "alias": "reorderOnDrop"; "required": false; }; }, { "availableItemsChange": "availableItemsChange"; "activeItemsChange": "activeItemsChange"; }, never, never, true, never>;
77
77
  }
78
78
 
79
79
  type ColumnType = 'text' | 'badge' | 'link' | 'actions' | 'icon' | 'image';
@@ -101,6 +101,11 @@ interface TableColumn {
101
101
  sort?: boolean;
102
102
  defaultSort?: SortDirection;
103
103
  hidden?: boolean;
104
+ clickable?: boolean;
105
+ }
106
+ interface CellClickEvent {
107
+ row: any;
108
+ column: TableColumn;
104
109
  }
105
110
  interface TableConfig {
106
111
  rowClassFn?: (row: any) => string;
@@ -118,38 +123,40 @@ interface PaginationChangeEvent {
118
123
  }
119
124
 
120
125
  declare class TableComponent {
121
- checkbox: boolean;
122
- title: string;
123
- columns: TableColumn[];
124
- data: any[];
125
- loading: boolean;
126
- rowClassFn?: (row: any) => string;
127
- pagination?: Pagination;
128
- rowClick: EventEmitter<any>;
129
- sortChange: EventEmitter<SortEvent>;
130
- selectionChange: EventEmitter<any[]>;
131
- paginationChange: EventEmitter<PaginationChangeEvent>;
132
- actionsTemplate?: TemplateRef<{
126
+ readonly checkbox: _angular_core.InputSignal<boolean>;
127
+ readonly title: _angular_core.InputSignal<string>;
128
+ readonly columns: _angular_core.InputSignal<TableColumn[]>;
129
+ readonly data: _angular_core.InputSignal<any[]>;
130
+ readonly loading: _angular_core.InputSignal<boolean>;
131
+ readonly rowClassFn: _angular_core.InputSignal<(row: any) => string>;
132
+ readonly pagination: _angular_core.InputSignal<Pagination>;
133
+ readonly rowClick: _angular_core.OutputEmitterRef<any>;
134
+ readonly cellClick: _angular_core.OutputEmitterRef<CellClickEvent>;
135
+ readonly sortChange: _angular_core.OutputEmitterRef<SortEvent>;
136
+ readonly selectionChange: _angular_core.OutputEmitterRef<any[]>;
137
+ readonly paginationChange: _angular_core.OutputEmitterRef<PaginationChangeEvent>;
138
+ readonly actionsTemplate: _angular_core.Signal<TemplateRef<{
133
139
  $implicit: any;
134
- }>;
140
+ }>>;
135
141
  readonly iconType: typeof IconTypeEnum;
136
142
  readonly iconSize: typeof IconSizeEnum;
137
- currentSortKey: string | null;
138
- currentSortDirection: SortDirection;
139
- selectedRows: Set<any>;
140
- getRowClass(row: any): string;
143
+ readonly currentSortKey: _angular_core.WritableSignal<string>;
144
+ readonly currentSortDirection: _angular_core.WritableSignal<SortDirection>;
145
+ readonly selectedRows: _angular_core.WritableSignal<Set<any>>;
146
+ readonly allSelected: _angular_core.Signal<boolean>;
147
+ readonly someSelected: _angular_core.Signal<boolean>;
141
148
  ngOnInit(): void;
142
- get allSelected(): boolean;
143
- get someSelected(): boolean;
149
+ getRowClass(row: any): string;
144
150
  setSortProperty(key: string): void;
145
151
  getSortClass(key: string): string;
146
152
  getBadge(column: TableColumn, value: string): BadgeConfig;
147
- onCellClick(row: any): void;
153
+ onCellClick(row: any, column: TableColumn): void;
154
+ isClickable(column: TableColumn): boolean;
148
155
  toggleAll(): void;
149
156
  toggleRow(row: any): void;
150
157
  isSelected(row: any): boolean;
151
- static ɵfac: i0.ɵɵFactoryDeclaration<TableComponent, never>;
152
- static ɵcmp: i0.ɵɵComponentDeclaration<TableComponent, "cw-table", never, { "checkbox": { "alias": "checkbox"; "required": false; }; "title": { "alias": "title"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "rowClassFn": { "alias": "rowClassFn"; "required": false; }; "pagination": { "alias": "pagination"; "required": false; }; }, { "rowClick": "rowClick"; "sortChange": "sortChange"; "selectionChange": "selectionChange"; "paginationChange": "paginationChange"; }, ["actionsTemplate"], never, true, never>;
158
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableComponent, never>;
159
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableComponent, "cw-table", never, { "checkbox": { "alias": "checkbox"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "rowClassFn": { "alias": "rowClassFn"; "required": false; "isSignal": true; }; "pagination": { "alias": "pagination"; "required": false; "isSignal": true; }; }, { "rowClick": "rowClick"; "cellClick": "cellClick"; "sortChange": "sortChange"; "selectionChange": "selectionChange"; "paginationChange": "paginationChange"; }, ["actionsTemplate"], never, true, never>;
153
160
  }
154
161
 
155
162
  interface FilterFieldConfig {
@@ -165,12 +172,12 @@ type FilterValues = Record<string, any>;
165
172
 
166
173
  declare class FilterBarComponent {
167
174
  private readonly destroyRef;
168
- readonly filters: i0.InputSignal<FilterFieldConfig[]>;
169
- readonly manual: i0.InputSignal<boolean>;
170
- readonly applyLabel: i0.InputSignal<string>;
171
- readonly resetLabel: i0.InputSignal<string>;
172
- readonly filtersApplied: i0.OutputEmitterRef<FilterValues>;
173
- readonly filtersReset: i0.OutputEmitterRef<void>;
175
+ readonly filters: _angular_core.InputSignal<FilterFieldConfig[]>;
176
+ readonly manual: _angular_core.InputSignal<boolean>;
177
+ readonly applyLabel: _angular_core.InputSignal<string>;
178
+ readonly resetLabel: _angular_core.InputSignal<string>;
179
+ readonly filtersApplied: _angular_core.OutputEmitterRef<FilterValues>;
180
+ readonly filtersReset: _angular_core.OutputEmitterRef<void>;
174
181
  readonly uiType: typeof BoButtonTypeEnum;
175
182
  filterForm: FormGroup<{}>;
176
183
  private defaults;
@@ -180,8 +187,8 @@ declare class FilterBarComponent {
180
187
  resolveOptions(field: FilterFieldConfig): FormFieldOption[];
181
188
  apply(): void;
182
189
  reset(): void;
183
- static ɵfac: i0.ɵɵFactoryDeclaration<FilterBarComponent, never>;
184
- static ɵcmp: i0.ɵɵComponentDeclaration<FilterBarComponent, "cw-filter-bar", never, { "filters": { "alias": "filters"; "required": true; "isSignal": true; }; "manual": { "alias": "manual"; "required": false; "isSignal": true; }; "applyLabel": { "alias": "applyLabel"; "required": false; "isSignal": true; }; "resetLabel": { "alias": "resetLabel"; "required": false; "isSignal": true; }; }, { "filtersApplied": "filtersApplied"; "filtersReset": "filtersReset"; }, never, never, true, never>;
190
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterBarComponent, never>;
191
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterBarComponent, "cw-filter-bar", never, { "filters": { "alias": "filters"; "required": true; "isSignal": true; }; "manual": { "alias": "manual"; "required": false; "isSignal": true; }; "applyLabel": { "alias": "applyLabel"; "required": false; "isSignal": true; }; "resetLabel": { "alias": "resetLabel"; "required": false; "isSignal": true; }; }, { "filtersApplied": "filtersApplied"; "filtersReset": "filtersReset"; }, never, never, true, never>;
185
192
  }
186
193
 
187
194
  type PageItem = number | {
@@ -189,8 +196,8 @@ type PageItem = number | {
189
196
  page: number;
190
197
  };
191
198
  declare class PaginationComponent {
192
- pagination: i0.InputSignal<Pagination>;
193
- paginationChange: i0.OutputEmitterRef<PaginationChangeEvent>;
199
+ pagination: _angular_core.InputSignal<Pagination>;
200
+ paginationChange: _angular_core.OutputEmitterRef<PaginationChangeEvent>;
194
201
  readonly spriteIcon: typeof SpriteIconEnum;
195
202
  readonly typeField: typeof FormFieldTypeEnum;
196
203
  readonly typeButton: typeof BoButtonTypeEnum;
@@ -199,11 +206,11 @@ declare class PaginationComponent {
199
206
  readonly pageSizesOptions: FormFieldOption[];
200
207
  itemsPerPageControl: FormControl<string>;
201
208
  constructor();
202
- readonly visiblePages: i0.Signal<PageItem[]>;
209
+ readonly visiblePages: _angular_core.Signal<PageItem[]>;
203
210
  emit(page: number): void;
204
211
  onItemsPerPageChange(value: number): void;
205
- static ɵfac: i0.ɵɵFactoryDeclaration<PaginationComponent, never>;
206
- static ɵcmp: i0.ɵɵComponentDeclaration<PaginationComponent, "cw-pagination", never, { "pagination": { "alias": "pagination"; "required": true; "isSignal": true; }; }, { "paginationChange": "paginationChange"; }, never, never, true, never>;
212
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PaginationComponent, never>;
213
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PaginationComponent, "cw-pagination", never, { "pagination": { "alias": "pagination"; "required": true; "isSignal": true; }; }, { "paginationChange": "paginationChange"; }, never, never, true, never>;
207
214
  }
208
215
 
209
216
  declare function buildFilterParams(filters: FilterValues, keyMap?: Record<string, string | {
@@ -212,4 +219,4 @@ declare function buildFilterParams(filters: FilterValues, keyMap?: Record<string
212
219
  }>): HttpParams;
213
220
 
214
221
  export { ArrayAdapter, CustomListComponent, DragNDropListComponent, FilterBarComponent, FormArrayAdapter, PaginationComponent, TableComponent, buildFilterParams };
215
- export type { BadgeConfig, ColumnType, DataCustomList, DataCustomListGroup, DragDropAdapter, DragItem, DragListColumn, FilterFieldConfig, FilterValues, Pagination, PaginationChangeEvent, SortDirection, SortEvent, TableColumn, TableConfig };
222
+ export type { BadgeConfig, CellClickEvent, ColumnType, DataCustomList, DataCustomListGroup, DragDropAdapter, DragItem, DragListColumn, FilterFieldConfig, FilterValues, Pagination, PaginationChangeEvent, SortDirection, SortEvent, TableColumn, TableConfig };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cityway/bo-ui",
3
- "version": "1.0.10-beta010",
3
+ "version": "1.0.10-beta012",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.0",
6
6
  "@angular/core": "^20.3.0",
Binary file