@idea-ionic/uncommon 8.5.12 → 8.6.0-beta.1
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/fesm2022/idea-ionic-uncommon.mjs +85 -85
- package/fesm2022/idea-ionic-uncommon.mjs.map +1 -1
- package/index.d.ts +1405 -3
- package/package.json +12 -13
- package/esm2022/idea-ionic-uncommon.mjs +0 -5
- package/esm2022/public-api.mjs +0 -26
- package/esm2022/src/AWSAPI.service.mjs +0 -431
- package/esm2022/src/AWSAPISocket.service.mjs +0 -188
- package/esm2022/src/address/address.component.mjs +0 -409
- package/esm2022/src/announcement/announcement.component.mjs +0 -72
- package/esm2022/src/cachedResources.service.mjs +0 -55
- package/esm2022/src/colors/colorPicker.component.mjs +0 -191
- package/esm2022/src/contacts/contacts.component.mjs +0 -188
- package/esm2022/src/dateTime/calendarPicker.component.mjs +0 -213
- package/esm2022/src/dateTime/dateTime.component.mjs +0 -217
- package/esm2022/src/duration/duration.component.mjs +0 -195
- package/esm2022/src/echo/echo.page.mjs +0 -233
- package/esm2022/src/echo/echo.routes.mjs +0 -6
- package/esm2022/src/errorReporting.service.mjs +0 -69
- package/esm2022/src/mde/mde.component.mjs +0 -143
- package/esm2022/src/mde/mdeToolbar.component.mjs +0 -25
- package/esm2022/src/offline/cacheableResource.component.mjs +0 -56
- package/esm2022/src/offline/offline.service.mjs +0 -63
- package/esm2022/src/offline/offlineData.service.mjs +0 -480
- package/esm2022/src/offline/offlineIndicator.component.mjs +0 -105
- package/esm2022/src/offline/offlineManager.component.mjs +0 -101
- package/esm2022/src/pushNotifications.service.mjs +0 -57
- package/esm2022/src/sentiment/sentiment.component.mjs +0 -112
- package/esm2022/src/timeInterval/fromTimeToTime.component.mjs +0 -171
- package/esm2022/src/timeInterval/timeInterval.component.mjs +0 -206
- package/esm2022/src/tinCan.service.mjs +0 -49
- package/public-api.d.ts +0 -25
- package/src/AWSAPI.service.d.ts +0 -178
- package/src/AWSAPISocket.service.d.ts +0 -129
- package/src/address/address.component.d.ts +0 -64
- package/src/announcement/announcement.component.d.ts +0 -23
- package/src/cachedResources.service.d.ts +0 -34
- package/src/colors/colorPicker.component.d.ts +0 -78
- package/src/contacts/contacts.component.d.ts +0 -31
- package/src/dateTime/calendarPicker.component.d.ts +0 -45
- package/src/dateTime/dateTime.component.d.ts +0 -81
- package/src/duration/duration.component.d.ts +0 -68
- package/src/echo/echo.page.d.ts +0 -34
- package/src/echo/echo.routes.d.ts +0 -2
- package/src/errorReporting.service.d.ts +0 -26
- package/src/mde/mde.component.d.ts +0 -39
- package/src/mde/mdeToolbar.component.d.ts +0 -5
- package/src/offline/cacheableResource.component.d.ts +0 -11
- package/src/offline/offline.service.d.ts +0 -39
- package/src/offline/offlineData.service.d.ts +0 -281
- package/src/offline/offlineIndicator.component.d.ts +0 -25
- package/src/offline/offlineManager.component.d.ts +0 -17
- package/src/pushNotifications.service.d.ts +0 -26
- package/src/sentiment/sentiment.component.d.ts +0 -35
- package/src/timeInterval/fromTimeToTime.component.d.ts +0 -61
- package/src/timeInterval/timeInterval.component.d.ts +0 -84
- package/src/tinCan.service.d.ts +0 -31
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, Input, inject } from '@angular/core';
|
|
3
|
-
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import { AlertController, ModalController, IonHeader, IonToolbar, IonTitle, IonButtons, IonButton, IonIcon, IonGrid, IonContent, IonRow, IonCol, IonInput, IonFooter } from '@ionic/angular/standalone';
|
|
5
|
-
import { IDEALocalizedDatePipe, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common";
|
|
8
|
-
/**
|
|
9
|
-
* A random sunday, used as reference to calculate the week days.
|
|
10
|
-
*/
|
|
11
|
-
const SUNDAY = 259200000;
|
|
12
|
-
export class IDEACalendarPickerComponent {
|
|
13
|
-
constructor() {
|
|
14
|
-
this._modal = inject(ModalController);
|
|
15
|
-
this._alert = inject(AlertController);
|
|
16
|
-
this._translate = inject(IDEATranslationsService);
|
|
17
|
-
this.timePicker = false;
|
|
18
|
-
this.manualTimePicker = false;
|
|
19
|
-
this.hideClearButton = false;
|
|
20
|
-
}
|
|
21
|
-
ngOnInit() {
|
|
22
|
-
this.today = new Date();
|
|
23
|
-
this.refDate = this.inputDate ? new Date(this.inputDate) : new Date(this.today);
|
|
24
|
-
this.selectedDate = new Date(this.refDate);
|
|
25
|
-
this.hour = 12; // to endure timezones
|
|
26
|
-
this.minute = 0;
|
|
27
|
-
if (this.timePicker || this.manualTimePicker) {
|
|
28
|
-
this.hour = this.selectedDate.getHours();
|
|
29
|
-
if (this.manualTimePicker)
|
|
30
|
-
this.minute = this.selectedDate.getMinutes();
|
|
31
|
-
else {
|
|
32
|
-
// round the minutes a multiple of 5
|
|
33
|
-
this.minute = Math.ceil(this.selectedDate.getMinutes() / 5) * 5;
|
|
34
|
-
this.selectedDate.setMinutes(this.minute);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
this.buildCalendarGrid(this.refDate);
|
|
38
|
-
this.hours = Array.from(Array(24).keys()).map(i => '0'.concat(i.toString()).slice(-2));
|
|
39
|
-
this.minutes = Array.from(Array(12).keys()).map(i => '0'.concat((i * 5).toString()).slice(-2));
|
|
40
|
-
// build the weekdays based on the current locale
|
|
41
|
-
this.weekDays = new Array();
|
|
42
|
-
const refDateForWeekDays = new Date(SUNDAY);
|
|
43
|
-
refDateForWeekDays.setDate(refDateForWeekDays.getDate() - this.getLocalisedDay(refDateForWeekDays));
|
|
44
|
-
for (let i = 0; i < 7; i++) {
|
|
45
|
-
this.weekDays.push(refDateForWeekDays.toLocaleDateString(this._translate.getCurrentLang(), { weekday: 'short' }));
|
|
46
|
-
refDateForWeekDays.setDate(refDateForWeekDays.getDate() + 1);
|
|
47
|
-
}
|
|
48
|
-
if (this.min)
|
|
49
|
-
this.dateMin = new Date(this.min);
|
|
50
|
-
if (this.max)
|
|
51
|
-
this.dateMax = new Date(this.max);
|
|
52
|
-
}
|
|
53
|
-
getLocalisedDay(date) {
|
|
54
|
-
let n = date.getDay();
|
|
55
|
-
switch (this._translate.getCurrentLang()) {
|
|
56
|
-
case 'it':
|
|
57
|
-
n = --n < 0 ? 6 : n;
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
return n;
|
|
61
|
-
}
|
|
62
|
-
buildCalendarGrid(refDate) {
|
|
63
|
-
// find the first day in the month: the important data here is the day of the week
|
|
64
|
-
const firstDateOfMonth = new Date(refDate.getFullYear(), refDate.getMonth(), 1);
|
|
65
|
-
// the following flag is used to divide the logic so I can fill the calendar
|
|
66
|
-
// also with the dates from the previous month, until there's space in the grid
|
|
67
|
-
let haventFoundFirstDay = true;
|
|
68
|
-
// index used to build the dates of the month, starting from the first one
|
|
69
|
-
let index = 1;
|
|
70
|
-
this.calendarGrid = new Array();
|
|
71
|
-
for (let i = 0; i < 6; i++) {
|
|
72
|
-
this.calendarGrid[i] = new Array();
|
|
73
|
-
for (let j = 0; j < 7; j++) {
|
|
74
|
-
if (haventFoundFirstDay) {
|
|
75
|
-
if (this.getLocalisedDay(firstDateOfMonth) === j) {
|
|
76
|
-
// note: considers Sunday
|
|
77
|
-
haventFoundFirstDay = false;
|
|
78
|
-
this.calendarGrid[i][j] = new Date(firstDateOfMonth);
|
|
79
|
-
// now the I've found the first date of the month I can fill the calendar
|
|
80
|
-
// the dates fromt the previous month, until there's space in the grid
|
|
81
|
-
for (let y = this.getLocalisedDay(firstDateOfMonth); y >= 0; y--) {
|
|
82
|
-
const d = new Date(firstDateOfMonth);
|
|
83
|
-
d.setDate(firstDateOfMonth.getDate() - y);
|
|
84
|
-
this.calendarGrid[i][this.getLocalisedDay(firstDateOfMonth) - y] = d;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
// fill the following dates until there's space in the grid
|
|
90
|
-
const d = new Date(firstDateOfMonth);
|
|
91
|
-
d.setDate(firstDateOfMonth.getDate() + index++);
|
|
92
|
-
this.calendarGrid[i][j] = d;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
addYears(offset) {
|
|
98
|
-
this.refDate.setFullYear(this.refDate.getFullYear() + offset);
|
|
99
|
-
this.buildCalendarGrid(this.refDate);
|
|
100
|
-
}
|
|
101
|
-
setYear(year) {
|
|
102
|
-
if (!year)
|
|
103
|
-
return;
|
|
104
|
-
this.refDate.setFullYear(Number(year));
|
|
105
|
-
this.buildCalendarGrid(this.refDate);
|
|
106
|
-
}
|
|
107
|
-
addMonths(offset) {
|
|
108
|
-
this.refDate.setMonth(this.refDate.getMonth() + offset);
|
|
109
|
-
this.buildCalendarGrid(this.refDate);
|
|
110
|
-
}
|
|
111
|
-
async showMonths() {
|
|
112
|
-
const buttons = [];
|
|
113
|
-
const inputs = [];
|
|
114
|
-
const month = new Date(0);
|
|
115
|
-
for (let i = 1; i <= 12; i++) {
|
|
116
|
-
inputs.push({
|
|
117
|
-
type: 'radio',
|
|
118
|
-
label: month.toLocaleDateString(this._translate.getCurrentLang(), { month: 'long' }),
|
|
119
|
-
value: i.toString(),
|
|
120
|
-
checked: i === this.refDate.getMonth() + 1
|
|
121
|
-
});
|
|
122
|
-
month.setMonth(month.getMonth() + 1);
|
|
123
|
-
}
|
|
124
|
-
buttons.push({ text: this._translate._('COMMON.CANCEL'), role: 'cancel' });
|
|
125
|
-
buttons.push({
|
|
126
|
-
text: this._translate._('COMMON.SELECT'),
|
|
127
|
-
handler: (m) => {
|
|
128
|
-
this.refDate.setMonth(parseInt(m, 10) - 1);
|
|
129
|
-
this.buildCalendarGrid(this.refDate);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
const alert = await this._alert.create({
|
|
133
|
-
header: this._translate._('IDEA_UNCOMMON.CALENDAR.MONTH'),
|
|
134
|
-
buttons,
|
|
135
|
-
inputs
|
|
136
|
-
});
|
|
137
|
-
alert.present();
|
|
138
|
-
}
|
|
139
|
-
isDateSelectable(date) {
|
|
140
|
-
if (this.dateMin && date < this.dateMin)
|
|
141
|
-
return false;
|
|
142
|
-
if (this.dateMax && date > this.dateMax)
|
|
143
|
-
return false;
|
|
144
|
-
return true;
|
|
145
|
-
}
|
|
146
|
-
selectDate(date) {
|
|
147
|
-
this.selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), this.hour, this.minute);
|
|
148
|
-
}
|
|
149
|
-
selectHour(hour) {
|
|
150
|
-
this.hour = Number(hour);
|
|
151
|
-
this.selectedDate.setHours(this.hour);
|
|
152
|
-
}
|
|
153
|
-
selectMinute(minute) {
|
|
154
|
-
this.minute = Number(minute);
|
|
155
|
-
this.selectedDate.setMinutes(this.minute);
|
|
156
|
-
}
|
|
157
|
-
isSameDay(a, b) {
|
|
158
|
-
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
159
|
-
}
|
|
160
|
-
isSameMonth(a, b) {
|
|
161
|
-
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
|
|
162
|
-
}
|
|
163
|
-
isSameHour(hour) {
|
|
164
|
-
return this.selectedDate.getHours() === Number(hour);
|
|
165
|
-
}
|
|
166
|
-
isSameMinute(minute) {
|
|
167
|
-
return this.selectedDate.getMinutes() === Number(minute);
|
|
168
|
-
}
|
|
169
|
-
save(reset) {
|
|
170
|
-
this._modal.dismiss(reset ? '' : this.selectedDate);
|
|
171
|
-
}
|
|
172
|
-
close() {
|
|
173
|
-
this._modal.dismiss();
|
|
174
|
-
}
|
|
175
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
176
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarPickerComponent, isStandalone: true, selector: "idea-calendar-picker", inputs: { inputDate: "inputDate", timePicker: "timePicker", manualTimePicker: "manualTimePicker", title: "title", hideClearButton: "hideClearButton", min: "min", max: "max" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate.getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid; track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid[i][j], today) || isSameDay(calendarGrid[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid[i][j], refDate)\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid[i][j])\"\n (click)=\"selectDate(calendarGrid[i][j])\"\n >\n {{ calendarGrid[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-content{--background: var(--ion-color-white)}h1{margin:10px}.headerLabel{font-size:.7em;font-weight:700;text-transform:uppercase}ion-col,ion-button{font-size:.95em}ion-button{margin:3px 0}ion-footer ion-toolbar{--min-height: 40px}.tappable{cursor:pointer}.manualTimePicker{padding:20px}.manualTimePicker input[type=number],.manualTimePicker span{font-size:2.5em}.manualTimePicker input[type=number]{border:none;border-bottom:2px solid var(--ion-color-dark);text-align:center}.manualTimePicker span{padding-left:4px;padding-right:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: IDEATranslatePipe, name: "translate" }, { kind: "pipe", type: IDEALocalizedDatePipe, name: "dateLocale" }, { kind: "component", type: IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: IonRow, selector: "ion-row" }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }] }); }
|
|
177
|
-
}
|
|
178
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarPickerComponent, decorators: [{
|
|
179
|
-
type: Component,
|
|
180
|
-
args: [{ selector: 'idea-calendar-picker', standalone: true, imports: [
|
|
181
|
-
CommonModule,
|
|
182
|
-
FormsModule,
|
|
183
|
-
IDEATranslatePipe,
|
|
184
|
-
IDEALocalizedDatePipe,
|
|
185
|
-
IonFooter,
|
|
186
|
-
IonInput,
|
|
187
|
-
IonCol,
|
|
188
|
-
IonRow,
|
|
189
|
-
IonContent,
|
|
190
|
-
IonGrid,
|
|
191
|
-
IonIcon,
|
|
192
|
-
IonButton,
|
|
193
|
-
IonButtons,
|
|
194
|
-
IonTitle,
|
|
195
|
-
IonToolbar,
|
|
196
|
-
IonHeader
|
|
197
|
-
], template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate.getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid; track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid[i][j], today) || isSameDay(calendarGrid[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid[i][j], refDate)\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid[i][j])\"\n (click)=\"selectDate(calendarGrid[i][j])\"\n >\n {{ calendarGrid[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-content{--background: var(--ion-color-white)}h1{margin:10px}.headerLabel{font-size:.7em;font-weight:700;text-transform:uppercase}ion-col,ion-button{font-size:.95em}ion-button{margin:3px 0}ion-footer ion-toolbar{--min-height: 40px}.tappable{cursor:pointer}.manualTimePicker{padding:20px}.manualTimePicker input[type=number],.manualTimePicker span{font-size:2.5em}.manualTimePicker input[type=number]{border:none;border-bottom:2px solid var(--ion-color-dark);text-align:center}.manualTimePicker span{padding-left:4px;padding-right:4px}\n"] }]
|
|
198
|
-
}], propDecorators: { inputDate: [{
|
|
199
|
-
type: Input
|
|
200
|
-
}], timePicker: [{
|
|
201
|
-
type: Input
|
|
202
|
-
}], manualTimePicker: [{
|
|
203
|
-
type: Input
|
|
204
|
-
}], title: [{
|
|
205
|
-
type: Input
|
|
206
|
-
}], hideClearButton: [{
|
|
207
|
-
type: Input
|
|
208
|
-
}], min: [{
|
|
209
|
-
type: Input
|
|
210
|
-
}], max: [{
|
|
211
|
-
type: Input
|
|
212
|
-
}] } });
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsRUFDZixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixRQUFRLEVBQ1IsVUFBVSxFQUNWLFNBQVMsRUFDVCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1YsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7O0FBRXZHOztHQUVHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBMEJ6QixNQUFNLE9BQU8sMkJBQTJCO0lBeEJ4QztRQXlCVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBRzVDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpC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USxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQWxlcnRDb250cm9sbGVyLFxuICBNb2RhbENvbnRyb2xsZXIsXG4gIElvbkhlYWRlcixcbiAgSW9uVG9vbGJhcixcbiAgSW9uVGl0bGUsXG4gIElvbkJ1dHRvbnMsXG4gIElvbkJ1dHRvbixcbiAgSW9uSWNvbixcbiAgSW9uR3JpZCxcbiAgSW9uQ29udGVudCxcbiAgSW9uUm93LFxuICBJb25Db2wsXG4gIElvbklucHV0LFxuICBJb25Gb290ZXJcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBlcG9jaERhdGVUaW1lLCBlcG9jaElTT1N0cmluZyB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQgeyBJREVBTG9jYWxpemVkRGF0ZVBpcGUsIElERUFUcmFuc2xhdGVQaXBlLCBJREVBVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbi8qKlxuICogQSByYW5kb20gc3VuZGF5LCB1c2VkIGFzIHJlZmVyZW5jZSB0byBjYWxjdWxhdGUgdGhlIHdlZWsgZGF5cy5cbiAqL1xuY29uc3QgU1VOREFZID0gMjU5MjAwMDAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLXBpY2tlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSURFQVRyYW5zbGF0ZVBpcGUsXG4gICAgSURFQUxvY2FsaXplZERhdGVQaXBlLFxuICAgIElvbkZvb3RlcixcbiAgICBJb25JbnB1dCxcbiAgICBJb25Db2wsXG4gICAgSW9uUm93LFxuICAgIElvbkNvbnRlbnQsXG4gICAgSW9uR3JpZCxcbiAgICBJb25JY29uLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25CdXR0b25zLFxuICAgIElvblRpdGxlLFxuICAgIElvblRvb2xiYXIsXG4gICAgSW9uSGVhZGVyXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIF9tb2RhbCA9IGluamVjdChNb2RhbENvbnRyb2xsZXIpO1xuICBwcml2YXRlIF9hbGVydCA9IGluamVjdChBbGVydENvbnRyb2xsZXIpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIGlucHV0RGF0ZTogZXBvY2hEYXRlVGltZSB8IGVwb2NoSVNPU3RyaW5nO1xuICBASW5wdXQoKSB0aW1lUGlja2VyID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hbnVhbFRpbWVQaWNrZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgaGlkZUNsZWFyQnV0dG9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbjogZXBvY2hEYXRlVGltZSB8IGVwb2NoSVNPU3RyaW5nO1xuICBASW5wdXQoKSBtYXg6IGVwb2NoRGF0ZVRpbWUgfCBlcG9jaElTT1N0cmluZztcblxuICByZWZEYXRlOiBEYXRlO1xuICBzZWxlY3RlZERhdGU6IERhdGU7XG4gIHRvZGF5OiBEYXRlO1xuICBjYWxlbmRhckdyaWQ6IERhdGVbXVtdO1xuICBob3VyOiBudW1iZXI7XG4gIG1pbnV0ZTogbnVtYmVyO1xuICBob3Vyczogc3RyaW5nW107XG4gIG1pbnV0ZXM6IHN0cmluZ1tdO1xuICB3ZWVrRGF5czogc3RyaW5nW107XG4gIGRhdGVNaW46IERhdGU7XG4gIGRhdGVNYXg6IERhdGU7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy50b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5yZWZEYXRlID0gdGhpcy5pbnB1dERhdGUgPyBuZXcgRGF0ZSh0aGlzLmlucHV0RGF0ZSkgOiBuZXcgRGF0ZSh0aGlzLnRvZGF5KTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMucmVmRGF0ZSk7XG4gICAgdGhpcy5ob3VyID0gMTI7IC8vIHRvIGVuZHVyZSB0aW1lem9uZXNcbiAgICB0aGlzLm1pbnV0ZSA9IDA7XG4gICAgaWYgKHRoaXMudGltZVBpY2tlciB8fCB0aGlzLm1hbnVhbFRpbWVQaWNrZXIpIHtcbiAgICAgIHRoaXMuaG91ciA9IHRoaXMuc2VsZWN0ZWREYXRlLmdldEhvdXJzKCk7XG4gICAgICBpZiAodGhpcy5tYW51YWxUaW1lUGlja2VyKSB0aGlzLm1pbnV0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyByb3VuZCB0aGUgbWludXRlcyBhIG11bHRpcGxlIG9mIDVcbiAgICAgICAgdGhpcy5taW51dGUgPSBNYXRoLmNlaWwodGhpcy5zZWxlY3RlZERhdGUuZ2V0TWludXRlcygpIC8gNSkgKiA1O1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5zZXRNaW51dGVzKHRoaXMubWludXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5idWlsZENhbGVuZGFyR3JpZCh0aGlzLnJlZkRhdGUpO1xuICAgIHRoaXMuaG91cnMgPSBBcnJheS5mcm9tKEFycmF5KDI0KS5rZXlzKCkpLm1hcChpID0+ICcwJy5jb25jYXQoaS50b1N0cmluZygpKS5zbGljZSgtMikpO1xuICAgIHRoaXMubWludXRlcyA9IEFycmF5LmZyb20oQXJyYXkoMTIpLmtleXMoKSkubWFwKGkgPT4gJzAnLmNvbmNhdCgoaSAqIDUpLnRvU3RyaW5nKCkpLnNsaWNlKC0yKSk7XG4gICAgLy8gYnVpbGQgdGhlIHdlZWtkYXlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvY2FsZVxuICAgIHRoaXMud2Vla0RheXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGNvbnN0IHJlZkRhdGVGb3JXZWVrRGF5cyA9IG5ldyBEYXRlKFNVTkRBWSk7XG4gICAgcmVmRGF0ZUZvcldlZWtEYXlzLnNldERhdGUocmVmRGF0ZUZvcldlZWtEYXlzLmdldERhdGUoKSAtIHRoaXMuZ2V0TG9jYWxpc2VkRGF5KHJlZkRhdGVGb3JXZWVrRGF5cykpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICB0aGlzLndlZWtEYXlzLnB1c2gocmVmRGF0ZUZvcldlZWtEYXlzLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLl90cmFuc2xhdGUuZ2V0Q3VycmVudExhbmcoKSwgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pKTtcbiAgICAgIHJlZkRhdGVGb3JXZWVrRGF5cy5zZXREYXRlKHJlZkRhdGVGb3JXZWVrRGF5cy5nZXREYXRlKCkgKyAxKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWluKSB0aGlzLmRhdGVNaW4gPSBuZXcgRGF0ZSh0aGlzLm1pbik7XG4gICAgaWYgKHRoaXMubWF4KSB0aGlzLmRhdGVNYXggPSBuZXcgRGF0ZSh0aGlzLm1heCk7XG4gIH1cblxuICBnZXRMb2NhbGlzZWREYXkoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgbGV0IG4gPSBkYXRlLmdldERheSgpO1xuICAgIHN3aXRjaCAodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCkpIHtcbiAgICAgIGNhc2UgJ2l0JzpcbiAgICAgICAgbiA9IC0tbiA8IDAgPyA2IDogbjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG5cbiAgYnVpbGRDYWxlbmRhckdyaWQocmVmRGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGRheSBpbiB0aGUgbW9udGg6IHRoZSBpbXBvcnRhbnQgZGF0YSBoZXJlIGlzIHRoZSBkYXkgb2YgdGhlIHdlZWtcbiAgICBjb25zdCBmaXJzdERhdGVPZk1vbnRoID0gbmV3IERhdGUocmVmRGF0ZS5nZXRGdWxsWWVhcigpLCByZWZEYXRlLmdldE1vbnRoKCksIDEpO1xuICAgIC8vIHRoZSBmb2xsb3dpbmcgZmxhZyBpcyB1c2VkIHRvIGRpdmlkZSB0aGUgbG9naWMgc28gSSBjYW4gZmlsbCB0aGUgY2FsZW5kYXJcbiAgICAvLyBhbHNvIHdpdGggdGhlIGRhdGVzIGZyb20gdGhlIHByZXZpb3VzIG1vbnRoLCB1bnRpbCB0aGVyZSdzIHNwYWNlIGluIHRoZSBncmlkXG4gICAgbGV0IGhhdmVudEZvdW5kRmlyc3REYXkgPSB0cnVlO1xuICAgIC8vIGluZGV4IHVzZWQgdG8gYnVpbGQgdGhlIGRhdGVzIG9mIHRoZSBtb250aCwgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgb25lXG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICB0aGlzLmNhbGVuZGFyR3JpZCA9IG5ldyBBcnJheTxEYXRlW10+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJHcmlkW2ldID0gbmV3IEFycmF5PERhdGU+KCk7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDc7IGorKykge1xuICAgICAgICBpZiAoaGF2ZW50Rm91bmRGaXJzdERheSkge1xuICAgICAgICAgIGlmICh0aGlzLmdldExvY2FsaXNlZERheShmaXJzdERhdGVPZk1vbnRoKSA9PT0gaikge1xuICAgICAgICAgICAgLy8gbm90ZTogY29uc2lkZXJzIFN1bmRheVxuICAgICAgICAgICAgaGF2ZW50Rm91bmRGaXJzdERheSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhckdyaWRbaV1bal0gPSBuZXcgRGF0ZShmaXJzdERhdGVPZk1vbnRoKTtcbiAgICAgICAgICAgIC8vIG5vdyB0aGUgSSd2ZSBmb3VuZCB0aGUgZmlyc3QgZGF0ZSBvZiB0aGUgbW9udGggSSBjYW4gZmlsbCB0aGUgY2FsZW5kYXJcbiAgICAgICAgICAgIC8vIHRoZSBkYXRlcyBmcm9tdCB0aGUgcHJldmlvdXMgbW9udGgsIHVudGlsIHRoZXJlJ3Mgc3BhY2UgaW4gdGhlIGdyaWRcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSB0aGlzLmdldExvY2FsaXNlZERheShmaXJzdERhdGVPZk1vbnRoKTsgeSA+PSAwOyB5LS0pIHtcbiAgICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGZpcnN0RGF0ZU9mTW9udGgpO1xuICAgICAgICAgICAgICBkLnNldERhdGUoZmlyc3REYXRlT2ZNb250aC5nZXREYXRlKCkgLSB5KTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhckdyaWRbaV1bdGhpcy5nZXRMb2NhbGlzZWREYXkoZmlyc3REYXRlT2ZNb250aCkgLSB5XSA9IGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGZpbGwgdGhlIGZvbGxvd2luZyBkYXRlcyB1bnRpbCB0aGVyZSdzIHNwYWNlIGluIHRoZSBncmlkXG4gICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGZpcnN0RGF0ZU9mTW9udGgpO1xuICAgICAgICAgIGQuc2V0RGF0ZShmaXJzdERhdGVPZk1vbnRoLmdldERhdGUoKSArIGluZGV4KyspO1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJHcmlkW2ldW2pdID0gZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFllYXJzKG9mZnNldDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZWZEYXRlLnNldEZ1bGxZZWFyKHRoaXMucmVmRGF0ZS5nZXRGdWxsWWVhcigpICsgb2Zmc2V0KTtcbiAgICB0aGlzLmJ1aWxkQ2FsZW5kYXJHcmlkKHRoaXMucmVmRGF0ZSk7XG4gIH1cbiAgc2V0WWVhcih5ZWFyOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXllYXIpIHJldHVybjtcblxuICAgIHRoaXMucmVmRGF0ZS5zZXRGdWxsWWVhcihOdW1iZXIoeWVhcikpO1xuICAgIHRoaXMuYnVpbGRDYWxlbmRhckdyaWQodGhpcy5yZWZEYXRlKTtcbiAgfVxuICBhZGRNb250aHMob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZkRhdGUuc2V0TW9udGgodGhpcy5yZWZEYXRlLmdldE1vbnRoKCkgKyBvZmZzZXQpO1xuICAgIHRoaXMuYnVpbGRDYWxlbmRhckdyaWQodGhpcy5yZWZEYXRlKTtcbiAgfVxuICBhc3luYyBzaG93TW9udGhzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBbXTtcbiAgICBjb25zdCBpbnB1dHM6IGFueVtdID0gW107XG4gICAgY29uc3QgbW9udGggPSBuZXcgRGF0ZSgwKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdyYWRpbycsXG4gICAgICAgIGxhYmVsOiBtb250aC50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIHsgbW9udGg6ICdsb25nJyB9KSxcbiAgICAgICAgdmFsdWU6IGkudG9TdHJpbmcoKSxcbiAgICAgICAgY2hlY2tlZDogaSA9PT0gdGhpcy5yZWZEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgICB9KTtcbiAgICAgIG1vbnRoLnNldE1vbnRoKG1vbnRoLmdldE1vbnRoKCkgKyAxKTtcbiAgICB9XG4gICAgYnV0dG9ucy5wdXNoKHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5DQU5DRUwnKSwgcm9sZTogJ2NhbmNlbCcgfSk7XG4gICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgIHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uU0VMRUNUJyksXG4gICAgICBoYW5kbGVyOiAobTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVmRGF0ZS5zZXRNb250aChwYXJzZUludChtLCAxMCkgLSAxKTtcbiAgICAgICAgdGhpcy5idWlsZENhbGVuZGFyR3JpZCh0aGlzLnJlZkRhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5DQUxFTkRBUi5NT05USCcpLFxuICAgICAgYnV0dG9ucyxcbiAgICAgIGlucHV0c1xuICAgIH0pO1xuICAgIGFsZXJ0LnByZXNlbnQoKTtcbiAgfVxuXG4gIGlzRGF0ZVNlbGVjdGFibGUoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRhdGVNaW4gJiYgZGF0ZSA8IHRoaXMuZGF0ZU1pbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmRhdGVNYXggJiYgZGF0ZSA+IHRoaXMuZGF0ZU1heCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2VsZWN0RGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCksIHRoaXMuaG91ciwgdGhpcy5taW51dGUpO1xuICB9XG5cbiAgc2VsZWN0SG91cihob3VyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmhvdXIgPSBOdW1iZXIoaG91cik7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0SG91cnModGhpcy5ob3VyKTtcbiAgfVxuICBzZWxlY3RNaW51dGUobWludXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1pbnV0ZSA9IE51bWJlcihtaW51dGUpO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldE1pbnV0ZXModGhpcy5taW51dGUpO1xuICB9XG5cbiAgaXNTYW1lRGF5KGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiYgYS5nZXRNb250aCgpID09PSBiLmdldE1vbnRoKCkgJiYgYS5nZXREYXRlKCkgPT09IGIuZ2V0RGF0ZSgpO1xuICB9XG4gIGlzU2FtZU1vbnRoKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiYgYS5nZXRNb250aCgpID09PSBiLmdldE1vbnRoKCk7XG4gIH1cblxuICBpc1NhbWVIb3VyKGhvdXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRIb3VycygpID09PSBOdW1iZXIoaG91cik7XG4gIH1cbiAgaXNTYW1lTWludXRlKG1pbnV0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlLmdldE1pbnV0ZXMoKSA9PT0gTnVtYmVyKG1pbnV0ZSk7XG4gIH1cblxuICBzYXZlKHJlc2V0PzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MocmVzZXQgPyAnJyA6IHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgfVxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tdGl0bGU+e3sgdGl0bGUgfX08L2lvbi10aXRsZT5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgQGlmICghaGlkZUNsZWFyQnV0dG9uKSB7XG4gICAgICAgIDxpb24tYnV0dG9uIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DQUxFTkRBUi5SRVNFVCcgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwic2F2ZSh0cnVlKVwiPlxuICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImFycm93LXVuZG9cIiAvPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICB9XG4gICAgICA8aW9uLWJ1dHRvbiBbdGl0bGVdPVwiJ0lERUFfVU5DT01NT04uQ0FMRU5EQVIuQ0xPU0VfV0lUSE9VVF9TQVZJTkcnIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2xvc2VcIiAvPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG48aW9uLWNvbnRlbnQ+XG4gIDxpb24tZ3JpZCBmaXhlZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aDEgY2xhc3M9XCJoZWFkZXJMYWJlbFwiPnt7ICdJREVBX1VOQ09NTU9OLkNBTEVOREFSLlNFVF9EQVRFJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgPC9pb24tcm93PlxuICAgIDxpb24tcm93IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4XCI+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjVcIj5cbiAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyIGlvbi1qdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1yaWdodCBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjNcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJhZGRZZWFycygtMSlcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2hldnJvbi1iYWNrXCIgLz5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmcgdGFwcGFibGVcIiBbc2l6ZV09XCI2XCI+XG4gICAgICAgICAgICA8aW9uLWlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidJREVBX1VOQ09NTU9OLkNBTEVOREFSLllFQVInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJlZkRhdGUuZ2V0RnVsbFllYXIoKVwiXG4gICAgICAgICAgICAgIChpb25Gb2N1cyk9XCIkZXZlbnQudGFyZ2V0LnZhbHVlID0gJydcIlxuICAgICAgICAgICAgICAoaW9uQ2hhbmdlKT1cInNldFllYXIoJGV2ZW50Py50YXJnZXQ/LnZhbHVlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2lvbi1pbnB1dD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1sZWZ0IGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiM1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImFkZFllYXJzKCsxKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjaGV2cm9uLWZvcndhcmRcIiAvPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCI3XCI+XG4gICAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHQgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCIzXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiYWRkTW9udGhzKC0xKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjaGV2cm9uLWJhY2tcIiAvPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZyB0YXBwYWJsZVwiIFtzaXplXT1cIjZcIiAoY2xpY2spPVwic2hvd01vbnRocygpXCI+XG4gICAgICAgICAgICB7eyByZWZEYXRlIHwgZGF0ZUxvY2FsZTogJ01NTU0nIH19XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtbGVmdCBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjNcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJhZGRNb250aHMoKzEpXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImNoZXZyb24tZm9yd2FyZFwiIC8+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICAgIDxpb24tcm93IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4XCIgY2xhc3M9XCJoZWFkZXJMYWJlbFwiPlxuICAgICAgQGZvciAoZGRkIG9mIHdlZWtEYXlzOyB0cmFjayBkZGQpIHtcbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICB7eyBkZGQgfX1cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgfVxuICAgIDwvaW9uLXJvdz5cbiAgICBAZm9yIChyb3cgb2YgY2FsZW5kYXJHcmlkOyB0cmFjayByb3c7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgQGZvciAoY29sIG9mIHJvdzsgdHJhY2sgY29sOyBsZXQgaiA9ICRpbmRleCkge1xuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIlxuICAgICAgICAgICAgICAgIGlzU2FtZURheShjYWxlbmRhckdyaWRbaV1bal0sIHRvZGF5KSB8fCBpc1NhbWVEYXkoY2FsZW5kYXJHcmlkW2ldW2pdLCBzZWxlY3RlZERhdGUpXG4gICAgICAgICAgICAgICAgICA/ICdwcmltYXJ5J1xuICAgICAgICAgICAgICAgICAgOiBpc1NhbWVNb250aChjYWxlbmRhckdyaWRbaV1bal0sIHJlZkRhdGUpXG4gICAgICAgICAgICAgICAgICAgID8gJ2RhcmsnXG4gICAgICAgICAgICAgICAgICAgIDogJ21lZGl1bSdcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2ZpbGxdPVwiXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KGNhbGVuZGFyR3JpZFtpXVtqXSwgc2VsZWN0ZWREYXRlKVxuICAgICAgICAgICAgICAgICAgPyAnc29saWQnXG4gICAgICAgICAgICAgICAgICA6IGlzU2FtZURheShjYWxlbmRhckdyaWRbaV1bal0sIHRvZGF5KVxuICAgICAgICAgICAgICAgICAgICA/ICdvdXRsaW5lJ1xuICAgICAgICAgICAgICAgICAgICA6ICdjbGVhcidcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0RhdGVTZWxlY3RhYmxlKGNhbGVuZGFyR3JpZFtpXVtqXSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShjYWxlbmRhckdyaWRbaV1bal0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgY2FsZW5kYXJHcmlkW2ldW2pdIHwgZGF0ZTogJ2QnIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICB9XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfVxuICAgIEBpZiAodGltZVBpY2tlciB8fCBtYW51YWxUaW1lUGlja2VyKSB7XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGgxIGNsYXNzPVwiaGVhZGVyTGFiZWxcIj5cbiAgICAgICAgICB7eyAnSURFQV9VTkNPTU1PTi5DQUxFTkRBUi5TRVRfVElNRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9oMT5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG4gICAgQGlmICh0aW1lUGlja2VyKSB7XG4gICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjdcIj5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIEBmb3IgKGhvdXIgb2YgaG91cnM7IHRyYWNrIGhvdXIpIHtcbiAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpc1NhbWVIb3VyKGhvdXIpID8gJ3ByaW1hcnknIDogJ2RhcmsnXCJcbiAgICAgICAgICAgICAgICAgIFtmaWxsXT1cImlzU2FtZUhvdXIoaG91cikgPyAnc29saWQnIDogJ2NsZWFyJ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SG91cihob3VyKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaG91ciB9fVxuICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjFcIj4gOiA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCI0XCI+XG4gICAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgICBAZm9yIChtaW51dGUgb2YgbWludXRlczsgdHJhY2sgbWludXRlKSB7XG4gICAgICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiNFwiPlxuICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBbY29sb3JdPVwiaXNTYW1lTWludXRlKG1pbnV0ZSkgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgICAgICAgICAgW2ZpbGxdPVwiaXNTYW1lTWludXRlKG1pbnV0ZSkgPyAnc29saWQnIDogJ2NsZWFyJ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TWludXRlKG1pbnV0ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IG1pbnV0ZSB9fVxuICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgICBAaWYgKG1hbnVhbFRpbWVQaWNrZXIpIHtcbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlciBtYW51YWxUaW1lUGlja2VyXCI+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMTJcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIyM1wiIFt2YWx1ZV09XCJob3VyXCIgKGNoYW5nZSk9XCJzZWxlY3RIb3VyKCRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICA8c3Bhbj46PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjU5XCIgW3ZhbHVlXT1cIm1pbnV0ZVwiIChjaGFuZ2UpPVwic2VsZWN0TWludXRlKCRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgPC9pb24tZ3JpZD5cbjwvaW9uLWNvbnRlbnQ+XG48aW9uLWZvb3Rlcj5cbiAgPGlvbi10b29sYmFyIGNvbG9yPVwiaWRlYVRvb2xiYXJcIiBjbGFzcz1cInRhcHBhYmxlXCIgKGNsaWNrKT1cInNhdmUoKVwiPlxuICAgIDxpb24tdGl0bGUgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hlY2ttYXJrXCIgLz5cbiAgICA8L2lvbi10aXRsZT5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWZvb3Rlcj5cbiJdfQ==
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
|
|
3
|
-
import { ModalController, IonItem, IonButton, IonIcon, IonLabel, IonText } from '@ionic/angular/standalone';
|
|
4
|
-
import { IDEATranslationsService } from '@idea-ionic/common';
|
|
5
|
-
import { IDEACalendarPickerComponent } from './calendarPicker.component';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class IDEADateTimeComponent {
|
|
8
|
-
constructor() {
|
|
9
|
-
this._modal = inject(ModalController);
|
|
10
|
-
this._translate = inject(IDEATranslationsService);
|
|
11
|
-
/**
|
|
12
|
-
* Whether to show the time picker (datetime) or not (date).
|
|
13
|
-
*/
|
|
14
|
-
this.timePicker = false;
|
|
15
|
-
/**
|
|
16
|
-
* Whether to show the MANUAL time picker (datetime) or not (date).
|
|
17
|
-
*/
|
|
18
|
-
this.manualTimePicker = false;
|
|
19
|
-
/**
|
|
20
|
-
* Whether to use the `epochISOString` format instead of `epochDateTime`.
|
|
21
|
-
*/
|
|
22
|
-
this.useISOFormat = false;
|
|
23
|
-
/**
|
|
24
|
-
* If true, the component is disabled.
|
|
25
|
-
*/
|
|
26
|
-
this.disabled = false;
|
|
27
|
-
/**
|
|
28
|
-
* If true, the obligatory dot is shown.
|
|
29
|
-
*/
|
|
30
|
-
this.obligatory = false;
|
|
31
|
-
/**
|
|
32
|
-
* If true, hidew the clear button in the header.
|
|
33
|
-
*/
|
|
34
|
-
this.hideClearButton = false;
|
|
35
|
-
this.dateChange = new EventEmitter();
|
|
36
|
-
this.iconSelect = new EventEmitter();
|
|
37
|
-
this.isOpening = false;
|
|
38
|
-
}
|
|
39
|
-
ngOnInit() {
|
|
40
|
-
this.langChangeSubscription = this._translate.onLangChange.subscribe(() => {
|
|
41
|
-
this.valueToDisplay = this.getValueToDisplay(this.date);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
ngOnDestroy() {
|
|
45
|
-
if (this.langChangeSubscription)
|
|
46
|
-
this.langChangeSubscription.unsubscribe();
|
|
47
|
-
}
|
|
48
|
-
ngOnChanges(changes) {
|
|
49
|
-
if (changes.date || changes.timePicker)
|
|
50
|
-
this.valueToDisplay = this.getValueToDisplay(this.date);
|
|
51
|
-
}
|
|
52
|
-
async openCalendarPicker() {
|
|
53
|
-
if (this.disabled || this.isOpening)
|
|
54
|
-
return;
|
|
55
|
-
this.isOpening = true;
|
|
56
|
-
const modal = await this._modal.create({
|
|
57
|
-
component: IDEACalendarPickerComponent,
|
|
58
|
-
componentProps: {
|
|
59
|
-
inputDate: this.date,
|
|
60
|
-
title: this.label,
|
|
61
|
-
timePicker: this.timePicker,
|
|
62
|
-
manualTimePicker: this.manualTimePicker,
|
|
63
|
-
hideClearButton: this.hideClearButton,
|
|
64
|
-
min: this.min,
|
|
65
|
-
max: this.max
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
modal.onDidDismiss().then(({ data }) => {
|
|
69
|
-
if (data !== undefined && data !== null) {
|
|
70
|
-
if (data === '')
|
|
71
|
-
this.doSelect(null);
|
|
72
|
-
else
|
|
73
|
-
this.doSelect(data);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
modal.present();
|
|
77
|
-
this.isOpening = false;
|
|
78
|
-
}
|
|
79
|
-
getValueToDisplay(date) {
|
|
80
|
-
return !date
|
|
81
|
-
? ''
|
|
82
|
-
: this._translate.formatDate(date, this.timePicker || this.manualTimePicker ? 'd MMM yyyy, HH:mm' : 'mediumDate');
|
|
83
|
-
}
|
|
84
|
-
doSelect(date) {
|
|
85
|
-
this.dateChange.emit(date ? (this.useISOFormat ? date.toISOString() : date.valueOf()) : null);
|
|
86
|
-
}
|
|
87
|
-
doIconSelect(event) {
|
|
88
|
-
if (event)
|
|
89
|
-
event.stopPropagation();
|
|
90
|
-
this.iconSelect.emit();
|
|
91
|
-
}
|
|
92
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEADateTimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
93
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEADateTimeComponent, isStandalone: true, selector: "idea-date-time", inputs: { date: "date", timePicker: "timePicker", manualTimePicker: "manualTimePicker", useISOFormat: "useISOFormat", label: "label", icon: "icon", iconColor: "iconColor", lines: "lines", color: "color", placeholder: "placeholder", disabled: "disabled", obligatory: "obligatory", hideClearButton: "hideClearButton", min: "min", max: "max" }, outputs: { dateChange: "dateChange", iconSelect: "iconSelect" }, usesOnChanges: true, ngImport: i0, template: `
|
|
94
|
-
<ion-item
|
|
95
|
-
class="dateTimeItem"
|
|
96
|
-
[color]="color"
|
|
97
|
-
[lines]="lines"
|
|
98
|
-
[title]="placeholder || label || ''"
|
|
99
|
-
[button]="!disabled"
|
|
100
|
-
[disabled]="isOpening"
|
|
101
|
-
[class.withLabel]="label"
|
|
102
|
-
(click)="openCalendarPicker()"
|
|
103
|
-
>
|
|
104
|
-
@if (icon) {
|
|
105
|
-
<ion-button
|
|
106
|
-
fill="clear"
|
|
107
|
-
slot="start"
|
|
108
|
-
[color]="iconColor"
|
|
109
|
-
[class.marginTop]="label"
|
|
110
|
-
(click)="doIconSelect($event)"
|
|
111
|
-
>
|
|
112
|
-
<ion-icon [icon]="icon" slot="icon-only" />
|
|
113
|
-
</ion-button>
|
|
114
|
-
}
|
|
115
|
-
@if (label) {
|
|
116
|
-
<ion-label position="stacked" [class.selectable]="!disabled">
|
|
117
|
-
{{ label }}
|
|
118
|
-
@if (obligatory && !disabled) {
|
|
119
|
-
<ion-text class="obligatoryDot" />
|
|
120
|
-
}
|
|
121
|
-
</ion-label>
|
|
122
|
-
}
|
|
123
|
-
<ion-label class="value" [class.selectable]="!disabled">
|
|
124
|
-
@if (!valueToDisplay && !disabled) {
|
|
125
|
-
<ion-text class="placeholder" [class.selectable]="!disabled">
|
|
126
|
-
{{ placeholder }}
|
|
127
|
-
</ion-text>
|
|
128
|
-
}
|
|
129
|
-
{{ valueToDisplay }}
|
|
130
|
-
</ion-label>
|
|
131
|
-
@if (!disabled) {
|
|
132
|
-
<ion-icon slot="end" icon="caret-down" class="selectIcon" [class.selectable]="!disabled" />
|
|
133
|
-
}
|
|
134
|
-
</ion-item>
|
|
135
|
-
`, isInline: true, styles: [".dateTimeItem{min-height:48px;height:auto}.dateTimeItem .description{margin:10px 0;height:20px;line-height:20px;width:100%}.dateTimeItem .placeholder{color:var(--ion-color-medium)}.dateTimeItem .value{white-space:nowrap}.dateTimeItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.dateTimeItem.withLabel{min-height:58px;height:auto}.dateTimeItem.withLabel .selectIcon{padding-top:25px}.dateTimeItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }] }); }
|
|
136
|
-
}
|
|
137
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEADateTimeComponent, decorators: [{
|
|
138
|
-
type: Component,
|
|
139
|
-
args: [{ selector: 'idea-date-time', standalone: true, imports: [CommonModule, IonText, IonLabel, IonIcon, IonButton, IonItem], template: `
|
|
140
|
-
<ion-item
|
|
141
|
-
class="dateTimeItem"
|
|
142
|
-
[color]="color"
|
|
143
|
-
[lines]="lines"
|
|
144
|
-
[title]="placeholder || label || ''"
|
|
145
|
-
[button]="!disabled"
|
|
146
|
-
[disabled]="isOpening"
|
|
147
|
-
[class.withLabel]="label"
|
|
148
|
-
(click)="openCalendarPicker()"
|
|
149
|
-
>
|
|
150
|
-
@if (icon) {
|
|
151
|
-
<ion-button
|
|
152
|
-
fill="clear"
|
|
153
|
-
slot="start"
|
|
154
|
-
[color]="iconColor"
|
|
155
|
-
[class.marginTop]="label"
|
|
156
|
-
(click)="doIconSelect($event)"
|
|
157
|
-
>
|
|
158
|
-
<ion-icon [icon]="icon" slot="icon-only" />
|
|
159
|
-
</ion-button>
|
|
160
|
-
}
|
|
161
|
-
@if (label) {
|
|
162
|
-
<ion-label position="stacked" [class.selectable]="!disabled">
|
|
163
|
-
{{ label }}
|
|
164
|
-
@if (obligatory && !disabled) {
|
|
165
|
-
<ion-text class="obligatoryDot" />
|
|
166
|
-
}
|
|
167
|
-
</ion-label>
|
|
168
|
-
}
|
|
169
|
-
<ion-label class="value" [class.selectable]="!disabled">
|
|
170
|
-
@if (!valueToDisplay && !disabled) {
|
|
171
|
-
<ion-text class="placeholder" [class.selectable]="!disabled">
|
|
172
|
-
{{ placeholder }}
|
|
173
|
-
</ion-text>
|
|
174
|
-
}
|
|
175
|
-
{{ valueToDisplay }}
|
|
176
|
-
</ion-label>
|
|
177
|
-
@if (!disabled) {
|
|
178
|
-
<ion-icon slot="end" icon="caret-down" class="selectIcon" [class.selectable]="!disabled" />
|
|
179
|
-
}
|
|
180
|
-
</ion-item>
|
|
181
|
-
`, styles: [".dateTimeItem{min-height:48px;height:auto}.dateTimeItem .description{margin:10px 0;height:20px;line-height:20px;width:100%}.dateTimeItem .placeholder{color:var(--ion-color-medium)}.dateTimeItem .value{white-space:nowrap}.dateTimeItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.dateTimeItem.withLabel{min-height:58px;height:auto}.dateTimeItem.withLabel .selectIcon{padding-top:25px}.dateTimeItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}\n"] }]
|
|
182
|
-
}], propDecorators: { date: [{
|
|
183
|
-
type: Input
|
|
184
|
-
}], timePicker: [{
|
|
185
|
-
type: Input
|
|
186
|
-
}], manualTimePicker: [{
|
|
187
|
-
type: Input
|
|
188
|
-
}], useISOFormat: [{
|
|
189
|
-
type: Input
|
|
190
|
-
}], label: [{
|
|
191
|
-
type: Input
|
|
192
|
-
}], icon: [{
|
|
193
|
-
type: Input
|
|
194
|
-
}], iconColor: [{
|
|
195
|
-
type: Input
|
|
196
|
-
}], lines: [{
|
|
197
|
-
type: Input
|
|
198
|
-
}], color: [{
|
|
199
|
-
type: Input
|
|
200
|
-
}], placeholder: [{
|
|
201
|
-
type: Input
|
|
202
|
-
}], disabled: [{
|
|
203
|
-
type: Input
|
|
204
|
-
}], obligatory: [{
|
|
205
|
-
type: Input
|
|
206
|
-
}], hideClearButton: [{
|
|
207
|
-
type: Input
|
|
208
|
-
}], min: [{
|
|
209
|
-
type: Input
|
|
210
|
-
}], max: [{
|
|
211
|
-
type: Input
|
|
212
|
-
}], dateChange: [{
|
|
213
|
-
type: Output
|
|
214
|
-
}], iconSelect: [{
|
|
215
|
-
type: Output
|
|
216
|
-
}] } });
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZVRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvZGF0ZVRpbWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUtaLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc1RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUF5RnpFLE1BQU0sT0FBTyxxQkFBcUI7SUF2RmxDO1FBd0ZVLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBTXJEOztXQUVHO1FBQ00sZUFBVSxHQUFHLEtBQUssQ0FBQztRQUM1Qjs7V0FFRztRQUNNLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUNsQzs7V0FFRztRQUNNLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBeUI5Qjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDMUI7O1dBRUc7UUFDTSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzVCOztXQUVHO1FBQ00sb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFVdkIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUErQyxDQUFDO1FBQzdFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBS2hELGNBQVMsR0FB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OEdBMUhVLHFCQUFxQjtrR0FBckIscUJBQXFCLHNmQW5GdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVCwya0JBM0NTLFlBQVksK0JBQUUsT0FBTyxnRkFBRSxRQUFRLDZGQUFFLE9BQU8sMkpBQUUsU0FBUyxvUEFBRSxPQUFPOzsyRkFvRjNELHFCQUFxQjtrQkF2RmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVDs4QkFnRFEsSUFBSTtzQkFBWixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsS0FBSztzQkFBYixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcsZUFBZTtzQkFBdkIsS0FBSztnQkFJRyxHQUFHO3NCQUFYLEtBQUs7Z0JBSUcsR0FBRztzQkFBWCxLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIE9uQ2hhbmdlcyxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBJb25JdGVtLCBJb25CdXR0b24sIElvbkljb24sIElvbkxhYmVsLCBJb25UZXh0IH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGVwb2NoRGF0ZVRpbWUsIGVwb2NoSVNPU3RyaW5nIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7IElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUNhbGVuZGFyUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jYWxlbmRhclBpY2tlci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWRhdGUtdGltZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElvblRleHQsIElvbkxhYmVsLCBJb25JY29uLCBJb25CdXR0b24sIElvbkl0ZW1dLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24taXRlbVxuICAgICAgY2xhc3M9XCJkYXRlVGltZUl0ZW1cIlxuICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgIFtsaW5lc109XCJsaW5lc1wiXG4gICAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXIgfHwgbGFiZWwgfHwgJydcIlxuICAgICAgW2J1dHRvbl09XCIhZGlzYWJsZWRcIlxuICAgICAgW2Rpc2FibGVkXT1cImlzT3BlbmluZ1wiXG4gICAgICBbY2xhc3Mud2l0aExhYmVsXT1cImxhYmVsXCJcbiAgICAgIChjbGljayk9XCJvcGVuQ2FsZW5kYXJQaWNrZXIoKVwiXG4gICAgPlxuICAgICAgQGlmIChpY29uKSB7XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgIFtjb2xvcl09XCJpY29uQ29sb3JcIlxuICAgICAgICAgIFtjbGFzcy5tYXJnaW5Ub3BdPVwibGFiZWxcIlxuICAgICAgICAgIChjbGljayk9XCJkb0ljb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW9uLWljb24gW2ljb25dPVwiaWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKGxhYmVsKSB7XG4gICAgICAgIDxpb24tbGFiZWwgcG9zaXRpb249XCJzdGFja2VkXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkXCI+XG4gICAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgICAgICBAaWYgKG9ibGlnYXRvcnkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJvYmxpZ2F0b3J5RG90XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgfVxuICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cInZhbHVlXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkXCI+XG4gICAgICAgIEBpZiAoIXZhbHVlVG9EaXNwbGF5ICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cInBsYWNlaG9sZGVyXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkXCI+XG4gICAgICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIH1cbiAgICAgICAge3sgdmFsdWVUb0Rpc3BsYXkgfX1cbiAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgQGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBpY29uPVwiY2FyZXQtZG93blwiIGNsYXNzPVwic2VsZWN0SWNvblwiIFtjbGFzcy5zZWxlY3RhYmxlXT1cIiFkaXNhYmxlZFwiIC8+XG4gICAgICB9XG4gICAgPC9pb24taXRlbT5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmRhdGVUaW1lSXRlbSB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgLmRlc2NyaXB0aW9uIHtcbiAgICAgICAgICBtYXJnaW46IDEwcHggMDtcbiAgICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cbiAgICAgICAgLnBsYWNlaG9sZGVyIHtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIH1cbiAgICAgICAgLnZhbHVlIHtcbiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICB9XG4gICAgICAgIC5zZWxlY3RJY29uIHtcbiAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgICAgICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC5kYXRlVGltZUl0ZW0ud2l0aExhYmVsIHtcbiAgICAgICAgbWluLWhlaWdodDogNThweDtcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAuc2VsZWN0SWNvbiB7XG4gICAgICAgICAgcGFkZGluZy10b3A6IDI1cHg7XG4gICAgICAgIH1cbiAgICAgICAgaW9uLWJ1dHRvbltzbG90PSdzdGFydCddIHtcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAuc2VsZWN0YWJsZSB7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICBgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgSURFQURhdGVUaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgX21vZGFsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRlIHRvIHNob3cvcGljay5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGU6IGVwb2NoRGF0ZVRpbWUgfCBlcG9jaElTT1N0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdGltZSBwaWNrZXIgKGRhdGV0aW1lKSBvciBub3QgKGRhdGUpLlxuICAgKi9cbiAgQElucHV0KCkgdGltZVBpY2tlciA9IGZhbHNlO1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBNQU5VQUwgdGltZSBwaWNrZXIgKGRhdGV0aW1lKSBvciBub3QgKGRhdGUpLlxuICAgKi9cbiAgQElucHV0KCkgbWFudWFsVGltZVBpY2tlciA9IGZhbHNlO1xuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgdGhlIGBlcG9jaElTT1N0cmluZ2AgZm9ybWF0IGluc3RlYWQgb2YgYGVwb2NoRGF0ZVRpbWVgLlxuICAgKi9cbiAgQElucHV0KCkgdXNlSVNPRm9ybWF0ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaWNvbiBmb3IgdGhlIGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgaWNvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBpY29uLlxuICAgKi9cbiAgQElucHV0KCkgaWNvbkNvbG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaW5lcyBwcmVmZXJlbmNlcyBmb3IgdGhlIGl0ZW0uXG4gICAqL1xuICBASW5wdXQoKSBsaW5lczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbG9yIGZvciB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgY29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgcGxhY2Vob2xkZXIgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBvYmxpZ2F0b3J5IGRvdCBpcyBzaG93bi5cbiAgICovXG4gIEBJbnB1dCgpIG9ibGlnYXRvcnkgPSBmYWxzZTtcbiAgLyoqXG4gICAqIElmIHRydWUsIGhpZGV3IHRoZSBjbGVhciBidXR0b24gaW4gdGhlIGhlYWRlci5cbiAgICovXG4gIEBJbnB1dCgpIGhpZGVDbGVhckJ1dHRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogSWYgc2V0LCBpcyB0aGUgbWluaW11bSBkYXRlIHNlbGVjdGFibGUuXG4gICAqL1xuICBASW5wdXQoKSBtaW46IGVwb2NoRGF0ZVRpbWUgfCBlcG9jaElTT1N0cmluZztcbiAgLyoqXG4gICAqIElmIHNldCwgaXMgdGhlIG1heGltdW0gZGF0ZSBzZWxlY3RhYmxlLlxuICAgKi9cbiAgQElucHV0KCkgbWF4OiBlcG9jaERhdGVUaW1lIHwgZXBvY2hJU09TdHJpbmc7XG5cbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGVwb2NoRGF0ZVRpbWUgfCBlcG9jaElTT1N0cmluZyB8IG51bGwgfCBhbnk+KCk7XG4gIEBPdXRwdXQoKSBpY29uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHZhbHVlVG9EaXNwbGF5OiBzdHJpbmc7XG4gIHByaXZhdGUgbGFuZ0NoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGlzT3BlbmluZyA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubGFuZ0NoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuX3RyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMudmFsdWVUb0Rpc3BsYXkgPSB0aGlzLmdldFZhbHVlVG9EaXNwbGF5KHRoaXMuZGF0ZSk7XG4gICAgfSk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGFuZ0NoYW5nZVN1YnNjcmlwdGlvbikgdGhpcy5sYW5nQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmRhdGUgfHwgY2hhbmdlcy50aW1lUGlja2VyKSB0aGlzLnZhbHVlVG9EaXNwbGF5ID0gdGhpcy5nZXRWYWx1ZVRvRGlzcGxheSh0aGlzLmRhdGUpO1xuICB9XG5cbiAgYXN5bmMgb3BlbkNhbGVuZGFyUGlja2VyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuaXNPcGVuaW5nKSByZXR1cm47XG4gICAgdGhpcy5pc09wZW5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5fbW9kYWwuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogSURFQUNhbGVuZGFyUGlja2VyQ29tcG9uZW50LFxuICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgaW5wdXREYXRlOiB0aGlzLmRhdGUsXG4gICAgICAgIHRpdGxlOiB0aGlzLmxhYmVsLFxuICAgICAgICB0aW1lUGlja2VyOiB0aGlzLnRpbWVQaWNrZXIsXG4gICAgICAgIG1hbnVhbFRpbWVQaWNrZXI6IHRoaXMubWFudWFsVGltZVBpY2tlcixcbiAgICAgICAgaGlkZUNsZWFyQnV0dG9uOiB0aGlzLmhpZGVDbGVhckJ1dHRvbixcbiAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgbWF4OiB0aGlzLm1heFxuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGFsLm9uRGlkRGlzbWlzcygpLnRoZW4oKHsgZGF0YSB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGRhdGEgPT09ICcnKSB0aGlzLmRvU2VsZWN0KG51bGwpO1xuICAgICAgICBlbHNlIHRoaXMuZG9TZWxlY3QoZGF0YSBhcyBEYXRlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBtb2RhbC5wcmVzZW50KCk7XG4gICAgdGhpcy5pc09wZW5pbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVUb0Rpc3BsYXkoZGF0ZTogZXBvY2hEYXRlVGltZSB8IGVwb2NoSVNPU3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gIWRhdGVcbiAgICAgID8gJydcbiAgICAgIDogdGhpcy5fdHJhbnNsYXRlLmZvcm1hdERhdGUoZGF0ZSwgdGhpcy50aW1lUGlja2VyIHx8IHRoaXMubWFudWFsVGltZVBpY2tlciA/ICdkIE1NTSB5eXl5LCBISDptbScgOiAnbWVkaXVtRGF0ZScpO1xuICB9XG5cbiAgZG9TZWxlY3QoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KGRhdGUgPyAodGhpcy51c2VJU09Gb3JtYXQgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBkYXRlLnZhbHVlT2YoKSkgOiBudWxsKTtcbiAgfVxuICBkb0ljb25TZWxlY3QoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmljb25TZWxlY3QuZW1pdCgpO1xuICB9XG59XG4iXX0=
|