@idea-ionic/uncommon 8.2.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/LICENSE +373 -0
- package/README.md +21 -0
- package/css/global.scss +15 -0
- package/esm2022/idea-ionic-uncommon.mjs +5 -0
- package/esm2022/public-api.mjs +35 -0
- package/esm2022/src/AWSAPI.service.mjs +430 -0
- package/esm2022/src/AWSAPISocket.service.mjs +187 -0
- package/esm2022/src/address/address.component.mjs +94 -0
- package/esm2022/src/address/address.module.mjs +21 -0
- package/esm2022/src/announcement/announcement.component.mjs +41 -0
- package/esm2022/src/announcement/announcement.module.mjs +21 -0
- package/esm2022/src/cachedResources.service.mjs +55 -0
- package/esm2022/src/colors/colorPicker.component.mjs +135 -0
- package/esm2022/src/colors/colorPicker.module.mjs +20 -0
- package/esm2022/src/contacts/contacts.component.mjs +64 -0
- package/esm2022/src/contacts/contacts.module.mjs +21 -0
- package/esm2022/src/dateTime/calendarPicker.component.mjs +196 -0
- package/esm2022/src/dateTime/dateTime.component.mjs +133 -0
- package/esm2022/src/dateTime/dateTime.module.mjs +22 -0
- package/esm2022/src/duration/duration.component.mjs +77 -0
- package/esm2022/src/duration/duration.module.mjs +21 -0
- package/esm2022/src/echo/echo.module.mjs +26 -0
- package/esm2022/src/echo/echo.page.mjs +165 -0
- package/esm2022/src/errorReporting.service.mjs +68 -0
- package/esm2022/src/mde/mde.component.mjs +44 -0
- package/esm2022/src/mde/mde.module.mjs +22 -0
- package/esm2022/src/mde/mdeToolbar.component.mjs +12 -0
- package/esm2022/src/offline/cacheableResource.component.mjs +18 -0
- package/esm2022/src/offline/offline.module.mjs +22 -0
- package/esm2022/src/offline/offline.service.mjs +62 -0
- package/esm2022/src/offline/offlineData.service.mjs +479 -0
- package/esm2022/src/offline/offlineIndicator.component.mjs +58 -0
- package/esm2022/src/offline/offlineManager.component.mjs +84 -0
- package/esm2022/src/pushNotifications.service.mjs +56 -0
- package/esm2022/src/sentiment/sentiment.component.mjs +71 -0
- package/esm2022/src/sentiment/sentiment.module.mjs +21 -0
- package/esm2022/src/timeInterval/fromTimeToTime.component.mjs +155 -0
- package/esm2022/src/timeInterval/timeInterval.component.mjs +122 -0
- package/esm2022/src/timeInterval/timeInterval.module.mjs +22 -0
- package/esm2022/src/tinCan.service.mjs +49 -0
- package/fesm2022/idea-ionic-uncommon.mjs +2891 -0
- package/fesm2022/idea-ionic-uncommon.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +51 -0
- package/public-api.d.ts +34 -0
- package/src/AWSAPI.service.d.ts +178 -0
- package/src/AWSAPISocket.service.d.ts +129 -0
- package/src/address/address.component.d.ts +64 -0
- package/src/address/address.module.d.ts +11 -0
- package/src/announcement/announcement.component.d.ts +23 -0
- package/src/announcement/announcement.module.d.ts +11 -0
- package/src/cachedResources.service.d.ts +34 -0
- package/src/colors/colorPicker.component.d.ts +78 -0
- package/src/colors/colorPicker.module.d.ts +10 -0
- package/src/contacts/contacts.component.d.ts +31 -0
- package/src/contacts/contacts.module.d.ts +11 -0
- package/src/dateTime/calendarPicker.component.d.ts +45 -0
- package/src/dateTime/dateTime.component.d.ts +81 -0
- package/src/dateTime/dateTime.module.d.ts +12 -0
- package/src/duration/duration.component.d.ts +68 -0
- package/src/duration/duration.module.d.ts +11 -0
- package/src/echo/echo.module.d.ts +12 -0
- package/src/echo/echo.page.d.ts +34 -0
- package/src/errorReporting.service.d.ts +26 -0
- package/src/mde/mde.component.d.ts +39 -0
- package/src/mde/mde.module.d.ts +12 -0
- package/src/mde/mdeToolbar.component.d.ts +5 -0
- package/src/offline/cacheableResource.component.d.ts +11 -0
- package/src/offline/offline.module.d.ts +12 -0
- package/src/offline/offline.service.d.ts +39 -0
- package/src/offline/offlineData.service.d.ts +281 -0
- package/src/offline/offlineIndicator.component.d.ts +25 -0
- package/src/offline/offlineManager.component.d.ts +17 -0
- package/src/pushNotifications.service.d.ts +26 -0
- package/src/sentiment/sentiment.component.d.ts +35 -0
- package/src/sentiment/sentiment.module.d.ts +11 -0
- package/src/timeInterval/fromTimeToTime.component.d.ts +61 -0
- package/src/timeInterval/timeInterval.component.d.ts +84 -0
- package/src/timeInterval/timeInterval.module.d.ts +12 -0
- package/src/tinCan.service.d.ts +31 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
|
|
2
|
+
import { PopoverController } from '@ionic/angular';
|
|
3
|
+
import { COLORS } from 'idea-toolbox';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@ionic/angular";
|
|
6
|
+
/**
|
|
7
|
+
* Pick a color from a defined set.
|
|
8
|
+
*/
|
|
9
|
+
export class IDEAColorPickerComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
/**
|
|
12
|
+
* The pickable colors.
|
|
13
|
+
*/
|
|
14
|
+
this.colors = COLORS;
|
|
15
|
+
/**
|
|
16
|
+
* On select event.
|
|
17
|
+
*/
|
|
18
|
+
this.select = new EventEmitter();
|
|
19
|
+
/**
|
|
20
|
+
* Icon select.
|
|
21
|
+
*/
|
|
22
|
+
this.iconSelect = new EventEmitter();
|
|
23
|
+
this._popover = inject(PopoverController);
|
|
24
|
+
}
|
|
25
|
+
async openPalette(event) {
|
|
26
|
+
if (this.disabled)
|
|
27
|
+
return;
|
|
28
|
+
const componentProps = { colors: this.colors, current: this.current };
|
|
29
|
+
const popover = await this._popover.create({ component: ColorsPaletteComponent, componentProps, event });
|
|
30
|
+
popover.onDidDismiss().then(res => {
|
|
31
|
+
if (res && res.data)
|
|
32
|
+
this.select.emit(res.data);
|
|
33
|
+
});
|
|
34
|
+
popover.present();
|
|
35
|
+
}
|
|
36
|
+
doIconSelect(event) {
|
|
37
|
+
if (event)
|
|
38
|
+
event.stopPropagation();
|
|
39
|
+
this.iconSelect.emit(event);
|
|
40
|
+
}
|
|
41
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
42
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEAColorPickerComponent, selector: "idea-color-picker", inputs: { colors: "colors", current: "current", label: "label", placeholder: "placeholder", icon: "icon", iconColor: "iconColor", disabled: "disabled", obligatory: "obligatory", lines: "lines", color: "color" }, outputs: { select: "select", iconSelect: "iconSelect" }, ngImport: i0, template: "<ion-item\n class=\"colorPickerItem\"\n [color]=\"color\"\n [lines]=\"lines\"\n [button]=\"!disabled\"\n [title]=\"placeholder || ''\"\n [class.withLabel]=\"label\"\n (click)=\"openPalette($event)\"\n>\n @if (icon) {\n <ion-button fill=\"clear\" slot=\"start\" [color]=\"iconColor\" (click)=\"doIconSelect($event)\">\n <ion-icon [name]=\"icon\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label) {\n <ion-label [class.selectable]=\"!disabled\">\n {{ label }}\n @if (obligatory && !disabled) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-avatar slot=\"end\" class=\"colorCircle\" [style.background-color]=\"current\" />\n @if (!disabled) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled\" />\n }\n</ion-item>\n", styles: [".colorPickerItem{min-height:48px;height:auto}.colorPickerItem .placeholder{color:var(--ion-color-medium)}.colorPickerItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.selectItem.withLabel{min-height:58px;height:auto}.selectItem.withLabel .selectIcon{padding-top:25px}.selectItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}ion-avatar.colorCircle{width:20px;height:20px}\n"], dependencies: [{ kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.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: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
|
|
43
|
+
}
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerComponent, decorators: [{
|
|
45
|
+
type: Component,
|
|
46
|
+
args: [{ selector: 'idea-color-picker', template: "<ion-item\n class=\"colorPickerItem\"\n [color]=\"color\"\n [lines]=\"lines\"\n [button]=\"!disabled\"\n [title]=\"placeholder || ''\"\n [class.withLabel]=\"label\"\n (click)=\"openPalette($event)\"\n>\n @if (icon) {\n <ion-button fill=\"clear\" slot=\"start\" [color]=\"iconColor\" (click)=\"doIconSelect($event)\">\n <ion-icon [name]=\"icon\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label) {\n <ion-label [class.selectable]=\"!disabled\">\n {{ label }}\n @if (obligatory && !disabled) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-avatar slot=\"end\" class=\"colorCircle\" [style.background-color]=\"current\" />\n @if (!disabled) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled\" />\n }\n</ion-item>\n", styles: [".colorPickerItem{min-height:48px;height:auto}.colorPickerItem .placeholder{color:var(--ion-color-medium)}.colorPickerItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.selectItem.withLabel{min-height:58px;height:auto}.selectItem.withLabel .selectIcon{padding-top:25px}.selectItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}ion-avatar.colorCircle{width:20px;height:20px}\n"] }]
|
|
47
|
+
}], propDecorators: { colors: [{
|
|
48
|
+
type: Input
|
|
49
|
+
}], current: [{
|
|
50
|
+
type: Input
|
|
51
|
+
}], label: [{
|
|
52
|
+
type: Input
|
|
53
|
+
}], placeholder: [{
|
|
54
|
+
type: Input
|
|
55
|
+
}], icon: [{
|
|
56
|
+
type: Input
|
|
57
|
+
}], iconColor: [{
|
|
58
|
+
type: Input
|
|
59
|
+
}], disabled: [{
|
|
60
|
+
type: Input
|
|
61
|
+
}], obligatory: [{
|
|
62
|
+
type: Input
|
|
63
|
+
}], lines: [{
|
|
64
|
+
type: Input
|
|
65
|
+
}], color: [{
|
|
66
|
+
type: Input
|
|
67
|
+
}], select: [{
|
|
68
|
+
type: Output
|
|
69
|
+
}], iconSelect: [{
|
|
70
|
+
type: Output
|
|
71
|
+
}] } });
|
|
72
|
+
/**
|
|
73
|
+
* Component to open in a popover for displaying the colors available.
|
|
74
|
+
*/
|
|
75
|
+
export class ColorsPaletteComponent {
|
|
76
|
+
constructor() {
|
|
77
|
+
this._popover = inject(PopoverController);
|
|
78
|
+
}
|
|
79
|
+
pick(color) {
|
|
80
|
+
this._popover.dismiss(color);
|
|
81
|
+
}
|
|
82
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: ColorsPaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
83
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: ColorsPaletteComponent, selector: "idea-colors-palette", inputs: { colors: "colors", current: "current" }, ngImport: i0, template: `
|
|
84
|
+
<ion-content>
|
|
85
|
+
<ion-grid>
|
|
86
|
+
<ion-row>
|
|
87
|
+
@for (c of colors; track c) {
|
|
88
|
+
<ion-col [size]="2">
|
|
89
|
+
<ion-avatar
|
|
90
|
+
class="colorCircle tappable"
|
|
91
|
+
[style.background-color]="c.hex"
|
|
92
|
+
[title]="c.name || c.hex"
|
|
93
|
+
(click)="pick(c.hex)"
|
|
94
|
+
>
|
|
95
|
+
@if (c.hex === current) {
|
|
96
|
+
<ion-icon name="checkmark" />
|
|
97
|
+
}
|
|
98
|
+
</ion-avatar>
|
|
99
|
+
</ion-col>
|
|
100
|
+
}
|
|
101
|
+
</ion-row>
|
|
102
|
+
</ion-grid>
|
|
103
|
+
</ion-content>
|
|
104
|
+
`, isInline: true, styles: ["ion-content{--background: var(--ion-color-white)}ion-avatar.colorCircle{width:20px;height:20px}.tappable{cursor:pointer}ion-avatar.colorCircle ion-icon{color:#fff;font-size:1.2em}\n"], dependencies: [{ kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.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: i1.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }] }); }
|
|
105
|
+
}
|
|
106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: ColorsPaletteComponent, decorators: [{
|
|
107
|
+
type: Component,
|
|
108
|
+
args: [{ selector: 'idea-colors-palette', template: `
|
|
109
|
+
<ion-content>
|
|
110
|
+
<ion-grid>
|
|
111
|
+
<ion-row>
|
|
112
|
+
@for (c of colors; track c) {
|
|
113
|
+
<ion-col [size]="2">
|
|
114
|
+
<ion-avatar
|
|
115
|
+
class="colorCircle tappable"
|
|
116
|
+
[style.background-color]="c.hex"
|
|
117
|
+
[title]="c.name || c.hex"
|
|
118
|
+
(click)="pick(c.hex)"
|
|
119
|
+
>
|
|
120
|
+
@if (c.hex === current) {
|
|
121
|
+
<ion-icon name="checkmark" />
|
|
122
|
+
}
|
|
123
|
+
</ion-avatar>
|
|
124
|
+
</ion-col>
|
|
125
|
+
}
|
|
126
|
+
</ion-row>
|
|
127
|
+
</ion-grid>
|
|
128
|
+
</ion-content>
|
|
129
|
+
`, styles: ["ion-content{--background: var(--ion-color-white)}ion-avatar.colorCircle{width:20px;height:20px}.tappable{cursor:pointer}ion-avatar.colorCircle ion-icon{color:#fff;font-size:1.2em}\n"] }]
|
|
130
|
+
}], propDecorators: { colors: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], current: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}] } });
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3JQaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29sb3JzL2NvbG9yUGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL2NvbG9ycy9jb2xvclBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQVMsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7QUFFN0M7O0dBRUc7QUFNSCxNQUFNLE9BQU8sd0JBQXdCO0lBTHJDO1FBTUU7O1dBRUc7UUFDTSxXQUFNLEdBQVksTUFBTSxDQUFDO1FBcUNsQzs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzlDOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFeEMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0tBaUI5QztJQWZDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBVTtRQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUUxQixNQUFNLGNBQWMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJO2dCQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVU7UUFDckIsSUFBSSxLQUFLO1lBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7OEdBbEVVLHdCQUF3QjtrR0FBeEIsd0JBQXdCLHNVQ1pyQywrMEJBMkJBOzsyRkRmYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsbUJBQW1COzhCQVFwQixNQUFNO3NCQUFkLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsVUFBVTtzQkFBbEIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsS0FBSztzQkFBYixLQUFLO2dCQUlJLE1BQU07c0JBQWYsTUFBTTtnQkFJRyxVQUFVO3NCQUFuQixNQUFNOztBQXFCVDs7R0FFRztBQTRDSCxNQUFNLE9BQU8sc0JBQXNCO0lBM0NuQztRQTRDVSxhQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FjOUM7SUFIQyxJQUFJLENBQUMsS0FBYTtRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDOzhHQWRVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLDZHQXpDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVDs7MkZBb0JVLHNCQUFzQjtrQkEzQ2xDLFNBQVM7K0JBQ0UscUJBQXFCLFlBQ3JCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQlQ7OEJBMEJRLE1BQU07c0JBQWQsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IENvbG9yLCBDT0xPUlMgfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuXG4vKipcbiAqIFBpY2sgYSBjb2xvciBmcm9tIGEgZGVmaW5lZCBzZXQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lkZWEtY29sb3ItcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICdjb2xvclBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjb2xvclBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIElERUFDb2xvclBpY2tlckNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUaGUgcGlja2FibGUgY29sb3JzLlxuICAgKi9cbiAgQElucHV0KCkgY29sb3JzOiBDb2xvcltdID0gQ09MT1JTO1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgY29sb3IuXG4gICAqL1xuICBASW5wdXQoKSBjdXJyZW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHBsYWNlaG9sZGVyIGZvciB0aGUgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGljb24gZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIGljb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgaWNvbi5cbiAgICovXG4gIEBJbnB1dCgpIGljb25Db2xvcjogc3RyaW5nO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgdGhlIG9ibGlnYXRvcnkgZG90IGlzIHNob3duLlxuICAgKi9cbiAgQElucHV0KCkgb2JsaWdhdG9yeTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIExpbmVzIHByZWZlcmVuY2VzIGZvciB0aGUgaXRlbS5cbiAgICovXG4gIEBJbnB1dCgpIGxpbmVzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3IgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBjb2xvcjogc3RyaW5nO1xuICAvKipcbiAgICogT24gc2VsZWN0IGV2ZW50LlxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKipcbiAgICogSWNvbiBzZWxlY3QuXG4gICAqL1xuICBAT3V0cHV0KCkgaWNvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIF9wb3BvdmVyID0gaW5qZWN0KFBvcG92ZXJDb250cm9sbGVyKTtcblxuICBhc3luYyBvcGVuUGFsZXR0ZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbXBvbmVudFByb3BzID0geyBjb2xvcnM6IHRoaXMuY29sb3JzLCBjdXJyZW50OiB0aGlzLmN1cnJlbnQgfTtcbiAgICBjb25zdCBwb3BvdmVyID0gYXdhaXQgdGhpcy5fcG9wb3Zlci5jcmVhdGUoeyBjb21wb25lbnQ6IENvbG9yc1BhbGV0dGVDb21wb25lbnQsIGNvbXBvbmVudFByb3BzLCBldmVudCB9KTtcbiAgICBwb3BvdmVyLm9uRGlkRGlzbWlzcygpLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHRoaXMuc2VsZWN0LmVtaXQocmVzLmRhdGEpO1xuICAgIH0pO1xuICAgIHBvcG92ZXIucHJlc2VudCgpO1xuICB9XG5cbiAgZG9JY29uU2VsZWN0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaWNvblNlbGVjdC5lbWl0KGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBvbmVudCB0byBvcGVuIGluIGEgcG9wb3ZlciBmb3IgZGlzcGxheWluZyB0aGUgY29sb3JzIGF2YWlsYWJsZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWRlYS1jb2xvcnMtcGFsZXR0ZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1jb250ZW50PlxuICAgICAgPGlvbi1ncmlkPlxuICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICBAZm9yIChjIG9mIGNvbG9yczsgdHJhY2sgYykge1xuICAgICAgICAgICAgPGlvbi1jb2wgW3NpemVdPVwiMlwiPlxuICAgICAgICAgICAgICA8aW9uLWF2YXRhclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sb3JDaXJjbGUgdGFwcGFibGVcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImMuaGV4XCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiYy5uYW1lIHx8IGMuaGV4XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGljayhjLmhleClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChjLmhleCA9PT0gY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGVja21hcmtcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tYXZhdGFyPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tZ3JpZD5cbiAgICA8L2lvbi1jb250ZW50PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICBpb24tY29udGVudCB7XG4gICAgICAgIC0tYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXdoaXRlKTtcbiAgICAgIH1cbiAgICAgIGlvbi1hdmF0YXIuY29sb3JDaXJjbGUge1xuICAgICAgICB3aWR0aDogMjBweDtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgfVxuICAgICAgLnRhcHBhYmxlIHtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuICAgICAgaW9uLWF2YXRhci5jb2xvckNpcmNsZSBpb24taWNvbiB7XG4gICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgZm9udC1zaXplOiAxLjJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JzUGFsZXR0ZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgX3BvcG92ZXIgPSBpbmplY3QoUG9wb3ZlckNvbnRyb2xsZXIpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGlja2FibGUgY29sb3JzLlxuICAgKi9cbiAgQElucHV0KCkgY29sb3JzOiBDb2xvcltdO1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgY29sb3IuXG4gICAqL1xuICBASW5wdXQoKSBjdXJyZW50OiBzdHJpbmc7XG5cbiAgcGljayhjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcG9wb3Zlci5kaXNtaXNzKGNvbG9yKTtcbiAgfVxufVxuIiwiPGlvbi1pdGVtXG4gIGNsYXNzPVwiY29sb3JQaWNrZXJJdGVtXCJcbiAgW2NvbG9yXT1cImNvbG9yXCJcbiAgW2xpbmVzXT1cImxpbmVzXCJcbiAgW2J1dHRvbl09XCIhZGlzYWJsZWRcIlxuICBbdGl0bGVdPVwicGxhY2Vob2xkZXIgfHwgJydcIlxuICBbY2xhc3Mud2l0aExhYmVsXT1cImxhYmVsXCJcbiAgKGNsaWNrKT1cIm9wZW5QYWxldHRlKCRldmVudClcIlxuPlxuICBAaWYgKGljb24pIHtcbiAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzbG90PVwic3RhcnRcIiBbY29sb3JdPVwiaWNvbkNvbG9yXCIgKGNsaWNrKT1cImRvSWNvblNlbGVjdCgkZXZlbnQpXCI+XG4gICAgICA8aW9uLWljb24gW25hbWVdPVwiaWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgIDwvaW9uLWJ1dHRvbj5cbiAgfVxuICBAaWYgKGxhYmVsKSB7XG4gICAgPGlvbi1sYWJlbCBbY2xhc3Muc2VsZWN0YWJsZV09XCIhZGlzYWJsZWRcIj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgICBAaWYgKG9ibGlnYXRvcnkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIDxpb24tdGV4dCBjbGFzcz1cIm9ibGlnYXRvcnlEb3RcIiAvPlxuICAgICAgfVxuICAgIDwvaW9uLWxhYmVsPlxuICB9XG4gIDxpb24tYXZhdGFyIHNsb3Q9XCJlbmRcIiBjbGFzcz1cImNvbG9yQ2lyY2xlXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY3VycmVudFwiIC8+XG4gIEBpZiAoIWRpc2FibGVkKSB7XG4gICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwiY2FyZXQtZG93blwiIGNsYXNzPVwic2VsZWN0SWNvblwiIFtjbGFzcy5zZWxlY3RhYmxlXT1cIiFkaXNhYmxlZFwiIC8+XG4gIH1cbjwvaW9uLWl0ZW0+XG4iXX0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { IonicModule } from '@ionic/angular';
|
|
5
|
+
import { ColorsPaletteComponent, IDEAColorPickerComponent } from './colorPicker.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class IDEAColorPickerModule {
|
|
8
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
9
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerModule, declarations: [IDEAColorPickerComponent, ColorsPaletteComponent], imports: [CommonModule, FormsModule, IonicModule], exports: [IDEAColorPickerComponent, ColorsPaletteComponent] }); }
|
|
10
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerModule, imports: [CommonModule, FormsModule, IonicModule] }); }
|
|
11
|
+
}
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerModule, decorators: [{
|
|
13
|
+
type: NgModule,
|
|
14
|
+
args: [{
|
|
15
|
+
imports: [CommonModule, FormsModule, IonicModule],
|
|
16
|
+
declarations: [IDEAColorPickerComponent, ColorsPaletteComponent],
|
|
17
|
+
exports: [IDEAColorPickerComponent, ColorsPaletteComponent]
|
|
18
|
+
}]
|
|
19
|
+
}] });
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3JQaWNrZXIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29sb3JzL2NvbG9yUGlja2VyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQU8zRixNQUFNLE9BQU8scUJBQXFCOzhHQUFyQixxQkFBcUI7K0dBQXJCLHFCQUFxQixpQkFIakIsd0JBQXdCLEVBQUUsc0JBQXNCLGFBRHJELFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxhQUV0Qyx3QkFBd0IsRUFBRSxzQkFBc0I7K0dBRS9DLHFCQUFxQixZQUp0QixZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVc7OzJGQUlyQyxxQkFBcUI7a0JBTGpDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUM7b0JBQ2pELFlBQVksRUFBRSxDQUFDLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDO29CQUNoRSxPQUFPLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQztpQkFDNUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uaWNNb2R1bGUgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5cbmltcG9ydCB7IENvbG9yc1BhbGV0dGVDb21wb25lbnQsIElERUFDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vY29sb3JQaWNrZXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElvbmljTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbSURFQUNvbG9yUGlja2VyQ29tcG9uZW50LCBDb2xvcnNQYWxldHRlQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0lERUFDb2xvclBpY2tlckNvbXBvbmVudCwgQ29sb3JzUGFsZXR0ZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgSURFQUNvbG9yUGlja2VyTW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Component, Input, inject } from '@angular/core';
|
|
2
|
+
import { AlertController } from '@ionic/angular';
|
|
3
|
+
import { Contacts } from 'idea-toolbox';
|
|
4
|
+
import { IDEATranslationsService } from '@idea-ionic/common';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/forms";
|
|
7
|
+
import * as i2 from "@ionic/angular";
|
|
8
|
+
import * as i3 from "@idea-ionic/common";
|
|
9
|
+
export class IDEAContactsComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
this._alert = inject(AlertController);
|
|
12
|
+
this._translate = inject(IDEATranslationsService);
|
|
13
|
+
/**
|
|
14
|
+
* The contacts to manage.
|
|
15
|
+
*/
|
|
16
|
+
this.contacts = new Contacts();
|
|
17
|
+
/**
|
|
18
|
+
* If true, show the field `name`.
|
|
19
|
+
*/
|
|
20
|
+
this.showName = false;
|
|
21
|
+
/**
|
|
22
|
+
* Whether the fields are editable or disabled.
|
|
23
|
+
*/
|
|
24
|
+
this.editMode = true;
|
|
25
|
+
}
|
|
26
|
+
sendEmail() {
|
|
27
|
+
if (!this.contacts.email)
|
|
28
|
+
return;
|
|
29
|
+
const url = `mailto:${this.contacts.email}`;
|
|
30
|
+
this.preExternalAction(this.contacts.email, () => window.open(url, '_system'));
|
|
31
|
+
}
|
|
32
|
+
call() {
|
|
33
|
+
if (!this.contacts.phone)
|
|
34
|
+
return;
|
|
35
|
+
const url = `tel:${this.contacts.phone}`;
|
|
36
|
+
this.preExternalAction(this.contacts.phone, () => window.open(url, '_system'));
|
|
37
|
+
}
|
|
38
|
+
preExternalAction(message, cb) {
|
|
39
|
+
const header = this._translate._('COMMON.DO_YOU_WANT_TO_PROCEED');
|
|
40
|
+
const buttons = [
|
|
41
|
+
{ text: this._translate._('COMMON.CANCEL') },
|
|
42
|
+
{ text: this._translate._('COMMON.CONFIRM'), handler: () => cb() }
|
|
43
|
+
];
|
|
44
|
+
const cssClass = 'selectableAlertMessage';
|
|
45
|
+
this._alert.create({ header, message, buttons, cssClass }).then(alert => alert.present());
|
|
46
|
+
}
|
|
47
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
48
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEAContactsComponent, selector: "idea-contacts", inputs: { contacts: "contacts", showName: "showName", editMode: "editMode", lines: "lines", color: "color" }, ngImport: i0, template: "<div class=\"contacts\">\n @if (showName) {\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.NAME' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [(ngModel)]=\"contacts.name\"\n />\n </ion-item>\n }\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.PHONE' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [(ngModel)]=\"contacts.phone\"\n />\n @if (!editMode) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.CALL' | translate\"\n (click)=\"call()\"\n >\n <ion-icon name=\"call\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [(ngModel)]=\"contacts.email\"\n />\n @if (!editMode) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.SEND_EMAIL' | translate\"\n (click)=\"sendEmail()\"\n >\n <ion-icon name=\"mail\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n</div>\n", styles: [".marginTop{margin-top:14px}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.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: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }] }); }
|
|
49
|
+
}
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsComponent, decorators: [{
|
|
51
|
+
type: Component,
|
|
52
|
+
args: [{ selector: 'idea-contacts', template: "<div class=\"contacts\">\n @if (showName) {\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.NAME' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [(ngModel)]=\"contacts.name\"\n />\n </ion-item>\n }\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.PHONE' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [(ngModel)]=\"contacts.phone\"\n />\n @if (!editMode) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.CALL' | translate\"\n (click)=\"call()\"\n >\n <ion-icon name=\"call\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [(ngModel)]=\"contacts.email\"\n />\n @if (!editMode) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.SEND_EMAIL' | translate\"\n (click)=\"sendEmail()\"\n >\n <ion-icon name=\"mail\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n</div>\n", styles: [".marginTop{margin-top:14px}\n"] }]
|
|
53
|
+
}], propDecorators: { contacts: [{
|
|
54
|
+
type: Input
|
|
55
|
+
}], showName: [{
|
|
56
|
+
type: Input
|
|
57
|
+
}], editMode: [{
|
|
58
|
+
type: Input
|
|
59
|
+
}], lines: [{
|
|
60
|
+
type: Input
|
|
61
|
+
}], color: [{
|
|
62
|
+
type: Input
|
|
63
|
+
}] } });
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29udGFjdHMvY29udGFjdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29udGFjdHMvY29udGFjdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7OztBQU83RCxNQUFNLE9BQU8scUJBQXFCO0lBTGxDO1FBTVUsV0FBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxlQUFVLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFckQ7O1dBRUc7UUFDTSxhQUFRLEdBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM3Qzs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDMUI7O1dBRUc7UUFDTSxhQUFRLEdBQUcsSUFBSSxDQUFDO0tBOEIxQjtJQXBCQyxTQUFTO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztZQUFFLE9BQU87UUFDakMsTUFBTSxHQUFHLEdBQUcsVUFBVSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztZQUFFLE9BQU87UUFDakMsTUFBTSxHQUFHLEdBQUcsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsRUFBYztRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sT0FBTyxHQUFHO1lBQ2QsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDNUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7U0FDekUsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDOzhHQTVDVSxxQkFBcUI7a0dBQXJCLHFCQUFxQixtS0NWbEMsdTlEQTZEQTs7MkZEbkRhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxlQUFlOzhCQVdoQixRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBDb250YWN0cyB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQgeyBJREVBVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lkZWEtY29udGFjdHMnLFxuICB0ZW1wbGF0ZVVybDogJ2NvbnRhY3RzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2NvbnRhY3RzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSURFQUNvbnRhY3RzQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfYWxlcnQgPSBpbmplY3QoQWxlcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfdHJhbnNsYXRlID0gaW5qZWN0KElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlKTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhY3RzIHRvIG1hbmFnZS5cbiAgICovXG4gIEBJbnB1dCgpIGNvbnRhY3RzOiBDb250YWN0cyA9IG5ldyBDb250YWN0cygpO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgc2hvdyB0aGUgZmllbGQgYG5hbWVgLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd05hbWUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkcyBhcmUgZWRpdGFibGUgb3IgZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoKSBlZGl0TW9kZSA9IHRydWU7XG4gIC8qKlxuICAgKiBUaGUgbGluZXMgYXR0cmlidXRlIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgQElucHV0KCkgbGluZXM6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2xvciBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmc7XG5cbiAgc2VuZEVtYWlsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250YWN0cy5lbWFpbCkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IGBtYWlsdG86JHt0aGlzLmNvbnRhY3RzLmVtYWlsfWA7XG4gICAgdGhpcy5wcmVFeHRlcm5hbEFjdGlvbih0aGlzLmNvbnRhY3RzLmVtYWlsLCAoKTogV2luZG93ID0+IHdpbmRvdy5vcGVuKHVybCwgJ19zeXN0ZW0nKSk7XG4gIH1cbiAgY2FsbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGFjdHMucGhvbmUpIHJldHVybjtcbiAgICBjb25zdCB1cmwgPSBgdGVsOiR7dGhpcy5jb250YWN0cy5waG9uZX1gO1xuICAgIHRoaXMucHJlRXh0ZXJuYWxBY3Rpb24odGhpcy5jb250YWN0cy5waG9uZSwgKCk6IFdpbmRvdyA9PiB3aW5kb3cub3Blbih1cmwsICdfc3lzdGVtJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVFeHRlcm5hbEFjdGlvbihtZXNzYWdlOiBzdHJpbmcsIGNiOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5ET19ZT1VfV0FOVF9UT19QUk9DRUVEJyk7XG4gICAgY29uc3QgYnV0dG9ucyA9IFtcbiAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5DQU5DRUwnKSB9LFxuICAgICAgeyB0ZXh0OiB0aGlzLl90cmFuc2xhdGUuXygnQ09NTU9OLkNPTkZJUk0nKSwgaGFuZGxlcjogKCk6IHZvaWQgPT4gY2IoKSB9XG4gICAgXTtcbiAgICBjb25zdCBjc3NDbGFzcyA9ICdzZWxlY3RhYmxlQWxlcnRNZXNzYWdlJztcbiAgICB0aGlzLl9hbGVydC5jcmVhdGUoeyBoZWFkZXIsIG1lc3NhZ2UsIGJ1dHRvbnMsIGNzc0NsYXNzIH0pLnRoZW4oYWxlcnQgPT4gYWxlcnQucHJlc2VudCgpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhY3RzXCI+XG4gIEBpZiAoc2hvd05hbWUpIHtcbiAgICA8aW9uLWl0ZW0gW2xpbmVzXT1cImxpbmVzXCIgW2NvbG9yXT1cImNvbG9yXCI+XG4gICAgICA8aW9uLWlucHV0XG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm5ld1wiXG4gICAgICAgIGxhYmVsUGxhY2VtZW50PVwic3RhY2tlZFwiXG4gICAgICAgIFtsYWJlbF09XCInSURFQV9VTkNPTU1PTi5DT05UQUNUUy5OQU1FJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuTkFNRV9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DT05UQUNUUy5OQU1FX0hJTlQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJjb250YWN0cy5uYW1lXCJcbiAgICAgIC8+XG4gICAgPC9pb24taXRlbT5cbiAgfVxuICA8aW9uLWl0ZW0gW2xpbmVzXT1cImxpbmVzXCIgW2NvbG9yXT1cImNvbG9yXCI+XG4gICAgPGlvbi1pbnB1dFxuICAgICAgYXV0b2NvbXBsZXRlPVwibmV3XCJcbiAgICAgIGxhYmVsUGxhY2VtZW50PVwic3RhY2tlZFwiXG4gICAgICBbbGFiZWxdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuUEhPTkUnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIidJREVBX1VOQ09NTU9OLkNPTlRBQ1RTLlBIT05FX0hJTlQnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DT05UQUNUUy5QSE9ORV9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbKG5nTW9kZWwpXT1cImNvbnRhY3RzLnBob25lXCJcbiAgICAvPlxuICAgIEBpZiAoIWVkaXRNb2RlKSB7XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgY2xhc3M9XCJtYXJnaW5Ub3BcIlxuICAgICAgICBbdGl0bGVdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuQ0FMTCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAoY2xpY2spPVwiY2FsbCgpXCJcbiAgICAgID5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjYWxsXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgfVxuICA8L2lvbi1pdGVtPlxuICA8aW9uLWl0ZW0gW2xpbmVzXT1cImxpbmVzXCIgW2NvbG9yXT1cImNvbG9yXCI+XG4gICAgPGlvbi1pbnB1dFxuICAgICAgYXV0b2NvbXBsZXRlPVwibmV3XCJcbiAgICAgIGxhYmVsUGxhY2VtZW50PVwic3RhY2tlZFwiXG4gICAgICBbbGFiZWxdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuRU1BSUwnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIidJREVBX1VOQ09NTU9OLkNPTlRBQ1RTLkVNQUlMX0hJTlQnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DT05UQUNUUy5FTUFJTF9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbKG5nTW9kZWwpXT1cImNvbnRhY3RzLmVtYWlsXCJcbiAgICAvPlxuICAgIEBpZiAoIWVkaXRNb2RlKSB7XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgY2xhc3M9XCJtYXJnaW5Ub3BcIlxuICAgICAgICBbdGl0bGVdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuU0VORF9FTUFJTCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAoY2xpY2spPVwic2VuZEVtYWlsKClcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cIm1haWxcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG4gIDwvaW9uLWl0ZW0+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { IonicModule } from '@ionic/angular';
|
|
5
|
+
import { IDEASelectModule, IDEATranslationsModule } from '@idea-ionic/common';
|
|
6
|
+
import { IDEAContactsComponent } from './contacts.component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class IDEAContactsModule {
|
|
9
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
10
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsModule, declarations: [IDEAContactsComponent], imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule, IDEASelectModule], exports: [IDEAContactsComponent] }); }
|
|
11
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsModule, imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule, IDEASelectModule] }); }
|
|
12
|
+
}
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsModule, decorators: [{
|
|
14
|
+
type: NgModule,
|
|
15
|
+
args: [{
|
|
16
|
+
imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule, IDEASelectModule],
|
|
17
|
+
declarations: [IDEAContactsComponent],
|
|
18
|
+
exports: [IDEAContactsComponent]
|
|
19
|
+
}]
|
|
20
|
+
}] });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdHMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29udGFjdHMvY29udGFjdHMubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBTzdELE1BQU0sT0FBTyxrQkFBa0I7OEdBQWxCLGtCQUFrQjsrR0FBbEIsa0JBQWtCLGlCQUhkLHFCQUFxQixhQUQxQixZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsYUFFaEYscUJBQXFCOytHQUVwQixrQkFBa0IsWUFKbkIsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCOzsyRkFJL0Usa0JBQWtCO2tCQUw5QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDO29CQUMzRixZQUFZLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDckMsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7aUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgSURFQVNlbGVjdE1vZHVsZSwgSURFQVRyYW5zbGF0aW9uc01vZHVsZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbmltcG9ydCB7IElERUFDb250YWN0c0NvbXBvbmVudCB9IGZyb20gJy4vY29udGFjdHMuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElvbmljTW9kdWxlLCBJREVBVHJhbnNsYXRpb25zTW9kdWxlLCBJREVBU2VsZWN0TW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbSURFQUNvbnRhY3RzQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0lERUFDb250YWN0c0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgSURFQUNvbnRhY3RzTW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { Component, Input, inject } from '@angular/core';
|
|
2
|
+
import { AlertController, ModalController } from '@ionic/angular';
|
|
3
|
+
import { IDEATranslationsService } from '@idea-ionic/common';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@ionic/angular";
|
|
6
|
+
import * as i2 from "@angular/common";
|
|
7
|
+
import * as i3 from "@idea-ionic/common";
|
|
8
|
+
/**
|
|
9
|
+
* A random sunday, used as reference to calculate the week days.
|
|
10
|
+
*/
|
|
11
|
+
const SUNDAY = 259200000;
|
|
12
|
+
export class IDEACalendarPickerComponent {
|
|
13
|
+
constructor() {
|
|
14
|
+
this._modal = inject(ModalController);
|
|
15
|
+
this._alert = inject(AlertController);
|
|
16
|
+
this._translate = inject(IDEATranslationsService);
|
|
17
|
+
this.timePicker = false;
|
|
18
|
+
this.manualTimePicker = false;
|
|
19
|
+
this.hideClearButton = false;
|
|
20
|
+
}
|
|
21
|
+
ngOnInit() {
|
|
22
|
+
this.today = new Date();
|
|
23
|
+
this.refDate = this.inputDate ? new Date(this.inputDate) : new Date(this.today);
|
|
24
|
+
this.selectedDate = new Date(this.refDate);
|
|
25
|
+
this.hour = 12; // to endure timezones
|
|
26
|
+
this.minute = 0;
|
|
27
|
+
if (this.timePicker || this.manualTimePicker) {
|
|
28
|
+
this.hour = this.selectedDate.getHours();
|
|
29
|
+
if (this.manualTimePicker)
|
|
30
|
+
this.minute = this.selectedDate.getMinutes();
|
|
31
|
+
else {
|
|
32
|
+
// round the minutes a multiple of 5
|
|
33
|
+
this.minute = Math.ceil(this.selectedDate.getMinutes() / 5) * 5;
|
|
34
|
+
this.selectedDate.setMinutes(this.minute);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
this.buildCalendarGrid(this.refDate);
|
|
38
|
+
this.hours = Array.from(Array(24).keys()).map(i => '0'.concat(i.toString()).slice(-2));
|
|
39
|
+
this.minutes = Array.from(Array(12).keys()).map(i => '0'.concat((i * 5).toString()).slice(-2));
|
|
40
|
+
// build the weekdays based on the current locale
|
|
41
|
+
this.weekDays = new Array();
|
|
42
|
+
const refDateForWeekDays = new Date(SUNDAY);
|
|
43
|
+
refDateForWeekDays.setDate(refDateForWeekDays.getDate() - this.getLocalisedDay(refDateForWeekDays));
|
|
44
|
+
for (let i = 0; i < 7; i++) {
|
|
45
|
+
this.weekDays.push(refDateForWeekDays.toLocaleDateString(this._translate.getCurrentLang(), { weekday: 'short' }));
|
|
46
|
+
refDateForWeekDays.setDate(refDateForWeekDays.getDate() + 1);
|
|
47
|
+
}
|
|
48
|
+
if (this.min)
|
|
49
|
+
this.dateMin = new Date(this.min);
|
|
50
|
+
if (this.max)
|
|
51
|
+
this.dateMax = new Date(this.max);
|
|
52
|
+
}
|
|
53
|
+
getLocalisedDay(date) {
|
|
54
|
+
let n = date.getDay();
|
|
55
|
+
switch (this._translate.getCurrentLang()) {
|
|
56
|
+
case 'it':
|
|
57
|
+
n = --n < 0 ? 6 : n;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
return n;
|
|
61
|
+
}
|
|
62
|
+
buildCalendarGrid(refDate) {
|
|
63
|
+
// find the first day in the month: the important data here is the day of the week
|
|
64
|
+
const firstDateOfMonth = new Date(refDate.getFullYear(), refDate.getMonth(), 1);
|
|
65
|
+
// the following flag is used to divide the logic so I can fill the calendar
|
|
66
|
+
// also with the dates from the previous month, until there's space in the grid
|
|
67
|
+
let haventFoundFirstDay = true;
|
|
68
|
+
// index used to build the dates of the month, starting from the first one
|
|
69
|
+
let index = 1;
|
|
70
|
+
this.calendarGrid = new Array();
|
|
71
|
+
for (let i = 0; i < 6; i++) {
|
|
72
|
+
this.calendarGrid[i] = new Array();
|
|
73
|
+
for (let j = 0; j < 7; j++) {
|
|
74
|
+
if (haventFoundFirstDay) {
|
|
75
|
+
if (this.getLocalisedDay(firstDateOfMonth) === j) {
|
|
76
|
+
// note: considers Sunday
|
|
77
|
+
haventFoundFirstDay = false;
|
|
78
|
+
this.calendarGrid[i][j] = new Date(firstDateOfMonth);
|
|
79
|
+
// now the I've found the first date of the month I can fill the calendar
|
|
80
|
+
// the dates fromt the previous month, until there's space in the grid
|
|
81
|
+
for (let y = this.getLocalisedDay(firstDateOfMonth); y >= 0; y--) {
|
|
82
|
+
const d = new Date(firstDateOfMonth);
|
|
83
|
+
d.setDate(firstDateOfMonth.getDate() - y);
|
|
84
|
+
this.calendarGrid[i][this.getLocalisedDay(firstDateOfMonth) - y] = d;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// fill the following dates until there's space in the grid
|
|
90
|
+
const d = new Date(firstDateOfMonth);
|
|
91
|
+
d.setDate(firstDateOfMonth.getDate() + index++);
|
|
92
|
+
this.calendarGrid[i][j] = d;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
addYears(offset) {
|
|
98
|
+
this.refDate.setFullYear(this.refDate.getFullYear() + offset);
|
|
99
|
+
this.buildCalendarGrid(this.refDate);
|
|
100
|
+
}
|
|
101
|
+
setYear(year) {
|
|
102
|
+
if (!year)
|
|
103
|
+
return;
|
|
104
|
+
this.refDate.setFullYear(Number(year));
|
|
105
|
+
this.buildCalendarGrid(this.refDate);
|
|
106
|
+
}
|
|
107
|
+
addMonths(offset) {
|
|
108
|
+
this.refDate.setMonth(this.refDate.getMonth() + offset);
|
|
109
|
+
this.buildCalendarGrid(this.refDate);
|
|
110
|
+
}
|
|
111
|
+
async showMonths() {
|
|
112
|
+
const buttons = [];
|
|
113
|
+
const inputs = [];
|
|
114
|
+
const month = new Date(0);
|
|
115
|
+
for (let i = 1; i <= 12; i++) {
|
|
116
|
+
inputs.push({
|
|
117
|
+
type: 'radio',
|
|
118
|
+
label: month.toLocaleDateString(this._translate.getCurrentLang(), { month: 'long' }),
|
|
119
|
+
value: i.toString(),
|
|
120
|
+
checked: i === this.refDate.getMonth() + 1
|
|
121
|
+
});
|
|
122
|
+
month.setMonth(month.getMonth() + 1);
|
|
123
|
+
}
|
|
124
|
+
buttons.push({ text: this._translate._('COMMON.CANCEL'), role: 'cancel' });
|
|
125
|
+
buttons.push({
|
|
126
|
+
text: this._translate._('COMMON.SELECT'),
|
|
127
|
+
handler: (m) => {
|
|
128
|
+
this.refDate.setMonth(parseInt(m, 10) - 1);
|
|
129
|
+
this.buildCalendarGrid(this.refDate);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
const alert = await this._alert.create({
|
|
133
|
+
header: this._translate._('IDEA_UNCOMMON.CALENDAR.MONTH'),
|
|
134
|
+
buttons,
|
|
135
|
+
inputs
|
|
136
|
+
});
|
|
137
|
+
alert.present();
|
|
138
|
+
}
|
|
139
|
+
isDateSelectable(date) {
|
|
140
|
+
if (this.dateMin && date < this.dateMin)
|
|
141
|
+
return false;
|
|
142
|
+
if (this.dateMax && date > this.dateMax)
|
|
143
|
+
return false;
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
selectDate(date) {
|
|
147
|
+
this.selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), this.hour, this.minute);
|
|
148
|
+
}
|
|
149
|
+
selectHour(hour) {
|
|
150
|
+
this.hour = Number(hour);
|
|
151
|
+
this.selectedDate.setHours(this.hour);
|
|
152
|
+
}
|
|
153
|
+
selectMinute(minute) {
|
|
154
|
+
this.minute = Number(minute);
|
|
155
|
+
this.selectedDate.setMinutes(this.minute);
|
|
156
|
+
}
|
|
157
|
+
isSameDay(a, b) {
|
|
158
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
159
|
+
}
|
|
160
|
+
isSameMonth(a, b) {
|
|
161
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
|
|
162
|
+
}
|
|
163
|
+
isSameHour(hour) {
|
|
164
|
+
return this.selectedDate.getHours() === Number(hour);
|
|
165
|
+
}
|
|
166
|
+
isSameMinute(minute) {
|
|
167
|
+
return this.selectedDate.getMinutes() === Number(minute);
|
|
168
|
+
}
|
|
169
|
+
save(reset) {
|
|
170
|
+
this._modal.dismiss(reset ? '' : this.selectedDate);
|
|
171
|
+
}
|
|
172
|
+
close() {
|
|
173
|
+
this._modal.dismiss();
|
|
174
|
+
}
|
|
175
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
176
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEACalendarPickerComponent, selector: "idea-calendar-picker", inputs: { inputDate: "inputDate", timePicker: "timePicker", manualTimePicker: "manualTimePicker", title: "title", hideClearButton: "hideClearButton", min: "min", max: "max" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate.getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid; track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid[i][j], today) || isSameDay(calendarGrid[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid[i][j], refDate)\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid[i][j])\"\n (click)=\"selectDate(calendarGrid[i][j])\"\n >\n {{ calendarGrid[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-content{--background: var(--ion-color-white)}h1{margin:10px}.headerLabel{font-size:.7em;font-weight:700;text-transform:uppercase}ion-col,ion-button{font-size:.95em}ion-button{margin:3px 0}ion-footer ion-toolbar{--min-height: 40px}.tappable{cursor:pointer}.manualTimePicker{padding:20px}.manualTimePicker input[type=number],.manualTimePicker span{font-size:2.5em}.manualTimePicker input[type=number]{border:none;border-bottom:2px solid var(--ion-color-dark);text-align:center}.manualTimePicker span{padding-left:4px;padding-right:4px}\n"], dependencies: [{ kind: "component", type: i1.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: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.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: i1.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }, { kind: "pipe", type: i3.IDEALocalizedDatePipe, name: "dateLocale" }] }); }
|
|
177
|
+
}
|
|
178
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarPickerComponent, decorators: [{
|
|
179
|
+
type: Component,
|
|
180
|
+
args: [{ selector: 'idea-calendar-picker', template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate.getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid; track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid[i][j], today) || isSameDay(calendarGrid[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid[i][j], refDate)\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid[i][j])\"\n (click)=\"selectDate(calendarGrid[i][j])\"\n >\n {{ calendarGrid[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-content{--background: var(--ion-color-white)}h1{margin:10px}.headerLabel{font-size:.7em;font-weight:700;text-transform:uppercase}ion-col,ion-button{font-size:.95em}ion-button{margin:3px 0}ion-footer ion-toolbar{--min-height: 40px}.tappable{cursor:pointer}.manualTimePicker{padding:20px}.manualTimePicker input[type=number],.manualTimePicker span{font-size:2.5em}.manualTimePicker input[type=number]{border:none;border-bottom:2px solid var(--ion-color-dark);text-align:center}.manualTimePicker span{padding-left:4px;padding-right:4px}\n"] }]
|
|
181
|
+
}], propDecorators: { inputDate: [{
|
|
182
|
+
type: Input
|
|
183
|
+
}], timePicker: [{
|
|
184
|
+
type: Input
|
|
185
|
+
}], manualTimePicker: [{
|
|
186
|
+
type: Input
|
|
187
|
+
}], title: [{
|
|
188
|
+
type: Input
|
|
189
|
+
}], hideClearButton: [{
|
|
190
|
+
type: Input
|
|
191
|
+
}], min: [{
|
|
192
|
+
type: Input
|
|
193
|
+
}], max: [{
|
|
194
|
+
type: Input
|
|
195
|
+
}] } });
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBRTdEOztHQUVHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBT3pCLE1BQU0sT0FBTywyQkFBMkI7SUFMeEM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBRzVDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO0tBOEtsQztJQTlKQyxRQUFRO1FBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7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SUFFRCxJQUFJLENBQUMsS0FBZTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDOzhHQXRMVSwyQkFBMkI7a0dBQTNCLDJCQUEyQiw0T0NmeEMsNGpOQW9LQTs7MkZEckphLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSxzQkFBc0I7OEJBU3ZCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIE1vZGFsQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IGVwb2NoRGF0ZVRpbWUsIGVwb2NoSVNPU3RyaW5nIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7IElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuLyoqXG4gKiBBIHJhbmRvbSBzdW5kYXksIHVzZWQgYXMgcmVmZXJlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgd2VlayBkYXlzLlxuICovXG5jb25zdCBTVU5EQVkgPSAyNTkyMDAwMDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lkZWEtY2FsZW5kYXItcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhclBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjYWxlbmRhclBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIElERUFDYWxlbmRhclBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX21vZGFsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2FsZXJ0ID0gaW5qZWN0KEFsZXJ0Q29udHJvbGxlcik7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG5cbiAgQElucHV0KCkgaW5wdXREYXRlOiBlcG9jaERhdGVUaW1lIHwgZXBvY2hJU09TdHJpbmc7XG4gIEBJbnB1dCgpIHRpbWVQaWNrZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgbWFudWFsVGltZVBpY2tlciA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBoaWRlQ2xlYXJCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KCkgbWluOiBlcG9jaERhdGVUaW1lIHwgZXBvY2hJU09TdHJpbmc7XG4gIEBJbnB1dCgpIG1heDogZXBvY2hEYXRlVGltZSB8IGVwb2NoSVNPU3RyaW5nO1xuXG4gIHJlZkRhdGU6IERhdGU7XG4gIHNlbGVjdGVkRGF0ZTogRGF0ZTtcbiAgdG9kYXk6IERhdGU7XG4gIGNhbGVuZGFyR3JpZDogRGF0ZVtdW107XG4gIGhvdXI6IG51bWJlcjtcbiAgbWludXRlOiBudW1iZXI7XG4gIGhvdXJzOiBzdHJpbmdbXTtcbiAgbWludXRlczogc3RyaW5nW107XG4gIHdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgZGF0ZU1pbjogRGF0ZTtcbiAgZGF0ZU1heDogRGF0ZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLnJlZkRhdGUgPSB0aGlzLmlucHV0RGF0ZSA/IG5ldyBEYXRlKHRoaXMuaW5wdXREYXRlKSA6IG5ldyBEYXRlKHRoaXMudG9kYXkpO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodGhpcy5yZWZEYXRlKTtcbiAgICB0aGlzLmhvdXIgPSAxMjsgLy8gdG8gZW5kdXJlIHRpbWV6b25lc1xuICAgIHRoaXMubWludXRlID0gMDtcbiAgICBpZiAodGhpcy50aW1lUGlja2VyIHx8IHRoaXMubWFudWFsVGltZVBpY2tlcikge1xuICAgICAgdGhpcy5ob3VyID0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0SG91cnMoKTtcbiAgICAgIGlmICh0aGlzLm1hbnVhbFRpbWVQaWNrZXIpIHRoaXMubWludXRlID0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TWludXRlcygpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIHJvdW5kIHRoZSBtaW51dGVzIGEgbXVsdGlwbGUgb2YgNVxuICAgICAgICB0aGlzLm1pbnV0ZSA9IE1hdGguY2VpbCh0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNaW51dGVzKCkgLyA1KSAqIDU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldE1pbnV0ZXModGhpcy5taW51dGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJ1aWxkQ2FsZW5kYXJHcmlkKHRoaXMucmVmRGF0ZSk7XG4gICAgdGhpcy5ob3VycyA9IEFycmF5LmZyb20oQXJyYXkoMjQpLmtleXMoKSkubWFwKGkgPT4gJzAnLmNvbmNhdChpLnRvU3RyaW5nKCkpLnNsaWNlKC0yKSk7XG4gICAgdGhpcy5taW51dGVzID0gQXJyYXkuZnJvbShBcnJheSgxMikua2V5cygpKS5tYXAoaSA9PiAnMCcuY29uY2F0KChpICogNSkudG9TdHJpbmcoKSkuc2xpY2UoLTIpKTtcbiAgICAvLyBidWlsZCB0aGUgd2Vla2RheXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlXG4gICAgdGhpcy53ZWVrRGF5cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgY29uc3QgcmVmRGF0ZUZvcldlZWtEYXlzID0gbmV3IERhdGUoU1VOREFZKTtcbiAgICByZWZEYXRlRm9yV2Vla0RheXMuc2V0RGF0ZShyZWZEYXRlRm9yV2Vla0RheXMuZ2V0RGF0ZSgpIC0gdGhpcy5nZXRMb2NhbGlzZWREYXkocmVmRGF0ZUZvcldlZWtEYXlzKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgIHRoaXMud2Vla0RheXMucHVzaChyZWZEYXRlRm9yV2Vla0RheXMudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuX3RyYW5zbGF0ZS5nZXRDdXJyZW50TGFuZygpLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSkpO1xuICAgICAgcmVmRGF0ZUZvcldlZWtEYXlzLnNldERhdGUocmVmRGF0ZUZvcldlZWtEYXlzLmdldERhdGUoKSArIDEpO1xuICAgIH1cbiAgICBpZiAodGhpcy5taW4pIHRoaXMuZGF0ZU1pbiA9IG5ldyBEYXRlKHRoaXMubWluKTtcbiAgICBpZiAodGhpcy5tYXgpIHRoaXMuZGF0ZU1heCA9IG5ldyBEYXRlKHRoaXMubWF4KTtcbiAgfVxuXG4gIGdldExvY2FsaXNlZERheShkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICBsZXQgbiA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgc3dpdGNoICh0aGlzLl90cmFuc2xhdGUuZ2V0Q3VycmVudExhbmcoKSkge1xuICAgICAgY2FzZSAnaXQnOlxuICAgICAgICBuID0gLS1uIDwgMCA/IDYgOiBuO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cblxuICBidWlsZENhbGVuZGFyR3JpZChyZWZEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgLy8gZmluZCB0aGUgZmlyc3QgZGF5IGluIHRoZSBtb250aDogdGhlIGltcG9ydGFudCBkYXRhIGhlcmUgaXMgdGhlIGRheSBvZiB0aGUgd2Vla1xuICAgIGNvbnN0IGZpcnN0RGF0ZU9mTW9udGggPSBuZXcgRGF0ZShyZWZEYXRlLmdldEZ1bGxZZWFyKCksIHJlZkRhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgLy8gdGhlIGZvbGxvd2luZyBmbGFnIGlzIHVzZWQgdG8gZGl2aWRlIHRoZSBsb2dpYyBzbyBJIGNhbiBmaWxsIHRoZSBjYWxlbmRhclxuICAgIC8vIGFsc28gd2l0aCB0aGUgZGF0ZXMgZnJvbSB0aGUgcHJldmlvdXMgbW9udGgsIHVudGlsIHRoZXJlJ3Mgc3BhY2UgaW4gdGhlIGdyaWRcbiAgICBsZXQgaGF2ZW50Rm91bmRGaXJzdERheSA9IHRydWU7XG4gICAgLy8gaW5kZXggdXNlZCB0byBidWlsZCB0aGUgZGF0ZXMgb2YgdGhlIG1vbnRoLCBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBvbmVcbiAgICBsZXQgaW5kZXggPSAxO1xuICAgIHRoaXMuY2FsZW5kYXJHcmlkID0gbmV3IEFycmF5PERhdGVbXT4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgdGhpcy5jYWxlbmRhckdyaWRbaV0gPSBuZXcgQXJyYXk8RGF0ZT4oKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgIGlmIChoYXZlbnRGb3VuZEZpcnN0RGF5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuZ2V0TG9jYWxpc2VkRGF5KGZpcnN0RGF0ZU9mTW9udGgpID09PSBqKSB7XG4gICAgICAgICAgICAvLyBub3RlOiBjb25zaWRlcnMgU3VuZGF5XG4gICAgICAgICAgICBoYXZlbnRGb3VuZEZpcnN0RGF5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyR3JpZFtpXVtqXSA9IG5ldyBEYXRlKGZpcnN0RGF0ZU9mTW9udGgpO1xuICAgICAgICAgICAgLy8gbm93IHRoZSBJJ3ZlIGZvdW5kIHRoZSBmaXJzdCBkYXRlIG9mIHRoZSBtb250aCBJIGNhbiBmaWxsIHRoZSBjYWxlbmRhclxuICAgICAgICAgICAgLy8gdGhlIGRhdGVzIGZyb210IHRoZSBwcmV2aW91cyBtb250aCwgdW50aWwgdGhlcmUncyBzcGFjZSBpbiB0aGUgZ3JpZFxuICAgICAgICAgICAgZm9yIChsZXQgeSA9IHRoaXMuZ2V0TG9jYWxpc2VkRGF5KGZpcnN0RGF0ZU9mTW9udGgpOyB5ID49IDA7IHktLSkge1xuICAgICAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoZmlyc3REYXRlT2ZNb250aCk7XG4gICAgICAgICAgICAgIGQuc2V0RGF0ZShmaXJzdERhdGVPZk1vbnRoLmdldERhdGUoKSAtIHkpO1xuICAgICAgICAgICAgICB0aGlzLmNhbGVuZGFyR3JpZFtpXVt0aGlzLmdldExvY2FsaXNlZERheShmaXJzdERhdGVPZk1vbnRoKSAtIHldID0gZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZmlsbCB0aGUgZm9sbG93aW5nIGRhdGVzIHVudGlsIHRoZXJlJ3Mgc3BhY2UgaW4gdGhlIGdyaWRcbiAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoZmlyc3REYXRlT2ZNb250aCk7XG4gICAgICAgICAgZC5zZXREYXRlKGZpcnN0RGF0ZU9mTW9udGguZ2V0RGF0ZSgpICsgaW5kZXgrKyk7XG4gICAgICAgICAgdGhpcy5jYWxlbmRhckdyaWRbaV1bal0gPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkWWVhcnMob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZkRhdGUuc2V0RnVsbFllYXIodGhpcy5yZWZEYXRlLmdldEZ1bGxZZWFyKCkgKyBvZmZzZXQpO1xuICAgIHRoaXMuYnVpbGRDYWxlbmRhckdyaWQodGhpcy5yZWZEYXRlKTtcbiAgfVxuICBzZXRZZWFyKHllYXI6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIGlmICgheWVhcikgcmV0dXJuO1xuXG4gICAgdGhpcy5yZWZEYXRlLnNldEZ1bGxZZWFyKE51bWJlcih5ZWFyKSk7XG4gICAgdGhpcy5idWlsZENhbGVuZGFyR3JpZCh0aGlzLnJlZkRhdGUpO1xuICB9XG4gIGFkZE1vbnRocyhvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVmRGF0ZS5zZXRNb250aCh0aGlzLnJlZkRhdGUuZ2V0TW9udGgoKSArIG9mZnNldCk7XG4gICAgdGhpcy5idWlsZENhbGVuZGFyR3JpZCh0aGlzLnJlZkRhdGUpO1xuICB9XG4gIGFzeW5jIHNob3dNb250aHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYnV0dG9ucyA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBtb250aCA9IG5ldyBEYXRlKDApO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3JhZGlvJyxcbiAgICAgICAgbGFiZWw6IG1vbnRoLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLl90cmFuc2xhdGUuZ2V0Q3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnIH0pLFxuICAgICAgICB2YWx1ZTogaS50b1N0cmluZygpLFxuICAgICAgICBjaGVja2VkOiBpID09PSB0aGlzLnJlZkRhdGUuZ2V0TW9udGgoKSArIDFcbiAgICAgIH0pO1xuICAgICAgbW9udGguc2V0TW9udGgobW9udGguZ2V0TW9udGgoKSArIDEpO1xuICAgIH1cbiAgICBidXR0b25zLnB1c2goeyB0ZXh0OiB0aGlzLl90cmFuc2xhdGUuXygnQ09NTU9OLkNBTkNFTCcpLCByb2xlOiAnY2FuY2VsJyB9KTtcbiAgICBidXR0b25zLnB1c2goe1xuICAgICAgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5TRUxFQ1QnKSxcbiAgICAgIGhhbmRsZXI6IChtOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZWZEYXRlLnNldE1vbnRoKHBhcnNlSW50KG0sIDEwKSAtIDEpO1xuICAgICAgICB0aGlzLmJ1aWxkQ2FsZW5kYXJHcmlkKHRoaXMucmVmRGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGVydCA9IGF3YWl0IHRoaXMuX2FsZXJ0LmNyZWF0ZSh7XG4gICAgICBoZWFkZXI6IHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX1VOQ09NTU9OLkNBTEVOREFSLk1PTlRIJyksXG4gICAgICBidXR0b25zLFxuICAgICAgaW5wdXRzXG4gICAgfSk7XG4gICAgYWxlcnQucHJlc2VudCgpO1xuICB9XG5cbiAgaXNEYXRlU2VsZWN0YWJsZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGF0ZU1pbiAmJiBkYXRlIDwgdGhpcy5kYXRlTWluKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGF0ZU1heCAmJiBkYXRlID4gdGhpcy5kYXRlTWF4KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgdGhpcy5ob3VyLCB0aGlzLm1pbnV0ZSk7XG4gIH1cblxuICBzZWxlY3RIb3VyKGhvdXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaG91ciA9IE51bWJlcihob3VyKTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZS5zZXRIb3Vycyh0aGlzLmhvdXIpO1xuICB9XG4gIHNlbGVjdE1pbnV0ZShtaW51dGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWludXRlID0gTnVtYmVyKG1pbnV0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0TWludXRlcyh0aGlzLm1pbnV0ZSk7XG4gIH1cblxuICBpc1NhbWVEYXkoYTogRGF0ZSwgYjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJiBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKSAmJiBhLmdldERhdGUoKSA9PT0gYi5nZXREYXRlKCk7XG4gIH1cbiAgaXNTYW1lTW9udGgoYTogRGF0ZSwgYjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJiBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKTtcbiAgfVxuXG4gIGlzU2FtZUhvdXIoaG91cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlLmdldEhvdXJzKCkgPT09IE51bWJlcihob3VyKTtcbiAgfVxuICBpc1NhbWVNaW51dGUobWludXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TWludXRlcygpID09PSBOdW1iZXIobWludXRlKTtcbiAgfVxuXG4gIHNhdmUocmVzZXQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kYWwuZGlzbWlzcyhyZXNldCA/ICcnIDogdGhpcy5zZWxlY3RlZERhdGUpO1xuICB9XG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MoKTtcbiAgfVxufVxuIiwiPGlvbi1oZWFkZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cImlkZWFUb29sYmFyXCI+XG4gICAgPGlvbi10aXRsZT57eyB0aXRsZSB9fTwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICBAaWYgKCFoaWRlQ2xlYXJCdXR0b24pIHtcbiAgICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidJREVBX1VOQ09NTU9OLkNBTEVOREFSLlJFU0VUJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJzYXZlKHRydWUpXCI+XG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiYXJyb3ctdW5kb1wiIC8+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIDxpb24tYnV0dG9uIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DQUxFTkRBUi5DTE9TRV9XSVRIT1VUX1NBVklORycgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjbG9zZVwiIC8+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWhlYWRlcj5cbjxpb24tY29udGVudD5cbiAgPGlvbi1ncmlkIGZpeGVkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxoMSBjbGFzcz1cImhlYWRlckxhYmVsXCI+e3sgJ0lERUFfVU5DT01NT04uQ0FMRU5EQVIuU0VUX0RBVEUnIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3cgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHhcIj5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiNVwiPlxuICAgICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXIgaW9uLWp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LXJpZ2h0IGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiM1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImFkZFllYXJzKC0xKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjaGV2cm9uLWJhY2tcIiAvPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZyB0YXBwYWJsZVwiIFtzaXplXT1cIjZcIj5cbiAgICAgICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0lERUFfVU5DT01NT04uQ0FMRU5EQVIuWUVBUicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwicmVmRGF0ZS5nZXRGdWxsWWVhcigpXCJcbiAgICAgICAgICAgICAgKGlvbkZvY3VzKT1cIiRldmVudC50YXJnZXQudmFsdWUgPSAnJ1wiXG4gICAgICAgICAgICAgIChpb25DaGFuZ2UpPVwic2V0WWVhcigkZXZlbnQ/LnRhcmdldD8udmFsdWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvaW9uLWlucHV0PlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWxlZnQgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCIzXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiYWRkWWVhcnMoKzEpXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImNoZXZyb24tZm9yd2FyZFwiIC8+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjdcIj5cbiAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1yaWdodCBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjNcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJhZGRNb250aHMoLTEpXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImNoZXZyb24tYmFja1wiIC8+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nIHRhcHBhYmxlXCIgW3NpemVdPVwiNlwiIChjbGljayk9XCJzaG93TW9udGhzKClcIj5cbiAgICAgICAgICAgIHt7IHJlZkRhdGUgfCBkYXRlTG9jYWxlOiAnTU1NTScgfX1cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1sZWZ0IGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiM1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImFkZE1vbnRocygrMSlcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkXCIgLz5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3cgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHhcIiBjbGFzcz1cImhlYWRlckxhYmVsXCI+XG4gICAgICBAZm9yIChkZGQgb2Ygd2Vla0RheXM7IHRyYWNrIGRkZCkge1xuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgIHt7IGRkZCB9fVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICB9XG4gICAgPC9pb24tcm93PlxuICAgIEBmb3IgKHJvdyBvZiBjYWxlbmRhckdyaWQ7IHRyYWNrIHJvdzsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAZm9yIChjb2wgb2Ygcm93OyB0cmFjayBjb2w7IGxldCBqID0gJGluZGV4KSB7XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgICAgICBbY29sb3JdPVwiXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KGNhbGVuZGFyR3JpZFtpXVtqXSwgdG9kYXkpIHx8IGlzU2FtZURheShjYWxlbmRhckdyaWRbaV1bal0sIHNlbGVjdGVkRGF0ZSlcbiAgICAgICAgICAgICAgICAgID8gJ3ByaW1hcnknXG4gICAgICAgICAgICAgICAgICA6IGlzU2FtZU1vbnRoKGNhbGVuZGFyR3JpZFtpXVtqXSwgcmVmRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgPyAnZGFyaydcbiAgICAgICAgICAgICAgICAgICAgOiAnbWVkaXVtJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbZmlsbF09XCJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoY2FsZW5kYXJHcmlkW2ldW2pdLCBzZWxlY3RlZERhdGUpXG4gICAgICAgICAgICAgICAgICA/ICdzb2xpZCdcbiAgICAgICAgICAgICAgICAgIDogaXNTYW1lRGF5KGNhbGVuZGFyR3JpZFtpXVtqXSwgdG9kYXkpXG4gICAgICAgICAgICAgICAgICAgID8gJ291dGxpbmUnXG4gICAgICAgICAgICAgICAgICAgIDogJ2NsZWFyJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRGF0ZVNlbGVjdGFibGUoY2FsZW5kYXJHcmlkW2ldW2pdKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGNhbGVuZGFyR3JpZFtpXVtqXSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBjYWxlbmRhckdyaWRbaV1bal0gfCBkYXRlOiAnZCcgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIH1cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG4gICAgQGlmICh0aW1lUGlja2VyIHx8IG1hbnVhbFRpbWVQaWNrZXIpIHtcbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aDEgY2xhc3M9XCJoZWFkZXJMYWJlbFwiPlxuICAgICAgICAgIHt7ICdJREVBX1VOQ09NTU9OLkNBTEVOREFSLlNFVF9USU1FJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2gxPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgICBAaWYgKHRpbWVQaWNrZXIpIHtcbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiN1wiPlxuICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgQGZvciAoaG91ciBvZiBob3VyczsgdHJhY2sgaG91cikge1xuICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImlzU2FtZUhvdXIoaG91cikgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgICAgICAgICAgW2ZpbGxdPVwiaXNTYW1lSG91cihob3VyKSA/ICdzb2xpZCcgOiAnY2xlYXInXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RIb3VyKGhvdXIpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBob3VyIH19XG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiMVwiPiA6IDwvaW9uLWNvbD5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjRcIj5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIEBmb3IgKG1pbnV0ZSBvZiBtaW51dGVzOyB0cmFjayBtaW51dGUpIHtcbiAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCI0XCI+XG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpc1NhbWVNaW51dGUobWludXRlKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgICAgICAgICBbZmlsbF09XCJpc1NhbWVNaW51dGUobWludXRlKSA/ICdzb2xpZCcgOiAnY2xlYXInXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNaW51dGUobWludXRlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgbWludXRlIH19XG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfVxuICAgIEBpZiAobWFudWFsVGltZVBpY2tlcikge1xuICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyIG1hbnVhbFRpbWVQaWNrZXJcIj5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIiBbc2l6ZV09XCIxMlwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjIzXCIgW3ZhbHVlXT1cImhvdXJcIiAoY2hhbmdlKT1cInNlbGVjdEhvdXIoJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuICAgICAgICAgIDxzcGFuPjo8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgbWF4PVwiNTlcIiBbdmFsdWVdPVwibWludXRlXCIgKGNoYW5nZSk9XCJzZWxlY3RNaW51dGUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfVxuICA8L2lvbi1ncmlkPlxuPC9pb24tY29udGVudD5cbjxpb24tZm9vdGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiIGNsYXNzPVwidGFwcGFibGVcIiAoY2xpY2spPVwic2F2ZSgpXCI+XG4gICAgPGlvbi10aXRsZSBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGVja21hcmtcIiAvPlxuICAgIDwvaW9uLXRpdGxlPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24tZm9vdGVyPlxuIl19
|