@idea-ionic/agenda 8.5.12 → 8.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/idea-ionic-agenda.mjs +27 -27
- package/fesm2022/idea-ionic-agenda.mjs.map +1 -1
- package/index.d.ts +417 -3
- package/package.json +15 -17
- package/esm2022/idea-ionic-agenda.mjs +0 -5
- package/esm2022/public-api.mjs +0 -8
- package/esm2022/src/agenda.component.mjs +0 -323
- package/esm2022/src/agenda.module.mjs +0 -53
- package/esm2022/src/calendar.component.mjs +0 -110
- package/esm2022/src/calendarCreation.component.mjs +0 -121
- package/esm2022/src/calendarItem.component.mjs +0 -120
- package/esm2022/src/calendars.service.mjs +0 -212
- package/esm2022/src/dateFormatter.provider.mjs +0 -25
- package/public-api.d.ts +0 -7
- package/src/agenda.component.d.ts +0 -202
- package/src/agenda.module.d.ts +0 -16
- package/src/calendar.component.d.ts +0 -38
- package/src/calendarCreation.component.d.ts +0 -44
- package/src/calendarItem.component.d.ts +0 -40
- package/src/calendars.service.d.ts +0 -77
- package/src/dateFormatter.provider.d.ts +0 -13
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { Component, Input, inject } from '@angular/core';
|
|
2
|
-
import { ModalController, AlertController } from '@ionic/angular/standalone';
|
|
3
|
-
import { Calendar, Check } from 'idea-toolbox';
|
|
4
|
-
import { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';
|
|
5
|
-
import { IDEAAWSAPIService, IDEATinCanService } from '@idea-ionic/uncommon';
|
|
6
|
-
import { IDEACalendarsService } from './calendars.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/forms";
|
|
9
|
-
import * as i2 from "@ionic/angular";
|
|
10
|
-
import * as i3 from "@idea-ionic/uncommon";
|
|
11
|
-
import * as i4 from "@idea-ionic/common";
|
|
12
|
-
export class IDEACalendarComponent {
|
|
13
|
-
constructor() {
|
|
14
|
-
this._modal = inject(ModalController);
|
|
15
|
-
this._alert = inject(AlertController);
|
|
16
|
-
this._tc = inject(IDEATinCanService);
|
|
17
|
-
this._loading = inject(IDEALoadingService);
|
|
18
|
-
this._message = inject(IDEAMessageService);
|
|
19
|
-
this._API = inject(IDEAAWSAPIService);
|
|
20
|
-
this._translate = inject(IDEATranslationsService);
|
|
21
|
-
this._calendars = inject(IDEACalendarsService);
|
|
22
|
-
this.errors = new Set();
|
|
23
|
-
this.DEFAULT_COLOR = '#555';
|
|
24
|
-
}
|
|
25
|
-
async ngOnInit() {
|
|
26
|
-
this.membership = this._tc.get('membership');
|
|
27
|
-
this.calendarWC = new Calendar(this.calendar);
|
|
28
|
-
try {
|
|
29
|
-
const memberships = await this._API.getResource(`teams/${this.membership.teamId}/memberships`);
|
|
30
|
-
this.membershipsChecks = memberships.map(m => new Check({
|
|
31
|
-
value: m.userId,
|
|
32
|
-
name: m.name,
|
|
33
|
-
checked: (this.calendarWC.usersCanManageAppointments || []).some(x => x === m.userId)
|
|
34
|
-
}));
|
|
35
|
-
}
|
|
36
|
-
catch (error) {
|
|
37
|
-
this._message.error('COMMON.COULDNT_LOAD_LIST');
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
hasFieldAnError(field) {
|
|
41
|
-
return this.errors.has(field);
|
|
42
|
-
}
|
|
43
|
-
async save() {
|
|
44
|
-
if (!this.calendarWC.color)
|
|
45
|
-
this.calendarWC.color = this.DEFAULT_COLOR;
|
|
46
|
-
if (this.calendarWC.isShared() && this.advancedPermissions)
|
|
47
|
-
this.calendarWC.usersCanManageAppointments = this.membershipsChecks
|
|
48
|
-
.filter(x => x.checked)
|
|
49
|
-
.map(x => String(x.value));
|
|
50
|
-
else
|
|
51
|
-
delete this.calendarWC.usersCanManageAppointments;
|
|
52
|
-
this.errors = new Set(this.calendarWC.validate());
|
|
53
|
-
if (this.errors.size)
|
|
54
|
-
return this._message.error('COMMON.FORM_HAS_ERROR_TO_CHECK');
|
|
55
|
-
try {
|
|
56
|
-
await this._loading.show();
|
|
57
|
-
const res = await this._calendars.putCalendar(this.calendarWC);
|
|
58
|
-
this.calendar.load(res);
|
|
59
|
-
this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_SAVED');
|
|
60
|
-
this._modal.dismiss(this.calendar);
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
this._message.error('COMMON.OPERATION_FAILED');
|
|
64
|
-
}
|
|
65
|
-
finally {
|
|
66
|
-
this._loading.hide();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async delete() {
|
|
70
|
-
const doDelete = async () => {
|
|
71
|
-
try {
|
|
72
|
-
await this._loading.show();
|
|
73
|
-
await this._calendars.deleteCalendar(this.calendarWC);
|
|
74
|
-
this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_DELETED');
|
|
75
|
-
this._modal.dismiss(true);
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
this._message.error('COMMON.OPERATION_FAILED');
|
|
79
|
-
}
|
|
80
|
-
finally {
|
|
81
|
-
this._loading.hide();
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
const header = this._translate._('COMMON.ARE_YOU_SURE');
|
|
85
|
-
const subHeader = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR');
|
|
86
|
-
const message = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT');
|
|
87
|
-
const buttons = [
|
|
88
|
-
{ text: this._translate._('COMMON.CANCEL'), role: 'cancel' },
|
|
89
|
-
{ text: this._translate._('COMMON.DELETE'), handler: doDelete }
|
|
90
|
-
];
|
|
91
|
-
const alert = await this._alert.create({ header, subHeader, message, buttons });
|
|
92
|
-
alert.present();
|
|
93
|
-
}
|
|
94
|
-
close() {
|
|
95
|
-
this._modal.dismiss();
|
|
96
|
-
}
|
|
97
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
98
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarComponent, selector: "idea-calendar", inputs: { calendar: "calendar", advancedPermissions: "advancedPermissions", hideColor: "hideColor" }, 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-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.SAVE' | translate\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n @if (calendarWC) {\n <div class=\"maxWidthContainer\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.NAME' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n [(ngModel)]=\"calendarWC.name\"\n />\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n [(ngModel)]=\"calendarWC.description\"\n />\n </ion-item>\n @if (!hideColor) {\n <idea-color-picker\n [lines]=\"'inset'\"\n [current]=\"calendarWC.color\"\n [label]=\"'IDEA_AGENDA.CALENDARS.COLOR' | translate\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (calendarWC.color = $event) : null\"\n />\n }\n @if (membershipsChecks && calendarWC.isShared() && advancedPermissions) {\n <idea-checker\n [data]=\"membershipsChecks\"\n [label]=\"'IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS' | translate\"\n [searchPlaceholder]=\"'IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS' | translate\"\n [noneText]=\"'IDEA_AGENDA.CALENDARS.NOBODY' | translate\"\n [allText]=\"'IDEA_AGENDA.CALENDARS.EVERYONE' | translate\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n />\n }\n </ion-list>\n @if (calendarWC.external?.service) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n @if (calendar.userId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\" />\n </ion-item>\n }\n @if (calendar.teamId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\" />\n </ion-item>\n }\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + calendarWC.external.service | translate }}\n <p>{{ calendarWC.external.name }} ({{ calendarWC.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"_calendars.getServiceIcon(calendarWC.external.service)\" />\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + calendarWC.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\" />\n </ion-item>\n </ion-list>\n }\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button\n color=\"danger\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate\"\n (click)=\"delete()\"\n >\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n }\n</ion-content>\n", styles: [".maxWidthContainer{max-width:500px;padding-top:20px}\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.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { 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: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "component", type: i3.IDEAColorPickerComponent, selector: "idea-color-picker", inputs: ["colors", "current", "label", "placeholder", "icon", "iconColor", "disabled", "obligatory", "lines", "color"], outputs: ["select", "iconSelect"] }, { kind: "component", type: i4.IDEACheckerComponent, selector: "idea-checker", inputs: ["data", "dataProvider", "label", "icon", "iconColor", "searchPlaceholder", "noPreviewText", "noElementsFoundText", "noneEqualsAll", "noneText", "allText", "lines", "color", "disabled", "tappableWhenDisabled", "obligatory", "sortData", "numMaxElementsInPreview", "showAvatars", "limitSelectionToNum", "allowSelectDeselectAll", "category1", "category2", "showCategoriesFilters"], outputs: ["change", "iconSelect"] }, { kind: "pipe", type: i4.IDEATranslatePipe, name: "translate" }] }); }
|
|
99
|
-
}
|
|
100
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarComponent, decorators: [{
|
|
101
|
-
type: Component,
|
|
102
|
-
args: [{ selector: 'idea-calendar', 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-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.SAVE' | translate\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n @if (calendarWC) {\n <div class=\"maxWidthContainer\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.NAME' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n [(ngModel)]=\"calendarWC.name\"\n />\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n [(ngModel)]=\"calendarWC.description\"\n />\n </ion-item>\n @if (!hideColor) {\n <idea-color-picker\n [lines]=\"'inset'\"\n [current]=\"calendarWC.color\"\n [label]=\"'IDEA_AGENDA.CALENDARS.COLOR' | translate\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (calendarWC.color = $event) : null\"\n />\n }\n @if (membershipsChecks && calendarWC.isShared() && advancedPermissions) {\n <idea-checker\n [data]=\"membershipsChecks\"\n [label]=\"'IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS' | translate\"\n [searchPlaceholder]=\"'IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS' | translate\"\n [noneText]=\"'IDEA_AGENDA.CALENDARS.NOBODY' | translate\"\n [allText]=\"'IDEA_AGENDA.CALENDARS.EVERYONE' | translate\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n />\n }\n </ion-list>\n @if (calendarWC.external?.service) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n @if (calendar.userId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\" />\n </ion-item>\n }\n @if (calendar.teamId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\" />\n </ion-item>\n }\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + calendarWC.external.service | translate }}\n <p>{{ calendarWC.external.name }} ({{ calendarWC.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"_calendars.getServiceIcon(calendarWC.external.service)\" />\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + calendarWC.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\" />\n </ion-item>\n </ion-list>\n }\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button\n color=\"danger\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate\"\n (click)=\"delete()\"\n >\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n }\n</ion-content>\n", styles: [".maxWidthContainer{max-width:500px;padding-top:20px}\n"] }]
|
|
103
|
-
}], propDecorators: { calendar: [{
|
|
104
|
-
type: Input
|
|
105
|
-
}], advancedPermissions: [{
|
|
106
|
-
type: Input
|
|
107
|
-
}], hideColor: [{
|
|
108
|
-
type: Input
|
|
109
|
-
}] } });
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbW9kdWxlcy9hZ2VuZGEvc3JjL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL21vZHVsZXMvYWdlbmRhL3NyYy9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBYyxNQUFNLGNBQWMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBTzNELE1BQU0sT0FBTyxxQkFBcUI7SUFMbEM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxhQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsU0FBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRCxlQUFVLEdBQUcsTUFBTSxDQUFDLG9C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RSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtTQUNoRSxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEYsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDOzhHQXRHVSxxQkFBcUI7a0dBQXJCLHFCQUFxQiwySkNibEMsd3lLQWlJQTs7MkZEcEhhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxlQUFlOzhCQWlCaEIsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIEFsZXJ0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgQ2FsZW5kYXIsIENoZWNrLCBNZW1iZXJzaGlwIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7IElERUFMb2FkaW5nU2VydmljZSwgSURFQU1lc3NhZ2VTZXJ2aWNlLCBJREVBVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5pbXBvcnQgeyBJREVBQVdTQVBJU2VydmljZSwgSURFQVRpbkNhblNlcnZpY2UgfSBmcm9tICdAaWRlYS1pb25pYy91bmNvbW1vbic7XG5cbmltcG9ydCB7IElERUFDYWxlbmRhcnNTZXJ2aWNlIH0gZnJvbSAnLi9jYWxlbmRhcnMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lkZWEtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJ2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSURFQUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfYWxlcnQgPSBpbmplY3QoQWxlcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfdGMgPSBpbmplY3QoSURFQVRpbkNhblNlcnZpY2UpO1xuICBwcml2YXRlIF9sb2FkaW5nID0gaW5qZWN0KElERUFMb2FkaW5nU2VydmljZSk7XG4gIHByaXZhdGUgX21lc3NhZ2UgPSBpbmplY3QoSURFQU1lc3NhZ2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfQVBJID0gaW5qZWN0KElERUFBV1NBUElTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfdHJhbnNsYXRlID0gaW5qZWN0KElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlKTtcbiAgX2NhbGVuZGFycyA9IGluamVjdChJREVBQ2FsZW5kYXJzU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxlbmRhciB0byBtYW5hZ2UuXG4gICAqL1xuICBASW5wdXQoKSBjYWxlbmRhcjogQ2FsZW5kYXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gZW5hYmxlIGFkdmFuY2VkIHBlcm1pc3Npb25zIChiYXNlZCBvbiB0aGUgbWVtYmVyc2hpcHMpIG9uIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIGFkdmFuY2VkUGVybWlzc2lvbnM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBjb2xvciBpcyBhbiBpbXBvcnRhbnQgZGV0YWlsIG9yIGl0IHNob3VsZG4ndCBiZSBzaG93bi5cbiAgICovXG4gIEBJbnB1dCgpIGhpZGVDb2xvcjogYm9vbGVhbjtcblxuICBjYWxlbmRhcldDOiBDYWxlbmRhcjtcbiAgbWVtYmVyc2hpcHNDaGVja3M6IENoZWNrW107XG4gIG1lbWJlcnNoaXA6IE1lbWJlcnNoaXA7XG4gIGVycm9ycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBERUZBVUxUX0NPTE9SID0gJyM1NTUnO1xuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubWVtYmVyc2hpcCA9IHRoaXMuX3RjLmdldCgnbWVtYmVyc2hpcCcpO1xuICAgIHRoaXMuY2FsZW5kYXJXQyA9IG5ldyBDYWxlbmRhcih0aGlzLmNhbGVuZGFyKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWVtYmVyc2hpcHM6IE1lbWJlcnNoaXBbXSA9IGF3YWl0IHRoaXMuX0FQSS5nZXRSZXNvdXJjZShgdGVhbXMvJHt0aGlzLm1lbWJlcnNoaXAudGVhbUlkfS9tZW1iZXJzaGlwc2ApO1xuICAgICAgdGhpcy5tZW1iZXJzaGlwc0NoZWNrcyA9IG1lbWJlcnNoaXBzLm1hcChcbiAgICAgICAgbSA9PlxuICAgICAgICAgIG5ldyBDaGVjayh7XG4gICAgICAgICAgICB2YWx1ZTogbS51c2VySWQsXG4gICAgICAgICAgICBuYW1lOiBtLm5hbWUsXG4gICAgICAgICAgICBjaGVja2VkOiAodGhpcy5jYWxlbmRhcldDLnVzZXJzQ2FuTWFuYWdlQXBwb2ludG1lbnRzIHx8IFtdKS5zb21lKHggPT4geCA9PT0gbS51c2VySWQpXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5DT1VMRE5UX0xPQURfTElTVCcpO1xuICAgIH1cbiAgfVxuXG4gIGhhc0ZpZWxkQW5FcnJvcihmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmhhcyhmaWVsZCk7XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jYWxlbmRhcldDLmNvbG9yKSB0aGlzLmNhbGVuZGFyV0MuY29sb3IgPSB0aGlzLkRFRkFVTFRfQ09MT1I7XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJXQy5pc1NoYXJlZCgpICYmIHRoaXMuYWR2YW5jZWRQZXJtaXNzaW9ucylcbiAgICAgIHRoaXMuY2FsZW5kYXJXQy51c2Vyc0Nhbk1hbmFnZUFwcG9pbnRtZW50cyA9IHRoaXMubWVtYmVyc2hpcHNDaGVja3NcbiAgICAgICAgLmZpbHRlcih4ID0+IHguY2hlY2tlZClcbiAgICAgICAgLm1hcCh4ID0+IFN0cmluZyh4LnZhbHVlKSk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5jYWxlbmRhcldDLnVzZXJzQ2FuTWFuYWdlQXBwb2ludG1lbnRzO1xuXG4gICAgdGhpcy5lcnJvcnMgPSBuZXcgU2V0KHRoaXMuY2FsZW5kYXJXQy52YWxpZGF0ZSgpKTtcbiAgICBpZiAodGhpcy5lcnJvcnMuc2l6ZSkgcmV0dXJuIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5GT1JNX0hBU19FUlJPUl9UT19DSEVDSycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuc2hvdygpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fY2FsZW5kYXJzLnB1dENhbGVuZGFyKHRoaXMuY2FsZW5kYXJXQyk7XG4gICAgICB0aGlzLmNhbGVuZGFyLmxvYWQocmVzKTtcbiAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX1NBVkVEJyk7XG4gICAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKHRoaXMuY2FsZW5kYXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9tZXNzYWdlLmVycm9yKCdDT01NT04uT1BFUkFUSU9OX0ZBSUxFRCcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZG9EZWxldGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9sb2FkaW5nLnNob3coKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmRlbGV0ZUNhbGVuZGFyKHRoaXMuY2FsZW5kYXJXQyk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX0RFTEVURUQnKTtcbiAgICAgICAgdGhpcy5fbW9kYWwuZGlzbWlzcyh0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5BUkVfWU9VX1NVUkUnKTtcbiAgICBjb25zdCBzdWJIZWFkZXIgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFTEVURV9DQUxFTkRBUicpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFTEVURV9DQUxFTkRBUl9ISU5UJyk7XG4gICAgY29uc3QgYnV0dG9ucyA9IFtcbiAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5DQU5DRUwnKSwgcm9sZTogJ2NhbmNlbCcgfSxcbiAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5ERUxFVEUnKSwgaGFuZGxlcjogZG9EZWxldGUgfVxuICAgIF07XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoeyBoZWFkZXIsIHN1YkhlYWRlciwgbWVzc2FnZSwgYnV0dG9ucyB9KTtcbiAgICBhbGVydC5wcmVzZW50KCk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYnV0dG9uIFt0aXRsZV09XCInQ09NTU9OLkNMT1NFJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2xvc2UtY2lyY2xlXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgICA8aW9uLXRpdGxlPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRURJVF9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX08L2lvbi10aXRsZT5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidDT01NT04uU0FWRScgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwic2F2ZSgpXCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hlY2ttYXJrLWNpcmNsZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG48aW9uLWNvbnRlbnQ+XG4gIEBpZiAoY2FsZW5kYXJXQykge1xuICAgIDxkaXYgY2xhc3M9XCJtYXhXaWR0aENvbnRhaW5lclwiPlxuICAgICAgPGlvbi1saXN0IGNsYXNzPVwiYUxpc3RcIj5cbiAgICAgICAgPGlvbi1pdGVtXG4gICAgICAgICAgbGluZXM9XCJpbnNldFwiXG4gICAgICAgICAgW2NsYXNzLmZpZWxkSGFzRXJyb3JdPVwiaGFzRmllbGRBbkVycm9yKCduYW1lJylcIlxuICAgICAgICAgIFt0aXRsZV09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUVfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJzdGFja2VkXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUVfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjYWxlbmRhcldDLm5hbWVcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIDxpb24taXRlbVxuICAgICAgICAgIGxpbmVzPVwiaW5zZXRcIlxuICAgICAgICAgIFtjbGFzcy5maWVsZEhhc0Vycm9yXT1cImhhc0ZpZWxkQW5FcnJvcignZGVzY3JpcHRpb24nKVwiXG4gICAgICAgICAgW3RpdGxlXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVTQ1JJUFRJT05fSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJzdGFja2VkXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFU0NSSVBUSU9OJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERVNDUklQVElPTl9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNhbGVuZGFyV0MuZGVzY3JpcHRpb25cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIEBpZiAoIWhpZGVDb2xvcikge1xuICAgICAgICAgIDxpZGVhLWNvbG9yLXBpY2tlclxuICAgICAgICAgICAgW2xpbmVzXT1cIidpbnNldCdcIlxuICAgICAgICAgICAgW2N1cnJlbnRdPVwiY2FsZW5kYXJXQy5jb2xvclwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DT0xPUicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2NsYXNzLmZpZWxkSGFzRXJyb3JdPVwiaGFzRmllbGRBbkVycm9yKCdjb2xvcicpXCJcbiAgICAgICAgICAgIChzZWxlY3QpPVwiJGV2ZW50ID8gKGNhbGVuZGFyV0MuY29sb3IgPSAkZXZlbnQpIDogbnVsbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKG1lbWJlcnNoaXBzQ2hlY2tzICYmIGNhbGVuZGFyV0MuaXNTaGFyZWQoKSAmJiBhZHZhbmNlZFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgPGlkZWEtY2hlY2tlclxuICAgICAgICAgICAgW2RhdGFdPVwibWVtYmVyc2hpcHNDaGVja3NcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuVVNFUlNfQUxMT1dFRF9UT19NQU5BR0VfQVBQT0lOVE1FTlRTJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbc2VhcmNoUGxhY2Vob2xkZXJdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5XSE9fQ0FOX01BTkFHRV9BUFBPSU5UTUVOVFMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtub25lVGV4dF09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5PQk9EWScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2FsbFRleHRdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5FVkVSWU9ORScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2FsbG93U2VsZWN0RGVzZWxlY3RBbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbGluZXNdPVwiJ2luc2V0J1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgPC9pb24tbGlzdD5cbiAgICAgIEBpZiAoY2FsZW5kYXJXQy5leHRlcm5hbD8uc2VydmljZSkge1xuICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJhTGlzdFwiPlxuICAgICAgICAgIDxpb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8aDI+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5JTkZPX09OX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaDI+XG4gICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgICBAaWYgKGNhbGVuZGFyLnVzZXJJZCkge1xuICAgICAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwiaW5zZXRcIj5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBSSVZBVEVfQ0FMRU5EQVInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5QUklWQVRFX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwicGVyc29uXCIgLz5cbiAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY2FsZW5kYXIudGVhbUlkKSB7XG4gICAgICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJpbnNldFwiPlxuICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuVEVBTV9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8cD57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIG5hbWU9XCJwZW9wbGVcIiAvPlxuICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwiaW5zZXRcIj5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTElOS0VEX1RPJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlNFUlZJQ0VTLicgKyBjYWxlbmRhcldDLmV4dGVybmFsLnNlcnZpY2UgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPHA+e3sgY2FsZW5kYXJXQy5leHRlcm5hbC5uYW1lIH19ICh7eyBjYWxlbmRhcldDLmV4dGVybmFsLmVtYWlsIH19KTwvcD5cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBbbmFtZV09XCJfY2FsZW5kYXJzLmdldFNlcnZpY2VJY29uKGNhbGVuZGFyV0MuZXh0ZXJuYWwuc2VydmljZSlcIiAvPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwiaW5zZXRcIj5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuQUNDRVNTX0xFVkVMUy4nICsgY2FsZW5kYXJXQy5leHRlcm5hbC51c2VyQWNjZXNzIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuQkFTRURfT05fRVhURVJOQUxfU0VSVklDRV9TSEFSSU5HX1BFUk1JU1NJT04nIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIG5hbWU9XCJzaGllbGRcIiAvPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICB9XG4gICAgICA8aW9uLWxpc3QgY2xhc3M9XCJhTGlzdFwiPlxuICAgICAgICA8aW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIj5cbiAgICAgICAgICAgIDxoMj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRBTkdFUk9VU19aT05FJyB8IHRyYW5zbGF0ZSB9fTwvaDI+XG4gICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgIDwvaW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJpbnNldFwiPlxuICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFTEVURV9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERUxFVEVfQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnQ09NTU9OLkRFTEVURScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8L2lvbi1saXN0PlxuICAgIDwvZGl2PlxuICB9XG48L2lvbi1jb250ZW50PlxuIl19
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { Component, Input, inject } from '@angular/core';
|
|
2
|
-
import { ModalController } from '@ionic/angular/standalone';
|
|
3
|
-
import { Calendar, ExternalCalendarInfo, ExternalCalendarSources } from 'idea-toolbox';
|
|
4
|
-
import { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';
|
|
5
|
-
import { IDEATinCanService } from '@idea-ionic/uncommon';
|
|
6
|
-
import { IDEACalendarsService } from './calendars.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@ionic/angular";
|
|
9
|
-
import * as i2 from "@idea-ionic/common";
|
|
10
|
-
export class IDEACalendarCreationComponent {
|
|
11
|
-
constructor() {
|
|
12
|
-
this._modal = inject(ModalController);
|
|
13
|
-
this._loading = inject(IDEALoadingService);
|
|
14
|
-
this._message = inject(IDEAMessageService);
|
|
15
|
-
this._translate = inject(IDEATranslationsService);
|
|
16
|
-
this._tc = inject(IDEATinCanService);
|
|
17
|
-
this._calendars = inject(IDEACalendarsService);
|
|
18
|
-
this.DEFAULT_COLOR = '#555';
|
|
19
|
-
this.SOURCES = Object.keys(ExternalCalendarSources);
|
|
20
|
-
}
|
|
21
|
-
ngOnInit() {
|
|
22
|
-
this.calendar = new Calendar();
|
|
23
|
-
this.team = this._tc.get('team');
|
|
24
|
-
this.membership = this._tc.get('membership');
|
|
25
|
-
if (this.fixScope === CalendarScopes.SHARED)
|
|
26
|
-
this.calendar.teamId = this.team.teamId;
|
|
27
|
-
if (this.fixScope === CalendarScopes.PRIVATE)
|
|
28
|
-
this.calendar.userId = this.membership.userId;
|
|
29
|
-
}
|
|
30
|
-
resetScope() {
|
|
31
|
-
if (this.canChangeScope())
|
|
32
|
-
this.calendar.teamId = this.calendar.userId = null;
|
|
33
|
-
}
|
|
34
|
-
canChangeScope() {
|
|
35
|
-
return !this.fixScope && this.scopeIsSet();
|
|
36
|
-
}
|
|
37
|
-
scopeIsSet() {
|
|
38
|
-
return Boolean(this.calendar.userId) || Boolean(this.calendar.teamId);
|
|
39
|
-
}
|
|
40
|
-
async saveNewCalendar(service) {
|
|
41
|
-
if (!this.scopeIsSet())
|
|
42
|
-
return;
|
|
43
|
-
if (!service && this.onlyExternalCalendars)
|
|
44
|
-
return;
|
|
45
|
-
if (service) {
|
|
46
|
-
this.calendar.external = new ExternalCalendarInfo({ service });
|
|
47
|
-
this.calendar.name = '-'; // it will be substituted with the external name
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
this.calendar.name = this.calendar.userId
|
|
51
|
-
? this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_PERSONAL_CALENDAR_NAME')
|
|
52
|
-
: this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_TEAM_CALENDAR_NAME');
|
|
53
|
-
this.calendar.color = this.DEFAULT_COLOR;
|
|
54
|
-
}
|
|
55
|
-
try {
|
|
56
|
-
await this._loading.show();
|
|
57
|
-
const cal = await this._calendars.postCalendar(this.calendar);
|
|
58
|
-
this.calendar.load(cal);
|
|
59
|
-
this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_CREATED');
|
|
60
|
-
if (!cal.external) {
|
|
61
|
-
await this._modal.dismiss(this.calendar);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
await this._loading.hide();
|
|
66
|
-
await this._calendars.linkExtService(this.calendar, this.baseURL);
|
|
67
|
-
const res = await this._calendars.chooseAndSetExternalCalendar(this.calendar);
|
|
68
|
-
if (!res) {
|
|
69
|
-
await this._modal.dismiss(this.calendar);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
this.calendar.load(res);
|
|
73
|
-
try {
|
|
74
|
-
await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
|
|
75
|
-
await this._calendars.syncCalendar(this.calendar);
|
|
76
|
-
await this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
await this._message.error('COMMON.OPERATION_FAILED');
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
await this._modal.dismiss(this.calendar);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
await this._message.error('COMMON.OPERATION_FAILED');
|
|
87
|
-
await this._modal.dismiss(this.calendar);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
await this._message.error('COMMON.OPERATION_FAILED');
|
|
92
|
-
}
|
|
93
|
-
finally {
|
|
94
|
-
await this._loading.hide();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
close() {
|
|
98
|
-
this._modal.dismiss();
|
|
99
|
-
}
|
|
100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarCreationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
101
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarCreationComponent, selector: "idea-calendar-creation", inputs: { fixScope: "fixScope", onlyExternalCalendars: "onlyExternalCalendars", baseURL: "baseURL" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n @if (!canChangeScope()) {\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (canChangeScope()) {\n <ion-button (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-buttons>\n <ion-title>\n @if (!scopeIsSet()) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n }\n @if (calendar.userId) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n }\n @if (calendar.teamId) {\n <span>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: team.name } }}\n </span>\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n @if (!scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n }\n <!-- 2nd STEP -->\n @if (scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n @if (!onlyExternalCalendars) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n @for (s of SOURCES; track s) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"_calendars.getServiceIcon(s)\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n</ion-content>\n", styles: ["ion-content{--background: var(--ion-color-white-shade)}.choiceGrid ion-row ion-col>h1{margin:10px 0 0;font-size:1.1em}.choiceGrid ion-row ion-col>p{margin-top:0;margin-bottom:0;font-size:.9em}.choiceGrid ion-row:first-child ion-col{padding-bottom:25px}.choiceGrid ion-card{--ion-item-background: var(--ion-color-white);--color: var(--ion-color-dark-tint);height:240px;margin:0 auto;text-align:center}.choiceGrid ion-card ion-card-header{padding-bottom:10px}.choiceGrid ion-card ion-card-header ion-card-title{font-size:2.5em}.choiceGrid ion-card ion-card-content h1{font-size:1.4em;height:60px}.choiceGrid ion-card.step2{height:135px}.choiceGrid ion-card.step2 ion-card-header{padding-top:10px;padding-bottom:0}.choiceGrid ion-card.step2 ion-card-content h1{height:auto}\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.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i1.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i1.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { 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.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.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: "pipe", type: i2.IDEATranslatePipe, name: "translate" }] }); }
|
|
102
|
-
}
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarCreationComponent, decorators: [{
|
|
104
|
-
type: Component,
|
|
105
|
-
args: [{ selector: 'idea-calendar-creation', template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n @if (!canChangeScope()) {\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (canChangeScope()) {\n <ion-button (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-buttons>\n <ion-title>\n @if (!scopeIsSet()) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n }\n @if (calendar.userId) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n }\n @if (calendar.teamId) {\n <span>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: team.name } }}\n </span>\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n @if (!scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n }\n <!-- 2nd STEP -->\n @if (scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n @if (!onlyExternalCalendars) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n @for (s of SOURCES; track s) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"_calendars.getServiceIcon(s)\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n</ion-content>\n", styles: ["ion-content{--background: var(--ion-color-white-shade)}.choiceGrid ion-row ion-col>h1{margin:10px 0 0;font-size:1.1em}.choiceGrid ion-row ion-col>p{margin-top:0;margin-bottom:0;font-size:.9em}.choiceGrid ion-row:first-child ion-col{padding-bottom:25px}.choiceGrid ion-card{--ion-item-background: var(--ion-color-white);--color: var(--ion-color-dark-tint);height:240px;margin:0 auto;text-align:center}.choiceGrid ion-card ion-card-header{padding-bottom:10px}.choiceGrid ion-card ion-card-header ion-card-title{font-size:2.5em}.choiceGrid ion-card ion-card-content h1{font-size:1.4em;height:60px}.choiceGrid ion-card.step2{height:135px}.choiceGrid ion-card.step2 ion-card-header{padding-top:10px;padding-bottom:0}.choiceGrid ion-card.step2 ion-card-content h1{height:auto}\n"] }]
|
|
106
|
-
}], propDecorators: { fixScope: [{
|
|
107
|
-
type: Input
|
|
108
|
-
}], onlyExternalCalendars: [{
|
|
109
|
-
type: Input
|
|
110
|
-
}], baseURL: [{
|
|
111
|
-
type: Input
|
|
112
|
-
}] } });
|
|
113
|
-
/**
|
|
114
|
-
* The possible scopes of the calendar.
|
|
115
|
-
*/
|
|
116
|
-
export var CalendarScopes;
|
|
117
|
-
(function (CalendarScopes) {
|
|
118
|
-
CalendarScopes["SHARED"] = "shared";
|
|
119
|
-
CalendarScopes["PRIVATE"] = "private"; // userId
|
|
120
|
-
})(CalendarScopes || (CalendarScopes = {}));
|
|
121
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBTzNELE1BQU0sT0FBTyw2QkFBNkI7SUFMMUM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxhQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4QyxlQUFVLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFrQjFDLGtCQUFhLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLFlBQU8sR0FBRyxNQUFNLENBQUMs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QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7OEdBakdVLDZCQUE2QjtrR0FBN0IsNkJBQTZCLG9LQ2IxQyx1NUlBbUhBOzsyRkR0R2EsNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLHdCQUF3Qjs4QkFlekIsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLOztBQWlGUjs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCLENBQUE7SUFDakIscUNBQW1CLENBQUEsQ0FBQyxTQUFTO0FBQy9CLENBQUMsRUFIVyxjQUFjLEtBQWQsY0FBYyxRQUd6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IENhbGVuZGFyLCBFeHRlcm5hbENhbGVuZGFySW5mbywgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMsIE1lbWJlcnNoaXAsIFRlYW0gfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHsgSURFQUxvYWRpbmdTZXJ2aWNlLCBJREVBTWVzc2FnZVNlcnZpY2UsIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcbmltcG9ydCB7IElERUFUaW5DYW5TZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvdW5jb21tb24nO1xuXG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJzU2VydmljZSB9IGZyb20gJy4vY2FsZW5kYXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLWNyZWF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhckNyZWF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2NhbGVuZGFyQ3JlYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJDcmVhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX21vZGFsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2xvYWRpbmcgPSBpbmplY3QoSURFQUxvYWRpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChJREVBTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIF90YyA9IGluamVjdChJREVBVGluQ2FuU2VydmljZSk7XG4gIF9jYWxlbmRhcnMgPSBpbmplY3QoSURFQUNhbGVuZGFyc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIG9ubHkgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgY2FsZW5kYXIsIGJhc2VkIG9uIHRoZSBzY29wZS5cbiAgICovXG4gIEBJbnB1dCgpIGZpeFNjb3BlOiBDYWxlbmRhclNjb3BlcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgd2Ugd2FudCB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgbG9jYWwgY2FsZW5kYXJzLlxuICAgKi9cbiAgQElucHV0KCkgb25seUV4dGVybmFsQ2FsZW5kYXJzOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIFVSTCB0byBiZSB1c2VkIG9uIHRoZSByZWRpcmVjdCBjYWxscy5cbiAgICovXG4gIEBJbnB1dCgpIGJhc2VVUkw6IHN0cmluZztcblxuICB0ZWFtOiBUZWFtO1xuICBtZW1iZXJzaGlwOiBNZW1iZXJzaGlwO1xuICBjYWxlbmRhcjogQ2FsZW5kYXI7XG4gIERFRkFVTFRfQ09MT1IgPSAnIzU1NSc7XG4gIFNPVVJDRVMgPSBPYmplY3Qua2V5cyhFeHRlcm5hbENhbGVuZGFyU291cmNlcyk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxlbmRhciA9IG5ldyBDYWxlbmRhcigpO1xuICAgIHRoaXMudGVhbSA9IHRoaXMuX3RjLmdldCgndGVhbScpO1xuICAgIHRoaXMubWVtYmVyc2hpcCA9IHRoaXMuX3RjLmdldCgnbWVtYmVyc2hpcCcpO1xuICAgIGlmICh0aGlzLmZpeFNjb3BlID09PSBDYWxlbmRhclNjb3Blcy5TSEFSRUQpIHRoaXMuY2FsZW5kYXIudGVhbUlkID0gdGhpcy50ZWFtLnRlYW1JZDtcbiAgICBpZiAodGhpcy5maXhTY29wZSA9PT0gQ2FsZW5kYXJTY29wZXMuUFJJVkFURSkgdGhpcy5jYWxlbmRhci51c2VySWQgPSB0aGlzLm1lbWJlcnNoaXAudXNlcklkO1xuICB9XG5cbiAgcmVzZXRTY29wZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW5DaGFuZ2VTY29wZSgpKSB0aGlzLmNhbGVuZGFyLnRlYW1JZCA9IHRoaXMuY2FsZW5kYXIudXNlcklkID0gbnVsbDtcbiAgfVxuICBjYW5DaGFuZ2VTY29wZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZml4U2NvcGUgJiYgdGhpcy5zY29wZUlzU2V0KCk7XG4gIH1cbiAgc2NvcGVJc1NldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNhbGVuZGFyLnVzZXJJZCkgfHwgQm9vbGVhbih0aGlzLmNhbGVuZGFyLnRlYW1JZCk7XG4gIH1cblxuICBhc3luYyBzYXZlTmV3Q2FsZW5kYXIoc2VydmljZT86IEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnNjb3BlSXNTZXQoKSkgcmV0dXJuO1xuICAgIGlmICghc2VydmljZSAmJiB0aGlzLm9ubHlFeHRlcm5hbENhbGVuZGFycykgcmV0dXJuO1xuICAgIGlmIChzZXJ2aWNlKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLmV4dGVybmFsID0gbmV3IEV4dGVybmFsQ2FsZW5kYXJJbmZvKHsgc2VydmljZSB9KTtcbiAgICAgIHRoaXMuY2FsZW5kYXIubmFtZSA9ICctJzsgLy8gaXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBleHRlcm5hbCBuYW1lXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIubmFtZSA9IHRoaXMuY2FsZW5kYXIudXNlcklkXG4gICAgICAgID8gdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERUZBVUxUX1BFUlNPTkFMX0NBTEVOREFSX05BTUUnKVxuICAgICAgICA6IHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVGQVVMVF9URUFNX0NBTEVOREFSX05BTUUnKTtcbiAgICAgIHRoaXMuY2FsZW5kYXIuY29sb3IgPSB0aGlzLkRFRkFVTFRfQ09MT1I7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9sb2FkaW5nLnNob3coKTtcbiAgICAgIGNvbnN0IGNhbCA9IGF3YWl0IHRoaXMuX2NhbGVuZGFycy5wb3N0Q2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgICB0aGlzLmNhbGVuZGFyLmxvYWQoY2FsKTtcbiAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX0NSRUFURUQnKTtcbiAgICAgIGlmICghY2FsLmV4dGVybmFsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX21vZGFsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuaGlkZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLl9jYWxlbmRhcnMubGlua0V4dFNlcnZpY2UodGhpcy5jYWxlbmRhciwgdGhpcy5iYXNlVVJMKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmNob29zZUFuZFNldEV4dGVybmFsQ2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbW9kYWwuZGlzbWlzcyh0aGlzLmNhbGVuZGFyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxlbmRhci5sb2FkKHJlcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19NQVlfVEFLRV9BX1dISUxFJykpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGVuZGFycy5zeW5jQ2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19DT01QTEVURUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9tZXNzYWdlLmVycm9yKCdDT01NT04uT1BFUkFUSU9OX0ZBSUxFRCcpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX21vZGFsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuX21vZGFsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBwb3NzaWJsZSBzY29wZXMgb2YgdGhlIGNhbGVuZGFyLlxuICovXG5leHBvcnQgZW51bSBDYWxlbmRhclNjb3BlcyB7XG4gIFNIQVJFRCA9ICdzaGFyZWQnLCAvLyB0ZWFtSWRcbiAgUFJJVkFURSA9ICdwcml2YXRlJyAvLyB1c2VySWRcbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIEBpZiAoIWNhbkNoYW5nZVNjb3BlKCkpIHtcbiAgICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidDT01NT04uQ0xPU0UnIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3NlXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY2FuQ2hhbmdlU2NvcGUoKSkge1xuICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwicmVzZXRTY29wZSgpXCI+XG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhcnJvdy1iYWNrXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tdGl0bGU+XG4gICAgICBAaWYgKCFzY29wZUlzU2V0KCkpIHtcbiAgICAgICAgPHNwYW4+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5BRERfQV9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICB9XG4gICAgICBAaWYgKGNhbGVuZGFyLnVzZXJJZCkge1xuICAgICAgICA8c3Bhbj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBFUlNPTkFMX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY2FsZW5kYXIudGVhbUlkKSB7XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuVEVBTV9DQUxFTkRBUicgfCB0cmFuc2xhdGU6IHsgdGVhbTogdGVhbS5uYW1lIH0gfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgfVxuICAgIDwvaW9uLXRpdGxlPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8IS0tIDFzdCBTVEVQIC0tPlxuICBAaWYgKCFzY29wZUlzU2V0KCkpIHtcbiAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tcGFkZGluZyBjaG9pY2VHcmlkXCI+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8aDE+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DUkVBVEVfUFJJVkFURV9PUl9URUFNJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCIgW3NpemVTbV09XCI2XCI+XG4gICAgICAgICAgPGlvbi1jYXJkIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJjYWxlbmRhci51c2VySWQgPSBtZW1iZXJzaGlwLnVzZXJJZFwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVyc29uXCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxoMT57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBFUlNPTkFMX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuUEVSU09OQUxfQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCIgW3NpemVTbV09XCI2XCI+XG4gICAgICAgICAgPGlvbi1jYXJkIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJjYWxlbmRhci50ZWFtSWQgPSBtZW1iZXJzaGlwLnRlYW1JZFwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVvcGxlXCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxoMT57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVInIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5URUFNX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICA8L2lvbi1ncmlkPlxuICB9XG4gIDwhLS0gMm5kIFNURVAgLS0+XG4gIEBpZiAoc2NvcGVJc1NldCgpKSB7XG4gICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLXBhZGRpbmcgY2hvaWNlR3JpZFwiPlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGgxPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuV0hJQ0hfRVhURVJOQUxfU0VSVklDRV9UT19MSU5LJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5XSElDSF9FWFRFUk5BTF9TRVJWSUNFX1RPX0xJTktfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAaWYgKCFvbmx5RXh0ZXJuYWxDYWxlbmRhcnMpIHtcbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCI+XG4gICAgICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJzdGVwMlwiIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJzYXZlTmV3Q2FsZW5kYXIoKVwiPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVtb3ZlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGgxPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRE9OVF9MSU5LJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ET05UX0xJTktfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKHMgb2YgU09VUkNFUzsgdHJhY2sgcykge1xuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMTJcIj5cbiAgICAgICAgICAgIDxpb24tY2FyZCBjbGFzcz1cInN0ZXAyXCIgW2J1dHRvbl09XCJ0cnVlXCIgKGNsaWNrKT1cInNhdmVOZXdDYWxlbmRhcihzKVwiPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBbbmFtZV09XCJfY2FsZW5kYXJzLmdldFNlcnZpY2VJY29uKHMpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGgxPlxuICAgICAgICAgICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LX1RPJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5TRVJWSUNFUy4nICsgcyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LX1RPX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgfVxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG4gIH1cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
2
|
-
import { AlertController, ModalController } from '@ionic/angular/standalone';
|
|
3
|
-
import { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';
|
|
4
|
-
import { IDEACalendarComponent } from './calendar.component';
|
|
5
|
-
import { IDEACalendarsService } from './calendars.service';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@ionic/angular";
|
|
8
|
-
import * as i2 from "@idea-ionic/common";
|
|
9
|
-
export class IDEACalendarItemComponent {
|
|
10
|
-
constructor() {
|
|
11
|
-
this._alert = inject(AlertController);
|
|
12
|
-
this._modal = inject(ModalController);
|
|
13
|
-
this._message = inject(IDEAMessageService);
|
|
14
|
-
this._loading = inject(IDEALoadingService);
|
|
15
|
-
this._translate = inject(IDEATranslationsService);
|
|
16
|
-
this._calendars = inject(IDEACalendarsService);
|
|
17
|
-
/**
|
|
18
|
-
* Report to parent components a change.
|
|
19
|
-
*/
|
|
20
|
-
this.somethingChanged = new EventEmitter();
|
|
21
|
-
}
|
|
22
|
-
async manageCalendar() {
|
|
23
|
-
if (this.disabled)
|
|
24
|
-
return;
|
|
25
|
-
const modal = await this._modal.create({
|
|
26
|
-
component: IDEACalendarComponent,
|
|
27
|
-
componentProps: {
|
|
28
|
-
calendar: this.calendar,
|
|
29
|
-
advancedPermissions: this.advancedPermissions,
|
|
30
|
-
hideColor: this.hideColor
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
modal.onDidDismiss().then(res => {
|
|
34
|
-
const cal = res.data;
|
|
35
|
-
if (cal === undefined)
|
|
36
|
-
return;
|
|
37
|
-
else if (cal === null)
|
|
38
|
-
this.calendar = null;
|
|
39
|
-
else
|
|
40
|
-
this.calendar.load(cal);
|
|
41
|
-
this.somethingChanged.emit();
|
|
42
|
-
});
|
|
43
|
-
modal.present();
|
|
44
|
-
}
|
|
45
|
-
async linkExtCalendarOrDelete() {
|
|
46
|
-
if (this.disabled)
|
|
47
|
-
return;
|
|
48
|
-
try {
|
|
49
|
-
const cal = await this._calendars.chooseAndSetExternalCalendar(this.calendar);
|
|
50
|
-
if (!cal)
|
|
51
|
-
throw new Error('NO_EXTERNAL_CALENDAR_CHOSEN');
|
|
52
|
-
this.calendar.load(cal);
|
|
53
|
-
this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_LINKED');
|
|
54
|
-
try {
|
|
55
|
-
await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
|
|
56
|
-
await this._calendars.syncCalendar(this.calendar);
|
|
57
|
-
this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
this._message.error('COMMON.OPERATION_FAILED');
|
|
61
|
-
}
|
|
62
|
-
finally {
|
|
63
|
-
this._loading.hide();
|
|
64
|
-
this.somethingChanged.emit();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
const doDelete = async () => {
|
|
69
|
-
try {
|
|
70
|
-
await this._loading.show();
|
|
71
|
-
await this._calendars.deleteCalendar(this.calendar);
|
|
72
|
-
this._message.success('COMMON.OPERATION_COMPLETED');
|
|
73
|
-
this.somethingChanged.emit();
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
this._message.error('COMMON.OPERATION_FAILED');
|
|
77
|
-
}
|
|
78
|
-
finally {
|
|
79
|
-
this._loading.hide();
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
const doLink = async () => {
|
|
83
|
-
try {
|
|
84
|
-
await this._calendars.linkExtService(this.calendar, this.baseURL);
|
|
85
|
-
this.linkExtCalendarOrDelete();
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
this._message.error('COMMON.OPERATION_FAILED');
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
const header = this._translate._('IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED');
|
|
92
|
-
const message = this._translate._('IDEA_AGENDA.CALENDARS.DO_YOU_WANT_PROCEED_LINKING_OR_DELETE');
|
|
93
|
-
const buttons = [
|
|
94
|
-
{ text: this._translate._('COMMON.DELETE'), handler: doDelete },
|
|
95
|
-
{ text: this._translate._('IDEA_AGENDA.CALENDARS.LINK'), handler: doLink }
|
|
96
|
-
];
|
|
97
|
-
const alert = await this._alert.create({ header, message, buttons });
|
|
98
|
-
alert.present();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
102
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarItemComponent, selector: "idea-calendar-item", inputs: { calendar: "calendar", disabled: "disabled", advancedPermissions: "advancedPermissions", hideColor: "hideColor", baseURL: "baseURL" }, outputs: { somethingChanged: "somethingChanged" }, ngImport: i0, template: "@if (calendar) {\n <ion-item\n class=\"calendarItem\"\n [button]=\"!disabled\"\n [title]=\"'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n >\n @if (!hideColor) {\n <ion-avatar slot=\"start\" class=\"colorCircle\" [style.background-color]=\"calendar.color\" />\n }\n <ion-label>\n {{ calendar.name }}\n <p>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-text color=\"danger\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n }\n {{ calendar.description }}\n </p>\n </ion-label>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n [title]=\"'IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT' | translate\"\n />\n }\n @if (calendar.external?.service) {\n <ion-icon\n slot=\"end\"\n [name]=\"_calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n ('IDEA_AGENDA.CALENDARS.LINKED_TO' | translate) +\n ' ' +\n ('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service | translate)\n \"\n />\n }\n </ion-item>\n}\n", styles: [".calendarItem ion-avatar.colorCircle{width:20px;height:20px;background-color:#555}\n"], dependencies: [{ kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { 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"] }, { kind: "pipe", type: i2.IDEATranslatePipe, name: "translate" }] }); }
|
|
103
|
-
}
|
|
104
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarItemComponent, decorators: [{
|
|
105
|
-
type: Component,
|
|
106
|
-
args: [{ selector: 'idea-calendar-item', template: "@if (calendar) {\n <ion-item\n class=\"calendarItem\"\n [button]=\"!disabled\"\n [title]=\"'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n >\n @if (!hideColor) {\n <ion-avatar slot=\"start\" class=\"colorCircle\" [style.background-color]=\"calendar.color\" />\n }\n <ion-label>\n {{ calendar.name }}\n <p>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-text color=\"danger\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n }\n {{ calendar.description }}\n </p>\n </ion-label>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n [title]=\"'IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT' | translate\"\n />\n }\n @if (calendar.external?.service) {\n <ion-icon\n slot=\"end\"\n [name]=\"_calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n ('IDEA_AGENDA.CALENDARS.LINKED_TO' | translate) +\n ' ' +\n ('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service | translate)\n \"\n />\n }\n </ion-item>\n}\n", styles: [".calendarItem ion-avatar.colorCircle{width:20px;height:20px;background-color:#555}\n"] }]
|
|
107
|
-
}], propDecorators: { calendar: [{
|
|
108
|
-
type: Input
|
|
109
|
-
}], disabled: [{
|
|
110
|
-
type: Input
|
|
111
|
-
}], advancedPermissions: [{
|
|
112
|
-
type: Input
|
|
113
|
-
}], hideColor: [{
|
|
114
|
-
type: Input
|
|
115
|
-
}], baseURL: [{
|
|
116
|
-
type: Input
|
|
117
|
-
}], somethingChanged: [{
|
|
118
|
-
type: Output
|
|
119
|
-
}] } });
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJJdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL21vZHVsZXMvYWdlbmRhL3NyYy9jYWxlbmRhckl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vbW9kdWxlcy9hZ2VuZGEvc3JjL2NhbGVuZGFySXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBTzNELE1BQU0sT0FBTyx5QkFBeUI7SUFMdEM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxlQUFVLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDckQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBc0IxQzs7V0FFRztRQUNPLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7S0FzRTNEO0lBcEVDLEtBQUssQ0FBQyxjQUFjO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVE7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O3NCQUFoQixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQUlJLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQgeyBJREVBTG9hZGluZ1NlcnZpY2UsIElERUFNZXNzYWdlU2VydmljZSwgSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICdAaWRlYS1pb25pYy9jb21tb24nO1xuXG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJzU2VydmljZSB9IGZyb20gJy4vY2FsZW5kYXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJ2NhbGVuZGFySXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjYWxlbmRhckl0ZW0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJJdGVtQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfYWxlcnQgPSBpbmplY3QoQWxlcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChJREVBTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIF9sb2FkaW5nID0gaW5qZWN0KElERUFMb2FkaW5nU2VydmljZSk7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG4gIF9jYWxlbmRhcnMgPSBpbmplY3QoSURFQUNhbGVuZGFyc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsZW5kYXIgdG8gc2hvdy5cbiAgICovXG4gIEBJbnB1dCgpIGNhbGVuZGFyOiBDYWxlbmRhcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB3ZSB3YW50IHRvIGVuYWJsZSBhZHZhbmNlZCBwZXJtaXNzaW9ucyAoYmFzZWQgb24gdGhlIG1lbWJlcnNoaXBzKSBvbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBhZHZhbmNlZFBlcm1pc3Npb25zOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FsZW5kYXIgY29sb3IgaXMgYW4gaW1wb3J0YW50IGRldGFpbCBvciBpdCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoKSBoaWRlQ29sb3I6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIGJlIHVzZWQgb24gdGhlIHJlZGlyZWN0IGNhbGxzLlxuICAgKi9cbiAgQElucHV0KCkgYmFzZVVSTDogc3RyaW5nO1xuICAvKipcbiAgICogUmVwb3J0IHRvIHBhcmVudCBjb21wb25lbnRzIGEgY2hhbmdlLlxuICAgKi9cbiAgQE91dHB1dCgpIHNvbWV0aGluZ0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyPigpO1xuXG4gIGFzeW5jIG1hbmFnZUNhbGVuZGFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLl9tb2RhbC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBJREVBQ2FsZW5kYXJDb21wb25lbnQsXG4gICAgICBjb21wb25lbnRQcm9wczoge1xuICAgICAgICBjYWxlbmRhcjogdGhpcy5jYWxlbmRhcixcbiAgICAgICAgYWR2YW5jZWRQZXJtaXNzaW9uczogdGhpcy5hZHZhbmNlZFBlcm1pc3Npb25zLFxuICAgICAgICBoaWRlQ29sb3I6IHRoaXMuaGlkZUNvbG9yXG4gICAgICB9XG4gICAgfSk7XG4gICAgbW9kYWwub25EaWREaXNtaXNzKCkudGhlbihyZXMgPT4ge1xuICAgICAgY29uc3QgY2FsID0gcmVzLmRhdGE7XG4gICAgICBpZiAoY2FsID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIGVsc2UgaWYgKGNhbCA9PT0gbnVsbCkgdGhpcy5jYWxlbmRhciA9IG51bGw7XG4gICAgICBlbHNlIHRoaXMuY2FsZW5kYXIubG9hZChjYWwpO1xuICAgICAgdGhpcy5zb21ldGhpbmdDaGFuZ2VkLmVtaXQoKTtcbiAgICB9KTtcbiAgICBtb2RhbC5wcmVzZW50KCk7XG4gIH1cblxuICBhc3luYyBsaW5rRXh0Q2FsZW5kYXJPckRlbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWwgPSBhd2FpdCB0aGlzLl9jYWxlbmRhcnMuY2hvb3NlQW5kU2V0RXh0ZXJuYWxDYWxlbmRhcih0aGlzLmNhbGVuZGFyKTtcbiAgICAgIGlmICghY2FsKSB0aHJvdyBuZXcgRXJyb3IoJ05PX0VYVEVSTkFMX0NBTEVOREFSX0NIT1NFTicpO1xuICAgICAgdGhpcy5jYWxlbmRhci5sb2FkKGNhbCk7XG4gICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DQUxFTkRBUl9MSU5LRUQnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuc2hvdyh0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkZJUlNUX1NZTkNfTUFZX1RBS0VfQV9XSElMRScpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLnN5bmNDYWxlbmRhcih0aGlzLmNhbGVuZGFyKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19DT01QTEVURUQnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zb21ldGhpbmdDaGFuZ2VkLmVtaXQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZG9EZWxldGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmRlbGV0ZUNhbGVuZGFyKHRoaXMuY2FsZW5kYXIpO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQ09NTU9OLk9QRVJBVElPTl9DT01QTEVURUQnKTtcbiAgICAgICAgICB0aGlzLnNvbWV0aGluZ0NoYW5nZWQuZW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5fbG9hZGluZy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBkb0xpbmsgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmxpbmtFeHRTZXJ2aWNlKHRoaXMuY2FsZW5kYXIsIHRoaXMuYmFzZVVSTCk7XG4gICAgICAgICAgdGhpcy5saW5rRXh0Q2FsZW5kYXJPckRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX05PVF9ZRVRfTElOS0VEJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ET19ZT1VfV0FOVF9QUk9DRUVEX0xJTktJTkdfT1JfREVMRVRFJyk7XG4gICAgICBjb25zdCBidXR0b25zID0gW1xuICAgICAgICB7IHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uREVMRVRFJyksIGhhbmRsZXI6IGRvRGVsZXRlIH0sXG4gICAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LJyksIGhhbmRsZXI6IGRvTGluayB9XG4gICAgICBdO1xuICAgICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoeyBoZWFkZXIsIG1lc3NhZ2UsIGJ1dHRvbnMgfSk7XG4gICAgICBhbGVydC5wcmVzZW50KCk7XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKGNhbGVuZGFyKSB7XG4gIDxpb24taXRlbVxuICAgIGNsYXNzPVwiY2FsZW5kYXJJdGVtXCJcbiAgICBbYnV0dG9uXT1cIiFkaXNhYmxlZFwiXG4gICAgW3RpdGxlXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuRURJVF9DQUxFTkRBUicgfCB0cmFuc2xhdGVcIlxuICAgIChjbGljayk9XCJjYWxlbmRhci5leHRlcm5hbCAmJiAhY2FsZW5kYXIuZXh0ZXJuYWwuY2FsZW5kYXJJZCA/IGxpbmtFeHRDYWxlbmRhck9yRGVsZXRlKCkgOiBtYW5hZ2VDYWxlbmRhcigpXCJcbiAgPlxuICAgIEBpZiAoIWhpZGVDb2xvcikge1xuICAgICAgPGlvbi1hdmF0YXIgc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJjb2xvckNpcmNsZVwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNhbGVuZGFyLmNvbG9yXCIgLz5cbiAgICB9XG4gICAgPGlvbi1sYWJlbD5cbiAgICAgIHt7IGNhbGVuZGFyLm5hbWUgfX1cbiAgICAgIDxwPlxuICAgICAgICBAaWYgKGNhbGVuZGFyLmV4dGVybmFsICYmICFjYWxlbmRhci5leHRlcm5hbC5jYWxlbmRhcklkKSB7XG4gICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRBUF9UT19DT05GSUdVUkUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgfVxuICAgICAgICB7eyBjYWxlbmRhci5kZXNjcmlwdGlvbiB9fVxuICAgICAgPC9wPlxuICAgIDwvaW9uLWxhYmVsPlxuICAgIEBpZiAoY2FsZW5kYXIuZXh0ZXJuYWwgJiYgIWNhbGVuZGFyLmV4dGVybmFsLmNhbGVuZGFySWQpIHtcbiAgICAgIDxpb24taWNvblxuICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgY29sb3I9XCJkYW5nZXJcIlxuICAgICAgICBuYW1lPVwiZmxhc2gtb2ZmXCJcbiAgICAgICAgW3RpdGxlXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuQ0FMRU5EQVJfTk9UX1lFVF9MSU5LRURfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgLz5cbiAgICB9XG4gICAgQGlmIChjYWxlbmRhci5leHRlcm5hbD8uc2VydmljZSkge1xuICAgICAgPGlvbi1pY29uXG4gICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICBbbmFtZV09XCJfY2FsZW5kYXJzLmdldFNlcnZpY2VJY29uKGNhbGVuZGFyLmV4dGVybmFsLnNlcnZpY2UpXCJcbiAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICgnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkxJTktFRF9UTycgfCB0cmFuc2xhdGUpICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgICgnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlNFUlZJQ0VTLicgKyBjYWxlbmRhci5leHRlcm5hbC5zZXJ2aWNlIHwgdHJhbnNsYXRlKVxuICAgICAgICBcIlxuICAgICAgLz5cbiAgICB9XG4gIDwvaW9uLWl0ZW0+XG59XG4iXX0=
|