@cityway/bo-ui 1.0.10-beta021 → 1.0.10-beta023

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
@@ -6,7 +6,7 @@ import * as i1 from '@angular/common';
6
6
  import { CommonModule, NgTemplateOutlet, Location } from '@angular/common';
7
7
  import * as i2 from '@angular/cdk/drag-drop';
8
8
  import { moveItemInArray, transferArrayItem, DragDropModule } from '@angular/cdk/drag-drop';
9
- import { CardComponent, SpriteIconEnum, FormFieldTypeEnum, BoButtonTypeEnum, ButtonIconSizeEnum, ButtonComponent, FormFieldComponent, ModalsService, IconTypeEnum, IconUiTypeEnum, IconSizeEnum, BadgeTypeEnum, ModalsType, LoaderComponent, BadgeComponent, IconComponent, ImageComponent, DropdownItemDirective } from '@cityway/basic-ui';
9
+ import { CardComponent, SpriteIconEnum, IconSizeEnum, BoButtonTypeEnum, ButtonPositionEnum, ButtonIconSizeEnum, CardTypeEnum, BadgeComponent, IconComponent, ButtonComponent, FormFieldTypeEnum, FormFieldComponent, ModalsService, IconTypeEnum, IconUiTypeEnum, BadgeTypeEnum, ModalsType, LoaderComponent, ImageComponent, DropdownItemDirective } from '@cityway/basic-ui';
10
10
  import * as i1$2 from '@angular/forms';
11
11
  import { FormControl, ReactiveFormsModule, FormGroup } from '@angular/forms';
12
12
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -149,7 +149,7 @@ class DragNDropListComponent {
149
149
  this.activeItemsChange.emit(this.activeItems());
150
150
  }
151
151
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: DragNDropListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
152
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.20", type: DragNDropListComponent, isStandalone: true, selector: "cw-drag-n-drop-list", inputs: { availableItems: { classPropertyName: "availableItems", publicName: "availableItems", isSignal: true, isRequired: false, transformFunction: null }, activeItems: { classPropertyName: "activeItems", publicName: "activeItems", isSignal: true, isRequired: false, transformFunction: null }, adapter: { classPropertyName: "adapter", publicName: "adapter", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, availableColumn: { classPropertyName: "availableColumn", publicName: "availableColumn", isSignal: true, isRequired: false, transformFunction: null }, activeColumn: { classPropertyName: "activeColumn", publicName: "activeColumn", isSignal: true, isRequired: false, transformFunction: null }, reorderOnDrop: { classPropertyName: "reorderOnDrop", publicName: "reorderOnDrop", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { availableItemsChange: "availableItemsChange", activeItemsChange: "activeItemsChange" }, ngImport: i0, template: "<div class=\"drag-drop-list row\">\r\n <div class=\"col-lg-6 d-flex-v gap-4xs\">\r\n <div class=\"fs fs-xs fw-bold\">{{ availableColumn().title | translate }}</div>\r\n @if (availableColumn().description) {\r\n <p class=\"fs fs-xs\">{{ availableColumn().description | translate }}</p>\r\n }\r\n @if (availableColumn().descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-xs\" [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-xs fw-bold\">{{ activeColumn().title | translate }}</div>\r\n @if (activeColumn().description) {\r\n <p class=\"fs fs-xs\">{{ activeColumn().description | translate }}</p>\r\n }\r\n @if (activeColumn().descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-xs\" [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", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: CardComponent, selector: "cw-card", inputs: ["title", "subtitle", "type", "titleRank", "collapsible", "collapsed", "collapseId", "destroyOnHide"], outputs: ["collapsibleChange", "destroyOnHideChange", "collapseClicked"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
152
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.20", type: DragNDropListComponent, isStandalone: true, selector: "cw-drag-n-drop-list", inputs: { availableItems: { classPropertyName: "availableItems", publicName: "availableItems", isSignal: true, isRequired: false, transformFunction: null }, activeItems: { classPropertyName: "activeItems", publicName: "activeItems", isSignal: true, isRequired: false, transformFunction: null }, adapter: { classPropertyName: "adapter", publicName: "adapter", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, availableColumn: { classPropertyName: "availableColumn", publicName: "availableColumn", isSignal: true, isRequired: false, transformFunction: null }, activeColumn: { classPropertyName: "activeColumn", publicName: "activeColumn", isSignal: true, isRequired: false, transformFunction: null }, reorderOnDrop: { classPropertyName: "reorderOnDrop", publicName: "reorderOnDrop", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { availableItemsChange: "availableItemsChange", activeItemsChange: "activeItemsChange" }, ngImport: i0, template: "<div class=\"drag-drop-list row\">\r\n <div class=\"col-lg-6 d-flex-v gap-4xs\">\r\n <div class=\"fs fs-xs fw-bold\">{{ availableColumn().title | translate }}</div>\r\n @if (availableColumn().description) {\r\n <p class=\"fs fs-xs\">{{ availableColumn().description | translate }}</p>\r\n }\r\n @if (availableColumn().descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-xs\" [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-xs fw-bold\">{{ activeColumn().title | translate }}</div>\r\n @if (activeColumn().description) {\r\n <p class=\"fs fs-xs\">{{ activeColumn().description | translate }}</p>\r\n }\r\n @if (activeColumn().descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-xs\" [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", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: CardComponent, selector: "cw-card", inputs: ["title", "subtitle", "type", "titleRank", "cssClass", "collapsible", "collapsed", "collapseStretched", "collapseId", "destroyOnHide"], outputs: ["collapsibleChange", "destroyOnHideChange", "collapseClicked"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
153
153
  }
154
154
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: DragNDropListComponent, decorators: [{
155
155
  type: Component,
@@ -162,7 +162,22 @@ class DragNDropNestedListComponent {
162
162
  this.itemTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "itemTemplate" }] : []));
163
163
  this.column = input(undefined, ...(ngDevMode ? [{ debugName: "column" }] : []));
164
164
  this.reorderOnDrop = input(false, ...(ngDevMode ? [{ debugName: "reorderOnDrop" }] : []));
165
+ /**
166
+ * Profondeur maximale autorisée (index 0-based, racine = 0). Une carte à `depth < maxDepth`
167
+ * peut recevoir des enfants (même vide) ; une carte à `depth >= maxDepth` est terminale.
168
+ * `undefined` => imbrication infinie (ajout possible partout). Ex. `maxDepth = 1` => 2 niveaux.
169
+ */
170
+ this.maxDepth = input(undefined, ...(ngDevMode ? [{ debugName: "maxDepth" }] : []));
165
171
  this.itemsChange = output();
172
+ this.view = output();
173
+ this.edit = output();
174
+ this.delete = output();
175
+ this.add = output();
176
+ this.spriteIcon = SpriteIconEnum;
177
+ this.iconSize = IconSizeEnum;
178
+ this.buttonType = BoButtonTypeEnum;
179
+ this.buttonPosition = ButtonPositionEnum;
180
+ this.buttonIconSize = ButtonIconSizeEnum;
166
181
  // Copie interne mutable sur laquelle le CDK opère (pas un signal — cf. DragNDropListComponent)
167
182
  this._items = [];
168
183
  effect(() => {
@@ -180,6 +195,69 @@ class DragNDropNestedListComponent {
180
195
  }
181
196
  this.itemsChange.emit(this._items);
182
197
  }
198
+ /**
199
+ * Une carte n'est pliable que si elle a des enfants OU qu'on peut lui en ajouter.
200
+ * `column.collapsible === false` désactive globalement.
201
+ */
202
+ isCollapsible(item, depth) {
203
+ if (this.column()?.collapsible === false)
204
+ return false;
205
+ const hasChildren = (item.children?.length ?? 0) > 0;
206
+ return hasChildren || this.canAdd(item, depth);
207
+ }
208
+ /**
209
+ * Peut-on ajouter des enfants à cette carte ? Résolution :
210
+ * override item (`actions.add`) → override colonne (`showAdd`) → plafond `maxDepth`
211
+ * (`depth < maxDepth`) → sinon `true` (imbrication infinie). Indépendant du fait
212
+ * d'avoir déjà des enfants : une carte vide reste addable.
213
+ */
214
+ canAdd(item, depth) {
215
+ if (item.actions?.add !== undefined)
216
+ return item.actions.add;
217
+ const colDefault = this.column()?.showAdd;
218
+ if (colDefault !== undefined)
219
+ return colDefault;
220
+ const max = this.maxDepth();
221
+ if (max !== undefined)
222
+ return depth < max;
223
+ return true;
224
+ }
225
+ /** Visibilité d'une action (view/edit/delete) : override item → défaut colonne → true. */
226
+ showAction(item, action) {
227
+ const override = item.actions?.[action];
228
+ if (override !== undefined)
229
+ return override;
230
+ const col = this.column();
231
+ const colDefault = {
232
+ view: col?.showView,
233
+ edit: col?.showEdit,
234
+ delete: col?.showDelete,
235
+ }[action];
236
+ return colDefault ?? true;
237
+ }
238
+ /**
239
+ * Libellé du compteur d'enfants, en gérant singulier/pluriel.
240
+ * Affiché aussi à `0` quand la carte est vide mais peut recevoir des enfants
241
+ * (ex. « 0 rubrique »). Masqué sur une carte terminale sans enfant.
242
+ */
243
+ childrenCountLabel(item, depth) {
244
+ const count = item.children?.length ?? 0;
245
+ if (count === 0 && !this.canAdd(item, depth))
246
+ return null;
247
+ const noun = count <= 1
248
+ ? (item.childrenLabelSingular ?? item.childrenLabel)
249
+ : item.childrenLabel;
250
+ if (noun)
251
+ return `${count} ${noun}`;
252
+ return count > 0 ? `${count}` : null;
253
+ }
254
+ onAdd(parent, depth) {
255
+ this.add.emit({ parent, depth });
256
+ }
257
+ /** Alterne le type de carte selon la profondeur : pair => default, impair => light. */
258
+ cardType(depth) {
259
+ return depth % 2 === 0 ? CardTypeEnum.default : CardTypeEnum.light;
260
+ }
183
261
  applyOrderRecursive(nodes) {
184
262
  nodes.forEach((node, i) => {
185
263
  node.order = i + 1;
@@ -194,12 +272,12 @@ class DragNDropNestedListComponent {
194
272
  }));
195
273
  }
196
274
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: DragNDropNestedListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
197
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.20", type: DragNDropNestedListComponent, isStandalone: true, selector: "cw-drag-n-drop-nested-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: false, transformFunction: null }, reorderOnDrop: { classPropertyName: "reorderOnDrop", publicName: "reorderOnDrop", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemsChange: "itemsChange" }, ngImport: i0, template: "<div class=\"drag-drop-nested-list d-flex-v gap-4xs\">\n @if (column()?.title) {\n <div class=\"fs fs-xs fw-bold\">{{ column()!.title | translate }}</div>\n }\n @if (column()?.description) {\n <p class=\"fs fs-xs\">{{ column()!.description | translate }}</p>\n }\n @if (column()?.descriptionRwd) {\n <p class=\"d-sm-none fs fs-xs\" [innerHTML]=\"column()!.descriptionRwd | translate\"></p>\n }\n\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: _items, depth: 0 }\"/>\n</div>\n\n<!--\n Template r\u00E9cursif : \u00E0 chaque niveau, on rend un cdkDropList isol\u00E9\n (pas de cdkDropListConnectedTo => transfert inter-listes impossible),\n puis on r\u00E9-instancie le m\u00EAme template pour la sous-liste de chaque enfant.\n-->\n<ng-template #nodeTpl let-nodes let-depth=\"depth\">\n <ul class=\"list-unstyled drag-drop-nested-list-column\" [ngClass]=\"column()?.cssClass\"\n [attr.data-depth]=\"depth\"\n cdkDropList\n [cdkDropListData]=\"nodes\"\n (cdkDropListDropped)=\"drop($event)\">\n @for (item of nodes; track item.id) {\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\n <cw-card>\n <ng-container *ngTemplateOutlet=\"itemTemplate() || defaultTemplate; context: { $implicit: item, depth: depth }\"/>\n @if (item.children?.length) {\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: item.children, depth: depth + 1 }\"/>\n }\n </cw-card>\n </li>\n }\n </ul>\n</ng-template>\n\n<ng-template #defaultTemplate let-item>\n <div class=\"default-item d-flex justify-content-between\">\n <span>\n {{ item.label }}\n @if (item.code) { <span class=\"text-muted\">({{ item.code }})</span> }\n </span>\n @if (item.order != null) {\n <span class=\"fw-bold\">#{{ item.order }}</span>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: CardComponent, selector: "cw-card", inputs: ["title", "subtitle", "type", "titleRank", "collapsible", "collapsed", "collapseId", "destroyOnHide"], outputs: ["collapsibleChange", "destroyOnHideChange", "collapseClicked"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
275
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.20", type: DragNDropNestedListComponent, isStandalone: true, selector: "cw-drag-n-drop-nested-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: false, transformFunction: null }, reorderOnDrop: { classPropertyName: "reorderOnDrop", publicName: "reorderOnDrop", isSignal: true, isRequired: false, transformFunction: null }, maxDepth: { classPropertyName: "maxDepth", publicName: "maxDepth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemsChange: "itemsChange", view: "view", edit: "edit", delete: "delete", add: "add" }, ngImport: i0, template: "<div class=\"ddn-list d-flex-v gap-4xs\">\n <div class=\"d-flex-h justify-between\">\n @if (column()?.title) {\n <h2>{{ column()!.title | translate }}</h2>\n }\n\n @if (column()?.showAddRoot) {\n <cw-button cssClass=\"ddn-list-add\" [type]=\"buttonType.link\" [withIcon]=\"spriteIcon.add\"\n [iconPosition]=\"buttonPosition.left\" [label]=\"column()?.addRootLabel ?? column()?.addLabel ?? '_COMMON._ACTION.ADD'\"\n (btnAction)=\"onAdd(undefined, 0)\" />\n }\n </div>\n\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: _items, depth: 0, parent: undefined }\" />\n</div>\n\n<!--\n Template r\u00E9cursif : \u00E0 chaque niveau, on rend un cdkDropList isol\u00E9\n (pas de cdkDropListConnectedTo => transfert inter-listes impossible),\n puis on r\u00E9-instancie le m\u00EAme template pour la sous-liste de chaque enfant.\n-->\n<ng-template #nodeTpl let-nodes let-depth=\"depth\" let-parent=\"parent\">\n <ul class=\"list-unstyled d-flex-v gap-md ms-none\" [ngClass]=\"column()?.cssClass\" [attr.data-depth]=\"depth\"\n cdkDropList [cdkDropListData]=\"nodes\" (cdkDropListDropped)=\"drop($event)\">\n\n @for (item of nodes; track item.id) {\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\n <cw-card [cssClass]=\"'ddn-list-card'\" [title]=\"(item.title ?? item.label) || ''\"\n [subtitle]=\"item.subtitle ?? ''\" [type]=\"cardType(depth)\" [collapsible]=\"isCollapsible(item, depth)\"\n [collapsed]=\"isCollapsible(item, depth)\" [collapseStretched]=\"false\">\n\n <!-- Poign\u00E9e de drag (\u00E0 gauche du titre) : le glisser ne d\u00E9marre que d'ici -->\n <button header-start type=\"button\" class=\"ddn-list-handle\" cdkDragHandle\n [disabled]=\"item.disabled ?? false\" [attr.aria-label]=\"'_COMMON._ACTION.MOVE' | translate\">\n <cw-icon [icon]=\"spriteIcon.grip\" [iconSize]=\"iconSize['md']\" />\n </button>\n\n <!-- En-t\u00EAte : compteur d'enfants + badge + actions -->\n <div header-custom-area class=\"d-flex-h gap-2xs justify-end align-start\">\n @if (childrenCountLabel(item, depth); as count) {\n <span class=\"ddn-list-count fs fs-xs\">{{ count }}</span>\n }\n\n @if (item.badge) {\n <cw-badge [type]=\"item.badge.type\" [label]=\"item.badge.label\" [withIcon]=\"item.badge.icon\" />\n }\n\n @if (showAction(item, 'view')) {\n <cw-button label=\"_COMMON._ACTION.VIEW\" [withIcon]=\"spriteIcon.search\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"view.emit(item)\" />\n }\n @if (showAction(item, 'edit')) {\n <cw-button label=\"_COMMON._ACTION.EDIT\" [withIcon]=\"spriteIcon.edit\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"edit.emit(item)\" />\n }\n @if (showAction(item, 'delete')) {\n <cw-button label=\"_COMMON._ACTION.DELETE\" [withIcon]=\"spriteIcon.trash\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-delete\"\n [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"delete.emit(item)\" />\n }\n </div>\n\n <!-- Corps : template custom (slot) ou fallback -->\n <ng-container\n *ngTemplateOutlet=\"itemTemplate() || defaultTemplate; context: { $implicit: item, depth: depth }\" />\n\n @if (item.children?.length) {\n <ng-container\n *ngTemplateOutlet=\"nodeTpl; context: { $implicit: item.children, depth: depth + 1, parent: item }\" />\n }\n\n @if (canAdd(item, depth)) {\n <div class=\"d-flex-h justify-end\">\n <cw-button class=\"ddn-list-add\" [type]=\"buttonType.link\" [withIcon]=\"spriteIcon.add\"\n [iconPosition]=\"buttonPosition.left\" [label]=\"column()?.addLabel ?? '_COMMON._ACTION.ADD'\"\n (btnAction)=\"onAdd(item, depth + 1)\" />\n </div>\n }\n </cw-card>\n </li>\n }\n\n </ul>\n</ng-template>\n\n<ng-template #defaultTemplate let-item>\n <div class=\"default-item d-flex justify-content-between\">\n <span>\n {{ item.label }}\n @if (item.code) { <span class=\"text-muted\">({{ item.code }})</span> }\n </span>\n @if (item.order != null) {\n <span class=\"fw-bold\">#{{ item.order }}</span>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: CardComponent, selector: "cw-card", inputs: ["title", "subtitle", "type", "titleRank", "cssClass", "collapsible", "collapsed", "collapseStretched", "collapseId", "destroyOnHide"], outputs: ["collapsibleChange", "destroyOnHideChange", "collapseClicked"] }, { kind: "component", type: BadgeComponent, selector: "cw-badge", inputs: ["type", "label", "withIcon", "iconPosition", "cssClass", "skeletonMode", "dataTest"] }, { kind: "component", type: IconComponent, selector: "cw-icon", inputs: ["icon", "label", "type", "iconSize", "iconCssClass", "iconUiType", "iconColorCustom", "spritePath"] }, { kind: "component", type: ButtonComponent, selector: "cw-button", inputs: ["type", "label", "id", "link", "isDropdown", "hideCaret", "withIcon", "withOnlyIcon", "iconSize", "iconPosition", "dropdownPosition", "isMinWidth", "isDisabled", "isLoading", "cssClass", "dataTest", "skeletonMode", "withTooltip", "tooltipText", "tooltipTitle", "tooltipTrigger", "tooltipPosition", "tooltipType"], outputs: ["btnAction", "dropDownClicked"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
198
276
  }
199
277
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: DragNDropNestedListComponent, decorators: [{
200
278
  type: Component,
201
- args: [{ selector: 'cw-drag-n-drop-nested-list', standalone: true, imports: [CommonModule, TranslateModule, DragDropModule, CardComponent], template: "<div class=\"drag-drop-nested-list d-flex-v gap-4xs\">\n @if (column()?.title) {\n <div class=\"fs fs-xs fw-bold\">{{ column()!.title | translate }}</div>\n }\n @if (column()?.description) {\n <p class=\"fs fs-xs\">{{ column()!.description | translate }}</p>\n }\n @if (column()?.descriptionRwd) {\n <p class=\"d-sm-none fs fs-xs\" [innerHTML]=\"column()!.descriptionRwd | translate\"></p>\n }\n\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: _items, depth: 0 }\"/>\n</div>\n\n<!--\n Template r\u00E9cursif : \u00E0 chaque niveau, on rend un cdkDropList isol\u00E9\n (pas de cdkDropListConnectedTo => transfert inter-listes impossible),\n puis on r\u00E9-instancie le m\u00EAme template pour la sous-liste de chaque enfant.\n-->\n<ng-template #nodeTpl let-nodes let-depth=\"depth\">\n <ul class=\"list-unstyled drag-drop-nested-list-column\" [ngClass]=\"column()?.cssClass\"\n [attr.data-depth]=\"depth\"\n cdkDropList\n [cdkDropListData]=\"nodes\"\n (cdkDropListDropped)=\"drop($event)\">\n @for (item of nodes; track item.id) {\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\n <cw-card>\n <ng-container *ngTemplateOutlet=\"itemTemplate() || defaultTemplate; context: { $implicit: item, depth: depth }\"/>\n @if (item.children?.length) {\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: item.children, depth: depth + 1 }\"/>\n }\n </cw-card>\n </li>\n }\n </ul>\n</ng-template>\n\n<ng-template #defaultTemplate let-item>\n <div class=\"default-item d-flex justify-content-between\">\n <span>\n {{ item.label }}\n @if (item.code) { <span class=\"text-muted\">({{ item.code }})</span> }\n </span>\n @if (item.order != null) {\n <span class=\"fw-bold\">#{{ item.order }}</span>\n }\n </div>\n</ng-template>\n" }]
202
- }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], column: [{ type: i0.Input, args: [{ isSignal: true, alias: "column", required: false }] }], reorderOnDrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "reorderOnDrop", required: false }] }], itemsChange: [{ type: i0.Output, args: ["itemsChange"] }] } });
279
+ args: [{ selector: 'cw-drag-n-drop-nested-list', standalone: true, imports: [CommonModule, TranslateModule, DragDropModule, CardComponent, BadgeComponent, IconComponent, ButtonComponent], template: "<div class=\"ddn-list d-flex-v gap-4xs\">\n <div class=\"d-flex-h justify-between\">\n @if (column()?.title) {\n <h2>{{ column()!.title | translate }}</h2>\n }\n\n @if (column()?.showAddRoot) {\n <cw-button cssClass=\"ddn-list-add\" [type]=\"buttonType.link\" [withIcon]=\"spriteIcon.add\"\n [iconPosition]=\"buttonPosition.left\" [label]=\"column()?.addRootLabel ?? column()?.addLabel ?? '_COMMON._ACTION.ADD'\"\n (btnAction)=\"onAdd(undefined, 0)\" />\n }\n </div>\n\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: _items, depth: 0, parent: undefined }\" />\n</div>\n\n<!--\n Template r\u00E9cursif : \u00E0 chaque niveau, on rend un cdkDropList isol\u00E9\n (pas de cdkDropListConnectedTo => transfert inter-listes impossible),\n puis on r\u00E9-instancie le m\u00EAme template pour la sous-liste de chaque enfant.\n-->\n<ng-template #nodeTpl let-nodes let-depth=\"depth\" let-parent=\"parent\">\n <ul class=\"list-unstyled d-flex-v gap-md ms-none\" [ngClass]=\"column()?.cssClass\" [attr.data-depth]=\"depth\"\n cdkDropList [cdkDropListData]=\"nodes\" (cdkDropListDropped)=\"drop($event)\">\n\n @for (item of nodes; track item.id) {\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\n <cw-card [cssClass]=\"'ddn-list-card'\" [title]=\"(item.title ?? item.label) || ''\"\n [subtitle]=\"item.subtitle ?? ''\" [type]=\"cardType(depth)\" [collapsible]=\"isCollapsible(item, depth)\"\n [collapsed]=\"isCollapsible(item, depth)\" [collapseStretched]=\"false\">\n\n <!-- Poign\u00E9e de drag (\u00E0 gauche du titre) : le glisser ne d\u00E9marre que d'ici -->\n <button header-start type=\"button\" class=\"ddn-list-handle\" cdkDragHandle\n [disabled]=\"item.disabled ?? false\" [attr.aria-label]=\"'_COMMON._ACTION.MOVE' | translate\">\n <cw-icon [icon]=\"spriteIcon.grip\" [iconSize]=\"iconSize['md']\" />\n </button>\n\n <!-- En-t\u00EAte : compteur d'enfants + badge + actions -->\n <div header-custom-area class=\"d-flex-h gap-2xs justify-end align-start\">\n @if (childrenCountLabel(item, depth); as count) {\n <span class=\"ddn-list-count fs fs-xs\">{{ count }}</span>\n }\n\n @if (item.badge) {\n <cw-badge [type]=\"item.badge.type\" [label]=\"item.badge.label\" [withIcon]=\"item.badge.icon\" />\n }\n\n @if (showAction(item, 'view')) {\n <cw-button label=\"_COMMON._ACTION.VIEW\" [withIcon]=\"spriteIcon.search\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"view.emit(item)\" />\n }\n @if (showAction(item, 'edit')) {\n <cw-button label=\"_COMMON._ACTION.EDIT\" [withIcon]=\"spriteIcon.edit\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"edit.emit(item)\" />\n }\n @if (showAction(item, 'delete')) {\n <cw-button label=\"_COMMON._ACTION.DELETE\" [withIcon]=\"spriteIcon.trash\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-delete\"\n [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"delete.emit(item)\" />\n }\n </div>\n\n <!-- Corps : template custom (slot) ou fallback -->\n <ng-container\n *ngTemplateOutlet=\"itemTemplate() || defaultTemplate; context: { $implicit: item, depth: depth }\" />\n\n @if (item.children?.length) {\n <ng-container\n *ngTemplateOutlet=\"nodeTpl; context: { $implicit: item.children, depth: depth + 1, parent: item }\" />\n }\n\n @if (canAdd(item, depth)) {\n <div class=\"d-flex-h justify-end\">\n <cw-button class=\"ddn-list-add\" [type]=\"buttonType.link\" [withIcon]=\"spriteIcon.add\"\n [iconPosition]=\"buttonPosition.left\" [label]=\"column()?.addLabel ?? '_COMMON._ACTION.ADD'\"\n (btnAction)=\"onAdd(item, depth + 1)\" />\n </div>\n }\n </cw-card>\n </li>\n }\n\n </ul>\n</ng-template>\n\n<ng-template #defaultTemplate let-item>\n <div class=\"default-item d-flex justify-content-between\">\n <span>\n {{ item.label }}\n @if (item.code) { <span class=\"text-muted\">({{ item.code }})</span> }\n </span>\n @if (item.order != null) {\n <span class=\"fw-bold\">#{{ item.order }}</span>\n }\n </div>\n</ng-template>\n" }]
280
+ }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], column: [{ type: i0.Input, args: [{ isSignal: true, alias: "column", required: false }] }], reorderOnDrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "reorderOnDrop", required: false }] }], maxDepth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDepth", required: false }] }], itemsChange: [{ type: i0.Output, args: ["itemsChange"] }], view: [{ type: i0.Output, args: ["view"] }], edit: [{ type: i0.Output, args: ["edit"] }], delete: [{ type: i0.Output, args: ["delete"] }], add: [{ type: i0.Output, args: ["add"] }] } });
203
281
 
204
282
  class DoubleScrollDirective {
205
283
  constructor(el, renderer) {
@@ -587,7 +665,7 @@ class TableComponent {
587
665
  return typeof descriptor.link === 'function' ? descriptor.link(row) : descriptor.link;
588
666
  }
589
667
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
590
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.20", 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 }, bulkActions: { classPropertyName: "bulkActions", publicName: "bulkActions", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellClick: "cellClick", sortChange: "sortChange", selectionChange: "selectionChange", paginationChange: "paginationChange", bulkDelete: "bulkDelete", bulkAction: "bulkAction" }, 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 d-flex align-items-center gap-2 flex-wrap\">\n <span>\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </span>\n @for (action of bulkActions(); track $index) {\n <cw-button\n [type]=\"resolveVariant(action)\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"resolveDisabled(action)\"\n (btnAction)=\"onBulkActionClick(action)\">\n </cw-button>\n }\n </div>\n}\n\n<div class=\"table-responsive\">\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=\"d-flex-h gap-2xs\" [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <cw-icon\n [icon]=\"getSortIcon(column.key)\"\n [label]=\"'_COMMON._TABLE._SORT.LABEL' | translate\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['2xs']\"></cw-icon>\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 [class.td-ations]=\"column.type === 'actions'\">\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 ('check') {\n @if (isTruthy(row[column.key])) {\n <cw-icon\n [icon]=\"spriteIcon.checkCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.YES' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-success\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n } @else {\n <cw-icon\n [icon]=\"spriteIcon.closeCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.NO' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-danger\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n }\n }\n @case ('actions') {\n @if (usingRowActions) {\n @let actions = getResolvedActions(row);\n @if (actions.length > 0) {\n @if (!useDropdownActions()) {\n @for (action of actions; track $index) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n } @else {\n <cw-button\n [label]=\"'_COMMON._TABLE.ACTIONS_MENU'\"\n [withIcon]=\"spriteIcon.menuVertical\"\n [withOnlyIcon]=\"true\"\n [type]=\"buttonType.ghost\"\n [isDropdown]=\"true\"\n [hideCaret]=\"true\">\n <ul class=\"p-0 m-0\">\n @for (action of actions; track $index) {\n <li>\n @if (action.link) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\">\n </cw-button>\n } @else {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n </li>\n }\n </ul>\n </cw-button>\n }\n }\n } @else {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\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: "component", type: LoaderComponent, selector: "cw-loader" }, { kind: "component", type: BadgeComponent, selector: "cw-badge", inputs: ["type", "label", "withIcon", "iconPosition", "cssClass", "skeletonMode", "dataTest"] }, { kind: "component", type: ButtonComponent, selector: "cw-button", inputs: ["type", "label", "id", "link", "isDropdown", "hideCaret", "withIcon", "withOnlyIcon", "iconSize", "iconPosition", "dropdownPosition", "isMinWidth", "isDisabled", "isLoading", "cssClass", "dataTest", "skeletonMode", "withTooltip", "tooltipText", "tooltipTitle", "tooltipTrigger", "tooltipPosition", "tooltipType"], outputs: ["btnAction", "dropDownClicked"] }, { 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 }); }
668
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.20", 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 }, bulkActions: { classPropertyName: "bulkActions", publicName: "bulkActions", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellClick: "cellClick", sortChange: "sortChange", selectionChange: "selectionChange", paginationChange: "paginationChange", bulkDelete: "bulkDelete", bulkAction: "bulkAction" }, 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 d-flex align-items-center gap-2 flex-wrap\">\n <span>\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </span>\n @for (action of bulkActions(); track $index) {\n <cw-button\n [type]=\"resolveVariant(action)\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"resolveDisabled(action)\"\n (btnAction)=\"onBulkActionClick(action)\">\n </cw-button>\n }\n </div>\n}\n\n<div class=\"table-responsive\">\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=\"d-flex-h gap-2xs\" [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <cw-icon\n [icon]=\"getSortIcon(column.key)\"\n [label]=\"'_COMMON._TABLE._SORT.LABEL' | translate\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['2xs']\"></cw-icon>\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 [class.td-actions]=\"column.type === 'actions'\">\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 ('check') {\n @if (isTruthy(row[column.key])) {\n <cw-icon\n [icon]=\"spriteIcon.checkCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.YES' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-success\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n } @else {\n <cw-icon\n [icon]=\"spriteIcon.closeCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.NO' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-danger\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n }\n }\n @case ('actions') {\n @if (usingRowActions) {\n @let actions = getResolvedActions(row);\n @if (actions.length > 0) {\n @if (!useDropdownActions()) {\n @for (action of actions; track $index) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n } @else {\n <cw-button\n [label]=\"'_COMMON._TABLE.ACTIONS_MENU'\"\n [withIcon]=\"spriteIcon.menuVertical\"\n [withOnlyIcon]=\"true\"\n [type]=\"buttonType.ghost\"\n [isDropdown]=\"true\"\n [hideCaret]=\"true\">\n <ul class=\"p-0 m-0\">\n @for (action of actions; track $index) {\n <li>\n @if (action.link) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\">\n </cw-button>\n } @else {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n </li>\n }\n </ul>\n </cw-button>\n }\n }\n } @else {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\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: "component", type: LoaderComponent, selector: "cw-loader" }, { kind: "component", type: BadgeComponent, selector: "cw-badge", inputs: ["type", "label", "withIcon", "iconPosition", "cssClass", "skeletonMode", "dataTest"] }, { kind: "component", type: ButtonComponent, selector: "cw-button", inputs: ["type", "label", "id", "link", "isDropdown", "hideCaret", "withIcon", "withOnlyIcon", "iconSize", "iconPosition", "dropdownPosition", "isMinWidth", "isDisabled", "isLoading", "cssClass", "dataTest", "skeletonMode", "withTooltip", "tooltipText", "tooltipTitle", "tooltipTrigger", "tooltipPosition", "tooltipType"], outputs: ["btnAction", "dropDownClicked"] }, { 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 }); }
591
669
  }
592
670
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: TableComponent, decorators: [{
593
671
  type: Component,
@@ -601,7 +679,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.20", ngImpo
601
679
  PaginationComponent,
602
680
  IconComponent,
603
681
  ImageComponent
604
- ], template: "@if (checkbox() && selectedRows().size > 0) {\n <div class=\"table-selection-info mb-2 d-flex align-items-center gap-2 flex-wrap\">\n <span>\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </span>\n @for (action of bulkActions(); track $index) {\n <cw-button\n [type]=\"resolveVariant(action)\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"resolveDisabled(action)\"\n (btnAction)=\"onBulkActionClick(action)\">\n </cw-button>\n }\n </div>\n}\n\n<div class=\"table-responsive\">\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=\"d-flex-h gap-2xs\" [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <cw-icon\n [icon]=\"getSortIcon(column.key)\"\n [label]=\"'_COMMON._TABLE._SORT.LABEL' | translate\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['2xs']\"></cw-icon>\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 [class.td-ations]=\"column.type === 'actions'\">\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 ('check') {\n @if (isTruthy(row[column.key])) {\n <cw-icon\n [icon]=\"spriteIcon.checkCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.YES' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-success\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n } @else {\n <cw-icon\n [icon]=\"spriteIcon.closeCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.NO' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-danger\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n }\n }\n @case ('actions') {\n @if (usingRowActions) {\n @let actions = getResolvedActions(row);\n @if (actions.length > 0) {\n @if (!useDropdownActions()) {\n @for (action of actions; track $index) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n } @else {\n <cw-button\n [label]=\"'_COMMON._TABLE.ACTIONS_MENU'\"\n [withIcon]=\"spriteIcon.menuVertical\"\n [withOnlyIcon]=\"true\"\n [type]=\"buttonType.ghost\"\n [isDropdown]=\"true\"\n [hideCaret]=\"true\">\n <ul class=\"p-0 m-0\">\n @for (action of actions; track $index) {\n <li>\n @if (action.link) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\">\n </cw-button>\n } @else {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n </li>\n }\n </ul>\n </cw-button>\n }\n }\n } @else {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\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" }]
682
+ ], template: "@if (checkbox() && selectedRows().size > 0) {\n <div class=\"table-selection-info mb-2 d-flex align-items-center gap-2 flex-wrap\">\n <span>\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </span>\n @for (action of bulkActions(); track $index) {\n <cw-button\n [type]=\"resolveVariant(action)\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"resolveDisabled(action)\"\n (btnAction)=\"onBulkActionClick(action)\">\n </cw-button>\n }\n </div>\n}\n\n<div class=\"table-responsive\">\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=\"d-flex-h gap-2xs\" [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <cw-icon\n [icon]=\"getSortIcon(column.key)\"\n [label]=\"'_COMMON._TABLE._SORT.LABEL' | translate\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['2xs']\"></cw-icon>\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 [class.td-actions]=\"column.type === 'actions'\">\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 ('check') {\n @if (isTruthy(row[column.key])) {\n <cw-icon\n [icon]=\"spriteIcon.checkCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.YES' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-success\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n } @else {\n <cw-icon\n [icon]=\"spriteIcon.closeCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.NO' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-danger\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n }\n }\n @case ('actions') {\n @if (usingRowActions) {\n @let actions = getResolvedActions(row);\n @if (actions.length > 0) {\n @if (!useDropdownActions()) {\n @for (action of actions; track $index) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n } @else {\n <cw-button\n [label]=\"'_COMMON._TABLE.ACTIONS_MENU'\"\n [withIcon]=\"spriteIcon.menuVertical\"\n [withOnlyIcon]=\"true\"\n [type]=\"buttonType.ghost\"\n [isDropdown]=\"true\"\n [hideCaret]=\"true\">\n <ul class=\"p-0 m-0\">\n @for (action of actions; track $index) {\n <li>\n @if (action.link) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\">\n </cw-button>\n } @else {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n </li>\n }\n </ul>\n </cw-button>\n }\n }\n } @else {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\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" }]
605
683
  }], ctorParameters: () => [], 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 }] }], bulkActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "bulkActions", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], cellClick: [{ type: i0.Output, args: ["cellClick"] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], paginationChange: [{ type: i0.Output, args: ["paginationChange"] }], bulkDelete: [{ type: i0.Output, args: ["bulkDelete"] }], bulkAction: [{ type: i0.Output, args: ["bulkAction"] }], actionsTemplate: [{ type: i0.ContentChild, args: ['actionsTemplate', { isSignal: true }] }] } });
606
684
 
607
685
  const RANGE_TYPES = new Set([
@@ -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/components/drag-n-drop-nested-list/drag-n-drop-nested-list.component.ts","../../../projects/bo-ui/src/lib/components/drag-n-drop-nested-list/drag-n-drop-nested-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/models/page-header.model.ts","../../../projects/bo-ui/src/lib/components/page-header/page-header.component.ts","../../../projects/bo-ui/src/lib/components/page-header/page-header.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 { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { DataCustomListGroup } from '../../models/custom-list.model';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'cw-custom-list',\n templateUrl: './custom-list.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule\n ]\n})\nexport class CustomListComponent {\n\n readonly customListData = input<DataCustomListGroup[]>([]);\n\n hasValue(value: any): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return false;\n }\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n if (typeof value === 'object' && Object.keys(value).length === 0) {\n return false;\n }\n\n return true;\n }\n\n}\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 // Évacuer les orphelins de `source` vers `peers[0]` AVANT le clear,\r\n // pour qu'ils soient retrouvables au prochain appel de fromDragItems\r\n // (sinon ils seraient garbage-collectés lors d'un transfert inter-colonnes).\r\n if (peers.length > 0) {\r\n const wantedSet = new Set(controls);\r\n const orphans = source.controls.filter(c => !wantedSet.has(c));\r\n for (const orphan of orphans) {\r\n const idx = source.controls.indexOf(orphan);\r\n if (idx >= 0) source.removeAt(idx, { emitEvent: false });\r\n peers[0].push(orphan, { 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 {\n CdkDragDrop, DragDropModule,\n moveItemInArray, transferArrayItem\n} from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport { Component, effect, input, output, TemplateRef } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ArrayAdapter, DragDropAdapter } from './drag-drop.adapter';\nimport { DragItem, DragListColumn } from '../../models/drag-item.model';\nimport { CardComponent } from '@cityway/basic-ui';\n\n@Component({\n selector: 'cw-drag-n-drop-list',\n templateUrl: './drag-n-drop-list.component.html',\n standalone: true,\n imports: [CommonModule, TranslateModule, DragDropModule, CardComponent]\n})\nexport class DragNDropListComponent {\n\n readonly availableItems = input<any>(undefined);\n readonly activeItems = input<any>(undefined);\n readonly adapter = input<DragDropAdapter>(new ArrayAdapter());\n readonly itemTemplate = input<TemplateRef<any> | undefined>(undefined);\n\n readonly availableColumn = input<DragListColumn>({ title: 'Disponibles' });\n readonly activeColumn = input<DragListColumn>({ title: 'Activés' });\n readonly reorderOnDrop = input(false);\n\n readonly availableItemsChange = output<any>();\n readonly activeItemsChange = output<any>();\n\n // Copies internes sur lesquelles le CDK travaille (mutables — pas des signals)\n _available: DragItem[] = [];\n _active: DragItem[] = [];\n\n constructor() {\n effect(() => {\n const adapter = this.adapter();\n this._available = adapter.toDragItems(this.availableItems());\n this._active = adapter.toDragItems(this.activeItems());\n });\n }\n\n drop(event: CdkDragDrop<DragItem[]>): void {\n if (event.previousContainer === event.container) {\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n }\n\n if (this.reorderOnDrop()) {\n this._available.forEach((item, i) => item.order = i + 1);\n this._active.forEach((item, i) => item.order = i + 1);\n }\n\n const adapter = this.adapter();\n adapter.fromDragItems(this._available, this.availableItems(), [this.activeItems()]);\n adapter.fromDragItems(this._active, this.activeItems(), [this.availableItems()]);\n\n this.availableItemsChange.emit(this.availableItems());\n this.activeItemsChange.emit(this.activeItems());\n }\n}\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-xs fw-bold\">{{ availableColumn().title | translate }}</div>\r\n @if (availableColumn().description) {\r\n <p class=\"fs fs-xs\">{{ availableColumn().description | translate }}</p>\r\n }\r\n @if (availableColumn().descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-xs\" [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-xs fw-bold\">{{ activeColumn().title | translate }}</div>\r\n @if (activeColumn().description) {\r\n <p class=\"fs fs-xs\">{{ activeColumn().description | translate }}</p>\r\n }\r\n @if (activeColumn().descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-xs\" [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 {\n CdkDragDrop, DragDropModule, moveItemInArray\n} from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport { Component, effect, input, output, TemplateRef } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DragItem, DragListColumn } from '../../models/drag-item.model';\nimport { CardComponent } from '@cityway/basic-ui';\n\n@Component({\n selector: 'cw-drag-n-drop-nested-list',\n templateUrl: './drag-n-drop-nested-list.component.html',\n standalone: true,\n imports: [CommonModule, TranslateModule, DragDropModule, CardComponent]\n})\nexport class DragNDropNestedListComponent {\n\n readonly items = input<DragItem[]>([]);\n readonly itemTemplate = input<TemplateRef<any> | undefined>(undefined);\n readonly column = input<DragListColumn | undefined>(undefined);\n readonly reorderOnDrop = input(false);\n\n readonly itemsChange = output<DragItem[]>();\n\n // Copie interne mutable sur laquelle le CDK opère (pas un signal — cf. DragNDropListComponent)\n _items: DragItem[] = [];\n\n constructor() {\n effect(() => {\n this._items = this.cloneTree(this.items());\n });\n }\n\n drop(event: CdkDragDrop<DragItem[]>): void {\n // Pas de transferArrayItem : chaque cdkDropList est isolée (pas de connectedTo),\n // donc on ne peut tomber ici que pour un tri intra-liste.\n if (event.previousContainer !== event.container) return;\n\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n\n if (this.reorderOnDrop()) {\n this.applyOrderRecursive(this._items);\n }\n\n this.itemsChange.emit(this._items);\n }\n\n private applyOrderRecursive(nodes: DragItem[]): void {\n nodes.forEach((node, i) => {\n node.order = i + 1;\n if (node.children?.length) this.applyOrderRecursive(node.children);\n });\n }\n\n private cloneTree(nodes: DragItem[]): DragItem[] {\n return nodes.map(n => ({\n ...n,\n children: n.children ? this.cloneTree(n.children) : n.children\n }));\n }\n}\n","<div class=\"drag-drop-nested-list d-flex-v gap-4xs\">\n @if (column()?.title) {\n <div class=\"fs fs-xs fw-bold\">{{ column()!.title | translate }}</div>\n }\n @if (column()?.description) {\n <p class=\"fs fs-xs\">{{ column()!.description | translate }}</p>\n }\n @if (column()?.descriptionRwd) {\n <p class=\"d-sm-none fs fs-xs\" [innerHTML]=\"column()!.descriptionRwd | translate\"></p>\n }\n\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: _items, depth: 0 }\"/>\n</div>\n\n<!--\n Template récursif : à chaque niveau, on rend un cdkDropList isolé\n (pas de cdkDropListConnectedTo => transfert inter-listes impossible),\n puis on ré-instancie le même template pour la sous-liste de chaque enfant.\n-->\n<ng-template #nodeTpl let-nodes let-depth=\"depth\">\n <ul class=\"list-unstyled drag-drop-nested-list-column\" [ngClass]=\"column()?.cssClass\"\n [attr.data-depth]=\"depth\"\n cdkDropList\n [cdkDropListData]=\"nodes\"\n (cdkDropListDropped)=\"drop($event)\">\n @for (item of nodes; track item.id) {\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\n <cw-card>\n <ng-container *ngTemplateOutlet=\"itemTemplate() || defaultTemplate; context: { $implicit: item, depth: depth }\"/>\n @if (item.children?.length) {\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: item.children, depth: depth + 1 }\"/>\n }\n </cw-card>\n </li>\n }\n </ul>\n</ng-template>\n\n<ng-template #defaultTemplate let-item>\n <div class=\"default-item d-flex justify-content-between\">\n <span>\n {{ item.label }}\n @if (item.code) { <span class=\"text-muted\">({{ item.code }})</span> }\n </span>\n @if (item.order != null) {\n <span class=\"fw-bold\">#{{ item.order }}</span>\n }\n </div>\n</ng-template>\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 effect,\n inject,\n input,\n isSignal,\n output,\n Signal,\n signal,\n TemplateRef\n} from '@angular/core';\nimport {\n BadgeComponent,\n BadgeTypeEnum,\n BoButtonTypeEnum,\n ButtonComponent,\n IconComponent,\n IconSizeEnum,\n IconTypeEnum,\n IconUiTypeEnum,\n ImageComponent,\n LoaderComponent,\n ModalsService,\n ModalsType,\n SpriteIconEnum\n} from '@cityway/basic-ui';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DoubleScrollDirective } from '../../directives/double-scroll';\nimport {\n BadgeConfig,\n BulkAction,\n BulkActionEvent,\n CellClickEvent,\n ResolvedRowAction,\n RowActionDescriptor,\n RowActionsConfig,\n RowActionVariant,\n SortDirection,\n SortEvent,\n TableColumn\n} 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 ButtonComponent,\n NgTemplateOutlet,\n PaginationComponent,\n IconComponent,\n ImageComponent\n ]\n})\nexport class TableComponent {\n private readonly modalsService = inject(ModalsService);\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 readonly bulkActions = input<BulkAction[]>([]);\n readonly rowActions = input<RowActionsConfig | undefined>(undefined);\n\n readonly cellClick = output<CellClickEvent>();\n readonly sortChange = output<SortEvent>();\n readonly selectionChange = output<any[]>();\n readonly paginationChange = output<PaginationChangeEvent>();\n /** Émis quand l'utilisateur confirme la modale d'une action type='delete'. */\n readonly bulkDelete = output<any[]>();\n /** Émis pour les actions type='custom' au clic, et pour les 'delete' après confirmation. */\n readonly bulkAction = output<BulkActionEvent>();\n\n readonly actionsTemplate = contentChild<TemplateRef<{ $implicit: any }>>('actionsTemplate');\n\n readonly iconType = IconTypeEnum;\n readonly iconUiType = IconUiTypeEnum;\n readonly iconSize = IconSizeEnum;\n readonly spriteIcon = SpriteIconEnum;\n readonly buttonType = BoButtonTypeEnum;\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 constructor() {\n effect(() => {\n if (this.rowActions() && this.actionsTemplate()) {\n // eslint-disable-next-line no-console\n console.warn(\n '[cw-table] `rowActions` et `#actionsTemplate` sont fournis simultanément. `actionsTemplate` est ignoré.'\n );\n }\n });\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 getSortIcon(key: string): SpriteIconEnum {\n if (this.currentSortKey() !== key) return SpriteIconEnum.keyboardUpDown;\n return this.currentSortDirection() === 'asc'\n ? SpriteIconEnum.keyboardUp\n : SpriteIconEnum.keyboardDown;\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 }\n\n public isClickable(column: TableColumn): boolean {\n return column.type === 'link' || !!column.clickable;\n }\n\n public isTruthy(value: unknown): boolean {\n return value === true || value === 1 || value === '1' || value === 'true';\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 public resolveVariant(action: BulkAction): BoButtonTypeEnum {\n if (action.variant) return action.variant;\n return action.type === 'delete' ? BoButtonTypeEnum.danger : BoButtonTypeEnum.primary;\n }\n\n public resolveDisabled(action: BulkAction): boolean {\n const value = action.isDisabled;\n if (value === undefined) return false;\n return isSignal(value) ? (value as Signal<boolean>)() : value;\n }\n\n public async onBulkActionClick(action: BulkAction): Promise<void> {\n const rows = [...this.selectedRows()];\n if (action.type === 'delete') {\n const labelFn = action.itemLabel ?? this.defaultLabelFn;\n try {\n await this.modalsService.openModal(ModalsType.delete, {\n itemsToDelete: rows.map(labelFn),\n itemsToDeleteTitle: action.itemTitle\n }).result;\n } catch {\n return;\n }\n this.bulkDelete.emit(rows);\n this.bulkAction.emit({ id: action.id ?? 'delete', rows });\n return;\n }\n if (action.id) {\n this.bulkAction.emit({ id: action.id, rows });\n }\n }\n\n private readonly defaultLabelFn = (row: any): string =>\n row?.name ?? row?.label ?? row?.title ?? String(row?.id ?? row);\n\n /** Booléen indiquant si l'API déclarative `rowActions` est utilisée. */\n public get usingRowActions(): boolean {\n return !!this.rowActions();\n }\n\n /** Résout la liste d'actions visibles pour un row donné, en appliquant show/disabled/showDisabled. */\n public getResolvedActions(row: any): ResolvedRowAction[] {\n const config = this.rowActions();\n if (!config) return [];\n\n const ordered: Array<{ descriptor: RowActionDescriptor; defaultLabel?: string; forcedVariant?: RowActionVariant }> = [];\n if (config.edit) ordered.push({ descriptor: config.edit, defaultLabel: '_COMMON._ACTION.EDIT', forcedVariant: 'primary' });\n for (const action of config.customActions ?? []) {\n ordered.push({ descriptor: action });\n }\n if (config.delete) ordered.push({ descriptor: config.delete, defaultLabel: '_COMMON._ACTION.DELETE', forcedVariant: 'danger' });\n\n const showDisabled = config.showDisabled === true;\n const resolved: ResolvedRowAction[] = [];\n\n for (const entry of ordered) {\n const { descriptor, defaultLabel, forcedVariant } = entry;\n if (!this.evalShow(descriptor, row)) continue;\n const disabled = this.evalDisabled(descriptor, row);\n if (disabled && !showDisabled) continue;\n resolved.push({\n label: this.evalLabel(descriptor, row, defaultLabel),\n disabled,\n variant: forcedVariant ?? descriptor.variant ?? 'default',\n icon: descriptor.icon,\n link: this.evalLink(descriptor, row),\n click: descriptor.click\n });\n }\n\n return resolved;\n }\n\n public getOverflowThreshold(): number {\n return this.rowActions()?.overflowThreshold ?? 2;\n }\n\n /**\n * Nombre maximum d'actions visibles parmi toutes les lignes.\n * Sert à décider d'un affichage UNIFORME : la bascule inline/dropdown\n * est globale au tableau, pas calculée ligne par ligne.\n */\n public readonly maxVisibleActions = computed(() => {\n if (!this.rowActions()) return 0;\n return this.data().reduce(\n (max, row) => Math.max(max, this.getResolvedActions(row).length),\n 0\n );\n });\n\n /**\n * Vrai si le tableau doit afficher les actions en dropdown.\n * Dès qu'une seule ligne dépasse le seuil, TOUTES les lignes\n * basculent en dropdown pour un rendu uniforme.\n */\n public readonly useDropdownActions = computed(\n () => this.maxVisibleActions() > this.getOverflowThreshold()\n );\n\n public onRowActionClick(action: ResolvedRowAction, row: any): void {\n if (action.disabled || action.link) return;\n action.click?.(row);\n }\n\n public actionCssClass(action: ResolvedRowAction): string {\n switch (action.variant) {\n case 'danger': return 'text-danger';\n case 'primary': return 'text-primary';\n default: return '';\n }\n }\n\n private evalShow(descriptor: RowActionDescriptor, row: any): boolean {\n if (descriptor.show === undefined) return true;\n return typeof descriptor.show === 'function' ? !!descriptor.show(row) : !!descriptor.show;\n }\n\n private evalDisabled(descriptor: RowActionDescriptor, row: any): boolean {\n if (descriptor.disabled === undefined) return false;\n return typeof descriptor.disabled === 'function' ? !!descriptor.disabled(row) : !!descriptor.disabled;\n }\n\n private evalLabel(descriptor: RowActionDescriptor, row: any, fallback?: string): string {\n if (descriptor.label === undefined || descriptor.label === null) return fallback ?? '';\n return typeof descriptor.label === 'function' ? descriptor.label(row) : descriptor.label;\n }\n\n private evalLink(descriptor: RowActionDescriptor, row: any): string | unknown[] | undefined {\n if (descriptor.link === undefined) return undefined;\n return typeof descriptor.link === 'function' ? descriptor.link(row) : descriptor.link;\n }\n}\n","@if (checkbox() && selectedRows().size > 0) {\n <div class=\"table-selection-info mb-2 d-flex align-items-center gap-2 flex-wrap\">\n <span>\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </span>\n @for (action of bulkActions(); track $index) {\n <cw-button\n [type]=\"resolveVariant(action)\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"resolveDisabled(action)\"\n (btnAction)=\"onBulkActionClick(action)\">\n </cw-button>\n }\n </div>\n}\n\n<div class=\"table-responsive\">\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=\"d-flex-h gap-2xs\" [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <cw-icon\n [icon]=\"getSortIcon(column.key)\"\n [label]=\"'_COMMON._TABLE._SORT.LABEL' | translate\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['2xs']\"></cw-icon>\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 [class.td-ations]=\"column.type === 'actions'\">\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 ('check') {\n @if (isTruthy(row[column.key])) {\n <cw-icon\n [icon]=\"spriteIcon.checkCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.YES' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-success\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n } @else {\n <cw-icon\n [icon]=\"spriteIcon.closeCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.NO' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-danger\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n }\n }\n @case ('actions') {\n @if (usingRowActions) {\n @let actions = getResolvedActions(row);\n @if (actions.length > 0) {\n @if (!useDropdownActions()) {\n @for (action of actions; track $index) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n } @else {\n <cw-button\n [label]=\"'_COMMON._TABLE.ACTIONS_MENU'\"\n [withIcon]=\"spriteIcon.menuVertical\"\n [withOnlyIcon]=\"true\"\n [type]=\"buttonType.ghost\"\n [isDropdown]=\"true\"\n [hideCaret]=\"true\">\n <ul class=\"p-0 m-0\">\n @for (action of actions; track $index) {\n <li>\n @if (action.link) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\">\n </cw-button>\n } @else {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n </li>\n }\n </ul>\n </cw-button>\n }\n }\n } @else {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\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 { ActivatedRoute, Router } from '@angular/router';\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 private readonly router = inject(Router, { optional: true });\r\n private readonly route = inject(ActivatedRoute, { optional: true });\r\n\r\n readonly filters = input.required<FilterFieldConfig[]>();\r\n readonly manual = input(false);\r\n /** Synchronise l'état appliqué des filtres avec les query params de l'URL (mémorisation / partage). */\r\n readonly syncUrl = 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 const urlValues = this.readUrlValues(configs);\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 const init = urlValues[field.key] ?? def;\r\n group[field.key] = new FormGroup({\r\n start: new FormControl(init.start ?? ''),\r\n end: new FormControl(init.end ?? '')\r\n });\r\n defaults[field.key] = { ...def };\r\n } else {\r\n const def = field.defaultValue ?? '';\r\n const init = urlValues[field.key] ?? def;\r\n group[field.key] = new FormControl(init);\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 => {\r\n this.filtersApplied.emit(values as FilterValues);\r\n this.syncFiltersToUrl(values as FilterValues);\r\n });\r\n }\r\n\r\n // Restaure le filtrage présent dans l'URL au chargement.\r\n if (Object.keys(urlValues).length > 0) {\r\n this.filtersApplied.emit(this.filterForm.value as FilterValues);\r\n }\r\n }\r\n\r\n /** Lit les valeurs de filtre présentes dans les query params de l'URL. */\r\n private readUrlValues(configs: FilterFieldConfig[]): FilterValues {\r\n const values: FilterValues = {};\r\n if (!this.syncUrl() || !this.route) return values;\r\n\r\n const params = this.route.snapshot.queryParamMap;\r\n for (const field of configs) {\r\n if (RANGE_TYPES.has(field.type)) {\r\n const start = params.get(`${field.key}.start`);\r\n const end = params.get(`${field.key}.end`);\r\n if (start !== null || end !== null) {\r\n values[field.key] = { start: start ?? '', end: end ?? '' };\r\n }\r\n } else {\r\n const value = params.get(field.key);\r\n if (value !== null) {\r\n values[field.key] = value;\r\n }\r\n }\r\n }\r\n return values;\r\n }\r\n\r\n /** Reporte l'état appliqué des filtres dans les query params (replaceUrl, sans polluer l'historique). */\r\n private syncFiltersToUrl(values: FilterValues): void {\r\n if (!this.syncUrl() || !this.router || !this.route) return;\r\n\r\n const queryParams: Record<string, string | null> = {};\r\n for (const field of this.filters()) {\r\n const value = values[field.key];\r\n if (RANGE_TYPES.has(field.type)) {\r\n queryParams[`${field.key}.start`] = this.toParam(value?.start);\r\n queryParams[`${field.key}.end`] = this.toParam(value?.end);\r\n } else {\r\n queryParams[field.key] = this.toParam(value);\r\n }\r\n }\r\n\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams,\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true\r\n });\r\n }\r\n\r\n /** Normalise une valeur en param d'URL ; les valeurs vides sont retirées (null). */\r\n private toParam(value: unknown): string | null {\r\n if (value === null || value === undefined || value === '') return null;\r\n return String(value);\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 const values = this.filterForm.value as FilterValues;\r\n this.filtersApplied.emit(values);\r\n this.syncFiltersToUrl(values);\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 const values = this.filterForm.value as FilterValues;\r\n this.filtersApplied.emit(values);\r\n this.syncFiltersToUrl(values);\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"filterForm\" (ngSubmit)=\"apply()\" class=\"filter-bar\">\r\n <div class=\"d-flex-h flex-wrap gap-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 [clearable]=\"false\">\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.link\"\r\n (btnAction)=\"apply()\">\r\n </cw-button>\r\n }\r\n <cw-button\r\n [label]=\"resetLabel() | translate\"\r\n [type]=\"uiType.link\"\r\n (btnAction)=\"reset()\">\r\n </cw-button>\r\n </div>\r\n </div>\r\n</form>\r\n","export enum PageHeaderActionEnum {\n add = 'add',\n save = 'save',\n reset = 'reset',\n exportCurrent = 'exportCurrent',\n exportAll = 'exportAll',\n import = 'import'\n}\n\nexport type PageHeaderActionState = Partial<Record<PageHeaderActionEnum, boolean>>;\n","import { Location } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport {\n BoButtonTypeEnum,\n ButtonComponent,\n ButtonIconSizeEnum,\n DropdownItemDirective,\n SpriteIconEnum\n} from '@cityway/basic-ui';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { PageHeaderActionEnum, PageHeaderActionState } from '../../models/page-header.model';\n\n@Component({\n selector: 'cw-page-header',\n templateUrl: './page-header.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ButtonComponent,\n DropdownItemDirective,\n TranslateModule\n ]\n})\nexport class PageHeaderComponent {\n private readonly location = inject(Location);\n\n readonly title = input.required<string>();\n readonly description = input<string>();\n readonly showBack = input(true);\n readonly actions = input<PageHeaderActionEnum[]>([]);\n readonly isLoading = input<PageHeaderActionState>({});\n readonly isDisabled = input<PageHeaderActionState>({});\n\n readonly action = output<PageHeaderActionEnum>();\n\n readonly buttonType = BoButtonTypeEnum;\n readonly iconSize = ButtonIconSizeEnum;\n readonly spriteIcon = SpriteIconEnum;\n readonly actionEnum = PageHeaderActionEnum;\n\n readonly hasExport = computed(() =>\n this.actions().some(a => a === PageHeaderActionEnum.exportCurrent || a === PageHeaderActionEnum.exportAll)\n );\n readonly showExportCurrent = computed(() => this.actions().includes(PageHeaderActionEnum.exportCurrent));\n readonly showExportAll = computed(() => this.actions().includes(PageHeaderActionEnum.exportAll));\n readonly showImport = computed(() => this.actions().includes(PageHeaderActionEnum.import));\n readonly showReset = computed(() => this.actions().includes(PageHeaderActionEnum.reset));\n readonly showAdd = computed(() => this.actions().includes(PageHeaderActionEnum.add));\n readonly showSave = computed(() => this.actions().includes(PageHeaderActionEnum.save));\n\n public goBack(): void {\n this.location.back();\n }\n\n public emit(action: PageHeaderActionEnum): void {\n this.action.emit(action);\n }\n\n public loading(action: PageHeaderActionEnum): boolean {\n return !!this.isLoading()[action];\n }\n\n public disabled(action: PageHeaderActionEnum): boolean {\n return !!this.isDisabled()[action];\n }\n}\n","<div class=\"page-header d-flex-v gap-2xs\">\n @if (showBack()) {\n <cw-button [type]=\"buttonType.ghost\" [label]=\"'_COMMON._FORM.BACK'\" [withIcon]=\"spriteIcon.left1\"\n (btnAction)=\"goBack()\" />\n }\n <div class=\"d-flex-h gap-md items-start justify-between flex-wrap\">\n <div class=\"d-flex-v\">\n <h1 class=\"page-header-title\">{{ title() | translate}}</h1>\n @if (description(); as desc) {\n <p class=\"fs-md text-light\" [innerHTML]=\"desc | translate\"></p>\n }\n </div>\n\n <div class=\"page-header-actions d-flex-h gap-md flex-wrap items-center\">\n @if (showImport()) {\n <cw-button [type]=\"buttonType.secondary\" [label]=\"'_COMMON._ACTION.IMPORT'\"\n [isDisabled]=\"disabled(actionEnum.import)\" [isLoading]=\"loading(actionEnum.import)\"\n (btnAction)=\"emit(actionEnum.import)\">\n </cw-button>\n }\n\n @if (showReset()) {\n <cw-button [type]=\"buttonType.secondary\" [label]=\"'_COMMON._ACTION.RESET'\"\n [isDisabled]=\"disabled(actionEnum.reset)\" [isLoading]=\"loading(actionEnum.reset)\"\n (btnAction)=\"emit(actionEnum.reset)\">\n </cw-button>\n }\n\n @if (hasExport()) {\n <cw-button [type]=\"buttonType.secondary\" [label]=\"'_COMMON._ACTION.EXPORT'\" [isDropdown]=\"true\"\n [isDisabled]=\"disabled(actionEnum.exportCurrent) && disabled(actionEnum.exportAll)\">\n <ul>\n <li>\n @if (showExportCurrent()) {\n <cw-button [type]=\"buttonType.ghost\" [label]=\"'_COMMON._ACTION.EXPORT_CURRENT'\"\n [isDisabled]=\"disabled(actionEnum.exportCurrent)\" (btnAction)=\"emit(actionEnum.exportCurrent)\">\n </cw-button>\n }\n </li>\n <li>\n @if (showExportAll()) {\n <cw-button [type]=\"buttonType.ghost\" [label]=\"'_COMMON._ACTION.EXPORT_ALL'\"\n [isDisabled]=\"disabled(actionEnum.exportAll)\" (btnAction)=\"emit(actionEnum.exportAll)\">\n </cw-button>\n }\n </li>\n </ul>\n </cw-button>\n }\n\n <ng-content></ng-content>\n\n @if (showAdd()) {\n <cw-button [type]=\"buttonType.primary\" [label]=\"'_COMMON._ACTION.ADD'\" [withIcon]=\"spriteIcon.add\"\n [isDisabled]=\"disabled(actionEnum.add)\" [isLoading]=\"loading(actionEnum.add)\"\n (btnAction)=\"emit(actionEnum.add)\">\n </cw-button>\n }\n\n @if (showSave()) {\n <cw-button [type]=\"buttonType.primary\" [label]=\"'_COMMON._ACTION.SAVE'\" [isDisabled]=\"disabled(actionEnum.save)\"\n [isLoading]=\"loading(actionEnum.save)\" (btnAction)=\"emit(actionEnum.save)\">\n </cw-button>\n }\n </div>\n </div>\n</div>\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/drag-n-drop-nested-list/drag-n-drop-nested-list.component';\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/filter-bar/filter-bar.component';\r\nexport * from './lib/components/page-header/page-header.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\nexport * from './lib/models/page-header.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/components/drag-n-drop-nested-list/drag-n-drop-nested-list.component.ts","../../../projects/bo-ui/src/lib/components/drag-n-drop-nested-list/drag-n-drop-nested-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/models/page-header.model.ts","../../../projects/bo-ui/src/lib/components/page-header/page-header.component.ts","../../../projects/bo-ui/src/lib/components/page-header/page-header.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 { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { DataCustomListGroup } from '../../models/custom-list.model';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'cw-custom-list',\n templateUrl: './custom-list.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule\n ]\n})\nexport class CustomListComponent {\n\n readonly customListData = input<DataCustomListGroup[]>([]);\n\n hasValue(value: any): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return false;\n }\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n if (typeof value === 'object' && Object.keys(value).length === 0) {\n return false;\n }\n\n return true;\n }\n\n}\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 // Évacuer les orphelins de `source` vers `peers[0]` AVANT le clear,\r\n // pour qu'ils soient retrouvables au prochain appel de fromDragItems\r\n // (sinon ils seraient garbage-collectés lors d'un transfert inter-colonnes).\r\n if (peers.length > 0) {\r\n const wantedSet = new Set(controls);\r\n const orphans = source.controls.filter(c => !wantedSet.has(c));\r\n for (const orphan of orphans) {\r\n const idx = source.controls.indexOf(orphan);\r\n if (idx >= 0) source.removeAt(idx, { emitEvent: false });\r\n peers[0].push(orphan, { 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 {\n CdkDragDrop, DragDropModule,\n moveItemInArray, transferArrayItem\n} from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport { Component, effect, input, output, TemplateRef } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ArrayAdapter, DragDropAdapter } from './drag-drop.adapter';\nimport { DragItem, DragListColumn } from '../../models/drag-item.model';\nimport { CardComponent } from '@cityway/basic-ui';\n\n@Component({\n selector: 'cw-drag-n-drop-list',\n templateUrl: './drag-n-drop-list.component.html',\n standalone: true,\n imports: [CommonModule, TranslateModule, DragDropModule, CardComponent]\n})\nexport class DragNDropListComponent {\n\n readonly availableItems = input<any>(undefined);\n readonly activeItems = input<any>(undefined);\n readonly adapter = input<DragDropAdapter>(new ArrayAdapter());\n readonly itemTemplate = input<TemplateRef<any> | undefined>(undefined);\n\n readonly availableColumn = input<DragListColumn>({ title: 'Disponibles' });\n readonly activeColumn = input<DragListColumn>({ title: 'Activés' });\n readonly reorderOnDrop = input(false);\n\n readonly availableItemsChange = output<any>();\n readonly activeItemsChange = output<any>();\n\n // Copies internes sur lesquelles le CDK travaille (mutables — pas des signals)\n _available: DragItem[] = [];\n _active: DragItem[] = [];\n\n constructor() {\n effect(() => {\n const adapter = this.adapter();\n this._available = adapter.toDragItems(this.availableItems());\n this._active = adapter.toDragItems(this.activeItems());\n });\n }\n\n drop(event: CdkDragDrop<DragItem[]>): void {\n if (event.previousContainer === event.container) {\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n }\n\n if (this.reorderOnDrop()) {\n this._available.forEach((item, i) => item.order = i + 1);\n this._active.forEach((item, i) => item.order = i + 1);\n }\n\n const adapter = this.adapter();\n adapter.fromDragItems(this._available, this.availableItems(), [this.activeItems()]);\n adapter.fromDragItems(this._active, this.activeItems(), [this.availableItems()]);\n\n this.availableItemsChange.emit(this.availableItems());\n this.activeItemsChange.emit(this.activeItems());\n }\n}\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-xs fw-bold\">{{ availableColumn().title | translate }}</div>\r\n @if (availableColumn().description) {\r\n <p class=\"fs fs-xs\">{{ availableColumn().description | translate }}</p>\r\n }\r\n @if (availableColumn().descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-xs\" [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-xs fw-bold\">{{ activeColumn().title | translate }}</div>\r\n @if (activeColumn().description) {\r\n <p class=\"fs fs-xs\">{{ activeColumn().description | translate }}</p>\r\n }\r\n @if (activeColumn().descriptionRwd) {\r\n <p class=\"d-sm-none fs fs-xs\" [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 {\n CdkDragDrop, DragDropModule, moveItemInArray\n} from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport { Component, effect, input, output, TemplateRef } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DragAddEvent, DragItem, DragListColumn } from '../../models/drag-item.model';\nimport {\n CardComponent, BadgeComponent, IconComponent, ButtonComponent,\n SpriteIconEnum, IconSizeEnum, BoButtonTypeEnum, ButtonPositionEnum, ButtonIconSizeEnum, CardTypeEnum\n} from '@cityway/basic-ui';\n\n@Component({\n selector: 'cw-drag-n-drop-nested-list',\n templateUrl: './drag-n-drop-nested-list.component.html',\n standalone: true,\n imports: [CommonModule, TranslateModule, DragDropModule, CardComponent, BadgeComponent, IconComponent, ButtonComponent]\n})\nexport class DragNDropNestedListComponent {\n\n readonly items = input<DragItem[]>([]);\n readonly itemTemplate = input<TemplateRef<any> | undefined>(undefined);\n readonly column = input<DragListColumn | undefined>(undefined);\n readonly reorderOnDrop = input(false);\n /**\n * Profondeur maximale autorisée (index 0-based, racine = 0). Une carte à `depth < maxDepth`\n * peut recevoir des enfants (même vide) ; une carte à `depth >= maxDepth` est terminale.\n * `undefined` => imbrication infinie (ajout possible partout). Ex. `maxDepth = 1` => 2 niveaux.\n */\n readonly maxDepth = input<number | undefined>(undefined);\n\n readonly itemsChange = output<DragItem[]>();\n readonly view = output<DragItem>();\n readonly edit = output<DragItem>();\n readonly delete = output<DragItem>();\n readonly add = output<DragAddEvent>();\n\n readonly spriteIcon = SpriteIconEnum;\n readonly iconSize = IconSizeEnum;\n readonly buttonType = BoButtonTypeEnum;\n readonly buttonPosition = ButtonPositionEnum;\n readonly buttonIconSize = ButtonIconSizeEnum;\n\n // Copie interne mutable sur laquelle le CDK opère (pas un signal — cf. DragNDropListComponent)\n _items: DragItem[] = [];\n\n constructor() {\n effect(() => {\n this._items = this.cloneTree(this.items());\n });\n }\n\n drop(event: CdkDragDrop<DragItem[]>): void {\n // Pas de transferArrayItem : chaque cdkDropList est isolée (pas de connectedTo),\n // donc on ne peut tomber ici que pour un tri intra-liste.\n if (event.previousContainer !== event.container) return;\n\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n\n if (this.reorderOnDrop()) {\n this.applyOrderRecursive(this._items);\n }\n\n this.itemsChange.emit(this._items);\n }\n\n /**\n * Une carte n'est pliable que si elle a des enfants OU qu'on peut lui en ajouter.\n * `column.collapsible === false` désactive globalement.\n */\n isCollapsible(item: DragItem, depth: number): boolean {\n if (this.column()?.collapsible === false) return false;\n const hasChildren = (item.children?.length ?? 0) > 0;\n return hasChildren || this.canAdd(item, depth);\n }\n\n /**\n * Peut-on ajouter des enfants à cette carte ? Résolution :\n * override item (`actions.add`) → override colonne (`showAdd`) → plafond `maxDepth`\n * (`depth < maxDepth`) → sinon `true` (imbrication infinie). Indépendant du fait\n * d'avoir déjà des enfants : une carte vide reste addable.\n */\n canAdd(item: DragItem, depth: number): boolean {\n if (item.actions?.add !== undefined) return item.actions.add;\n\n const colDefault = this.column()?.showAdd;\n if (colDefault !== undefined) return colDefault;\n\n const max = this.maxDepth();\n if (max !== undefined) return depth < max;\n\n return true;\n }\n\n /** Visibilité d'une action (view/edit/delete) : override item → défaut colonne → true. */\n showAction(item: DragItem, action: 'view' | 'edit' | 'delete'): boolean {\n const override = item.actions?.[action];\n if (override !== undefined) return override;\n\n const col = this.column();\n const colDefault = {\n view: col?.showView,\n edit: col?.showEdit,\n delete: col?.showDelete,\n }[action];\n\n return colDefault ?? true;\n }\n\n /**\n * Libellé du compteur d'enfants, en gérant singulier/pluriel.\n * Affiché aussi à `0` quand la carte est vide mais peut recevoir des enfants\n * (ex. « 0 rubrique »). Masqué sur une carte terminale sans enfant.\n */\n childrenCountLabel(item: DragItem, depth: number): string | null {\n const count = item.children?.length ?? 0;\n if (count === 0 && !this.canAdd(item, depth)) return null;\n\n const noun = count <= 1\n ? (item.childrenLabelSingular ?? item.childrenLabel)\n : item.childrenLabel;\n\n if (noun) return `${count} ${noun}`;\n return count > 0 ? `${count}` : null;\n }\n\n onAdd(parent: DragItem | undefined, depth: number): void {\n this.add.emit({ parent, depth });\n }\n\n /** Alterne le type de carte selon la profondeur : pair => default, impair => light. */\n cardType(depth: number): CardTypeEnum {\n return depth % 2 === 0 ? CardTypeEnum.default : CardTypeEnum.light;\n }\n\n private applyOrderRecursive(nodes: DragItem[]): void {\n nodes.forEach((node, i) => {\n node.order = i + 1;\n if (node.children?.length) this.applyOrderRecursive(node.children);\n });\n }\n\n private cloneTree(nodes: DragItem[]): DragItem[] {\n return nodes.map(n => ({\n ...n,\n children: n.children ? this.cloneTree(n.children) : n.children\n }));\n }\n}\n","<div class=\"ddn-list d-flex-v gap-4xs\">\n <div class=\"d-flex-h justify-between\">\n @if (column()?.title) {\n <h2>{{ column()!.title | translate }}</h2>\n }\n\n @if (column()?.showAddRoot) {\n <cw-button cssClass=\"ddn-list-add\" [type]=\"buttonType.link\" [withIcon]=\"spriteIcon.add\"\n [iconPosition]=\"buttonPosition.left\" [label]=\"column()?.addRootLabel ?? column()?.addLabel ?? '_COMMON._ACTION.ADD'\"\n (btnAction)=\"onAdd(undefined, 0)\" />\n }\n </div>\n\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: _items, depth: 0, parent: undefined }\" />\n</div>\n\n<!--\n Template récursif : à chaque niveau, on rend un cdkDropList isolé\n (pas de cdkDropListConnectedTo => transfert inter-listes impossible),\n puis on ré-instancie le même template pour la sous-liste de chaque enfant.\n-->\n<ng-template #nodeTpl let-nodes let-depth=\"depth\" let-parent=\"parent\">\n <ul class=\"list-unstyled d-flex-v gap-md ms-none\" [ngClass]=\"column()?.cssClass\" [attr.data-depth]=\"depth\"\n cdkDropList [cdkDropListData]=\"nodes\" (cdkDropListDropped)=\"drop($event)\">\n\n @for (item of nodes; track item.id) {\n <li cdkDrag [cdkDragDisabled]=\"item.disabled ?? false\">\n <cw-card [cssClass]=\"'ddn-list-card'\" [title]=\"(item.title ?? item.label) || ''\"\n [subtitle]=\"item.subtitle ?? ''\" [type]=\"cardType(depth)\" [collapsible]=\"isCollapsible(item, depth)\"\n [collapsed]=\"isCollapsible(item, depth)\" [collapseStretched]=\"false\">\n\n <!-- Poignée de drag (à gauche du titre) : le glisser ne démarre que d'ici -->\n <button header-start type=\"button\" class=\"ddn-list-handle\" cdkDragHandle\n [disabled]=\"item.disabled ?? false\" [attr.aria-label]=\"'_COMMON._ACTION.MOVE' | translate\">\n <cw-icon [icon]=\"spriteIcon.grip\" [iconSize]=\"iconSize['md']\" />\n </button>\n\n <!-- En-tête : compteur d'enfants + badge + actions -->\n <div header-custom-area class=\"d-flex-h gap-2xs justify-end align-start\">\n @if (childrenCountLabel(item, depth); as count) {\n <span class=\"ddn-list-count fs fs-xs\">{{ count }}</span>\n }\n\n @if (item.badge) {\n <cw-badge [type]=\"item.badge.type\" [label]=\"item.badge.label\" [withIcon]=\"item.badge.icon\" />\n }\n\n @if (showAction(item, 'view')) {\n <cw-button label=\"_COMMON._ACTION.VIEW\" [withIcon]=\"spriteIcon.search\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"view.emit(item)\" />\n }\n @if (showAction(item, 'edit')) {\n <cw-button label=\"_COMMON._ACTION.EDIT\" [withIcon]=\"spriteIcon.edit\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"edit.emit(item)\" />\n }\n @if (showAction(item, 'delete')) {\n <cw-button label=\"_COMMON._ACTION.DELETE\" [withIcon]=\"spriteIcon.trash\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-delete\"\n [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"delete.emit(item)\" />\n }\n </div>\n\n <!-- Corps : template custom (slot) ou fallback -->\n <ng-container\n *ngTemplateOutlet=\"itemTemplate() || defaultTemplate; context: { $implicit: item, depth: depth }\" />\n\n @if (item.children?.length) {\n <ng-container\n *ngTemplateOutlet=\"nodeTpl; context: { $implicit: item.children, depth: depth + 1, parent: item }\" />\n }\n\n @if (canAdd(item, depth)) {\n <div class=\"d-flex-h justify-end\">\n <cw-button class=\"ddn-list-add\" [type]=\"buttonType.link\" [withIcon]=\"spriteIcon.add\"\n [iconPosition]=\"buttonPosition.left\" [label]=\"column()?.addLabel ?? '_COMMON._ACTION.ADD'\"\n (btnAction)=\"onAdd(item, depth + 1)\" />\n </div>\n }\n </cw-card>\n </li>\n }\n\n </ul>\n</ng-template>\n\n<ng-template #defaultTemplate let-item>\n <div class=\"default-item d-flex justify-content-between\">\n <span>\n {{ item.label }}\n @if (item.code) { <span class=\"text-muted\">({{ item.code }})</span> }\n </span>\n @if (item.order != null) {\n <span class=\"fw-bold\">#{{ item.order }}</span>\n }\n </div>\n</ng-template>\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 effect,\n inject,\n input,\n isSignal,\n output,\n Signal,\n signal,\n TemplateRef\n} from '@angular/core';\nimport {\n BadgeComponent,\n BadgeTypeEnum,\n BoButtonTypeEnum,\n ButtonComponent,\n IconComponent,\n IconSizeEnum,\n IconTypeEnum,\n IconUiTypeEnum,\n ImageComponent,\n LoaderComponent,\n ModalsService,\n ModalsType,\n SpriteIconEnum\n} from '@cityway/basic-ui';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DoubleScrollDirective } from '../../directives/double-scroll';\nimport {\n BadgeConfig,\n BulkAction,\n BulkActionEvent,\n CellClickEvent,\n ResolvedRowAction,\n RowActionDescriptor,\n RowActionsConfig,\n RowActionVariant,\n SortDirection,\n SortEvent,\n TableColumn\n} 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 ButtonComponent,\n NgTemplateOutlet,\n PaginationComponent,\n IconComponent,\n ImageComponent\n ]\n})\nexport class TableComponent {\n private readonly modalsService = inject(ModalsService);\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 readonly bulkActions = input<BulkAction[]>([]);\n readonly rowActions = input<RowActionsConfig | undefined>(undefined);\n\n readonly cellClick = output<CellClickEvent>();\n readonly sortChange = output<SortEvent>();\n readonly selectionChange = output<any[]>();\n readonly paginationChange = output<PaginationChangeEvent>();\n /** Émis quand l'utilisateur confirme la modale d'une action type='delete'. */\n readonly bulkDelete = output<any[]>();\n /** Émis pour les actions type='custom' au clic, et pour les 'delete' après confirmation. */\n readonly bulkAction = output<BulkActionEvent>();\n\n readonly actionsTemplate = contentChild<TemplateRef<{ $implicit: any }>>('actionsTemplate');\n\n readonly iconType = IconTypeEnum;\n readonly iconUiType = IconUiTypeEnum;\n readonly iconSize = IconSizeEnum;\n readonly spriteIcon = SpriteIconEnum;\n readonly buttonType = BoButtonTypeEnum;\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 constructor() {\n effect(() => {\n if (this.rowActions() && this.actionsTemplate()) {\n // eslint-disable-next-line no-console\n console.warn(\n '[cw-table] `rowActions` et `#actionsTemplate` sont fournis simultanément. `actionsTemplate` est ignoré.'\n );\n }\n });\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 getSortIcon(key: string): SpriteIconEnum {\n if (this.currentSortKey() !== key) return SpriteIconEnum.keyboardUpDown;\n return this.currentSortDirection() === 'asc'\n ? SpriteIconEnum.keyboardUp\n : SpriteIconEnum.keyboardDown;\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 }\n\n public isClickable(column: TableColumn): boolean {\n return column.type === 'link' || !!column.clickable;\n }\n\n public isTruthy(value: unknown): boolean {\n return value === true || value === 1 || value === '1' || value === 'true';\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 public resolveVariant(action: BulkAction): BoButtonTypeEnum {\n if (action.variant) return action.variant;\n return action.type === 'delete' ? BoButtonTypeEnum.danger : BoButtonTypeEnum.primary;\n }\n\n public resolveDisabled(action: BulkAction): boolean {\n const value = action.isDisabled;\n if (value === undefined) return false;\n return isSignal(value) ? (value as Signal<boolean>)() : value;\n }\n\n public async onBulkActionClick(action: BulkAction): Promise<void> {\n const rows = [...this.selectedRows()];\n if (action.type === 'delete') {\n const labelFn = action.itemLabel ?? this.defaultLabelFn;\n try {\n await this.modalsService.openModal(ModalsType.delete, {\n itemsToDelete: rows.map(labelFn),\n itemsToDeleteTitle: action.itemTitle\n }).result;\n } catch {\n return;\n }\n this.bulkDelete.emit(rows);\n this.bulkAction.emit({ id: action.id ?? 'delete', rows });\n return;\n }\n if (action.id) {\n this.bulkAction.emit({ id: action.id, rows });\n }\n }\n\n private readonly defaultLabelFn = (row: any): string =>\n row?.name ?? row?.label ?? row?.title ?? String(row?.id ?? row);\n\n /** Booléen indiquant si l'API déclarative `rowActions` est utilisée. */\n public get usingRowActions(): boolean {\n return !!this.rowActions();\n }\n\n /** Résout la liste d'actions visibles pour un row donné, en appliquant show/disabled/showDisabled. */\n public getResolvedActions(row: any): ResolvedRowAction[] {\n const config = this.rowActions();\n if (!config) return [];\n\n const ordered: Array<{ descriptor: RowActionDescriptor; defaultLabel?: string; forcedVariant?: RowActionVariant }> = [];\n if (config.edit) ordered.push({ descriptor: config.edit, defaultLabel: '_COMMON._ACTION.EDIT', forcedVariant: 'primary' });\n for (const action of config.customActions ?? []) {\n ordered.push({ descriptor: action });\n }\n if (config.delete) ordered.push({ descriptor: config.delete, defaultLabel: '_COMMON._ACTION.DELETE', forcedVariant: 'danger' });\n\n const showDisabled = config.showDisabled === true;\n const resolved: ResolvedRowAction[] = [];\n\n for (const entry of ordered) {\n const { descriptor, defaultLabel, forcedVariant } = entry;\n if (!this.evalShow(descriptor, row)) continue;\n const disabled = this.evalDisabled(descriptor, row);\n if (disabled && !showDisabled) continue;\n resolved.push({\n label: this.evalLabel(descriptor, row, defaultLabel),\n disabled,\n variant: forcedVariant ?? descriptor.variant ?? 'default',\n icon: descriptor.icon,\n link: this.evalLink(descriptor, row),\n click: descriptor.click\n });\n }\n\n return resolved;\n }\n\n public getOverflowThreshold(): number {\n return this.rowActions()?.overflowThreshold ?? 2;\n }\n\n /**\n * Nombre maximum d'actions visibles parmi toutes les lignes.\n * Sert à décider d'un affichage UNIFORME : la bascule inline/dropdown\n * est globale au tableau, pas calculée ligne par ligne.\n */\n public readonly maxVisibleActions = computed(() => {\n if (!this.rowActions()) return 0;\n return this.data().reduce(\n (max, row) => Math.max(max, this.getResolvedActions(row).length),\n 0\n );\n });\n\n /**\n * Vrai si le tableau doit afficher les actions en dropdown.\n * Dès qu'une seule ligne dépasse le seuil, TOUTES les lignes\n * basculent en dropdown pour un rendu uniforme.\n */\n public readonly useDropdownActions = computed(\n () => this.maxVisibleActions() > this.getOverflowThreshold()\n );\n\n public onRowActionClick(action: ResolvedRowAction, row: any): void {\n if (action.disabled || action.link) return;\n action.click?.(row);\n }\n\n public actionCssClass(action: ResolvedRowAction): string {\n switch (action.variant) {\n case 'danger': return 'text-danger';\n case 'primary': return 'text-primary';\n default: return '';\n }\n }\n\n private evalShow(descriptor: RowActionDescriptor, row: any): boolean {\n if (descriptor.show === undefined) return true;\n return typeof descriptor.show === 'function' ? !!descriptor.show(row) : !!descriptor.show;\n }\n\n private evalDisabled(descriptor: RowActionDescriptor, row: any): boolean {\n if (descriptor.disabled === undefined) return false;\n return typeof descriptor.disabled === 'function' ? !!descriptor.disabled(row) : !!descriptor.disabled;\n }\n\n private evalLabel(descriptor: RowActionDescriptor, row: any, fallback?: string): string {\n if (descriptor.label === undefined || descriptor.label === null) return fallback ?? '';\n return typeof descriptor.label === 'function' ? descriptor.label(row) : descriptor.label;\n }\n\n private evalLink(descriptor: RowActionDescriptor, row: any): string | unknown[] | undefined {\n if (descriptor.link === undefined) return undefined;\n return typeof descriptor.link === 'function' ? descriptor.link(row) : descriptor.link;\n }\n}\n","@if (checkbox() && selectedRows().size > 0) {\n <div class=\"table-selection-info mb-2 d-flex align-items-center gap-2 flex-wrap\">\n <span>\n {{ selectedRows().size }} {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }}\n </span>\n @for (action of bulkActions(); track $index) {\n <cw-button\n [type]=\"resolveVariant(action)\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"resolveDisabled(action)\"\n (btnAction)=\"onBulkActionClick(action)\">\n </cw-button>\n }\n </div>\n}\n\n<div class=\"table-responsive\">\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=\"d-flex-h gap-2xs\" [class]=\"getSortClass(column.key)\" (click)=\"setSortProperty(column.key)\">\n {{ column.label | translate}}\n <cw-icon\n [icon]=\"getSortIcon(column.key)\"\n [label]=\"'_COMMON._TABLE._SORT.LABEL' | translate\"\n [type]=\"iconType.default\"\n [iconSize]=\"iconSize['2xs']\"></cw-icon>\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 [class.td-actions]=\"column.type === 'actions'\">\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 ('check') {\n @if (isTruthy(row[column.key])) {\n <cw-icon\n [icon]=\"spriteIcon.checkCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.YES' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-success\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n } @else {\n <cw-icon\n [icon]=\"spriteIcon.closeCircle\"\n [label]=\"'_COMMON._PRO_SENTENCE.NO' | translate\"\n [type]=\"iconType.default\"\n iconCssClass=\"text-danger\"\n [iconSize]=\"iconSize.sm\"></cw-icon>\n }\n }\n @case ('actions') {\n @if (usingRowActions) {\n @let actions = getResolvedActions(row);\n @if (actions.length > 0) {\n @if (!useDropdownActions()) {\n @for (action of actions; track $index) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n } @else {\n <cw-button\n [label]=\"'_COMMON._TABLE.ACTIONS_MENU'\"\n [withIcon]=\"spriteIcon.menuVertical\"\n [withOnlyIcon]=\"true\"\n [type]=\"buttonType.ghost\"\n [isDropdown]=\"true\"\n [hideCaret]=\"true\">\n <ul class=\"p-0 m-0\">\n @for (action of actions; track $index) {\n <li>\n @if (action.link) {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [link]=\"action.link\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\">\n </cw-button>\n } @else {\n <cw-button\n [type]=\"buttonType.ghost\"\n [label]=\"action.label\"\n [withIcon]=\"action.icon\"\n [isDisabled]=\"action.disabled\"\n [cssClass]=\"'dropdown-item ' + actionCssClass(action)\"\n (btnAction)=\"onRowActionClick(action, row)\">\n </cw-button>\n }\n </li>\n }\n </ul>\n </cw-button>\n }\n }\n } @else {\n <ng-container\n *ngTemplateOutlet=\"actionsTemplate(); context: { $implicit: row }\">\n </ng-container>\n }\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 { ActivatedRoute, Router } from '@angular/router';\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 private readonly router = inject(Router, { optional: true });\r\n private readonly route = inject(ActivatedRoute, { optional: true });\r\n\r\n readonly filters = input.required<FilterFieldConfig[]>();\r\n readonly manual = input(false);\r\n /** Synchronise l'état appliqué des filtres avec les query params de l'URL (mémorisation / partage). */\r\n readonly syncUrl = 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 const urlValues = this.readUrlValues(configs);\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 const init = urlValues[field.key] ?? def;\r\n group[field.key] = new FormGroup({\r\n start: new FormControl(init.start ?? ''),\r\n end: new FormControl(init.end ?? '')\r\n });\r\n defaults[field.key] = { ...def };\r\n } else {\r\n const def = field.defaultValue ?? '';\r\n const init = urlValues[field.key] ?? def;\r\n group[field.key] = new FormControl(init);\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 => {\r\n this.filtersApplied.emit(values as FilterValues);\r\n this.syncFiltersToUrl(values as FilterValues);\r\n });\r\n }\r\n\r\n // Restaure le filtrage présent dans l'URL au chargement.\r\n if (Object.keys(urlValues).length > 0) {\r\n this.filtersApplied.emit(this.filterForm.value as FilterValues);\r\n }\r\n }\r\n\r\n /** Lit les valeurs de filtre présentes dans les query params de l'URL. */\r\n private readUrlValues(configs: FilterFieldConfig[]): FilterValues {\r\n const values: FilterValues = {};\r\n if (!this.syncUrl() || !this.route) return values;\r\n\r\n const params = this.route.snapshot.queryParamMap;\r\n for (const field of configs) {\r\n if (RANGE_TYPES.has(field.type)) {\r\n const start = params.get(`${field.key}.start`);\r\n const end = params.get(`${field.key}.end`);\r\n if (start !== null || end !== null) {\r\n values[field.key] = { start: start ?? '', end: end ?? '' };\r\n }\r\n } else {\r\n const value = params.get(field.key);\r\n if (value !== null) {\r\n values[field.key] = value;\r\n }\r\n }\r\n }\r\n return values;\r\n }\r\n\r\n /** Reporte l'état appliqué des filtres dans les query params (replaceUrl, sans polluer l'historique). */\r\n private syncFiltersToUrl(values: FilterValues): void {\r\n if (!this.syncUrl() || !this.router || !this.route) return;\r\n\r\n const queryParams: Record<string, string | null> = {};\r\n for (const field of this.filters()) {\r\n const value = values[field.key];\r\n if (RANGE_TYPES.has(field.type)) {\r\n queryParams[`${field.key}.start`] = this.toParam(value?.start);\r\n queryParams[`${field.key}.end`] = this.toParam(value?.end);\r\n } else {\r\n queryParams[field.key] = this.toParam(value);\r\n }\r\n }\r\n\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams,\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true\r\n });\r\n }\r\n\r\n /** Normalise une valeur en param d'URL ; les valeurs vides sont retirées (null). */\r\n private toParam(value: unknown): string | null {\r\n if (value === null || value === undefined || value === '') return null;\r\n return String(value);\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 const values = this.filterForm.value as FilterValues;\r\n this.filtersApplied.emit(values);\r\n this.syncFiltersToUrl(values);\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 const values = this.filterForm.value as FilterValues;\r\n this.filtersApplied.emit(values);\r\n this.syncFiltersToUrl(values);\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"filterForm\" (ngSubmit)=\"apply()\" class=\"filter-bar\">\r\n <div class=\"d-flex-h flex-wrap gap-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 [clearable]=\"false\">\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.link\"\r\n (btnAction)=\"apply()\">\r\n </cw-button>\r\n }\r\n <cw-button\r\n [label]=\"resetLabel() | translate\"\r\n [type]=\"uiType.link\"\r\n (btnAction)=\"reset()\">\r\n </cw-button>\r\n </div>\r\n </div>\r\n</form>\r\n","export enum PageHeaderActionEnum {\n add = 'add',\n save = 'save',\n reset = 'reset',\n exportCurrent = 'exportCurrent',\n exportAll = 'exportAll',\n import = 'import'\n}\n\nexport type PageHeaderActionState = Partial<Record<PageHeaderActionEnum, boolean>>;\n","import { Location } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport {\n BoButtonTypeEnum,\n ButtonComponent,\n ButtonIconSizeEnum,\n DropdownItemDirective,\n SpriteIconEnum\n} from '@cityway/basic-ui';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { PageHeaderActionEnum, PageHeaderActionState } from '../../models/page-header.model';\n\n@Component({\n selector: 'cw-page-header',\n templateUrl: './page-header.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ButtonComponent,\n DropdownItemDirective,\n TranslateModule\n ]\n})\nexport class PageHeaderComponent {\n private readonly location = inject(Location);\n\n readonly title = input.required<string>();\n readonly description = input<string>();\n readonly showBack = input(true);\n readonly actions = input<PageHeaderActionEnum[]>([]);\n readonly isLoading = input<PageHeaderActionState>({});\n readonly isDisabled = input<PageHeaderActionState>({});\n\n readonly action = output<PageHeaderActionEnum>();\n\n readonly buttonType = BoButtonTypeEnum;\n readonly iconSize = ButtonIconSizeEnum;\n readonly spriteIcon = SpriteIconEnum;\n readonly actionEnum = PageHeaderActionEnum;\n\n readonly hasExport = computed(() =>\n this.actions().some(a => a === PageHeaderActionEnum.exportCurrent || a === PageHeaderActionEnum.exportAll)\n );\n readonly showExportCurrent = computed(() => this.actions().includes(PageHeaderActionEnum.exportCurrent));\n readonly showExportAll = computed(() => this.actions().includes(PageHeaderActionEnum.exportAll));\n readonly showImport = computed(() => this.actions().includes(PageHeaderActionEnum.import));\n readonly showReset = computed(() => this.actions().includes(PageHeaderActionEnum.reset));\n readonly showAdd = computed(() => this.actions().includes(PageHeaderActionEnum.add));\n readonly showSave = computed(() => this.actions().includes(PageHeaderActionEnum.save));\n\n public goBack(): void {\n this.location.back();\n }\n\n public emit(action: PageHeaderActionEnum): void {\n this.action.emit(action);\n }\n\n public loading(action: PageHeaderActionEnum): boolean {\n return !!this.isLoading()[action];\n }\n\n public disabled(action: PageHeaderActionEnum): boolean {\n return !!this.isDisabled()[action];\n }\n}\n","<div class=\"page-header d-flex-v gap-2xs\">\n @if (showBack()) {\n <cw-button [type]=\"buttonType.ghost\" [label]=\"'_COMMON._FORM.BACK'\" [withIcon]=\"spriteIcon.left1\"\n (btnAction)=\"goBack()\" />\n }\n <div class=\"d-flex-h gap-md items-start justify-between flex-wrap\">\n <div class=\"d-flex-v\">\n <h1 class=\"page-header-title\">{{ title() | translate}}</h1>\n @if (description(); as desc) {\n <p class=\"fs-md text-light\" [innerHTML]=\"desc | translate\"></p>\n }\n </div>\n\n <div class=\"page-header-actions d-flex-h gap-md flex-wrap items-center\">\n @if (showImport()) {\n <cw-button [type]=\"buttonType.secondary\" [label]=\"'_COMMON._ACTION.IMPORT'\"\n [isDisabled]=\"disabled(actionEnum.import)\" [isLoading]=\"loading(actionEnum.import)\"\n (btnAction)=\"emit(actionEnum.import)\">\n </cw-button>\n }\n\n @if (showReset()) {\n <cw-button [type]=\"buttonType.secondary\" [label]=\"'_COMMON._ACTION.RESET'\"\n [isDisabled]=\"disabled(actionEnum.reset)\" [isLoading]=\"loading(actionEnum.reset)\"\n (btnAction)=\"emit(actionEnum.reset)\">\n </cw-button>\n }\n\n @if (hasExport()) {\n <cw-button [type]=\"buttonType.secondary\" [label]=\"'_COMMON._ACTION.EXPORT'\" [isDropdown]=\"true\"\n [isDisabled]=\"disabled(actionEnum.exportCurrent) && disabled(actionEnum.exportAll)\">\n <ul>\n <li>\n @if (showExportCurrent()) {\n <cw-button [type]=\"buttonType.ghost\" [label]=\"'_COMMON._ACTION.EXPORT_CURRENT'\"\n [isDisabled]=\"disabled(actionEnum.exportCurrent)\" (btnAction)=\"emit(actionEnum.exportCurrent)\">\n </cw-button>\n }\n </li>\n <li>\n @if (showExportAll()) {\n <cw-button [type]=\"buttonType.ghost\" [label]=\"'_COMMON._ACTION.EXPORT_ALL'\"\n [isDisabled]=\"disabled(actionEnum.exportAll)\" (btnAction)=\"emit(actionEnum.exportAll)\">\n </cw-button>\n }\n </li>\n </ul>\n </cw-button>\n }\n\n <ng-content></ng-content>\n\n @if (showAdd()) {\n <cw-button [type]=\"buttonType.primary\" [label]=\"'_COMMON._ACTION.ADD'\" [withIcon]=\"spriteIcon.add\"\n [isDisabled]=\"disabled(actionEnum.add)\" [isLoading]=\"loading(actionEnum.add)\"\n (btnAction)=\"emit(actionEnum.add)\">\n </cw-button>\n }\n\n @if (showSave()) {\n <cw-button [type]=\"buttonType.primary\" [label]=\"'_COMMON._ACTION.SAVE'\" [isDisabled]=\"disabled(actionEnum.save)\"\n [isLoading]=\"loading(actionEnum.save)\" (btnAction)=\"emit(actionEnum.save)\">\n </cw-button>\n }\n </div>\n </div>\n</div>\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/drag-n-drop-nested-list/drag-n-drop-nested-list.component';\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/filter-bar/filter-bar.component';\r\nexport * from './lib/components/page-header/page-header.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\nexport * from './lib/models/page-header.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
@@ -2,7 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef, Signal } from '@angular/core';
3
3
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
4
4
  import { FormArray, AbstractControl, FormGroup, FormControl } from '@angular/forms';
5
- import { BadgeTypeEnum, SpriteIconEnum, BadgePositionEnum, BoButtonTypeEnum, IconTypeEnum, IconUiTypeEnum, IconSizeEnum, FormFieldTypeEnum, FormFieldOption, ButtonIconSizeEnum } from '@cityway/basic-ui';
5
+ import { BadgeTypeEnum, SpriteIconEnum, IconSizeEnum, BoButtonTypeEnum, ButtonPositionEnum, ButtonIconSizeEnum, CardTypeEnum, BadgePositionEnum, IconTypeEnum, IconUiTypeEnum, FormFieldTypeEnum, FormFieldOption } from '@cityway/basic-ui';
6
6
  import { HttpParams } from '@angular/common/http';
7
7
 
8
8
  interface DataCustomList {
@@ -32,13 +32,62 @@ interface DragItem {
32
32
  order?: number;
33
33
  disabled?: boolean;
34
34
  children?: DragItem[];
35
+ /** Titre affiché dans l'en-tête de la carte (fallback sur `label` si absent). */
36
+ title?: string;
37
+ /** Sous-titre affiché sous le titre. */
38
+ subtitle?: string;
39
+ /** Badge « à part » paramétrable par carte. */
40
+ badge?: DragItemBadge;
41
+ /**
42
+ * Nom des enfants, affiché en compteur « [N] childrenLabel » uniquement
43
+ * quand la carte a des enfants (ex. « rubriques » → « 5 rubriques »).
44
+ * Forme plurielle.
45
+ */
46
+ childrenLabel?: string;
47
+ /** Forme singulière du compteur d'enfants (ex. « rubrique » → « 1 rubrique »). */
48
+ childrenLabelSingular?: string;
49
+ /** Override par item de la visibilité des actions (sinon défauts de la colonne). */
50
+ actions?: DragItemActions;
35
51
  [key: string]: any;
36
52
  }
53
+ interface DragItemBadge {
54
+ label: string;
55
+ type: BadgeTypeEnum;
56
+ icon?: SpriteIconEnum;
57
+ }
58
+ interface DragItemActions {
59
+ /** Loupe — consulter. */
60
+ view?: boolean;
61
+ /** Crayon — éditer. */
62
+ edit?: boolean;
63
+ /** Corbeille — supprimer. */
64
+ delete?: boolean;
65
+ /** Lien « Ajouter » en pied de carte. */
66
+ add?: boolean;
67
+ }
37
68
  interface DragListColumn {
38
69
  title: string;
39
70
  description?: string;
40
71
  descriptionRwd?: string;
41
72
  cssClass?: string;
73
+ /** Cartes pliables/dépliables (défaut : true). */
74
+ collapsible?: boolean;
75
+ /** Visibilité par défaut des actions, surchargeable par item via `DragItem.actions`. */
76
+ showView?: boolean;
77
+ showEdit?: boolean;
78
+ showDelete?: boolean;
79
+ showAdd?: boolean;
80
+ /** Libellé du lien d'ajout dans les cartes (défaut : « Ajouter »). */
81
+ addLabel?: string;
82
+ /** Affiche un bouton d'ajout d'item de premier niveau en tête de liste. */
83
+ showAddRoot?: boolean;
84
+ /** Libellé du bouton d'ajout racine (défaut : `addLabel`, sinon « Ajouter »). */
85
+ addRootLabel?: string;
86
+ }
87
+ /** Contexte émis avec l'event `add` : la carte parent (undefined si racine). */
88
+ interface DragAddEvent {
89
+ parent?: DragItem;
90
+ depth: number;
42
91
  }
43
92
 
44
93
  interface DragDropAdapter<T = any> {
@@ -80,14 +129,52 @@ declare class DragNDropNestedListComponent {
80
129
  readonly itemTemplate: _angular_core.InputSignal<TemplateRef<any>>;
81
130
  readonly column: _angular_core.InputSignal<DragListColumn>;
82
131
  readonly reorderOnDrop: _angular_core.InputSignal<boolean>;
132
+ /**
133
+ * Profondeur maximale autorisée (index 0-based, racine = 0). Une carte à `depth < maxDepth`
134
+ * peut recevoir des enfants (même vide) ; une carte à `depth >= maxDepth` est terminale.
135
+ * `undefined` => imbrication infinie (ajout possible partout). Ex. `maxDepth = 1` => 2 niveaux.
136
+ */
137
+ readonly maxDepth: _angular_core.InputSignal<number>;
83
138
  readonly itemsChange: _angular_core.OutputEmitterRef<DragItem[]>;
139
+ readonly view: _angular_core.OutputEmitterRef<DragItem>;
140
+ readonly edit: _angular_core.OutputEmitterRef<DragItem>;
141
+ readonly delete: _angular_core.OutputEmitterRef<DragItem>;
142
+ readonly add: _angular_core.OutputEmitterRef<DragAddEvent>;
143
+ readonly spriteIcon: typeof SpriteIconEnum;
144
+ readonly iconSize: typeof IconSizeEnum;
145
+ readonly buttonType: typeof BoButtonTypeEnum;
146
+ readonly buttonPosition: typeof ButtonPositionEnum;
147
+ readonly buttonIconSize: typeof ButtonIconSizeEnum;
84
148
  _items: DragItem[];
85
149
  constructor();
86
150
  drop(event: CdkDragDrop<DragItem[]>): void;
151
+ /**
152
+ * Une carte n'est pliable que si elle a des enfants OU qu'on peut lui en ajouter.
153
+ * `column.collapsible === false` désactive globalement.
154
+ */
155
+ isCollapsible(item: DragItem, depth: number): boolean;
156
+ /**
157
+ * Peut-on ajouter des enfants à cette carte ? Résolution :
158
+ * override item (`actions.add`) → override colonne (`showAdd`) → plafond `maxDepth`
159
+ * (`depth < maxDepth`) → sinon `true` (imbrication infinie). Indépendant du fait
160
+ * d'avoir déjà des enfants : une carte vide reste addable.
161
+ */
162
+ canAdd(item: DragItem, depth: number): boolean;
163
+ /** Visibilité d'une action (view/edit/delete) : override item → défaut colonne → true. */
164
+ showAction(item: DragItem, action: 'view' | 'edit' | 'delete'): boolean;
165
+ /**
166
+ * Libellé du compteur d'enfants, en gérant singulier/pluriel.
167
+ * Affiché aussi à `0` quand la carte est vide mais peut recevoir des enfants
168
+ * (ex. « 0 rubrique »). Masqué sur une carte terminale sans enfant.
169
+ */
170
+ childrenCountLabel(item: DragItem, depth: number): string | null;
171
+ onAdd(parent: DragItem | undefined, depth: number): void;
172
+ /** Alterne le type de carte selon la profondeur : pair => default, impair => light. */
173
+ cardType(depth: number): CardTypeEnum;
87
174
  private applyOrderRecursive;
88
175
  private cloneTree;
89
176
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DragNDropNestedListComponent, never>;
90
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DragNDropNestedListComponent, "cw-drag-n-drop-nested-list", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "column": { "alias": "column"; "required": false; "isSignal": true; }; "reorderOnDrop": { "alias": "reorderOnDrop"; "required": false; "isSignal": true; }; }, { "itemsChange": "itemsChange"; }, never, never, true, never>;
177
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DragNDropNestedListComponent, "cw-drag-n-drop-nested-list", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "column": { "alias": "column"; "required": false; "isSignal": true; }; "reorderOnDrop": { "alias": "reorderOnDrop"; "required": false; "isSignal": true; }; "maxDepth": { "alias": "maxDepth"; "required": false; "isSignal": true; }; }, { "itemsChange": "itemsChange"; "view": "view"; "edit": "edit"; "delete": "delete"; "add": "add"; }, never, never, true, never>;
91
178
  }
92
179
 
93
180
  type ColumnType = 'text' | 'badge' | 'link' | 'actions' | 'icon' | 'image' | 'check';
@@ -387,4 +474,4 @@ declare function buildFilterParams(filters: FilterValues, keyMap?: Record<string
387
474
  }>): HttpParams;
388
475
 
389
476
  export { ArrayAdapter, CustomListComponent, DragNDropListComponent, DragNDropNestedListComponent, FilterBarComponent, FormArrayAdapter, PageHeaderActionEnum, PageHeaderComponent, PaginationComponent, TableComponent, buildFilterParams };
390
- export type { BadgeConfig, BulkAction, BulkActionEvent, BulkActionType, CellClickEvent, ColumnType, DataCustomList, DataCustomListGroup, DragDropAdapter, DragItem, DragListColumn, FilterFieldConfig, FilterValues, PageHeaderActionState, Pagination, PaginationChangeEvent, ResolvedRowAction, RowActionDescriptor, RowActionVariant, RowActionsConfig, SortDirection, SortEvent, TableColumn, TableConfig };
477
+ export type { BadgeConfig, BulkAction, BulkActionEvent, BulkActionType, CellClickEvent, ColumnType, DataCustomList, DataCustomListGroup, DragAddEvent, DragDropAdapter, DragItem, DragItemActions, DragItemBadge, DragListColumn, FilterFieldConfig, FilterValues, PageHeaderActionState, Pagination, PaginationChangeEvent, ResolvedRowAction, RowActionDescriptor, RowActionVariant, RowActionsConfig, 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-beta021",
3
+ "version": "1.0.10-beta023",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.0",
6
6
  "@angular/core": "^20.3.0",
@@ -9,7 +9,7 @@
9
9
  "@angular/cdk": "^20.2.2",
10
10
  "@angular/platform-browser": "^20.3.0",
11
11
  "@angular/router": "^20.3.0",
12
- "@cityway/basic-ui": "^1.0.2-beta025"
12
+ "@cityway/basic-ui": "^1.0.2-beta028"
13
13
  },
14
14
  "dependencies": {
15
15
  "tslib": "^2.8.0"
@@ -1 +1 @@
1
- .table{font-size:.875rem;line-height:1.43}.table tr{border-top:1px solid #eceef2;border-bottom:1px solid #eceef2}.table thead{font-weight:700;background-color:#f6f7f9}.table td,.table th{gap:.5rem;padding:.625rem .5rem}.table .td-ations{width:50px}.sorting-btn .icon{color:#65747e}.drag-drop-list-column{display:flex;flex-direction:column;gap:.75rem;height:100%;padding:1rem;border:1px solid #8996a9;border-radius:var(--cw-border-radius)}.drag-drop-list-column-available{background-color:var(--cw-body-bg)}.drag-drop-list-column-active{border-style:dashed;background-color:var(--cw-base-white)}.drag-drop-list-column>li{cursor:move}.drag-drop-list-column>li.cdk-drag-disabled{cursor:not-allowed}.custom-card-light{--cw-card-padding: 0.5rem;--cw-card-bg: var(--cw-body-bg);--cw-card-br: 0.25rem;--cw-card-bs: none}.custom-description-list{display:flex;flex-direction:column}.custom-description-list li{display:flex;gap:.375rem}.pagination{margin-top:1rem}.pagination li{margin-right:-1px}.pagination li:first-child .btn-pagination{--cw-btn-br: var(--cw-border-radius-input) 0 0 var(--cw-border-radius-input)}.pagination li:last-child .btn-pagination{--cw-btn-br: 0 var(--cw-border-radius-input) var(--cw-border-radius-input) 0}.pagination .field-group{--cw-field-control-height: 2rem}.btn-pagination{--cw-btn-padding-x: 0;--cw-btn-padding-y: 0;--cw-btn-bg: var(--cw-base-white);--cw-btn-color: #65747E;--cw-btn-fs: 0.875rem;--cw-btn-lh: 1.43;--cw-btn-fw: var(--cw-body-fw);--cw-btn-border-color: #E6EDF2;--cw-btn-border-width: 1px;--cw-btn-br: 0;--cw-btn-hover-color: var(--cw-primary-hover);--cw-btn-hover-bg: var(--cw-btn-bg);--cw-btn-hover-border-color: var(--cw-btn-border-color);--cw-btn-disabled-color: #A3B6C2;--cw-btn-disabled-bg: var(--cw-base-white);--cw-btn-disabled-border-color: var(--cw-btn-border-color);min-width:2rem;height:2rem;justify-content:center}.btn-pagination-active{--cw-btn-bg: var(--cw-primary-base);--cw-btn-color: var(--cw-primary-contrasted)}.filter-bar{padding-top:1rem;padding-bottom:1rem}.filter-bar:only-child{padding:0}.filter-bar .field-group{--cw-field-control-height: 1.75rem;--cw-field-control-padding-y: 0.75rem;--cw-field-control-fs: 0.75rem;--cw-field-control-lh: 1.333}/*# sourceMappingURL=bo-ui.styles.min.css.map */
1
+ .table{font-size:.875rem;line-height:1.43}.table tr{border-top:1px solid #eceef2;border-bottom:1px solid #eceef2}.table thead{font-weight:700;background-color:#f6f7f9}.table td,.table th{gap:.5rem;padding:.625rem .5rem}.table .td-actions{width:50px;white-space:nowrap}.table .td-actions>cw-button+cw-button{margin-left:.75rem}.sorting-btn .icon{color:#65747e}.drag-drop-list-column{display:flex;flex-direction:column;gap:.75rem;height:100%;padding:1rem;border:1px solid #8996a9;border-radius:var(--cw-border-radius)}.drag-drop-list-column-available{background-color:var(--cw-body-bg)}.drag-drop-list-column-active{border-style:dashed;background-color:var(--cw-base-white)}.drag-drop-list-column>li{cursor:move}.drag-drop-list-column>li.cdk-drag-disabled{cursor:not-allowed}.ddn-list-card .card-body{padding-left:3.5rem}.custom-card-light{--cw-card-padding: 0.5rem;--cw-card-bg: var(--cw-body-bg);--cw-card-br: 0.25rem;--cw-card-bs: none}.custom-description-list{display:flex;flex-direction:column}.custom-description-list li{display:flex;gap:.375rem}.pagination{margin-top:1rem}.pagination li{margin-right:-1px}.pagination li:first-child .btn-pagination{--cw-btn-br: var(--cw-border-radius-input) 0 0 var(--cw-border-radius-input)}.pagination li:last-child .btn-pagination{--cw-btn-br: 0 var(--cw-border-radius-input) var(--cw-border-radius-input) 0}.pagination .field-group{--cw-field-control-height: 2rem}.btn-pagination{--cw-btn-padding-x: 0;--cw-btn-padding-y: 0;--cw-btn-bg: var(--cw-base-white);--cw-btn-color: #65747E;--cw-btn-fs: 0.875rem;--cw-btn-lh: 1.43;--cw-btn-fw: var(--cw-body-fw);--cw-btn-border-color: #E6EDF2;--cw-btn-border-width: 1px;--cw-btn-br: 0;--cw-btn-hover-color: var(--cw-primary-hover);--cw-btn-hover-bg: var(--cw-btn-bg);--cw-btn-hover-border-color: var(--cw-btn-border-color);--cw-btn-disabled-color: #A3B6C2;--cw-btn-disabled-bg: var(--cw-base-white);--cw-btn-disabled-border-color: var(--cw-btn-border-color);min-width:2rem;height:2rem;justify-content:center}.btn-pagination-active{--cw-btn-bg: var(--cw-primary-base);--cw-btn-color: var(--cw-primary-contrasted)}.filter-bar{padding-top:1rem;padding-bottom:1rem}.filter-bar:only-child{padding:0}.filter-bar .field-group{--cw-field-control-height: 1.75rem;--cw-field-control-padding-y: 0.75rem;--cw-field-control-fs: 0.75rem;--cw-field-control-lh: 1.333}/*# sourceMappingURL=bo-ui.styles.min.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../projects/bo-ui/src/lib/styles/scss/components/_table.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_drag-n-drop-list.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_custom-list.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_pagination.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_filter-bar.scss"],"names":[],"mappings":"AAIA,OACE,kBACA,iBACA,UACE,6BACA,gCAEF,aACE,gBACA,yBAGF,oBACE,UACA,sBAGF,kBACE,WAKF,mBACE,cCtBF,uBACE,aACA,sBACA,WACA,YACA,aACA,yBACA,sCAEA,iCACE,mCAGF,8BACE,oBACA,sCAGF,0BACE,YAGF,4CACE,mBCzBN,mBACE,0BACA,gCACA,sBACA,mBAGF,yBACE,aACA,sBAEA,4BACE,aACA,YCbJ,YACE,gBAEA,eACE,kBAGE,2CACE,6EAKF,0CACE,6EAKN,yBACE,gCAIJ,gBACE,sBACA,sBACA,kCACA,wBACA,sBACA,kBACA,+BACA,+BACA,2BACA,eACA,8CACA,oCACA,wDACA,iCACA,2CACA,2DAEA,eACA,YACA,uBAEA,uBACE,oCACA,6CChDJ,YACE,iBACA,oBAEA,uBACE,UAEF,yBACE,mCACA,sCACA,+BACA","file":"bo-ui.styles.min.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../../projects/bo-ui/src/lib/styles/scss/components/_table.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_drag-n-drop-list.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_drag-n-drop-nested-list.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_custom-list.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_pagination.scss","../../../projects/bo-ui/src/lib/styles/scss/components/_filter-bar.scss"],"names":[],"mappings":"AAIA,OACE,kBACA,iBACA,UACE,6BACA,gCAEF,aACE,gBACA,yBAGF,oBACE,UACA,sBAGF,mBACE,WACA,mBACA,uCACE,mBAMJ,mBACE,cC1BF,uBACE,aACA,sBACA,WACA,YACA,aACA,yBACA,sCAEA,iCACE,mCAGF,8BACE,oBACA,sCAGF,0BACE,YAGF,4CACE,mBCtBF,0BACE,oBCJN,mBACE,0BACA,gCACA,sBACA,mBAGF,yBACE,aACA,sBAEA,4BACE,aACA,YCbJ,YACE,gBAEA,eACE,kBAGE,2CACE,6EAKF,0CACE,6EAKN,yBACE,gCAIJ,gBACE,sBACA,sBACA,kCACA,wBACA,sBACA,kBACA,+BACA,+BACA,2BACA,eACA,8CACA,oCACA,wDACA,iCACA,2CACA,2DAEA,eACA,YACA,uBAEA,uBACE,oCACA,6CChDJ,YACE,iBACA,oBAEA,uBACE,UAEF,yBACE,mCACA,sCACA,+BACA","file":"bo-ui.styles.min.css"}
Binary file