@cityway/bo-ui 1.0.10-beta024 → 1.0.10-beta026
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.
- package/cityway-bo-ui-1.0.10-beta024.tgz +0 -0
- package/cityway-bo-ui-1.0.10-beta025.tgz +0 -0
- package/cityway-bo-ui-1.0.10-beta026.tgz +0 -0
- package/fesm2022/cityway-bo-ui.mjs +38 -9
- package/fesm2022/cityway-bo-ui.mjs.map +1 -1
- package/index.d.ts +37 -4
- package/package.json +2 -2
- package/styles/bo-ui.styles.min.css +1 -1
- package/styles/bo-ui.styles.min.css.map +1 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -173,6 +173,13 @@ class DragNDropNestedListComponent {
|
|
|
173
173
|
* `undefined` => imbrication infinie (ajout possible partout). Ex. `maxDepth = 1` => 2 niveaux.
|
|
174
174
|
*/
|
|
175
175
|
this.maxDepth = input(undefined, ...(ngDevMode ? [{ debugName: "maxDepth" }] : []));
|
|
176
|
+
/**
|
|
177
|
+
* Sélection EXCLUSIVE gérée par la lib : la carte dont l'`id` vaut `selectedId` reçoit
|
|
178
|
+
* la classe `ddn-list-card-selected`. Une seule carte à la fois, à n'importe quel niveau,
|
|
179
|
+
* sans avoir à manipuler `DragItem.selected` (qui reste supporté en parallèle).
|
|
180
|
+
* Piloté par le consommateur (ex. l'id de la carte en cours d'édition ; `undefined` = aucune).
|
|
181
|
+
*/
|
|
182
|
+
this.selectedId = input(undefined, ...(ngDevMode ? [{ debugName: "selectedId" }] : []));
|
|
176
183
|
this.itemsChange = output();
|
|
177
184
|
this.view = output();
|
|
178
185
|
this.edit = output();
|
|
@@ -234,14 +241,33 @@ class DragNDropNestedListComponent {
|
|
|
234
241
|
levelMax(depth) {
|
|
235
242
|
return this.column()?.maxItemsByDepth?.[depth];
|
|
236
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Nombre d'items pris en compte pour le plafond/compteur à un niveau.
|
|
246
|
+
* Exclut les cartes `pendingDelete` si `column.excludePendingDeleteFromMax`.
|
|
247
|
+
*/
|
|
248
|
+
countForMax(nodes) {
|
|
249
|
+
const arr = nodes ?? [];
|
|
250
|
+
if (this.column()?.excludePendingDeleteFromMax) {
|
|
251
|
+
return arr.reduce((n, it) => n + (it.pendingDelete ? 0 : 1), 0);
|
|
252
|
+
}
|
|
253
|
+
return arr.length;
|
|
254
|
+
}
|
|
237
255
|
/** Vrai si le niveau `depth` a atteint son max (et qu'un max est défini). */
|
|
238
|
-
isLevelFull(
|
|
256
|
+
isLevelFull(nodes, depth) {
|
|
239
257
|
const max = this.levelMax(depth);
|
|
240
|
-
return max !== undefined &&
|
|
258
|
+
return max !== undefined && this.countForMax(nodes) >= max;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Vrai si une carte `pendingDelete` ne peut PAS être restaurée car le niveau est plein.
|
|
262
|
+
* Ne s'applique qu'en mode `excludePendingDeleteFromMax` : restaurer ré-active la carte
|
|
263
|
+
* (+1 au décompte effectif), ce qui dépasserait le plafond déjà atteint par les autres items.
|
|
264
|
+
*/
|
|
265
|
+
isRestoreBlocked(nodes, depth) {
|
|
266
|
+
return !!this.column()?.excludePendingDeleteFromMax && this.isLevelFull(nodes, depth);
|
|
241
267
|
}
|
|
242
268
|
/** Compteur affiché dans le titre de colonne (racine) : `6` ou `6/10` si limite racine. */
|
|
243
269
|
columnCountLabel() {
|
|
244
|
-
const count = this._items
|
|
270
|
+
const count = this.countForMax(this._items);
|
|
245
271
|
const max = this.levelMax(0);
|
|
246
272
|
return max !== undefined ? `${count}/${max}` : `${count}`;
|
|
247
273
|
}
|
|
@@ -260,12 +286,15 @@ class DragNDropNestedListComponent {
|
|
|
260
286
|
}
|
|
261
287
|
/**
|
|
262
288
|
* Classe(s) de la carte selon son état (posées par la lib, stylées dans le SCSS DS).
|
|
263
|
-
*
|
|
289
|
+
* Sélection → `ddn-list-card-selected` si `item.id === selectedId` (exclusif, géré par la lib)
|
|
290
|
+
* OU `item.selected === true` (flag legacy). `pendingDelete` → `ddn-list-card-deleting`.
|
|
264
291
|
*/
|
|
265
292
|
cardCssClass(item) {
|
|
293
|
+
const selectedId = this.selectedId();
|
|
294
|
+
const selected = item.selected || (selectedId !== undefined && item.id === selectedId);
|
|
266
295
|
return [
|
|
267
296
|
'ddn-list-card',
|
|
268
|
-
|
|
297
|
+
selected ? 'ddn-list-card-selected' : '',
|
|
269
298
|
item.pendingDelete ? 'ddn-list-card-deleting' : '',
|
|
270
299
|
].filter(Boolean).join(' ');
|
|
271
300
|
}
|
|
@@ -275,7 +304,7 @@ class DragNDropNestedListComponent {
|
|
|
275
304
|
* (ex. « 0 rubrique »). Masqué sur une carte terminale sans enfant.
|
|
276
305
|
*/
|
|
277
306
|
childrenCountLabel(item, depth) {
|
|
278
|
-
const count = item.children
|
|
307
|
+
const count = this.countForMax(item.children);
|
|
279
308
|
if (count === 0 && !this.canAdd(item, depth))
|
|
280
309
|
return null;
|
|
281
310
|
const noun = count <= 1
|
|
@@ -309,12 +338,12 @@ class DragNDropNestedListComponent {
|
|
|
309
338
|
}));
|
|
310
339
|
}
|
|
311
340
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: DragNDropNestedListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
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" }] }); }
|
|
341
|
+
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 }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", 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, 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, 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 <!-- Sur une carte pendingDelete, seul \u00AB Restaurer \u00BB est propos\u00E9 (view/edit masqu\u00E9s). -->\n @if (!item.pendingDelete && 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 (!item.pendingDelete && 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 (d\u00E9sactiv\u00E9 si le niveau est plein). -->\n <cw-button label=\"_COMMON._ACTION.RESTORE\" [withIcon]=\"spriteIcon.toolbarRefresh\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-restore\"\n [isDisabled]=\"isRestoreBlocked(nodes, depth)\"\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 <!-- Restauration impossible : niveau plein (mode excludePendingDeleteFromMax). -->\n @if (item.pendingDelete && isRestoreBlocked(nodes, depth)) {\n <cw-alert [type]=\"alertType.warning\" cssClass=\"ddn-list-restore-blocked-alert\">\n {{ (column()?.restoreBlockedLabel ?? '_COMMON.MAX_RESTORE_BLOCKED') | translate:{ max: levelMax(depth) } }}\n </cw-alert>\n }\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) && !item.pendingDelete) {\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 ?? [], 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" }] }); }
|
|
313
342
|
}
|
|
314
343
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.20", ngImport: i0, type: DragNDropNestedListComponent, decorators: [{
|
|
315
344
|
type: Component,
|
|
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
|
|
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"] }] } });
|
|
345
|
+
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, 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, 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 <!-- Sur une carte pendingDelete, seul \u00AB Restaurer \u00BB est propos\u00E9 (view/edit masqu\u00E9s). -->\n @if (!item.pendingDelete && 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 (!item.pendingDelete && 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 (d\u00E9sactiv\u00E9 si le niveau est plein). -->\n <cw-button label=\"_COMMON._ACTION.RESTORE\" [withIcon]=\"spriteIcon.toolbarRefresh\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-restore\"\n [isDisabled]=\"isRestoreBlocked(nodes, depth)\"\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 <!-- Restauration impossible : niveau plein (mode excludePendingDeleteFromMax). -->\n @if (item.pendingDelete && isRestoreBlocked(nodes, depth)) {\n <cw-alert [type]=\"alertType.warning\" cssClass=\"ddn-list-restore-blocked-alert\">\n {{ (column()?.restoreBlockedLabel ?? '_COMMON.MAX_RESTORE_BLOCKED') | translate:{ max: levelMax(depth) } }}\n </cw-alert>\n }\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) && !item.pendingDelete) {\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 ?? [], 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" }]
|
|
346
|
+
}], 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 }] }], selectedId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedId", 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"] }] } });
|
|
318
347
|
|
|
319
348
|
class DoubleScrollDirective {
|
|
320
349
|
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 { 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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"}
|
|
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 * Sélection EXCLUSIVE gérée par la lib : la carte dont l'`id` vaut `selectedId` reçoit\n * la classe `ddn-list-card-selected`. Une seule carte à la fois, à n'importe quel niveau,\n * sans avoir à manipuler `DragItem.selected` (qui reste supporté en parallèle).\n * Piloté par le consommateur (ex. l'id de la carte en cours d'édition ; `undefined` = aucune).\n */\n readonly selectedId = input<number | string | 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 /**\n * Nombre d'items pris en compte pour le plafond/compteur à un niveau.\n * Exclut les cartes `pendingDelete` si `column.excludePendingDeleteFromMax`.\n */\n countForMax(nodes: DragItem[] | undefined): number {\n const arr = nodes ?? [];\n if (this.column()?.excludePendingDeleteFromMax) {\n return arr.reduce((n, it) => n + (it.pendingDelete ? 0 : 1), 0);\n }\n return arr.length;\n }\n\n /** Vrai si le niveau `depth` a atteint son max (et qu'un max est défini). */\n isLevelFull(nodes: DragItem[], depth: number): boolean {\n const max = this.levelMax(depth);\n return max !== undefined && this.countForMax(nodes) >= max;\n }\n\n /**\n * Vrai si une carte `pendingDelete` ne peut PAS être restaurée car le niveau est plein.\n * Ne s'applique qu'en mode `excludePendingDeleteFromMax` : restaurer ré-active la carte\n * (+1 au décompte effectif), ce qui dépasserait le plafond déjà atteint par les autres items.\n */\n isRestoreBlocked(nodes: DragItem[], depth: number): boolean {\n return !!this.column()?.excludePendingDeleteFromMax && this.isLevelFull(nodes, depth);\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.countForMax(this._items);\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 * Sélection → `ddn-list-card-selected` si `item.id === selectedId` (exclusif, géré par la lib)\n * OU `item.selected === true` (flag legacy). `pendingDelete` → `ddn-list-card-deleting`.\n */\n cardCssClass(item: DragItem): string {\n const selectedId = this.selectedId();\n const selected = item.selected || (selectedId !== undefined && item.id === selectedId);\n return [\n 'ddn-list-card',\n 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 = this.countForMax(item.children);\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, 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, 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 <!-- Sur une carte pendingDelete, seul « Restaurer » est proposé (view/edit masqués). -->\n @if (!item.pendingDelete && 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 (!item.pendingDelete && 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 » (désactivé si le niveau est plein). -->\n <cw-button label=\"_COMMON._ACTION.RESTORE\" [withIcon]=\"spriteIcon.toolbarRefresh\" [withOnlyIcon]=\"true\"\n [type]=\"buttonType.secondary\" cssClass=\"ddn-list-action-restore\"\n [isDisabled]=\"isRestoreBlocked(nodes, depth)\"\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 <!-- Restauration impossible : niveau plein (mode excludePendingDeleteFromMax). -->\n @if (item.pendingDelete && isRestoreBlocked(nodes, depth)) {\n <cw-alert [type]=\"alertType.warning\" cssClass=\"ddn-list-restore-blocked-alert\">\n {{ (column()?.restoreBlockedLabel ?? '_COMMON.MAX_RESTORE_BLOCKED') | translate:{ max: levelMax(depth) } }}\n </cw-alert>\n }\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) && !item.pendingDelete) {\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 ?? [], 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
|
@@ -50,7 +50,9 @@ interface DragItem {
|
|
|
50
50
|
actions?: DragItemActions;
|
|
51
51
|
/**
|
|
52
52
|
* État : carte « sélectionnée » (typiquement en cours d'édition) → surbrillance.
|
|
53
|
-
*
|
|
53
|
+
* Flag legacy : autorise plusieurs sélections, à TOI de garantir l'exclusivité.
|
|
54
|
+
* Pour une sélection exclusive sans risque, préférer l'input `selectedId` du composant
|
|
55
|
+
* (la lib pose la classe sur la seule carte dont l'`id` correspond).
|
|
54
56
|
*/
|
|
55
57
|
selected?: boolean;
|
|
56
58
|
/**
|
|
@@ -108,6 +110,18 @@ interface DragListColumn {
|
|
|
108
110
|
};
|
|
109
111
|
/** Clé i18n du message d'alerte « max atteint » (param `{{max}}`). Défaut : `_COMMON.MAX_ITEMS_REACHED`. */
|
|
110
112
|
maxReachedLabel?: string;
|
|
113
|
+
/**
|
|
114
|
+
* Si `true`, les cartes `pendingDelete` ne comptent PAS dans le plafond `maxItemsByDepth`
|
|
115
|
+
* (ni compteur, ni alerte, ni désactivation du bouton « Ajouter »). Permet de remplacer
|
|
116
|
+
* une carte marquée sans attendre le Save. Défaut `false` (comptage brut).
|
|
117
|
+
*
|
|
118
|
+
* Effet de bord assumé : en mode exclude, restaurer un marqué ré-incrémente le décompte.
|
|
119
|
+
* Si le niveau est déjà plein (des remplaçants ont comblé le plafond), le bouton
|
|
120
|
+
* « Restaurer » est automatiquement désactivé et un encart explicatif s'affiche dans la carte.
|
|
121
|
+
*/
|
|
122
|
+
excludePendingDeleteFromMax?: boolean;
|
|
123
|
+
/** Clé i18n de l'encart « restauration impossible (max atteint) » (param `{{max}}`). Défaut : `_COMMON.MAX_RESTORE_BLOCKED`. */
|
|
124
|
+
restoreBlockedLabel?: string;
|
|
111
125
|
}
|
|
112
126
|
/** Contexte émis avec l'event `add` : la carte parent (undefined si racine). */
|
|
113
127
|
interface DragAddEvent {
|
|
@@ -165,6 +179,13 @@ declare class DragNDropNestedListComponent {
|
|
|
165
179
|
* `undefined` => imbrication infinie (ajout possible partout). Ex. `maxDepth = 1` => 2 niveaux.
|
|
166
180
|
*/
|
|
167
181
|
readonly maxDepth: _angular_core.InputSignal<number>;
|
|
182
|
+
/**
|
|
183
|
+
* Sélection EXCLUSIVE gérée par la lib : la carte dont l'`id` vaut `selectedId` reçoit
|
|
184
|
+
* la classe `ddn-list-card-selected`. Une seule carte à la fois, à n'importe quel niveau,
|
|
185
|
+
* sans avoir à manipuler `DragItem.selected` (qui reste supporté en parallèle).
|
|
186
|
+
* Piloté par le consommateur (ex. l'id de la carte en cours d'édition ; `undefined` = aucune).
|
|
187
|
+
*/
|
|
188
|
+
readonly selectedId: _angular_core.InputSignal<string | number>;
|
|
168
189
|
readonly itemsChange: _angular_core.OutputEmitterRef<DragItem[]>;
|
|
169
190
|
readonly view: _angular_core.OutputEmitterRef<DragItem>;
|
|
170
191
|
readonly edit: _angular_core.OutputEmitterRef<DragItem>;
|
|
@@ -195,15 +216,27 @@ declare class DragNDropNestedListComponent {
|
|
|
195
216
|
canAdd(item: DragItem, depth: number): boolean;
|
|
196
217
|
/** Nombre max d'items autorisé à un niveau (`undefined` => pas de limite). */
|
|
197
218
|
levelMax(depth: number): number | undefined;
|
|
219
|
+
/**
|
|
220
|
+
* Nombre d'items pris en compte pour le plafond/compteur à un niveau.
|
|
221
|
+
* Exclut les cartes `pendingDelete` si `column.excludePendingDeleteFromMax`.
|
|
222
|
+
*/
|
|
223
|
+
countForMax(nodes: DragItem[] | undefined): number;
|
|
198
224
|
/** Vrai si le niveau `depth` a atteint son max (et qu'un max est défini). */
|
|
199
|
-
isLevelFull(
|
|
225
|
+
isLevelFull(nodes: DragItem[], depth: number): boolean;
|
|
226
|
+
/**
|
|
227
|
+
* Vrai si une carte `pendingDelete` ne peut PAS être restaurée car le niveau est plein.
|
|
228
|
+
* Ne s'applique qu'en mode `excludePendingDeleteFromMax` : restaurer ré-active la carte
|
|
229
|
+
* (+1 au décompte effectif), ce qui dépasserait le plafond déjà atteint par les autres items.
|
|
230
|
+
*/
|
|
231
|
+
isRestoreBlocked(nodes: DragItem[], depth: number): boolean;
|
|
200
232
|
/** Compteur affiché dans le titre de colonne (racine) : `6` ou `6/10` si limite racine. */
|
|
201
233
|
columnCountLabel(): string;
|
|
202
234
|
/** Visibilité d'une action (view/edit/delete) : override item → défaut colonne → true. */
|
|
203
235
|
showAction(item: DragItem, action: 'view' | 'edit' | 'delete'): boolean;
|
|
204
236
|
/**
|
|
205
237
|
* Classe(s) de la carte selon son état (posées par la lib, stylées dans le SCSS DS).
|
|
206
|
-
*
|
|
238
|
+
* Sélection → `ddn-list-card-selected` si `item.id === selectedId` (exclusif, géré par la lib)
|
|
239
|
+
* OU `item.selected === true` (flag legacy). `pendingDelete` → `ddn-list-card-deleting`.
|
|
207
240
|
*/
|
|
208
241
|
cardCssClass(item: DragItem): string;
|
|
209
242
|
/**
|
|
@@ -218,7 +251,7 @@ declare class DragNDropNestedListComponent {
|
|
|
218
251
|
private applyOrderRecursive;
|
|
219
252
|
private cloneTree;
|
|
220
253
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DragNDropNestedListComponent, 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>;
|
|
254
|
+
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; }; "selectedId": { "alias": "selectedId"; "required": false; "isSignal": true; }; }, { "itemsChange": "itemsChange"; "view": "view"; "edit": "edit"; "delete": "delete"; "restore": "restore"; "add": "add"; }, never, never, true, never>;
|
|
222
255
|
}
|
|
223
256
|
|
|
224
257
|
type ColumnType = 'text' | 'badge' | 'link' | 'actions' | 'icon' | 'image' | 'check';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cityway/bo-ui",
|
|
3
|
-
"version": "1.0.10-
|
|
3
|
+
"version": "1.0.10-beta026",
|
|
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-
|
|
12
|
+
"@cityway/basic-ui": "^1.0.2-beta031"
|
|
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: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
|
+
.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-card-preview .ddn-list-card .ddn-list-handle{cursor:grabbing}.ddn-list-handle{cursor:grab !important}.ddn-list-handle:active{cursor:grabbing}.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/_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,
|
|
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,oDAEA,uDACE,gBAKN,iBACE,uBAEA,wBACE,gBAIJ,gCACE,WCjCJ,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"}
|