@idea-ionic/agenda 8.11.5 → 8.11.6
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, inject,
|
|
2
|
+
import { Injectable, inject, model, input, output, Input, ChangeDetectionStrategy, Component, signal, NgModule } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
4
|
import { formatDate, CommonModule } from '@angular/common';
|
|
5
5
|
import * as i1$1 from '@angular/forms';
|
|
@@ -43,15 +43,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
|
|
|
43
43
|
|
|
44
44
|
class IDEAAgendaComponent {
|
|
45
45
|
constructor() {
|
|
46
|
-
this._cdr = inject(ChangeDetectorRef);
|
|
47
46
|
this._platform = inject(Platform);
|
|
48
47
|
this._translate = inject(IDEATranslationsService);
|
|
49
48
|
/**
|
|
50
49
|
* The events to display in the calendar.
|
|
51
50
|
*/
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.events = [];
|
|
51
|
+
this.events = model([], /* @ts-ignore */
|
|
52
|
+
...(ngDevMode ? [{ debugName: "events" }] : /* istanbul ignore next */ []));
|
|
55
53
|
/**
|
|
56
54
|
* An array of day indexes (0 = sunday, 1 = monday, etc.) that will be hidden on the view.
|
|
57
55
|
*/
|
|
@@ -75,19 +73,14 @@ class IDEAAgendaComponent {
|
|
|
75
73
|
/**
|
|
76
74
|
* Whether to open the current day's details right away in month view.
|
|
77
75
|
*/
|
|
78
|
-
// TODO: Skipped for migration because:
|
|
79
|
-
// Your application code writes to the input. This prevents migration.
|
|
80
76
|
this.activeDayIsOpen = false;
|
|
81
77
|
/**
|
|
82
78
|
* The view mode for the agenda.
|
|
83
79
|
*/
|
|
84
|
-
// TODO: Skipped for migration because:
|
|
85
|
-
// Your application code writes to the input. This prevents migration.
|
|
86
80
|
this.view = CalendarView.Week;
|
|
87
81
|
/**
|
|
88
82
|
* The allowed view mode for the agenda.
|
|
89
83
|
*/
|
|
90
|
-
// TODO: Skipped for migration because: This input is used in a control flow expression (e.g. `@if` or `*ngIf`) and migrating would break narrowing currently.
|
|
91
84
|
this.allowedViews = [CalendarView.Day, CalendarView.Week, CalendarView.Month];
|
|
92
85
|
/**
|
|
93
86
|
* Whether to block any day/slot in the past.
|
|
@@ -211,7 +204,7 @@ class IDEAAgendaComponent {
|
|
|
211
204
|
eventTimesChanged({ event, newStart, newEnd }) {
|
|
212
205
|
event.start = newStart;
|
|
213
206
|
event.end = newEnd;
|
|
214
|
-
this.events
|
|
207
|
+
this.events.set(this.events().slice());
|
|
215
208
|
this.changeEvent.emit(event);
|
|
216
209
|
}
|
|
217
210
|
getAlternateColor(color, amount, opacity) {
|
|
@@ -255,7 +248,7 @@ class IDEAAgendaComponent {
|
|
|
255
248
|
if (parentContent)
|
|
256
249
|
parentContent.scrollY = false;
|
|
257
250
|
const eventByDragAndDrop = { ...this.newEventTemplate(), start: segmentDate };
|
|
258
|
-
this.events
|
|
251
|
+
this.events.set([...this.events(), eventByDragAndDrop]);
|
|
259
252
|
const segmentPosition = segmentElement.getBoundingClientRect();
|
|
260
253
|
const endOfView = endOfWeek(this.viewDate, { weekStartsOn: this.weekStartsOn });
|
|
261
254
|
const whileDragging = (draggingEvent) => {
|
|
@@ -280,8 +273,7 @@ class IDEAAgendaComponent {
|
|
|
280
273
|
this.newEventByDrag.emit(eventByDragAndDrop);
|
|
281
274
|
};
|
|
282
275
|
const refreshView = () => {
|
|
283
|
-
this.events
|
|
284
|
-
this._cdr.detectChanges();
|
|
276
|
+
this.events.set([...this.events()]);
|
|
285
277
|
};
|
|
286
278
|
if (event.type === 'touchstart') {
|
|
287
279
|
fromEvent(document, 'touchmove')
|
|
@@ -302,14 +294,12 @@ class IDEAAgendaComponent {
|
|
|
302
294
|
return fixedEnd;
|
|
303
295
|
}
|
|
304
296
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: IDEAAgendaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
305
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: IDEAAgendaComponent, isStandalone: false, selector: "idea-agenda", inputs: { events: { classPropertyName: "events", publicName: "events", isSignal: false, isRequired: false, transformFunction: null }, excludeDays: { classPropertyName: "excludeDays", publicName: "excludeDays", isSignal: true, isRequired: false, transformFunction: null }, dayStartHour: { classPropertyName: "dayStartHour", publicName: "dayStartHour", isSignal: true, isRequired: false, transformFunction: null }, dayEndHour: { classPropertyName: "dayEndHour", publicName: "dayEndHour", isSignal: true, isRequired: false, transformFunction: null }, hourSegments: { classPropertyName: "hourSegments", publicName: "hourSegments", isSignal: true, isRequired: false, transformFunction: null }, activeDayIsOpen: { classPropertyName: "activeDayIsOpen", publicName: "activeDayIsOpen", isSignal: false, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: false, isRequired: false, transformFunction: null }, allowedViews: { classPropertyName: "allowedViews", publicName: "allowedViews", isSignal: false, isRequired: false, transformFunction: null }, onlyFuture: { classPropertyName: "onlyFuture", publicName: "onlyFuture", isSignal: true, isRequired: false, transformFunction: null }, titleNotes: { classPropertyName: "titleNotes", publicName: "titleNotes", isSignal: false, isRequired: false, transformFunction: null }, newEventTemplate: { classPropertyName: "newEventTemplate", publicName: "newEventTemplate", isSignal: true, isRequired: false, transformFunction: null }, allowDragToCreate: { classPropertyName: "allowDragToCreate", publicName: "allowDragToCreate", isSignal: true, isRequired: false, transformFunction: null }, parentContent: { classPropertyName: "parentContent", publicName: "parentContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectEvent: "selectEvent", selectDay: "selectDay", selectSlot: "selectSlot", newEventByDrag: "newEventByDrag", changeEvent: "changeEvent", changeDate: "changeDate", beforeWeekOrDayViewRenderEmitter: "beforeWeekOrDayViewRenderEmitter", beforeMonthViewRenderEmitter: "beforeMonthViewRenderEmitter" }, ngImport: i0, template: "<div class=\"agenda\">\n <!-- TOOLBAR -->\n <ion-row class=\"ion-align-items-center\">\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"5\"\n [sizeSm]=\"3\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n @if (allowedViews.length > 1) {\n <ion-item lines=\"none\" class=\"calendarViewSelector\">\n <ion-select\n interface=\"popover\"\n [value]=\"view\"\n (ionChange)=\"$event?.detail ? setView($event.detail.value) : null\"\n >\n @for (view of allowedViews; track view) {\n <ion-select-option [value]=\"view\">\n {{ 'IDEA_AGENDA.' + view | uppercase | translate }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n }\n </ion-col>\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"7\"\n [sizeSm]=\"4\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarPreviousView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarToday\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"today-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarNextView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-forward-outline\" slot=\"icon-only\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-align-self-center titleCol\" [size]=\"12\" [sizeSm]=\"5\" [pullSm]=\"7\" [sizeLg]=\"8\" [pullLg]=\"4\">\n <h2>{{ viewDate | calendarDate: view + 'ViewTitle' : locale }}</h2>\n @if (titleNotes) {\n <p>{{ titleNotes }}</p>\n }\n </ion-col>\n </ion-row>\n <!-- TEMPLATES (touch only what's necessary and leave everything else as it is) -->\n <ng-template #eventTitleTemplate let-event=\"event\" let-view=\"view\">\n <span\n class=\"cal-event-title\"\n [class.noWrap]=\"event.allDay\"\n [attr.aria-hidden]=\"{} | calendarA11y: 'hideEventTitle'\"\n >\n {{ event.title | calendarEventTitle: view : event }}\n @if (event.target) {\n <p>{{ event.target }}</p>\n } @else {\n @if (event.location) {\n <p>{{ event.location }}</p>\n }\n }\n @if (!event.allDay) {\n <p>{{ getPreviewDescription(event.description) }}</p>\n }\n </span>\n </ng-template>\n <ng-template\n #eventTemplate\n let-weekEvent=\"weekEvent\"\n let-tooltipPlacement=\"tooltipPlacement\"\n let-eventClicked=\"eventClicked\"\n let-tooltipTemplate=\"tooltipTemplate\"\n let-tooltipAppendToBody=\"tooltipAppendToBody\"\n let-tooltipDisabled=\"tooltipDisabled\"\n let-tooltipDelay=\"tooltipDelay\"\n let-column=\"column\"\n let-daysInWeek=\"daysInWeek\"\n >\n <div\n class=\"cal-event\"\n [class.external]=\"weekEvent.event.external\"\n [class.allDay]=\"weekEvent.event.allDay\"\n [class.needsAction]=\"Attendance.NEEDS_ACTION === weekEvent.event.attendance\"\n [class.declined]=\"Attendance.DECLINED === weekEvent.event.attendance\"\n [class.tentative]=\"Attendance.TENTATIVE === weekEvent.event.attendance\"\n [style.border-left-color]=\"weekEvent.event.color?.primary\"\n [style.color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 80 : -40)\"\n [style.background-color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 60 : 80, 0.2)\"\n [mwlCalendarTooltip]=\"!tooltipDisabled && !isMobile() ? getTooltipContent(weekEvent.event) : ''\"\n [tooltipPlacement]=\"tooltipPlacement\"\n [tooltipEvent]=\"weekEvent.tempEvent || weekEvent.event\"\n [tooltipTemplate]=\"tooltipTemplate\"\n [tooltipAppendToBody]=\"tooltipAppendToBody\"\n [tooltipDelay]=\"tooltipDelay\"\n (mwlClick)=\"eventClicked.emit({ sourceEvent: $event })\"\n (mwlKeydownEnter)=\"eventClicked.emit({ sourceEvent: $event })\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"\n { event: weekEvent.tempEvent || weekEvent.event, locale: locale } | calendarA11y: 'eventDescription'\n \"\n >\n <mwl-calendar-event-actions [event]=\"weekEvent.tempEvent || weekEvent.event\" />\n &ngsp;\n <mwl-calendar-event-title\n [event]=\"weekEvent.tempEvent || weekEvent.event\"\n [customTemplate]=\"eventTitleTemplate\"\n [view]=\"daysInWeek === 1 ? 'day' : 'week'\"\n >\n </mwl-calendar-event-title>\n @if (!weekEvent.event.allDay) {\n <div class=\"eventGadgets\">\n @for (icon of weekEvent.event.icons; track icon) {\n <ion-icon [name]=\"icon.name\" [title]=\"icon.title\" />\n }\n @for (avatar of weekEvent.event.avatars; track avatar) {\n <idea-user-avatar size=\"mini\" [src]=\"avatar.url\" [name]=\"avatar.title\" />\n }\n </div>\n }\n </div>\n </ng-template>\n <ng-template\n #hourSegmentTemplate\n let-segment=\"segment\"\n let-locale=\"locale\"\n let-segmentHeight=\"segmentHeight\"\n let-isTimeLabel=\"isTimeLabel\"\n >\n <div\n #segmentElement\n class=\"cal-hour-segment\"\n [style.height.px]=\"segmentHeight\"\n [class.cal-hour-start]=\"segment.isStart\"\n [class.cal-after-hour-start]=\"!segment.isStart\"\n [ngClass]=\"segment.cssClass\"\n (mousedown)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n (touchstart)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n >\n @if (isTimeLabel) {\n <div class=\"cal-time\">\n {{ segment.date | calendarDate: 'weekViewHour' : locale }}\n </div>\n }\n </div>\n </ng-template>\n <!-- VIEWS -->\n <div>\n @switch (view) {\n @case (CalendarView.Month) {\n <mwl-calendar-month-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [activeDayIsOpen]=\"activeDayIsOpen\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [eventTitleTemplate]=\"eventTitleTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayClicked)=\"changeDay($event.day)\"\n (beforeViewRender)=\"beforeMonthViewRender($event)\"\n >\n </mwl-calendar-month-view>\n }\n @case (CalendarView.Week) {\n <mwl-calendar-week-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayHeaderClicked)=\"dateIsValid($event.day.date) ? selectDay.emit($event.day.date) : null\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-week-view>\n }\n @case (CalendarView.Day) {\n <mwl-calendar-day-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-day-view>\n }\n }\n </div>\n</div>\n", styles: [".agenda{margin-top:15px}.agenda ion-col.titleCol{padding-left:8px}.agenda ion-col.titleCol h2,.agenda ion-col.titleCol p{margin:0}.agenda ion-col.titleCol h2{font-size:1.2em}.agenda ion-col.titleCol p{font-size:.8em;font-style:italic}.agenda .calendarViewSelector{background-color:transparent;--ion-background-color: transparent;--background: transparent}.agenda .calendarViewSelector ion-select{max-width:100%;width:100%;padding-left:0;font-weight:500}.agenda .eventGadgets{margin-top:4px;margin-left:5px;text-align:right}.agenda .eventGadgets idea-user-avatar{display:block;float:left;margin:2px 1px}.agenda .eventGadgets ion-icon{padding-right:2px;opacity:.7;font-size:1.15em}@media only screen and (max-width:575px){.agenda ion-col.titleCol{padding:0 8px 12px;text-align:center}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.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: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "required", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: i2.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i3.IDEAUserAvatarComponent, selector: "idea-user-avatar", inputs: ["src", "name", "size", "color"] }, { kind: "component", type: i4.CalendarEventActionsComponent, selector: "mwl-calendar-event-actions", inputs: ["event", "customTemplate"] }, { kind: "component", type: i4.CalendarEventTitleComponent, selector: "mwl-calendar-event-title", inputs: ["event", "customTemplate", "view"] }, { kind: "directive", type: i4.CalendarTooltipDirective, selector: "[mwlCalendarTooltip]", inputs: ["mwlCalendarTooltip", "tooltipPlacement", "tooltipTemplate", "tooltipEvent", "tooltipAppendToBody", "tooltipDelay"] }, { kind: "directive", type: i4.CalendarPreviousViewDirective, selector: "[mwlCalendarPreviousView]", inputs: ["view", "viewDate", "excludeDays", "daysInWeek"], outputs: ["viewDateChange"] }, { kind: "directive", type: i4.CalendarNextViewDirective, selector: "[mwlCalendarNextView]", inputs: ["view", "viewDate", "excludeDays", "daysInWeek"], outputs: ["viewDateChange"] }, { kind: "directive", type: i4.CalendarTodayDirective, selector: "[mwlCalendarToday]", inputs: ["viewDate"], outputs: ["viewDateChange"] }, { kind: "directive", type: i4.ClickDirective, selector: "[mwlClick]", inputs: ["clickListenerDisabled"], outputs: ["mwlClick"] }, { kind: "directive", type: i4.KeydownEnterDirective, selector: "[mwlKeydownEnter]", outputs: ["mwlKeydownEnter"] }, { kind: "component", type: i4.CalendarMonthViewComponent, selector: "mwl-calendar-month-view", inputs: ["viewDate", "events", "excludeDays", "activeDayIsOpen", "activeDay", "refresh", "locale", "tooltipPlacement", "tooltipTemplate", "tooltipAppendToBody", "tooltipDelay", "weekStartsOn", "headerTemplate", "cellTemplate", "openDayEventsTemplate", "eventTitleTemplate", "eventActionsTemplate", "weekendDays"], outputs: ["beforeViewRender", "dayClicked", "eventClicked", "columnHeaderClicked", "eventTimesChanged"] }, { kind: "component", type: i4.CalendarWeekViewComponent, selector: "mwl-calendar-week-view", inputs: ["viewDate", "events", "excludeDays", "refresh", "locale", "tooltipPlacement", "tooltipTemplate", "tooltipAppendToBody", "tooltipDelay", "weekStartsOn", "headerTemplate", "eventTemplate", "eventTitleTemplate", "eventActionsTemplate", "precision", "weekendDays", "snapDraggedEvents", "hourSegments", "hourDuration", "hourSegmentHeight", "minimumEventHeight", "dayStartHour", "dayStartMinute", "dayEndHour", "dayEndMinute", "hourSegmentTemplate", "eventSnapSize", "allDayEventsLabelTemplate", "daysInWeek", "currentTimeMarkerTemplate", "validateEventTimesChanged", "resizeCursors"], outputs: ["dayHeaderClicked", "eventClicked", "eventTimesChanged", "beforeViewRender", "hourSegmentClicked"] }, { kind: "component", type: i4.CalendarDayViewComponent, selector: "mwl-calendar-day-view", inputs: ["viewDate", "events", "hourSegments", "hourSegmentHeight", "hourDuration", "minimumEventHeight", "dayStartHour", "dayStartMinute", "dayEndHour", "dayEndMinute", "refresh", "locale", "eventSnapSize", "tooltipPlacement", "tooltipTemplate", "tooltipAppendToBody", "tooltipDelay", "hourSegmentTemplate", "eventTemplate", "eventTitleTemplate", "eventActionsTemplate", "snapDraggedEvents", "allDayEventsLabelTemplate", "currentTimeMarkerTemplate", "validateEventTimesChanged", "resizeCursors"], outputs: ["eventClicked", "hourSegmentClicked", "eventTimesChanged", "beforeViewRender"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }, { kind: "pipe", type: i4.CalendarDatePipe, name: "calendarDate" }, { kind: "pipe", type: i4.CalendarEventTitlePipe, name: "calendarEventTitle" }, { kind: "pipe", type: i4.CalendarA11yPipe, name: "calendarA11y" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
297
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: IDEAAgendaComponent, isStandalone: false, selector: "idea-agenda", inputs: { events: { classPropertyName: "events", publicName: "events", isSignal: true, isRequired: false, transformFunction: null }, excludeDays: { classPropertyName: "excludeDays", publicName: "excludeDays", isSignal: true, isRequired: false, transformFunction: null }, dayStartHour: { classPropertyName: "dayStartHour", publicName: "dayStartHour", isSignal: true, isRequired: false, transformFunction: null }, dayEndHour: { classPropertyName: "dayEndHour", publicName: "dayEndHour", isSignal: true, isRequired: false, transformFunction: null }, hourSegments: { classPropertyName: "hourSegments", publicName: "hourSegments", isSignal: true, isRequired: false, transformFunction: null }, activeDayIsOpen: { classPropertyName: "activeDayIsOpen", publicName: "activeDayIsOpen", isSignal: false, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: false, isRequired: false, transformFunction: null }, allowedViews: { classPropertyName: "allowedViews", publicName: "allowedViews", isSignal: false, isRequired: false, transformFunction: null }, onlyFuture: { classPropertyName: "onlyFuture", publicName: "onlyFuture", isSignal: true, isRequired: false, transformFunction: null }, titleNotes: { classPropertyName: "titleNotes", publicName: "titleNotes", isSignal: false, isRequired: false, transformFunction: null }, newEventTemplate: { classPropertyName: "newEventTemplate", publicName: "newEventTemplate", isSignal: true, isRequired: false, transformFunction: null }, allowDragToCreate: { classPropertyName: "allowDragToCreate", publicName: "allowDragToCreate", isSignal: true, isRequired: false, transformFunction: null }, parentContent: { classPropertyName: "parentContent", publicName: "parentContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { events: "eventsChange", selectEvent: "selectEvent", selectDay: "selectDay", selectSlot: "selectSlot", newEventByDrag: "newEventByDrag", changeEvent: "changeEvent", changeDate: "changeDate", beforeWeekOrDayViewRenderEmitter: "beforeWeekOrDayViewRenderEmitter", beforeMonthViewRenderEmitter: "beforeMonthViewRenderEmitter" }, ngImport: i0, template: "<div class=\"agenda\">\n <!-- TOOLBAR -->\n <ion-row class=\"ion-align-items-center\">\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"5\"\n [sizeSm]=\"3\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n @if (allowedViews.length > 1) {\n <ion-item lines=\"none\" class=\"calendarViewSelector\">\n <ion-select\n interface=\"popover\"\n [value]=\"view\"\n (ionChange)=\"$event?.detail ? setView($event.detail.value) : null\"\n >\n @for (view of allowedViews; track view) {\n <ion-select-option [value]=\"view\">\n {{ 'IDEA_AGENDA.' + view | uppercase | translate }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n }\n </ion-col>\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"7\"\n [sizeSm]=\"4\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarPreviousView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarToday\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"today-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarNextView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-forward-outline\" slot=\"icon-only\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-align-self-center titleCol\" [size]=\"12\" [sizeSm]=\"5\" [pullSm]=\"7\" [sizeLg]=\"8\" [pullLg]=\"4\">\n <h2>{{ viewDate | calendarDate: view + 'ViewTitle' : locale }}</h2>\n @if (titleNotes) {\n <p>{{ titleNotes }}</p>\n }\n </ion-col>\n </ion-row>\n <!-- TEMPLATES (touch only what's necessary and leave everything else as it is) -->\n <ng-template #eventTitleTemplate let-event=\"event\" let-view=\"view\">\n <span\n class=\"cal-event-title\"\n [class.noWrap]=\"event.allDay\"\n [attr.aria-hidden]=\"{} | calendarA11y: 'hideEventTitle'\"\n >\n {{ event.title | calendarEventTitle: view : event }}\n @if (event.target) {\n <p>{{ event.target }}</p>\n } @else {\n @if (event.location) {\n <p>{{ event.location }}</p>\n }\n }\n @if (!event.allDay) {\n <p>{{ getPreviewDescription(event.description) }}</p>\n }\n </span>\n </ng-template>\n <ng-template\n #eventTemplate\n let-weekEvent=\"weekEvent\"\n let-tooltipPlacement=\"tooltipPlacement\"\n let-eventClicked=\"eventClicked\"\n let-tooltipTemplate=\"tooltipTemplate\"\n let-tooltipAppendToBody=\"tooltipAppendToBody\"\n let-tooltipDisabled=\"tooltipDisabled\"\n let-tooltipDelay=\"tooltipDelay\"\n let-column=\"column\"\n let-daysInWeek=\"daysInWeek\"\n >\n <div\n class=\"cal-event\"\n [class.external]=\"weekEvent.event.external\"\n [class.allDay]=\"weekEvent.event.allDay\"\n [class.needsAction]=\"Attendance.NEEDS_ACTION === weekEvent.event.attendance\"\n [class.declined]=\"Attendance.DECLINED === weekEvent.event.attendance\"\n [class.tentative]=\"Attendance.TENTATIVE === weekEvent.event.attendance\"\n [style.border-left-color]=\"weekEvent.event.color?.primary\"\n [style.color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 80 : -40)\"\n [style.background-color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 60 : 80, 0.2)\"\n [mwlCalendarTooltip]=\"!tooltipDisabled && !isMobile() ? getTooltipContent(weekEvent.event) : ''\"\n [tooltipPlacement]=\"tooltipPlacement\"\n [tooltipEvent]=\"weekEvent.tempEvent || weekEvent.event\"\n [tooltipTemplate]=\"tooltipTemplate\"\n [tooltipAppendToBody]=\"tooltipAppendToBody\"\n [tooltipDelay]=\"tooltipDelay\"\n (mwlClick)=\"eventClicked.emit({ sourceEvent: $event })\"\n (mwlKeydownEnter)=\"eventClicked.emit({ sourceEvent: $event })\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"\n { event: weekEvent.tempEvent || weekEvent.event, locale: locale } | calendarA11y: 'eventDescription'\n \"\n >\n <mwl-calendar-event-actions [event]=\"weekEvent.tempEvent || weekEvent.event\" />\n &ngsp;\n <mwl-calendar-event-title\n [event]=\"weekEvent.tempEvent || weekEvent.event\"\n [customTemplate]=\"eventTitleTemplate\"\n [view]=\"daysInWeek === 1 ? 'day' : 'week'\"\n >\n </mwl-calendar-event-title>\n @if (!weekEvent.event.allDay) {\n <div class=\"eventGadgets\">\n @for (icon of weekEvent.event.icons; track icon) {\n <ion-icon [name]=\"icon.name\" [title]=\"icon.title\" />\n }\n @for (avatar of weekEvent.event.avatars; track avatar) {\n <idea-user-avatar size=\"mini\" [src]=\"avatar.url\" [name]=\"avatar.title\" />\n }\n </div>\n }\n </div>\n </ng-template>\n <ng-template\n #hourSegmentTemplate\n let-segment=\"segment\"\n let-locale=\"locale\"\n let-segmentHeight=\"segmentHeight\"\n let-isTimeLabel=\"isTimeLabel\"\n >\n <div\n #segmentElement\n class=\"cal-hour-segment\"\n [style.height.px]=\"segmentHeight\"\n [class.cal-hour-start]=\"segment.isStart\"\n [class.cal-after-hour-start]=\"!segment.isStart\"\n [ngClass]=\"segment.cssClass\"\n (mousedown)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n (touchstart)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n >\n @if (isTimeLabel) {\n <div class=\"cal-time\">\n {{ segment.date | calendarDate: 'weekViewHour' : locale }}\n </div>\n }\n </div>\n </ng-template>\n <!-- VIEWS -->\n <div>\n @switch (view) {\n @case (CalendarView.Month) {\n <mwl-calendar-month-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [activeDayIsOpen]=\"activeDayIsOpen\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [eventTitleTemplate]=\"eventTitleTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayClicked)=\"changeDay($event.day)\"\n (beforeViewRender)=\"beforeMonthViewRender($event)\"\n >\n </mwl-calendar-month-view>\n }\n @case (CalendarView.Week) {\n <mwl-calendar-week-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayHeaderClicked)=\"dateIsValid($event.day.date) ? selectDay.emit($event.day.date) : null\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-week-view>\n }\n @case (CalendarView.Day) {\n <mwl-calendar-day-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-day-view>\n }\n }\n </div>\n</div>\n", styles: [".agenda{margin-top:15px}.agenda ion-col.titleCol{padding-left:8px}.agenda ion-col.titleCol h2,.agenda ion-col.titleCol p{margin:0}.agenda ion-col.titleCol h2{font-size:1.2em}.agenda ion-col.titleCol p{font-size:.8em;font-style:italic}.agenda .calendarViewSelector{background-color:transparent;--ion-background-color: transparent;--background: transparent}.agenda .calendarViewSelector ion-select{max-width:100%;width:100%;padding-left:0;font-weight:500}.agenda .eventGadgets{margin-top:4px;margin-left:5px;text-align:right}.agenda .eventGadgets idea-user-avatar{display:block;float:left;margin:2px 1px}.agenda .eventGadgets ion-icon{padding-right:2px;opacity:.7;font-size:1.15em}@media only screen and (max-width:575px){.agenda ion-col.titleCol{padding:0 8px 12px;text-align:center}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.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: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "required", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: i2.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i3.IDEAUserAvatarComponent, selector: "idea-user-avatar", inputs: ["src", "name", "size", "color"] }, { kind: "component", type: i4.CalendarEventActionsComponent, selector: "mwl-calendar-event-actions", inputs: ["event", "customTemplate"] }, { kind: "component", type: i4.CalendarEventTitleComponent, selector: "mwl-calendar-event-title", inputs: ["event", "customTemplate", "view"] }, { kind: "directive", type: i4.CalendarTooltipDirective, selector: "[mwlCalendarTooltip]", inputs: ["mwlCalendarTooltip", "tooltipPlacement", "tooltipTemplate", "tooltipEvent", "tooltipAppendToBody", "tooltipDelay"] }, { kind: "directive", type: i4.CalendarPreviousViewDirective, selector: "[mwlCalendarPreviousView]", inputs: ["view", "viewDate", "excludeDays", "daysInWeek"], outputs: ["viewDateChange"] }, { kind: "directive", type: i4.CalendarNextViewDirective, selector: "[mwlCalendarNextView]", inputs: ["view", "viewDate", "excludeDays", "daysInWeek"], outputs: ["viewDateChange"] }, { kind: "directive", type: i4.CalendarTodayDirective, selector: "[mwlCalendarToday]", inputs: ["viewDate"], outputs: ["viewDateChange"] }, { kind: "directive", type: i4.ClickDirective, selector: "[mwlClick]", inputs: ["clickListenerDisabled"], outputs: ["mwlClick"] }, { kind: "directive", type: i4.KeydownEnterDirective, selector: "[mwlKeydownEnter]", outputs: ["mwlKeydownEnter"] }, { kind: "component", type: i4.CalendarMonthViewComponent, selector: "mwl-calendar-month-view", inputs: ["viewDate", "events", "excludeDays", "activeDayIsOpen", "activeDay", "refresh", "locale", "tooltipPlacement", "tooltipTemplate", "tooltipAppendToBody", "tooltipDelay", "weekStartsOn", "headerTemplate", "cellTemplate", "openDayEventsTemplate", "eventTitleTemplate", "eventActionsTemplate", "weekendDays"], outputs: ["beforeViewRender", "dayClicked", "eventClicked", "columnHeaderClicked", "eventTimesChanged"] }, { kind: "component", type: i4.CalendarWeekViewComponent, selector: "mwl-calendar-week-view", inputs: ["viewDate", "events", "excludeDays", "refresh", "locale", "tooltipPlacement", "tooltipTemplate", "tooltipAppendToBody", "tooltipDelay", "weekStartsOn", "headerTemplate", "eventTemplate", "eventTitleTemplate", "eventActionsTemplate", "precision", "weekendDays", "snapDraggedEvents", "hourSegments", "hourDuration", "hourSegmentHeight", "minimumEventHeight", "dayStartHour", "dayStartMinute", "dayEndHour", "dayEndMinute", "hourSegmentTemplate", "eventSnapSize", "allDayEventsLabelTemplate", "daysInWeek", "currentTimeMarkerTemplate", "validateEventTimesChanged", "resizeCursors"], outputs: ["dayHeaderClicked", "eventClicked", "eventTimesChanged", "beforeViewRender", "hourSegmentClicked"] }, { kind: "component", type: i4.CalendarDayViewComponent, selector: "mwl-calendar-day-view", inputs: ["viewDate", "events", "hourSegments", "hourSegmentHeight", "hourDuration", "minimumEventHeight", "dayStartHour", "dayStartMinute", "dayEndHour", "dayEndMinute", "refresh", "locale", "eventSnapSize", "tooltipPlacement", "tooltipTemplate", "tooltipAppendToBody", "tooltipDelay", "hourSegmentTemplate", "eventTemplate", "eventTitleTemplate", "eventActionsTemplate", "snapDraggedEvents", "allDayEventsLabelTemplate", "currentTimeMarkerTemplate", "validateEventTimesChanged", "resizeCursors"], outputs: ["eventClicked", "hourSegmentClicked", "eventTimesChanged", "beforeViewRender"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }, { kind: "pipe", type: i4.CalendarDatePipe, name: "calendarDate" }, { kind: "pipe", type: i4.CalendarEventTitlePipe, name: "calendarEventTitle" }, { kind: "pipe", type: i4.CalendarA11yPipe, name: "calendarA11y" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
306
298
|
}
|
|
307
299
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: IDEAAgendaComponent, decorators: [{
|
|
308
300
|
type: Component,
|
|
309
|
-
args: [{ standalone: false, selector: 'idea-agenda', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"agenda\">\n <!-- TOOLBAR -->\n <ion-row class=\"ion-align-items-center\">\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"5\"\n [sizeSm]=\"3\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n @if (allowedViews.length > 1) {\n <ion-item lines=\"none\" class=\"calendarViewSelector\">\n <ion-select\n interface=\"popover\"\n [value]=\"view\"\n (ionChange)=\"$event?.detail ? setView($event.detail.value) : null\"\n >\n @for (view of allowedViews; track view) {\n <ion-select-option [value]=\"view\">\n {{ 'IDEA_AGENDA.' + view | uppercase | translate }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n }\n </ion-col>\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"7\"\n [sizeSm]=\"4\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarPreviousView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarToday\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"today-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarNextView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-forward-outline\" slot=\"icon-only\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-align-self-center titleCol\" [size]=\"12\" [sizeSm]=\"5\" [pullSm]=\"7\" [sizeLg]=\"8\" [pullLg]=\"4\">\n <h2>{{ viewDate | calendarDate: view + 'ViewTitle' : locale }}</h2>\n @if (titleNotes) {\n <p>{{ titleNotes }}</p>\n }\n </ion-col>\n </ion-row>\n <!-- TEMPLATES (touch only what's necessary and leave everything else as it is) -->\n <ng-template #eventTitleTemplate let-event=\"event\" let-view=\"view\">\n <span\n class=\"cal-event-title\"\n [class.noWrap]=\"event.allDay\"\n [attr.aria-hidden]=\"{} | calendarA11y: 'hideEventTitle'\"\n >\n {{ event.title | calendarEventTitle: view : event }}\n @if (event.target) {\n <p>{{ event.target }}</p>\n } @else {\n @if (event.location) {\n <p>{{ event.location }}</p>\n }\n }\n @if (!event.allDay) {\n <p>{{ getPreviewDescription(event.description) }}</p>\n }\n </span>\n </ng-template>\n <ng-template\n #eventTemplate\n let-weekEvent=\"weekEvent\"\n let-tooltipPlacement=\"tooltipPlacement\"\n let-eventClicked=\"eventClicked\"\n let-tooltipTemplate=\"tooltipTemplate\"\n let-tooltipAppendToBody=\"tooltipAppendToBody\"\n let-tooltipDisabled=\"tooltipDisabled\"\n let-tooltipDelay=\"tooltipDelay\"\n let-column=\"column\"\n let-daysInWeek=\"daysInWeek\"\n >\n <div\n class=\"cal-event\"\n [class.external]=\"weekEvent.event.external\"\n [class.allDay]=\"weekEvent.event.allDay\"\n [class.needsAction]=\"Attendance.NEEDS_ACTION === weekEvent.event.attendance\"\n [class.declined]=\"Attendance.DECLINED === weekEvent.event.attendance\"\n [class.tentative]=\"Attendance.TENTATIVE === weekEvent.event.attendance\"\n [style.border-left-color]=\"weekEvent.event.color?.primary\"\n [style.color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 80 : -40)\"\n [style.background-color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 60 : 80, 0.2)\"\n [mwlCalendarTooltip]=\"!tooltipDisabled && !isMobile() ? getTooltipContent(weekEvent.event) : ''\"\n [tooltipPlacement]=\"tooltipPlacement\"\n [tooltipEvent]=\"weekEvent.tempEvent || weekEvent.event\"\n [tooltipTemplate]=\"tooltipTemplate\"\n [tooltipAppendToBody]=\"tooltipAppendToBody\"\n [tooltipDelay]=\"tooltipDelay\"\n (mwlClick)=\"eventClicked.emit({ sourceEvent: $event })\"\n (mwlKeydownEnter)=\"eventClicked.emit({ sourceEvent: $event })\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"\n { event: weekEvent.tempEvent || weekEvent.event, locale: locale } | calendarA11y: 'eventDescription'\n \"\n >\n <mwl-calendar-event-actions [event]=\"weekEvent.tempEvent || weekEvent.event\" />\n &ngsp;\n <mwl-calendar-event-title\n [event]=\"weekEvent.tempEvent || weekEvent.event\"\n [customTemplate]=\"eventTitleTemplate\"\n [view]=\"daysInWeek === 1 ? 'day' : 'week'\"\n >\n </mwl-calendar-event-title>\n @if (!weekEvent.event.allDay) {\n <div class=\"eventGadgets\">\n @for (icon of weekEvent.event.icons; track icon) {\n <ion-icon [name]=\"icon.name\" [title]=\"icon.title\" />\n }\n @for (avatar of weekEvent.event.avatars; track avatar) {\n <idea-user-avatar size=\"mini\" [src]=\"avatar.url\" [name]=\"avatar.title\" />\n }\n </div>\n }\n </div>\n </ng-template>\n <ng-template\n #hourSegmentTemplate\n let-segment=\"segment\"\n let-locale=\"locale\"\n let-segmentHeight=\"segmentHeight\"\n let-isTimeLabel=\"isTimeLabel\"\n >\n <div\n #segmentElement\n class=\"cal-hour-segment\"\n [style.height.px]=\"segmentHeight\"\n [class.cal-hour-start]=\"segment.isStart\"\n [class.cal-after-hour-start]=\"!segment.isStart\"\n [ngClass]=\"segment.cssClass\"\n (mousedown)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n (touchstart)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n >\n @if (isTimeLabel) {\n <div class=\"cal-time\">\n {{ segment.date | calendarDate: 'weekViewHour' : locale }}\n </div>\n }\n </div>\n </ng-template>\n <!-- VIEWS -->\n <div>\n @switch (view) {\n @case (CalendarView.Month) {\n <mwl-calendar-month-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [activeDayIsOpen]=\"activeDayIsOpen\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [eventTitleTemplate]=\"eventTitleTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayClicked)=\"changeDay($event.day)\"\n (beforeViewRender)=\"beforeMonthViewRender($event)\"\n >\n </mwl-calendar-month-view>\n }\n @case (CalendarView.Week) {\n <mwl-calendar-week-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayHeaderClicked)=\"dateIsValid($event.day.date) ? selectDay.emit($event.day.date) : null\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-week-view>\n }\n @case (CalendarView.Day) {\n <mwl-calendar-day-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-day-view>\n }\n }\n </div>\n</div>\n", styles: [".agenda{margin-top:15px}.agenda ion-col.titleCol{padding-left:8px}.agenda ion-col.titleCol h2,.agenda ion-col.titleCol p{margin:0}.agenda ion-col.titleCol h2{font-size:1.2em}.agenda ion-col.titleCol p{font-size:.8em;font-style:italic}.agenda .calendarViewSelector{background-color:transparent;--ion-background-color: transparent;--background: transparent}.agenda .calendarViewSelector ion-select{max-width:100%;width:100%;padding-left:0;font-weight:500}.agenda .eventGadgets{margin-top:4px;margin-left:5px;text-align:right}.agenda .eventGadgets idea-user-avatar{display:block;float:left;margin:2px 1px}.agenda .eventGadgets ion-icon{padding-right:2px;opacity:.7;font-size:1.15em}@media only screen and (max-width:575px){.agenda ion-col.titleCol{padding:0 8px 12px;text-align:center}}\n"] }]
|
|
310
|
-
}], propDecorators: { events: [{
|
|
311
|
-
type: Input
|
|
312
|
-
}], excludeDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "excludeDays", required: false }] }], dayStartHour: [{ type: i0.Input, args: [{ isSignal: true, alias: "dayStartHour", required: false }] }], dayEndHour: [{ type: i0.Input, args: [{ isSignal: true, alias: "dayEndHour", required: false }] }], hourSegments: [{ type: i0.Input, args: [{ isSignal: true, alias: "hourSegments", required: false }] }], activeDayIsOpen: [{
|
|
301
|
+
args: [{ standalone: false, selector: 'idea-agenda', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"agenda\">\n <!-- TOOLBAR -->\n <ion-row class=\"ion-align-items-center\">\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"5\"\n [sizeSm]=\"3\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n @if (allowedViews.length > 1) {\n <ion-item lines=\"none\" class=\"calendarViewSelector\">\n <ion-select\n interface=\"popover\"\n [value]=\"view\"\n (ionChange)=\"$event?.detail ? setView($event.detail.value) : null\"\n >\n @for (view of allowedViews; track view) {\n <ion-select-option [value]=\"view\">\n {{ 'IDEA_AGENDA.' + view | uppercase | translate }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n }\n </ion-col>\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"7\"\n [sizeSm]=\"4\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarPreviousView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarToday\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"today-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarNextView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-forward-outline\" slot=\"icon-only\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-align-self-center titleCol\" [size]=\"12\" [sizeSm]=\"5\" [pullSm]=\"7\" [sizeLg]=\"8\" [pullLg]=\"4\">\n <h2>{{ viewDate | calendarDate: view + 'ViewTitle' : locale }}</h2>\n @if (titleNotes) {\n <p>{{ titleNotes }}</p>\n }\n </ion-col>\n </ion-row>\n <!-- TEMPLATES (touch only what's necessary and leave everything else as it is) -->\n <ng-template #eventTitleTemplate let-event=\"event\" let-view=\"view\">\n <span\n class=\"cal-event-title\"\n [class.noWrap]=\"event.allDay\"\n [attr.aria-hidden]=\"{} | calendarA11y: 'hideEventTitle'\"\n >\n {{ event.title | calendarEventTitle: view : event }}\n @if (event.target) {\n <p>{{ event.target }}</p>\n } @else {\n @if (event.location) {\n <p>{{ event.location }}</p>\n }\n }\n @if (!event.allDay) {\n <p>{{ getPreviewDescription(event.description) }}</p>\n }\n </span>\n </ng-template>\n <ng-template\n #eventTemplate\n let-weekEvent=\"weekEvent\"\n let-tooltipPlacement=\"tooltipPlacement\"\n let-eventClicked=\"eventClicked\"\n let-tooltipTemplate=\"tooltipTemplate\"\n let-tooltipAppendToBody=\"tooltipAppendToBody\"\n let-tooltipDisabled=\"tooltipDisabled\"\n let-tooltipDelay=\"tooltipDelay\"\n let-column=\"column\"\n let-daysInWeek=\"daysInWeek\"\n >\n <div\n class=\"cal-event\"\n [class.external]=\"weekEvent.event.external\"\n [class.allDay]=\"weekEvent.event.allDay\"\n [class.needsAction]=\"Attendance.NEEDS_ACTION === weekEvent.event.attendance\"\n [class.declined]=\"Attendance.DECLINED === weekEvent.event.attendance\"\n [class.tentative]=\"Attendance.TENTATIVE === weekEvent.event.attendance\"\n [style.border-left-color]=\"weekEvent.event.color?.primary\"\n [style.color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 80 : -40)\"\n [style.background-color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 60 : 80, 0.2)\"\n [mwlCalendarTooltip]=\"!tooltipDisabled && !isMobile() ? getTooltipContent(weekEvent.event) : ''\"\n [tooltipPlacement]=\"tooltipPlacement\"\n [tooltipEvent]=\"weekEvent.tempEvent || weekEvent.event\"\n [tooltipTemplate]=\"tooltipTemplate\"\n [tooltipAppendToBody]=\"tooltipAppendToBody\"\n [tooltipDelay]=\"tooltipDelay\"\n (mwlClick)=\"eventClicked.emit({ sourceEvent: $event })\"\n (mwlKeydownEnter)=\"eventClicked.emit({ sourceEvent: $event })\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"\n { event: weekEvent.tempEvent || weekEvent.event, locale: locale } | calendarA11y: 'eventDescription'\n \"\n >\n <mwl-calendar-event-actions [event]=\"weekEvent.tempEvent || weekEvent.event\" />\n &ngsp;\n <mwl-calendar-event-title\n [event]=\"weekEvent.tempEvent || weekEvent.event\"\n [customTemplate]=\"eventTitleTemplate\"\n [view]=\"daysInWeek === 1 ? 'day' : 'week'\"\n >\n </mwl-calendar-event-title>\n @if (!weekEvent.event.allDay) {\n <div class=\"eventGadgets\">\n @for (icon of weekEvent.event.icons; track icon) {\n <ion-icon [name]=\"icon.name\" [title]=\"icon.title\" />\n }\n @for (avatar of weekEvent.event.avatars; track avatar) {\n <idea-user-avatar size=\"mini\" [src]=\"avatar.url\" [name]=\"avatar.title\" />\n }\n </div>\n }\n </div>\n </ng-template>\n <ng-template\n #hourSegmentTemplate\n let-segment=\"segment\"\n let-locale=\"locale\"\n let-segmentHeight=\"segmentHeight\"\n let-isTimeLabel=\"isTimeLabel\"\n >\n <div\n #segmentElement\n class=\"cal-hour-segment\"\n [style.height.px]=\"segmentHeight\"\n [class.cal-hour-start]=\"segment.isStart\"\n [class.cal-after-hour-start]=\"!segment.isStart\"\n [ngClass]=\"segment.cssClass\"\n (mousedown)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n (touchstart)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n >\n @if (isTimeLabel) {\n <div class=\"cal-time\">\n {{ segment.date | calendarDate: 'weekViewHour' : locale }}\n </div>\n }\n </div>\n </ng-template>\n <!-- VIEWS -->\n <div>\n @switch (view) {\n @case (CalendarView.Month) {\n <mwl-calendar-month-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [activeDayIsOpen]=\"activeDayIsOpen\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [eventTitleTemplate]=\"eventTitleTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayClicked)=\"changeDay($event.day)\"\n (beforeViewRender)=\"beforeMonthViewRender($event)\"\n >\n </mwl-calendar-month-view>\n }\n @case (CalendarView.Week) {\n <mwl-calendar-week-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayHeaderClicked)=\"dateIsValid($event.day.date) ? selectDay.emit($event.day.date) : null\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-week-view>\n }\n @case (CalendarView.Day) {\n <mwl-calendar-day-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-day-view>\n }\n }\n </div>\n</div>\n", styles: [".agenda{margin-top:15px}.agenda ion-col.titleCol{padding-left:8px}.agenda ion-col.titleCol h2,.agenda ion-col.titleCol p{margin:0}.agenda ion-col.titleCol h2{font-size:1.2em}.agenda ion-col.titleCol p{font-size:.8em;font-style:italic}.agenda .calendarViewSelector{background-color:transparent;--ion-background-color: transparent;--background: transparent}.agenda .calendarViewSelector ion-select{max-width:100%;width:100%;padding-left:0;font-weight:500}.agenda .eventGadgets{margin-top:4px;margin-left:5px;text-align:right}.agenda .eventGadgets idea-user-avatar{display:block;float:left;margin:2px 1px}.agenda .eventGadgets ion-icon{padding-right:2px;opacity:.7;font-size:1.15em}@media only screen and (max-width:575px){.agenda ion-col.titleCol{padding:0 8px 12px;text-align:center}}\n"] }]
|
|
302
|
+
}], propDecorators: { events: [{ type: i0.Input, args: [{ isSignal: true, alias: "events", required: false }] }, { type: i0.Output, args: ["eventsChange"] }], excludeDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "excludeDays", required: false }] }], dayStartHour: [{ type: i0.Input, args: [{ isSignal: true, alias: "dayStartHour", required: false }] }], dayEndHour: [{ type: i0.Input, args: [{ isSignal: true, alias: "dayEndHour", required: false }] }], hourSegments: [{ type: i0.Input, args: [{ isSignal: true, alias: "hourSegments", required: false }] }], activeDayIsOpen: [{
|
|
313
303
|
type: Input
|
|
314
304
|
}], view: [{
|
|
315
305
|
type: Input
|
|
@@ -555,7 +545,8 @@ class IDEACalendarComponent {
|
|
|
555
545
|
this._API = inject(IDEAAWSAPIService);
|
|
556
546
|
this._translate = inject(IDEATranslationsService);
|
|
557
547
|
this._calendars = inject(IDEACalendarsService);
|
|
558
|
-
this.
|
|
548
|
+
this.membershipsChecks = signal(null, /* @ts-ignore */
|
|
549
|
+
...(ngDevMode ? [{ debugName: "membershipsChecks" }] : /* istanbul ignore next */ []));
|
|
559
550
|
this.errors = new Set();
|
|
560
551
|
this.DEFAULT_COLOR = '#555';
|
|
561
552
|
}
|
|
@@ -564,12 +555,11 @@ class IDEACalendarComponent {
|
|
|
564
555
|
this.calendarWC = new Calendar(this.calendar);
|
|
565
556
|
try {
|
|
566
557
|
const memberships = await this._API.getResource(`teams/${this.membership.teamId}/memberships`);
|
|
567
|
-
this.membershipsChecks
|
|
558
|
+
this.membershipsChecks.set(memberships.map(m => new Check({
|
|
568
559
|
value: m.userId,
|
|
569
560
|
name: m.name,
|
|
570
561
|
checked: (this.calendarWC.usersCanManageAppointments || []).some(x => x === m.userId)
|
|
571
|
-
}));
|
|
572
|
-
this._cdr.markForCheck();
|
|
562
|
+
})));
|
|
573
563
|
}
|
|
574
564
|
catch (error) {
|
|
575
565
|
this._message.error('COMMON.COULDNT_LOAD_LIST');
|
|
@@ -582,7 +572,7 @@ class IDEACalendarComponent {
|
|
|
582
572
|
if (!this.calendarWC.color)
|
|
583
573
|
this.calendarWC.color = this.DEFAULT_COLOR;
|
|
584
574
|
if (this.calendarWC.isShared() && this.advancedPermissions)
|
|
585
|
-
this.calendarWC.usersCanManageAppointments = this.membershipsChecks
|
|
575
|
+
this.calendarWC.usersCanManageAppointments = this.membershipsChecks()
|
|
586
576
|
.filter(x => x.checked)
|
|
587
577
|
.map(x => String(x.value));
|
|
588
578
|
else
|
|
@@ -633,11 +623,11 @@ class IDEACalendarComponent {
|
|
|
633
623
|
this._modal.dismiss();
|
|
634
624
|
}
|
|
635
625
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: IDEACalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
636
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: IDEACalendarComponent, isStandalone: false, 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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.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-input-otp[type=text],ion-textarea,ion-searchbar" }, { kind: "component", type: i3$1.IDEAColorPickerComponent, selector: "idea-color-picker", inputs: ["colors", "current", "label", "placeholder", "icon", "iconColor", "disabled", "obligatory", "lines", "color"], outputs: ["select", "iconSelect"] }, { kind: "component", type: i3.IDEACheckerComponent, selector: "idea-checker", inputs: ["data", "dataProvider", "label", "icon", "iconColor", "searchPlaceholder", "noPreviewText", "noElementsFoundText", "noneEqualsAll", "noneText", "allText", "previewTextKey", "lines", "color", "disabled", "tappableWhenDisabled", "obligatory", "sortData", "numMaxElementsInPreview", "showAvatars", "limitSelectionToNum", "allowSelectDeselectAll", "category1", "category2", "showCategoriesFilters"], outputs: ["change", "iconSelect"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
626
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: IDEACalendarComponent, isStandalone: false, 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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.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-input-otp[type=text],ion-textarea,ion-searchbar" }, { kind: "component", type: i3$1.IDEAColorPickerComponent, selector: "idea-color-picker", inputs: ["colors", "current", "label", "placeholder", "icon", "iconColor", "disabled", "obligatory", "lines", "color"], outputs: ["select", "iconSelect"] }, { kind: "component", type: i3.IDEACheckerComponent, selector: "idea-checker", inputs: ["data", "dataProvider", "label", "icon", "iconColor", "searchPlaceholder", "noPreviewText", "noElementsFoundText", "noneEqualsAll", "noneText", "allText", "previewTextKey", "lines", "color", "disabled", "tappableWhenDisabled", "obligatory", "sortData", "numMaxElementsInPreview", "showAvatars", "limitSelectionToNum", "allowSelectDeselectAll", "category1", "category2", "showCategoriesFilters"], outputs: ["dataChange", "change", "iconSelect"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
637
627
|
}
|
|
638
628
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: IDEACalendarComponent, decorators: [{
|
|
639
629
|
type: Component,
|
|
640
|
-
args: [{ standalone: false, selector: 'idea-calendar', changeDetection: ChangeDetectionStrategy.OnPush, 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"] }]
|
|
630
|
+
args: [{ standalone: false, selector: 'idea-calendar', changeDetection: ChangeDetectionStrategy.OnPush, 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"] }]
|
|
641
631
|
}], propDecorators: { calendar: [{
|
|
642
632
|
type: Input
|
|
643
633
|
}], advancedPermissions: [{
|
|
@@ -654,6 +644,11 @@ class IDEACalendarItemComponent {
|
|
|
654
644
|
this._loading = inject(IDEALoadingService);
|
|
655
645
|
this._translate = inject(IDEATranslationsService);
|
|
656
646
|
this._calendars = inject(IDEACalendarsService);
|
|
647
|
+
/**
|
|
648
|
+
* The calendar to show.
|
|
649
|
+
*/
|
|
650
|
+
this.calendar = model(/* @ts-ignore */
|
|
651
|
+
...(ngDevMode ? [undefined, { debugName: "calendar" }] : /* istanbul ignore next */ []));
|
|
657
652
|
/**
|
|
658
653
|
* Whether the component is disabled.
|
|
659
654
|
*/
|
|
@@ -685,7 +680,7 @@ class IDEACalendarItemComponent {
|
|
|
685
680
|
const modal = await this._modal.create({
|
|
686
681
|
component: IDEACalendarComponent,
|
|
687
682
|
componentProps: {
|
|
688
|
-
calendar: this.calendar,
|
|
683
|
+
calendar: this.calendar(),
|
|
689
684
|
advancedPermissions: this.advancedPermissions(),
|
|
690
685
|
hideColor: this.hideColor()
|
|
691
686
|
}
|
|
@@ -695,10 +690,10 @@ class IDEACalendarItemComponent {
|
|
|
695
690
|
if (cal === undefined)
|
|
696
691
|
return;
|
|
697
692
|
else if (cal === null)
|
|
698
|
-
this.calendar
|
|
693
|
+
this.calendar.set(null);
|
|
699
694
|
else
|
|
700
|
-
this.calendar.
|
|
701
|
-
this.somethingChanged.emit(this.calendar);
|
|
695
|
+
this.calendar.update(c => new Calendar({ ...c, ...cal }));
|
|
696
|
+
this.somethingChanged.emit(this.calendar());
|
|
702
697
|
});
|
|
703
698
|
modal.present();
|
|
704
699
|
}
|
|
@@ -706,14 +701,14 @@ class IDEACalendarItemComponent {
|
|
|
706
701
|
if (this.disabled())
|
|
707
702
|
return;
|
|
708
703
|
try {
|
|
709
|
-
const cal = await this._calendars.chooseAndSetExternalCalendar(this.calendar);
|
|
704
|
+
const cal = await this._calendars.chooseAndSetExternalCalendar(this.calendar());
|
|
710
705
|
if (!cal)
|
|
711
706
|
throw new Error('NO_EXTERNAL_CALENDAR_CHOSEN');
|
|
712
|
-
this.calendar.
|
|
707
|
+
this.calendar.update(c => new Calendar({ ...c, ...cal }));
|
|
713
708
|
this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_LINKED');
|
|
714
709
|
try {
|
|
715
710
|
await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
|
|
716
|
-
await this._calendars.syncCalendar(this.calendar);
|
|
711
|
+
await this._calendars.syncCalendar(this.calendar());
|
|
717
712
|
this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');
|
|
718
713
|
}
|
|
719
714
|
catch (error) {
|
|
@@ -721,16 +716,16 @@ class IDEACalendarItemComponent {
|
|
|
721
716
|
}
|
|
722
717
|
finally {
|
|
723
718
|
this._loading.hide();
|
|
724
|
-
this.somethingChanged.emit(this.calendar);
|
|
719
|
+
this.somethingChanged.emit(this.calendar());
|
|
725
720
|
}
|
|
726
721
|
}
|
|
727
722
|
catch (error) {
|
|
728
723
|
const doDelete = async () => {
|
|
729
724
|
try {
|
|
730
725
|
await this._loading.show();
|
|
731
|
-
await this._calendars.deleteCalendar(this.calendar);
|
|
726
|
+
await this._calendars.deleteCalendar(this.calendar());
|
|
732
727
|
this._message.success('COMMON.OPERATION_COMPLETED');
|
|
733
|
-
this.somethingChanged.emit(this.calendar);
|
|
728
|
+
this.somethingChanged.emit(this.calendar());
|
|
734
729
|
}
|
|
735
730
|
catch (error) {
|
|
736
731
|
this._message.error('COMMON.OPERATION_FAILED');
|
|
@@ -741,7 +736,7 @@ class IDEACalendarItemComponent {
|
|
|
741
736
|
};
|
|
742
737
|
const doLink = async () => {
|
|
743
738
|
try {
|
|
744
|
-
await this._calendars.linkExtService(this.calendar, this.baseURL());
|
|
739
|
+
await this._calendars.linkExtService(this.calendar(), this.baseURL());
|
|
745
740
|
this.linkExtCalendarOrDelete();
|
|
746
741
|
}
|
|
747
742
|
catch (error) {
|
|
@@ -759,14 +754,12 @@ class IDEACalendarItemComponent {
|
|
|
759
754
|
}
|
|
760
755
|
}
|
|
761
756
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: IDEACalendarItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
762
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: IDEACalendarItemComponent, isStandalone: false, selector: "idea-calendar-item", inputs: { calendar: { classPropertyName: "calendar", publicName: "calendar", isSignal:
|
|
757
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: IDEACalendarItemComponent, isStandalone: false, selector: "idea-calendar-item", inputs: { calendar: { classPropertyName: "calendar", publicName: "calendar", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, advancedPermissions: { classPropertyName: "advancedPermissions", publicName: "advancedPermissions", isSignal: true, isRequired: false, transformFunction: null }, hideColor: { classPropertyName: "hideColor", publicName: "hideColor", isSignal: true, isRequired: false, transformFunction: null }, baseURL: { classPropertyName: "baseURL", publicName: "baseURL", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { calendar: "calendarChange", 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: i2.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
763
758
|
}
|
|
764
759
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: IDEACalendarItemComponent, decorators: [{
|
|
765
760
|
type: Component,
|
|
766
|
-
args: [{ standalone: false, selector: 'idea-calendar-item', changeDetection: ChangeDetectionStrategy.OnPush, 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"] }]
|
|
767
|
-
}], propDecorators: { calendar: [{
|
|
768
|
-
type: Input
|
|
769
|
-
}], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], advancedPermissions: [{ type: i0.Input, args: [{ isSignal: true, alias: "advancedPermissions", required: false }] }], hideColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideColor", required: false }] }], baseURL: [{ type: i0.Input, args: [{ isSignal: true, alias: "baseURL", required: false }] }], somethingChanged: [{ type: i0.Output, args: ["somethingChanged"] }] } });
|
|
761
|
+
args: [{ standalone: false, selector: 'idea-calendar-item', changeDetection: ChangeDetectionStrategy.OnPush, 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"] }]
|
|
762
|
+
}], propDecorators: { calendar: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendar", required: false }] }, { type: i0.Output, args: ["calendarChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], advancedPermissions: [{ type: i0.Input, args: [{ isSignal: true, alias: "advancedPermissions", required: false }] }], hideColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideColor", required: false }] }], baseURL: [{ type: i0.Input, args: [{ isSignal: true, alias: "baseURL", required: false }] }], somethingChanged: [{ type: i0.Output, args: ["somethingChanged"] }] } });
|
|
770
763
|
|
|
771
764
|
class IDEACalendarCreationComponent {
|
|
772
765
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idea-ionic-agenda.mjs","sources":["../../../modules/agenda/src/dateFormatter.provider.ts","../../../modules/agenda/src/agenda.component.ts","../../../modules/agenda/src/agenda.component.html","../../../modules/agenda/src/calendars.service.ts","../../../modules/agenda/src/calendar.component.ts","../../../modules/agenda/src/calendar.component.html","../../../modules/agenda/src/calendarItem.component.ts","../../../modules/agenda/src/calendarItem.component.html","../../../modules/agenda/src/calendarCreation.component.ts","../../../modules/agenda/src/calendarCreation.component.html","../../../modules/agenda/src/agenda.module.ts","../../../modules/agenda/idea-ionic-agenda.ts"],"sourcesContent":["import { formatDate } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport { CalendarDateFormatter, DateFormatterParams } from 'angular-calendar';\n\n@Injectable()\nexport class CustomDateFormatter extends CalendarDateFormatter {\n // MONTH VIEW\n monthViewColumnHeader = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'EEE', locale);\n monthViewTitle = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'MMMM y', locale);\n\n // WEEK VIEW\n weekViewHour = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'HH:mm', locale) : formatDate(date, 'h aa', locale);\n weekViewColumnHeader = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'EEE', locale);\n weekViewTitle = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'MMMM yyyy', locale);\n\n // DAY VIEW\n dayViewHour = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'HH:mm', locale) : formatDate(date, 'h aa', locale);\n dayViewTitle = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'EEEE, dd MMM yyyy', locale) : formatDate(date, 'EEEE, MMM dd, yyyy', locale);\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n Input,\n OnInit,\n ChangeDetectorRef,\n inject,\n output,\n input\n} from '@angular/core';\nimport { IonContent, Platform } from '@ionic/angular/standalone';\nimport { finalize, fromEvent, Subject, takeUntil } from 'rxjs';\nimport {\n CalendarEvent,\n CalendarEventTimesChangedEvent,\n CalendarMonthViewBeforeRenderEvent,\n CalendarView,\n CalendarWeekViewBeforeRenderEvent\n} from 'angular-calendar';\nimport { isFuture, isToday, isSameDay, endOfWeek, addDays, addMinutes } from 'date-fns';\n// @ts-ignore\nimport ColorParse from 'color-parse';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\n@Component({\n // eslint-disable-next-line\n standalone: false,\n selector: 'idea-agenda',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'agenda.component.html',\n styleUrls: ['agenda.component.scss']\n})\nexport class IDEAAgendaComponent implements OnInit {\n private _cdr = inject(ChangeDetectorRef);\n private _platform = inject(Platform);\n _translate = inject(IDEATranslationsService);\n\n /**\n * The events to display in the calendar.\n */\n // TODO: Skipped for migration because:\n // Your application code writes to the input. This prevents migration.\n @Input() events: AgendaEvent[] = [];\n /**\n * An array of day indexes (0 = sunday, 1 = monday, etc.) that will be hidden on the view.\n */\n readonly excludeDays = input<number[]>([]);\n /**\n * The day start hours in 24 hour time. Must be 0-23\n */\n readonly dayStartHour = input(0);\n /**\n * The day start hours in 24 hour time. Must be 0-23\n */\n readonly dayEndHour = input(23);\n /**\n * The number of segments in an hour. Must divide equally into 60.\n */\n readonly hourSegments = input(2);\n /**\n * Whether to open the current day's details right away in month view.\n */\n // TODO: Skipped for migration because:\n // Your application code writes to the input. This prevents migration.\n @Input() activeDayIsOpen = false;\n /**\n * The view mode for the agenda.\n */\n // TODO: Skipped for migration because:\n // Your application code writes to the input. This prevents migration.\n @Input() view: CalendarView = CalendarView.Week;\n /**\n * The allowed view mode for the agenda.\n */\n // TODO: Skipped for migration because: This input is used in a control flow expression (e.g. `@if` or `*ngIf`) and migrating would break narrowing currently.\n @Input() allowedViews = [CalendarView.Day, CalendarView.Week, CalendarView.Month];\n /**\n * Whether to block any day/slot in the past.\n */\n readonly onlyFuture = input(false);\n /**\n * Some notes to show underneath the calendar's header.\n */\n // TODO: Skipped for migration because: This input is used in a control flow expression (e.g. `@if` or `*ngIf`) and migrating would break narrowing currently.\n @Input() titleNotes: string;\n /**\n * The template for new events created by drag&drop.\n */\n readonly newEventTemplate = input<AgendaEvent>({ title: 'New', start: null, meta: {} });\n /**\n * Whether (and how) to allow the creation of events by drag&drop.\n * If enabled, on mobile it requires the `parentContent` to be set for a correct execution.\n */\n readonly allowDragToCreate = input<DragToCreateOptions>(DragToCreateOptions.DISABLED);\n /**\n * The parent ion-content, in case we want to control its scrollability for drag&drop features.\n */\n readonly parentContent = input<IonContent>();\n /**\n * Trigger when an event is selected.\n */\n readonly selectEvent = output<AgendaEvent>();\n /**\n * Trigger when a day is selected.\n */\n readonly selectDay = output<Date>();\n /**\n * Trigger when a time slot is selected.\n */\n readonly selectSlot = output<Date>();\n /**\n * Trigger when a new event is added by drag and drop.\n */\n readonly newEventByDrag = output<AgendaEvent>();\n /**\n * Trigger when an event changed date (drag&drop or resize).\n */\n readonly changeEvent = output<AgendaEvent>();\n /**\n * Trigger when the view date of reference changed (because we moved inside the calendar).\n */\n readonly changeDate = output<Date>();\n /**\n * Trigger before the rendering of the week or day view.\n */\n readonly beforeWeekOrDayViewRenderEmitter = output<CalendarWeekViewBeforeRenderEvent>();\n /**\n * Trigger before the rendering of the month view.\n */\n readonly beforeMonthViewRenderEmitter = output<CalendarMonthViewBeforeRenderEvent>();\n\n CalendarView = CalendarView;\n Attendance = EventAttendance;\n viewDate = new Date();\n refresh = new Subject<void>();\n /**\n * @hide\n */\n locale: string;\n /**\n * @hide\n */\n weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n ngOnInit(): void {\n this.locale = this._translate.getCurrentLang();\n // in case of Italian locale the starting day for the week is monday (1), otherwise sunday (0)\n this.weekStartsOn = this.locale === 'it' ? 1 : 0;\n }\n isMobile(): boolean {\n return this._platform.is('mobile');\n }\n\n /**\n * Run some checks before the month view is rendered (e.g. disable invalid days).\n */\n beforeMonthViewRender(event: CalendarMonthViewBeforeRenderEvent): void {\n this.beforeMonthViewRenderEmitter.emit(event);\n const { body } = event;\n body.forEach(day => {\n if (!this.dateIsValid(day.date)) day.cssClass = 'cal-disabled';\n });\n }\n /**\n * Run some checks before the week/day view is rendered (e.g. disable invalid days).\n */\n beforeWeekOrDayViewRender(event: CalendarWeekViewBeforeRenderEvent): void {\n this.beforeWeekOrDayViewRenderEmitter.emit(event);\n const { header, hourColumns } = event;\n header.forEach(day => {\n if (!this.dateIsValid(day.date)) day.cssClass = 'cal-disabled';\n });\n hourColumns.forEach(hourCol => {\n hourCol.hours.forEach(hour => {\n hour.segments.forEach(segment => {\n if (!this.dateIsValid(segment.date)) segment.cssClass = 'cal-disabled';\n });\n });\n });\n }\n\n dateIsValid(date: any, sameDayIsValid?: boolean): boolean {\n if (!this.onlyFuture()) return true;\n return isFuture(date) || (sameDayIsValid ? isToday(date) : false);\n }\n\n setView(view: CalendarView): void {\n this.view = view;\n }\n\n viewDateChanged(newDate: Date): void {\n if (this.view === CalendarView.Month) this.activeDayIsOpen = false;\n this.changeDate.emit(newDate);\n }\n\n changeDay({ date, events }: { date: Date; events: AgendaEvent[] }): void {\n if (!this.dateIsValid(date, true)) return;\n if ((isSameDay(this.viewDate, date) && this.activeDayIsOpen === true) || !events || events.length === 0)\n this.activeDayIsOpen = false;\n else this.activeDayIsOpen = true;\n this.viewDate = date;\n }\n\n eventTimesChanged({ event, newStart, newEnd }: CalendarEventTimesChangedEvent): void {\n event.start = newStart;\n event.end = newEnd;\n this.events = this.events.slice();\n this.changeEvent.emit(event);\n }\n\n getAlternateColor(color: string, amount: number, opacity?: number): string | undefined {\n if (!color?.trim()) return undefined;\n const alt = ColorParse(color.trim());\n const r = Math.max(Math.min(255, Number(alt.values[0]) + amount), 0);\n const g = Math.max(Math.min(255, Number(alt.values[1]) + amount), 0);\n const b = Math.max(Math.min(255, Number(alt.values[2]) + amount), 0);\n return `rgba(${r}, ${g}, ${b}, ${opacity || 1})`;\n }\n\n getTooltipContent(event: AgendaEvent): string {\n if (!event) return '';\n let str = event.title ? '<b>' + event.title + '</b>' : '';\n if (event.target) str = str.concat('<br>', event.target);\n if (event.location) str = str.concat('<br>', event.location);\n if (event.description) {\n str = str.concat('<br>');\n str = str.concat('<br>', event.description);\n }\n if (event.icons) {\n str = str.concat('<br>');\n event.icons.forEach(x => (str = str.concat('<br>', '<i>', x.title, '</i>')));\n }\n if (event.avatars && event.avatars.length) {\n str = str.concat('<br><br>~');\n event.avatars.forEach(x => (str = str.concat('<br>', x.title)));\n }\n return str;\n }\n\n getPreviewDescription(description: string): string {\n return description && description.length > 100 ? description.slice(0, 100).concat('...') : description;\n }\n\n startDragToCreate(event: Event, segmentDate: Date, segmentElement: HTMLElement): void {\n if (!this.allowDragToCreate()) return;\n\n const parentContent = this.parentContent();\n if (parentContent) parentContent.scrollY = false;\n\n const eventByDragAndDrop: AgendaEvent = { ...this.newEventTemplate(), start: segmentDate };\n this.events = [...this.events, eventByDragAndDrop];\n\n const segmentPosition = segmentElement.getBoundingClientRect();\n const endOfView = endOfWeek(this.viewDate, { weekStartsOn: this.weekStartsOn });\n\n const whileDragging = (draggingEvent: Event): void => {\n const { clientY, clientX } =\n draggingEvent.type === 'touchmove' ? (draggingEvent as TouchEvent).touches[0] : (draggingEvent as MouseEvent);\n\n const minutesDiff = ceilToNearest(clientY - segmentPosition.top, 30);\n const daysDiff = floorToNearest(clientX - segmentPosition.left, segmentPosition.width) / segmentPosition.width;\n\n let newEnd: Date;\n if (this.allowDragToCreate() === DragToCreateOptions.ONLY_SAME_DAY) newEnd = addMinutes(segmentDate, minutesDiff);\n else newEnd = addDays(addMinutes(segmentDate, minutesDiff), daysDiff);\n\n if (newEnd > segmentDate && newEnd < endOfView) eventByDragAndDrop.end = newEnd;\n refreshView();\n };\n\n const endOfDrag = (): void => {\n const parentContentValue = this.parentContent();\n if (parentContentValue) parentContentValue.scrollY = true;\n eventByDragAndDrop.end = this.getFixedEndDateWithMinimumSegmentDuration(eventByDragAndDrop);\n refreshView();\n this.newEventByDrag.emit(eventByDragAndDrop);\n };\n\n const refreshView = (): void => {\n this.events = [...this.events];\n this._cdr.detectChanges();\n };\n\n if (event.type === 'touchstart') {\n fromEvent(document, 'touchmove')\n .pipe(finalize(endOfDrag), takeUntil(fromEvent(document, 'touchend')))\n .subscribe(whileDragging);\n } else {\n fromEvent(document, 'mousemove')\n .pipe(finalize(endOfDrag), takeUntil(fromEvent(document, 'mouseup')))\n .subscribe(whileDragging);\n }\n }\n private getFixedEndDateWithMinimumSegmentDuration(agendaBooking: AgendaEvent): Date {\n const fixedEnd = new Date(agendaBooking.end || agendaBooking.start);\n const segmentSizeInMinutes = 60 / this.hourSegments();\n if (fixedEnd.getTime() <= agendaBooking.start.getTime() + segmentSizeInMinutes * 60 * 1000)\n fixedEnd.setMinutes(agendaBooking.start.getMinutes() + segmentSizeInMinutes);\n return fixedEnd;\n }\n}\n\n/**\n * A richer version of the classic CalendarEvent.\n */\nexport interface AgendaEvent extends CalendarEvent {\n /**\n * A brief description for the event.\n */\n description?: string;\n /**\n * The customer/stakeholder/target of the event.\n */\n target?: string;\n /**\n * The location of the event.\n */\n location?: string;\n /**\n * A list of URLs of images to show as small avatars.\n */\n avatars?: { id: string; url: string; title: string }[];\n /**\n * A list of ion-icons to show.\n */\n icons?: { name: string; title: string }[];\n /**\n * The colors of the event displayed.\n */\n color?: { primary: string; secondary?: string } | any;\n /**\n * Whether the event is external; external events are less important UI-wise.\n */\n external?: boolean;\n /**\n * The attendance status to this event, if any.\n */\n attendance?: EventAttendance;\n /**\n * A standard and unique id for the event, valid across multiple sources.\n */\n iCalUID?: string;\n}\n\n/**\n * Possible attendance statuses for the event.\n */\nexport enum EventAttendance {\n DECLINED = -1,\n NEEDS_ACTION = 0,\n TENTATIVE,\n ACCEPTED\n}\n\n/**\n * The options to allow (or not) drag&drop to create a new event.\n */\nexport enum DragToCreateOptions {\n DISABLED = 0,\n ONLY_SAME_DAY = 1,\n FREE = 2\n}\n\nconst floorToNearest = (amount: number, precision: number): number => Math.floor(amount / precision) * precision;\nconst ceilToNearest = (amount: number, precision: number): number => Math.ceil(amount / precision) * precision;\n","<div class=\"agenda\">\n <!-- TOOLBAR -->\n <ion-row class=\"ion-align-items-center\">\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"5\"\n [sizeSm]=\"3\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n @if (allowedViews.length > 1) {\n <ion-item lines=\"none\" class=\"calendarViewSelector\">\n <ion-select\n interface=\"popover\"\n [value]=\"view\"\n (ionChange)=\"$event?.detail ? setView($event.detail.value) : null\"\n >\n @for (view of allowedViews; track view) {\n <ion-select-option [value]=\"view\">\n {{ 'IDEA_AGENDA.' + view | uppercase | translate }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n }\n </ion-col>\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"7\"\n [sizeSm]=\"4\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarPreviousView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarToday\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"today-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarNextView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-forward-outline\" slot=\"icon-only\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-align-self-center titleCol\" [size]=\"12\" [sizeSm]=\"5\" [pullSm]=\"7\" [sizeLg]=\"8\" [pullLg]=\"4\">\n <h2>{{ viewDate | calendarDate: view + 'ViewTitle' : locale }}</h2>\n @if (titleNotes) {\n <p>{{ titleNotes }}</p>\n }\n </ion-col>\n </ion-row>\n <!-- TEMPLATES (touch only what's necessary and leave everything else as it is) -->\n <ng-template #eventTitleTemplate let-event=\"event\" let-view=\"view\">\n <span\n class=\"cal-event-title\"\n [class.noWrap]=\"event.allDay\"\n [attr.aria-hidden]=\"{} | calendarA11y: 'hideEventTitle'\"\n >\n {{ event.title | calendarEventTitle: view : event }}\n @if (event.target) {\n <p>{{ event.target }}</p>\n } @else {\n @if (event.location) {\n <p>{{ event.location }}</p>\n }\n }\n @if (!event.allDay) {\n <p>{{ getPreviewDescription(event.description) }}</p>\n }\n </span>\n </ng-template>\n <ng-template\n #eventTemplate\n let-weekEvent=\"weekEvent\"\n let-tooltipPlacement=\"tooltipPlacement\"\n let-eventClicked=\"eventClicked\"\n let-tooltipTemplate=\"tooltipTemplate\"\n let-tooltipAppendToBody=\"tooltipAppendToBody\"\n let-tooltipDisabled=\"tooltipDisabled\"\n let-tooltipDelay=\"tooltipDelay\"\n let-column=\"column\"\n let-daysInWeek=\"daysInWeek\"\n >\n <div\n class=\"cal-event\"\n [class.external]=\"weekEvent.event.external\"\n [class.allDay]=\"weekEvent.event.allDay\"\n [class.needsAction]=\"Attendance.NEEDS_ACTION === weekEvent.event.attendance\"\n [class.declined]=\"Attendance.DECLINED === weekEvent.event.attendance\"\n [class.tentative]=\"Attendance.TENTATIVE === weekEvent.event.attendance\"\n [style.border-left-color]=\"weekEvent.event.color?.primary\"\n [style.color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 80 : -40)\"\n [style.background-color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 60 : 80, 0.2)\"\n [mwlCalendarTooltip]=\"!tooltipDisabled && !isMobile() ? getTooltipContent(weekEvent.event) : ''\"\n [tooltipPlacement]=\"tooltipPlacement\"\n [tooltipEvent]=\"weekEvent.tempEvent || weekEvent.event\"\n [tooltipTemplate]=\"tooltipTemplate\"\n [tooltipAppendToBody]=\"tooltipAppendToBody\"\n [tooltipDelay]=\"tooltipDelay\"\n (mwlClick)=\"eventClicked.emit({ sourceEvent: $event })\"\n (mwlKeydownEnter)=\"eventClicked.emit({ sourceEvent: $event })\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"\n { event: weekEvent.tempEvent || weekEvent.event, locale: locale } | calendarA11y: 'eventDescription'\n \"\n >\n <mwl-calendar-event-actions [event]=\"weekEvent.tempEvent || weekEvent.event\" />\n &ngsp;\n <mwl-calendar-event-title\n [event]=\"weekEvent.tempEvent || weekEvent.event\"\n [customTemplate]=\"eventTitleTemplate\"\n [view]=\"daysInWeek === 1 ? 'day' : 'week'\"\n >\n </mwl-calendar-event-title>\n @if (!weekEvent.event.allDay) {\n <div class=\"eventGadgets\">\n @for (icon of weekEvent.event.icons; track icon) {\n <ion-icon [name]=\"icon.name\" [title]=\"icon.title\" />\n }\n @for (avatar of weekEvent.event.avatars; track avatar) {\n <idea-user-avatar size=\"mini\" [src]=\"avatar.url\" [name]=\"avatar.title\" />\n }\n </div>\n }\n </div>\n </ng-template>\n <ng-template\n #hourSegmentTemplate\n let-segment=\"segment\"\n let-locale=\"locale\"\n let-segmentHeight=\"segmentHeight\"\n let-isTimeLabel=\"isTimeLabel\"\n >\n <div\n #segmentElement\n class=\"cal-hour-segment\"\n [style.height.px]=\"segmentHeight\"\n [class.cal-hour-start]=\"segment.isStart\"\n [class.cal-after-hour-start]=\"!segment.isStart\"\n [ngClass]=\"segment.cssClass\"\n (mousedown)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n (touchstart)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n >\n @if (isTimeLabel) {\n <div class=\"cal-time\">\n {{ segment.date | calendarDate: 'weekViewHour' : locale }}\n </div>\n }\n </div>\n </ng-template>\n <!-- VIEWS -->\n <div>\n @switch (view) {\n @case (CalendarView.Month) {\n <mwl-calendar-month-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [activeDayIsOpen]=\"activeDayIsOpen\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [eventTitleTemplate]=\"eventTitleTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayClicked)=\"changeDay($event.day)\"\n (beforeViewRender)=\"beforeMonthViewRender($event)\"\n >\n </mwl-calendar-month-view>\n }\n @case (CalendarView.Week) {\n <mwl-calendar-week-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayHeaderClicked)=\"dateIsValid($event.day.date) ? selectDay.emit($event.day.date) : null\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-week-view>\n }\n @case (CalendarView.Day) {\n <mwl-calendar-day-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-day-view>\n }\n }\n </div>\n</div>\n","import { Injectable, inject } from '@angular/core';\nimport { AlertController, ModalController } from '@ionic/angular/standalone';\nimport { Browser } from '@capacitor/browser';\nimport { Calendar, ExternalCalendarSources, Suggestion } from 'idea-toolbox';\nimport {\n IDEAEnvironment,\n IDEALoadingService,\n IDEATranslationsService,\n IDEASuggestionsComponent\n} from '@idea-ionic/common';\nimport { IDEAAWSAPIService } from '@idea-ionic/uncommon';\n\n/**\n * Note: to test locally, you need to temporarily change the redirect URI:\n * - in the lambda `idea_calendars`, e.g. `SCARLETT_URL`;\n * - in the client config file: `APP_URL`.\n * In both cases, the value should be set to `http://localhost:8100` (or according to the local URL).\n */\n@Injectable()\nexport class IDEACalendarsService {\n protected _env = inject(IDEAEnvironment);\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _loading = inject(IDEALoadingService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * Get the ion-icon of an external service from its name.\n */\n getServiceIcon(service: ExternalCalendarSources | string): string {\n switch (service) {\n case ExternalCalendarSources.GOOGLE:\n return 'logo-google';\n case ExternalCalendarSources.MICROSOFT:\n return 'logo-windows';\n default:\n return 'help';\n }\n }\n /**\n * Get the base URL for API request (shared/private calendar).\n */\n getRequestURL(calendar: Calendar): string {\n return (calendar.teamId ? `teams/${calendar.teamId}/` : '').concat('calendars');\n }\n\n /**\n * Create a new calendar.\n */\n async postCalendar(cal: Calendar): Promise<Calendar> {\n const calendar = await this._API.postResource(this.getRequestURL(cal), { idea: true, body: cal });\n return new Calendar(calendar);\n }\n /**\n * Update an existing calendar.\n */\n async putCalendar(cal: Calendar): Promise<Calendar> {\n const body = { idea: true, resourceId: cal.calendarId, body: cal };\n const calendar = await this._API.putResource(this.getRequestURL(cal), body);\n return new Calendar(calendar);\n }\n /**\n * Delete a calendar.\n */\n async deleteCalendar(cal: Calendar): Promise<void> {\n await this._API.deleteResource(this.getRequestURL(cal), { idea: true, resourceId: cal.calendarId });\n }\n /**\n * Associate an external calendar with the given calendar.\n */\n async setExternalCalendar(cal: Calendar, externalId: string): Promise<Calendar> {\n const body = { idea: true, resourceId: cal.calendarId, body: { action: 'SET_EXTERNAL_CALENDAR', externalId } };\n const calendar = await this._API.patchResource(this.getRequestURL(cal), body);\n return new Calendar(calendar);\n }\n\n /**\n * Link the calendar with the chosen external service (auth flow).\n */\n async linkExtService(cal: Calendar, baseURL: string): Promise<void> {\n if (!cal.external) throw new Error('NOT_EXTERNAL');\n if (!baseURL) baseURL = window.location.protocol.concat('//', window.location.hostname);\n let url: string;\n switch (cal.external.service) {\n case ExternalCalendarSources.GOOGLE:\n url =\n 'https://accounts.google.com/o/oauth2/v2/auth?' +\n `client_id=${encodeURIComponent(this._env.google.apiClientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/google-calendars-integration'))}` +\n '&include_granted_scopes=true' +\n '&access_type=offline&prompt=consent' +\n `&scope=${encodeURIComponent(this._env.google.apiScope)}` +\n `&state=${encodeURIComponent(cal.calendarId)}`;\n break;\n case ExternalCalendarSources.MICROSOFT:\n url =\n 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?' +\n `client_id=${encodeURIComponent(this._env.microsoft.apiClientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/microsoft-calendars-integration'))}` +\n '&response_mode=query' +\n `&scope=${encodeURIComponent(this._env.microsoft.apiScope)}` +\n `&state=${encodeURIComponent(cal.calendarId)}`;\n break;\n }\n if (!url) throw new Error('INVALID_SERVICE');\n await Browser.open({ url });\n // since we don't know when/if the auth flow will finish, we wait\n await this.showAlertLinkingCalendar();\n }\n private async showAlertLinkingCalendar(): Promise<void> {\n return new Promise(async resolve => {\n const header = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR_CONFIRM_ONCE_DONE');\n const buttons = [{ text: this._translate._('COMMON.DONE'), handler: resolve }];\n const alert = await this._alert.create({ header, message, buttons, backdropDismiss: false });\n alert.present();\n });\n }\n\n /**\n * Get the external calendars list of the external service.\n */\n async getExternalCalendars(cal: Calendar): Promise<ExtCalendar[]> {\n if (!cal.external) throw new Error('NOT_EXTERNAL');\n // get the access token to make requests; in case it fails, proceed to link the external service\n const body = { idea: true, resourceId: cal.calendarId, body: { action: 'GET_ACCESS_TOKEN' } };\n const result = await this._API.patchResource(this.getRequestURL(cal), body);\n const headers = { Authorization: 'Bearer '.concat(result.token) };\n if (cal.external.service === ExternalCalendarSources.GOOGLE) {\n const res = await (\n await fetch('https://www.googleapis.com/calendar/v3/users/me/calendarList', { headers })\n ).json();\n return res.items.map((c: any): ExtCalendar => ({ name: c.summary, id: c.id }) as ExtCalendar);\n } else if (cal.external.service === ExternalCalendarSources.MICROSOFT) {\n const res = await (await fetch('https://graph.microsoft.com/v1.0/me/calendars', { headers })).json();\n return res.value.map((c: any): ExtCalendar => ({ name: c.name, id: c.id }) as ExtCalendar);\n }\n }\n\n /**\n * If the external service is linked, choose an external calendar and set it for the chosen calendar.\n * @return the updated calendar.\n */\n async chooseAndSetExternalCalendar(cal: Calendar): Promise<Calendar> {\n const extCalId = await this.openModalAndPickExternalCalendar(cal);\n if (!extCalId) return;\n return await this.setExternalCalendar(cal, extCalId);\n }\n /**\n * Open the modal to pick a calendar from the external service.\n * @return the id of the external calendar.\n */\n private async openModalAndPickExternalCalendar(cal: Calendar): Promise<string> {\n let extCals: ExtCalendar[];\n try {\n await this._loading.show();\n extCals = await this.getExternalCalendars(cal);\n if (!extCals.length) throw new Error('NO_EXTERNAL_CALENDARS');\n } catch (error) {\n throw error;\n } finally {\n this._loading.hide();\n }\n const modal = await this._modal.create({\n component: IDEASuggestionsComponent,\n componentProps: {\n data: extCals.map(c => new Suggestion({ value: c.id, name: c.name })),\n searchPlaceholder: this._translate._('IDEA_AGENDA.CALENDARS.CHOOSE_AN_EXTERNAL_CALENDAR_TO_LINK'),\n sortData: true,\n hideIdFromUI: true,\n hideClearButton: true,\n mustChoose: true\n },\n backdropDismiss: false\n });\n modal.present();\n const res = await modal.onDidDismiss();\n return res.data ? res.data.value : null;\n }\n\n /**\n * First sync of the extenal calendar.\n */\n syncCalendar(cal: Calendar): Promise<void> {\n return new Promise((resolve, reject): void => this.syncCalendarHelper(cal, err => (err ? reject(err) : resolve())));\n }\n /**\n * Helper to recursively sync an the extenal calendar.\n */\n private syncCalendarHelper(cal: Calendar, done: (err?: Error) => void): void {\n // this is a recursive operation: the API returns if the sync has to continue or it finished\n this._API\n .patchResource(this.getRequestURL(cal), {\n idea: true,\n resourceId: cal.calendarId,\n body: { action: 'SYNC_EXTERNAL_CALENDAR', firstSync: true }\n })\n .then((res: any): void => {\n if (res.moreData) this.syncCalendarHelper(cal, done);\n else done();\n })\n .catch(err => done(err));\n }\n}\n\n/**\n * Helper structure to define external services' calendars (basic info).\n */\ninterface ExtCalendar {\n id: string;\n name: string;\n}\n","import { Component, Input, OnInit, inject, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { ModalController, AlertController } from '@ionic/angular/standalone';\nimport { Calendar, Check, Membership } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\nimport { IDEAAWSAPIService, IDEATinCanService } from '@idea-ionic/uncommon';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n // eslint-disable-next-line\n standalone: false,\n selector: 'idea-calendar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'calendar.component.html',\n styleUrls: ['calendar.component.scss']\n})\nexport class IDEACalendarComponent implements OnInit {\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _tc = inject(IDEATinCanService);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n _calendars = inject(IDEACalendarsService);\n private _cdr = inject(ChangeDetectorRef);\n\n /**\n * The calendar to manage.\n */\n @Input() calendar?: Calendar;\n /**\n * Whether we want to enable advanced permissions (based on the memberships) on the calendar.\n */\n @Input() advancedPermissions?: boolean;\n /**\n * Whether the calendar color is an important detail or it shouldn't be shown.\n */\n @Input() hideColor?: boolean;\n\n calendarWC: Calendar;\n membershipsChecks: Check[];\n membership: Membership;\n errors = new Set<string>();\n DEFAULT_COLOR = '#555';\n\n async ngOnInit(): Promise<void> {\n this.membership = this._tc.get('membership');\n this.calendarWC = new Calendar(this.calendar);\n try {\n const memberships: Membership[] = await this._API.getResource(`teams/${this.membership.teamId}/memberships`);\n this.membershipsChecks = memberships.map(\n m =>\n new Check({\n value: m.userId,\n name: m.name,\n checked: (this.calendarWC.usersCanManageAppointments || []).some(x => x === m.userId)\n })\n );\n this._cdr.markForCheck();\n } catch (error) {\n this._message.error('COMMON.COULDNT_LOAD_LIST');\n }\n }\n\n hasFieldAnError(field: string): boolean {\n return this.errors.has(field);\n }\n\n async save(): Promise<void> {\n if (!this.calendarWC.color) this.calendarWC.color = this.DEFAULT_COLOR;\n if (this.calendarWC.isShared() && this.advancedPermissions)\n this.calendarWC.usersCanManageAppointments = this.membershipsChecks\n .filter(x => x.checked)\n .map(x => String(x.value));\n else delete this.calendarWC.usersCanManageAppointments;\n\n this.errors = new Set(this.calendarWC.validate());\n if (this.errors.size) return this._message.error('COMMON.FORM_HAS_ERROR_TO_CHECK');\n\n try {\n await this._loading.show();\n const res = await this._calendars.putCalendar(this.calendarWC);\n this.calendar.load(res);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_SAVED');\n this._modal.dismiss(this.calendar);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n }\n\n async delete(): Promise<void> {\n const doDelete = async (): Promise<void> => {\n try {\n await this._loading.show();\n await this._calendars.deleteCalendar(this.calendarWC);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_DELETED');\n this._modal.dismiss(true);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n };\n\n const header = this._translate._('COMMON.ARE_YOU_SURE');\n const subHeader = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT');\n const buttons = [\n { text: this._translate._('COMMON.CANCEL'), role: 'cancel' },\n { text: this._translate._('COMMON.DELETE'), handler: doDelete }\n ];\n const alert = await this._alert.create({ header, subHeader, message, buttons });\n alert.present();\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n","<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","import { Component, Input, inject, ChangeDetectionStrategy, output, input } from '@angular/core';\nimport { AlertController, ModalController } from '@ionic/angular/standalone';\nimport { Calendar } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEACalendarComponent } from './calendar.component';\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n // eslint-disable-next-line\n standalone: false,\n selector: 'idea-calendar-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'calendarItem.component.html',\n styleUrls: ['calendarItem.component.scss']\n})\nexport class IDEACalendarItemComponent {\n private _alert = inject(AlertController);\n private _modal = inject(ModalController);\n private _message = inject(IDEAMessageService);\n private _loading = inject(IDEALoadingService);\n private _translate = inject(IDEATranslationsService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * The calendar to show.\n */\n // TODO: Skipped for migration because:\n // Your application code writes to the input. This prevents migration.\n @Input() calendar: Calendar;\n /**\n * Whether the component is disabled.\n */\n readonly disabled = input<boolean>();\n /**\n * Whether we want to enable advanced permissions (based on the memberships) on the calendar.\n */\n readonly advancedPermissions = input<boolean>();\n /**\n * Whether the calendar color is an important detail or it shouldn't be shown.\n */\n readonly hideColor = input<boolean>();\n /**\n * The URL to be used on the redirect calls.\n */\n readonly baseURL = input<string>();\n /**\n * Report to parent components a change.\n */\n readonly somethingChanged = output<Calendar>();\n\n async manageCalendar(): Promise<void> {\n if (this.disabled()) return;\n const modal = await this._modal.create({\n component: IDEACalendarComponent,\n componentProps: {\n calendar: this.calendar,\n advancedPermissions: this.advancedPermissions(),\n hideColor: this.hideColor()\n }\n });\n modal.onDidDismiss().then(res => {\n const cal = res.data;\n if (cal === undefined) return;\n else if (cal === null) this.calendar = null;\n else this.calendar.load(cal);\n this.somethingChanged.emit(this.calendar);\n });\n modal.present();\n }\n\n async linkExtCalendarOrDelete(): Promise<void> {\n if (this.disabled()) return;\n try {\n const cal = await this._calendars.chooseAndSetExternalCalendar(this.calendar);\n if (!cal) throw new Error('NO_EXTERNAL_CALENDAR_CHOSEN');\n this.calendar.load(cal);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_LINKED');\n try {\n await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));\n await this._calendars.syncCalendar(this.calendar);\n this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n this.somethingChanged.emit(this.calendar);\n }\n } catch (error) {\n const doDelete = async (): Promise<void> => {\n try {\n await this._loading.show();\n await this._calendars.deleteCalendar(this.calendar);\n this._message.success('COMMON.OPERATION_COMPLETED');\n this.somethingChanged.emit(this.calendar);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n };\n const doLink = async (): Promise<void> => {\n try {\n await this._calendars.linkExtService(this.calendar, this.baseURL());\n this.linkExtCalendarOrDelete();\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n }\n };\n const header = this._translate._('IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.DO_YOU_WANT_PROCEED_LINKING_OR_DELETE');\n const buttons = [\n { text: this._translate._('COMMON.DELETE'), handler: doDelete },\n { text: this._translate._('IDEA_AGENDA.CALENDARS.LINK'), handler: doLink }\n ];\n const alert = await this._alert.create({ header, message, buttons });\n alert.present();\n }\n }\n}\n","@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","import { Component, OnInit, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { ModalController } from '@ionic/angular/standalone';\nimport { Calendar, ExternalCalendarInfo, ExternalCalendarSources, Membership, Team } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\nimport { IDEATinCanService } from '@idea-ionic/uncommon';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n // eslint-disable-next-line\n standalone: false,\n selector: 'idea-calendar-creation',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'calendarCreation.component.html',\n styleUrls: ['calendarCreation.component.scss']\n})\nexport class IDEACalendarCreationComponent implements OnInit {\n private _modal = inject(ModalController);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _translate = inject(IDEATranslationsService);\n private _tc = inject(IDEATinCanService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * Whether we want to allow the creation of only a particular type of calendar, based on the scope.\n */\n readonly fixScope = input<CalendarScopes>();\n /**\n * Whether we want to allow the creation of local calendars.\n */\n readonly onlyExternalCalendars = input<boolean>();\n /**\n * The URL to be used on the redirect calls.\n */\n readonly baseURL = input<string>();\n\n team: Team;\n membership: Membership;\n calendar: Calendar;\n DEFAULT_COLOR = '#555';\n SOURCES = Object.keys(ExternalCalendarSources);\n\n ngOnInit(): void {\n this.calendar = new Calendar();\n this.team = this._tc.get('team');\n this.membership = this._tc.get('membership');\n const fixScope = this.fixScope();\n if (fixScope === CalendarScopes.SHARED) this.calendar.teamId = this.team.teamId;\n if (fixScope === CalendarScopes.PRIVATE) this.calendar.userId = this.membership.userId;\n }\n\n resetScope(): void {\n if (this.canChangeScope()) this.calendar.teamId = this.calendar.userId = null;\n }\n canChangeScope(): boolean {\n return !this.fixScope() && this.scopeIsSet();\n }\n scopeIsSet(): boolean {\n return Boolean(this.calendar.userId) || Boolean(this.calendar.teamId);\n }\n\n async saveNewCalendar(service?: ExternalCalendarSources | string): Promise<void> {\n if (!this.scopeIsSet()) return;\n if (!service && this.onlyExternalCalendars()) return;\n if (service) {\n this.calendar.external = new ExternalCalendarInfo({ service });\n this.calendar.name = '-'; // it will be substituted with the external name\n } else {\n this.calendar.name = this.calendar.userId\n ? this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_PERSONAL_CALENDAR_NAME')\n : this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_TEAM_CALENDAR_NAME');\n this.calendar.color = this.DEFAULT_COLOR;\n }\n try {\n await this._loading.show();\n const cal = await this._calendars.postCalendar(this.calendar);\n this.calendar.load(cal);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_CREATED');\n if (!cal.external) {\n await this._modal.dismiss(this.calendar);\n return;\n }\n try {\n await this._loading.hide();\n await this._calendars.linkExtService(this.calendar, this.baseURL());\n const res = await this._calendars.chooseAndSetExternalCalendar(this.calendar);\n if (!res) {\n await this._modal.dismiss(this.calendar);\n return;\n }\n this.calendar.load(res);\n try {\n await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));\n await this._calendars.syncCalendar(this.calendar);\n await this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n await this._modal.dismiss(this.calendar);\n }\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n await this._modal.dismiss(this.calendar);\n }\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n await this._loading.hide();\n }\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n\n/**\n * The possible scopes of the calendar.\n */\nexport enum CalendarScopes {\n SHARED = 'shared', // teamId\n PRIVATE = 'private' // userId\n}\n","<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","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { IonicModule } from '@ionic/angular';\n\nimport { CalendarDateFormatter, CalendarModule, DateAdapter } from 'angular-calendar';\nimport { adapterFactory } from 'angular-calendar/date-adapters/date-fns';\nimport { CustomDateFormatter } from './dateFormatter.provider';\n\nimport { IDEACheckerComponent, IDEATranslationsModule, IDEAUserAvatarComponent } from '@idea-ionic/common';\nimport { IDEAColorPickerComponent } from '@idea-ionic/uncommon';\n\nimport { IDEAAgendaComponent } from './agenda.component';\nimport { IDEACalendarComponent } from './calendar.component';\nimport { IDEACalendarItemComponent } from './calendarItem.component';\nimport { IDEACalendarCreationComponent } from './calendarCreation.component';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n IonicModule,\n IDEATranslationsModule,\n IDEAColorPickerComponent,\n IDEACheckerComponent,\n IDEAUserAvatarComponent,\n CalendarModule.forRoot({ provide: DateAdapter, useFactory: adapterFactory })\n ],\n declarations: [IDEAAgendaComponent, IDEACalendarComponent, IDEACalendarItemComponent, IDEACalendarCreationComponent],\n exports: [IDEAAgendaComponent, IDEACalendarComponent, IDEACalendarItemComponent, IDEACalendarCreationComponent],\n providers: [{ provide: CalendarDateFormatter, useClass: CustomDateFormatter }, IDEACalendarsService]\n})\nexport class IDEAAgendaModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i4","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"idea-ionic-agenda.mjs","sources":["../../../modules/agenda/src/dateFormatter.provider.ts","../../../modules/agenda/src/agenda.component.ts","../../../modules/agenda/src/agenda.component.html","../../../modules/agenda/src/calendars.service.ts","../../../modules/agenda/src/calendar.component.ts","../../../modules/agenda/src/calendar.component.html","../../../modules/agenda/src/calendarItem.component.ts","../../../modules/agenda/src/calendarItem.component.html","../../../modules/agenda/src/calendarCreation.component.ts","../../../modules/agenda/src/calendarCreation.component.html","../../../modules/agenda/src/agenda.module.ts","../../../modules/agenda/idea-ionic-agenda.ts"],"sourcesContent":["import { formatDate } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport { CalendarDateFormatter, DateFormatterParams } from 'angular-calendar';\n\n@Injectable()\nexport class CustomDateFormatter extends CalendarDateFormatter {\n // MONTH VIEW\n monthViewColumnHeader = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'EEE', locale);\n monthViewTitle = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'MMMM y', locale);\n\n // WEEK VIEW\n weekViewHour = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'HH:mm', locale) : formatDate(date, 'h aa', locale);\n weekViewColumnHeader = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'EEE', locale);\n weekViewTitle = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'MMMM yyyy', locale);\n\n // DAY VIEW\n dayViewHour = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'HH:mm', locale) : formatDate(date, 'h aa', locale);\n dayViewTitle = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'EEEE, dd MMM yyyy', locale) : formatDate(date, 'EEEE, MMM dd, yyyy', locale);\n}\n","import { Component, ChangeDetectionStrategy, Input, OnInit, inject, output, input, model } from '@angular/core';\nimport { IonContent, Platform } from '@ionic/angular/standalone';\nimport { finalize, fromEvent, Subject, takeUntil } from 'rxjs';\nimport {\n CalendarEvent,\n CalendarEventTimesChangedEvent,\n CalendarMonthViewBeforeRenderEvent,\n CalendarView,\n CalendarWeekViewBeforeRenderEvent\n} from 'angular-calendar';\nimport { isFuture, isToday, isSameDay, endOfWeek, addDays, addMinutes } from 'date-fns';\n// @ts-ignore\nimport ColorParse from 'color-parse';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\n@Component({\n // eslint-disable-next-line\n standalone: false,\n selector: 'idea-agenda',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'agenda.component.html',\n styleUrls: ['agenda.component.scss']\n})\nexport class IDEAAgendaComponent implements OnInit {\n private _platform = inject(Platform);\n _translate = inject(IDEATranslationsService);\n\n /**\n * The events to display in the calendar.\n */\n readonly events = model<AgendaEvent[]>([]);\n /**\n * An array of day indexes (0 = sunday, 1 = monday, etc.) that will be hidden on the view.\n */\n readonly excludeDays = input<number[]>([]);\n /**\n * The day start hours in 24 hour time. Must be 0-23\n */\n readonly dayStartHour = input(0);\n /**\n * The day start hours in 24 hour time. Must be 0-23\n */\n readonly dayEndHour = input(23);\n /**\n * The number of segments in an hour. Must divide equally into 60.\n */\n readonly hourSegments = input(2);\n /**\n * Whether to open the current day's details right away in month view.\n */\n @Input() activeDayIsOpen = false;\n /**\n * The view mode for the agenda.\n */\n @Input() view: CalendarView = CalendarView.Week;\n /**\n * The allowed view mode for the agenda.\n */\n @Input() allowedViews = [CalendarView.Day, CalendarView.Week, CalendarView.Month];\n /**\n * Whether to block any day/slot in the past.\n */\n readonly onlyFuture = input(false);\n /**\n * Some notes to show underneath the calendar's header.\n */\n @Input() titleNotes: string;\n /**\n * The template for new events created by drag&drop.\n */\n readonly newEventTemplate = input<AgendaEvent>({ title: 'New', start: null, meta: {} });\n /**\n * Whether (and how) to allow the creation of events by drag&drop.\n * If enabled, on mobile it requires the `parentContent` to be set for a correct execution.\n */\n readonly allowDragToCreate = input<DragToCreateOptions>(DragToCreateOptions.DISABLED);\n /**\n * The parent ion-content, in case we want to control its scrollability for drag&drop features.\n */\n readonly parentContent = input<IonContent>();\n /**\n * Trigger when an event is selected.\n */\n readonly selectEvent = output<AgendaEvent>();\n /**\n * Trigger when a day is selected.\n */\n readonly selectDay = output<Date>();\n /**\n * Trigger when a time slot is selected.\n */\n readonly selectSlot = output<Date>();\n /**\n * Trigger when a new event is added by drag and drop.\n */\n readonly newEventByDrag = output<AgendaEvent>();\n /**\n * Trigger when an event changed date (drag&drop or resize).\n */\n readonly changeEvent = output<AgendaEvent>();\n /**\n * Trigger when the view date of reference changed (because we moved inside the calendar).\n */\n readonly changeDate = output<Date>();\n /**\n * Trigger before the rendering of the week or day view.\n */\n readonly beforeWeekOrDayViewRenderEmitter = output<CalendarWeekViewBeforeRenderEvent>();\n /**\n * Trigger before the rendering of the month view.\n */\n readonly beforeMonthViewRenderEmitter = output<CalendarMonthViewBeforeRenderEvent>();\n\n CalendarView = CalendarView;\n Attendance = EventAttendance;\n viewDate = new Date();\n refresh = new Subject<void>();\n /**\n * @hide\n */\n locale: string;\n /**\n * @hide\n */\n weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n ngOnInit(): void {\n this.locale = this._translate.getCurrentLang();\n // in case of Italian locale the starting day for the week is monday (1), otherwise sunday (0)\n this.weekStartsOn = this.locale === 'it' ? 1 : 0;\n }\n isMobile(): boolean {\n return this._platform.is('mobile');\n }\n\n /**\n * Run some checks before the month view is rendered (e.g. disable invalid days).\n */\n beforeMonthViewRender(event: CalendarMonthViewBeforeRenderEvent): void {\n this.beforeMonthViewRenderEmitter.emit(event);\n const { body } = event;\n body.forEach(day => {\n if (!this.dateIsValid(day.date)) day.cssClass = 'cal-disabled';\n });\n }\n /**\n * Run some checks before the week/day view is rendered (e.g. disable invalid days).\n */\n beforeWeekOrDayViewRender(event: CalendarWeekViewBeforeRenderEvent): void {\n this.beforeWeekOrDayViewRenderEmitter.emit(event);\n const { header, hourColumns } = event;\n header.forEach(day => {\n if (!this.dateIsValid(day.date)) day.cssClass = 'cal-disabled';\n });\n hourColumns.forEach(hourCol => {\n hourCol.hours.forEach(hour => {\n hour.segments.forEach(segment => {\n if (!this.dateIsValid(segment.date)) segment.cssClass = 'cal-disabled';\n });\n });\n });\n }\n\n dateIsValid(date: any, sameDayIsValid?: boolean): boolean {\n if (!this.onlyFuture()) return true;\n return isFuture(date) || (sameDayIsValid ? isToday(date) : false);\n }\n\n setView(view: CalendarView): void {\n this.view = view;\n }\n\n viewDateChanged(newDate: Date): void {\n if (this.view === CalendarView.Month) this.activeDayIsOpen = false;\n this.changeDate.emit(newDate);\n }\n\n changeDay({ date, events }: { date: Date; events: AgendaEvent[] }): void {\n if (!this.dateIsValid(date, true)) return;\n if ((isSameDay(this.viewDate, date) && this.activeDayIsOpen === true) || !events || events.length === 0)\n this.activeDayIsOpen = false;\n else this.activeDayIsOpen = true;\n this.viewDate = date;\n }\n\n eventTimesChanged({ event, newStart, newEnd }: CalendarEventTimesChangedEvent): void {\n event.start = newStart;\n event.end = newEnd;\n this.events.set(this.events().slice());\n this.changeEvent.emit(event);\n }\n\n getAlternateColor(color: string, amount: number, opacity?: number): string | undefined {\n if (!color?.trim()) return undefined;\n const alt = ColorParse(color.trim());\n const r = Math.max(Math.min(255, Number(alt.values[0]) + amount), 0);\n const g = Math.max(Math.min(255, Number(alt.values[1]) + amount), 0);\n const b = Math.max(Math.min(255, Number(alt.values[2]) + amount), 0);\n return `rgba(${r}, ${g}, ${b}, ${opacity || 1})`;\n }\n\n getTooltipContent(event: AgendaEvent): string {\n if (!event) return '';\n let str = event.title ? '<b>' + event.title + '</b>' : '';\n if (event.target) str = str.concat('<br>', event.target);\n if (event.location) str = str.concat('<br>', event.location);\n if (event.description) {\n str = str.concat('<br>');\n str = str.concat('<br>', event.description);\n }\n if (event.icons) {\n str = str.concat('<br>');\n event.icons.forEach(x => (str = str.concat('<br>', '<i>', x.title, '</i>')));\n }\n if (event.avatars && event.avatars.length) {\n str = str.concat('<br><br>~');\n event.avatars.forEach(x => (str = str.concat('<br>', x.title)));\n }\n return str;\n }\n\n getPreviewDescription(description: string): string {\n return description && description.length > 100 ? description.slice(0, 100).concat('...') : description;\n }\n\n startDragToCreate(event: Event, segmentDate: Date, segmentElement: HTMLElement): void {\n if (!this.allowDragToCreate()) return;\n\n const parentContent = this.parentContent();\n if (parentContent) parentContent.scrollY = false;\n\n const eventByDragAndDrop: AgendaEvent = { ...this.newEventTemplate(), start: segmentDate };\n this.events.set([...this.events(), eventByDragAndDrop]);\n\n const segmentPosition = segmentElement.getBoundingClientRect();\n const endOfView = endOfWeek(this.viewDate, { weekStartsOn: this.weekStartsOn });\n\n const whileDragging = (draggingEvent: Event): void => {\n const { clientY, clientX } =\n draggingEvent.type === 'touchmove' ? (draggingEvent as TouchEvent).touches[0] : (draggingEvent as MouseEvent);\n\n const minutesDiff = ceilToNearest(clientY - segmentPosition.top, 30);\n const daysDiff = floorToNearest(clientX - segmentPosition.left, segmentPosition.width) / segmentPosition.width;\n\n let newEnd: Date;\n if (this.allowDragToCreate() === DragToCreateOptions.ONLY_SAME_DAY) newEnd = addMinutes(segmentDate, minutesDiff);\n else newEnd = addDays(addMinutes(segmentDate, minutesDiff), daysDiff);\n\n if (newEnd > segmentDate && newEnd < endOfView) eventByDragAndDrop.end = newEnd;\n refreshView();\n };\n\n const endOfDrag = (): void => {\n const parentContentValue = this.parentContent();\n if (parentContentValue) parentContentValue.scrollY = true;\n eventByDragAndDrop.end = this.getFixedEndDateWithMinimumSegmentDuration(eventByDragAndDrop);\n refreshView();\n this.newEventByDrag.emit(eventByDragAndDrop);\n };\n\n const refreshView = (): void => {\n this.events.set([...this.events()]);\n };\n\n if (event.type === 'touchstart') {\n fromEvent(document, 'touchmove')\n .pipe(finalize(endOfDrag), takeUntil(fromEvent(document, 'touchend')))\n .subscribe(whileDragging);\n } else {\n fromEvent(document, 'mousemove')\n .pipe(finalize(endOfDrag), takeUntil(fromEvent(document, 'mouseup')))\n .subscribe(whileDragging);\n }\n }\n private getFixedEndDateWithMinimumSegmentDuration(agendaBooking: AgendaEvent): Date {\n const fixedEnd = new Date(agendaBooking.end || agendaBooking.start);\n const segmentSizeInMinutes = 60 / this.hourSegments();\n if (fixedEnd.getTime() <= agendaBooking.start.getTime() + segmentSizeInMinutes * 60 * 1000)\n fixedEnd.setMinutes(agendaBooking.start.getMinutes() + segmentSizeInMinutes);\n return fixedEnd;\n }\n}\n\n/**\n * A richer version of the classic CalendarEvent.\n */\nexport interface AgendaEvent extends CalendarEvent {\n /**\n * A brief description for the event.\n */\n description?: string;\n /**\n * The customer/stakeholder/target of the event.\n */\n target?: string;\n /**\n * The location of the event.\n */\n location?: string;\n /**\n * A list of URLs of images to show as small avatars.\n */\n avatars?: { id: string; url: string; title: string }[];\n /**\n * A list of ion-icons to show.\n */\n icons?: { name: string; title: string }[];\n /**\n * The colors of the event displayed.\n */\n color?: { primary: string; secondary?: string } | any;\n /**\n * Whether the event is external; external events are less important UI-wise.\n */\n external?: boolean;\n /**\n * The attendance status to this event, if any.\n */\n attendance?: EventAttendance;\n /**\n * A standard and unique id for the event, valid across multiple sources.\n */\n iCalUID?: string;\n}\n\n/**\n * Possible attendance statuses for the event.\n */\nexport enum EventAttendance {\n DECLINED = -1,\n NEEDS_ACTION = 0,\n TENTATIVE,\n ACCEPTED\n}\n\n/**\n * The options to allow (or not) drag&drop to create a new event.\n */\nexport enum DragToCreateOptions {\n DISABLED = 0,\n ONLY_SAME_DAY = 1,\n FREE = 2\n}\n\nconst floorToNearest = (amount: number, precision: number): number => Math.floor(amount / precision) * precision;\nconst ceilToNearest = (amount: number, precision: number): number => Math.ceil(amount / precision) * precision;\n","<div class=\"agenda\">\n <!-- TOOLBAR -->\n <ion-row class=\"ion-align-items-center\">\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"5\"\n [sizeSm]=\"3\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n @if (allowedViews.length > 1) {\n <ion-item lines=\"none\" class=\"calendarViewSelector\">\n <ion-select\n interface=\"popover\"\n [value]=\"view\"\n (ionChange)=\"$event?.detail ? setView($event.detail.value) : null\"\n >\n @for (view of allowedViews; track view) {\n <ion-select-option [value]=\"view\">\n {{ 'IDEA_AGENDA.' + view | uppercase | translate }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n }\n </ion-col>\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"7\"\n [sizeSm]=\"4\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarPreviousView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarToday\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"today-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarNextView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-forward-outline\" slot=\"icon-only\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-align-self-center titleCol\" [size]=\"12\" [sizeSm]=\"5\" [pullSm]=\"7\" [sizeLg]=\"8\" [pullLg]=\"4\">\n <h2>{{ viewDate | calendarDate: view + 'ViewTitle' : locale }}</h2>\n @if (titleNotes) {\n <p>{{ titleNotes }}</p>\n }\n </ion-col>\n </ion-row>\n <!-- TEMPLATES (touch only what's necessary and leave everything else as it is) -->\n <ng-template #eventTitleTemplate let-event=\"event\" let-view=\"view\">\n <span\n class=\"cal-event-title\"\n [class.noWrap]=\"event.allDay\"\n [attr.aria-hidden]=\"{} | calendarA11y: 'hideEventTitle'\"\n >\n {{ event.title | calendarEventTitle: view : event }}\n @if (event.target) {\n <p>{{ event.target }}</p>\n } @else {\n @if (event.location) {\n <p>{{ event.location }}</p>\n }\n }\n @if (!event.allDay) {\n <p>{{ getPreviewDescription(event.description) }}</p>\n }\n </span>\n </ng-template>\n <ng-template\n #eventTemplate\n let-weekEvent=\"weekEvent\"\n let-tooltipPlacement=\"tooltipPlacement\"\n let-eventClicked=\"eventClicked\"\n let-tooltipTemplate=\"tooltipTemplate\"\n let-tooltipAppendToBody=\"tooltipAppendToBody\"\n let-tooltipDisabled=\"tooltipDisabled\"\n let-tooltipDelay=\"tooltipDelay\"\n let-column=\"column\"\n let-daysInWeek=\"daysInWeek\"\n >\n <div\n class=\"cal-event\"\n [class.external]=\"weekEvent.event.external\"\n [class.allDay]=\"weekEvent.event.allDay\"\n [class.needsAction]=\"Attendance.NEEDS_ACTION === weekEvent.event.attendance\"\n [class.declined]=\"Attendance.DECLINED === weekEvent.event.attendance\"\n [class.tentative]=\"Attendance.TENTATIVE === weekEvent.event.attendance\"\n [style.border-left-color]=\"weekEvent.event.color?.primary\"\n [style.color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 80 : -40)\"\n [style.background-color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 60 : 80, 0.2)\"\n [mwlCalendarTooltip]=\"!tooltipDisabled && !isMobile() ? getTooltipContent(weekEvent.event) : ''\"\n [tooltipPlacement]=\"tooltipPlacement\"\n [tooltipEvent]=\"weekEvent.tempEvent || weekEvent.event\"\n [tooltipTemplate]=\"tooltipTemplate\"\n [tooltipAppendToBody]=\"tooltipAppendToBody\"\n [tooltipDelay]=\"tooltipDelay\"\n (mwlClick)=\"eventClicked.emit({ sourceEvent: $event })\"\n (mwlKeydownEnter)=\"eventClicked.emit({ sourceEvent: $event })\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"\n { event: weekEvent.tempEvent || weekEvent.event, locale: locale } | calendarA11y: 'eventDescription'\n \"\n >\n <mwl-calendar-event-actions [event]=\"weekEvent.tempEvent || weekEvent.event\" />\n &ngsp;\n <mwl-calendar-event-title\n [event]=\"weekEvent.tempEvent || weekEvent.event\"\n [customTemplate]=\"eventTitleTemplate\"\n [view]=\"daysInWeek === 1 ? 'day' : 'week'\"\n >\n </mwl-calendar-event-title>\n @if (!weekEvent.event.allDay) {\n <div class=\"eventGadgets\">\n @for (icon of weekEvent.event.icons; track icon) {\n <ion-icon [name]=\"icon.name\" [title]=\"icon.title\" />\n }\n @for (avatar of weekEvent.event.avatars; track avatar) {\n <idea-user-avatar size=\"mini\" [src]=\"avatar.url\" [name]=\"avatar.title\" />\n }\n </div>\n }\n </div>\n </ng-template>\n <ng-template\n #hourSegmentTemplate\n let-segment=\"segment\"\n let-locale=\"locale\"\n let-segmentHeight=\"segmentHeight\"\n let-isTimeLabel=\"isTimeLabel\"\n >\n <div\n #segmentElement\n class=\"cal-hour-segment\"\n [style.height.px]=\"segmentHeight\"\n [class.cal-hour-start]=\"segment.isStart\"\n [class.cal-after-hour-start]=\"!segment.isStart\"\n [ngClass]=\"segment.cssClass\"\n (mousedown)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n (touchstart)=\"allowDragToCreate() ? startDragToCreate($event, segment.date, segmentElement) : null\"\n >\n @if (isTimeLabel) {\n <div class=\"cal-time\">\n {{ segment.date | calendarDate: 'weekViewHour' : locale }}\n </div>\n }\n </div>\n </ng-template>\n <!-- VIEWS -->\n <div>\n @switch (view) {\n @case (CalendarView.Month) {\n <mwl-calendar-month-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [activeDayIsOpen]=\"activeDayIsOpen\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [eventTitleTemplate]=\"eventTitleTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayClicked)=\"changeDay($event.day)\"\n (beforeViewRender)=\"beforeMonthViewRender($event)\"\n >\n </mwl-calendar-month-view>\n }\n @case (CalendarView.Week) {\n <mwl-calendar-week-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays()\"\n [weekStartsOn]=\"weekStartsOn\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayHeaderClicked)=\"dateIsValid($event.day.date) ? selectDay.emit($event.day.date) : null\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-week-view>\n }\n @case (CalendarView.Day) {\n <mwl-calendar-day-view\n [viewDate]=\"viewDate\"\n [events]=\"events()\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [dayStartHour]=\"dayStartHour()\"\n [dayEndHour]=\"dayEndHour()\"\n [hourSegments]=\"hourSegments()\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-day-view>\n }\n }\n </div>\n</div>\n","import { Injectable, inject } from '@angular/core';\nimport { AlertController, ModalController } from '@ionic/angular/standalone';\nimport { Browser } from '@capacitor/browser';\nimport { Calendar, ExternalCalendarSources, Suggestion } from 'idea-toolbox';\nimport {\n IDEAEnvironment,\n IDEALoadingService,\n IDEATranslationsService,\n IDEASuggestionsComponent\n} from '@idea-ionic/common';\nimport { IDEAAWSAPIService } from '@idea-ionic/uncommon';\n\n/**\n * Note: to test locally, you need to temporarily change the redirect URI:\n * - in the lambda `idea_calendars`, e.g. `SCARLETT_URL`;\n * - in the client config file: `APP_URL`.\n * In both cases, the value should be set to `http://localhost:8100` (or according to the local URL).\n */\n@Injectable()\nexport class IDEACalendarsService {\n protected _env = inject(IDEAEnvironment);\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _loading = inject(IDEALoadingService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * Get the ion-icon of an external service from its name.\n */\n getServiceIcon(service: ExternalCalendarSources | string): string {\n switch (service) {\n case ExternalCalendarSources.GOOGLE:\n return 'logo-google';\n case ExternalCalendarSources.MICROSOFT:\n return 'logo-windows';\n default:\n return 'help';\n }\n }\n /**\n * Get the base URL for API request (shared/private calendar).\n */\n getRequestURL(calendar: Calendar): string {\n return (calendar.teamId ? `teams/${calendar.teamId}/` : '').concat('calendars');\n }\n\n /**\n * Create a new calendar.\n */\n async postCalendar(cal: Calendar): Promise<Calendar> {\n const calendar = await this._API.postResource(this.getRequestURL(cal), { idea: true, body: cal });\n return new Calendar(calendar);\n }\n /**\n * Update an existing calendar.\n */\n async putCalendar(cal: Calendar): Promise<Calendar> {\n const body = { idea: true, resourceId: cal.calendarId, body: cal };\n const calendar = await this._API.putResource(this.getRequestURL(cal), body);\n return new Calendar(calendar);\n }\n /**\n * Delete a calendar.\n */\n async deleteCalendar(cal: Calendar): Promise<void> {\n await this._API.deleteResource(this.getRequestURL(cal), { idea: true, resourceId: cal.calendarId });\n }\n /**\n * Associate an external calendar with the given calendar.\n */\n async setExternalCalendar(cal: Calendar, externalId: string): Promise<Calendar> {\n const body = { idea: true, resourceId: cal.calendarId, body: { action: 'SET_EXTERNAL_CALENDAR', externalId } };\n const calendar = await this._API.patchResource(this.getRequestURL(cal), body);\n return new Calendar(calendar);\n }\n\n /**\n * Link the calendar with the chosen external service (auth flow).\n */\n async linkExtService(cal: Calendar, baseURL: string): Promise<void> {\n if (!cal.external) throw new Error('NOT_EXTERNAL');\n if (!baseURL) baseURL = window.location.protocol.concat('//', window.location.hostname);\n let url: string;\n switch (cal.external.service) {\n case ExternalCalendarSources.GOOGLE:\n url =\n 'https://accounts.google.com/o/oauth2/v2/auth?' +\n `client_id=${encodeURIComponent(this._env.google.apiClientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/google-calendars-integration'))}` +\n '&include_granted_scopes=true' +\n '&access_type=offline&prompt=consent' +\n `&scope=${encodeURIComponent(this._env.google.apiScope)}` +\n `&state=${encodeURIComponent(cal.calendarId)}`;\n break;\n case ExternalCalendarSources.MICROSOFT:\n url =\n 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?' +\n `client_id=${encodeURIComponent(this._env.microsoft.apiClientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/microsoft-calendars-integration'))}` +\n '&response_mode=query' +\n `&scope=${encodeURIComponent(this._env.microsoft.apiScope)}` +\n `&state=${encodeURIComponent(cal.calendarId)}`;\n break;\n }\n if (!url) throw new Error('INVALID_SERVICE');\n await Browser.open({ url });\n // since we don't know when/if the auth flow will finish, we wait\n await this.showAlertLinkingCalendar();\n }\n private async showAlertLinkingCalendar(): Promise<void> {\n return new Promise(async resolve => {\n const header = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR_CONFIRM_ONCE_DONE');\n const buttons = [{ text: this._translate._('COMMON.DONE'), handler: resolve }];\n const alert = await this._alert.create({ header, message, buttons, backdropDismiss: false });\n alert.present();\n });\n }\n\n /**\n * Get the external calendars list of the external service.\n */\n async getExternalCalendars(cal: Calendar): Promise<ExtCalendar[]> {\n if (!cal.external) throw new Error('NOT_EXTERNAL');\n // get the access token to make requests; in case it fails, proceed to link the external service\n const body = { idea: true, resourceId: cal.calendarId, body: { action: 'GET_ACCESS_TOKEN' } };\n const result = await this._API.patchResource(this.getRequestURL(cal), body);\n const headers = { Authorization: 'Bearer '.concat(result.token) };\n if (cal.external.service === ExternalCalendarSources.GOOGLE) {\n const res = await (\n await fetch('https://www.googleapis.com/calendar/v3/users/me/calendarList', { headers })\n ).json();\n return res.items.map((c: any): ExtCalendar => ({ name: c.summary, id: c.id }) as ExtCalendar);\n } else if (cal.external.service === ExternalCalendarSources.MICROSOFT) {\n const res = await (await fetch('https://graph.microsoft.com/v1.0/me/calendars', { headers })).json();\n return res.value.map((c: any): ExtCalendar => ({ name: c.name, id: c.id }) as ExtCalendar);\n }\n }\n\n /**\n * If the external service is linked, choose an external calendar and set it for the chosen calendar.\n * @return the updated calendar.\n */\n async chooseAndSetExternalCalendar(cal: Calendar): Promise<Calendar> {\n const extCalId = await this.openModalAndPickExternalCalendar(cal);\n if (!extCalId) return;\n return await this.setExternalCalendar(cal, extCalId);\n }\n /**\n * Open the modal to pick a calendar from the external service.\n * @return the id of the external calendar.\n */\n private async openModalAndPickExternalCalendar(cal: Calendar): Promise<string> {\n let extCals: ExtCalendar[];\n try {\n await this._loading.show();\n extCals = await this.getExternalCalendars(cal);\n if (!extCals.length) throw new Error('NO_EXTERNAL_CALENDARS');\n } catch (error) {\n throw error;\n } finally {\n this._loading.hide();\n }\n const modal = await this._modal.create({\n component: IDEASuggestionsComponent,\n componentProps: {\n data: extCals.map(c => new Suggestion({ value: c.id, name: c.name })),\n searchPlaceholder: this._translate._('IDEA_AGENDA.CALENDARS.CHOOSE_AN_EXTERNAL_CALENDAR_TO_LINK'),\n sortData: true,\n hideIdFromUI: true,\n hideClearButton: true,\n mustChoose: true\n },\n backdropDismiss: false\n });\n modal.present();\n const res = await modal.onDidDismiss();\n return res.data ? res.data.value : null;\n }\n\n /**\n * First sync of the extenal calendar.\n */\n syncCalendar(cal: Calendar): Promise<void> {\n return new Promise((resolve, reject): void => this.syncCalendarHelper(cal, err => (err ? reject(err) : resolve())));\n }\n /**\n * Helper to recursively sync an the extenal calendar.\n */\n private syncCalendarHelper(cal: Calendar, done: (err?: Error) => void): void {\n // this is a recursive operation: the API returns if the sync has to continue or it finished\n this._API\n .patchResource(this.getRequestURL(cal), {\n idea: true,\n resourceId: cal.calendarId,\n body: { action: 'SYNC_EXTERNAL_CALENDAR', firstSync: true }\n })\n .then((res: any): void => {\n if (res.moreData) this.syncCalendarHelper(cal, done);\n else done();\n })\n .catch(err => done(err));\n }\n}\n\n/**\n * Helper structure to define external services' calendars (basic info).\n */\ninterface ExtCalendar {\n id: string;\n name: string;\n}\n","import { Component, Input, OnInit, inject, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { ModalController, AlertController } from '@ionic/angular/standalone';\nimport { Calendar, Check, Membership } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\nimport { IDEAAWSAPIService, IDEATinCanService } from '@idea-ionic/uncommon';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n // eslint-disable-next-line\n standalone: false,\n selector: 'idea-calendar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'calendar.component.html',\n styleUrls: ['calendar.component.scss']\n})\nexport class IDEACalendarComponent implements OnInit {\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _tc = inject(IDEATinCanService);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * The calendar to manage.\n */\n @Input() calendar?: Calendar;\n /**\n * Whether we want to enable advanced permissions (based on the memberships) on the calendar.\n */\n @Input() advancedPermissions?: boolean;\n /**\n * Whether the calendar color is an important detail or it shouldn't be shown.\n */\n @Input() hideColor?: boolean;\n\n calendarWC: Calendar;\n membershipsChecks = signal<Check[]>(null);\n membership: Membership;\n errors = new Set<string>();\n DEFAULT_COLOR = '#555';\n\n async ngOnInit(): Promise<void> {\n this.membership = this._tc.get('membership');\n this.calendarWC = new Calendar(this.calendar);\n try {\n const memberships: Membership[] = await this._API.getResource(`teams/${this.membership.teamId}/memberships`);\n this.membershipsChecks.set(\n memberships.map(\n m =>\n new Check({\n value: m.userId,\n name: m.name,\n checked: (this.calendarWC.usersCanManageAppointments || []).some(x => x === m.userId)\n })\n )\n );\n } catch (error) {\n this._message.error('COMMON.COULDNT_LOAD_LIST');\n }\n }\n\n hasFieldAnError(field: string): boolean {\n return this.errors.has(field);\n }\n\n async save(): Promise<void> {\n if (!this.calendarWC.color) this.calendarWC.color = this.DEFAULT_COLOR;\n if (this.calendarWC.isShared() && this.advancedPermissions)\n this.calendarWC.usersCanManageAppointments = this.membershipsChecks()\n .filter(x => x.checked)\n .map(x => String(x.value));\n else delete this.calendarWC.usersCanManageAppointments;\n\n this.errors = new Set(this.calendarWC.validate());\n if (this.errors.size) return this._message.error('COMMON.FORM_HAS_ERROR_TO_CHECK');\n\n try {\n await this._loading.show();\n const res = await this._calendars.putCalendar(this.calendarWC);\n this.calendar.load(res);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_SAVED');\n this._modal.dismiss(this.calendar);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n }\n\n async delete(): Promise<void> {\n const doDelete = async (): Promise<void> => {\n try {\n await this._loading.show();\n await this._calendars.deleteCalendar(this.calendarWC);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_DELETED');\n this._modal.dismiss(true);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n };\n\n const header = this._translate._('COMMON.ARE_YOU_SURE');\n const subHeader = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT');\n const buttons = [\n { text: this._translate._('COMMON.CANCEL'), role: 'cancel' },\n { text: this._translate._('COMMON.DELETE'), handler: doDelete }\n ];\n const alert = await this._alert.create({ header, subHeader, message, buttons });\n alert.present();\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n","<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","import { Component, inject, ChangeDetectionStrategy, output, input, model } from '@angular/core';\nimport { AlertController, ModalController } from '@ionic/angular/standalone';\nimport { Calendar } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEACalendarComponent } from './calendar.component';\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n // eslint-disable-next-line\n standalone: false,\n selector: 'idea-calendar-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'calendarItem.component.html',\n styleUrls: ['calendarItem.component.scss']\n})\nexport class IDEACalendarItemComponent {\n private _alert = inject(AlertController);\n private _modal = inject(ModalController);\n private _message = inject(IDEAMessageService);\n private _loading = inject(IDEALoadingService);\n private _translate = inject(IDEATranslationsService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * The calendar to show.\n */\n readonly calendar = model<Calendar>();\n /**\n * Whether the component is disabled.\n */\n readonly disabled = input<boolean>();\n /**\n * Whether we want to enable advanced permissions (based on the memberships) on the calendar.\n */\n readonly advancedPermissions = input<boolean>();\n /**\n * Whether the calendar color is an important detail or it shouldn't be shown.\n */\n readonly hideColor = input<boolean>();\n /**\n * The URL to be used on the redirect calls.\n */\n readonly baseURL = input<string>();\n /**\n * Report to parent components a change.\n */\n readonly somethingChanged = output<Calendar>();\n\n async manageCalendar(): Promise<void> {\n if (this.disabled()) return;\n const modal = await this._modal.create({\n component: IDEACalendarComponent,\n componentProps: {\n calendar: this.calendar(),\n advancedPermissions: this.advancedPermissions(),\n hideColor: this.hideColor()\n }\n });\n modal.onDidDismiss().then(res => {\n const cal = res.data;\n if (cal === undefined) return;\n else if (cal === null) this.calendar.set(null);\n else this.calendar.update(c => new Calendar({ ...c, ...cal }));\n this.somethingChanged.emit(this.calendar());\n });\n modal.present();\n }\n\n async linkExtCalendarOrDelete(): Promise<void> {\n if (this.disabled()) return;\n try {\n const cal = await this._calendars.chooseAndSetExternalCalendar(this.calendar());\n if (!cal) throw new Error('NO_EXTERNAL_CALENDAR_CHOSEN');\n this.calendar.update(c => new Calendar({ ...c, ...cal }));\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_LINKED');\n try {\n await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));\n await this._calendars.syncCalendar(this.calendar());\n this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n this.somethingChanged.emit(this.calendar());\n }\n } catch (error) {\n const doDelete = async (): Promise<void> => {\n try {\n await this._loading.show();\n await this._calendars.deleteCalendar(this.calendar());\n this._message.success('COMMON.OPERATION_COMPLETED');\n this.somethingChanged.emit(this.calendar());\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n };\n const doLink = async (): Promise<void> => {\n try {\n await this._calendars.linkExtService(this.calendar(), this.baseURL());\n this.linkExtCalendarOrDelete();\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n }\n };\n const header = this._translate._('IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.DO_YOU_WANT_PROCEED_LINKING_OR_DELETE');\n const buttons = [\n { text: this._translate._('COMMON.DELETE'), handler: doDelete },\n { text: this._translate._('IDEA_AGENDA.CALENDARS.LINK'), handler: doLink }\n ];\n const alert = await this._alert.create({ header, message, buttons });\n alert.present();\n }\n }\n}\n","@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","import { Component, OnInit, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { ModalController } from '@ionic/angular/standalone';\nimport { Calendar, ExternalCalendarInfo, ExternalCalendarSources, Membership, Team } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\nimport { IDEATinCanService } from '@idea-ionic/uncommon';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n // eslint-disable-next-line\n standalone: false,\n selector: 'idea-calendar-creation',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'calendarCreation.component.html',\n styleUrls: ['calendarCreation.component.scss']\n})\nexport class IDEACalendarCreationComponent implements OnInit {\n private _modal = inject(ModalController);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _translate = inject(IDEATranslationsService);\n private _tc = inject(IDEATinCanService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * Whether we want to allow the creation of only a particular type of calendar, based on the scope.\n */\n readonly fixScope = input<CalendarScopes>();\n /**\n * Whether we want to allow the creation of local calendars.\n */\n readonly onlyExternalCalendars = input<boolean>();\n /**\n * The URL to be used on the redirect calls.\n */\n readonly baseURL = input<string>();\n\n team: Team;\n membership: Membership;\n calendar: Calendar;\n DEFAULT_COLOR = '#555';\n SOURCES = Object.keys(ExternalCalendarSources);\n\n ngOnInit(): void {\n this.calendar = new Calendar();\n this.team = this._tc.get('team');\n this.membership = this._tc.get('membership');\n const fixScope = this.fixScope();\n if (fixScope === CalendarScopes.SHARED) this.calendar.teamId = this.team.teamId;\n if (fixScope === CalendarScopes.PRIVATE) this.calendar.userId = this.membership.userId;\n }\n\n resetScope(): void {\n if (this.canChangeScope()) this.calendar.teamId = this.calendar.userId = null;\n }\n canChangeScope(): boolean {\n return !this.fixScope() && this.scopeIsSet();\n }\n scopeIsSet(): boolean {\n return Boolean(this.calendar.userId) || Boolean(this.calendar.teamId);\n }\n\n async saveNewCalendar(service?: ExternalCalendarSources | string): Promise<void> {\n if (!this.scopeIsSet()) return;\n if (!service && this.onlyExternalCalendars()) return;\n if (service) {\n this.calendar.external = new ExternalCalendarInfo({ service });\n this.calendar.name = '-'; // it will be substituted with the external name\n } else {\n this.calendar.name = this.calendar.userId\n ? this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_PERSONAL_CALENDAR_NAME')\n : this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_TEAM_CALENDAR_NAME');\n this.calendar.color = this.DEFAULT_COLOR;\n }\n try {\n await this._loading.show();\n const cal = await this._calendars.postCalendar(this.calendar);\n this.calendar.load(cal);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_CREATED');\n if (!cal.external) {\n await this._modal.dismiss(this.calendar);\n return;\n }\n try {\n await this._loading.hide();\n await this._calendars.linkExtService(this.calendar, this.baseURL());\n const res = await this._calendars.chooseAndSetExternalCalendar(this.calendar);\n if (!res) {\n await this._modal.dismiss(this.calendar);\n return;\n }\n this.calendar.load(res);\n try {\n await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));\n await this._calendars.syncCalendar(this.calendar);\n await this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n await this._modal.dismiss(this.calendar);\n }\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n await this._modal.dismiss(this.calendar);\n }\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n await this._loading.hide();\n }\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n\n/**\n * The possible scopes of the calendar.\n */\nexport enum CalendarScopes {\n SHARED = 'shared', // teamId\n PRIVATE = 'private' // userId\n}\n","<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","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { IonicModule } from '@ionic/angular';\n\nimport { CalendarDateFormatter, CalendarModule, DateAdapter } from 'angular-calendar';\nimport { adapterFactory } from 'angular-calendar/date-adapters/date-fns';\nimport { CustomDateFormatter } from './dateFormatter.provider';\n\nimport { IDEACheckerComponent, IDEATranslationsModule, IDEAUserAvatarComponent } from '@idea-ionic/common';\nimport { IDEAColorPickerComponent } from '@idea-ionic/uncommon';\n\nimport { IDEAAgendaComponent } from './agenda.component';\nimport { IDEACalendarComponent } from './calendar.component';\nimport { IDEACalendarItemComponent } from './calendarItem.component';\nimport { IDEACalendarCreationComponent } from './calendarCreation.component';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n IonicModule,\n IDEATranslationsModule,\n IDEAColorPickerComponent,\n IDEACheckerComponent,\n IDEAUserAvatarComponent,\n CalendarModule.forRoot({ provide: DateAdapter, useFactory: adapterFactory })\n ],\n declarations: [IDEAAgendaComponent, IDEACalendarComponent, IDEACalendarItemComponent, IDEACalendarCreationComponent],\n exports: [IDEAAgendaComponent, IDEACalendarComponent, IDEACalendarItemComponent, IDEACalendarCreationComponent],\n providers: [{ provide: CalendarDateFormatter, useClass: CustomDateFormatter }, IDEACalendarsService]\n})\nexport class IDEAAgendaModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i4","i2"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -13,13 +13,12 @@ import * as i7 from '@ionic/angular';
|
|
|
13
13
|
import * as i9 from '@idea-ionic/uncommon';
|
|
14
14
|
|
|
15
15
|
declare class IDEAAgendaComponent implements OnInit {
|
|
16
|
-
private _cdr;
|
|
17
16
|
private _platform;
|
|
18
17
|
_translate: IDEATranslationsService;
|
|
19
18
|
/**
|
|
20
19
|
* The events to display in the calendar.
|
|
21
20
|
*/
|
|
22
|
-
events: AgendaEvent[]
|
|
21
|
+
readonly events: _angular_core.ModelSignal<AgendaEvent[]>;
|
|
23
22
|
/**
|
|
24
23
|
* An array of day indexes (0 = sunday, 1 = monday, etc.) that will be hidden on the view.
|
|
25
24
|
*/
|
|
@@ -138,7 +137,7 @@ declare class IDEAAgendaComponent implements OnInit {
|
|
|
138
137
|
startDragToCreate(event: Event, segmentDate: Date, segmentElement: HTMLElement): void;
|
|
139
138
|
private getFixedEndDateWithMinimumSegmentDuration;
|
|
140
139
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<IDEAAgendaComponent, never>;
|
|
141
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<IDEAAgendaComponent, "idea-agenda", never, { "events": { "alias": "events"; "required": false; }; "excludeDays": { "alias": "excludeDays"; "required": false; "isSignal": true; }; "dayStartHour": { "alias": "dayStartHour"; "required": false; "isSignal": true; }; "dayEndHour": { "alias": "dayEndHour"; "required": false; "isSignal": true; }; "hourSegments": { "alias": "hourSegments"; "required": false; "isSignal": true; }; "activeDayIsOpen": { "alias": "activeDayIsOpen"; "required": false; }; "view": { "alias": "view"; "required": false; }; "allowedViews": { "alias": "allowedViews"; "required": false; }; "onlyFuture": { "alias": "onlyFuture"; "required": false; "isSignal": true; }; "titleNotes": { "alias": "titleNotes"; "required": false; }; "newEventTemplate": { "alias": "newEventTemplate"; "required": false; "isSignal": true; }; "allowDragToCreate": { "alias": "allowDragToCreate"; "required": false; "isSignal": true; }; "parentContent": { "alias": "parentContent"; "required": false; "isSignal": true; }; }, { "selectEvent": "selectEvent"; "selectDay": "selectDay"; "selectSlot": "selectSlot"; "newEventByDrag": "newEventByDrag"; "changeEvent": "changeEvent"; "changeDate": "changeDate"; "beforeWeekOrDayViewRenderEmitter": "beforeWeekOrDayViewRenderEmitter"; "beforeMonthViewRenderEmitter": "beforeMonthViewRenderEmitter"; }, never, never, false, never>;
|
|
140
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<IDEAAgendaComponent, "idea-agenda", never, { "events": { "alias": "events"; "required": false; "isSignal": true; }; "excludeDays": { "alias": "excludeDays"; "required": false; "isSignal": true; }; "dayStartHour": { "alias": "dayStartHour"; "required": false; "isSignal": true; }; "dayEndHour": { "alias": "dayEndHour"; "required": false; "isSignal": true; }; "hourSegments": { "alias": "hourSegments"; "required": false; "isSignal": true; }; "activeDayIsOpen": { "alias": "activeDayIsOpen"; "required": false; }; "view": { "alias": "view"; "required": false; }; "allowedViews": { "alias": "allowedViews"; "required": false; }; "onlyFuture": { "alias": "onlyFuture"; "required": false; "isSignal": true; }; "titleNotes": { "alias": "titleNotes"; "required": false; }; "newEventTemplate": { "alias": "newEventTemplate"; "required": false; "isSignal": true; }; "allowDragToCreate": { "alias": "allowDragToCreate"; "required": false; "isSignal": true; }; "parentContent": { "alias": "parentContent"; "required": false; "isSignal": true; }; }, { "events": "eventsChange"; "selectEvent": "selectEvent"; "selectDay": "selectDay"; "selectSlot": "selectSlot"; "newEventByDrag": "newEventByDrag"; "changeEvent": "changeEvent"; "changeDate": "changeDate"; "beforeWeekOrDayViewRenderEmitter": "beforeWeekOrDayViewRenderEmitter"; "beforeMonthViewRenderEmitter": "beforeMonthViewRenderEmitter"; }, never, never, false, never>;
|
|
142
141
|
}
|
|
143
142
|
/**
|
|
144
143
|
* A richer version of the classic CalendarEvent.
|
|
@@ -293,7 +292,6 @@ declare class IDEACalendarComponent implements OnInit {
|
|
|
293
292
|
private _API;
|
|
294
293
|
private _translate;
|
|
295
294
|
_calendars: IDEACalendarsService;
|
|
296
|
-
private _cdr;
|
|
297
295
|
/**
|
|
298
296
|
* The calendar to manage.
|
|
299
297
|
*/
|
|
@@ -307,7 +305,7 @@ declare class IDEACalendarComponent implements OnInit {
|
|
|
307
305
|
*/
|
|
308
306
|
hideColor?: boolean;
|
|
309
307
|
calendarWC: Calendar;
|
|
310
|
-
membershipsChecks: Check[]
|
|
308
|
+
membershipsChecks: _angular_core.WritableSignal<Check[]>;
|
|
311
309
|
membership: Membership;
|
|
312
310
|
errors: Set<string>;
|
|
313
311
|
DEFAULT_COLOR: string;
|
|
@@ -330,7 +328,7 @@ declare class IDEACalendarItemComponent {
|
|
|
330
328
|
/**
|
|
331
329
|
* The calendar to show.
|
|
332
330
|
*/
|
|
333
|
-
calendar: Calendar
|
|
331
|
+
readonly calendar: _angular_core.ModelSignal<Calendar>;
|
|
334
332
|
/**
|
|
335
333
|
* Whether the component is disabled.
|
|
336
334
|
*/
|
|
@@ -354,7 +352,7 @@ declare class IDEACalendarItemComponent {
|
|
|
354
352
|
manageCalendar(): Promise<void>;
|
|
355
353
|
linkExtCalendarOrDelete(): Promise<void>;
|
|
356
354
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<IDEACalendarItemComponent, never>;
|
|
357
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<IDEACalendarItemComponent, "idea-calendar-item", never, { "calendar": { "alias": "calendar"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "advancedPermissions": { "alias": "advancedPermissions"; "required": false; "isSignal": true; }; "hideColor": { "alias": "hideColor"; "required": false; "isSignal": true; }; "baseURL": { "alias": "baseURL"; "required": false; "isSignal": true; }; }, { "somethingChanged": "somethingChanged"; }, never, never, false, never>;
|
|
355
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<IDEACalendarItemComponent, "idea-calendar-item", never, { "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "advancedPermissions": { "alias": "advancedPermissions"; "required": false; "isSignal": true; }; "hideColor": { "alias": "hideColor"; "required": false; "isSignal": true; }; "baseURL": { "alias": "baseURL"; "required": false; "isSignal": true; }; }, { "calendar": "calendarChange"; "somethingChanged": "somethingChanged"; }, never, never, false, never>;
|
|
358
356
|
}
|
|
359
357
|
|
|
360
358
|
declare class IDEACalendarCreationComponent implements OnInit {
|