pdm-ui-kit 0.1.46 → 0.1.47
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/esm2020/lib/components/date-picker/date-picker.component.mjs +101 -73
- package/esm2020/lib/components/dropdown-menu/dropdown-menu.component.mjs +109 -21
- package/esm2020/lib/components/pagination/pagination.component.mjs +1 -1
- package/esm2020/lib/components/select/select.component.mjs +7 -3
- package/esm2020/lib/overlay/pdm-overlay-options.mjs +2 -0
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/pdm-ui-kit.mjs +196 -97
- package/fesm2015/pdm-ui-kit.mjs.map +1 -1
- package/fesm2020/pdm-ui-kit.mjs +207 -91
- package/fesm2020/pdm-ui-kit.mjs.map +1 -1
- package/lib/components/date-picker/date-picker.component.d.ts +26 -11
- package/lib/components/dropdown-menu/dropdown-menu.component.d.ts +33 -6
- package/lib/components/select/select.component.d.ts +8 -1
- package/lib/overlay/pdm-overlay-options.d.ts +21 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
package/fesm2020/pdm-ui-kit.mjs
CHANGED
|
@@ -6,8 +6,8 @@ import * as i1$2 from '@angular/cdk/overlay';
|
|
|
6
6
|
import { OverlayModule } from '@angular/cdk/overlay';
|
|
7
7
|
import { icons } from 'lucide';
|
|
8
8
|
import * as i1$1 from '@angular/platform-browser';
|
|
9
|
-
import { format } from 'date-fns';
|
|
10
9
|
import { TemplatePortal } from '@angular/cdk/portal';
|
|
10
|
+
import { format } from 'date-fns';
|
|
11
11
|
|
|
12
12
|
class PdmAccordionComponent {
|
|
13
13
|
constructor() {
|
|
@@ -1954,21 +1954,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
1954
1954
|
|
|
1955
1955
|
let nextDatePickerId = 0;
|
|
1956
1956
|
class PdmDatePickerComponent {
|
|
1957
|
-
constructor(elementRef, cdr) {
|
|
1957
|
+
constructor(elementRef, cdr, overlay, viewContainerRef) {
|
|
1958
1958
|
this.elementRef = elementRef;
|
|
1959
1959
|
this.cdr = cdr;
|
|
1960
|
+
this.overlay = overlay;
|
|
1961
|
+
this.viewContainerRef = viewContainerRef;
|
|
1960
1962
|
this._value = null;
|
|
1961
1963
|
this._rangeValue = null;
|
|
1962
1964
|
this._open = false;
|
|
1963
1965
|
this.instanceId = `pdm-date-picker-${++nextDatePickerId}`;
|
|
1964
1966
|
this.triggerFocused = false;
|
|
1965
|
-
this.
|
|
1967
|
+
this.overlayRef = null;
|
|
1968
|
+
this.backdropSub = null;
|
|
1966
1969
|
this.id = '';
|
|
1967
1970
|
this.variant = 'single';
|
|
1968
1971
|
this.label = '';
|
|
1969
1972
|
this.labelClassName = '';
|
|
1970
1973
|
this.className = '';
|
|
1971
1974
|
this.triggerClassName = '';
|
|
1975
|
+
/**
|
|
1976
|
+
* Additional CSS classes applied to the overlay panel.
|
|
1977
|
+
* Backward-compatible: mapped to `overlayOptions.panelClass` when `overlayOptions` is not set.
|
|
1978
|
+
* When both are supplied, `overlayOptions.panelClass` takes precedence.
|
|
1979
|
+
*/
|
|
1972
1980
|
this.panelClassName = '';
|
|
1973
1981
|
this.placeholder = 'Pick a date';
|
|
1974
1982
|
this.rangePlaceholder = 'Pick a date range';
|
|
@@ -1991,14 +1999,14 @@ class PdmDatePickerComponent {
|
|
|
1991
1999
|
this.monthChange = new EventEmitter();
|
|
1992
2000
|
}
|
|
1993
2001
|
set open(value) {
|
|
1994
|
-
this._open
|
|
1995
|
-
|
|
1996
|
-
|
|
2002
|
+
if (this._open === !!value)
|
|
2003
|
+
return;
|
|
2004
|
+
if (!!value) {
|
|
2005
|
+
this.openPanel();
|
|
1997
2006
|
}
|
|
1998
2007
|
else {
|
|
1999
|
-
this.
|
|
2008
|
+
this.closePanel();
|
|
2000
2009
|
}
|
|
2001
|
-
this.cdr.markForCheck();
|
|
2002
2010
|
}
|
|
2003
2011
|
get open() {
|
|
2004
2012
|
return this._open;
|
|
@@ -2022,6 +2030,9 @@ class PdmDatePickerComponent {
|
|
|
2022
2030
|
get rangeValue() {
|
|
2023
2031
|
return this._rangeValue;
|
|
2024
2032
|
}
|
|
2033
|
+
ngOnDestroy() {
|
|
2034
|
+
this.destroyOverlay();
|
|
2035
|
+
}
|
|
2025
2036
|
get resolvedVariant() {
|
|
2026
2037
|
return this.variant === 'range' ? 'range' : 'single';
|
|
2027
2038
|
}
|
|
@@ -2066,7 +2077,7 @@ class PdmDatePickerComponent {
|
|
|
2066
2077
|
];
|
|
2067
2078
|
}
|
|
2068
2079
|
get triggerClasses() {
|
|
2069
|
-
const focusStyle = this.
|
|
2080
|
+
const focusStyle = this._open || this.triggerFocused;
|
|
2070
2081
|
return [
|
|
2071
2082
|
'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive relative flex w-full appearance-none items-center gap-2 overflow-hidden rounded-lg border bg-background px-3 py-[7.5px] text-left text-sm shadow-sm outline-none transition-colors',
|
|
2072
2083
|
'min-h-[36px] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',
|
|
@@ -2077,19 +2088,11 @@ class PdmDatePickerComponent {
|
|
|
2077
2088
|
this.triggerClassName
|
|
2078
2089
|
];
|
|
2079
2090
|
}
|
|
2080
|
-
get panelClasses() {
|
|
2081
|
-
return [
|
|
2082
|
-
this.panelPlacement === 'top'
|
|
2083
|
-
? 'absolute bottom-full left-0 z-50 mb-2'
|
|
2084
|
-
: 'absolute left-0 top-full z-50 mt-2',
|
|
2085
|
-
this.panelClassName
|
|
2086
|
-
];
|
|
2087
|
-
}
|
|
2088
2091
|
toggleOpen() {
|
|
2089
2092
|
if (this.disabled || this.readonly) {
|
|
2090
2093
|
return;
|
|
2091
2094
|
}
|
|
2092
|
-
this.setOpen(!this.
|
|
2095
|
+
this.setOpen(!this._open);
|
|
2093
2096
|
}
|
|
2094
2097
|
onTriggerFocus() {
|
|
2095
2098
|
this.triggerFocused = true;
|
|
@@ -2132,58 +2135,88 @@ class PdmDatePickerComponent {
|
|
|
2132
2135
|
this.monthChange.emit(this.cloneDate(month));
|
|
2133
2136
|
}
|
|
2134
2137
|
onEscape() {
|
|
2135
|
-
if (this.
|
|
2136
|
-
this.setOpen(false);
|
|
2137
|
-
}
|
|
2138
|
-
}
|
|
2139
|
-
onDocumentClick(event) {
|
|
2140
|
-
if (!this.open) {
|
|
2141
|
-
return;
|
|
2142
|
-
}
|
|
2143
|
-
const target = event.target;
|
|
2144
|
-
if (target && !this.elementRef.nativeElement.contains(target)) {
|
|
2138
|
+
if (this._open) {
|
|
2145
2139
|
this.setOpen(false);
|
|
2146
2140
|
}
|
|
2147
2141
|
}
|
|
2148
|
-
onViewportChange() {
|
|
2149
|
-
this.updatePanelPlacement();
|
|
2150
|
-
}
|
|
2151
2142
|
setOpen(nextOpen) {
|
|
2152
2143
|
if (this._open === nextOpen) {
|
|
2153
2144
|
return;
|
|
2154
2145
|
}
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
if (this._open) {
|
|
2158
|
-
this.schedulePanelPlacementUpdate();
|
|
2146
|
+
if (nextOpen) {
|
|
2147
|
+
this.openPanel();
|
|
2159
2148
|
}
|
|
2160
2149
|
else {
|
|
2161
|
-
this.
|
|
2150
|
+
this.closePanel();
|
|
2162
2151
|
}
|
|
2163
|
-
this.cdr.markForCheck();
|
|
2164
|
-
}
|
|
2165
|
-
schedulePanelPlacementUpdate() {
|
|
2166
|
-
setTimeout(() => this.updatePanelPlacement());
|
|
2167
2152
|
}
|
|
2168
|
-
|
|
2169
|
-
if (
|
|
2153
|
+
openPanel() {
|
|
2154
|
+
if (this.overlayRef)
|
|
2170
2155
|
return;
|
|
2171
|
-
}
|
|
2172
2156
|
const triggerEl = this.triggerRef?.nativeElement;
|
|
2173
|
-
|
|
2174
|
-
if (!triggerEl || !panelEl || typeof window === 'undefined') {
|
|
2157
|
+
if (!triggerEl)
|
|
2175
2158
|
return;
|
|
2159
|
+
this._open = true;
|
|
2160
|
+
this.openChange.emit(true);
|
|
2161
|
+
this.cdr.markForCheck();
|
|
2162
|
+
const positionStrategy = this.overlay
|
|
2163
|
+
.position()
|
|
2164
|
+
.flexibleConnectedTo(triggerEl)
|
|
2165
|
+
.withPositions([
|
|
2166
|
+
{
|
|
2167
|
+
originX: 'start',
|
|
2168
|
+
originY: 'bottom',
|
|
2169
|
+
overlayX: 'start',
|
|
2170
|
+
overlayY: 'top',
|
|
2171
|
+
offsetY: 8
|
|
2172
|
+
},
|
|
2173
|
+
{
|
|
2174
|
+
originX: 'start',
|
|
2175
|
+
originY: 'top',
|
|
2176
|
+
overlayX: 'start',
|
|
2177
|
+
overlayY: 'bottom',
|
|
2178
|
+
offsetY: -8
|
|
2179
|
+
}
|
|
2180
|
+
])
|
|
2181
|
+
.withFlexibleDimensions(false)
|
|
2182
|
+
.withPush(true);
|
|
2183
|
+
// Resolve panelClass: overlayOptions.panelClass wins; otherwise map panelClassName.
|
|
2184
|
+
const resolvedPanelClass = this.overlayOptions?.panelClass
|
|
2185
|
+
?? (this.panelClassName ? ['block', this.panelClassName] : ['block']);
|
|
2186
|
+
this.overlayRef = this.overlay.create({
|
|
2187
|
+
positionStrategy,
|
|
2188
|
+
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
2189
|
+
// Consumer overrides are spread last — they win over every default above.
|
|
2190
|
+
...this.overlayOptions,
|
|
2191
|
+
// panelClass always overrides last: it already merges panelClassName + overlayOptions.
|
|
2192
|
+
panelClass: resolvedPanelClass
|
|
2193
|
+
});
|
|
2194
|
+
const portal = new TemplatePortal(this.panelTemplateRef, this.viewContainerRef);
|
|
2195
|
+
this.overlayRef.attach(portal);
|
|
2196
|
+
this.backdropSub = this.overlayRef.outsidePointerEvents().subscribe((event) => {
|
|
2197
|
+
const target = event.target;
|
|
2198
|
+
if (!triggerEl.contains(target)) {
|
|
2199
|
+
this.closePanel();
|
|
2200
|
+
}
|
|
2201
|
+
});
|
|
2202
|
+
this.cdr.markForCheck();
|
|
2203
|
+
}
|
|
2204
|
+
closePanel() {
|
|
2205
|
+
if (!this.overlayRef && !this._open)
|
|
2206
|
+
return;
|
|
2207
|
+
this._open = false;
|
|
2208
|
+
this.openChange.emit(false);
|
|
2209
|
+
this.destroyOverlay();
|
|
2210
|
+
this.cdr.markForCheck();
|
|
2211
|
+
}
|
|
2212
|
+
destroyOverlay() {
|
|
2213
|
+
if (this.backdropSub) {
|
|
2214
|
+
this.backdropSub.unsubscribe();
|
|
2215
|
+
this.backdropSub = null;
|
|
2176
2216
|
}
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
const panelHeight = panelEl.offsetHeight;
|
|
2181
|
-
const spaceBelow = Math.max(0, viewportHeight - triggerRect.bottom - gap);
|
|
2182
|
-
const spaceAbove = Math.max(0, triggerRect.top - gap);
|
|
2183
|
-
const nextPlacement = spaceBelow < panelHeight && spaceAbove > spaceBelow ? 'top' : 'bottom';
|
|
2184
|
-
if (this.panelPlacement !== nextPlacement) {
|
|
2185
|
-
this.panelPlacement = nextPlacement;
|
|
2186
|
-
this.cdr.markForCheck();
|
|
2217
|
+
if (this.overlayRef) {
|
|
2218
|
+
this.overlayRef.dispose();
|
|
2219
|
+
this.overlayRef = null;
|
|
2187
2220
|
}
|
|
2188
2221
|
}
|
|
2189
2222
|
formatDate(date) {
|
|
@@ -2204,17 +2237,17 @@ class PdmDatePickerComponent {
|
|
|
2204
2237
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
2205
2238
|
}
|
|
2206
2239
|
}
|
|
2207
|
-
PdmDatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDatePickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2208
|
-
PdmDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDatePickerComponent, selector: "pdm-date-picker", inputs: { id: "id", variant: "variant", label: "label", labelClassName: "labelClassName", className: "className", triggerClassName: "triggerClassName", panelClassName: "panelClassName", placeholder: "placeholder", rangePlaceholder: "rangePlaceholder", format: "format", disabled: "disabled", readonly: "readonly", required: "required", invalid: "invalid", allowSameDayRange: "allowSameDayRange", closeOnSelect: "closeOnSelect", minDate: "minDate", maxDate: "maxDate", minYear: "minYear", maxYear: "maxYear", disabledDates: "disabledDates", isDateDisabled: "isDateDisabled", open: "open", value: "value", rangeValue: "rangeValue" }, outputs: { valueChange: "valueChange", rangeValueChange: "rangeValueChange", openChange: "openChange", monthChange: "monthChange" }, host: { listeners: { "document:keydown.escape": "onEscape()"
|
|
2240
|
+
PdmDatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDatePickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2241
|
+
PdmDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDatePickerComponent, selector: "pdm-date-picker", inputs: { id: "id", variant: "variant", label: "label", labelClassName: "labelClassName", className: "className", triggerClassName: "triggerClassName", panelClassName: "panelClassName", overlayOptions: "overlayOptions", placeholder: "placeholder", rangePlaceholder: "rangePlaceholder", format: "format", disabled: "disabled", readonly: "readonly", required: "required", invalid: "invalid", allowSameDayRange: "allowSameDayRange", closeOnSelect: "closeOnSelect", minDate: "minDate", maxDate: "maxDate", minYear: "minYear", maxYear: "maxYear", disabledDates: "disabledDates", isDateDisabled: "isDateDisabled", open: "open", value: "value", rangeValue: "rangeValue" }, outputs: { valueChange: "valueChange", rangeValueChange: "rangeValueChange", openChange: "openChange", monthChange: "monthChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <button\n #triggerEl\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n</div>\n\n<ng-template #panelTemplate>\n <div [id]=\"panelId\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmCalendarComponent, selector: "pdm-calendar", inputs: ["variant", "className", "disabledDates", "minDate", "maxDate", "minYear", "maxYear", "isDateDisabled", "allowSameDayRange", "readonly", "value", "rangeValue", "month"], outputs: ["valueChange", "rangeValueChange", "monthChange", "dateClick", "disabledDateClick"] }, { kind: "component", type: PdmLabelComponent, selector: "pdm-label", inputs: ["forId", "required", "className"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2209
2242
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDatePickerComponent, decorators: [{
|
|
2210
2243
|
type: Component,
|
|
2211
|
-
args: [{ selector: 'pdm-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <
|
|
2212
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { triggerRef: [{
|
|
2244
|
+
args: [{ selector: 'pdm-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <button\n #triggerEl\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n</div>\n\n<ng-template #panelTemplate>\n <div [id]=\"panelId\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n</ng-template>\n" }]
|
|
2245
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$2.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { triggerRef: [{
|
|
2213
2246
|
type: ViewChild,
|
|
2214
2247
|
args: ['triggerEl']
|
|
2215
|
-
}],
|
|
2248
|
+
}], panelTemplateRef: [{
|
|
2216
2249
|
type: ViewChild,
|
|
2217
|
-
args: ['
|
|
2250
|
+
args: ['panelTemplate']
|
|
2218
2251
|
}], id: [{
|
|
2219
2252
|
type: Input
|
|
2220
2253
|
}], variant: [{
|
|
@@ -2229,6 +2262,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
2229
2262
|
type: Input
|
|
2230
2263
|
}], panelClassName: [{
|
|
2231
2264
|
type: Input
|
|
2265
|
+
}], overlayOptions: [{
|
|
2266
|
+
type: Input
|
|
2232
2267
|
}], placeholder: [{
|
|
2233
2268
|
type: Input
|
|
2234
2269
|
}], rangePlaceholder: [{
|
|
@@ -2276,15 +2311,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
2276
2311
|
}], onEscape: [{
|
|
2277
2312
|
type: HostListener,
|
|
2278
2313
|
args: ['document:keydown.escape']
|
|
2279
|
-
}], onDocumentClick: [{
|
|
2280
|
-
type: HostListener,
|
|
2281
|
-
args: ['document:click', ['$event']]
|
|
2282
|
-
}], onViewportChange: [{
|
|
2283
|
-
type: HostListener,
|
|
2284
|
-
args: ['window:resize']
|
|
2285
|
-
}, {
|
|
2286
|
-
type: HostListener,
|
|
2287
|
-
args: ['window:scroll']
|
|
2288
2314
|
}] } });
|
|
2289
2315
|
|
|
2290
2316
|
class PdmDialogComponent {
|
|
@@ -2417,20 +2443,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
2417
2443
|
}] } });
|
|
2418
2444
|
|
|
2419
2445
|
class PdmDropdownMenuComponent {
|
|
2420
|
-
constructor(elementRef) {
|
|
2446
|
+
constructor(elementRef, cdr, overlay, viewContainerRef) {
|
|
2421
2447
|
this.elementRef = elementRef;
|
|
2448
|
+
this.cdr = cdr;
|
|
2449
|
+
this.overlay = overlay;
|
|
2450
|
+
this.viewContainerRef = viewContainerRef;
|
|
2422
2451
|
this.triggerText = 'Open';
|
|
2423
2452
|
this.variant = 'default';
|
|
2424
2453
|
this.items = [];
|
|
2425
2454
|
this.closeOnSelect = true;
|
|
2426
|
-
|
|
2455
|
+
/**
|
|
2456
|
+
* Additional CSS classes applied to the trigger wrapper element.
|
|
2457
|
+
* Preserved for backward compatibility.
|
|
2458
|
+
*/
|
|
2427
2459
|
this.className = '';
|
|
2460
|
+
/**
|
|
2461
|
+
* Additional CSS classes applied to the overlay panel.
|
|
2462
|
+
* Backward-compatible: mapped to `overlayOptions.panelClass` when `overlayOptions` is not set.
|
|
2463
|
+
* When both are supplied, `overlayOptions.panelClass` takes precedence.
|
|
2464
|
+
*/
|
|
2465
|
+
this.panelClassName = '';
|
|
2428
2466
|
this.itemSelect = new EventEmitter();
|
|
2429
2467
|
this.itemsChange = new EventEmitter();
|
|
2430
2468
|
this.open = false;
|
|
2469
|
+
this.overlayRef = null;
|
|
2470
|
+
this.backdropSub = null;
|
|
2471
|
+
}
|
|
2472
|
+
ngOnDestroy() {
|
|
2473
|
+
this.destroyOverlay();
|
|
2431
2474
|
}
|
|
2432
2475
|
toggle() {
|
|
2433
|
-
this.open
|
|
2476
|
+
if (this.open) {
|
|
2477
|
+
this.closePanel();
|
|
2478
|
+
}
|
|
2479
|
+
else {
|
|
2480
|
+
this.openPanel();
|
|
2481
|
+
}
|
|
2434
2482
|
}
|
|
2435
2483
|
get resolvedItems() {
|
|
2436
2484
|
if (this.items.length) {
|
|
@@ -2489,27 +2537,86 @@ class PdmDropdownMenuComponent {
|
|
|
2489
2537
|
this.itemSelect.emit(item.value);
|
|
2490
2538
|
const shouldClose = this.variant === 'default' ? this.closeOnSelect : false;
|
|
2491
2539
|
if (shouldClose) {
|
|
2492
|
-
this.
|
|
2540
|
+
this.closePanel();
|
|
2493
2541
|
}
|
|
2494
2542
|
}
|
|
2495
2543
|
onEsc() {
|
|
2496
|
-
this.
|
|
2544
|
+
this.closePanel();
|
|
2497
2545
|
}
|
|
2498
|
-
|
|
2499
|
-
if (
|
|
2546
|
+
openPanel() {
|
|
2547
|
+
if (this.overlayRef)
|
|
2500
2548
|
return;
|
|
2501
|
-
const
|
|
2502
|
-
if (
|
|
2503
|
-
|
|
2549
|
+
const triggerEl = this.triggerRef?.nativeElement;
|
|
2550
|
+
if (!triggerEl)
|
|
2551
|
+
return;
|
|
2552
|
+
this.open = true;
|
|
2553
|
+
this.cdr.markForCheck();
|
|
2554
|
+
const positionStrategy = this.overlay
|
|
2555
|
+
.position()
|
|
2556
|
+
.flexibleConnectedTo(triggerEl)
|
|
2557
|
+
.withPositions([
|
|
2558
|
+
{
|
|
2559
|
+
originX: 'start',
|
|
2560
|
+
originY: 'bottom',
|
|
2561
|
+
overlayX: 'start',
|
|
2562
|
+
overlayY: 'top',
|
|
2563
|
+
offsetY: 8
|
|
2564
|
+
},
|
|
2565
|
+
{
|
|
2566
|
+
originX: 'start',
|
|
2567
|
+
originY: 'top',
|
|
2568
|
+
overlayX: 'start',
|
|
2569
|
+
overlayY: 'bottom',
|
|
2570
|
+
offsetY: -8
|
|
2571
|
+
}
|
|
2572
|
+
])
|
|
2573
|
+
.withFlexibleDimensions(false)
|
|
2574
|
+
.withPush(true);
|
|
2575
|
+
// Resolve panelClass: overlayOptions.panelClass wins; otherwise map panelClassName.
|
|
2576
|
+
const resolvedPanelClass = this.overlayOptions?.panelClass
|
|
2577
|
+
?? (this.panelClassName ? ['block', this.panelClassName] : ['block']);
|
|
2578
|
+
this.overlayRef = this.overlay.create({
|
|
2579
|
+
positionStrategy,
|
|
2580
|
+
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
2581
|
+
// Consumer overrides are spread last — they win over every default above.
|
|
2582
|
+
...this.overlayOptions,
|
|
2583
|
+
// panelClass always overrides last: it already merges panelClassName + overlayOptions.
|
|
2584
|
+
panelClass: resolvedPanelClass
|
|
2585
|
+
});
|
|
2586
|
+
const portal = new TemplatePortal(this.panelTemplateRef, this.viewContainerRef);
|
|
2587
|
+
this.overlayRef.attach(portal);
|
|
2588
|
+
this.backdropSub = this.overlayRef.outsidePointerEvents().subscribe((event) => {
|
|
2589
|
+
const target = event.target;
|
|
2590
|
+
if (!triggerEl.contains(target)) {
|
|
2591
|
+
this.closePanel();
|
|
2592
|
+
}
|
|
2593
|
+
});
|
|
2594
|
+
this.cdr.markForCheck();
|
|
2595
|
+
}
|
|
2596
|
+
closePanel() {
|
|
2597
|
+
if (!this.overlayRef)
|
|
2598
|
+
return;
|
|
2599
|
+
this.open = false;
|
|
2600
|
+
this.destroyOverlay();
|
|
2601
|
+
this.cdr.markForCheck();
|
|
2602
|
+
}
|
|
2603
|
+
destroyOverlay() {
|
|
2604
|
+
if (this.backdropSub) {
|
|
2605
|
+
this.backdropSub.unsubscribe();
|
|
2606
|
+
this.backdropSub = null;
|
|
2607
|
+
}
|
|
2608
|
+
if (this.overlayRef) {
|
|
2609
|
+
this.overlayRef.dispose();
|
|
2610
|
+
this.overlayRef = null;
|
|
2504
2611
|
}
|
|
2505
2612
|
}
|
|
2506
2613
|
}
|
|
2507
|
-
PdmDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDropdownMenuComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2508
|
-
PdmDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDropdownMenuComponent, selector: "pdm-dropdown-menu", inputs: { triggerText: "triggerText", variant: "variant", items: "items", closeOnSelect: "closeOnSelect", panelClassName: "panelClassName",
|
|
2614
|
+
PdmDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDropdownMenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2615
|
+
PdmDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDropdownMenuComponent, selector: "pdm-dropdown-menu", inputs: { triggerText: "triggerText", variant: "variant", items: "items", closeOnSelect: "closeOnSelect", className: "className", panelClassName: "panelClassName", overlayOptions: "overlayOptions" }, outputs: { itemSelect: "itemSelect", itemsChange: "itemsChange" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<button\n #triggerEl\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n ]\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggle()\"\n>\n {{ triggerText }}\n</button>\n\n<ng-template #panelTemplate>\n <div\n class=\"min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n <ng-container *ngFor=\"let item of resolvedItems\">\n <div *ngIf=\"item.type === 'separator'\" class=\"-mx-1 my-1 h-px bg-muted\"></div>\n\n <div\n *ngIf=\"item.type === 'label'\"\n [ngClass]=\"['px-2 py-1.5 text-sm font-semibold text-foreground', item.inset ? 'pl-8' : '']\"\n >\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"[\n 'relative flex w-full appearance-none cursor-default select-none items-center gap-2 rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm text-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50',\n item.inset ? 'pl-8' : ''\n ]\"\n (click)=\"select(item)\"\n >\n <span class=\"inline-flex h-4 w-4 shrink-0 items-center justify-center\">\n <svg\n *ngIf=\"item.checked\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5 12.5L9.2 16.7L19 7\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <span *ngIf=\"item.radioSelected\" class=\"h-2 w-2 rounded-full bg-foreground\"></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{ item.shortcut }}</span>\n <span *ngIf=\"item.showChevron\" class=\"text-sm text-muted-foreground\">\u203A</span>\n </button>\n </ng-container>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2509
2616
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDropdownMenuComponent, decorators: [{
|
|
2510
2617
|
type: Component,
|
|
2511
|
-
args: [{ selector: 'pdm-dropdown-menu', changeDetection: ChangeDetectionStrategy.OnPush, template: "<
|
|
2512
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { triggerText: [{
|
|
2618
|
+
args: [{ selector: 'pdm-dropdown-menu', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n #triggerEl\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n ]\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggle()\"\n>\n {{ triggerText }}\n</button>\n\n<ng-template #panelTemplate>\n <div\n class=\"min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n <ng-container *ngFor=\"let item of resolvedItems\">\n <div *ngIf=\"item.type === 'separator'\" class=\"-mx-1 my-1 h-px bg-muted\"></div>\n\n <div\n *ngIf=\"item.type === 'label'\"\n [ngClass]=\"['px-2 py-1.5 text-sm font-semibold text-foreground', item.inset ? 'pl-8' : '']\"\n >\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"[\n 'relative flex w-full appearance-none cursor-default select-none items-center gap-2 rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm text-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50',\n item.inset ? 'pl-8' : ''\n ]\"\n (click)=\"select(item)\"\n >\n <span class=\"inline-flex h-4 w-4 shrink-0 items-center justify-center\">\n <svg\n *ngIf=\"item.checked\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5 12.5L9.2 16.7L19 7\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <span *ngIf=\"item.radioSelected\" class=\"h-2 w-2 rounded-full bg-foreground\"></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{ item.shortcut }}</span>\n <span *ngIf=\"item.showChevron\" class=\"text-sm text-muted-foreground\">\u203A</span>\n </button>\n </ng-container>\n </div>\n</ng-template>\n" }]
|
|
2619
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$2.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { triggerText: [{
|
|
2513
2620
|
type: Input
|
|
2514
2621
|
}], variant: [{
|
|
2515
2622
|
type: Input
|
|
@@ -2517,20 +2624,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
2517
2624
|
type: Input
|
|
2518
2625
|
}], closeOnSelect: [{
|
|
2519
2626
|
type: Input
|
|
2627
|
+
}], className: [{
|
|
2628
|
+
type: Input
|
|
2520
2629
|
}], panelClassName: [{
|
|
2521
2630
|
type: Input
|
|
2522
|
-
}],
|
|
2631
|
+
}], overlayOptions: [{
|
|
2523
2632
|
type: Input
|
|
2524
2633
|
}], itemSelect: [{
|
|
2525
2634
|
type: Output
|
|
2526
2635
|
}], itemsChange: [{
|
|
2527
2636
|
type: Output
|
|
2637
|
+
}], triggerRef: [{
|
|
2638
|
+
type: ViewChild,
|
|
2639
|
+
args: ['triggerEl']
|
|
2640
|
+
}], panelTemplateRef: [{
|
|
2641
|
+
type: ViewChild,
|
|
2642
|
+
args: ['panelTemplate']
|
|
2528
2643
|
}], onEsc: [{
|
|
2529
2644
|
type: HostListener,
|
|
2530
2645
|
args: ['document:keydown.escape']
|
|
2531
|
-
}], onDocumentClick: [{
|
|
2532
|
-
type: HostListener,
|
|
2533
|
-
args: ['document:click', ['$event']]
|
|
2534
2646
|
}] } });
|
|
2535
2647
|
|
|
2536
2648
|
class PdmDrawerComponent {
|
|
@@ -3391,7 +3503,9 @@ class PdmSelectComponent {
|
|
|
3391
3503
|
panelClass: ['block'],
|
|
3392
3504
|
positionStrategy,
|
|
3393
3505
|
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
3394
|
-
width: triggerEl.offsetWidth
|
|
3506
|
+
width: triggerEl.offsetWidth,
|
|
3507
|
+
// Consumer overrides are spread last — they win over every default above.
|
|
3508
|
+
...this.overlayOptions
|
|
3395
3509
|
});
|
|
3396
3510
|
const portal = new TemplatePortal(this.panelTemplateRef, this.viewContainerRef);
|
|
3397
3511
|
this.overlayRef.attach(portal);
|
|
@@ -3422,7 +3536,7 @@ class PdmSelectComponent {
|
|
|
3422
3536
|
}
|
|
3423
3537
|
}
|
|
3424
3538
|
PdmSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
3425
|
-
PdmSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmSelectComponent, selector: "pdm-select", inputs: { id: "id", value: "value", options: "options", disabled: "disabled", invalid: "invalid", className: "className", placeholder: "placeholder" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, queries: [{ propertyName: "projectedOptions", predicate: PdmSelectOptionDirective }], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <!-- Hidden native select kept for screen-reader / form fallback -->\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of resolvedOptions\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n\n <!-- Slot for content-projected pdm-select-option elements (hidden from layout) -->\n <span class=\"hidden\">\n <ng-content select=\"pdm-select-option\"></ng-content>\n </span>\n</div>\n\n<ng-template #panelTemplate>\n <div\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md max-h-96\"\n >\n <button\n *ngFor=\"let option of resolvedOptions\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3539
|
+
PdmSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmSelectComponent, selector: "pdm-select", inputs: { id: "id", value: "value", options: "options", disabled: "disabled", invalid: "invalid", className: "className", placeholder: "placeholder", overlayOptions: "overlayOptions" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, queries: [{ propertyName: "projectedOptions", predicate: PdmSelectOptionDirective }], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <!-- Hidden native select kept for screen-reader / form fallback -->\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of resolvedOptions\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n\n <!-- Slot for content-projected pdm-select-option elements (hidden from layout) -->\n <span class=\"hidden\">\n <ng-content select=\"pdm-select-option\"></ng-content>\n </span>\n</div>\n\n<ng-template #panelTemplate>\n <div\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md max-h-96\"\n >\n <button\n *ngFor=\"let option of resolvedOptions\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3426
3540
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSelectComponent, decorators: [{
|
|
3427
3541
|
type: Component,
|
|
3428
3542
|
args: [{ selector: 'pdm-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <!-- Hidden native select kept for screen-reader / form fallback -->\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of resolvedOptions\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n\n <!-- Slot for content-projected pdm-select-option elements (hidden from layout) -->\n <span class=\"hidden\">\n <ng-content select=\"pdm-select-option\"></ng-content>\n </span>\n</div>\n\n<ng-template #panelTemplate>\n <div\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md max-h-96\"\n >\n <button\n *ngFor=\"let option of resolvedOptions\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n</ng-template>\n" }]
|
|
@@ -3440,6 +3554,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
3440
3554
|
type: Input
|
|
3441
3555
|
}], placeholder: [{
|
|
3442
3556
|
type: Input
|
|
3557
|
+
}], overlayOptions: [{
|
|
3558
|
+
type: Input
|
|
3443
3559
|
}], valueChange: [{
|
|
3444
3560
|
type: Output
|
|
3445
3561
|
}], triggerRef: [{
|
|
@@ -3499,7 +3615,7 @@ class PdmPaginationComponent {
|
|
|
3499
3615
|
}
|
|
3500
3616
|
}
|
|
3501
3617
|
PdmPaginationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3502
|
-
PdmPaginationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmPaginationComponent, selector: "pdm-pagination", inputs: { page: "page", pageCount: "pageCount", maxVisible: "maxVisible", className: "className", rowsPerPageLabel: "rowsPerPageLabel", rowsPerPage: "rowsPerPage", rowsPerPageOptions: "rowsPerPageOptions" }, outputs: { pageChange: "pageChange", rowsPerPageChange: "rowsPerPageChange" }, ngImport: i0, template: "<nav\n aria-label=\"Pagination\"\n [ngClass]=\"[\n 'mx-auto flex w-full flex-wrap items-center justify-center gap-4',\n className,\n ]\"\n>\n <div class=\"flex items-center gap-3\" *ngIf=\"rowsPerPageOptions.length > 0\">\n <span class=\"text-sm font-medium text-foreground\">{{\n rowsPerPageLabel\n }}</span>\n <pdm-select\n [value]=\"rowsPerPageValue\"\n [options]=\"rowsPerPageSelectOptions\"\n [placeholder]=\"rowsPerPageValue\"\n className=\"w-[120px]\"\n (valueChange)=\"onRowsPerPageChangeValue($event)\"\n ></pdm-select>\n </div>\n\n <ul class=\"m-0 flex list-none items-center gap-1 p-0\">\n <li>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center gap-1 rounded-md border-0 bg-transparent px-2 text-sm text-foreground hover:bg-accent disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n [disabled]=\"page <= 1\"\n (click)=\"setPage(page - 1)\"\n >\n <pdm-icon name=\"chevron-left\" [size]=\"14\"></pdm-icon>\n Previous\n </button>\n </li>\n <li *ngFor=\"let pageNumber of visiblePages\">\n <ng-container *ngIf=\"pageNumber === 'ellipsis'; else pageButton\">\n <span\n class=\"inline-flex h-9 min-w-9 items-center justify-center px-2 text-sm text-muted-foreground\"\n >...</span\n >\n </ng-container>\n <ng-template #pageButton>\n <button\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-9 min-w-9 items-center justify-center rounded-md px-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n pageNumber === page\n ? 'appearance-none border border-border bg-muted text-foreground shadow-sm'\n : 'appearance-none border-0 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground',\n ]\"\n (click)=\"setPage(+pageNumber)\"\n >\n {{ pageNumber }}\n </button>\n </ng-template>\n </li>\n <li>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center gap-1 rounded-md border-0 bg-transparent px-2 text-sm text-foreground hover:bg-accent disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n [disabled]=\"page >= pageCount\"\n (click)=\"setPage(page + 1)\"\n >\n Next\n <pdm-icon name=\"chevron-right\" [size]=\"14\"></pdm-icon>\n </button>\n </li>\n </ul>\n</nav>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }, { kind: "component", type: PdmSelectComponent, selector: "pdm-select", inputs: ["id", "value", "options", "disabled", "invalid", "className", "placeholder"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3618
|
+
PdmPaginationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmPaginationComponent, selector: "pdm-pagination", inputs: { page: "page", pageCount: "pageCount", maxVisible: "maxVisible", className: "className", rowsPerPageLabel: "rowsPerPageLabel", rowsPerPage: "rowsPerPage", rowsPerPageOptions: "rowsPerPageOptions" }, outputs: { pageChange: "pageChange", rowsPerPageChange: "rowsPerPageChange" }, ngImport: i0, template: "<nav\n aria-label=\"Pagination\"\n [ngClass]=\"[\n 'mx-auto flex w-full flex-wrap items-center justify-center gap-4',\n className,\n ]\"\n>\n <div class=\"flex items-center gap-3\" *ngIf=\"rowsPerPageOptions.length > 0\">\n <span class=\"text-sm font-medium text-foreground\">{{\n rowsPerPageLabel\n }}</span>\n <pdm-select\n [value]=\"rowsPerPageValue\"\n [options]=\"rowsPerPageSelectOptions\"\n [placeholder]=\"rowsPerPageValue\"\n className=\"w-[120px]\"\n (valueChange)=\"onRowsPerPageChangeValue($event)\"\n ></pdm-select>\n </div>\n\n <ul class=\"m-0 flex list-none items-center gap-1 p-0\">\n <li>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center gap-1 rounded-md border-0 bg-transparent px-2 text-sm text-foreground hover:bg-accent disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n [disabled]=\"page <= 1\"\n (click)=\"setPage(page - 1)\"\n >\n <pdm-icon name=\"chevron-left\" [size]=\"14\"></pdm-icon>\n Previous\n </button>\n </li>\n <li *ngFor=\"let pageNumber of visiblePages\">\n <ng-container *ngIf=\"pageNumber === 'ellipsis'; else pageButton\">\n <span\n class=\"inline-flex h-9 min-w-9 items-center justify-center px-2 text-sm text-muted-foreground\"\n >...</span\n >\n </ng-container>\n <ng-template #pageButton>\n <button\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-9 min-w-9 items-center justify-center rounded-md px-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n pageNumber === page\n ? 'appearance-none border border-border bg-muted text-foreground shadow-sm'\n : 'appearance-none border-0 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground',\n ]\"\n (click)=\"setPage(+pageNumber)\"\n >\n {{ pageNumber }}\n </button>\n </ng-template>\n </li>\n <li>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center gap-1 rounded-md border-0 bg-transparent px-2 text-sm text-foreground hover:bg-accent disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n [disabled]=\"page >= pageCount\"\n (click)=\"setPage(page + 1)\"\n >\n Next\n <pdm-icon name=\"chevron-right\" [size]=\"14\"></pdm-icon>\n </button>\n </li>\n </ul>\n</nav>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }, { kind: "component", type: PdmSelectComponent, selector: "pdm-select", inputs: ["id", "value", "options", "disabled", "invalid", "className", "placeholder", "overlayOptions"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3503
3619
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmPaginationComponent, decorators: [{
|
|
3504
3620
|
type: Component,
|
|
3505
3621
|
args: [{ selector: 'pdm-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav\n aria-label=\"Pagination\"\n [ngClass]=\"[\n 'mx-auto flex w-full flex-wrap items-center justify-center gap-4',\n className,\n ]\"\n>\n <div class=\"flex items-center gap-3\" *ngIf=\"rowsPerPageOptions.length > 0\">\n <span class=\"text-sm font-medium text-foreground\">{{\n rowsPerPageLabel\n }}</span>\n <pdm-select\n [value]=\"rowsPerPageValue\"\n [options]=\"rowsPerPageSelectOptions\"\n [placeholder]=\"rowsPerPageValue\"\n className=\"w-[120px]\"\n (valueChange)=\"onRowsPerPageChangeValue($event)\"\n ></pdm-select>\n </div>\n\n <ul class=\"m-0 flex list-none items-center gap-1 p-0\">\n <li>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center gap-1 rounded-md border-0 bg-transparent px-2 text-sm text-foreground hover:bg-accent disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n [disabled]=\"page <= 1\"\n (click)=\"setPage(page - 1)\"\n >\n <pdm-icon name=\"chevron-left\" [size]=\"14\"></pdm-icon>\n Previous\n </button>\n </li>\n <li *ngFor=\"let pageNumber of visiblePages\">\n <ng-container *ngIf=\"pageNumber === 'ellipsis'; else pageButton\">\n <span\n class=\"inline-flex h-9 min-w-9 items-center justify-center px-2 text-sm text-muted-foreground\"\n >...</span\n >\n </ng-container>\n <ng-template #pageButton>\n <button\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-9 min-w-9 items-center justify-center rounded-md px-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n pageNumber === page\n ? 'appearance-none border border-border bg-muted text-foreground shadow-sm'\n : 'appearance-none border-0 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground',\n ]\"\n (click)=\"setPage(+pageNumber)\"\n >\n {{ pageNumber }}\n </button>\n </ng-template>\n </li>\n <li>\n <button\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center gap-1 rounded-md border-0 bg-transparent px-2 text-sm text-foreground hover:bg-accent disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n [disabled]=\"page >= pageCount\"\n (click)=\"setPage(page + 1)\"\n >\n Next\n <pdm-icon name=\"chevron-right\" [size]=\"14\"></pdm-icon>\n </button>\n </li>\n </ul>\n</nav>\n" }]
|