@kksdev/ds-angular 1.10.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -38
- package/fesm2022/kksdev-ds-angular.mjs +389 -16
- package/fesm2022/kksdev-ds-angular.mjs.map +1 -1
- package/index.d.ts +96 -2
- package/package.json +2 -2
- package/src/styles/themes/_custom.scss +31 -0
- package/src/styles/themes/_dark.scss +19 -0
- package/src/styles/themes/_light.scss +19 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, Component, output, HostBinding, model, signal, computed, forwardRef, effect, ElementRef, ViewChildren, ViewChild, EventEmitter, inject, HostListener, ContentChild, Output, Directive, DestroyRef, Injectable, contentChildren, untracked, ChangeDetectionStrategy, viewChild, Input, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { input, Component, output, HostBinding, model, signal, computed, forwardRef, effect, ElementRef, ViewChildren, ViewChild, EventEmitter, inject, HostListener, ContentChild, Output, Directive, DestroyRef, Injectable, contentChildren, untracked, ChangeDetectionStrategy, viewChild, Input, ViewEncapsulation, isDevMode } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
4
|
import { CommonModule, DOCUMENT, NgClass, NgTemplateOutlet } from '@angular/common';
|
|
5
5
|
import * as i1$1 from '@fortawesome/angular-fontawesome';
|
|
6
6
|
import { FaIconComponent, FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
|
7
7
|
import * as i1$4 from '@angular/forms';
|
|
8
8
|
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
9
|
-
import { faInfoCircle, faTimesCircle, faExclamationTriangle, faCheckCircle, faTimes, faEye, faEyeSlash, faClose, faCircleInfo, faCircleXmark, faCircleExclamation, faCircleCheck, faChevronDown, faChevronLeft, faChevronRight, faAnglesLeft, faAnglesRight, faCheck, faSearch, faXmark, faSpinner, faCalendar, faCloudArrowUp, faFile, faFileImage, faFilePdf, faFileWord, faFileExcel, faInbox, faStar, faStarHalfStroke, faClock, faFolder, faFolderOpen, faCircle, faCircleHalfStroke, faTriangleExclamation, faMinus, faPlus, faEyeDropper, faExternalLinkAlt, faBars, faAngleLeft, faAngleRight } from '@fortawesome/free-solid-svg-icons';
|
|
9
|
+
import { faInfoCircle, faTimesCircle, faExclamationTriangle, faCheckCircle, faTimes, faEye, faEyeSlash, faClose, faCircleInfo, faCircleXmark, faCircleExclamation, faCircleCheck, faChevronDown, faChevronLeft, faChevronRight, faAnglesLeft, faAnglesRight, faCheck, faSearch, faXmark, faSpinner, faCalendar, faCloudArrowUp, faFile, faFileImage, faFilePdf, faFileWord, faFileExcel, faInbox, faStar, faStarHalfStroke, faClock, faFolder, faFolderOpen, faCircle, faCircleHalfStroke, faTriangleExclamation, faMinus, faPlus, faEyeDropper, faExternalLinkAlt, faBars, faAngleLeft, faAngleRight, faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
|
|
10
10
|
import * as i1$2 from '@angular/router';
|
|
11
11
|
import { RouterModule, Router } from '@angular/router';
|
|
12
12
|
import * as i1$3 from '@angular/cdk/overlay';
|
|
@@ -10651,6 +10651,8 @@ class DsTreeNodeComponent {
|
|
|
10651
10651
|
selectable = input(true, ...(ngDevMode ? [{ debugName: "selectable" }] : []));
|
|
10652
10652
|
checkable = input(false, ...(ngDevMode ? [{ debugName: "checkable" }] : []));
|
|
10653
10653
|
showIcon = input(true, ...(ngDevMode ? [{ debugName: "showIcon" }] : []));
|
|
10654
|
+
showLine = input(false, ...(ngDevMode ? [{ debugName: "showLine" }] : []));
|
|
10655
|
+
isLast = input(false, ...(ngDevMode ? [{ debugName: "isLast" }] : []));
|
|
10654
10656
|
selectedNodeId = input(null, ...(ngDevMode ? [{ debugName: "selectedNodeId" }] : []));
|
|
10655
10657
|
expandedNodeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "expandedNodeIds" }] : []));
|
|
10656
10658
|
checkedNodeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "checkedNodeIds" }] : []));
|
|
@@ -10730,11 +10732,13 @@ class DsTreeNodeComponent {
|
|
|
10730
10732
|
}
|
|
10731
10733
|
}
|
|
10732
10734
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
10733
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsTreeNodeComponent, isStandalone: true, selector: "ds-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, selectedNodeId: { classPropertyName: "selectedNodeId", publicName: "selectedNodeId", isSignal: true, isRequired: false, transformFunction: null }, expandedNodeIds: { classPropertyName: "expandedNodeIds", publicName: "expandedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, checkedNodeIds: { classPropertyName: "checkedNodeIds", publicName: "checkedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, getIndeterminateState: { classPropertyName: "getIndeterminateState", publicName: "getIndeterminateState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick", nodeToggle: "nodeToggle", nodeCheck: "nodeCheck" }, ngImport: i0, template: `
|
|
10735
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsTreeNodeComponent, isStandalone: true, selector: "ds-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, showLine: { classPropertyName: "showLine", publicName: "showLine", isSignal: true, isRequired: false, transformFunction: null }, isLast: { classPropertyName: "isLast", publicName: "isLast", isSignal: true, isRequired: false, transformFunction: null }, selectedNodeId: { classPropertyName: "selectedNodeId", publicName: "selectedNodeId", isSignal: true, isRequired: false, transformFunction: null }, expandedNodeIds: { classPropertyName: "expandedNodeIds", publicName: "expandedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, checkedNodeIds: { classPropertyName: "checkedNodeIds", publicName: "checkedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, getIndeterminateState: { classPropertyName: "getIndeterminateState", publicName: "getIndeterminateState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick", nodeToggle: "nodeToggle", nodeCheck: "nodeCheck" }, ngImport: i0, template: `
|
|
10734
10736
|
<div
|
|
10735
10737
|
class="ds-tree-node"
|
|
10736
10738
|
[class.ds-tree-node--selected]="isSelected()"
|
|
10737
10739
|
[class.ds-tree-node--disabled]="node().disabled"
|
|
10740
|
+
[class.ds-tree-node--with-line]="showLine()"
|
|
10741
|
+
[class.ds-tree-node--last]="isLast()"
|
|
10738
10742
|
[attr.role]="'treeitem'"
|
|
10739
10743
|
[attr.aria-selected]="isSelected()"
|
|
10740
10744
|
[attr.aria-expanded]="hasChildren() ? isExpanded() : null"
|
|
@@ -10747,6 +10751,11 @@ class DsTreeNodeComponent {
|
|
|
10747
10751
|
(keydown.arrowLeft)="handleArrowLeft($event)">
|
|
10748
10752
|
|
|
10749
10753
|
<div class="ds-tree-node__content" [style.padding-left.px]="level() * 20">
|
|
10754
|
+
<!-- Ligne horizontale (si showLine et niveau > 0) -->
|
|
10755
|
+
@if (showLine() && level() > 0) {
|
|
10756
|
+
<span class="ds-tree-node__line-horizontal"></span>
|
|
10757
|
+
}
|
|
10758
|
+
|
|
10750
10759
|
<!-- Expand/collapse toggle -->
|
|
10751
10760
|
@if (hasChildren()) {
|
|
10752
10761
|
<button
|
|
@@ -10791,14 +10800,16 @@ class DsTreeNodeComponent {
|
|
|
10791
10800
|
|
|
10792
10801
|
<!-- Children (recursive) -->
|
|
10793
10802
|
@if (hasChildren() && isExpanded()) {
|
|
10794
|
-
<div class="ds-tree-node__children" role="group">
|
|
10795
|
-
@for (child of node().children; track child.id) {
|
|
10803
|
+
<div class="ds-tree-node__children" [class.ds-tree-node__children--with-line]="showLine()" role="group">
|
|
10804
|
+
@for (child of node().children; track child.id; let last = $last) {
|
|
10796
10805
|
<ds-tree-node
|
|
10797
10806
|
[node]="child"
|
|
10798
10807
|
[level]="level() + 1"
|
|
10799
10808
|
[selectable]="selectable()"
|
|
10800
10809
|
[checkable]="checkable()"
|
|
10801
10810
|
[showIcon]="showIcon()"
|
|
10811
|
+
[showLine]="showLine()"
|
|
10812
|
+
[isLast]="last"
|
|
10802
10813
|
[selectedNodeId]="selectedNodeId()"
|
|
10803
10814
|
[expandedNodeIds]="expandedNodeIds()"
|
|
10804
10815
|
[checkedNodeIds]="checkedNodeIds()"
|
|
@@ -10810,7 +10821,7 @@ class DsTreeNodeComponent {
|
|
|
10810
10821
|
}
|
|
10811
10822
|
</div>
|
|
10812
10823
|
}
|
|
10813
|
-
`, isInline: true, styles: [".ds-tree-node{display:block;cursor:pointer;outline:none}.ds-tree-node__content{display:flex;align-items:center;gap:var(--space-2);padding:var(--tree-node-padding, var(--space-1, .25rem) var(--space-2, .5rem));border-radius:var(--radius-1);transition:background-color .15s ease;-webkit-user-select:none;user-select:none}.ds-tree-node__content:hover:not(.ds-tree-node--disabled .ds-tree-node__content){background-color:var(--tree-node-hover-bg, var(--gray-100))}.ds-tree-node:focus-visible .ds-tree-node__content{box-shadow:0 0 0 2px var(--color-primary)}.ds-tree-node--selected .ds-tree-node__content{background-color:var(--tree-node-selected-bg, var(--blue-100));color:var(--tree-node-selected-text, var(--color-primary))}.ds-tree-node--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:transparent;border:none;cursor:pointer;padding:0;color:var(--tree-toggle-color, var(--gray-600));transition:transform .2s ease;outline:none}.ds-tree-node__toggle:hover{color:var(--tree-toggle-hover-color, var(--gray-900))}.ds-tree-node__toggle:focus-visible{box-shadow:0 0 0 2px var(--color-primary);border-radius:var(--radius-1)}.ds-tree-node__toggle fa-icon{font-size:12px}.ds-tree-node__toggle-placeholder{display:inline-block;width:20px;height:20px}.ds-tree-node__checkbox{margin:0;cursor:pointer}.ds-tree-node__checkbox:disabled{cursor:not-allowed}.ds-tree-node__icon{color:var(--tree-icon-color, var(--gray-600));font-size:var(--tree-icon-size, 16px);flex-shrink:0}.ds-tree-node__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--tree-label-font-size, var(--font-size-base))}.ds-tree-node__children{margin-left:0}\n"], dependencies: [{ kind: "component", type: DsTreeNodeComponent, selector: "ds-tree-node", inputs: ["node", "level", "selectable", "checkable", "showIcon", "selectedNodeId", "expandedNodeIds", "checkedNodeIds", "getIndeterminateState"], outputs: ["nodeClick", "nodeToggle", "nodeCheck"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
10824
|
+
`, isInline: true, styles: [".ds-tree-node{display:block;cursor:pointer;outline:none}.ds-tree-node__content{display:flex;align-items:center;gap:var(--space-2);padding:var(--tree-node-padding, var(--space-1, .25rem) var(--space-2, .5rem));border-radius:var(--radius-1);transition:background-color .15s ease;-webkit-user-select:none;user-select:none}.ds-tree-node__content:hover:not(.ds-tree-node--disabled .ds-tree-node__content){background-color:var(--tree-node-hover-bg, var(--gray-100))}.ds-tree-node:focus-visible .ds-tree-node__content{box-shadow:0 0 0 2px var(--color-primary)}.ds-tree-node--selected .ds-tree-node__content{background-color:var(--tree-node-selected-bg, var(--blue-100));color:var(--tree-node-selected-text, var(--color-primary))}.ds-tree-node--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:transparent;border:none;cursor:pointer;padding:0;color:var(--tree-toggle-color, var(--gray-600));transition:transform .2s ease;outline:none}.ds-tree-node__toggle:hover{color:var(--tree-toggle-hover-color, var(--gray-900))}.ds-tree-node__toggle:focus-visible{box-shadow:0 0 0 2px var(--color-primary);border-radius:var(--radius-1)}.ds-tree-node__toggle fa-icon{font-size:12px}.ds-tree-node__toggle-placeholder{display:inline-block;width:20px;height:20px}.ds-tree-node__checkbox{margin:0;cursor:pointer}.ds-tree-node__checkbox:disabled{cursor:not-allowed}.ds-tree-node__icon{color:var(--tree-icon-color, var(--gray-600));font-size:var(--tree-icon-size, 16px);flex-shrink:0}.ds-tree-node__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--tree-label-font-size, var(--font-size-base))}.ds-tree-node__children{margin-left:0}.ds-tree-node__children--with-line{position:relative;margin-left:var(--tree-indent, 20px)}.ds-tree-node--with-line,.ds-tree-node--with-line .ds-tree-node__content{position:relative}.ds-tree-node--with-line .ds-tree-node__line-horizontal{position:absolute;left:calc(var(--tree-indent, 20px) * -1);top:50%;transform:translateY(-50%);width:12px;height:var(--tree-line-width, 1px);background-color:var(--tree-line-color, var(--gray-300))}.ds-tree-node--with-line:before{content:\"\";position:absolute;left:calc(var(--tree-indent, 20px) * -1);top:0;bottom:0;width:var(--tree-line-width, 1px);background-color:var(--tree-line-color, var(--gray-300))}.ds-tree-node--with-line.ds-tree-node--last:before{bottom:auto;height:50%}.ds-tree-node--with-line:not(.ds-tree-node__children--with-line>.ds-tree-node):before{display:none}\n"], dependencies: [{ kind: "component", type: DsTreeNodeComponent, selector: "ds-tree-node", inputs: ["node", "level", "selectable", "checkable", "showIcon", "showLine", "isLast", "selectedNodeId", "expandedNodeIds", "checkedNodeIds", "getIndeterminateState"], outputs: ["nodeClick", "nodeToggle", "nodeCheck"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
10814
10825
|
}
|
|
10815
10826
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTreeNodeComponent, decorators: [{
|
|
10816
10827
|
type: Component,
|
|
@@ -10819,6 +10830,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
10819
10830
|
class="ds-tree-node"
|
|
10820
10831
|
[class.ds-tree-node--selected]="isSelected()"
|
|
10821
10832
|
[class.ds-tree-node--disabled]="node().disabled"
|
|
10833
|
+
[class.ds-tree-node--with-line]="showLine()"
|
|
10834
|
+
[class.ds-tree-node--last]="isLast()"
|
|
10822
10835
|
[attr.role]="'treeitem'"
|
|
10823
10836
|
[attr.aria-selected]="isSelected()"
|
|
10824
10837
|
[attr.aria-expanded]="hasChildren() ? isExpanded() : null"
|
|
@@ -10831,6 +10844,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
10831
10844
|
(keydown.arrowLeft)="handleArrowLeft($event)">
|
|
10832
10845
|
|
|
10833
10846
|
<div class="ds-tree-node__content" [style.padding-left.px]="level() * 20">
|
|
10847
|
+
<!-- Ligne horizontale (si showLine et niveau > 0) -->
|
|
10848
|
+
@if (showLine() && level() > 0) {
|
|
10849
|
+
<span class="ds-tree-node__line-horizontal"></span>
|
|
10850
|
+
}
|
|
10851
|
+
|
|
10834
10852
|
<!-- Expand/collapse toggle -->
|
|
10835
10853
|
@if (hasChildren()) {
|
|
10836
10854
|
<button
|
|
@@ -10875,14 +10893,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
10875
10893
|
|
|
10876
10894
|
<!-- Children (recursive) -->
|
|
10877
10895
|
@if (hasChildren() && isExpanded()) {
|
|
10878
|
-
<div class="ds-tree-node__children" role="group">
|
|
10879
|
-
@for (child of node().children; track child.id) {
|
|
10896
|
+
<div class="ds-tree-node__children" [class.ds-tree-node__children--with-line]="showLine()" role="group">
|
|
10897
|
+
@for (child of node().children; track child.id; let last = $last) {
|
|
10880
10898
|
<ds-tree-node
|
|
10881
10899
|
[node]="child"
|
|
10882
10900
|
[level]="level() + 1"
|
|
10883
10901
|
[selectable]="selectable()"
|
|
10884
10902
|
[checkable]="checkable()"
|
|
10885
10903
|
[showIcon]="showIcon()"
|
|
10904
|
+
[showLine]="showLine()"
|
|
10905
|
+
[isLast]="last"
|
|
10886
10906
|
[selectedNodeId]="selectedNodeId()"
|
|
10887
10907
|
[expandedNodeIds]="expandedNodeIds()"
|
|
10888
10908
|
[checkedNodeIds]="checkedNodeIds()"
|
|
@@ -10894,8 +10914,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
10894
10914
|
}
|
|
10895
10915
|
</div>
|
|
10896
10916
|
}
|
|
10897
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ds-tree-node{display:block;cursor:pointer;outline:none}.ds-tree-node__content{display:flex;align-items:center;gap:var(--space-2);padding:var(--tree-node-padding, var(--space-1, .25rem) var(--space-2, .5rem));border-radius:var(--radius-1);transition:background-color .15s ease;-webkit-user-select:none;user-select:none}.ds-tree-node__content:hover:not(.ds-tree-node--disabled .ds-tree-node__content){background-color:var(--tree-node-hover-bg, var(--gray-100))}.ds-tree-node:focus-visible .ds-tree-node__content{box-shadow:0 0 0 2px var(--color-primary)}.ds-tree-node--selected .ds-tree-node__content{background-color:var(--tree-node-selected-bg, var(--blue-100));color:var(--tree-node-selected-text, var(--color-primary))}.ds-tree-node--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:transparent;border:none;cursor:pointer;padding:0;color:var(--tree-toggle-color, var(--gray-600));transition:transform .2s ease;outline:none}.ds-tree-node__toggle:hover{color:var(--tree-toggle-hover-color, var(--gray-900))}.ds-tree-node__toggle:focus-visible{box-shadow:0 0 0 2px var(--color-primary);border-radius:var(--radius-1)}.ds-tree-node__toggle fa-icon{font-size:12px}.ds-tree-node__toggle-placeholder{display:inline-block;width:20px;height:20px}.ds-tree-node__checkbox{margin:0;cursor:pointer}.ds-tree-node__checkbox:disabled{cursor:not-allowed}.ds-tree-node__icon{color:var(--tree-icon-color, var(--gray-600));font-size:var(--tree-icon-size, 16px);flex-shrink:0}.ds-tree-node__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--tree-label-font-size, var(--font-size-base))}.ds-tree-node__children{margin-left:0}\n"] }]
|
|
10898
|
-
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], checkable: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkable", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], selectedNodeId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedNodeId", required: false }] }], expandedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedNodeIds", required: false }] }], checkedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkedNodeIds", required: false }] }], getIndeterminateState: [{ type: i0.Input, args: [{ isSignal: true, alias: "getIndeterminateState", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeToggle: [{ type: i0.Output, args: ["nodeToggle"] }], nodeCheck: [{ type: i0.Output, args: ["nodeCheck"] }] } });
|
|
10917
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ds-tree-node{display:block;cursor:pointer;outline:none}.ds-tree-node__content{display:flex;align-items:center;gap:var(--space-2);padding:var(--tree-node-padding, var(--space-1, .25rem) var(--space-2, .5rem));border-radius:var(--radius-1);transition:background-color .15s ease;-webkit-user-select:none;user-select:none}.ds-tree-node__content:hover:not(.ds-tree-node--disabled .ds-tree-node__content){background-color:var(--tree-node-hover-bg, var(--gray-100))}.ds-tree-node:focus-visible .ds-tree-node__content{box-shadow:0 0 0 2px var(--color-primary)}.ds-tree-node--selected .ds-tree-node__content{background-color:var(--tree-node-selected-bg, var(--blue-100));color:var(--tree-node-selected-text, var(--color-primary))}.ds-tree-node--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:transparent;border:none;cursor:pointer;padding:0;color:var(--tree-toggle-color, var(--gray-600));transition:transform .2s ease;outline:none}.ds-tree-node__toggle:hover{color:var(--tree-toggle-hover-color, var(--gray-900))}.ds-tree-node__toggle:focus-visible{box-shadow:0 0 0 2px var(--color-primary);border-radius:var(--radius-1)}.ds-tree-node__toggle fa-icon{font-size:12px}.ds-tree-node__toggle-placeholder{display:inline-block;width:20px;height:20px}.ds-tree-node__checkbox{margin:0;cursor:pointer}.ds-tree-node__checkbox:disabled{cursor:not-allowed}.ds-tree-node__icon{color:var(--tree-icon-color, var(--gray-600));font-size:var(--tree-icon-size, 16px);flex-shrink:0}.ds-tree-node__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--tree-label-font-size, var(--font-size-base))}.ds-tree-node__children{margin-left:0}.ds-tree-node__children--with-line{position:relative;margin-left:var(--tree-indent, 20px)}.ds-tree-node--with-line,.ds-tree-node--with-line .ds-tree-node__content{position:relative}.ds-tree-node--with-line .ds-tree-node__line-horizontal{position:absolute;left:calc(var(--tree-indent, 20px) * -1);top:50%;transform:translateY(-50%);width:12px;height:var(--tree-line-width, 1px);background-color:var(--tree-line-color, var(--gray-300))}.ds-tree-node--with-line:before{content:\"\";position:absolute;left:calc(var(--tree-indent, 20px) * -1);top:0;bottom:0;width:var(--tree-line-width, 1px);background-color:var(--tree-line-color, var(--gray-300))}.ds-tree-node--with-line.ds-tree-node--last:before{bottom:auto;height:50%}.ds-tree-node--with-line:not(.ds-tree-node__children--with-line>.ds-tree-node):before{display:none}\n"] }]
|
|
10918
|
+
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], checkable: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkable", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], showLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLine", required: false }] }], isLast: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLast", required: false }] }], selectedNodeId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedNodeId", required: false }] }], expandedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedNodeIds", required: false }] }], checkedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkedNodeIds", required: false }] }], getIndeterminateState: [{ type: i0.Input, args: [{ isSignal: true, alias: "getIndeterminateState", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeToggle: [{ type: i0.Output, args: ["nodeToggle"] }], nodeCheck: [{ type: i0.Output, args: ["nodeCheck"] }] } });
|
|
10899
10919
|
|
|
10900
10920
|
/**
|
|
10901
10921
|
* DsTree - Composant d'affichage hiérarchique
|
|
@@ -11069,11 +11089,11 @@ class DsTree {
|
|
|
11069
11089
|
this.expandedNodeIds.set(expandedIds);
|
|
11070
11090
|
}
|
|
11071
11091
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTree, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
11072
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsTree, isStandalone: true, selector: "ds-tree", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, expandAll: { classPropertyName: "expandAll", publicName: "expandAll", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, showLine: { classPropertyName: "showLine", publicName: "showLine", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, loadChildren: { classPropertyName: "loadChildren", publicName: "loadChildren", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeSelect: "nodeSelect", nodeExpand: "nodeExpand", nodeCheck: "nodeCheck" }, ngImport: i0, template: "<div [class]=\"containerClasses()\" role=\"tree\">\n @if (processedData().length === 0) {\n <div class=\"ds-tree__empty\">\n <p>No data available</p>\n </div>\n } @else {\n @for (node of processedData(); track node.id) {\n <ds-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [selectable]=\"selectable()\"\n [checkable]=\"checkable()\"\n [showIcon]=\"showIcon()\"\n [selectedNodeId]=\"selectedNodeId()\"\n [expandedNodeIds]=\"expandedNodeIds()\"\n [checkedNodeIds]=\"checkedNodeIds()\"\n [getIndeterminateState]=\"getIndeterminateState.bind(this)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeToggle)=\"onNodeToggle($event)\"\n (nodeCheck)=\"onNodeCheck($event.node, $event.checked)\">\n </ds-tree-node>\n }\n }\n</div>\n", styles: [".ds-tree{display:block;width:100%;background-color:var(--tree-bg, var(--white));border:1px solid var(--tree-border, var(--gray-300));border-radius:var(--radius-2);padding:var(--space-2);max-height:400px;overflow-y:auto}.ds-tree__empty{display:flex;align-items:center;justify-content:center;padding:var(--space-8);color:var(--text-muted, var(--gray-500));font-size:var(--font-size-sm)}.ds-tree--sm{font-size:var(--font-size-sm);padding:var(--space-1)}.ds-tree--lg{font-size:var(--font-size-lg);padding:var(--space-3)}.ds-tree::-webkit-scrollbar{width:8px}.ds-tree::-webkit-scrollbar-track{background:var(--gray-100);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb{background:var(--gray-400);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb:hover{background:var(--gray-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsTreeNodeComponent, selector: "ds-tree-node", inputs: ["node", "level", "selectable", "checkable", "showIcon", "selectedNodeId", "expandedNodeIds", "checkedNodeIds", "getIndeterminateState"], outputs: ["nodeClick", "nodeToggle", "nodeCheck"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
11092
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsTree, isStandalone: true, selector: "ds-tree", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, expandAll: { classPropertyName: "expandAll", publicName: "expandAll", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, showLine: { classPropertyName: "showLine", publicName: "showLine", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, loadChildren: { classPropertyName: "loadChildren", publicName: "loadChildren", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeSelect: "nodeSelect", nodeExpand: "nodeExpand", nodeCheck: "nodeCheck" }, ngImport: i0, template: "<div [class]=\"containerClasses()\" role=\"tree\">\n @if (processedData().length === 0) {\n <div class=\"ds-tree__empty\">\n <p>No data available</p>\n </div>\n } @else {\n @for (node of processedData(); track node.id; let last = $last) {\n <ds-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [selectable]=\"selectable()\"\n [checkable]=\"checkable()\"\n [showIcon]=\"showIcon()\"\n [showLine]=\"showLine()\"\n [isLast]=\"last\"\n [selectedNodeId]=\"selectedNodeId()\"\n [expandedNodeIds]=\"expandedNodeIds()\"\n [checkedNodeIds]=\"checkedNodeIds()\"\n [getIndeterminateState]=\"getIndeterminateState.bind(this)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeToggle)=\"onNodeToggle($event)\"\n (nodeCheck)=\"onNodeCheck($event.node, $event.checked)\">\n </ds-tree-node>\n }\n }\n</div>\n", styles: [".ds-tree{display:block;width:100%;background-color:var(--tree-bg, var(--white));border:1px solid var(--tree-border, var(--gray-300));border-radius:var(--radius-2);padding:var(--space-2);max-height:400px;overflow-y:auto}.ds-tree__empty{display:flex;align-items:center;justify-content:center;padding:var(--space-8);color:var(--text-muted, var(--gray-500));font-size:var(--font-size-sm)}.ds-tree--sm{font-size:var(--font-size-sm);padding:var(--space-1)}.ds-tree--lg{font-size:var(--font-size-lg);padding:var(--space-3)}.ds-tree::-webkit-scrollbar{width:8px}.ds-tree::-webkit-scrollbar-track{background:var(--gray-100);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb{background:var(--gray-400);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb:hover{background:var(--gray-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsTreeNodeComponent, selector: "ds-tree-node", inputs: ["node", "level", "selectable", "checkable", "showIcon", "showLine", "isLast", "selectedNodeId", "expandedNodeIds", "checkedNodeIds", "getIndeterminateState"], outputs: ["nodeClick", "nodeToggle", "nodeCheck"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
11073
11093
|
}
|
|
11074
11094
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTree, decorators: [{
|
|
11075
11095
|
type: Component,
|
|
11076
|
-
args: [{ selector: 'ds-tree', standalone: true, imports: [CommonModule, DsTreeNodeComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"containerClasses()\" role=\"tree\">\n @if (processedData().length === 0) {\n <div class=\"ds-tree__empty\">\n <p>No data available</p>\n </div>\n } @else {\n @for (node of processedData(); track node.id) {\n <ds-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [selectable]=\"selectable()\"\n [checkable]=\"checkable()\"\n [showIcon]=\"showIcon()\"\n [selectedNodeId]=\"selectedNodeId()\"\n [expandedNodeIds]=\"expandedNodeIds()\"\n [checkedNodeIds]=\"checkedNodeIds()\"\n [getIndeterminateState]=\"getIndeterminateState.bind(this)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeToggle)=\"onNodeToggle($event)\"\n (nodeCheck)=\"onNodeCheck($event.node, $event.checked)\">\n </ds-tree-node>\n }\n }\n</div>\n", styles: [".ds-tree{display:block;width:100%;background-color:var(--tree-bg, var(--white));border:1px solid var(--tree-border, var(--gray-300));border-radius:var(--radius-2);padding:var(--space-2);max-height:400px;overflow-y:auto}.ds-tree__empty{display:flex;align-items:center;justify-content:center;padding:var(--space-8);color:var(--text-muted, var(--gray-500));font-size:var(--font-size-sm)}.ds-tree--sm{font-size:var(--font-size-sm);padding:var(--space-1)}.ds-tree--lg{font-size:var(--font-size-lg);padding:var(--space-3)}.ds-tree::-webkit-scrollbar{width:8px}.ds-tree::-webkit-scrollbar-track{background:var(--gray-100);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb{background:var(--gray-400);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb:hover{background:var(--gray-500)}\n"] }]
|
|
11096
|
+
args: [{ selector: 'ds-tree', standalone: true, imports: [CommonModule, DsTreeNodeComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"containerClasses()\" role=\"tree\">\n @if (processedData().length === 0) {\n <div class=\"ds-tree__empty\">\n <p>No data available</p>\n </div>\n } @else {\n @for (node of processedData(); track node.id; let last = $last) {\n <ds-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [selectable]=\"selectable()\"\n [checkable]=\"checkable()\"\n [showIcon]=\"showIcon()\"\n [showLine]=\"showLine()\"\n [isLast]=\"last\"\n [selectedNodeId]=\"selectedNodeId()\"\n [expandedNodeIds]=\"expandedNodeIds()\"\n [checkedNodeIds]=\"checkedNodeIds()\"\n [getIndeterminateState]=\"getIndeterminateState.bind(this)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeToggle)=\"onNodeToggle($event)\"\n (nodeCheck)=\"onNodeCheck($event.node, $event.checked)\">\n </ds-tree-node>\n }\n }\n</div>\n", styles: [".ds-tree{display:block;width:100%;background-color:var(--tree-bg, var(--white));border:1px solid var(--tree-border, var(--gray-300));border-radius:var(--radius-2);padding:var(--space-2);max-height:400px;overflow-y:auto}.ds-tree__empty{display:flex;align-items:center;justify-content:center;padding:var(--space-8);color:var(--text-muted, var(--gray-500));font-size:var(--font-size-sm)}.ds-tree--sm{font-size:var(--font-size-sm);padding:var(--space-1)}.ds-tree--lg{font-size:var(--font-size-lg);padding:var(--space-3)}.ds-tree::-webkit-scrollbar{width:8px}.ds-tree::-webkit-scrollbar-track{background:var(--gray-100);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb{background:var(--gray-400);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb:hover{background:var(--gray-500)}\n"] }]
|
|
11077
11097
|
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], checkable: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkable", required: false }] }], expandAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandAll", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], showLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLine", required: false }] }], draggable: [{ type: i0.Input, args: [{ isSignal: true, alias: "draggable", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], loadChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadChildren", required: false }] }], nodeSelect: [{ type: i0.Output, args: ["nodeSelect"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }], nodeCheck: [{ type: i0.Output, args: ["nodeCheck"] }] } });
|
|
11078
11098
|
|
|
11079
11099
|
/**
|
|
@@ -14439,7 +14459,7 @@ class DsSidebarItemComponent {
|
|
|
14439
14459
|
}
|
|
14440
14460
|
</div>
|
|
14441
14461
|
}
|
|
14442
|
-
`, isInline: true, styles: [":host{display:block}.ds-sidebar-item{display:flex;align-items:center;gap:var(--space-2, .5rem);min-height:var(--sidebar-item-height, 44px);padding:var(--sidebar-item-padding, .5rem 1rem);border-radius:var(--sidebar-item-radius, 6px);cursor:pointer;color:var(--sidebar-text, inherit);text-decoration:none;transition:background-color .15s ease,color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.ds-sidebar-item:hover:not(.ds-sidebar-item--disabled){background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-item--active{background:var(--sidebar-item-active-bg, rgba(59, 130, 246, .1));color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--active .ds-sidebar-item__icon{color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-item--collapsed-mode{justify-content:center;padding:var(--space-2, .5rem);gap:0}.ds-sidebar-item--collapsed-mode .ds-sidebar-item__icon{margin:0}.ds-sidebar-item__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;flex-shrink:0;transition:transform .2s ease}.ds-sidebar-item__toggle:hover{color:var(--color-primary, #3b82f6)}.ds-sidebar-item__toggle-placeholder{width:20px;flex-shrink:0}.ds-sidebar-item__icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);color:var(--sidebar-icon-color, currentColor);opacity:.8}.ds-sidebar-item__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:inherit;font-size:var(--font-size-sm, .875rem);line-height:1.4}.ds-sidebar-item__label--router-active{font-weight:600}.ds-sidebar-item__external-icon{margin-left:var(--space-1, .25rem);font-size:.75em;opacity:.6}.ds-sidebar-item__badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-item__badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-item__badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-item__badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-item__badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-item__badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-item__badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-item__divider{height:1px;margin:var(--space-2, .5rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-popover{background:var(--popover-bg, var(--sidebar-bg, #ffffff));border:1px solid var(--popover-border, var(--sidebar-border, #e5e7eb));border-radius:var(--popover-radius, 8px);box-shadow:var(--popover-shadow, var(--shadow-2, 0 4px 6px -1px rgba(0, 0, 0, .1)));min-width:200px;max-width:280px;overflow:hidden;animation:popoverSlideIn .15s ease-out}
|
|
14462
|
+
`, isInline: true, styles: [":host{display:block}.ds-sidebar-item{display:flex;align-items:center;gap:var(--space-2, .5rem);min-height:var(--sidebar-item-height, 44px);padding:var(--sidebar-item-padding, .5rem 1rem);border-radius:var(--sidebar-item-radius, 6px);cursor:pointer;color:var(--sidebar-text, inherit);text-decoration:none;transition:background-color .15s ease,color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.ds-sidebar-item:hover:not(.ds-sidebar-item--disabled){background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-item--active{background:var(--sidebar-item-active-bg, rgba(59, 130, 246, .1));color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--active .ds-sidebar-item__icon{color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-item--collapsed-mode{justify-content:center;padding:var(--space-2, .5rem);gap:0}.ds-sidebar-item--collapsed-mode .ds-sidebar-item__icon{margin:0}.ds-sidebar-item--popover-open{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;flex-shrink:0;transition:transform .2s ease}.ds-sidebar-item__toggle:hover{color:var(--color-primary, #3b82f6)}.ds-sidebar-item__toggle-placeholder{width:20px;flex-shrink:0}.ds-sidebar-item__icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);color:var(--sidebar-icon-color, currentColor);opacity:.8}.ds-sidebar-item__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:inherit;font-size:var(--font-size-sm, .875rem);line-height:1.4}.ds-sidebar-item__label--router-active{font-weight:600}.ds-sidebar-item__external-icon{margin-left:var(--space-1, .25rem);font-size:.75em;opacity:.6}.ds-sidebar-item__badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-item__badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-item__badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-item__badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-item__badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-item__badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-item__badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-item__divider{height:1px;margin:var(--space-2, .5rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-popover{background:var(--popover-bg, var(--sidebar-bg, #ffffff));border:1px solid var(--popover-border, var(--sidebar-border, #e5e7eb));border-radius:var(--popover-radius, 8px);box-shadow:var(--popover-shadow, var(--shadow-2, 0 4px 6px -1px rgba(0, 0, 0, .1)));min-width:200px;max-width:280px;overflow:hidden;animation:popoverSlideIn .15s ease-out}.ds-sidebar-popover__header{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-3, .75rem) var(--space-4, 1rem);background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .03));border-bottom:1px solid var(--sidebar-border, rgba(0, 0, 0, .1));font-weight:600;font-size:var(--font-size-sm, .875rem);color:var(--sidebar-text, inherit)}.ds-sidebar-popover__header-icon{font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__header-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__body{padding:var(--space-1, .25rem) 0;max-height:300px;overflow-y:auto}.ds-sidebar-popover__item{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem) var(--space-4, 1rem);cursor:pointer;color:var(--sidebar-text, inherit);transition:background-color .15s ease;outline:none;font-size:var(--font-size-sm, .875rem)}.ds-sidebar-popover__item:hover,.ds-sidebar-popover__item--active{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-popover__item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-popover__item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-popover__item-icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__item-badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-popover__item-badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-popover__item-badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-popover__item-badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-popover__item-badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-popover__item-badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-popover__item-badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-popover__item-chevron{font-size:.75rem;opacity:.5;flex-shrink:0}.ds-sidebar-popover__divider{height:1px;margin:var(--space-1, .25rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}@keyframes popoverSlideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "component", type: DsSidebarItemComponent, selector: "ds-sidebar-item", inputs: ["item", "level", "mode", "showTooltip", "expandedItemIds", "activeItemId", "sidebarPosition", "collapsedTrigger"], outputs: ["itemClick", "itemToggle", "itemKeydown"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "directive", type: DsTooltip, selector: "[dsTooltip]", inputs: ["dsTooltip"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
14443
14463
|
}
|
|
14444
14464
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsSidebarItemComponent, decorators: [{
|
|
14445
14465
|
type: Component,
|
|
@@ -14624,7 +14644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
14624
14644
|
}
|
|
14625
14645
|
</div>
|
|
14626
14646
|
}
|
|
14627
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.ds-sidebar-item{display:flex;align-items:center;gap:var(--space-2, .5rem);min-height:var(--sidebar-item-height, 44px);padding:var(--sidebar-item-padding, .5rem 1rem);border-radius:var(--sidebar-item-radius, 6px);cursor:pointer;color:var(--sidebar-text, inherit);text-decoration:none;transition:background-color .15s ease,color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.ds-sidebar-item:hover:not(.ds-sidebar-item--disabled){background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-item--active{background:var(--sidebar-item-active-bg, rgba(59, 130, 246, .1));color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--active .ds-sidebar-item__icon{color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-item--collapsed-mode{justify-content:center;padding:var(--space-2, .5rem);gap:0}.ds-sidebar-item--collapsed-mode .ds-sidebar-item__icon{margin:0}.ds-sidebar-item__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;flex-shrink:0;transition:transform .2s ease}.ds-sidebar-item__toggle:hover{color:var(--color-primary, #3b82f6)}.ds-sidebar-item__toggle-placeholder{width:20px;flex-shrink:0}.ds-sidebar-item__icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);color:var(--sidebar-icon-color, currentColor);opacity:.8}.ds-sidebar-item__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:inherit;font-size:var(--font-size-sm, .875rem);line-height:1.4}.ds-sidebar-item__label--router-active{font-weight:600}.ds-sidebar-item__external-icon{margin-left:var(--space-1, .25rem);font-size:.75em;opacity:.6}.ds-sidebar-item__badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-item__badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-item__badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-item__badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-item__badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-item__badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-item__badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-item__divider{height:1px;margin:var(--space-2, .5rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-popover{background:var(--popover-bg, var(--sidebar-bg, #ffffff));border:1px solid var(--popover-border, var(--sidebar-border, #e5e7eb));border-radius:var(--popover-radius, 8px);box-shadow:var(--popover-shadow, var(--shadow-2, 0 4px 6px -1px rgba(0, 0, 0, .1)));min-width:200px;max-width:280px;overflow:hidden;animation:popoverSlideIn .15s ease-out}
|
|
14647
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.ds-sidebar-item{display:flex;align-items:center;gap:var(--space-2, .5rem);min-height:var(--sidebar-item-height, 44px);padding:var(--sidebar-item-padding, .5rem 1rem);border-radius:var(--sidebar-item-radius, 6px);cursor:pointer;color:var(--sidebar-text, inherit);text-decoration:none;transition:background-color .15s ease,color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.ds-sidebar-item:hover:not(.ds-sidebar-item--disabled){background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-item--active{background:var(--sidebar-item-active-bg, rgba(59, 130, 246, .1));color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--active .ds-sidebar-item__icon{color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-item--collapsed-mode{justify-content:center;padding:var(--space-2, .5rem);gap:0}.ds-sidebar-item--collapsed-mode .ds-sidebar-item__icon{margin:0}.ds-sidebar-item--popover-open{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;flex-shrink:0;transition:transform .2s ease}.ds-sidebar-item__toggle:hover{color:var(--color-primary, #3b82f6)}.ds-sidebar-item__toggle-placeholder{width:20px;flex-shrink:0}.ds-sidebar-item__icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);color:var(--sidebar-icon-color, currentColor);opacity:.8}.ds-sidebar-item__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:inherit;font-size:var(--font-size-sm, .875rem);line-height:1.4}.ds-sidebar-item__label--router-active{font-weight:600}.ds-sidebar-item__external-icon{margin-left:var(--space-1, .25rem);font-size:.75em;opacity:.6}.ds-sidebar-item__badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-item__badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-item__badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-item__badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-item__badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-item__badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-item__badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-item__divider{height:1px;margin:var(--space-2, .5rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-popover{background:var(--popover-bg, var(--sidebar-bg, #ffffff));border:1px solid var(--popover-border, var(--sidebar-border, #e5e7eb));border-radius:var(--popover-radius, 8px);box-shadow:var(--popover-shadow, var(--shadow-2, 0 4px 6px -1px rgba(0, 0, 0, .1)));min-width:200px;max-width:280px;overflow:hidden;animation:popoverSlideIn .15s ease-out}.ds-sidebar-popover__header{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-3, .75rem) var(--space-4, 1rem);background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .03));border-bottom:1px solid var(--sidebar-border, rgba(0, 0, 0, .1));font-weight:600;font-size:var(--font-size-sm, .875rem);color:var(--sidebar-text, inherit)}.ds-sidebar-popover__header-icon{font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__header-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__body{padding:var(--space-1, .25rem) 0;max-height:300px;overflow-y:auto}.ds-sidebar-popover__item{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem) var(--space-4, 1rem);cursor:pointer;color:var(--sidebar-text, inherit);transition:background-color .15s ease;outline:none;font-size:var(--font-size-sm, .875rem)}.ds-sidebar-popover__item:hover,.ds-sidebar-popover__item--active{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-popover__item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-popover__item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-popover__item-icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__item-badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-popover__item-badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-popover__item-badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-popover__item-badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-popover__item-badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-popover__item-badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-popover__item-badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-popover__item-chevron{font-size:.75rem;opacity:.5;flex-shrink:0}.ds-sidebar-popover__divider{height:1px;margin:var(--space-1, .25rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}@keyframes popoverSlideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}\n"] }]
|
|
14628
14648
|
}], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], showTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTooltip", required: false }] }], expandedItemIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedItemIds", required: false }] }], activeItemId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeItemId", required: false }] }], sidebarPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarPosition", required: false }] }], collapsedTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedTrigger", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], itemToggle: [{ type: i0.Output, args: ["itemToggle"] }], itemKeydown: [{ type: i0.Output, args: ["itemKeydown"] }] } });
|
|
14629
14649
|
|
|
14630
14650
|
/**
|
|
@@ -16734,6 +16754,357 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
16734
16754
|
args: ['document:click', ['$event']]
|
|
16735
16755
|
}] } });
|
|
16736
16756
|
|
|
16757
|
+
/** Positions pour le popup overlay */
|
|
16758
|
+
const INPUT_DATE_POSITIONS = [
|
|
16759
|
+
{
|
|
16760
|
+
originX: 'start',
|
|
16761
|
+
originY: 'bottom',
|
|
16762
|
+
overlayX: 'start',
|
|
16763
|
+
overlayY: 'top',
|
|
16764
|
+
offsetY: 4,
|
|
16765
|
+
},
|
|
16766
|
+
{
|
|
16767
|
+
originX: 'start',
|
|
16768
|
+
originY: 'top',
|
|
16769
|
+
overlayX: 'start',
|
|
16770
|
+
overlayY: 'bottom',
|
|
16771
|
+
offsetY: -4,
|
|
16772
|
+
},
|
|
16773
|
+
{
|
|
16774
|
+
originX: 'end',
|
|
16775
|
+
originY: 'bottom',
|
|
16776
|
+
overlayX: 'end',
|
|
16777
|
+
overlayY: 'top',
|
|
16778
|
+
offsetY: 4,
|
|
16779
|
+
},
|
|
16780
|
+
{
|
|
16781
|
+
originX: 'end',
|
|
16782
|
+
originY: 'top',
|
|
16783
|
+
overlayX: 'end',
|
|
16784
|
+
overlayY: 'bottom',
|
|
16785
|
+
offsetY: -4,
|
|
16786
|
+
},
|
|
16787
|
+
];
|
|
16788
|
+
/**
|
|
16789
|
+
* Parse une chaîne de date au format dd/MM/yyyy, dd-MM-yyyy, dd.MM.yyyy ou dd MM yyyy
|
|
16790
|
+
*/
|
|
16791
|
+
function parseDate(input) {
|
|
16792
|
+
if (!input || !input.trim()) {
|
|
16793
|
+
return { valid: true, date: null };
|
|
16794
|
+
}
|
|
16795
|
+
const trimmed = input.trim();
|
|
16796
|
+
// Regex multi-format: dd/MM/yyyy, dd-MM-yyyy, dd.MM.yyyy, dd MM yyyy
|
|
16797
|
+
const regex = /^(\d{1,2})[\/\-\.\s](\d{1,2})[\/\-\.\s](\d{4})$/;
|
|
16798
|
+
const match = trimmed.match(regex);
|
|
16799
|
+
if (!match) {
|
|
16800
|
+
return { valid: false, date: null, error: 'invalid_format' };
|
|
16801
|
+
}
|
|
16802
|
+
const day = parseInt(match[1], 10);
|
|
16803
|
+
const month = parseInt(match[2], 10);
|
|
16804
|
+
const year = parseInt(match[3], 10);
|
|
16805
|
+
// Validation des valeurs
|
|
16806
|
+
if (month < 1 || month > 12) {
|
|
16807
|
+
return { valid: false, date: null, error: 'invalid_date' };
|
|
16808
|
+
}
|
|
16809
|
+
if (day < 1 || day > 31) {
|
|
16810
|
+
return { valid: false, date: null, error: 'invalid_date' };
|
|
16811
|
+
}
|
|
16812
|
+
// Créer la date en heure locale (pas UTC)
|
|
16813
|
+
const date = new Date(year, month - 1, day, 0, 0, 0, 0);
|
|
16814
|
+
// Vérifier que la date est valide (ex: 31/02 créera une date en mars)
|
|
16815
|
+
if (date.getDate() !== day || date.getMonth() !== month - 1 || date.getFullYear() !== year) {
|
|
16816
|
+
return { valid: false, date: null, error: 'invalid_date' };
|
|
16817
|
+
}
|
|
16818
|
+
return { valid: true, date };
|
|
16819
|
+
}
|
|
16820
|
+
/**
|
|
16821
|
+
* Formate une date au format dd/MM/yyyy
|
|
16822
|
+
*/
|
|
16823
|
+
function formatDate(date) {
|
|
16824
|
+
if (!date)
|
|
16825
|
+
return '';
|
|
16826
|
+
const day = date.getDate().toString().padStart(2, '0');
|
|
16827
|
+
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
|
16828
|
+
const year = date.getFullYear();
|
|
16829
|
+
return `${day}/${month}/${year}`;
|
|
16830
|
+
}
|
|
16831
|
+
/**
|
|
16832
|
+
* DsInputDate - Composant de saisie de date avec calendrier popup
|
|
16833
|
+
*
|
|
16834
|
+
* @description
|
|
16835
|
+
* Input textuel avec icône calendrier et popup DsDatePicker pour la sélection
|
|
16836
|
+
* de date dans les formulaires. Supporte la saisie manuelle et les contraintes min/max.
|
|
16837
|
+
*
|
|
16838
|
+
* @example
|
|
16839
|
+
* ```html
|
|
16840
|
+
* <ds-input-date
|
|
16841
|
+
* [(ngModel)]="selectedDate"
|
|
16842
|
+
* label="Date de naissance"
|
|
16843
|
+
* placeholder="jj/mm/aaaa">
|
|
16844
|
+
* </ds-input-date>
|
|
16845
|
+
* ```
|
|
16846
|
+
*/
|
|
16847
|
+
class DsInputDate {
|
|
16848
|
+
// ViewChild - référence à l'élément input pour le focus
|
|
16849
|
+
inputElementRef;
|
|
16850
|
+
// Inputs
|
|
16851
|
+
value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
16852
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
|
|
16853
|
+
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
|
|
16854
|
+
readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
|
|
16855
|
+
placeholder = input('dd/mm/yyyy', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
|
|
16856
|
+
label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : []));
|
|
16857
|
+
error = input(undefined, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
16858
|
+
helper = input(undefined, ...(ngDevMode ? [{ debugName: "helper" }] : []));
|
|
16859
|
+
minDate = input(null, ...(ngDevMode ? [{ debugName: "minDate" }] : []));
|
|
16860
|
+
maxDate = input(null, ...(ngDevMode ? [{ debugName: "maxDate" }] : []));
|
|
16861
|
+
clearable = input(true, ...(ngDevMode ? [{ debugName: "clearable" }] : []));
|
|
16862
|
+
// Outputs
|
|
16863
|
+
dateChange = output();
|
|
16864
|
+
// Icons
|
|
16865
|
+
calendarIcon = faCalendar;
|
|
16866
|
+
clearIcon = faTimes;
|
|
16867
|
+
errorIcon = faExclamationCircle;
|
|
16868
|
+
// Overlay positions
|
|
16869
|
+
overlayPositions = INPUT_DATE_POSITIONS;
|
|
16870
|
+
// Unique ID for aria-controls
|
|
16871
|
+
panelId = `ds-input-date-panel-${Math.random().toString(36).substr(2, 9)}`;
|
|
16872
|
+
// State
|
|
16873
|
+
isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
|
|
16874
|
+
internalValue = signal(null, ...(ngDevMode ? [{ debugName: "internalValue" }] : []));
|
|
16875
|
+
isFocused = signal(false, ...(ngDevMode ? [{ debugName: "isFocused" }] : []));
|
|
16876
|
+
inputText = signal('', ...(ngDevMode ? [{ debugName: "inputText" }] : []));
|
|
16877
|
+
hasParseError = signal(false, ...(ngDevMode ? [{ debugName: "hasParseError" }] : []));
|
|
16878
|
+
// ControlValueAccessor
|
|
16879
|
+
onChange = () => { };
|
|
16880
|
+
onTouched = () => { };
|
|
16881
|
+
hasExternalValue = signal(false, ...(ngDevMode ? [{ debugName: "hasExternalValue" }] : []));
|
|
16882
|
+
// Computed
|
|
16883
|
+
displayValue = computed(() => {
|
|
16884
|
+
const text = this.inputText();
|
|
16885
|
+
if (text)
|
|
16886
|
+
return text;
|
|
16887
|
+
return formatDate(this.internalValue());
|
|
16888
|
+
}, ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
|
|
16889
|
+
containerClasses = computed(() => {
|
|
16890
|
+
const classes = ['ds-input-date'];
|
|
16891
|
+
classes.push(`ds-input-date--${this.size()}`);
|
|
16892
|
+
if (this.disabled())
|
|
16893
|
+
classes.push('ds-input-date--disabled');
|
|
16894
|
+
if (this.readonly())
|
|
16895
|
+
classes.push('ds-input-date--readonly');
|
|
16896
|
+
if (this.isFocused())
|
|
16897
|
+
classes.push('ds-input-date--focused');
|
|
16898
|
+
if (this.isOpen())
|
|
16899
|
+
classes.push('ds-input-date--open');
|
|
16900
|
+
if (this.inputState() === 'error')
|
|
16901
|
+
classes.push('ds-input-date--error');
|
|
16902
|
+
return classes.join(' ');
|
|
16903
|
+
}, ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
|
|
16904
|
+
isDisabled = computed(() => this.disabled() || this.readonly(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
|
|
16905
|
+
inputState = computed(() => {
|
|
16906
|
+
if (this.hasParseError() || this.error())
|
|
16907
|
+
return 'error';
|
|
16908
|
+
return 'default';
|
|
16909
|
+
}, ...(ngDevMode ? [{ debugName: "inputState" }] : []));
|
|
16910
|
+
showClearButton = computed(() => {
|
|
16911
|
+
return this.clearable() && this.internalValue() !== null && !this.isDisabled();
|
|
16912
|
+
}, ...(ngDevMode ? [{ debugName: "showClearButton" }] : []));
|
|
16913
|
+
effectiveMinDate = computed(() => {
|
|
16914
|
+
const min = this.minDate();
|
|
16915
|
+
const max = this.maxDate();
|
|
16916
|
+
// Si minDate > maxDate (config invalide), ignorer les contraintes
|
|
16917
|
+
if (min && max && min > max) {
|
|
16918
|
+
console.warn('[DsInputDate] minDate > maxDate: constraints ignored');
|
|
16919
|
+
return null;
|
|
16920
|
+
}
|
|
16921
|
+
return min;
|
|
16922
|
+
}, ...(ngDevMode ? [{ debugName: "effectiveMinDate" }] : []));
|
|
16923
|
+
effectiveMaxDate = computed(() => {
|
|
16924
|
+
const min = this.minDate();
|
|
16925
|
+
const max = this.maxDate();
|
|
16926
|
+
// Si minDate > maxDate (config invalide), ignorer les contraintes
|
|
16927
|
+
if (min && max && min > max) {
|
|
16928
|
+
return null;
|
|
16929
|
+
}
|
|
16930
|
+
return max;
|
|
16931
|
+
}, ...(ngDevMode ? [{ debugName: "effectiveMaxDate" }] : []));
|
|
16932
|
+
constructor() {
|
|
16933
|
+
// Sync external value with internal
|
|
16934
|
+
effect(() => {
|
|
16935
|
+
const val = this.value();
|
|
16936
|
+
if (!this.hasExternalValue() && val !== this.internalValue()) {
|
|
16937
|
+
this.internalValue.set(val);
|
|
16938
|
+
this.inputText.set(formatDate(val));
|
|
16939
|
+
}
|
|
16940
|
+
});
|
|
16941
|
+
}
|
|
16942
|
+
// ControlValueAccessor implementation
|
|
16943
|
+
writeValue(value) {
|
|
16944
|
+
this.hasExternalValue.set(true);
|
|
16945
|
+
this.internalValue.set(value);
|
|
16946
|
+
this.inputText.set(formatDate(value));
|
|
16947
|
+
this.hasParseError.set(false);
|
|
16948
|
+
}
|
|
16949
|
+
registerOnChange(fn) {
|
|
16950
|
+
this.onChange = fn;
|
|
16951
|
+
}
|
|
16952
|
+
registerOnTouched(fn) {
|
|
16953
|
+
this.onTouched = fn;
|
|
16954
|
+
}
|
|
16955
|
+
setDisabledState(isDisabled) {
|
|
16956
|
+
// Géré par input disabled
|
|
16957
|
+
}
|
|
16958
|
+
// Event handlers
|
|
16959
|
+
toggle() {
|
|
16960
|
+
if (this.isDisabled())
|
|
16961
|
+
return;
|
|
16962
|
+
if (this.isOpen()) {
|
|
16963
|
+
this.close();
|
|
16964
|
+
}
|
|
16965
|
+
else {
|
|
16966
|
+
this.open();
|
|
16967
|
+
}
|
|
16968
|
+
}
|
|
16969
|
+
open() {
|
|
16970
|
+
if (this.isDisabled() || this.isOpen())
|
|
16971
|
+
return;
|
|
16972
|
+
this.isOpen.set(true);
|
|
16973
|
+
}
|
|
16974
|
+
close() {
|
|
16975
|
+
if (!this.isOpen())
|
|
16976
|
+
return;
|
|
16977
|
+
this.isOpen.set(false);
|
|
16978
|
+
}
|
|
16979
|
+
onInputFocus() {
|
|
16980
|
+
if (!this.disabled()) {
|
|
16981
|
+
this.isFocused.set(true);
|
|
16982
|
+
}
|
|
16983
|
+
}
|
|
16984
|
+
onInputBlur() {
|
|
16985
|
+
this.isFocused.set(false);
|
|
16986
|
+
this.onTouched();
|
|
16987
|
+
// Parse et valide la saisie
|
|
16988
|
+
const text = this.inputText();
|
|
16989
|
+
if (!text) {
|
|
16990
|
+
// Champ vidé
|
|
16991
|
+
if (this.internalValue() !== null) {
|
|
16992
|
+
this.updateValue(null);
|
|
16993
|
+
}
|
|
16994
|
+
this.hasParseError.set(false);
|
|
16995
|
+
return;
|
|
16996
|
+
}
|
|
16997
|
+
const result = parseDate(text);
|
|
16998
|
+
if (!result.valid) {
|
|
16999
|
+
this.hasParseError.set(true);
|
|
17000
|
+
return;
|
|
17001
|
+
}
|
|
17002
|
+
// Validation des contraintes min/max
|
|
17003
|
+
if (result.date) {
|
|
17004
|
+
const min = this.effectiveMinDate();
|
|
17005
|
+
const max = this.effectiveMaxDate();
|
|
17006
|
+
if (min && result.date < min) {
|
|
17007
|
+
this.hasParseError.set(true);
|
|
17008
|
+
return;
|
|
17009
|
+
}
|
|
17010
|
+
if (max && result.date > max) {
|
|
17011
|
+
this.hasParseError.set(true);
|
|
17012
|
+
return;
|
|
17013
|
+
}
|
|
17014
|
+
}
|
|
17015
|
+
this.hasParseError.set(false);
|
|
17016
|
+
if (result.date !== this.internalValue()) {
|
|
17017
|
+
this.updateValue(result.date);
|
|
17018
|
+
}
|
|
17019
|
+
// Reformatter la saisie
|
|
17020
|
+
this.inputText.set(formatDate(result.date));
|
|
17021
|
+
}
|
|
17022
|
+
onInputChange(event) {
|
|
17023
|
+
const input = event.target;
|
|
17024
|
+
this.inputText.set(input.value);
|
|
17025
|
+
// Le parsing/validation se fait uniquement au blur
|
|
17026
|
+
}
|
|
17027
|
+
onInputKeydown(event) {
|
|
17028
|
+
if (this.isDisabled())
|
|
17029
|
+
return;
|
|
17030
|
+
switch (event.key) {
|
|
17031
|
+
case 'Enter':
|
|
17032
|
+
case 'ArrowDown':
|
|
17033
|
+
event.preventDefault();
|
|
17034
|
+
this.open();
|
|
17035
|
+
break;
|
|
17036
|
+
case 'Escape':
|
|
17037
|
+
if (this.isOpen()) {
|
|
17038
|
+
event.preventDefault();
|
|
17039
|
+
this.close();
|
|
17040
|
+
}
|
|
17041
|
+
break;
|
|
17042
|
+
}
|
|
17043
|
+
}
|
|
17044
|
+
onCalendarIconClick(event) {
|
|
17045
|
+
event.preventDefault();
|
|
17046
|
+
event.stopPropagation();
|
|
17047
|
+
this.toggle();
|
|
17048
|
+
}
|
|
17049
|
+
onDateSelected(date) {
|
|
17050
|
+
this.updateValue(date);
|
|
17051
|
+
this.inputText.set(formatDate(date));
|
|
17052
|
+
this.hasParseError.set(false);
|
|
17053
|
+
this.close();
|
|
17054
|
+
this.inputElementRef?.nativeElement.focus();
|
|
17055
|
+
}
|
|
17056
|
+
onBackdropClick() {
|
|
17057
|
+
this.close();
|
|
17058
|
+
}
|
|
17059
|
+
onOverlayKeydown(event) {
|
|
17060
|
+
if (event.key === 'Escape') {
|
|
17061
|
+
this.close();
|
|
17062
|
+
this.inputElementRef?.nativeElement.focus();
|
|
17063
|
+
}
|
|
17064
|
+
}
|
|
17065
|
+
clearValue(event) {
|
|
17066
|
+
event.preventDefault();
|
|
17067
|
+
event.stopPropagation();
|
|
17068
|
+
this.updateValue(null);
|
|
17069
|
+
this.inputText.set('');
|
|
17070
|
+
this.hasParseError.set(false);
|
|
17071
|
+
this.inputElementRef?.nativeElement.focus();
|
|
17072
|
+
}
|
|
17073
|
+
updateValue(value) {
|
|
17074
|
+
this.hasExternalValue.set(true);
|
|
17075
|
+
this.internalValue.set(value);
|
|
17076
|
+
this.onChange(value);
|
|
17077
|
+
this.dateChange.emit(value);
|
|
17078
|
+
}
|
|
17079
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsInputDate, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
17080
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsInputDate, isStandalone: true, selector: "ds-input-date", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, helper: { classPropertyName: "helper", publicName: "helper", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dateChange: "dateChange" }, providers: [
|
|
17081
|
+
{
|
|
17082
|
+
provide: NG_VALUE_ACCESSOR,
|
|
17083
|
+
useExisting: forwardRef(() => DsInputDate),
|
|
17084
|
+
multi: true,
|
|
17085
|
+
},
|
|
17086
|
+
], viewQueries: [{ propertyName: "inputElementRef", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<div [class]=\"containerClasses()\">\n <!-- Label -->\n @if (label()) {\n <label class=\"ds-input-date__label\" [attr.for]=\"panelId + '-input'\">\n {{ label() }}\n </label>\n }\n\n <!-- Input container -->\n <div\n class=\"ds-input-date__wrapper\"\n #triggerOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin>\n\n <input\n #inputElement\n type=\"text\"\n class=\"ds-input-date__input\"\n [id]=\"panelId + '-input'\"\n [value]=\"displayValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-invalid]=\"inputState() === 'error'\"\n (input)=\"onInputChange($event)\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onInputKeydown($event)\">\n\n <!-- Icons zone -->\n <div class=\"ds-input-date__icons\">\n <!-- Clear button -->\n @if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ds-input-date__clear\"\n tabindex=\"-1\"\n aria-label=\"Effacer la date\"\n (click)=\"clearValue($event)\">\n <fa-icon [icon]=\"clearIcon\" aria-hidden=\"true\"></fa-icon>\n </button>\n }\n\n <!-- Calendar icon -->\n <button\n type=\"button\"\n class=\"ds-input-date__calendar-btn\"\n [disabled]=\"isDisabled()\"\n tabindex=\"-1\"\n aria-label=\"Ouvrir le calendrier\"\n (click)=\"onCalendarIconClick($event)\">\n <fa-icon [icon]=\"calendarIcon\" aria-hidden=\"true\"></fa-icon>\n </button>\n </div>\n </div>\n\n <!-- Helper / Error message -->\n @if (error() || hasParseError()) {\n <div class=\"ds-input-date__error\">\n <fa-icon [icon]=\"errorIcon\" aria-hidden=\"true\"></fa-icon>\n <span>{{ error() || 'Format de date invalide' }}</span>\n </div>\n } @else if (helper()) {\n <div class=\"ds-input-date__helper\">{{ helper() }}</div>\n }\n</div>\n\n<!-- Date Picker Overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayPanelClass]=\"'ds-input-date-overlay'\"\n (backdropClick)=\"onBackdropClick()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\">\n\n <div\n class=\"ds-input-date__popup\"\n [id]=\"panelId\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"S\u00E9lectionner une date\">\n <ds-date-picker\n [mode]=\"'single'\"\n [minDate]=\"effectiveMinDate()\"\n [maxDate]=\"effectiveMaxDate()\"\n [showTodayButton]=\"true\"\n [showClearButton]=\"false\"\n (dateChange)=\"onDateSelected($event)\">\n </ds-date-picker>\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex;width:100%}.ds-input-date{display:flex;flex-direction:column;gap:var(--space-1);width:100%}.ds-input-date__label{display:block;color:var(--input-label-color);font-size:var(--input-label-font-size);font-weight:500;margin-bottom:var(--input-label-margin-bottom)}.ds-input-date__wrapper{position:relative;display:flex;align-items:center}.ds-input-date__input{flex:1;width:100%;height:var(--input-height-md);padding:0 var(--ds-input-date-icon-zone-width, 72px) 0 var(--input-padding-default);background-color:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-border-radius);color:var(--input-text);font-size:var(--input-font-size-md);outline:none;transition:all .2s ease}.ds-input-date__input::placeholder{color:var(--input-placeholder)}.ds-input-date__input:hover:not(:disabled):not([readonly]){border-color:var(--input-hover-border)}.ds-input-date__input:focus:not(:disabled){border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.ds-input-date__input:disabled{opacity:.5;cursor:not-allowed;background-color:var(--input-disabled-bg)}.ds-input-date__input[readonly]{cursor:default;background-color:var(--input-disabled-bg)}.ds-input-date__icons{position:absolute;right:0;top:0;bottom:0;display:flex;align-items:center;gap:var(--space-1);padding-right:var(--space-2)}.ds-input-date__clear{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;border-radius:var(--radius-1);color:var(--input-icon);cursor:pointer;transition:all .15s ease}.ds-input-date__clear:hover{background-color:var(--surface-hover);color:var(--text-default)}.ds-input-date__clear:focus-visible{outline:2px solid var(--input-focus-border);outline-offset:1px}.ds-input-date__clear fa-icon{font-size:14px}.ds-input-date__calendar-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:var(--radius-1);color:var(--input-icon);cursor:pointer;transition:all .15s ease}.ds-input-date__calendar-btn:hover:not(:disabled){background-color:var(--surface-hover);color:var(--color-primary)}.ds-input-date__calendar-btn:focus-visible{outline:2px solid var(--input-focus-border);outline-offset:1px}.ds-input-date__calendar-btn:disabled{opacity:.5;cursor:not-allowed}.ds-input-date__calendar-btn fa-icon{font-size:16px}.ds-input-date__helper{font-size:var(--font-size-1);color:var(--text-muted)}.ds-input-date__error{display:flex;align-items:center;gap:var(--space-1);font-size:var(--font-size-1);color:var(--text-error)}.ds-input-date__error fa-icon{font-size:12px}.ds-input-date__popup{background-color:var(--surface-default);border:1px solid var(--border-color);border-radius:var(--radius-2);box-shadow:var(--shadow-3);overflow:hidden}.ds-input-date--sm .ds-input-date__input{height:var(--input-height-sm);padding-left:var(--space-2);font-size:var(--input-font-size-sm)}.ds-input-date--sm .ds-input-date__calendar-btn{width:24px;height:24px}.ds-input-date--sm .ds-input-date__calendar-btn fa-icon{font-size:14px}.ds-input-date--sm .ds-input-date__clear{width:20px;height:20px}.ds-input-date--sm .ds-input-date__clear fa-icon{font-size:12px}.ds-input-date--lg .ds-input-date__input{height:var(--input-height-lg);padding-left:var(--space-3);font-size:var(--input-font-size-lg)}.ds-input-date--lg .ds-input-date__calendar-btn{width:32px;height:32px}.ds-input-date--lg .ds-input-date__calendar-btn fa-icon{font-size:18px}.ds-input-date--lg .ds-input-date__clear{width:28px;height:28px}.ds-input-date--lg .ds-input-date__clear fa-icon{font-size:16px}.ds-input-date--focused .ds-input-date__input{border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.ds-input-date--open .ds-input-date__calendar-btn{color:var(--color-primary)}.ds-input-date--error .ds-input-date__input{border-color:var(--input-error-border)}.ds-input-date--error .ds-input-date__input:focus{border-color:var(--input-error-border);box-shadow:0 0 0 2px color-mix(in oklab,var(--error) 20%,transparent)}.ds-input-date--error .ds-input-date__calendar-btn{color:var(--error)}.ds-input-date--disabled{pointer-events:none;opacity:.5}.ds-input-date--readonly .ds-input-date__calendar-btn{pointer-events:none}::ng-deep .ds-input-date-overlay{z-index:1000}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: DsDatePicker, selector: "ds-date-picker", inputs: ["size", "mode", "disabled", "minDate", "maxDate", "showTodayButton", "showClearButton", "todayLabel", "clearLabel", "prevMonthLabel", "nextMonthLabel", "presets", "showPresets", "showRangePreview"], outputs: ["dateChange", "rangeChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
17087
|
+
}
|
|
17088
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsInputDate, decorators: [{
|
|
17089
|
+
type: Component,
|
|
17090
|
+
args: [{ selector: 'ds-input-date', standalone: true, imports: [
|
|
17091
|
+
CommonModule,
|
|
17092
|
+
FontAwesomeModule,
|
|
17093
|
+
CdkConnectedOverlay,
|
|
17094
|
+
CdkOverlayOrigin,
|
|
17095
|
+
DsDatePicker,
|
|
17096
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
17097
|
+
{
|
|
17098
|
+
provide: NG_VALUE_ACCESSOR,
|
|
17099
|
+
useExisting: forwardRef(() => DsInputDate),
|
|
17100
|
+
multi: true,
|
|
17101
|
+
},
|
|
17102
|
+
], template: "<div [class]=\"containerClasses()\">\n <!-- Label -->\n @if (label()) {\n <label class=\"ds-input-date__label\" [attr.for]=\"panelId + '-input'\">\n {{ label() }}\n </label>\n }\n\n <!-- Input container -->\n <div\n class=\"ds-input-date__wrapper\"\n #triggerOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin>\n\n <input\n #inputElement\n type=\"text\"\n class=\"ds-input-date__input\"\n [id]=\"panelId + '-input'\"\n [value]=\"displayValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-invalid]=\"inputState() === 'error'\"\n (input)=\"onInputChange($event)\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onInputKeydown($event)\">\n\n <!-- Icons zone -->\n <div class=\"ds-input-date__icons\">\n <!-- Clear button -->\n @if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ds-input-date__clear\"\n tabindex=\"-1\"\n aria-label=\"Effacer la date\"\n (click)=\"clearValue($event)\">\n <fa-icon [icon]=\"clearIcon\" aria-hidden=\"true\"></fa-icon>\n </button>\n }\n\n <!-- Calendar icon -->\n <button\n type=\"button\"\n class=\"ds-input-date__calendar-btn\"\n [disabled]=\"isDisabled()\"\n tabindex=\"-1\"\n aria-label=\"Ouvrir le calendrier\"\n (click)=\"onCalendarIconClick($event)\">\n <fa-icon [icon]=\"calendarIcon\" aria-hidden=\"true\"></fa-icon>\n </button>\n </div>\n </div>\n\n <!-- Helper / Error message -->\n @if (error() || hasParseError()) {\n <div class=\"ds-input-date__error\">\n <fa-icon [icon]=\"errorIcon\" aria-hidden=\"true\"></fa-icon>\n <span>{{ error() || 'Format de date invalide' }}</span>\n </div>\n } @else if (helper()) {\n <div class=\"ds-input-date__helper\">{{ helper() }}</div>\n }\n</div>\n\n<!-- Date Picker Overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayPanelClass]=\"'ds-input-date-overlay'\"\n (backdropClick)=\"onBackdropClick()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\">\n\n <div\n class=\"ds-input-date__popup\"\n [id]=\"panelId\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"S\u00E9lectionner une date\">\n <ds-date-picker\n [mode]=\"'single'\"\n [minDate]=\"effectiveMinDate()\"\n [maxDate]=\"effectiveMaxDate()\"\n [showTodayButton]=\"true\"\n [showClearButton]=\"false\"\n (dateChange)=\"onDateSelected($event)\">\n </ds-date-picker>\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex;width:100%}.ds-input-date{display:flex;flex-direction:column;gap:var(--space-1);width:100%}.ds-input-date__label{display:block;color:var(--input-label-color);font-size:var(--input-label-font-size);font-weight:500;margin-bottom:var(--input-label-margin-bottom)}.ds-input-date__wrapper{position:relative;display:flex;align-items:center}.ds-input-date__input{flex:1;width:100%;height:var(--input-height-md);padding:0 var(--ds-input-date-icon-zone-width, 72px) 0 var(--input-padding-default);background-color:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-border-radius);color:var(--input-text);font-size:var(--input-font-size-md);outline:none;transition:all .2s ease}.ds-input-date__input::placeholder{color:var(--input-placeholder)}.ds-input-date__input:hover:not(:disabled):not([readonly]){border-color:var(--input-hover-border)}.ds-input-date__input:focus:not(:disabled){border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.ds-input-date__input:disabled{opacity:.5;cursor:not-allowed;background-color:var(--input-disabled-bg)}.ds-input-date__input[readonly]{cursor:default;background-color:var(--input-disabled-bg)}.ds-input-date__icons{position:absolute;right:0;top:0;bottom:0;display:flex;align-items:center;gap:var(--space-1);padding-right:var(--space-2)}.ds-input-date__clear{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;border-radius:var(--radius-1);color:var(--input-icon);cursor:pointer;transition:all .15s ease}.ds-input-date__clear:hover{background-color:var(--surface-hover);color:var(--text-default)}.ds-input-date__clear:focus-visible{outline:2px solid var(--input-focus-border);outline-offset:1px}.ds-input-date__clear fa-icon{font-size:14px}.ds-input-date__calendar-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:var(--radius-1);color:var(--input-icon);cursor:pointer;transition:all .15s ease}.ds-input-date__calendar-btn:hover:not(:disabled){background-color:var(--surface-hover);color:var(--color-primary)}.ds-input-date__calendar-btn:focus-visible{outline:2px solid var(--input-focus-border);outline-offset:1px}.ds-input-date__calendar-btn:disabled{opacity:.5;cursor:not-allowed}.ds-input-date__calendar-btn fa-icon{font-size:16px}.ds-input-date__helper{font-size:var(--font-size-1);color:var(--text-muted)}.ds-input-date__error{display:flex;align-items:center;gap:var(--space-1);font-size:var(--font-size-1);color:var(--text-error)}.ds-input-date__error fa-icon{font-size:12px}.ds-input-date__popup{background-color:var(--surface-default);border:1px solid var(--border-color);border-radius:var(--radius-2);box-shadow:var(--shadow-3);overflow:hidden}.ds-input-date--sm .ds-input-date__input{height:var(--input-height-sm);padding-left:var(--space-2);font-size:var(--input-font-size-sm)}.ds-input-date--sm .ds-input-date__calendar-btn{width:24px;height:24px}.ds-input-date--sm .ds-input-date__calendar-btn fa-icon{font-size:14px}.ds-input-date--sm .ds-input-date__clear{width:20px;height:20px}.ds-input-date--sm .ds-input-date__clear fa-icon{font-size:12px}.ds-input-date--lg .ds-input-date__input{height:var(--input-height-lg);padding-left:var(--space-3);font-size:var(--input-font-size-lg)}.ds-input-date--lg .ds-input-date__calendar-btn{width:32px;height:32px}.ds-input-date--lg .ds-input-date__calendar-btn fa-icon{font-size:18px}.ds-input-date--lg .ds-input-date__clear{width:28px;height:28px}.ds-input-date--lg .ds-input-date__clear fa-icon{font-size:16px}.ds-input-date--focused .ds-input-date__input{border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.ds-input-date--open .ds-input-date__calendar-btn{color:var(--color-primary)}.ds-input-date--error .ds-input-date__input{border-color:var(--input-error-border)}.ds-input-date--error .ds-input-date__input:focus{border-color:var(--input-error-border);box-shadow:0 0 0 2px color-mix(in oklab,var(--error) 20%,transparent)}.ds-input-date--error .ds-input-date__calendar-btn{color:var(--error)}.ds-input-date--disabled{pointer-events:none;opacity:.5}.ds-input-date--readonly .ds-input-date__calendar-btn{pointer-events:none}::ng-deep .ds-input-date-overlay{z-index:1000}\n"] }]
|
|
17103
|
+
}], ctorParameters: () => [], propDecorators: { inputElementRef: [{
|
|
17104
|
+
type: ViewChild,
|
|
17105
|
+
args: ['inputElement']
|
|
17106
|
+
}], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], helper: [{ type: i0.Input, args: [{ isSignal: true, alias: "helper", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }] } });
|
|
17107
|
+
|
|
16737
17108
|
/*
|
|
16738
17109
|
* Components barrel export
|
|
16739
17110
|
*/
|
|
@@ -17139,7 +17510,9 @@ class DsI18nService {
|
|
|
17139
17510
|
this._locale.set(locale);
|
|
17140
17511
|
}
|
|
17141
17512
|
else {
|
|
17142
|
-
|
|
17513
|
+
if (isDevMode()) {
|
|
17514
|
+
console.warn(`[DsI18nService] Locale '${locale}' not supported. Using 'fr'.`);
|
|
17515
|
+
}
|
|
17143
17516
|
this._locale.set('fr');
|
|
17144
17517
|
}
|
|
17145
17518
|
}
|
|
@@ -17220,5 +17593,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
17220
17593
|
* Generated bundle index. Do not edit.
|
|
17221
17594
|
*/
|
|
17222
17595
|
|
|
17223
|
-
export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAccordionItem, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsCheckboxList, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsEntityChip, DsEntityPicker, DsFileUpload, DsI18nService, DsInputField, DsInputNumber, DsInputTextarea, DsList, DsListGroup, DsListItem, DsMenu, DsModalComponent, DsNavList, DsNotificationContainerComponent, DsNotificationItemComponent, DsNotificationService, DsPagination, DsPasswordStrength, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsRating, DsSearchInput, DsSegmentedControl, DsSelect, DsSidebar, DsSidebarFooterItemComponent, DsSidebarItemComponent, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsTimePicker, DsTimeline, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, DsTransfer, DsTree, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, SIDEBAR_POPOVER_POSITIONS_LEFT, SIDEBAR_POPOVER_POSITIONS_RIGHT, TOOLTIP_POSITIONS, generateId, generateShortId };
|
|
17596
|
+
export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAccordionItem, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsCheckboxList, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsEntityChip, DsEntityPicker, DsFileUpload, DsI18nService, DsInputDate, DsInputField, DsInputNumber, DsInputTextarea, DsList, DsListGroup, DsListItem, DsMenu, DsModalComponent, DsNavList, DsNotificationContainerComponent, DsNotificationItemComponent, DsNotificationService, DsPagination, DsPasswordStrength, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsRating, DsSearchInput, DsSegmentedControl, DsSelect, DsSidebar, DsSidebarFooterItemComponent, DsSidebarItemComponent, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsTimePicker, DsTimeline, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, DsTransfer, DsTree, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, SIDEBAR_POPOVER_POSITIONS_LEFT, SIDEBAR_POPOVER_POSITIONS_RIGHT, TOOLTIP_POSITIONS, generateId, generateShortId };
|
|
17224
17597
|
//# sourceMappingURL=kksdev-ds-angular.mjs.map
|