@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,171 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, Input, inject } from '@angular/core';
|
|
3
|
-
import { ModalController, IonHeader, IonToolbar, IonButtons, IonButton, IonIcon, IonTitle, IonContent, IonGrid, IonRow, IonCol, IonText, IonSegment, IonSegmentButton, IonLabel } from '@ionic/angular/standalone';
|
|
4
|
-
import { TimeInterval } from 'idea-toolbox';
|
|
5
|
-
import { IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class IDEAFromTimeToTimeComponent {
|
|
8
|
-
constructor() {
|
|
9
|
-
this._modal = inject(ModalController);
|
|
10
|
-
this._translate = inject(IDEATranslationsService);
|
|
11
|
-
/**
|
|
12
|
-
* Whether we should start picking the time displaying the afternoon (PM) or the morning (AM, default).
|
|
13
|
-
*/
|
|
14
|
-
this.period = Periods.AM;
|
|
15
|
-
this.Segments = Segments;
|
|
16
|
-
this.Periods = Periods;
|
|
17
|
-
}
|
|
18
|
-
ngOnInit() {
|
|
19
|
-
this.segment = Segments.FROM;
|
|
20
|
-
this.minutes = 30;
|
|
21
|
-
this.timeIntervalWC = new TimeInterval(this.timeInterval);
|
|
22
|
-
}
|
|
23
|
-
setInterval(hours, minutes) {
|
|
24
|
-
// adjust the hour based on the start of the interval and the settings of am/pm
|
|
25
|
-
hours = this.contextualizeHour(hours, minutes);
|
|
26
|
-
// convert the hours and minutes in milliseconds
|
|
27
|
-
const timeMs = this.timeToMs(hours, minutes);
|
|
28
|
-
// set the correct part of the interval, based on the current segment
|
|
29
|
-
if (this.segment === Segments.FROM) {
|
|
30
|
-
// set the start of the interval (from) and change the segment so that the end (to) will be picked
|
|
31
|
-
this.timeIntervalWC.from = timeMs;
|
|
32
|
-
this.segment = Segments.TO;
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
// can't proceed if from and to are equal
|
|
36
|
-
if (timeMs === this.timeIntervalWC.from)
|
|
37
|
-
return;
|
|
38
|
-
// set the end of the interval (to)
|
|
39
|
-
this.timeIntervalWC.to = timeMs;
|
|
40
|
-
// save the changes and notify the parent component
|
|
41
|
-
this.save();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
timeToMs(hours, minutes) {
|
|
45
|
-
return (hours * 60 * 60 + (minutes || 0) * 60) * 1000;
|
|
46
|
-
}
|
|
47
|
-
getClockButtonContent(hours, minutes) {
|
|
48
|
-
// adjust the hour based on the start of the interval and the settings of am/pm
|
|
49
|
-
hours = this.contextualizeHour(hours, minutes);
|
|
50
|
-
// convert the calculated time into a readable string; we need to format it to distinguish 0-24 vs 0-12 am/pm
|
|
51
|
-
const refDate = new Date();
|
|
52
|
-
refDate.setHours(hours, minutes || 0, 0);
|
|
53
|
-
const str = this._translate.formatDate(refDate, 'shortTime');
|
|
54
|
-
// remove the extra part (e.g. am/pm), based on the type of button we have to show
|
|
55
|
-
const strArr = str.split(':');
|
|
56
|
-
return String(Number(strArr[0])).concat(minutes ? ':'.concat(strArr[1].slice(0, 2)) : '');
|
|
57
|
-
}
|
|
58
|
-
contextualizeHour(hours, minutes) {
|
|
59
|
-
// adjust the content to the afternoon hours, if needed
|
|
60
|
-
if (this.period === Periods.PM)
|
|
61
|
-
hours += 12;
|
|
62
|
-
// if we already selected the start of the interval, check whether we need to adjust the time: the center of the
|
|
63
|
-
// clock will be moved to the selected hour (from), to have a reasonable set of choices for the end (to)
|
|
64
|
-
if (this.segment === Segments.TO && this.timeToMs(hours, minutes) < this.timeIntervalWC.from)
|
|
65
|
-
hours += this.period === Periods.PM ? -12 : 12;
|
|
66
|
-
// set midnight to 00
|
|
67
|
-
if (hours === 24)
|
|
68
|
-
hours = 0;
|
|
69
|
-
return hours;
|
|
70
|
-
}
|
|
71
|
-
equalsFrom(hours, minutes) {
|
|
72
|
-
// if the start of the interval hasn't been selected yet, skip it
|
|
73
|
-
if (this.segment === Segments.FROM)
|
|
74
|
-
return false;
|
|
75
|
-
// adjust the hour based on the start of the interval and the settings of am/pm
|
|
76
|
-
hours = this.contextualizeHour(hours, minutes);
|
|
77
|
-
// compare the two strings based on the timestamps in ms
|
|
78
|
-
return this.msToTimeString(this.timeIntervalWC.from) === this.msToTimeString(this.timeToMs(hours, minutes));
|
|
79
|
-
}
|
|
80
|
-
isAllowed(hours, minutes) {
|
|
81
|
-
// adjust the hour based on the start of the interval and the settings of am/pm
|
|
82
|
-
hours = this.contextualizeHour(hours, minutes);
|
|
83
|
-
// check whether the selected time is inside the given boundaries
|
|
84
|
-
return ((!this.notEarlierThan ||
|
|
85
|
-
this.timeToMs(hours, minutes) >= this.notEarlierThan ||
|
|
86
|
-
this.timeToMs(hours, minutes) === 0) &&
|
|
87
|
-
(!this.notLaterThan || this.timeToMs(hours, minutes) <= this.notLaterThan));
|
|
88
|
-
}
|
|
89
|
-
isHourOfOppositeMeridian(hours, minutes) {
|
|
90
|
-
// if the start of the interval hasn't been selected yet, skip it
|
|
91
|
-
if (this.segment === Segments.FROM)
|
|
92
|
-
return false;
|
|
93
|
-
// adjust the hour based on the start of the interval and the settings of am/pm
|
|
94
|
-
hours = this.contextualizeHour(hours, minutes);
|
|
95
|
-
// calculate the ms of the selected time and of "noon" time (to determ the meridian)
|
|
96
|
-
const timeMs = this.timeToMs(hours, minutes);
|
|
97
|
-
const noonMs = this.timeToMs(12);
|
|
98
|
-
// return true in case the hour doesn't belong to the current meridian
|
|
99
|
-
return (this.period === Periods.AM && timeMs > noonMs) || (this.period === Periods.PM && timeMs < noonMs);
|
|
100
|
-
}
|
|
101
|
-
msToTimeString(time) {
|
|
102
|
-
if (!time)
|
|
103
|
-
return '';
|
|
104
|
-
// note: the time must be always considered without any timezone (UTC)
|
|
105
|
-
const refDate = new Date();
|
|
106
|
-
refDate.setTime(time);
|
|
107
|
-
const dateOpts = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' };
|
|
108
|
-
return refDate.toLocaleTimeString(this._translate.getCurrentLang(), dateOpts);
|
|
109
|
-
}
|
|
110
|
-
save() {
|
|
111
|
-
this.timeInterval.load(this.timeIntervalWC);
|
|
112
|
-
this._modal.dismiss(true);
|
|
113
|
-
}
|
|
114
|
-
reset() {
|
|
115
|
-
this.timeInterval.reset();
|
|
116
|
-
this._modal.dismiss(false);
|
|
117
|
-
}
|
|
118
|
-
close() {
|
|
119
|
-
this._modal.dismiss();
|
|
120
|
-
}
|
|
121
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAFromTimeToTimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
122
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEAFromTimeToTimeComponent, isStandalone: true, selector: "idea-from-time-to-time", inputs: { timeInterval: "timeInterval", period: "period", notEarlierThan: "notEarlierThan", notLaterThan: "notLaterThan", title: "title" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.RESET' | translate\" (click)=\"reset()\">\n <ion-icon name=\"arrow-undo\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid class=\"clockGrid\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"5\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(12) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12)\"\n [disabled]=\"!isAllowed(12)\"\n (click)=\"setInterval(12)\"\n >\n {{ getClockButtonContent(12) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(12, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12, minutes)\"\n [disabled]=\"!isAllowed(12, minutes)\"\n (click)=\"setInterval(12, minutes)\"\n >\n {{ getClockButtonContent(12, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"3\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(11, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11, minutes)\"\n [disabled]=\"!isAllowed(11, minutes)\"\n (click)=\"setInterval(11, minutes)\"\n >\n {{ getClockButtonContent(11, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(11) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11)\"\n [disabled]=\"!isAllowed(11)\"\n (click)=\"setInterval(11)\"\n >\n {{ getClockButtonContent(11) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(1) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1)\"\n [disabled]=\"!isAllowed(1)\"\n (click)=\"setInterval(1)\"\n >\n {{ getClockButtonContent(1) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(1, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1, minutes)\"\n [disabled]=\"!isAllowed(1, minutes)\"\n (click)=\"setInterval(1, minutes)\"\n >\n {{ getClockButtonContent(1, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(10, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10, minutes)\"\n [disabled]=\"!isAllowed(10, minutes)\"\n (click)=\"setInterval(10, minutes)\"\n >\n {{ getClockButtonContent(10, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(10) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10)\"\n [disabled]=\"!isAllowed(10)\"\n (click)=\"setInterval(10)\"\n >\n {{ getClockButtonContent(10) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(2) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2)\"\n [disabled]=\"!isAllowed(2)\"\n (click)=\"setInterval(2)\"\n >\n {{ getClockButtonContent(2) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(2, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2, minutes)\"\n [disabled]=\"!isAllowed(2, minutes)\"\n (click)=\"setInterval(2, minutes)\"\n >\n {{ getClockButtonContent(2, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(9, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9, minutes)\"\n [disabled]=\"!isAllowed(9, minutes)\"\n (click)=\"setInterval(9, minutes)\"\n >\n {{ getClockButtonContent(9, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(9) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9)\"\n [disabled]=\"!isAllowed(9)\"\n (click)=\"setInterval(9)\"\n >\n {{ getClockButtonContent(9) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center displayText\" [size]=\"4\">\n <ion-text [class.fromSelected]=\"segment === Segments.TO\">\n {{ 'IDEA_UNCOMMON.FTTT.FROM' | translate }}\n @if (segment === Segments.TO) {\n <span>{{ msToTimeString(timeIntervalWC.from) }}</span>\n }\n </ion-text>\n @if (segment === Segments.TO) {\n <ion-text>{{ 'IDEA_UNCOMMON.FTTT.TO' | translate }}</ion-text>\n }\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(3) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3)\"\n [disabled]=\"!isAllowed(3)\"\n (click)=\"setInterval(3)\"\n >\n {{ getClockButtonContent(3) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(3, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3, minutes)\"\n [disabled]=\"!isAllowed(3, minutes)\"\n (click)=\"setInterval(3, minutes)\"\n >\n {{ getClockButtonContent(3, minutes) }}\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(8, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8, minutes)\"\n [disabled]=\"!isAllowed(8, minutes)\"\n (click)=\"setInterval(8, minutes)\"\n >\n {{ getClockButtonContent(8, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(8) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8)\"\n [disabled]=\"!isAllowed(8)\"\n (click)=\"setInterval(8)\"\n >\n {{ getClockButtonContent(8) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(4) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4)\"\n [disabled]=\"!isAllowed(4)\"\n (click)=\"setInterval(4)\"\n >\n {{ getClockButtonContent(4) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(4, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4, minutes)\"\n [disabled]=\"!isAllowed(4, minutes)\"\n (click)=\"setInterval(4, minutes)\"\n >\n {{ getClockButtonContent(4, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(7, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7, minutes)\"\n [disabled]=\"!isAllowed(7, minutes)\"\n (click)=\"setInterval(7, minutes)\"\n >\n {{ getClockButtonContent(7, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(7) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7)\"\n [disabled]=\"!isAllowed(7)\"\n (click)=\"setInterval(7)\"\n >\n {{ getClockButtonContent(7) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(5) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5)\"\n [disabled]=\"!isAllowed(5)\"\n (click)=\"setInterval(5)\"\n >\n {{ getClockButtonContent(5) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(5, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5, minutes)\"\n [disabled]=\"!isAllowed(5, minutes)\"\n (click)=\"setInterval(5, minutes)\"\n >\n {{ getClockButtonContent(5, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"3\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(6, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6, minutes)\"\n [disabled]=\"!isAllowed(6, minutes)\"\n (click)=\"setInterval(6, minutes)\"\n >\n {{ getClockButtonContent(6, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(6) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6)\"\n [disabled]=\"!isAllowed(6)\"\n (click)=\"setInterval(6)\"\n >\n {{ getClockButtonContent(6) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"5\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.PERIOD' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"period\" (ionChange)=\"period = $event?.detail?.value || period\">\n <ion-segment-button [value]=\"Periods.AM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.AM' | translate }}</ion-label>\n </ion-segment-button>\n <ion-segment-button [value]=\"Periods.PM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.PM' | translate }}</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.MINUTES_PREFERENCE' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"minutes\" (ionChange)=\"minutes = $event?.detail?.value || minutes\">\n <ion-segment-button value=\"15\">\n <ion-label>15</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"30\">\n <ion-label>30</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"45\">\n <ion-label>45</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n", styles: ["ion-grid.clockGrid ion-button[size=large]{width:50px;height:50px;font-size:1.1em;font-weight:700}ion-grid.clockGrid ion-button[size=small]{font-size:.75em}ion-grid.clockGrid ion-button.oppositeMeridian{--border-color: var(--ion-color-medium);--border-style: dashed;--border-width: 1px}ion-grid.clockGrid .displayText ion-text{font-size:1.3em;font-weight:700}ion-grid.clockGrid .displayText ion-text.fromSelected{display:block;padding-bottom:3px;font-size:.9em}ion-grid.clockGrid ion-segment ion-segment-button{min-width:50px;--color-checked: var(--ion-color-dark);--border-color: var(--ion-color-dark)}ion-grid.clockGrid .prefLabel{font-size:.6em;font-weight:700;text-transform:uppercase}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: IDEATranslatePipe, name: "translate" }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonSegmentButton, selector: "ion-segment-button", inputs: ["disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { 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: IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { 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: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }] }); }
|
|
123
|
-
}
|
|
124
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAFromTimeToTimeComponent, decorators: [{
|
|
125
|
-
type: Component,
|
|
126
|
-
args: [{ selector: 'idea-from-time-to-time', standalone: true, imports: [
|
|
127
|
-
CommonModule,
|
|
128
|
-
IDEATranslatePipe,
|
|
129
|
-
IonLabel,
|
|
130
|
-
IonSegmentButton,
|
|
131
|
-
IonSegment,
|
|
132
|
-
IonText,
|
|
133
|
-
IonCol,
|
|
134
|
-
IonRow,
|
|
135
|
-
IonGrid,
|
|
136
|
-
IonContent,
|
|
137
|
-
IonTitle,
|
|
138
|
-
IonIcon,
|
|
139
|
-
IonButton,
|
|
140
|
-
IonButtons,
|
|
141
|
-
IonToolbar,
|
|
142
|
-
IonHeader
|
|
143
|
-
], template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.RESET' | translate\" (click)=\"reset()\">\n <ion-icon name=\"arrow-undo\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid class=\"clockGrid\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"5\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(12) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12)\"\n [disabled]=\"!isAllowed(12)\"\n (click)=\"setInterval(12)\"\n >\n {{ getClockButtonContent(12) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(12, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12, minutes)\"\n [disabled]=\"!isAllowed(12, minutes)\"\n (click)=\"setInterval(12, minutes)\"\n >\n {{ getClockButtonContent(12, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"3\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(11, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11, minutes)\"\n [disabled]=\"!isAllowed(11, minutes)\"\n (click)=\"setInterval(11, minutes)\"\n >\n {{ getClockButtonContent(11, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(11) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11)\"\n [disabled]=\"!isAllowed(11)\"\n (click)=\"setInterval(11)\"\n >\n {{ getClockButtonContent(11) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(1) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1)\"\n [disabled]=\"!isAllowed(1)\"\n (click)=\"setInterval(1)\"\n >\n {{ getClockButtonContent(1) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(1, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1, minutes)\"\n [disabled]=\"!isAllowed(1, minutes)\"\n (click)=\"setInterval(1, minutes)\"\n >\n {{ getClockButtonContent(1, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(10, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10, minutes)\"\n [disabled]=\"!isAllowed(10, minutes)\"\n (click)=\"setInterval(10, minutes)\"\n >\n {{ getClockButtonContent(10, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(10) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10)\"\n [disabled]=\"!isAllowed(10)\"\n (click)=\"setInterval(10)\"\n >\n {{ getClockButtonContent(10) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(2) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2)\"\n [disabled]=\"!isAllowed(2)\"\n (click)=\"setInterval(2)\"\n >\n {{ getClockButtonContent(2) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(2, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2, minutes)\"\n [disabled]=\"!isAllowed(2, minutes)\"\n (click)=\"setInterval(2, minutes)\"\n >\n {{ getClockButtonContent(2, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(9, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9, minutes)\"\n [disabled]=\"!isAllowed(9, minutes)\"\n (click)=\"setInterval(9, minutes)\"\n >\n {{ getClockButtonContent(9, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(9) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9)\"\n [disabled]=\"!isAllowed(9)\"\n (click)=\"setInterval(9)\"\n >\n {{ getClockButtonContent(9) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center displayText\" [size]=\"4\">\n <ion-text [class.fromSelected]=\"segment === Segments.TO\">\n {{ 'IDEA_UNCOMMON.FTTT.FROM' | translate }}\n @if (segment === Segments.TO) {\n <span>{{ msToTimeString(timeIntervalWC.from) }}</span>\n }\n </ion-text>\n @if (segment === Segments.TO) {\n <ion-text>{{ 'IDEA_UNCOMMON.FTTT.TO' | translate }}</ion-text>\n }\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(3) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3)\"\n [disabled]=\"!isAllowed(3)\"\n (click)=\"setInterval(3)\"\n >\n {{ getClockButtonContent(3) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(3, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3, minutes)\"\n [disabled]=\"!isAllowed(3, minutes)\"\n (click)=\"setInterval(3, minutes)\"\n >\n {{ getClockButtonContent(3, minutes) }}\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(8, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8, minutes)\"\n [disabled]=\"!isAllowed(8, minutes)\"\n (click)=\"setInterval(8, minutes)\"\n >\n {{ getClockButtonContent(8, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(8) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8)\"\n [disabled]=\"!isAllowed(8)\"\n (click)=\"setInterval(8)\"\n >\n {{ getClockButtonContent(8) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(4) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4)\"\n [disabled]=\"!isAllowed(4)\"\n (click)=\"setInterval(4)\"\n >\n {{ getClockButtonContent(4) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(4, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4, minutes)\"\n [disabled]=\"!isAllowed(4, minutes)\"\n (click)=\"setInterval(4, minutes)\"\n >\n {{ getClockButtonContent(4, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(7, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7, minutes)\"\n [disabled]=\"!isAllowed(7, minutes)\"\n (click)=\"setInterval(7, minutes)\"\n >\n {{ getClockButtonContent(7, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(7) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7)\"\n [disabled]=\"!isAllowed(7)\"\n (click)=\"setInterval(7)\"\n >\n {{ getClockButtonContent(7) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(5) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5)\"\n [disabled]=\"!isAllowed(5)\"\n (click)=\"setInterval(5)\"\n >\n {{ getClockButtonContent(5) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(5, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5, minutes)\"\n [disabled]=\"!isAllowed(5, minutes)\"\n (click)=\"setInterval(5, minutes)\"\n >\n {{ getClockButtonContent(5, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"3\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(6, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6, minutes)\"\n [disabled]=\"!isAllowed(6, minutes)\"\n (click)=\"setInterval(6, minutes)\"\n >\n {{ getClockButtonContent(6, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(6) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6)\"\n [disabled]=\"!isAllowed(6)\"\n (click)=\"setInterval(6)\"\n >\n {{ getClockButtonContent(6) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"5\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.PERIOD' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"period\" (ionChange)=\"period = $event?.detail?.value || period\">\n <ion-segment-button [value]=\"Periods.AM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.AM' | translate }}</ion-label>\n </ion-segment-button>\n <ion-segment-button [value]=\"Periods.PM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.PM' | translate }}</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.MINUTES_PREFERENCE' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"minutes\" (ionChange)=\"minutes = $event?.detail?.value || minutes\">\n <ion-segment-button value=\"15\">\n <ion-label>15</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"30\">\n <ion-label>30</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"45\">\n <ion-label>45</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n", styles: ["ion-grid.clockGrid ion-button[size=large]{width:50px;height:50px;font-size:1.1em;font-weight:700}ion-grid.clockGrid ion-button[size=small]{font-size:.75em}ion-grid.clockGrid ion-button.oppositeMeridian{--border-color: var(--ion-color-medium);--border-style: dashed;--border-width: 1px}ion-grid.clockGrid .displayText ion-text{font-size:1.3em;font-weight:700}ion-grid.clockGrid .displayText ion-text.fromSelected{display:block;padding-bottom:3px;font-size:.9em}ion-grid.clockGrid ion-segment ion-segment-button{min-width:50px;--color-checked: var(--ion-color-dark);--border-color: var(--ion-color-dark)}ion-grid.clockGrid .prefLabel{font-size:.6em;font-weight:700;text-transform:uppercase}\n"] }]
|
|
144
|
-
}], propDecorators: { timeInterval: [{
|
|
145
|
-
type: Input
|
|
146
|
-
}], period: [{
|
|
147
|
-
type: Input
|
|
148
|
-
}], notEarlierThan: [{
|
|
149
|
-
type: Input
|
|
150
|
-
}], notLaterThan: [{
|
|
151
|
-
type: Input
|
|
152
|
-
}], title: [{
|
|
153
|
-
type: Input
|
|
154
|
-
}] } });
|
|
155
|
-
/**
|
|
156
|
-
* The two stages of the component, to pick the start and the end of the interval.
|
|
157
|
-
*/
|
|
158
|
-
var Segments;
|
|
159
|
-
(function (Segments) {
|
|
160
|
-
Segments["FROM"] = "FROM";
|
|
161
|
-
Segments["TO"] = "TO";
|
|
162
|
-
})(Segments || (Segments = {}));
|
|
163
|
-
/**
|
|
164
|
-
* The two possible periods of the component, to interpret the clock the right way.
|
|
165
|
-
*/
|
|
166
|
-
export var Periods;
|
|
167
|
-
(function (Periods) {
|
|
168
|
-
Periods["AM"] = "AM";
|
|
169
|
-
Periods["PM"] = "PM";
|
|
170
|
-
})(Periods || (Periods = {}));
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbVRpbWVUb1RpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvdGltZUludGVydmFsL2Zyb21UaW1lVG9UaW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL3RpbWVJbnRlcnZhbC9mcm9tVGltZVRvVGltZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFDTCxlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE9BQU8sRUFDUCxNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sRUFDUCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDVCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBMEJoRixNQUFNLE9BQU8sMkJBQTJCO0lBeEJ4QztRQXlCVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQU1yRDs7V0FFRztRQUNNLFdBQU0sR0FBWSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBZXRDLGFBQVEsR0FBRyxRQUFRLENBQUM7UUFDcEIsWUFBTyxHQUFHLE9BQU8sQ0FBQztLQStHbkI7SUEzR0MsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFP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LFFBR1o7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLE9BR1g7QUFIRCxXQUFZLE9BQU87SUFDakIsb0JBQVMsQ0FBQTtJQUNULG9CQUFTLENBQUE7QUFDWCxDQUFDLEVBSFcsT0FBTyxLQUFQLE9BQU8sUUFHbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE1vZGFsQ29udHJvbGxlcixcbiAgSW9uSGVhZGVyLFxuICBJb25Ub29sYmFyLFxuICBJb25CdXR0b25zLFxuICBJb25CdXR0b24sXG4gIElvbkljb24sXG4gIElvblRpdGxlLFxuICBJb25Db250ZW50LFxuICBJb25HcmlkLFxuICBJb25Sb3csXG4gIElvbkNvbCxcbiAgSW9uVGV4dCxcbiAgSW9uU2VnbWVudCxcbiAgSW9uU2VnbWVudEJ1dHRvbixcbiAgSW9uTGFiZWxcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBUaW1lSW50ZXJ2YWwgfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHsgSURFQVRyYW5zbGF0ZVBpcGUsIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWRlYS1mcm9tLXRpbWUtdG8tdGltZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSURFQVRyYW5zbGF0ZVBpcGUsXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uU2VnbWVudEJ1dHRvbixcbiAgICBJb25TZWdtZW50LFxuICAgIElvblRleHQsXG4gICAgSW9uQ29sLFxuICAgIElvblJvdyxcbiAgICBJb25HcmlkLFxuICAgIElvbkNvbnRlbnQsXG4gICAgSW9uVGl0bGUsXG4gICAgSW9uSWNvbixcbiAgICBJb25CdXR0b24sXG4gICAgSW9uQnV0dG9ucyxcbiAgICBJb25Ub29sYmFyLFxuICAgIElvbkhlYWRlclxuICBdLFxuICB0ZW1wbGF0ZVVybDogJ2Zyb21UaW1lVG9UaW1lLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2Zyb21UaW1lVG9UaW1lLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSURFQUZyb21UaW1lVG9UaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfdHJhbnNsYXRlID0gaW5qZWN0KElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlKTtcblxuICAvKipcbiAgICogVGhlIHRpbWUgaW50ZXJ2YWwgdG8gc2V0LlxuICAgKi9cbiAgQElucHV0KCkgdGltZUludGVydmFsOiBUaW1lSW50ZXJ2YWw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHNob3VsZCBzdGFydCBwaWNraW5nIHRoZSB0aW1lIGRpc3BsYXlpbmcgdGhlIGFmdGVybm9vbiAoUE0pIG9yIHRoZSBtb3JuaW5nIChBTSwgZGVmYXVsdCkuXG4gICAqL1xuICBASW5wdXQoKSBwZXJpb2Q6IFBlcmlvZHMgPSBQZXJpb2RzLkFNO1xuICAvKipcbiAgICogQSB0aW1lIHRvIHVzZSBhcyBsb3dlciBsaW1pdCBmb3IgdGhlIHBvc3NpYmxlIGNob2ljZXMuXG4gICAqL1xuICBASW5wdXQoKSBub3RFYXJsaWVyVGhhbjogbnVtYmVyO1xuICAvKipcbiAgICogQSB0aW1lIHRvIHVzZSBhcyB1cHBlciBsaW1pdCBmb3IgdGhlIHBvc3NpYmxlIGNob2ljZXMuXG4gICAqL1xuICBASW5wdXQoKSBub3RMYXRlclRoYW46IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcblxuICBzZWdtZW50OiBTZWdtZW50cztcbiAgU2VnbWVudHMgPSBTZWdtZW50cztcbiAgUGVyaW9kcyA9IFBlcmlvZHM7XG4gIHRpbWVJbnRlcnZhbFdDOiBUaW1lSW50ZXJ2YWw7XG4gIG1pbnV0ZXM6IG51bWJlcjtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlZ21lbnQgPSBTZWdtZW50cy5GUk9NO1xuICAgIHRoaXMubWludXRlcyA9IDMwO1xuICAgIHRoaXMudGltZUludGVydmFsV0MgPSBuZXcgVGltZUludGVydmFsKHRoaXMudGltZUludGVydmFsKTtcbiAgfVxuXG4gIHNldEludGVydmFsKGhvdXJzOiBudW1iZXIsIG1pbnV0ZXM/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhZGp1c3QgdGhlIGhvdXIgYmFzZWQgb24gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNldHRpbmdzIG9mIGFtL3BtXG4gICAgaG91cnMgPSB0aGlzLmNvbnRleHR1YWxpemVIb3VyKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBjb252ZXJ0IHRoZSBob3VycyBhbmQgbWludXRlcyBpbiBtaWxsaXNlY29uZHNcbiAgICBjb25zdCB0aW1lTXMgPSB0aGlzLnRpbWVUb01zKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBzZXQgdGhlIGNvcnJlY3QgcGFydCBvZiB0aGUgaW50ZXJ2YWwsIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlZ21lbnRcbiAgICBpZiAodGhpcy5zZWdtZW50ID09PSBTZWdtZW50cy5GUk9NKSB7XG4gICAgICAvLyBzZXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCAoZnJvbSkgYW5kIGNoYW5nZSB0aGUgc2VnbWVudCBzbyB0aGF0IHRoZSBlbmQgKHRvKSB3aWxsIGJlIHBpY2tlZFxuICAgICAgdGhpcy50aW1lSW50ZXJ2YWxXQy5mcm9tID0gdGltZU1zO1xuICAgICAgdGhpcy5zZWdtZW50ID0gU2VnbWVudHMuVE87XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNhbid0IHByb2NlZWQgaWYgZnJvbSBhbmQgdG8gYXJlIGVxdWFsXG4gICAgICBpZiAodGltZU1zID09PSB0aGlzLnRpbWVJbnRlcnZhbFdDLmZyb20pIHJldHVybjtcbiAgICAgIC8vIHNldCB0aGUgZW5kIG9mIHRoZSBpbnRlcnZhbCAodG8pXG4gICAgICB0aGlzLnRpbWVJbnRlcnZhbFdDLnRvID0gdGltZU1zO1xuICAgICAgLy8gc2F2ZSB0aGUgY2hhbmdlcyBhbmQgbm90aWZ5IHRoZSBwYXJlbnQgY29tcG9uZW50XG4gICAgICB0aGlzLnNhdmUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB0aW1lVG9Ncyhob3VyczogbnVtYmVyLCBtaW51dGVzPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGhvdXJzICogNjAgKiA2MCArIChtaW51dGVzIHx8IDApICogNjApICogMTAwMDtcbiAgfVxuXG4gIGdldENsb2NrQnV0dG9uQ29udGVudChob3VyczogbnVtYmVyLCBtaW51dGVzPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAvLyBhZGp1c3QgdGhlIGhvdXIgYmFzZWQgb24gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNldHRpbmdzIG9mIGFtL3BtXG4gICAgaG91cnMgPSB0aGlzLmNvbnRleHR1YWxpemVIb3VyKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBjb252ZXJ0IHRoZSBjYWxjdWxhdGVkIHRpbWUgaW50byBhIHJlYWRhYmxlIHN0cmluZzsgd2UgbmVlZCB0byBmb3JtYXQgaXQgdG8gZGlzdGluZ3Vpc2ggMC0yNCB2cyAwLTEyIGFtL3BtXG4gICAgY29uc3QgcmVmRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgcmVmRGF0ZS5zZXRIb3Vycyhob3VycywgbWludXRlcyB8fCAwLCAwKTtcbiAgICBjb25zdCBzdHIgPSB0aGlzLl90cmFuc2xhdGUuZm9ybWF0RGF0ZShyZWZEYXRlLCAnc2hvcnRUaW1lJyk7XG4gICAgLy8gcmVtb3ZlIHRoZSBleHRyYSBwYXJ0IChlLmcuIGFtL3BtKSwgYmFzZWQgb24gdGhlIHR5cGUgb2YgYnV0dG9uIHdlIGhhdmUgdG8gc2hvd1xuICAgIGNvbnN0IHN0ckFyciA9IHN0ci5zcGxpdCgnOicpO1xuICAgIHJldHVybiBTdHJpbmcoTnVtYmVyKHN0ckFyclswXSkpLmNvbmNhdChtaW51dGVzID8gJzonLmNvbmNhdChzdHJBcnJbMV0uc2xpY2UoMCwgMikpIDogJycpO1xuICB9XG4gIHByaXZhdGUgY29udGV4dHVhbGl6ZUhvdXIoaG91cnM6IG51bWJlciwgbWludXRlcz86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gYWRqdXN0IHRoZSBjb250ZW50IHRvIHRoZSBhZnRlcm5vb24gaG91cnMsIGlmIG5lZWRlZFxuICAgIGlmICh0aGlzLnBlcmlvZCA9PT0gUGVyaW9kcy5QTSkgaG91cnMgKz0gMTI7XG4gICAgLy8gaWYgd2UgYWxyZWFkeSBzZWxlY3RlZCB0aGUgc3RhcnQgb2YgdGhlIGludGVydmFsLCBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSB0aW1lOiB0aGUgY2VudGVyIG9mIHRoZVxuICAgIC8vIGNsb2NrIHdpbGwgYmUgbW92ZWQgdG8gdGhlIHNlbGVjdGVkIGhvdXIgKGZyb20pLCB0byBoYXZlIGEgcmVhc29uYWJsZSBzZXQgb2YgY2hvaWNlcyBmb3IgdGhlIGVuZCAodG8pXG4gICAgaWYgKHRoaXMuc2VnbWVudCA9PT0gU2VnbWVudHMuVE8gJiYgdGhpcy50aW1lVG9Ncyhob3VycywgbWludXRlcykgPCB0aGlzLnRpbWVJbnRlcnZhbFdDLmZyb20pXG4gICAgICBob3VycyArPSB0aGlzLnBlcmlvZCA9PT0gUGVyaW9kcy5QTSA/IC0xMiA6IDEyO1xuICAgIC8vIHNldCBtaWRuaWdodCB0byAwMFxuICAgIGlmIChob3VycyA9PT0gMjQpIGhvdXJzID0gMDtcbiAgICByZXR1cm4gaG91cnM7XG4gIH1cblxuICBlcXVhbHNGcm9tKGhvdXJzOiBudW1iZXIsIG1pbnV0ZXM/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBpZiB0aGUgc3RhcnQgb2YgdGhlIGludGVydmFsIGhhc24ndCBiZWVuIHNlbGVjdGVkIHlldCwgc2tpcCBpdFxuICAgIGlmICh0aGlzLnNlZ21lbnQgPT09IFNlZ21lbnRzLkZST00pIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGp1c3QgdGhlIGhvdXIgYmFzZWQgb24gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNldHRpbmdzIG9mIGFtL3BtXG4gICAgaG91cnMgPSB0aGlzLmNvbnRleHR1YWxpemVIb3VyKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBjb21wYXJlIHRoZSB0d28gc3RyaW5ncyBiYXNlZCBvbiB0aGUgdGltZXN0YW1wcyBpbiBtc1xuICAgIHJldHVybiB0aGlzLm1zVG9UaW1lU3RyaW5nKHRoaXMudGltZUludGVydmFsV0MuZnJvbSkgPT09IHRoaXMubXNUb1RpbWVTdHJpbmcodGhpcy50aW1lVG9Ncyhob3VycywgbWludXRlcykpO1xuICB9XG5cbiAgaXNBbGxvd2VkKGhvdXJzOiBudW1iZXIsIG1pbnV0ZXM/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBhZGp1c3QgdGhlIGhvdXIgYmFzZWQgb24gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNldHRpbmdzIG9mIGFtL3BtXG4gICAgaG91cnMgPSB0aGlzLmNvbnRleHR1YWxpemVIb3VyKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0aW1lIGlzIGluc2lkZSB0aGUgZ2l2ZW4gYm91bmRhcmllc1xuICAgIHJldHVybiAoXG4gICAgICAoIXRoaXMubm90RWFybGllclRoYW4gfHxcbiAgICAgICAgdGhpcy50aW1lVG9Ncyhob3VycywgbWludXRlcykgPj0gdGhpcy5ub3RFYXJsaWVyVGhhbiB8fFxuICAgICAgICB0aGlzLnRpbWVUb01zKGhvdXJzLCBtaW51dGVzKSA9PT0gMCkgJiZcbiAgICAgICghdGhpcy5ub3RMYXRlclRoYW4gfHwgdGhpcy50aW1lVG9Ncyhob3VycywgbWludXRlcykgPD0gdGhpcy5ub3RMYXRlclRoYW4pXG4gICAgKTtcbiAgfVxuXG4gIGlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbihob3VyczogbnVtYmVyLCBtaW51dGVzPzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gaWYgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBoYXNuJ3QgYmVlbiBzZWxlY3RlZCB5ZXQsIHNraXAgaXRcbiAgICBpZiAodGhpcy5zZWdtZW50ID09PSBTZWdtZW50cy5GUk9NKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRqdXN0IHRoZSBob3VyIGJhc2VkIG9uIHRoZSBzdGFydCBvZiB0aGUgaW50ZXJ2YWwgYW5kIHRoZSBzZXR0aW5ncyBvZiBhbS9wbVxuICAgIGhvdXJzID0gdGhpcy5jb250ZXh0dWFsaXplSG91cihob3VycywgbWludXRlcyk7XG4gICAgLy8gY2FsY3VsYXRlIHRoZSBtcyBvZiB0aGUgc2VsZWN0ZWQgdGltZSBhbmQgb2YgXCJub29uXCIgdGltZSAodG8gZGV0ZXJtIHRoZSBtZXJpZGlhbilcbiAgICBjb25zdCB0aW1lTXMgPSB0aGlzLnRpbWVUb01zKGhvdXJzLCBtaW51dGVzKTtcbiAgICBjb25zdCBub29uTXMgPSB0aGlzLnRpbWVUb01zKDEyKTtcbiAgICAvLyByZXR1cm4gdHJ1ZSBpbiBjYXNlIHRoZSBob3VyIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBjdXJyZW50IG1lcmlkaWFuXG4gICAgcmV0dXJuICh0aGlzLnBlcmlvZCA9PT0gUGVyaW9kcy5BTSAmJiB0aW1lTXMgPiBub29uTXMpIHx8ICh0aGlzLnBlcmlvZCA9PT0gUGVyaW9kcy5QTSAmJiB0aW1lTXMgPCBub29uTXMpO1xuICB9XG5cbiAgbXNUb1RpbWVTdHJpbmcodGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRpbWUpIHJldHVybiAnJztcbiAgICAvLyBub3RlOiB0aGUgdGltZSBtdXN0IGJlIGFsd2F5cyBjb25zaWRlcmVkIHdpdGhvdXQgYW55IHRpbWV6b25lIChVVEMpXG4gICAgY29uc3QgcmVmRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgcmVmRGF0ZS5zZXRUaW1lKHRpbWUpO1xuICAgIGNvbnN0IGRhdGVPcHRzID0geyB0aW1lWm9uZTogJ1VUQycsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcgfSBhcyBjb25zdDtcbiAgICByZXR1cm4gcmVmRGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIGRhdGVPcHRzKTtcbiAgfVxuXG4gIHNhdmUoKTogdm9pZCB7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWwubG9hZCh0aGlzLnRpbWVJbnRlcnZhbFdDKTtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKHRydWUpO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWwucmVzZXQoKTtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKGZhbHNlKTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB0d28gc3RhZ2VzIG9mIHRoZSBjb21wb25lbnQsIHRvIHBpY2sgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBpbnRlcnZhbC5cbiAqL1xuZW51bSBTZWdtZW50cyB7XG4gIEZST00gPSAnRlJPTScsXG4gIFRPID0gJ1RPJ1xufVxuXG4vKipcbiAqIFRoZSB0d28gcG9zc2libGUgcGVyaW9kcyBvZiB0aGUgY29tcG9uZW50LCB0byBpbnRlcnByZXQgdGhlIGNsb2NrIHRoZSByaWdodCB3YXkuXG4gKi9cbmV4cG9ydCBlbnVtIFBlcmlvZHMge1xuICBBTSA9ICdBTScsXG4gIFBNID0gJ1BNJ1xufVxuIiwiPGlvbi1oZWFkZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cImlkZWFUb29sYmFyXCI+XG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidDT01NT04uQ0xPU0UnIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgPGlvbi10aXRsZT57eyB0aXRsZSB9fTwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICA8aW9uLWJ1dHRvbiBbdGl0bGVdPVwiJ0NPTU1PTi5SRVNFVCcgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwicmVzZXQoKVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LXVuZG9cIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8aW9uLWdyaWQgY2xhc3M9XCJjbG9ja0dyaWRcIj5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjVcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDEyKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEyKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMTIpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoMTIpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxMikgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1sZWZ0XCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oMTIsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEyLCBtaW51dGVzKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMTIsIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoMTIsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxMiwgbWludXRlcykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiM1wiPiZuYnNwOzwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIyXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgxMSwgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oMTEsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgxMSwgbWludXRlcylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRJbnRlcnZhbCgxMSwgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDExLCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWxlZnRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgxMSkgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbigxMSlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDExKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDExKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoMTEpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgxKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgxKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDEpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDEsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgxLCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDEsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxLCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIyXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjFcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDEwLCBtaW51dGVzKSA/ICdwcmltYXJ5JyA6ICdsaWdodCdcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbigxMCwgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDEwLCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDEwLCBtaW51dGVzKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoMTAsIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtbGVmdFwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDEwKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEwKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMTApXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoMTApXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxMCkgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiMlwiPiZuYnNwOzwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgyKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDIpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgyKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDIpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgyKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDIsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDIsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgyLCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDIsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgyLCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIxXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oOSwgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oOSwgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDksIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoOSwgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDksIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtbGVmdFwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDkpID8gJ3ByaW1hcnknIDogJ2RhcmsnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oOSlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDkpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoOSlcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDkpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGRpc3BsYXlUZXh0XCIgW3NpemVdPVwiNFwiPlxuICAgICAgICA8aW9uLXRleHQgW2NsYXNzLmZyb21TZWxlY3RlZF09XCJzZWdtZW50ID09PSBTZWdtZW50cy5UT1wiPlxuICAgICAgICAgIHt7ICdJREVBX1VOQ09NTU9OLkZUVFQuRlJPTScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICBAaWYgKHNlZ21lbnQgPT09IFNlZ21lbnRzLlRPKSB7XG4gICAgICAgICAgICA8c3Bhbj57eyBtc1RvVGltZVN0cmluZyh0aW1lSW50ZXJ2YWxXQy5mcm9tKSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIEBpZiAoc2VnbWVudCA9PT0gU2VnbWVudHMuVE8pIHtcbiAgICAgICAgICA8aW9uLXRleHQ+e3sgJ0lERUFfVU5DT01NT04uRlRUVC5UTycgfCB0cmFuc2xhdGUgfX08L2lvbi10ZXh0PlxuICAgICAgICB9XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LXJpZ2h0XCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJsYXJnZVwiXG4gICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oMykgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbigzKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRJbnRlcnZhbCgzKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoMykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgzLCBtaW51dGVzKSA/ICdwcmltYXJ5JyA6ICdsaWdodCdcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbigzLCBtaW51dGVzKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMywgbWludXRlcylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRJbnRlcnZhbCgzLCBtaW51dGVzKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoMywgbWludXRlcykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjFcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDgsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDgsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCg4LCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDgsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCg4LCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWxlZnRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSg4KSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCg4KVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCg4KSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIyXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1yaWdodFwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDQpID8gJ3ByaW1hcnknIDogJ2RhcmsnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDQpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDQpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oNCwgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNCwgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDQsIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNCwgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDQsIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjFcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiMlwiPiZuYnNwOzwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oNywgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNywgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDcsIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNywgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDcsIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtbGVmdFwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDcpID8gJ3ByaW1hcnknIDogJ2RhcmsnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDcpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSg1KSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDUpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCg1KVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCg1KSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDUsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDUsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCg1LCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDUsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCg1LCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIyXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjNcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LXJpZ2h0XCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oNiwgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNiwgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDYsIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNiwgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDYsIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJsYXJnZVwiXG4gICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oNikgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbig2KVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoNilcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRJbnRlcnZhbCg2KVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoNikgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiNVwiPiZuYnNwOzwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LXJpZ2h0XCIgW3NpemVdPVwiM1wiIFtzaXplU21dPVwiN1wiPlxuICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJwcmVmTGFiZWxcIj57eyAnSURFQV9VTkNPTU1PTi5GVFRULlBFUklPRCcgfCB0cmFuc2xhdGUgfX06PC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjlcIiBbc2l6ZVNtXT1cIjVcIj5cbiAgICAgICAgPGlvbi1zZWdtZW50IFt2YWx1ZV09XCJwZXJpb2RcIiAoaW9uQ2hhbmdlKT1cInBlcmlvZCA9ICRldmVudD8uZGV0YWlsPy52YWx1ZSB8fCBwZXJpb2RcIj5cbiAgICAgICAgICA8aW9uLXNlZ21lbnQtYnV0dG9uIFt2YWx1ZV09XCJQZXJpb2RzLkFNXCI+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPnt7ICdJREVBX1VOQ09NTU9OLkZUVFQuQU0nIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24tc2VnbWVudC1idXR0b24+XG4gICAgICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiUGVyaW9kcy5QTVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD57eyAnSURFQV9VTkNPTU1PTi5GVFRULlBNJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgICA8L2lvbi1zZWdtZW50PlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBbc2l6ZV09XCIzXCIgW3NpemVTbV09XCI3XCI+XG4gICAgICAgIDxpb24tdGV4dCBjbGFzcz1cInByZWZMYWJlbFwiPnt7ICdJREVBX1VOQ09NTU9OLkZUVFQuTUlOVVRFU19QUkVGRVJFTkNFJyB8IHRyYW5zbGF0ZSB9fTo8L2lvbi10ZXh0PlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiOVwiIFtzaXplU21dPVwiNVwiPlxuICAgICAgICA8aW9uLXNlZ21lbnQgW3ZhbHVlXT1cIm1pbnV0ZXNcIiAoaW9uQ2hhbmdlKT1cIm1pbnV0ZXMgPSAkZXZlbnQ/LmRldGFpbD8udmFsdWUgfHwgbWludXRlc1wiPlxuICAgICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gdmFsdWU9XCIxNVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD4xNTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gdmFsdWU9XCIzMFwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD4zMDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gdmFsdWU9XCI0NVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD40NTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgICA8L2lvbi1zZWdtZW50PlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
|
|
3
|
-
import { ModalController, IonItem, IonButton, IonIcon, IonText, IonLabel } from '@ionic/angular/standalone';
|
|
4
|
-
import { IDEATranslationsService } from '@idea-ionic/common';
|
|
5
|
-
import { IDEAFromTimeToTimeComponent, Periods } from './fromTimeToTime.component';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class IDEATimeIntervalComponent {
|
|
8
|
-
constructor() {
|
|
9
|
-
this._modal = inject(ModalController);
|
|
10
|
-
this._translate = inject(IDEATranslationsService);
|
|
11
|
-
/**
|
|
12
|
-
* Whether we should start picking the time displaying the afternoon (PM) or the morning (AM, default).
|
|
13
|
-
*/
|
|
14
|
-
this.period = Periods.AM;
|
|
15
|
-
/**
|
|
16
|
-
* On select event.
|
|
17
|
-
*/
|
|
18
|
-
this.select = new EventEmitter();
|
|
19
|
-
/**
|
|
20
|
-
* Icon select.
|
|
21
|
-
*/
|
|
22
|
-
this.iconSelect = new EventEmitter();
|
|
23
|
-
/**
|
|
24
|
-
* On select (with the field disabled) event.
|
|
25
|
-
*/
|
|
26
|
-
this.selectWhenDisabled = new EventEmitter();
|
|
27
|
-
this.isOpening = false;
|
|
28
|
-
}
|
|
29
|
-
ngOnInit() {
|
|
30
|
-
// when the language changes, set the locale
|
|
31
|
-
this.langChangeSubscription = this._translate.onLangChange.subscribe(() => {
|
|
32
|
-
this.valueToDisplay = this.getValueToDisplay(this.timeInterval);
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
ngOnDestroy() {
|
|
36
|
-
if (this.langChangeSubscription)
|
|
37
|
-
this.langChangeSubscription.unsubscribe();
|
|
38
|
-
}
|
|
39
|
-
ngOnChanges(changes) {
|
|
40
|
-
if (changes.timeInterval)
|
|
41
|
-
this.valueToDisplay = this.getValueToDisplay(changes.timeInterval.currentValue);
|
|
42
|
-
}
|
|
43
|
-
getValueToDisplay(timeInterval) {
|
|
44
|
-
if (!timeInterval || !timeInterval.isSet())
|
|
45
|
-
return '';
|
|
46
|
-
// note: the time must be always considered without any timezone (UTC)
|
|
47
|
-
const dateOpts = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' };
|
|
48
|
-
return ''.concat(this._translate._('IDEA_UNCOMMON.FTTT.FROM'), ' ', new Date(timeInterval.from).toLocaleTimeString(this._translate.getCurrentLang(), dateOpts), ' ', this._translate._('IDEA_UNCOMMON.FTTT.TO').toLowerCase(), ' ', new Date(timeInterval.to).toLocaleTimeString(this._translate.getCurrentLang(), dateOpts));
|
|
49
|
-
}
|
|
50
|
-
async pickTimeInterval() {
|
|
51
|
-
if (this.isOpening)
|
|
52
|
-
return;
|
|
53
|
-
this.isOpening = true;
|
|
54
|
-
const modal = await this._modal.create({
|
|
55
|
-
component: IDEAFromTimeToTimeComponent,
|
|
56
|
-
componentProps: {
|
|
57
|
-
timeInterval: this.timeInterval,
|
|
58
|
-
period: this.period,
|
|
59
|
-
notEarlierThan: this.notEarlierThan,
|
|
60
|
-
notLaterThan: this.notLaterThan,
|
|
61
|
-
title: this.label
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
modal.onDidDismiss().then((res) => {
|
|
65
|
-
// if the content changed, update the internal values and notify the parent component
|
|
66
|
-
if (res.data === true || res.data === false) {
|
|
67
|
-
this.valueToDisplay = this.getValueToDisplay(this.timeInterval);
|
|
68
|
-
this.select.emit();
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
modal.present();
|
|
72
|
-
this.isOpening = false;
|
|
73
|
-
}
|
|
74
|
-
doSelectWhenDisabled() {
|
|
75
|
-
if (this.disabled)
|
|
76
|
-
this.selectWhenDisabled.emit();
|
|
77
|
-
}
|
|
78
|
-
doIconSelect(event) {
|
|
79
|
-
if (event)
|
|
80
|
-
event.stopPropagation();
|
|
81
|
-
this.iconSelect.emit(event);
|
|
82
|
-
}
|
|
83
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATimeIntervalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
84
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEATimeIntervalComponent, isStandalone: true, selector: "idea-time-interval", inputs: { timeInterval: "timeInterval", period: "period", notEarlierThan: "notEarlierThan", notLaterThan: "notLaterThan", label: "label", icon: "icon", iconColor: "iconColor", placeholder: "placeholder", disabled: "disabled", tappableWhenDisabled: "tappableWhenDisabled", obligatory: "obligatory", lines: "lines", color: "color" }, outputs: { select: "select", iconSelect: "iconSelect", selectWhenDisabled: "selectWhenDisabled" }, usesOnChanges: true, ngImport: i0, template: `
|
|
85
|
-
<ion-item
|
|
86
|
-
class="timeIntervalItem"
|
|
87
|
-
[color]="color"
|
|
88
|
-
[lines]="lines"
|
|
89
|
-
[button]="!disabled"
|
|
90
|
-
[disabled]="isOpening"
|
|
91
|
-
[title]="placeholder || valueToDisplay || ''"
|
|
92
|
-
[class.withLabel]="label"
|
|
93
|
-
(click)="disabled ? doSelectWhenDisabled() : pickTimeInterval()"
|
|
94
|
-
>
|
|
95
|
-
@if (icon) {
|
|
96
|
-
<ion-button
|
|
97
|
-
fill="clear"
|
|
98
|
-
slot="start"
|
|
99
|
-
[color]="iconColor"
|
|
100
|
-
[class.marginTop]="label"
|
|
101
|
-
(click)="doIconSelect($event)"
|
|
102
|
-
>
|
|
103
|
-
<ion-icon [name]="icon" slot="icon-only" />
|
|
104
|
-
</ion-button>
|
|
105
|
-
}
|
|
106
|
-
@if (label) {
|
|
107
|
-
<ion-label position="stacked" [class.selectable]="!disabled || tappableWhenDisabled">
|
|
108
|
-
{{ label }}
|
|
109
|
-
@if (obligatory && !disabled) {
|
|
110
|
-
<ion-text class="obligatoryDot" />
|
|
111
|
-
}
|
|
112
|
-
</ion-label>
|
|
113
|
-
}
|
|
114
|
-
<ion-label class="description" [class.selectable]="!disabled || tappableWhenDisabled">
|
|
115
|
-
@if (!valueToDisplay && !disabled) {
|
|
116
|
-
<ion-text class="placeholder" [class.selectable]="!disabled">
|
|
117
|
-
{{ placeholder }}
|
|
118
|
-
</ion-text>
|
|
119
|
-
}
|
|
120
|
-
{{ valueToDisplay }}
|
|
121
|
-
</ion-label>
|
|
122
|
-
@if (!disabled) {
|
|
123
|
-
<ion-icon slot="end" name="caret-down" class="selectIcon" [class.selectable]="!disabled" />
|
|
124
|
-
}
|
|
125
|
-
</ion-item>
|
|
126
|
-
`, isInline: true, styles: [".timeIntervalItem{min-height:48px;height:auto}.timeIntervalItem .description{margin:10px 0;height:20px;line-height:20px;width:100%}.timeIntervalItem .placeholder{color:var(--ion-color-medium)}.timeIntervalItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.timeIntervalItem.withLabel{min-height:58px;height:auto}.timeIntervalItem.withLabel .selectIcon{padding-top:25px}.timeIntervalItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}\n"], dependencies: [{ kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { 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"] }, { kind: "ngmodule", type: CommonModule }] }); }
|
|
127
|
-
}
|
|
128
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATimeIntervalComponent, decorators: [{
|
|
129
|
-
type: Component,
|
|
130
|
-
args: [{ selector: 'idea-time-interval', standalone: true, imports: [IonLabel, IonText, IonIcon, IonButton, IonItem, CommonModule], template: `
|
|
131
|
-
<ion-item
|
|
132
|
-
class="timeIntervalItem"
|
|
133
|
-
[color]="color"
|
|
134
|
-
[lines]="lines"
|
|
135
|
-
[button]="!disabled"
|
|
136
|
-
[disabled]="isOpening"
|
|
137
|
-
[title]="placeholder || valueToDisplay || ''"
|
|
138
|
-
[class.withLabel]="label"
|
|
139
|
-
(click)="disabled ? doSelectWhenDisabled() : pickTimeInterval()"
|
|
140
|
-
>
|
|
141
|
-
@if (icon) {
|
|
142
|
-
<ion-button
|
|
143
|
-
fill="clear"
|
|
144
|
-
slot="start"
|
|
145
|
-
[color]="iconColor"
|
|
146
|
-
[class.marginTop]="label"
|
|
147
|
-
(click)="doIconSelect($event)"
|
|
148
|
-
>
|
|
149
|
-
<ion-icon [name]="icon" slot="icon-only" />
|
|
150
|
-
</ion-button>
|
|
151
|
-
}
|
|
152
|
-
@if (label) {
|
|
153
|
-
<ion-label position="stacked" [class.selectable]="!disabled || tappableWhenDisabled">
|
|
154
|
-
{{ label }}
|
|
155
|
-
@if (obligatory && !disabled) {
|
|
156
|
-
<ion-text class="obligatoryDot" />
|
|
157
|
-
}
|
|
158
|
-
</ion-label>
|
|
159
|
-
}
|
|
160
|
-
<ion-label class="description" [class.selectable]="!disabled || tappableWhenDisabled">
|
|
161
|
-
@if (!valueToDisplay && !disabled) {
|
|
162
|
-
<ion-text class="placeholder" [class.selectable]="!disabled">
|
|
163
|
-
{{ placeholder }}
|
|
164
|
-
</ion-text>
|
|
165
|
-
}
|
|
166
|
-
{{ valueToDisplay }}
|
|
167
|
-
</ion-label>
|
|
168
|
-
@if (!disabled) {
|
|
169
|
-
<ion-icon slot="end" name="caret-down" class="selectIcon" [class.selectable]="!disabled" />
|
|
170
|
-
}
|
|
171
|
-
</ion-item>
|
|
172
|
-
`, styles: [".timeIntervalItem{min-height:48px;height:auto}.timeIntervalItem .description{margin:10px 0;height:20px;line-height:20px;width:100%}.timeIntervalItem .placeholder{color:var(--ion-color-medium)}.timeIntervalItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.timeIntervalItem.withLabel{min-height:58px;height:auto}.timeIntervalItem.withLabel .selectIcon{padding-top:25px}.timeIntervalItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}\n"] }]
|
|
173
|
-
}], propDecorators: { timeInterval: [{
|
|
174
|
-
type: Input
|
|
175
|
-
}], period: [{
|
|
176
|
-
type: Input
|
|
177
|
-
}], notEarlierThan: [{
|
|
178
|
-
type: Input
|
|
179
|
-
}], notLaterThan: [{
|
|
180
|
-
type: Input
|
|
181
|
-
}], label: [{
|
|
182
|
-
type: Input
|
|
183
|
-
}], icon: [{
|
|
184
|
-
type: Input
|
|
185
|
-
}], iconColor: [{
|
|
186
|
-
type: Input
|
|
187
|
-
}], placeholder: [{
|
|
188
|
-
type: Input
|
|
189
|
-
}], disabled: [{
|
|
190
|
-
type: Input
|
|
191
|
-
}], tappableWhenDisabled: [{
|
|
192
|
-
type: Input
|
|
193
|
-
}], obligatory: [{
|
|
194
|
-
type: Input
|
|
195
|
-
}], lines: [{
|
|
196
|
-
type: Input
|
|
197
|
-
}], color: [{
|
|
198
|
-
type: Input
|
|
199
|
-
}], select: [{
|
|
200
|
-
type: Output
|
|
201
|
-
}], iconSelect: [{
|
|
202
|
-
type: Output
|
|
203
|
-
}], selectWhenDisabled: [{
|
|
204
|
-
type: Output
|
|
205
|
-
}] } });
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZUludGVydmFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL3RpbWVJbnRlcnZhbC90aW1lSW50ZXJ2YWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUtaLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc1RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBc0ZsRixNQUFNLE9BQU8seUJBQXlCO0lBcEZ0QztRQXFGVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQU1yRDs7V0FFRztRQUNNLFdBQU0sR0FBWSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBNkN0Qzs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVDOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDaEQ7O1dBRUc7UUFDTyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBS3hELGNBQVMsR0FBRyxLQUFLLENBQUM7S0E4RG5CO0lBNURDLFFBQVE7UUFDTiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxVQUFVLENB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LENBQUMsS0FBVTtRQUNyQixJQUFJLEtBQUs7WUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzs4R0FySVUseUJBQXlCO2tHQUF6Qix5QkFBeUIsa2hCQWhGMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVCxna0JBM0NTLFFBQVEsNkZBQUUsT0FBTyxnRkFBRSxPQUFPLDJKQUFFLFNBQVMsb1BBQUUsT0FBTyx5TkFBRSxZQUFZOzsyRkFpRjNELHlCQUF5QjtrQkFwRnJDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLFlBQzdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ1Q7OEJBNkNRLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsTUFBTTtzQkFBZCxLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSUcsWUFBWTtzQkFBcEIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsSUFBSTtzQkFBWixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFJRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUksTUFBTTtzQkFBZixNQUFNO2dCQUlHLFVBQVU7c0JBQW5CLE1BQU07Z0JBSUcsa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT25DaGFuZ2VzLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIElvbkl0ZW0sIElvbkJ1dHRvbiwgSW9uSWNvbiwgSW9uVGV4dCwgSW9uTGFiZWwgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGltZUludGVydmFsIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7IElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUZyb21UaW1lVG9UaW1lQ29tcG9uZW50LCBQZXJpb2RzIH0gZnJvbSAnLi9mcm9tVGltZVRvVGltZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLXRpbWUtaW50ZXJ2YWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbSW9uTGFiZWwsIElvblRleHQsIElvbkljb24sIElvbkJ1dHRvbiwgSW9uSXRlbSwgQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW9uLWl0ZW1cbiAgICAgIGNsYXNzPVwidGltZUludGVydmFsSXRlbVwiXG4gICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgW2xpbmVzXT1cImxpbmVzXCJcbiAgICAgIFtidXR0b25dPVwiIWRpc2FibGVkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJpc09wZW5pbmdcIlxuICAgICAgW3RpdGxlXT1cInBsYWNlaG9sZGVyIHx8IHZhbHVlVG9EaXNwbGF5IHx8ICcnXCJcbiAgICAgIFtjbGFzcy53aXRoTGFiZWxdPVwibGFiZWxcIlxuICAgICAgKGNsaWNrKT1cImRpc2FibGVkID8gZG9TZWxlY3RXaGVuRGlzYWJsZWQoKSA6IHBpY2tUaW1lSW50ZXJ2YWwoKVwiXG4gICAgPlxuICAgICAgQGlmIChpY29uKSB7XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgIFtjb2xvcl09XCJpY29uQ29sb3JcIlxuICAgICAgICAgIFtjbGFzcy5tYXJnaW5Ub3BdPVwibGFiZWxcIlxuICAgICAgICAgIChjbGljayk9XCJkb0ljb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW9uLWljb24gW25hbWVdPVwiaWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKGxhYmVsKSB7XG4gICAgICAgIDxpb24tbGFiZWwgcG9zaXRpb249XCJzdGFja2VkXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkIHx8IHRhcHBhYmxlV2hlbkRpc2FibGVkXCI+XG4gICAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgICAgICBAaWYgKG9ibGlnYXRvcnkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJvYmxpZ2F0b3J5RG90XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgfVxuICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkIHx8IHRhcHBhYmxlV2hlbkRpc2FibGVkXCI+XG4gICAgICAgIEBpZiAoIXZhbHVlVG9EaXNwbGF5ICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cInBsYWNlaG9sZGVyXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkXCI+XG4gICAgICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIH1cbiAgICAgICAge3sgdmFsdWVUb0Rpc3BsYXkgfX1cbiAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgQGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwiY2FyZXQtZG93blwiIGNsYXNzPVwic2VsZWN0SWNvblwiIFtjbGFzcy5zZWxlY3RhYmxlXT1cIiFkaXNhYmxlZFwiIC8+XG4gICAgICB9XG4gICAgPC9pb24taXRlbT5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnRpbWVJbnRlcnZhbEl0ZW0ge1xuICAgICAgICBtaW4taGVpZ2h0OiA0OHB4O1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgIC5kZXNjcmlwdGlvbiB7XG4gICAgICAgICAgbWFyZ2luOiAxMHB4IDA7XG4gICAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG4gICAgICAgIC5wbGFjZWhvbGRlciB7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pO1xuICAgICAgICB9XG4gICAgICAgIC5zZWxlY3RJY29uIHtcbiAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgICAgICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC50aW1lSW50ZXJ2YWxJdGVtLndpdGhMYWJlbCB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDU4cHg7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgLnNlbGVjdEljb24ge1xuICAgICAgICAgIHBhZGRpbmctdG9wOiAyNXB4O1xuICAgICAgICB9XG4gICAgICAgIGlvbi1idXR0b25bc2xvdD0nc3RhcnQnXSB7XG4gICAgICAgICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLnNlbGVjdGFibGUge1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB9XG4gICAgYFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElERUFUaW1lSW50ZXJ2YWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfdHJhbnNsYXRlID0gaW5qZWN0KElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlKTtcblxuICAvKipcbiAgICogVGhlIHRpbWUgaW50ZXJ2YWwgdG8gc2V0LlxuICAgKi9cbiAgQElucHV0KCkgdGltZUludGVydmFsOiBUaW1lSW50ZXJ2YWw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHNob3VsZCBzdGFydCBwaWNraW5nIHRoZSB0aW1lIGRpc3BsYXlpbmcgdGhlIGFmdGVybm9vbiAoUE0pIG9yIHRoZSBtb3JuaW5nIChBTSwgZGVmYXVsdCkuXG4gICAqL1xuICBASW5wdXQoKSBwZXJpb2Q6IFBlcmlvZHMgPSBQZXJpb2RzLkFNO1xuICAvKipcbiAgICogQSB0aW1lIHRvIHVzZSBhcyBsb3dlciBsaW1pdCBmb3IgdGhlIHBvc3NpYmxlIGNob2ljZXMuXG4gICAqL1xuICBASW5wdXQoKSBub3RFYXJsaWVyVGhhbjogbnVtYmVyO1xuICAvKipcbiAgICogQSB0aW1lIHRvIHVzZSBhcyB1cHBlciBsaW1pdCBmb3IgdGhlIHBvc3NpYmxlIGNob2ljZXMuXG4gICAqL1xuICBASW5wdXQoKSBub3RMYXRlclRoYW46IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBmb3IgdGhlIGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpY29uIGZvciB0aGUgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGljb24uXG4gICAqL1xuICBASW5wdXQoKSBpY29uQ29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgcGxhY2Vob2xkZXIgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgZmllbGQgaGFzIGEgdGFwcGFibGUgZWZmZWN0IHdoZW4gZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoKSB0YXBwYWJsZVdoZW5EaXNhYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBvYmxpZ2F0b3J5IGRvdCBpcyBzaG93bi5cbiAgICovXG4gIEBJbnB1dCgpIG9ibGlnYXRvcnk6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMaW5lcyBwcmVmZXJlbmNlcyBmb3IgdGhlIGl0ZW0uXG4gICAqL1xuICBASW5wdXQoKSBsaW5lczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbG9yIGZvciB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgY29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIE9uIHNlbGVjdCBldmVudC5cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKlxuICAgKiBJY29uIHNlbGVjdC5cbiAgICovXG4gIEBPdXRwdXQoKSBpY29uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogT24gc2VsZWN0ICh3aXRoIHRoZSBmaWVsZCBkaXNhYmxlZCkgZXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KCkgc2VsZWN0V2hlbkRpc2FibGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHZhbHVlVG9EaXNwbGF5OiBzdHJpbmc7XG4gIHByaXZhdGUgbGFuZ0NoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGlzT3BlbmluZyA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIHdoZW4gdGhlIGxhbmd1YWdlIGNoYW5nZXMsIHNldCB0aGUgbG9jYWxlXG4gICAgdGhpcy5sYW5nQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5fdHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy52YWx1ZVRvRGlzcGxheSA9IHRoaXMuZ2V0VmFsdWVUb0Rpc3BsYXkodGhpcy50aW1lSW50ZXJ2YWwpO1xuICAgIH0pO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhbmdDaGFuZ2VTdWJzY3JpcHRpb24pIHRoaXMubGFuZ0NoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy50aW1lSW50ZXJ2YWwpIHRoaXMudmFsdWVUb0Rpc3BsYXkgPSB0aGlzLmdldFZhbHVlVG9EaXNwbGF5KGNoYW5nZXMudGltZUludGVydmFsLmN1cnJlbnRWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFZhbHVlVG9EaXNwbGF5KHRpbWVJbnRlcnZhbDogVGltZUludGVydmFsKTogc3RyaW5nIHtcbiAgICBpZiAoIXRpbWVJbnRlcnZhbCB8fCAhdGltZUludGVydmFsLmlzU2V0KCkpIHJldHVybiAnJztcbiAgICAvLyBub3RlOiB0aGUgdGltZSBtdXN0IGJlIGFsd2F5cyBjb25zaWRlcmVkIHdpdGhvdXQgYW55IHRpbWV6b25lIChVVEMpXG4gICAgY29uc3QgZGF0ZU9wdHMgPSB7IHRpbWVab25lOiAnVVRDJywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9IGFzIGNvbnN0O1xuICAgIHJldHVybiAnJy5jb25jYXQoXG4gICAgICB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5GVFRULkZST00nKSxcbiAgICAgICcgJyxcbiAgICAgIG5ldyBEYXRlKHRpbWVJbnRlcnZhbC5mcm9tKS50b0xvY2FsZVRpbWVTdHJpbmcodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIGRhdGVPcHRzKSxcbiAgICAgICcgJyxcbiAgICAgIHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX1VOQ09NTU9OLkZUVFQuVE8nKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgJyAnLFxuICAgICAgbmV3IERhdGUodGltZUludGVydmFsLnRvKS50b0xvY2FsZVRpbWVTdHJpbmcodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIGRhdGVPcHRzKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBwaWNrVGltZUludGVydmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbmluZykgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMuX21vZGFsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IElERUFGcm9tVGltZVRvVGltZUNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudFByb3BzOiB7XG4gICAgICAgIHRpbWVJbnRlcnZhbDogdGhpcy50aW1lSW50ZXJ2YWwsXG4gICAgICAgIHBlcmlvZDogdGhpcy5wZXJpb2QsXG4gICAgICAgIG5vdEVhcmxpZXJUaGFuOiB0aGlzLm5vdEVhcmxpZXJUaGFuLFxuICAgICAgICBub3RMYXRlclRoYW46IHRoaXMubm90TGF0ZXJUaGFuLFxuICAgICAgICB0aXRsZTogdGhpcy5sYWJlbFxuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGFsLm9uRGlkRGlzbWlzcygpLnRoZW4oKHJlczogYW55KTogdm9pZCA9PiB7XG4gICAgICAvLyBpZiB0aGUgY29udGVudCBjaGFuZ2VkLCB1cGRhdGUgdGhlIGludGVybmFsIHZhbHVlcyBhbmQgbm90aWZ5IHRoZSBwYXJlbnQgY29tcG9uZW50XG4gICAgICBpZiAocmVzLmRhdGEgPT09IHRydWUgfHwgcmVzLmRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMudmFsdWVUb0Rpc3BsYXkgPSB0aGlzLmdldFZhbHVlVG9EaXNwbGF5KHRoaXMudGltZUludGVydmFsKTtcbiAgICAgICAgdGhpcy5zZWxlY3QuZW1pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGFsLnByZXNlbnQoKTtcbiAgICB0aGlzLmlzT3BlbmluZyA9IGZhbHNlO1xuICB9XG5cbiAgZG9TZWxlY3RXaGVuRGlzYWJsZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHRoaXMuc2VsZWN0V2hlbkRpc2FibGVkLmVtaXQoKTtcbiAgfVxuXG4gIGRvSWNvblNlbGVjdChldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmljb25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/**
|
|
4
|
-
* @deprecated use a specific App service instead.
|
|
5
|
-
*/
|
|
6
|
-
export class IDEATinCanService {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.clear();
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Set a variable with the given value.
|
|
12
|
-
* @param variable variable to set
|
|
13
|
-
* @param value value to assign to the variable
|
|
14
|
-
*/
|
|
15
|
-
set(variable, value) {
|
|
16
|
-
this.data[variable] = value;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Get the content of a variable.
|
|
20
|
-
* @param variable variable to acquire
|
|
21
|
-
* @param getAndDelete if set, delete the variable after the acquisition
|
|
22
|
-
*/
|
|
23
|
-
get(variable, getAndDelete) {
|
|
24
|
-
const ret = this.data[variable];
|
|
25
|
-
if (getAndDelete)
|
|
26
|
-
this.remove(variable);
|
|
27
|
-
return ret;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Remove a variable.
|
|
31
|
-
* @param variable variable to remove
|
|
32
|
-
*/
|
|
33
|
-
remove(variable) {
|
|
34
|
-
delete this.data[variable];
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Clear all the variables.
|
|
38
|
-
*/
|
|
39
|
-
clear() {
|
|
40
|
-
this.data = {};
|
|
41
|
-
}
|
|
42
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATinCanService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
43
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATinCanService, providedIn: 'root' }); }
|
|
44
|
-
}
|
|
45
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATinCanService, decorators: [{
|
|
46
|
-
type: Injectable,
|
|
47
|
-
args: [{ providedIn: 'root' }]
|
|
48
|
-
}], ctorParameters: () => [] });
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGluQ2FuLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL3VuY29tbW9uL3NyYy90aW5DYW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQzs7R0FFRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFHNUI7UUFDRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxRQUFnQixFQUFFLEtBQVU7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsUUFBZ0IsRUFBRSxZQUFzQjtRQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksWUFBWTtZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFFBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0Q7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDakIsQ0FBQzs4R0FyQ1UsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FESixNQUFNOzsyRkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgYSBzcGVjaWZpYyBBcHAgc2VydmljZSBpbnN0ZWFkLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIElERUFUaW5DYW5TZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuXG4gICAqIEBwYXJhbSB2YXJpYWJsZSB2YXJpYWJsZSB0byBzZXRcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgdmFyaWFibGVcbiAgICovXG4gIHNldCh2YXJpYWJsZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5kYXRhW3ZhcmlhYmxlXSA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbnRlbnQgb2YgYSB2YXJpYWJsZS5cbiAgICogQHBhcmFtIHZhcmlhYmxlIHZhcmlhYmxlIHRvIGFjcXVpcmVcbiAgICogQHBhcmFtIGdldEFuZERlbGV0ZSBpZiBzZXQsIGRlbGV0ZSB0aGUgdmFyaWFibGUgYWZ0ZXIgdGhlIGFjcXVpc2l0aW9uXG4gICAqL1xuICBnZXQodmFyaWFibGU6IHN0cmluZywgZ2V0QW5kRGVsZXRlPzogYm9vbGVhbik6IGFueSB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5kYXRhW3ZhcmlhYmxlXTtcbiAgICBpZiAoZ2V0QW5kRGVsZXRlKSB0aGlzLnJlbW92ZSh2YXJpYWJsZSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIGEgdmFyaWFibGUuXG4gICAqIEBwYXJhbSB2YXJpYWJsZSB2YXJpYWJsZSB0byByZW1vdmVcbiAgICovXG4gIHJlbW92ZSh2YXJpYWJsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuZGF0YVt2YXJpYWJsZV07XG4gIH1cbiAgLyoqXG4gICAqIENsZWFyIGFsbCB0aGUgdmFyaWFibGVzLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhID0ge307XG4gIH1cbn1cbiJdfQ==
|