@pecb-ui/components 1.1.2 → 1.2.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 +556 -556
- package/fesm2022/pecb-ui-components.mjs +3826 -1945
- package/fesm2022/pecb-ui-components.mjs.map +1 -1
- package/index.d.ts +3937 -3
- package/package.json +6 -8
- package/esm2022/lib/components/button/button.component.mjs +0 -171
- package/esm2022/lib/components/card/card.component.mjs +0 -182
- package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
- package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
- package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
- package/esm2022/lib/components/input/input.component.mjs +0 -321
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
- package/esm2022/lib/components/radio/radio.component.mjs +0 -147
- package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
- package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
- package/esm2022/lib/components/status/status.component.mjs +0 -50
- package/esm2022/lib/components/tab/tab.component.mjs +0 -151
- package/esm2022/lib/components/table/table.component.mjs +0 -503
- package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
- package/esm2022/lib/pecb-components.module.mjs +0 -118
- package/esm2022/lib/services/loading.service.mjs +0 -182
- package/esm2022/lib/services/notification.service.mjs +0 -144
- package/esm2022/lib/services/theme.service.mjs +0 -232
- package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
- package/esm2022/lib/shared/types/common.types.mjs +0 -6
- package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
- package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
- package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
- package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
- package/esm2022/pecb-ui-components.mjs +0 -5
- package/esm2022/public-api.mjs +0 -53
- package/lib/components/button/button.component.d.ts +0 -130
- package/lib/components/card/card.component.d.ts +0 -140
- package/lib/components/checkbox/checkbox.component.d.ts +0 -74
- package/lib/components/datepicker/datepicker.component.d.ts +0 -155
- package/lib/components/dropdown/dropdown.component.d.ts +0 -144
- package/lib/components/input/input.component.d.ts +0 -215
- package/lib/components/pagination/pagination.component.d.ts +0 -53
- package/lib/components/radio/radio.component.d.ts +0 -93
- package/lib/components/right-modal/right-modal.component.d.ts +0 -137
- package/lib/components/sidebar/sidebar.component.d.ts +0 -97
- package/lib/components/status/status.component.d.ts +0 -19
- package/lib/components/tab/tab.component.d.ts +0 -102
- package/lib/components/table/table.component.d.ts +0 -403
- package/lib/components/toggle/toggle.component.d.ts +0 -74
- package/lib/pecb-components.module.d.ts +0 -37
- package/lib/services/loading.service.d.ts +0 -129
- package/lib/services/notification.service.d.ts +0 -136
- package/lib/services/theme.service.d.ts +0 -142
- package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
- package/lib/shared/types/common.types.d.ts +0 -86
- package/lib/shared/utils/accessibility.utils.d.ts +0 -167
- package/lib/shared/utils/dom.utils.d.ts +0 -108
- package/lib/shared/utils/error.utils.d.ts +0 -191
- package/lib/shared/utils/string.utils.d.ts +0 -144
- package/public-api.d.ts +0 -24
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
-
import { generateUniqueId } from '../../shared/utils/dom.utils';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common";
|
|
7
|
-
/**
|
|
8
|
-
* A professional checkbox component with label and description support.
|
|
9
|
-
* Fully accessible with WCAG 2.1 AA compliance and reactive forms support.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```html
|
|
13
|
-
* <pecb-checkbox
|
|
14
|
-
* label="Accept terms"
|
|
15
|
-
* description="I agree to the terms and conditions"
|
|
16
|
-
* [(ngModel)]="accepted"
|
|
17
|
-
* ></pecb-checkbox>
|
|
18
|
-
* ```
|
|
19
|
-
*
|
|
20
|
-
* @publicApi
|
|
21
|
-
*/
|
|
22
|
-
export class CheckboxComponent {
|
|
23
|
-
constructor(cdr) {
|
|
24
|
-
this.cdr = cdr;
|
|
25
|
-
/**
|
|
26
|
-
* Unique ID for the checkbox element
|
|
27
|
-
*/
|
|
28
|
-
this.id = generateUniqueId('checkbox');
|
|
29
|
-
/**
|
|
30
|
-
* Position of the label relative to the checkbox control.
|
|
31
|
-
* 'right' (default): [checkbox] Title Description
|
|
32
|
-
* 'left': Title Description [checkbox]
|
|
33
|
-
*/
|
|
34
|
-
this.labelPosition = 'right';
|
|
35
|
-
/**
|
|
36
|
-
* Whether the checkbox is disabled
|
|
37
|
-
*/
|
|
38
|
-
this.disabled = false;
|
|
39
|
-
/**
|
|
40
|
-
* Event emitted when checked state changes
|
|
41
|
-
*/
|
|
42
|
-
this.checkedChange = new EventEmitter();
|
|
43
|
-
// Internal state
|
|
44
|
-
this.checked = false;
|
|
45
|
-
// ControlValueAccessor
|
|
46
|
-
this.onChange = () => { };
|
|
47
|
-
this.onTouched = () => { };
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Get CSS classes for the checkbox wrapper
|
|
51
|
-
*/
|
|
52
|
-
get wrapperClasses() {
|
|
53
|
-
return [
|
|
54
|
-
'pecb-checkbox',
|
|
55
|
-
this.disabled ? 'pecb-checkbox--disabled' : '',
|
|
56
|
-
this.checked ? 'pecb-checkbox--checked' : '',
|
|
57
|
-
this.labelPosition === 'left' ? 'pecb-checkbox--label-left' : ''
|
|
58
|
-
].filter(Boolean);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Handle checkbox change
|
|
62
|
-
*/
|
|
63
|
-
onCheckboxChange(event) {
|
|
64
|
-
if (this.disabled)
|
|
65
|
-
return;
|
|
66
|
-
const checked = event.target.checked;
|
|
67
|
-
this.checked = checked;
|
|
68
|
-
this.onChange(this.checked);
|
|
69
|
-
this.checkedChange.emit(this.checked);
|
|
70
|
-
this.cdr.markForCheck();
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Handle blur event
|
|
74
|
-
*/
|
|
75
|
-
onBlur() {
|
|
76
|
-
this.onTouched();
|
|
77
|
-
}
|
|
78
|
-
// ControlValueAccessor implementation
|
|
79
|
-
writeValue(value) {
|
|
80
|
-
this.checked = !!value;
|
|
81
|
-
this.cdr.markForCheck();
|
|
82
|
-
}
|
|
83
|
-
registerOnChange(fn) {
|
|
84
|
-
this.onChange = fn;
|
|
85
|
-
}
|
|
86
|
-
registerOnTouched(fn) {
|
|
87
|
-
this.onTouched = fn;
|
|
88
|
-
}
|
|
89
|
-
setDisabledState(isDisabled) {
|
|
90
|
-
this.disabled = isDisabled;
|
|
91
|
-
this.cdr.markForCheck();
|
|
92
|
-
}
|
|
93
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
94
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CheckboxComponent, isStandalone: true, selector: "pecb-checkbox", inputs: { id: "id", name: "name", label: "label", description: "description", labelPosition: "labelPosition", disabled: "disabled" }, outputs: { checkedChange: "checkedChange" }, providers: [
|
|
95
|
-
{
|
|
96
|
-
provide: NG_VALUE_ACCESSOR,
|
|
97
|
-
useExisting: forwardRef(() => CheckboxComponent),
|
|
98
|
-
multi: true
|
|
99
|
-
}
|
|
100
|
-
], ngImport: i0, template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-checkbox__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"checkbox\"\r\n class=\"pecb-checkbox__input\"\r\n [name]=\"name\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-checkbox__control\">\r\n <svg class=\"pecb-checkbox__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n", styles: [".pecb-checkbox{position:relative;display:inline-block}.pecb-checkbox__label{display:flex;align-items:flex-start;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.pecb-checkbox__input{position:absolute;opacity:0;width:0;height:0;margin:0;padding:0;pointer-events:none}.pecb-checkbox__control{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin-top:2px;border:2px solid #c2c2c2;border-radius:4px;background-color:#fff;transition-property:border-color,background-color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-checkbox__icon{color:#fff;opacity:0;transform:scale(0);transition-property:opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-checkbox__content{display:flex;flex-direction:column;gap:6px;flex:1}.pecb-checkbox__text{font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;font-weight:500;color:#313131;line-height:1.5}.pecb-checkbox__description{font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:12px;font-weight:400;color:#919191;line-height:1.5}.pecb-checkbox:not(.pecb-checkbox--disabled) .pecb-checkbox__label:hover .pecb-checkbox__control{border-color:#212427}.pecb-checkbox__input:focus-visible+.pecb-checkbox__control{outline:2px solid #212427;outline-offset:2px}.pecb-checkbox--checked .pecb-checkbox__control{border-color:#212427;background-color:#212427}.pecb-checkbox--checked .pecb-checkbox__icon{opacity:1;transform:scale(1)}.pecb-checkbox--disabled .pecb-checkbox__label{cursor:not-allowed}.pecb-checkbox--disabled .pecb-checkbox__control{border-color:#ececec;background-color:#f4f4f4}.pecb-checkbox--disabled.pecb-checkbox--checked .pecb-checkbox__control{background-color:#c2c2c2;border-color:#c2c2c2}.pecb-checkbox--disabled .pecb-checkbox__text{color:#c2c2c2}.pecb-checkbox--disabled .pecb-checkbox__description{color:#ececec}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
101
|
-
}
|
|
102
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CheckboxComponent, decorators: [{
|
|
103
|
-
type: Component,
|
|
104
|
-
args: [{ selector: 'pecb-checkbox', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
105
|
-
{
|
|
106
|
-
provide: NG_VALUE_ACCESSOR,
|
|
107
|
-
useExisting: forwardRef(() => CheckboxComponent),
|
|
108
|
-
multi: true
|
|
109
|
-
}
|
|
110
|
-
], template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-checkbox__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"checkbox\"\r\n class=\"pecb-checkbox__input\"\r\n [name]=\"name\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-checkbox__control\">\r\n <svg class=\"pecb-checkbox__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n", styles: [".pecb-checkbox{position:relative;display:inline-block}.pecb-checkbox__label{display:flex;align-items:flex-start;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.pecb-checkbox__input{position:absolute;opacity:0;width:0;height:0;margin:0;padding:0;pointer-events:none}.pecb-checkbox__control{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin-top:2px;border:2px solid #c2c2c2;border-radius:4px;background-color:#fff;transition-property:border-color,background-color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-checkbox__icon{color:#fff;opacity:0;transform:scale(0);transition-property:opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-checkbox__content{display:flex;flex-direction:column;gap:6px;flex:1}.pecb-checkbox__text{font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;font-weight:500;color:#313131;line-height:1.5}.pecb-checkbox__description{font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:12px;font-weight:400;color:#919191;line-height:1.5}.pecb-checkbox:not(.pecb-checkbox--disabled) .pecb-checkbox__label:hover .pecb-checkbox__control{border-color:#212427}.pecb-checkbox__input:focus-visible+.pecb-checkbox__control{outline:2px solid #212427;outline-offset:2px}.pecb-checkbox--checked .pecb-checkbox__control{border-color:#212427;background-color:#212427}.pecb-checkbox--checked .pecb-checkbox__icon{opacity:1;transform:scale(1)}.pecb-checkbox--disabled .pecb-checkbox__label{cursor:not-allowed}.pecb-checkbox--disabled .pecb-checkbox__control{border-color:#ececec;background-color:#f4f4f4}.pecb-checkbox--disabled.pecb-checkbox--checked .pecb-checkbox__control{background-color:#c2c2c2;border-color:#c2c2c2}.pecb-checkbox--disabled .pecb-checkbox__text{color:#c2c2c2}.pecb-checkbox--disabled .pecb-checkbox__description{color:#ececec}\n"] }]
|
|
111
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { id: [{
|
|
112
|
-
type: Input
|
|
113
|
-
}], name: [{
|
|
114
|
-
type: Input
|
|
115
|
-
}], label: [{
|
|
116
|
-
type: Input
|
|
117
|
-
}], description: [{
|
|
118
|
-
type: Input
|
|
119
|
-
}], labelPosition: [{
|
|
120
|
-
type: Input
|
|
121
|
-
}], disabled: [{
|
|
122
|
-
type: Input
|
|
123
|
-
}], checkedChange: [{
|
|
124
|
-
type: Output
|
|
125
|
-
}] } });
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsVUFBVSxFQUVYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7OztBQUloRTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQWdCSCxNQUFNLE9BQU8saUJBQWlCO0lBNkM1QixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTVDMUM7O1dBRUc7UUFDTSxPQUFFLEdBQVcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFpQm5EOzs7O1dBSUc7UUFDTSxrQkFBYSxHQUEwQixPQUFPLENBQUM7UUFFeEQ7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXRELGlCQUFpQjtRQUNqQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLHVCQUF1QjtRQUNmLGFBQVEsR0FBNkIsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQzlDLGNBQVMsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFSSxDQUFDO0lBRTlDOztPQUVHO0lBQ0gsSUFBSSxjQUFjO1FBQ2hCLE9BQU87WUFDTCxlQUFlO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ2pFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLEtBQVk7UUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFMUIsTUFBTSxPQUFPLEdBQUksS0FBSyxDQUFDLE1BQTJCLENBQUMsT0FBTyxDQUFDO1FBQzNELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxVQUFVLENBQUMsS0FBYztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBNEI7UUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQWM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzsrR0FoR1UsaUJBQWlCO21HQUFqQixpQkFBaUIsK09BUmpCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDBCQzNDSCx3K0NBNkJBLHVpRURJWSxZQUFZOzs0RkFZWCxpQkFBaUI7a0JBZjdCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFHTix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtzRkFNUSxFQUFFO3NCQUFWLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQU9HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBmb3J3YXJkUmVmLFxyXG4gIENoYW5nZURldGVjdG9yUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kb20udXRpbHMnO1xyXG5cclxuZXhwb3J0IHR5cGUgQ2hlY2tib3hMYWJlbFBvc2l0aW9uID0gJ3JpZ2h0JyB8ICdsZWZ0JztcclxuXHJcbi8qKlxyXG4gKiBBIHByb2Zlc3Npb25hbCBjaGVja2JveCBjb21wb25lbnQgd2l0aCBsYWJlbCBhbmQgZGVzY3JpcHRpb24gc3VwcG9ydC5cclxuICogRnVsbHkgYWNjZXNzaWJsZSB3aXRoIFdDQUcgMi4xIEFBIGNvbXBsaWFuY2UgYW5kIHJlYWN0aXZlIGZvcm1zIHN1cHBvcnQuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHBlY2ItY2hlY2tib3hcclxuICogICBsYWJlbD1cIkFjY2VwdCB0ZXJtc1wiXHJcbiAqICAgZGVzY3JpcHRpb249XCJJIGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1wiXHJcbiAqICAgWyhuZ01vZGVsKV09XCJhY2NlcHRlZFwiXHJcbiAqID48L3BlY2ItY2hlY2tib3g+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcHVibGljQXBpXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BlY2ItY2hlY2tib3gnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrYm94LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jaGVja2JveC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2hlY2tib3hDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENoZWNrYm94Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIC8qKlxyXG4gICAqIFVuaXF1ZSBJRCBmb3IgdGhlIGNoZWNrYm94IGVsZW1lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gZ2VuZXJhdGVVbmlxdWVJZCgnY2hlY2tib3gnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTmFtZSBhdHRyaWJ1dGUgZm9yIHRoZSBjaGVja2JveFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG5hbWU/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIExhYmVsIHRleHQgdG8gZGlzcGxheVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBEZXNjcmlwdGlvbiB0ZXh0IHRvIGRpc3BsYXkgYmVsb3cgbGFiZWxcclxuICAgKi9cclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogUG9zaXRpb24gb2YgdGhlIGxhYmVsIHJlbGF0aXZlIHRvIHRoZSBjaGVja2JveCBjb250cm9sLlxyXG4gICAqICdyaWdodCcgKGRlZmF1bHQpOiBbY2hlY2tib3hdIFRpdGxlIERlc2NyaXB0aW9uXHJcbiAgICogJ2xlZnQnOiBUaXRsZSBEZXNjcmlwdGlvbiBbY2hlY2tib3hdXHJcbiAgICovXHJcbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogQ2hlY2tib3hMYWJlbFBvc2l0aW9uID0gJ3JpZ2h0JztcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgY2hlY2tib3ggaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gY2hlY2tlZCBzdGF0ZSBjaGFuZ2VzXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGNoZWNrZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIC8vIEludGVybmFsIHN0YXRlXHJcbiAgY2hlY2tlZCA9IGZhbHNlO1xyXG5cclxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IENTUyBjbGFzc2VzIGZvciB0aGUgY2hlY2tib3ggd3JhcHBlclxyXG4gICAqL1xyXG4gIGdldCB3cmFwcGVyQ2xhc3NlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAncGVjYi1jaGVja2JveCcsXHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPyAncGVjYi1jaGVja2JveC0tZGlzYWJsZWQnIDogJycsXHJcbiAgICAgIHRoaXMuY2hlY2tlZCA/ICdwZWNiLWNoZWNrYm94LS1jaGVja2VkJyA6ICcnLFxyXG4gICAgICB0aGlzLmxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyA/ICdwZWNiLWNoZWNrYm94LS1sYWJlbC1sZWZ0JyA6ICcnXHJcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBjaGVja2JveCBjaGFuZ2VcclxuICAgKi9cclxuICBvbkNoZWNrYm94Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcclxuICAgIHRoaXMub25DaGFuZ2UodGhpcy5jaGVja2VkKTtcclxuICAgIHRoaXMuY2hlY2tlZENoYW5nZS5lbWl0KHRoaXMuY2hlY2tlZCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBibHVyIGV2ZW50XHJcbiAgICovXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5jaGVja2VkID0gISF2YWx1ZTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBbY2xhc3NdPVwid3JhcHBlckNsYXNzZXMuam9pbignICcpXCI+XHJcbiAgPGxhYmVsIFthdHRyLmZvcl09XCJpZFwiIGNsYXNzPVwicGVjYi1jaGVja2JveF9fbGFiZWxcIj5cclxuICAgIDxpbnB1dFxyXG4gICAgICBbaWRdPVwiaWRcIlxyXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICBjbGFzcz1cInBlY2ItY2hlY2tib3hfX2lucHV0XCJcclxuICAgICAgW25hbWVdPVwibmFtZVwiXHJcbiAgICAgIFtjaGVja2VkXT1cImNoZWNrZWRcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsXCJcclxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJkZXNjcmlwdGlvbiA/IGlkICsgJy1kZXNjcmlwdGlvbicgOiBudWxsXCJcclxuICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXHJcbiAgICAvPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgJiYgKGxhYmVsIHx8IGRlc2NyaXB0aW9uKVwiIGNsYXNzPVwicGVjYi1jaGVja2JveF9fY29udGVudFwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImxhYmVsXCIgY2xhc3M9XCJwZWNiLWNoZWNrYm94X190ZXh0XCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBbaWRdPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiIGNsYXNzPVwicGVjYi1jaGVja2JveF9fZGVzY3JpcHRpb25cIj57eyBkZXNjcmlwdGlvbiB9fTwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxzcGFuIGNsYXNzPVwicGVjYi1jaGVja2JveF9fY29udHJvbFwiPlxyXG4gICAgICA8c3ZnIGNsYXNzPVwicGVjYi1jaGVja2JveF9faWNvblwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJsYWJlbFBvc2l0aW9uID09PSAncmlnaHQnICYmIChsYWJlbCB8fCBkZXNjcmlwdGlvbilcIiBjbGFzcz1cInBlY2ItY2hlY2tib3hfX2NvbnRlbnRcIj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwicGVjYi1jaGVja2JveF9fdGV4dFwiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImRlc2NyaXB0aW9uXCIgW2lkXT1cImlkICsgJy1kZXNjcmlwdGlvbidcIiBjbGFzcz1cInBlY2ItY2hlY2tib3hfX2Rlc2NyaXB0aW9uXCI+e3sgZGVzY3JpcHRpb24gfX08L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9sYWJlbD5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, HostListener, ViewChild, forwardRef } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
-
import { generateUniqueId } from '../../shared/utils/dom.utils';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common";
|
|
7
|
-
/**
|
|
8
|
-
* A professional datepicker component with calendar dropdown.
|
|
9
|
-
* Fully accessible with WCAG 2.1 AA compliance and reactive forms support.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```html
|
|
13
|
-
* <pecb-datepicker
|
|
14
|
-
* label="Date"
|
|
15
|
-
* placeholder="Choose Date"
|
|
16
|
-
* [(ngModel)]="selectedDate"
|
|
17
|
-
* ></pecb-datepicker>
|
|
18
|
-
*
|
|
19
|
-
* <!-- With custom configuration -->
|
|
20
|
-
* <pecb-datepicker
|
|
21
|
-
* label="Birth Date"
|
|
22
|
-
* [required]="true"
|
|
23
|
-
* size="lg"
|
|
24
|
-
* (dateChange)="handleDateChange($event)"
|
|
25
|
-
* ></pecb-datepicker>
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* @publicApi
|
|
29
|
-
*/
|
|
30
|
-
export class DatepickerComponent {
|
|
31
|
-
constructor(elementRef, cdr) {
|
|
32
|
-
this.elementRef = elementRef;
|
|
33
|
-
this.cdr = cdr;
|
|
34
|
-
/**
|
|
35
|
-
* Unique ID for the datepicker element
|
|
36
|
-
*/
|
|
37
|
-
this.id = generateUniqueId('datepicker');
|
|
38
|
-
/**
|
|
39
|
-
* Placeholder text for the input
|
|
40
|
-
*/
|
|
41
|
-
this.placeholder = 'Choose Date';
|
|
42
|
-
/**
|
|
43
|
-
* The size of the datepicker
|
|
44
|
-
*/
|
|
45
|
-
this.size = 'md';
|
|
46
|
-
/**
|
|
47
|
-
* Whether the field is required
|
|
48
|
-
*/
|
|
49
|
-
this.required = false;
|
|
50
|
-
/**
|
|
51
|
-
* Whether the datepicker is disabled
|
|
52
|
-
*/
|
|
53
|
-
this.disabled = false;
|
|
54
|
-
/**
|
|
55
|
-
* Date format for display (default: MM/DD/YYYY)
|
|
56
|
-
*/
|
|
57
|
-
this.dateFormat = 'MM/DD/YYYY';
|
|
58
|
-
/**
|
|
59
|
-
* Event emitted when date is selected
|
|
60
|
-
*/
|
|
61
|
-
this.dateChange = new EventEmitter();
|
|
62
|
-
/**
|
|
63
|
-
* Event emitted when calendar is opened
|
|
64
|
-
*/
|
|
65
|
-
this.opened = new EventEmitter();
|
|
66
|
-
/**
|
|
67
|
-
* Event emitted when calendar is closed
|
|
68
|
-
*/
|
|
69
|
-
this.closed = new EventEmitter();
|
|
70
|
-
// Internal state
|
|
71
|
-
this.selectedDate = null;
|
|
72
|
-
this.isCalendarOpen = false;
|
|
73
|
-
this.currentMonth = new Date();
|
|
74
|
-
this.calendarDays = [];
|
|
75
|
-
this.weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
|
|
76
|
-
this.monthNames = [
|
|
77
|
-
'January', 'February', 'March', 'April', 'May', 'June',
|
|
78
|
-
'July', 'August', 'September', 'October', 'November', 'December'
|
|
79
|
-
];
|
|
80
|
-
// ControlValueAccessor
|
|
81
|
-
this.onChange = () => { };
|
|
82
|
-
this.onTouched = () => { };
|
|
83
|
-
this.generateCalendar();
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Get CSS classes for the datepicker wrapper
|
|
87
|
-
*/
|
|
88
|
-
get wrapperClasses() {
|
|
89
|
-
return [
|
|
90
|
-
'pecb-datepicker',
|
|
91
|
-
`pecb-datepicker--${this.size}`,
|
|
92
|
-
this.disabled ? 'pecb-datepicker--disabled' : '',
|
|
93
|
-
this.isCalendarOpen ? 'pecb-datepicker--open' : '',
|
|
94
|
-
this.selectedDate ? 'pecb-datepicker--has-value' : ''
|
|
95
|
-
].filter(Boolean);
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Get formatted display value
|
|
99
|
-
*/
|
|
100
|
-
get displayValue() {
|
|
101
|
-
if (!this.selectedDate)
|
|
102
|
-
return '';
|
|
103
|
-
return this.formatDate(this.selectedDate);
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Get current month and year display
|
|
107
|
-
*/
|
|
108
|
-
get monthYearDisplay() {
|
|
109
|
-
return `${this.monthNames[this.currentMonth.getMonth()]} ${this.currentMonth.getFullYear()}`;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Toggle calendar dropdown
|
|
113
|
-
*/
|
|
114
|
-
toggleCalendar() {
|
|
115
|
-
if (this.disabled)
|
|
116
|
-
return;
|
|
117
|
-
this.isCalendarOpen = !this.isCalendarOpen;
|
|
118
|
-
if (this.isCalendarOpen) {
|
|
119
|
-
this.opened.emit();
|
|
120
|
-
// Set current month to selected date's month or current month
|
|
121
|
-
if (this.selectedDate) {
|
|
122
|
-
this.currentMonth = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth(), 1);
|
|
123
|
-
}
|
|
124
|
-
this.generateCalendar();
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
this.closed.emit();
|
|
128
|
-
}
|
|
129
|
-
this.cdr.markForCheck();
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Close calendar
|
|
133
|
-
*/
|
|
134
|
-
closeCalendar() {
|
|
135
|
-
if (this.isCalendarOpen) {
|
|
136
|
-
this.isCalendarOpen = false;
|
|
137
|
-
this.closed.emit();
|
|
138
|
-
this.cdr.markForCheck();
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Navigate to previous month
|
|
143
|
-
*/
|
|
144
|
-
previousMonth() {
|
|
145
|
-
this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() - 1, 1);
|
|
146
|
-
this.generateCalendar();
|
|
147
|
-
this.cdr.markForCheck();
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Navigate to next month
|
|
151
|
-
*/
|
|
152
|
-
nextMonth() {
|
|
153
|
-
this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() + 1, 1);
|
|
154
|
-
this.generateCalendar();
|
|
155
|
-
this.cdr.markForCheck();
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Select a date
|
|
159
|
-
*/
|
|
160
|
-
selectDate(day) {
|
|
161
|
-
if (this.disabled)
|
|
162
|
-
return;
|
|
163
|
-
if (!day.isCurrentMonth)
|
|
164
|
-
return;
|
|
165
|
-
if (this.minDate && day.date < this.minDate)
|
|
166
|
-
return;
|
|
167
|
-
if (this.maxDate && day.date > this.maxDate)
|
|
168
|
-
return;
|
|
169
|
-
this.selectedDate = day.date;
|
|
170
|
-
this.onChange(this.selectedDate);
|
|
171
|
-
this.onTouched();
|
|
172
|
-
this.dateChange.emit(this.selectedDate);
|
|
173
|
-
this.generateCalendar();
|
|
174
|
-
this.closeCalendar();
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Generate calendar days
|
|
178
|
-
*/
|
|
179
|
-
generateCalendar() {
|
|
180
|
-
const year = this.currentMonth.getFullYear();
|
|
181
|
-
const month = this.currentMonth.getMonth();
|
|
182
|
-
// First day of the month
|
|
183
|
-
const firstDay = new Date(year, month, 1);
|
|
184
|
-
const startingDayOfWeek = firstDay.getDay();
|
|
185
|
-
// Last day of the month
|
|
186
|
-
const lastDay = new Date(year, month + 1, 0);
|
|
187
|
-
const daysInMonth = lastDay.getDate();
|
|
188
|
-
// Previous month
|
|
189
|
-
const prevMonth = new Date(year, month, 0);
|
|
190
|
-
const daysInPrevMonth = prevMonth.getDate();
|
|
191
|
-
const days = [];
|
|
192
|
-
const today = new Date();
|
|
193
|
-
today.setHours(0, 0, 0, 0);
|
|
194
|
-
// Previous month days
|
|
195
|
-
for (let i = startingDayOfWeek - 1; i >= 0; i--) {
|
|
196
|
-
const date = new Date(year, month - 1, daysInPrevMonth - i);
|
|
197
|
-
days.push({
|
|
198
|
-
date,
|
|
199
|
-
day: daysInPrevMonth - i,
|
|
200
|
-
isCurrentMonth: false,
|
|
201
|
-
isSelected: false,
|
|
202
|
-
isToday: false
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
// Current month days
|
|
206
|
-
for (let day = 1; day <= daysInMonth; day++) {
|
|
207
|
-
const date = new Date(year, month, day);
|
|
208
|
-
date.setHours(0, 0, 0, 0);
|
|
209
|
-
const isSelected = this.selectedDate ?
|
|
210
|
-
date.getTime() === new Date(this.selectedDate).setHours(0, 0, 0, 0) :
|
|
211
|
-
false;
|
|
212
|
-
const isToday = date.getTime() === today.getTime();
|
|
213
|
-
days.push({
|
|
214
|
-
date,
|
|
215
|
-
day,
|
|
216
|
-
isCurrentMonth: true,
|
|
217
|
-
isSelected,
|
|
218
|
-
isToday
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
// Next month days
|
|
222
|
-
const remainingDays = 42 - days.length; // 6 rows * 7 days
|
|
223
|
-
for (let day = 1; day <= remainingDays; day++) {
|
|
224
|
-
const date = new Date(year, month + 1, day);
|
|
225
|
-
days.push({
|
|
226
|
-
date,
|
|
227
|
-
day,
|
|
228
|
-
isCurrentMonth: false,
|
|
229
|
-
isSelected: false,
|
|
230
|
-
isToday: false
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
this.calendarDays = days;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Format date for display
|
|
237
|
-
*/
|
|
238
|
-
formatDate(date) {
|
|
239
|
-
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
240
|
-
const day = String(date.getDate()).padStart(2, '0');
|
|
241
|
-
const year = date.getFullYear();
|
|
242
|
-
return this.dateFormat
|
|
243
|
-
.replace('MM', month)
|
|
244
|
-
.replace('DD', day)
|
|
245
|
-
.replace('YYYY', String(year));
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Listen for clicks outside to close calendar
|
|
249
|
-
*/
|
|
250
|
-
onDocumentClick(event) {
|
|
251
|
-
if (!this.elementRef.nativeElement.contains(event.target)) {
|
|
252
|
-
this.closeCalendar();
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Handle keyboard navigation
|
|
257
|
-
*/
|
|
258
|
-
onKeyDown(event) {
|
|
259
|
-
if (event.key === 'Enter' || event.key === ' ') {
|
|
260
|
-
event.preventDefault();
|
|
261
|
-
this.toggleCalendar();
|
|
262
|
-
}
|
|
263
|
-
else if (event.key === 'Escape') {
|
|
264
|
-
this.closeCalendar();
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Clear selected date
|
|
269
|
-
*/
|
|
270
|
-
clearDate(event) {
|
|
271
|
-
event.stopPropagation();
|
|
272
|
-
if (this.disabled)
|
|
273
|
-
return;
|
|
274
|
-
this.selectedDate = null;
|
|
275
|
-
this.onChange(null);
|
|
276
|
-
this.onTouched();
|
|
277
|
-
this.dateChange.emit(null);
|
|
278
|
-
this.generateCalendar();
|
|
279
|
-
this.cdr.markForCheck();
|
|
280
|
-
}
|
|
281
|
-
// ControlValueAccessor implementation
|
|
282
|
-
writeValue(value) {
|
|
283
|
-
this.selectedDate = value;
|
|
284
|
-
if (value) {
|
|
285
|
-
this.currentMonth = new Date(value.getFullYear(), value.getMonth(), 1);
|
|
286
|
-
}
|
|
287
|
-
this.generateCalendar();
|
|
288
|
-
this.cdr.markForCheck();
|
|
289
|
-
}
|
|
290
|
-
registerOnChange(fn) {
|
|
291
|
-
this.onChange = fn;
|
|
292
|
-
}
|
|
293
|
-
registerOnTouched(fn) {
|
|
294
|
-
this.onTouched = fn;
|
|
295
|
-
}
|
|
296
|
-
setDisabledState(isDisabled) {
|
|
297
|
-
this.disabled = isDisabled;
|
|
298
|
-
this.cdr.markForCheck();
|
|
299
|
-
}
|
|
300
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DatepickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
301
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DatepickerComponent, isStandalone: true, selector: "pecb-datepicker", inputs: { id: "id", label: "label", placeholder: "placeholder", size: "size", required: "required", disabled: "disabled", dateFormat: "dateFormat", minDate: "minDate", maxDate: "maxDate" }, outputs: { dateChange: "dateChange", opened: "opened", closed: "closed" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
|
|
302
|
-
{
|
|
303
|
-
provide: NG_VALUE_ACCESSOR,
|
|
304
|
-
useExisting: forwardRef(() => DatepickerComponent),
|
|
305
|
-
multi: true
|
|
306
|
-
}
|
|
307
|
-
], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Field -->\r\n <div class=\"pecb-datepicker__input-wrapper\">\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n type=\"text\"\r\n class=\"pecb-datepicker__input\"\r\n [value]=\"displayValue\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-datepicker__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-datepicker__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button (shown when has value) -->\r\n <button\r\n *ngIf=\"selectedDate && !disabled\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--clear\"\r\n [attr.aria-label]=\"'Clear date'\"\r\n (click)=\"clearDate($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon (Calendar) -->\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--right\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Open calendar'\"\r\n (click)=\"toggleCalendar()\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11 2V1H10V2H6V1H5V2H2V15H14V2H11ZM13 14H3V6H13V14ZM13 5H3V3H5V4H6V3H10V4H11V3H13V5Z\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Dropdown -->\r\n <div\r\n *ngIf=\"isCalendarOpen\"\r\n class=\"pecb-datepicker__calendar\"\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n [attr.aria-label]=\"'Choose date'\"\r\n >\r\n <!-- Calendar Header -->\r\n <div class=\"pecb-datepicker__calendar-header\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Previous month\"\r\n (click)=\"previousMonth()\"\r\n >\r\n \u00AB\r\n </button>\r\n\r\n <span class=\"pecb-datepicker__month-year\">{{ monthYearDisplay }}</span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Next month\"\r\n (click)=\"nextMonth()\"\r\n >\r\n \u00BB\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Grid -->\r\n <div class=\"pecb-datepicker__calendar-body\">\r\n <!-- Week Days -->\r\n <div class=\"pecb-datepicker__weekdays\">\r\n <div\r\n *ngFor=\"let day of weekDays\"\r\n class=\"pecb-datepicker__weekday\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"pecb-datepicker__days\">\r\n <button\r\n *ngFor=\"let day of calendarDays\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__day\"\r\n [class.pecb-datepicker__day--other-month]=\"!day.isCurrentMonth\"\r\n [class.pecb-datepicker__day--selected]=\"day.isSelected\"\r\n [class.pecb-datepicker__day--today]=\"day.isToday\"\r\n [attr.aria-label]=\"day.date.toDateString()\"\r\n [attr.aria-selected]=\"day.isSelected\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day.day }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".pecb-datepicker{position:relative;display:flex;flex-direction:column;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%}.pecb-datepicker__input-wrapper{position:relative;display:flex;align-items:center}.pecb-datepicker__label{position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:14px;font-weight:400;color:#919191;background-color:transparent;padding:0 4px;pointer-events:none;z-index:1;transition:top .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),font-size .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),font-weight .2s cubic-bezier(.4,0,.2,1)}.pecb-datepicker__required{color:#dc3545;margin-left:2px}.pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--has-value .pecb-datepicker__label{top:0;transform:translateY(-50%) scale(1);font-size:12px;color:#a11e29;background-color:#fff;font-weight:500}.pecb-datepicker--disabled .pecb-datepicker__label{color:#919191}.pecb-datepicker--disabled .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--disabled.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--disabled.pecb-datepicker--has-value .pecb-datepicker__label{background-color:#ececec}.pecb-datepicker__input{flex:1;width:100%;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;color:#313131;background-color:#fff;border:1px solid #c2c2c2;border-radius:8px;outline:none;cursor:pointer;transition-property:border-color,box-shadow;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__input::placeholder{color:#919191}.pecb-datepicker__input:hover:not(:disabled){border-color:#919191}.pecb-datepicker__input:focus{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}.pecb-datepicker__input:disabled{background-color:#ececec;color:#919191;cursor:not-allowed;border-color:#c2c2c2}.pecb-datepicker__icon{position:absolute;display:inline-flex;align-items:center;justify-content:center;color:#616161;background:none;border:none;cursor:pointer;padding:0;transition-property:color,opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__icon--right{right:12px}.pecb-datepicker__icon--clear{right:36px;color:#919191;opacity:0;transform:scale(.8);pointer-events:none}.pecb-datepicker__icon--clear:hover{color:#dc3545}.pecb-datepicker__icon:hover:not(:disabled){color:#313131}.pecb-datepicker__icon:disabled{color:#919191;cursor:not-allowed}.pecb-datepicker__icon svg{flex-shrink:0}.pecb-datepicker--has-value .pecb-datepicker__icon--clear{opacity:1;transform:scale(1);pointer-events:auto}.pecb-datepicker--sm .pecb-datepicker__input{padding:8px 48px 8px 12px;font-size:12px;height:32px}.pecb-datepicker--sm .pecb-datepicker__label{left:12px;font-size:12px}.pecb-datepicker--sm .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--sm.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--sm.pecb-datepicker--has-value .pecb-datepicker__label{font-size:10px}.pecb-datepicker--sm .pecb-datepicker__icon--right{right:8px}.pecb-datepicker--sm .pecb-datepicker__icon--right svg{width:14px;height:14px}.pecb-datepicker--sm .pecb-datepicker__icon--clear{right:28px}.pecb-datepicker--sm .pecb-datepicker__icon--clear svg{width:14px;height:14px}.pecb-datepicker--sm.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:68px}.pecb-datepicker--md .pecb-datepicker__input{padding:12px 48px 12px 12px;font-size:14px;height:40px}.pecb-datepicker--md .pecb-datepicker__label{left:12px;font-size:14px}.pecb-datepicker--md .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--md.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--md.pecb-datepicker--has-value .pecb-datepicker__label{font-size:12px}.pecb-datepicker--md .pecb-datepicker__icon--right{right:12px}.pecb-datepicker--md .pecb-datepicker__icon--right svg{width:16px;height:16px}.pecb-datepicker--md .pecb-datepicker__icon--clear{right:36px}.pecb-datepicker--md .pecb-datepicker__icon--clear svg{width:16px;height:16px}.pecb-datepicker--md.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:72px}.pecb-datepicker--lg .pecb-datepicker__input{padding:16px 64px 16px 16px;font-size:16px;height:48px}.pecb-datepicker--lg .pecb-datepicker__label{left:16px;font-size:16px}.pecb-datepicker--lg .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--lg.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--lg.pecb-datepicker--has-value .pecb-datepicker__label{font-size:13px}.pecb-datepicker--lg .pecb-datepicker__icon--right{right:16px}.pecb-datepicker--lg .pecb-datepicker__icon--right svg{width:18px;height:18px}.pecb-datepicker--lg .pecb-datepicker__icon--clear{right:44px}.pecb-datepicker--lg .pecb-datepicker__icon--clear svg{width:18px;height:18px}.pecb-datepicker--lg.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:92px}.pecb-datepicker__calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:1000;background-color:#fff;border:1px solid #c2c2c2;border-radius:12px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;padding:16px;min-width:280px}.pecb-datepicker__calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #ececec}.pecb-datepicker__month-year{font-size:14px;font-weight:500;color:#313131}.pecb-datepicker__nav-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background-color:transparent;border:none;border-radius:8px;color:#616161;font-size:18px;font-weight:700;cursor:pointer;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__nav-button:hover{background-color:#ececec;color:#313131}.pecb-datepicker__nav-button:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-datepicker__calendar-body{display:flex;flex-direction:column}.pecb-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:8px}.pecb-datepicker__weekday{display:flex;align-items:center;justify-content:center;padding:6px;font-size:12px;font-weight:500;color:#616161;text-align:center}.pecb-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.pecb-datepicker__day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;background-color:transparent;border:none;border-radius:8px;font-size:14px;font-weight:400;color:#313131;cursor:pointer;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__day:hover:not(.pecb-datepicker__day--other-month):not(.pecb-datepicker__day--selected){background-color:#ececec}.pecb-datepicker__day:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-datepicker__day--other-month{color:#919191;cursor:default}.pecb-datepicker__day--other-month:hover{background-color:transparent}.pecb-datepicker__day--selected{background-color:#313131;color:#fff;font-weight:500}.pecb-datepicker__day--selected:hover{background-color:#313131}.pecb-datepicker__day--today:not(.pecb-datepicker__day--selected){background-color:#fff;color:#a11e29;font-weight:500}.pecb-datepicker--disabled{opacity:.6;pointer-events:none}.pecb-datepicker--open .pecb-datepicker__input{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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 }); }
|
|
308
|
-
}
|
|
309
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DatepickerComponent, decorators: [{
|
|
310
|
-
type: Component,
|
|
311
|
-
args: [{ selector: 'pecb-datepicker', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
312
|
-
{
|
|
313
|
-
provide: NG_VALUE_ACCESSOR,
|
|
314
|
-
useExisting: forwardRef(() => DatepickerComponent),
|
|
315
|
-
multi: true
|
|
316
|
-
}
|
|
317
|
-
], template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Field -->\r\n <div class=\"pecb-datepicker__input-wrapper\">\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n type=\"text\"\r\n class=\"pecb-datepicker__input\"\r\n [value]=\"displayValue\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-datepicker__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-datepicker__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button (shown when has value) -->\r\n <button\r\n *ngIf=\"selectedDate && !disabled\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--clear\"\r\n [attr.aria-label]=\"'Clear date'\"\r\n (click)=\"clearDate($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon (Calendar) -->\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--right\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Open calendar'\"\r\n (click)=\"toggleCalendar()\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11 2V1H10V2H6V1H5V2H2V15H14V2H11ZM13 14H3V6H13V14ZM13 5H3V3H5V4H6V3H10V4H11V3H13V5Z\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Dropdown -->\r\n <div\r\n *ngIf=\"isCalendarOpen\"\r\n class=\"pecb-datepicker__calendar\"\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n [attr.aria-label]=\"'Choose date'\"\r\n >\r\n <!-- Calendar Header -->\r\n <div class=\"pecb-datepicker__calendar-header\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Previous month\"\r\n (click)=\"previousMonth()\"\r\n >\r\n \u00AB\r\n </button>\r\n\r\n <span class=\"pecb-datepicker__month-year\">{{ monthYearDisplay }}</span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Next month\"\r\n (click)=\"nextMonth()\"\r\n >\r\n \u00BB\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Grid -->\r\n <div class=\"pecb-datepicker__calendar-body\">\r\n <!-- Week Days -->\r\n <div class=\"pecb-datepicker__weekdays\">\r\n <div\r\n *ngFor=\"let day of weekDays\"\r\n class=\"pecb-datepicker__weekday\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"pecb-datepicker__days\">\r\n <button\r\n *ngFor=\"let day of calendarDays\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__day\"\r\n [class.pecb-datepicker__day--other-month]=\"!day.isCurrentMonth\"\r\n [class.pecb-datepicker__day--selected]=\"day.isSelected\"\r\n [class.pecb-datepicker__day--today]=\"day.isToday\"\r\n [attr.aria-label]=\"day.date.toDateString()\"\r\n [attr.aria-selected]=\"day.isSelected\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day.day }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".pecb-datepicker{position:relative;display:flex;flex-direction:column;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%}.pecb-datepicker__input-wrapper{position:relative;display:flex;align-items:center}.pecb-datepicker__label{position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:14px;font-weight:400;color:#919191;background-color:transparent;padding:0 4px;pointer-events:none;z-index:1;transition:top .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),font-size .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),font-weight .2s cubic-bezier(.4,0,.2,1)}.pecb-datepicker__required{color:#dc3545;margin-left:2px}.pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--has-value .pecb-datepicker__label{top:0;transform:translateY(-50%) scale(1);font-size:12px;color:#a11e29;background-color:#fff;font-weight:500}.pecb-datepicker--disabled .pecb-datepicker__label{color:#919191}.pecb-datepicker--disabled .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--disabled.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--disabled.pecb-datepicker--has-value .pecb-datepicker__label{background-color:#ececec}.pecb-datepicker__input{flex:1;width:100%;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;color:#313131;background-color:#fff;border:1px solid #c2c2c2;border-radius:8px;outline:none;cursor:pointer;transition-property:border-color,box-shadow;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__input::placeholder{color:#919191}.pecb-datepicker__input:hover:not(:disabled){border-color:#919191}.pecb-datepicker__input:focus{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}.pecb-datepicker__input:disabled{background-color:#ececec;color:#919191;cursor:not-allowed;border-color:#c2c2c2}.pecb-datepicker__icon{position:absolute;display:inline-flex;align-items:center;justify-content:center;color:#616161;background:none;border:none;cursor:pointer;padding:0;transition-property:color,opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__icon--right{right:12px}.pecb-datepicker__icon--clear{right:36px;color:#919191;opacity:0;transform:scale(.8);pointer-events:none}.pecb-datepicker__icon--clear:hover{color:#dc3545}.pecb-datepicker__icon:hover:not(:disabled){color:#313131}.pecb-datepicker__icon:disabled{color:#919191;cursor:not-allowed}.pecb-datepicker__icon svg{flex-shrink:0}.pecb-datepicker--has-value .pecb-datepicker__icon--clear{opacity:1;transform:scale(1);pointer-events:auto}.pecb-datepicker--sm .pecb-datepicker__input{padding:8px 48px 8px 12px;font-size:12px;height:32px}.pecb-datepicker--sm .pecb-datepicker__label{left:12px;font-size:12px}.pecb-datepicker--sm .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--sm.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--sm.pecb-datepicker--has-value .pecb-datepicker__label{font-size:10px}.pecb-datepicker--sm .pecb-datepicker__icon--right{right:8px}.pecb-datepicker--sm .pecb-datepicker__icon--right svg{width:14px;height:14px}.pecb-datepicker--sm .pecb-datepicker__icon--clear{right:28px}.pecb-datepicker--sm .pecb-datepicker__icon--clear svg{width:14px;height:14px}.pecb-datepicker--sm.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:68px}.pecb-datepicker--md .pecb-datepicker__input{padding:12px 48px 12px 12px;font-size:14px;height:40px}.pecb-datepicker--md .pecb-datepicker__label{left:12px;font-size:14px}.pecb-datepicker--md .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--md.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--md.pecb-datepicker--has-value .pecb-datepicker__label{font-size:12px}.pecb-datepicker--md .pecb-datepicker__icon--right{right:12px}.pecb-datepicker--md .pecb-datepicker__icon--right svg{width:16px;height:16px}.pecb-datepicker--md .pecb-datepicker__icon--clear{right:36px}.pecb-datepicker--md .pecb-datepicker__icon--clear svg{width:16px;height:16px}.pecb-datepicker--md.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:72px}.pecb-datepicker--lg .pecb-datepicker__input{padding:16px 64px 16px 16px;font-size:16px;height:48px}.pecb-datepicker--lg .pecb-datepicker__label{left:16px;font-size:16px}.pecb-datepicker--lg .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--lg.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--lg.pecb-datepicker--has-value .pecb-datepicker__label{font-size:13px}.pecb-datepicker--lg .pecb-datepicker__icon--right{right:16px}.pecb-datepicker--lg .pecb-datepicker__icon--right svg{width:18px;height:18px}.pecb-datepicker--lg .pecb-datepicker__icon--clear{right:44px}.pecb-datepicker--lg .pecb-datepicker__icon--clear svg{width:18px;height:18px}.pecb-datepicker--lg.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:92px}.pecb-datepicker__calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:1000;background-color:#fff;border:1px solid #c2c2c2;border-radius:12px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;padding:16px;min-width:280px}.pecb-datepicker__calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #ececec}.pecb-datepicker__month-year{font-size:14px;font-weight:500;color:#313131}.pecb-datepicker__nav-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background-color:transparent;border:none;border-radius:8px;color:#616161;font-size:18px;font-weight:700;cursor:pointer;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__nav-button:hover{background-color:#ececec;color:#313131}.pecb-datepicker__nav-button:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-datepicker__calendar-body{display:flex;flex-direction:column}.pecb-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:8px}.pecb-datepicker__weekday{display:flex;align-items:center;justify-content:center;padding:6px;font-size:12px;font-weight:500;color:#616161;text-align:center}.pecb-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.pecb-datepicker__day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;background-color:transparent;border:none;border-radius:8px;font-size:14px;font-weight:400;color:#313131;cursor:pointer;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__day:hover:not(.pecb-datepicker__day--other-month):not(.pecb-datepicker__day--selected){background-color:#ececec}.pecb-datepicker__day:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-datepicker__day--other-month{color:#919191;cursor:default}.pecb-datepicker__day--other-month:hover{background-color:transparent}.pecb-datepicker__day--selected{background-color:#313131;color:#fff;font-weight:500}.pecb-datepicker__day--selected:hover{background-color:#313131}.pecb-datepicker__day--today:not(.pecb-datepicker__day--selected){background-color:#fff;color:#a11e29;font-weight:500}.pecb-datepicker--disabled{opacity:.6;pointer-events:none}.pecb-datepicker--open .pecb-datepicker__input{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}\n"] }]
|
|
318
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { inputElement: [{
|
|
319
|
-
type: ViewChild,
|
|
320
|
-
args: ['inputElement']
|
|
321
|
-
}], id: [{
|
|
322
|
-
type: Input
|
|
323
|
-
}], label: [{
|
|
324
|
-
type: Input
|
|
325
|
-
}], placeholder: [{
|
|
326
|
-
type: Input
|
|
327
|
-
}], size: [{
|
|
328
|
-
type: Input
|
|
329
|
-
}], required: [{
|
|
330
|
-
type: Input
|
|
331
|
-
}], disabled: [{
|
|
332
|
-
type: Input
|
|
333
|
-
}], dateFormat: [{
|
|
334
|
-
type: Input
|
|
335
|
-
}], minDate: [{
|
|
336
|
-
type: Input
|
|
337
|
-
}], maxDate: [{
|
|
338
|
-
type: Input
|
|
339
|
-
}], dateChange: [{
|
|
340
|
-
type: Output
|
|
341
|
-
}], opened: [{
|
|
342
|
-
type: Output
|
|
343
|
-
}], closed: [{
|
|
344
|
-
type: Output
|
|
345
|
-
}], onDocumentClick: [{
|
|
346
|
-
type: HostListener,
|
|
347
|
-
args: ['document:click', ['$event']]
|
|
348
|
-
}] } });
|
|
349
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLFlBQVksRUFFWixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7OztBQVloRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQWdCSCxNQUFNLE9BQU8sbUJBQW1CO0lBOEU5QixZQUNVLFVBQXNCLEVBQ3RCLEdBQXNCO1FBRHRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE3RWhDOztXQUVHO1FBQ00sT0FBRSxHQUFXLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBT3JEOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxhQUFhLENBQUM7UUFFckM7O1dBRUc7UUFDTSxTQUFJLEdBQW1CLElBQUksQ0FBQztRQUVyQzs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FB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QUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOytHQUcwQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBS2hCLEVBQUU7c0JBQVYsS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLSSxVQUFVO3NCQUFuQixNQUFNO2dCQUtHLE1BQU07c0JBQWYsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBd05QLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVuaXF1ZUlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3V0aWxzL2RvbS51dGlscyc7XHJcblxyXG5leHBvcnQgdHlwZSBEYXRlcGlja2VyU2l6ZSA9ICdzbScgfCAnbWQnIHwgJ2xnJztcclxuXHJcbmludGVyZmFjZSBDYWxlbmRhckRheSB7XHJcbiAgZGF0ZTogRGF0ZTtcclxuICBkYXk6IG51bWJlcjtcclxuICBpc0N1cnJlbnRNb250aDogYm9vbGVhbjtcclxuICBpc1NlbGVjdGVkOiBib29sZWFuO1xyXG4gIGlzVG9kYXk6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHByb2Zlc3Npb25hbCBkYXRlcGlja2VyIGNvbXBvbmVudCB3aXRoIGNhbGVuZGFyIGRyb3Bkb3duLlxyXG4gKiBGdWxseSBhY2Nlc3NpYmxlIHdpdGggV0NBRyAyLjEgQUEgY29tcGxpYW5jZSBhbmQgcmVhY3RpdmUgZm9ybXMgc3VwcG9ydC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8cGVjYi1kYXRlcGlja2VyXHJcbiAqICAgbGFiZWw9XCJEYXRlXCJcclxuICogICBwbGFjZWhvbGRlcj1cIkNob29zZSBEYXRlXCJcclxuICogICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGF0ZVwiXHJcbiAqID48L3BlY2ItZGF0ZXBpY2tlcj5cclxuICpcclxuICogPCEtLSBXaXRoIGN1c3RvbSBjb25maWd1cmF0aW9uIC0tPlxyXG4gKiA8cGVjYi1kYXRlcGlja2VyXHJcbiAqICAgbGFiZWw9XCJCaXJ0aCBEYXRlXCJcclxuICogICBbcmVxdWlyZWRdPVwidHJ1ZVwiXHJcbiAqICAgc2l6ZT1cImxnXCJcclxuICogICAoZGF0ZUNoYW5nZSk9XCJoYW5kbGVEYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gKiA+PC9wZWNiLWRhdGVwaWNrZXI+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcHVibGljQXBpXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BlY2ItZGF0ZXBpY2tlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZXBpY2tlckNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKSBpbnB1dEVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICAvKipcclxuICAgKiBVbmlxdWUgSUQgZm9yIHRoZSBkYXRlcGlja2VyIGVsZW1lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gZ2VuZXJhdGVVbmlxdWVJZCgnZGF0ZXBpY2tlcicpO1xyXG5cclxuICAvKipcclxuICAgKiBMYWJlbCB0ZXh0IHRvIGRpc3BsYXkgYWJvdmUgdGhlIGlucHV0XHJcbiAgICovXHJcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ0Nob29zZSBEYXRlJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIGRhdGVwaWNrZXJcclxuICAgKi9cclxuICBASW5wdXQoKSBzaXplOiBEYXRlcGlja2VyU2l6ZSA9ICdtZCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkXHJcbiAgICovXHJcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZGF0ZXBpY2tlciBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGUgZm9ybWF0IGZvciBkaXNwbGF5IChkZWZhdWx0OiBNTS9ERC9ZWVlZKVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRhdGVGb3JtYXQgPSAnTU0vREQvWVlZWSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1pbmltdW0gc2VsZWN0YWJsZSBkYXRlXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1heGltdW0gc2VsZWN0YWJsZSBkYXRlXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWF4RGF0ZT86IERhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBkYXRlIGlzIHNlbGVjdGVkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gY2FsZW5kYXIgaXMgb3BlbmVkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGNhbGVuZGFyIGlzIGNsb3NlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8vIEludGVybmFsIHN0YXRlXHJcbiAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNDYWxlbmRhck9wZW4gPSBmYWxzZTtcclxuICBjdXJyZW50TW9udGg6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIGNhbGVuZGFyRGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xyXG4gIHdlZWtEYXlzID0gWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddO1xyXG4gIG1vbnRoTmFtZXMgPSBbXHJcbiAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsXHJcbiAgICAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXHJcbiAgXTtcclxuXHJcbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IERhdGUgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IENTUyBjbGFzc2VzIGZvciB0aGUgZGF0ZXBpY2tlciB3cmFwcGVyXHJcbiAgICovXHJcbiAgZ2V0IHdyYXBwZXJDbGFzc2VzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdwZWNiLWRhdGVwaWNrZXInLFxyXG4gICAgICBgcGVjYi1kYXRlcGlja2VyLS0ke3RoaXMuc2l6ZX1gLFxyXG4gICAgICB0aGlzLmRpc2FibGVkID8gJ3BlY2ItZGF0ZXBpY2tlci0tZGlzYWJsZWQnIDogJycsXHJcbiAgICAgIHRoaXMuaXNDYWxlbmRhck9wZW4gPyAncGVjYi1kYXRlcGlja2VyLS1vcGVuJyA6ICcnLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA/ICdwZWNiLWRhdGVwaWNrZXItLWhhcy12YWx1ZScgOiAnJ1xyXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZm9ybWF0dGVkIGRpc3BsYXkgdmFsdWVcclxuICAgKi9cclxuICBnZXQgZGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlKSByZXR1cm4gJyc7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjdXJyZW50IG1vbnRoIGFuZCB5ZWFyIGRpc3BsYXlcclxuICAgKi9cclxuICBnZXQgbW9udGhZZWFyRGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMubW9udGhOYW1lc1t0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpXX0gJHt0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgY2FsZW5kYXIgZHJvcGRvd25cclxuICAgKi9cclxuICB0b2dnbGVDYWxlbmRhcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5pc0NhbGVuZGFyT3BlbiA9ICF0aGlzLmlzQ2FsZW5kYXJPcGVuO1xyXG5cclxuICAgIGlmICh0aGlzLmlzQ2FsZW5kYXJPcGVuKSB7XHJcbiAgICAgIHRoaXMub3BlbmVkLmVtaXQoKTtcclxuICAgICAgLy8gU2V0IGN1cnJlbnQgbW9udGggdG8gc2VsZWN0ZWQgZGF0ZSdzIG1vbnRoIG9yIGN1cnJlbnQgbW9udGhcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpLCAxKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgY2FsZW5kYXJcclxuICAgKi9cclxuICBjbG9zZUNhbGVuZGFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNDYWxlbmRhck9wZW4pIHtcclxuICAgICAgdGhpcy5pc0NhbGVuZGFyT3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gcHJldmlvdXMgbW9udGhcclxuICAgKi9cclxuICBwcmV2aW91c01vbnRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXcgRGF0ZShcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKSxcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGguZ2V0TW9udGgoKSAtIDEsXHJcbiAgICAgIDFcclxuICAgICk7XHJcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gbmV4dCBtb250aFxyXG4gICAqL1xyXG4gIG5leHRNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudE1vbnRoID0gbmV3IERhdGUoXHJcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoLmdldE1vbnRoKCkgKyAxLFxyXG4gICAgICAxXHJcbiAgICApO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCBhIGRhdGVcclxuICAgKi9cclxuICBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICBpZiAoIWRheS5pc0N1cnJlbnRNb250aCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMubWluRGF0ZSAmJiBkYXkuZGF0ZSA8IHRoaXMubWluRGF0ZSkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMubWF4RGF0ZSAmJiBkYXkuZGF0ZSA+IHRoaXMubWF4RGF0ZSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF5LmRhdGU7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgY2FsZW5kYXIgZGF5c1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpO1xyXG5cclxuICAgIC8vIEZpcnN0IGRheSBvZiB0aGUgbW9udGhcclxuICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG4gICAgY29uc3Qgc3RhcnRpbmdEYXlPZldlZWsgPSBmaXJzdERheS5nZXREYXkoKTtcclxuXHJcbiAgICAvLyBMYXN0IGRheSBvZiB0aGUgbW9udGhcclxuICAgIGNvbnN0IGxhc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApO1xyXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBsYXN0RGF5LmdldERhdGUoKTtcclxuXHJcbiAgICAvLyBQcmV2aW91cyBtb250aFxyXG4gICAgY29uc3QgcHJldk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApO1xyXG4gICAgY29uc3QgZGF5c0luUHJldk1vbnRoID0gcHJldk1vbnRoLmdldERhdGUoKTtcclxuXHJcbiAgICBjb25zdCBkYXlzOiBDYWxlbmRhckRheVtdID0gW107XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuXHJcbiAgICAvLyBQcmV2aW91cyBtb250aCBkYXlzXHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnRpbmdEYXlPZldlZWsgLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXlzSW5QcmV2TW9udGggLSBpKTtcclxuICAgICAgZGF5cy5wdXNoKHtcclxuICAgICAgICBkYXRlLFxyXG4gICAgICAgIGRheTogZGF5c0luUHJldk1vbnRoIC0gaSxcclxuICAgICAgICBpc0N1cnJlbnRNb250aDogZmFsc2UsXHJcbiAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgaXNUb2RheTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3VycmVudCBtb250aCBkYXlzXHJcbiAgICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gZGF5c0luTW9udGg7IGRheSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcclxuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuXHJcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/XHJcbiAgICAgICAgZGF0ZS5nZXRUaW1lKCkgPT09IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlKS5zZXRIb3VycygwLCAwLCAwLCAwKSA6XHJcbiAgICAgICAgZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBpc1RvZGF5ID0gZGF0ZS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKTtcclxuXHJcbiAgICAgIGRheXMucHVzaCh7XHJcbiAgICAgICAgZGF0ZSxcclxuICAgICAgICBkYXksXHJcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXHJcbiAgICAgICAgaXNTZWxlY3RlZCxcclxuICAgICAgICBpc1RvZGF5XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5leHQgbW9udGggZGF5c1xyXG4gICAgY29uc3QgcmVtYWluaW5nRGF5cyA9IDQyIC0gZGF5cy5sZW5ndGg7IC8vIDYgcm93cyAqIDcgZGF5c1xyXG4gICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IHJlbWFpbmluZ0RheXM7IGRheSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIGRheSk7XHJcbiAgICAgIGRheXMucHVzaCh7XHJcbiAgICAgICAgZGF0ZSxcclxuICAgICAgICBkYXksXHJcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIGlzVG9kYXk6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gZGF5cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcm1hdCBkYXRlIGZvciBkaXNwbGF5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGF0ZUZvcm1hdFxyXG4gICAgICAucmVwbGFjZSgnTU0nLCBtb250aClcclxuICAgICAgLnJlcGxhY2UoJ0REJywgZGF5KVxyXG4gICAgICAucmVwbGFjZSgnWVlZWScsIFN0cmluZyh5ZWFyKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0ZW4gZm9yIGNsaWNrcyBvdXRzaWRlIHRvIGNsb3NlIGNhbGVuZGFyXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb25cclxuICAgKi9cclxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy50b2dnbGVDYWxlbmRhcigpO1xyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgc2VsZWN0ZWQgZGF0ZVxyXG4gICAqL1xyXG4gIGNsZWFyRGF0ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcclxuICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50YXRpb25cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSB2YWx1ZTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ldyBEYXRlKHZhbHVlLmdldEZ1bGxZZWFyKCksIHZhbHVlLmdldE1vbnRoKCksIDEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtjbGFzc109XCJ3cmFwcGVyQ2xhc3Nlcy5qb2luKCcgJylcIj5cclxuICA8IS0tIElucHV0IEZpZWxkIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX2lucHV0LXdyYXBwZXJcIj5cclxuICAgIDwhLS0gSW5wdXQgLS0+XHJcbiAgICA8aW5wdXRcclxuICAgICAgI2lucHV0RWxlbWVudFxyXG4gICAgICBbaWRdPVwiaWRcIlxyXG4gICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgIGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19pbnB1dFwiXHJcbiAgICAgIFt2YWx1ZV09XCJkaXNwbGF5VmFsdWVcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsIHx8IHBsYWNlaG9sZGVyXCJcclxuICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgIHJlYWRvbmx5XHJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVDYWxlbmRhcigpXCJcclxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxyXG4gICAgLz5cclxuXHJcbiAgICA8IS0tIEZsb2F0aW5nIExhYmVsIC0tPlxyXG4gICAgPGxhYmVsXHJcbiAgICAgICpuZ0lmPVwibGFiZWxcIlxyXG4gICAgICBbYXR0ci5mb3JdPVwiaWRcIlxyXG4gICAgICBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9fbGFiZWxcIlxyXG4gICAgPlxyXG4gICAgICB7eyBsYWJlbCB9fTxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIiBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9fcmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuXHJcbiAgICA8IS0tIENsZWFyIEJ1dHRvbiAoc2hvd24gd2hlbiBoYXMgdmFsdWUpIC0tPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cInNlbGVjdGVkRGF0ZSAmJiAhZGlzYWJsZWRcIlxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX2ljb24gcGVjYi1kYXRlcGlja2VyX19pY29uLS1jbGVhclwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NsZWFyIGRhdGUnXCJcclxuICAgICAgKGNsaWNrKT1cImNsZWFyRGF0ZSgkZXZlbnQpXCJcclxuICAgID5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNOCAwQzMuNiAwIDAgMy42IDAgOEMwIDEyLjQgMy42IDE2IDggMTZDMTIuNCAxNiAxNiAxMi40IDE2IDhDMTYgMy42IDEyLjQgMCA4IDBaTTExLjUgMTAuMUwxMC4xIDExLjVMOCA5LjRMNS45IDExLjVMNC41IDEwLjFMNi42IDhMNC41IDUuOUw1LjkgNC41TDggNi42TDEwLjEgNC41TDExLjUgNS45TDkuNCA4TDExLjUgMTAuMVpcIi8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPCEtLSBSaWdodCBJY29uIChDYWxlbmRhcikgLS0+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9faWNvbiBwZWNiLWRhdGVwaWNrZXJfX2ljb24tLXJpZ2h0XCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT3BlbiBjYWxlbmRhcidcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTExIDJWMUgxMFYySDZWMUg1VjJIMlYxNUgxNFYySDExWk0xMyAxNEgzVjZIMTNWMTRaTTEzIDVIM1YzSDVWNEg2VjNIMTBWNEgxMVYzSDEzVjVaXCIvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIENhbGVuZGFyIERyb3Bkb3duIC0tPlxyXG4gIDxkaXZcclxuICAgICpuZ0lmPVwiaXNDYWxlbmRhck9wZW5cIlxyXG4gICAgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX2NhbGVuZGFyXCJcclxuICAgIHJvbGU9XCJkaWFsb2dcIlxyXG4gICAgYXJpYS1tb2RhbD1cImZhbHNlXCJcclxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0Nob29zZSBkYXRlJ1wiXHJcbiAgPlxyXG4gICAgPCEtLSBDYWxlbmRhciBIZWFkZXIgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19jYWxlbmRhci1oZWFkZXJcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19uYXYtYnV0dG9uXCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgbW9udGhcIlxyXG4gICAgICAgIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgwqtcclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8c3BhbiBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9fbW9udGgteWVhclwiPnt7IG1vbnRoWWVhckRpc3BsYXkgfX08L3NwYW4+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX25hdi1idXR0b25cIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0IG1vbnRoXCJcclxuICAgICAgICAoY2xpY2spPVwibmV4dE1vbnRoKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgwrtcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENhbGVuZGFyIEdyaWQgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19jYWxlbmRhci1ib2R5XCI+XHJcbiAgICAgIDwhLS0gV2VlayBEYXlzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX193ZWVrZGF5c1wiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheXNcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX3dlZWtkYXlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGRheSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRGF5cyBHcmlkIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19kYXlzXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBjYWxlbmRhckRheXNcIlxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9fZGF5XCJcclxuICAgICAgICAgIFtjbGFzcy5wZWNiLWRhdGVwaWNrZXJfX2RheS0tb3RoZXItbW9udGhdPVwiIWRheS5pc0N1cnJlbnRNb250aFwiXHJcbiAgICAgICAgICBbY2xhc3MucGVjYi1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkXCJcclxuICAgICAgICAgIFtjbGFzcy5wZWNiLWRhdGVwaWNrZXJfX2RheS0tdG9kYXldPVwiZGF5LmlzVG9kYXlcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkYXkuZGF0ZS50b0RhdGVTdHJpbmcoKVwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkXCJcclxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGRheS5kYXkgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|