@cityway/bo-ui 1.0.10-beta022 → 1.0.10-beta024

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, AlertTypeEnum, CardTypeEnum, BadgeComponent, IconComponent, ButtonComponent, AlertComponent, 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,
@@ -161,8 +161,31 @@ class DragNDropNestedListComponent {
161
161
  this.items = input([], ...(ngDevMode ? [{ debugName: "items" }] : []));
162
162
  this.itemTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "itemTemplate" }] : []));
163
163
  this.column = input(undefined, ...(ngDevMode ? [{ debugName: "column" }] : []));
164
- this.reorderOnDrop = input(false, ...(ngDevMode ? [{ debugName: "reorderOnDrop" }] : []));
164
+ /**
165
+ * Renumérote la propriété `order` (1..n par niveau) à chaque drop. `true` par défaut :
166
+ * réordonner + renuméroter est le comportement attendu d'une liste triable.
167
+ * Passer `false` pour ne déplacer que visuellement sans toucher à `order`.
168
+ */
169
+ this.reorderOnDrop = input(true, ...(ngDevMode ? [{ debugName: "reorderOnDrop" }] : []));
170
+ /**
171
+ * Profondeur maximale autorisée (index 0-based, racine = 0). Une carte à `depth < maxDepth`
172
+ * peut recevoir des enfants (même vide) ; une carte à `depth >= maxDepth` est terminale.
173
+ * `undefined` => imbrication infinie (ajout possible partout). Ex. `maxDepth = 1` => 2 niveaux.
174
+ */
175
+ this.maxDepth = input(undefined, ...(ngDevMode ? [{ debugName: "maxDepth" }] : []));
165
176
  this.itemsChange = output();
177
+ this.view = output();
178
+ this.edit = output();
179
+ this.delete = output();
180
+ /** Émis quand on clique « Restaurer » sur une carte `pendingDelete` (au lieu de `delete`). */
181
+ this.restore = output();
182
+ this.add = output();
183
+ this.spriteIcon = SpriteIconEnum;
184
+ this.iconSize = IconSizeEnum;
185
+ this.buttonType = BoButtonTypeEnum;
186
+ this.buttonPosition = ButtonPositionEnum;
187
+ this.buttonIconSize = ButtonIconSizeEnum;
188
+ this.alertType = AlertTypeEnum;
166
189
  // Copie interne mutable sur laquelle le CDK opère (pas un signal — cf. DragNDropListComponent)
167
190
  this._items = [];
168
191
  effect(() => {
@@ -180,6 +203,98 @@ class DragNDropNestedListComponent {
180
203
  }
181
204
  this.itemsChange.emit(this._items);
182
205
  }
206
+ /**
207
+ * Une carte n'est pliable que si elle a des enfants OU qu'on peut lui en ajouter.
208
+ * `column.collapsible === false` désactive globalement.
209
+ */
210
+ isCollapsible(item, depth) {
211
+ if (this.column()?.collapsible === false)
212
+ return false;
213
+ const hasChildren = (item.children?.length ?? 0) > 0;
214
+ return hasChildren || this.canAdd(item, depth);
215
+ }
216
+ /**
217
+ * Peut-on ajouter des enfants à cette carte ? Résolution :
218
+ * override item (`actions.add`) → override colonne (`showAdd`) → plafond `maxDepth`
219
+ * (`depth < maxDepth`) → sinon `true` (imbrication infinie). Indépendant du fait
220
+ * d'avoir déjà des enfants : une carte vide reste addable.
221
+ */
222
+ canAdd(item, depth) {
223
+ if (item.actions?.add !== undefined)
224
+ return item.actions.add;
225
+ const colDefault = this.column()?.showAdd;
226
+ if (colDefault !== undefined)
227
+ return colDefault;
228
+ const max = this.maxDepth();
229
+ if (max !== undefined)
230
+ return depth < max;
231
+ return true;
232
+ }
233
+ /** Nombre max d'items autorisé à un niveau (`undefined` => pas de limite). */
234
+ levelMax(depth) {
235
+ return this.column()?.maxItemsByDepth?.[depth];
236
+ }
237
+ /** Vrai si le niveau `depth` a atteint son max (et qu'un max est défini). */
238
+ isLevelFull(count, depth) {
239
+ const max = this.levelMax(depth);
240
+ return max !== undefined && count >= max;
241
+ }
242
+ /** Compteur affiché dans le titre de colonne (racine) : `6` ou `6/10` si limite racine. */
243
+ columnCountLabel() {
244
+ const count = this._items.length;
245
+ const max = this.levelMax(0);
246
+ return max !== undefined ? `${count}/${max}` : `${count}`;
247
+ }
248
+ /** Visibilité d'une action (view/edit/delete) : override item → défaut colonne → true. */
249
+ showAction(item, action) {
250
+ const override = item.actions?.[action];
251
+ if (override !== undefined)
252
+ return override;
253
+ const col = this.column();
254
+ const colDefault = {
255
+ view: col?.showView,
256
+ edit: col?.showEdit,
257
+ delete: col?.showDelete,
258
+ }[action];
259
+ return colDefault ?? true;
260
+ }
261
+ /**
262
+ * Classe(s) de la carte selon son état (posées par la lib, stylées dans le SCSS DS).
263
+ * `selected` → `ddn-list-card-selected` ; `pendingDelete` → `ddn-list-card-deleting`.
264
+ */
265
+ cardCssClass(item) {
266
+ return [
267
+ 'ddn-list-card',
268
+ item.selected ? 'ddn-list-card-selected' : '',
269
+ item.pendingDelete ? 'ddn-list-card-deleting' : '',
270
+ ].filter(Boolean).join(' ');
271
+ }
272
+ /**
273
+ * Libellé du compteur d'enfants, en gérant singulier/pluriel.
274
+ * Affiché aussi à `0` quand la carte est vide mais peut recevoir des enfants
275
+ * (ex. « 0 rubrique »). Masqué sur une carte terminale sans enfant.
276
+ */
277
+ childrenCountLabel(item, depth) {
278
+ const count = item.children?.length ?? 0;
279
+ if (count === 0 && !this.canAdd(item, depth))
280
+ return null;
281
+ const noun = count <= 1
282
+ ? (item.childrenLabelSingular ?? item.childrenLabel)
283
+ : item.childrenLabel;
284
+ // Les enfants de cette carte sont au niveau depth + 1.
285
+ const max = this.levelMax(depth + 1);
286
+ const base = noun ? `${count} ${noun}` : `${count}`;
287
+ if (max !== undefined)
288
+ return `${base} / ${max}`;
289
+ return noun || count > 0 ? base : null;
290
+ }
291
+ onAdd(parent, depth) {
292
+ this.add.emit({ parent, depth });
293
+ }
294
+ /** Alterne le type de carte selon la profondeur : pair => default, impair => light. */
295
+ cardType(depth) {
296
+ return depth % 2 === 0 ? CardTypeEnum.default : CardTypeEnum.light;
297
+ }
183
298
  applyOrderRecursive(nodes) {
184
299
  nodes.forEach((node, i) => {
185
300
  node.order = i + 1;
@@ -194,12 +309,12 @@ class DragNDropNestedListComponent {
194
309
  }));
195
310
  }
196
311
  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" }] }); }
312
+ 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", restore: "restore", add: "add" }, ngImport: i0, template: "<div class=\"ddn-list d-flex-v gap-md\">\n <div class=\"d-flex-h justify-between\">\n @if (column()?.title) {\n <h2>{{ column()!.title | translate }} ({{ columnCountLabel() }})</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 [isDisabled]=\"isLevelFull(_items.length, 0)\" (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 @if (isLevelFull(nodes.length, depth)) {\n <cw-alert [type]=\"alertType.warning\" cssClass=\"ddn-list-max-alert\">\n {{ (column()?.maxReachedLabel ?? '_COMMON.MAX_ITEMS_REACHED') | translate:{ max: levelMax(depth) } }}\n </cw-alert>\n }\n\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\" cdkDragPreviewClass=\"ddn-list-card-preview\">\n <cw-card [cssClass]=\"cardCssClass(item)\" [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 @if (item.pendingDelete) {\n <!-- Soft-delete : la corbeille bascule en \u00AB Restaurer \u00BB et \u00E9met (restore). -->\n <cw-button label=\"_COMMON._ACTION.RESTORE\" [withIcon]=\"spriteIcon.toolbarRefresh\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-restore\"\n [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"restore.emit(item)\" />\n } @else {\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 }\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 [isDisabled]=\"isLevelFull(item.children?.length ?? 0, depth + 1)\" (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: "component", type: AlertComponent, selector: "cw-alert", inputs: ["type", "title", "isDismissible", "cssClass", "dataTest"], outputs: ["close"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
198
313
  }
199
314
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: DragNDropNestedListComponent, decorators: [{
200
315
  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"] }] } });
316
+ args: [{ selector: 'cw-drag-n-drop-nested-list', standalone: true, imports: [CommonModule, TranslateModule, DragDropModule, CardComponent, BadgeComponent, IconComponent, ButtonComponent, AlertComponent], template: "<div class=\"ddn-list d-flex-v gap-md\">\n <div class=\"d-flex-h justify-between\">\n @if (column()?.title) {\n <h2>{{ column()!.title | translate }} ({{ columnCountLabel() }})</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 [isDisabled]=\"isLevelFull(_items.length, 0)\" (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 @if (isLevelFull(nodes.length, depth)) {\n <cw-alert [type]=\"alertType.warning\" cssClass=\"ddn-list-max-alert\">\n {{ (column()?.maxReachedLabel ?? '_COMMON.MAX_ITEMS_REACHED') | translate:{ max: levelMax(depth) } }}\n </cw-alert>\n }\n\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\" cdkDragPreviewClass=\"ddn-list-card-preview\">\n <cw-card [cssClass]=\"cardCssClass(item)\" [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 @if (item.pendingDelete) {\n <!-- Soft-delete : la corbeille bascule en \u00AB Restaurer \u00BB et \u00E9met (restore). -->\n <cw-button label=\"_COMMON._ACTION.RESTORE\" [withIcon]=\"spriteIcon.toolbarRefresh\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-restore\"\n [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"restore.emit(item)\" />\n } @else {\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 }\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 [isDisabled]=\"isLevelFull(item.children?.length ?? 0, depth + 1)\" (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" }]
317
+ }], 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"] }], restore: [{ type: i0.Output, args: ["restore"] }], add: [{ type: i0.Output, args: ["add"] }] } });
203
318
 
204
319
  class DoubleScrollDirective {
205
320
  constructor(el, renderer) {
@@ -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-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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"}
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, AlertComponent,\n SpriteIconEnum, IconSizeEnum, BoButtonTypeEnum, ButtonPositionEnum, ButtonIconSizeEnum, CardTypeEnum, AlertTypeEnum\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, AlertComponent]\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 /**\n * Renumérote la propriété `order` (1..n par niveau) à chaque drop. `true` par défaut :\n * réordonner + renuméroter est le comportement attendu d'une liste triable.\n * Passer `false` pour ne déplacer que visuellement sans toucher à `order`.\n */\n readonly reorderOnDrop = input(true);\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 /** Émis quand on clique « Restaurer » sur une carte `pendingDelete` (au lieu de `delete`). */\n readonly restore = 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 readonly alertType = AlertTypeEnum;\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 /** Nombre max d'items autorisé à un niveau (`undefined` => pas de limite). */\n levelMax(depth: number): number | undefined {\n return this.column()?.maxItemsByDepth?.[depth];\n }\n\n /** Vrai si le niveau `depth` a atteint son max (et qu'un max est défini). */\n isLevelFull(count: number, depth: number): boolean {\n const max = this.levelMax(depth);\n return max !== undefined && count >= max;\n }\n\n /** Compteur affiché dans le titre de colonne (racine) : `6` ou `6/10` si limite racine. */\n columnCountLabel(): string {\n const count = this._items.length;\n const max = this.levelMax(0);\n return max !== undefined ? `${count}/${max}` : `${count}`;\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 * Classe(s) de la carte selon son état (posées par la lib, stylées dans le SCSS DS).\n * `selected` → `ddn-list-card-selected` ; `pendingDelete` → `ddn-list-card-deleting`.\n */\n cardCssClass(item: DragItem): string {\n return [\n 'ddn-list-card',\n item.selected ? 'ddn-list-card-selected' : '',\n item.pendingDelete ? 'ddn-list-card-deleting' : '',\n ].filter(Boolean).join(' ');\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 // Les enfants de cette carte sont au niveau depth + 1.\n const max = this.levelMax(depth + 1);\n\n const base = noun ? `${count} ${noun}` : `${count}`;\n if (max !== undefined) return `${base} / ${max}`;\n return noun || count > 0 ? base : 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-md\">\n <div class=\"d-flex-h justify-between\">\n @if (column()?.title) {\n <h2>{{ column()!.title | translate }} ({{ columnCountLabel() }})</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 [isDisabled]=\"isLevelFull(_items.length, 0)\" (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 @if (isLevelFull(nodes.length, depth)) {\n <cw-alert [type]=\"alertType.warning\" cssClass=\"ddn-list-max-alert\">\n {{ (column()?.maxReachedLabel ?? '_COMMON.MAX_ITEMS_REACHED') | translate:{ max: levelMax(depth) } }}\n </cw-alert>\n }\n\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\" cdkDragPreviewClass=\"ddn-list-card-preview\">\n <cw-card [cssClass]=\"cardCssClass(item)\" [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 @if (item.pendingDelete) {\n <!-- Soft-delete : la corbeille bascule en « Restaurer » et émet (restore). -->\n <cw-button label=\"_COMMON._ACTION.RESTORE\" [withIcon]=\"spriteIcon.toolbarRefresh\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-restore\"\n [iconSize]=\"buttonIconSize.xsmall\" (btnAction)=\"restore.emit(item)\" />\n } @else {\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 }\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 [isDisabled]=\"isLevelFull(item.children?.length ?? 0, depth + 1)\" (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, AlertTypeEnum, 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,87 @@ 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;
51
+ /**
52
+ * État : carte « sélectionnée » (typiquement en cours d'édition) → surbrillance.
53
+ * Piloté par le consommateur ; la lib se contente d'appliquer la classe DS dédiée.
54
+ */
55
+ selected?: boolean;
56
+ /**
57
+ * État : carte marquée pour suppression (soft-delete différé). La lib applique la
58
+ * classe DS dédiée (barré/atténué) et bascule l'action « Supprimer » en « Restaurer »
59
+ * (émet alors `(restore)` au lieu de `(delete)`). Piloté par le consommateur.
60
+ */
61
+ pendingDelete?: boolean;
35
62
  [key: string]: any;
36
63
  }
64
+ interface DragItemBadge {
65
+ label: string;
66
+ type: BadgeTypeEnum;
67
+ icon?: SpriteIconEnum;
68
+ }
69
+ interface DragItemActions {
70
+ /** Loupe — consulter. */
71
+ view?: boolean;
72
+ /** Crayon — éditer. */
73
+ edit?: boolean;
74
+ /** Corbeille — supprimer (bascule en « Restaurer » quand `pendingDelete`). */
75
+ delete?: boolean;
76
+ /** Lien « Ajouter » en pied de carte. */
77
+ add?: boolean;
78
+ }
37
79
  interface DragListColumn {
38
80
  title: string;
39
81
  description?: string;
40
82
  descriptionRwd?: string;
41
83
  cssClass?: string;
84
+ /** Cartes pliables/dépliables (défaut : true). */
85
+ collapsible?: boolean;
86
+ /** Visibilité par défaut des actions, surchargeable par item via `DragItem.actions`. */
87
+ showView?: boolean;
88
+ showEdit?: boolean;
89
+ showDelete?: boolean;
90
+ showAdd?: boolean;
91
+ /** Libellé du lien d'ajout dans les cartes (défaut : « Ajouter »). */
92
+ addLabel?: string;
93
+ /** Affiche un bouton d'ajout d'item de premier niveau en tête de liste. */
94
+ showAddRoot?: boolean;
95
+ /** Libellé du bouton d'ajout racine (défaut : `addLabel`, sinon « Ajouter »). */
96
+ addRootLabel?: string;
97
+ /**
98
+ * Nombre maximum d'items par niveau, indexé par profondeur (0 = racine).
99
+ * Objet creux : ne renseigner que les niveaux limités (ex. `{ 1: 3 }` = enfants niveau 1
100
+ * plafonnés à 3, racine illimitée). Niveau absent => pas de limite.
101
+ * - Le titre de colonne affiche le compteur racine `(count)`, et `(count/max)` si `maxItemsByDepth[0]`.
102
+ * - Le compteur d'enfants d'une carte affiche `count label / max` si une limite existe pour ses enfants.
103
+ * - Quand un niveau atteint son max : le bouton « Ajouter » correspondant est désactivé
104
+ * et un encart d'alerte s'affiche en tête de ce niveau.
105
+ */
106
+ maxItemsByDepth?: {
107
+ [depth: number]: number;
108
+ };
109
+ /** Clé i18n du message d'alerte « max atteint » (param `{{max}}`). Défaut : `_COMMON.MAX_ITEMS_REACHED`. */
110
+ maxReachedLabel?: string;
111
+ }
112
+ /** Contexte émis avec l'event `add` : la carte parent (undefined si racine). */
113
+ interface DragAddEvent {
114
+ parent?: DragItem;
115
+ depth: number;
42
116
  }
43
117
 
44
118
  interface DragDropAdapter<T = any> {
@@ -79,15 +153,72 @@ declare class DragNDropNestedListComponent {
79
153
  readonly items: _angular_core.InputSignal<DragItem[]>;
80
154
  readonly itemTemplate: _angular_core.InputSignal<TemplateRef<any>>;
81
155
  readonly column: _angular_core.InputSignal<DragListColumn>;
156
+ /**
157
+ * Renumérote la propriété `order` (1..n par niveau) à chaque drop. `true` par défaut :
158
+ * réordonner + renuméroter est le comportement attendu d'une liste triable.
159
+ * Passer `false` pour ne déplacer que visuellement sans toucher à `order`.
160
+ */
82
161
  readonly reorderOnDrop: _angular_core.InputSignal<boolean>;
162
+ /**
163
+ * Profondeur maximale autorisée (index 0-based, racine = 0). Une carte à `depth < maxDepth`
164
+ * peut recevoir des enfants (même vide) ; une carte à `depth >= maxDepth` est terminale.
165
+ * `undefined` => imbrication infinie (ajout possible partout). Ex. `maxDepth = 1` => 2 niveaux.
166
+ */
167
+ readonly maxDepth: _angular_core.InputSignal<number>;
83
168
  readonly itemsChange: _angular_core.OutputEmitterRef<DragItem[]>;
169
+ readonly view: _angular_core.OutputEmitterRef<DragItem>;
170
+ readonly edit: _angular_core.OutputEmitterRef<DragItem>;
171
+ readonly delete: _angular_core.OutputEmitterRef<DragItem>;
172
+ /** Émis quand on clique « Restaurer » sur une carte `pendingDelete` (au lieu de `delete`). */
173
+ readonly restore: _angular_core.OutputEmitterRef<DragItem>;
174
+ readonly add: _angular_core.OutputEmitterRef<DragAddEvent>;
175
+ readonly spriteIcon: typeof SpriteIconEnum;
176
+ readonly iconSize: typeof IconSizeEnum;
177
+ readonly buttonType: typeof BoButtonTypeEnum;
178
+ readonly buttonPosition: typeof ButtonPositionEnum;
179
+ readonly buttonIconSize: typeof ButtonIconSizeEnum;
180
+ readonly alertType: typeof AlertTypeEnum;
84
181
  _items: DragItem[];
85
182
  constructor();
86
183
  drop(event: CdkDragDrop<DragItem[]>): void;
184
+ /**
185
+ * Une carte n'est pliable que si elle a des enfants OU qu'on peut lui en ajouter.
186
+ * `column.collapsible === false` désactive globalement.
187
+ */
188
+ isCollapsible(item: DragItem, depth: number): boolean;
189
+ /**
190
+ * Peut-on ajouter des enfants à cette carte ? Résolution :
191
+ * override item (`actions.add`) → override colonne (`showAdd`) → plafond `maxDepth`
192
+ * (`depth < maxDepth`) → sinon `true` (imbrication infinie). Indépendant du fait
193
+ * d'avoir déjà des enfants : une carte vide reste addable.
194
+ */
195
+ canAdd(item: DragItem, depth: number): boolean;
196
+ /** Nombre max d'items autorisé à un niveau (`undefined` => pas de limite). */
197
+ levelMax(depth: number): number | undefined;
198
+ /** Vrai si le niveau `depth` a atteint son max (et qu'un max est défini). */
199
+ isLevelFull(count: number, depth: number): boolean;
200
+ /** Compteur affiché dans le titre de colonne (racine) : `6` ou `6/10` si limite racine. */
201
+ columnCountLabel(): string;
202
+ /** Visibilité d'une action (view/edit/delete) : override item → défaut colonne → true. */
203
+ showAction(item: DragItem, action: 'view' | 'edit' | 'delete'): boolean;
204
+ /**
205
+ * Classe(s) de la carte selon son état (posées par la lib, stylées dans le SCSS DS).
206
+ * `selected` → `ddn-list-card-selected` ; `pendingDelete` → `ddn-list-card-deleting`.
207
+ */
208
+ cardCssClass(item: DragItem): string;
209
+ /**
210
+ * Libellé du compteur d'enfants, en gérant singulier/pluriel.
211
+ * Affiché aussi à `0` quand la carte est vide mais peut recevoir des enfants
212
+ * (ex. « 0 rubrique »). Masqué sur une carte terminale sans enfant.
213
+ */
214
+ childrenCountLabel(item: DragItem, depth: number): string | null;
215
+ onAdd(parent: DragItem | undefined, depth: number): void;
216
+ /** Alterne le type de carte selon la profondeur : pair => default, impair => light. */
217
+ cardType(depth: number): CardTypeEnum;
87
218
  private applyOrderRecursive;
88
219
  private cloneTree;
89
220
  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>;
221
+ 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"; "restore": "restore"; "add": "add"; }, never, never, true, never>;
91
222
  }
92
223
 
93
224
  type ColumnType = 'text' | 'badge' | 'link' | 'actions' | 'icon' | 'image' | 'check';
@@ -387,4 +518,4 @@ declare function buildFilterParams(filters: FilterValues, keyMap?: Record<string
387
518
  }>): HttpParams;
388
519
 
389
520
  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 };
521
+ 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-beta022",
3
+ "version": "1.0.10-beta024",
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-beta026"
12
+ "@cityway/basic-ui": "^1.0.2-beta029"
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-actions{width:50px;white-space:inherit}.table .td-actions>cw-button+cw-button{margin-left:.5rem}.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}.ddn-list-card-selected{--cw-card-bg: #EBF4FF}.ddn-list-card-deleting{--cw-card-bg: var(--cw-danger-light)}.ddn-list-card-preview .ddn-list-card{--cw-card-bg: #EBF4FF;--cw-card-border: 1px dashed var(--cw-primary-base)}.ddn-list .cdk-drag-placeholder{opacity:.4}.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,mBACE,WACA,oBACA,uCACE,kBAMJ,mBACE,cC1BF,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,oBAEF,wBACE,sBAEF,wBACE,qCAIF,sCACE,sBACA,oDAIJ,gCACE,WCrBJ,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
Binary file