@sneat/extensions-schedulus-shared 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.js +2 -0
- package/esm2022/index.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar-base.component.js +83 -0
- package/esm2022/lib/components/calendar/calendar-base.component.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar-brief.component.js +57 -0
- package/esm2022/lib/components/calendar/calendar-brief.component.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar-component-types.js +2 -0
- package/esm2022/lib/components/calendar/calendar-component-types.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar-state.service.js +90 -0
- package/esm2022/lib/components/calendar/calendar-state.service.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar.component.js +284 -0
- package/esm2022/lib/components/calendar/calendar.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.js +45 -0
- package/esm2022/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-base.component.js +26 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-base.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-card.component.js +67 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-card.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-tab.component.js +74 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-tab.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-title.component.js +27 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-title.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day.component.js +129 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.component.js +162 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.js +17 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/contacts-filter.component.js +95 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/contacts-filter.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-card.component.js +50 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-card.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-tab.component.js +18 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-tab.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-title.component.js +15 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-title.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week.component.js +78 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.js +66 -0
- package/esm2022/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/day-slot-item/day-slot-item.component.js +93 -0
- package/esm2022/lib/components/calendar/components/day-slot-item/day-slot-item.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/day-slot-item/slot-context-menu.component.js +324 -0
- package/esm2022/lib/components/calendar/components/day-slot-item/slot-context-menu.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.js +36 -0
- package/esm2022/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/singles-tab/single-happenings-list.component.js +65 -0
- package/esm2022/lib/components/calendar/components/singles-tab/single-happenings-list.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/singles-tab/singles-tab.component.js +106 -0
- package/esm2022/lib/components/calendar/components/singles-tab/singles-tab.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/timing-badge/timing-badge.component.js +25 -0
- package/esm2022/lib/components/calendar/components/timing-badge/timing-badge.component.js.map +1 -0
- package/esm2022/lib/components/calendar/weekday.js +2 -0
- package/esm2022/lib/components/calendar/weekday.js.map +1 -0
- package/esm2022/lib/components/calendar-core.js +64 -0
- package/esm2022/lib/components/calendar-core.js.map +1 -0
- package/esm2022/lib/components/calendar-filter.service.js +28 -0
- package/esm2022/lib/components/calendar-filter.service.js.map +1 -0
- package/esm2022/lib/components/calendar-slots.js +30 -0
- package/esm2022/lib/components/calendar-slots.js.map +1 -0
- package/esm2022/lib/components/happening-base.component.js +188 -0
- package/esm2022/lib/components/happening-base.component.js.map +1 -0
- package/esm2022/lib/components/happening-card/happening-card.component.js +69 -0
- package/esm2022/lib/components/happening-card/happening-card.component.js.map +1 -0
- package/esm2022/lib/components/happening-component-base-params.js +37 -0
- package/esm2022/lib/components/happening-component-base-params.js.map +1 -0
- package/esm2022/lib/components/happening-form/happening-form.component.js +348 -0
- package/esm2022/lib/components/happening-form/happening-form.component.js.map +1 -0
- package/esm2022/lib/components/happening-form/happening-price-form/happening-price-modal.component.js +161 -0
- package/esm2022/lib/components/happening-form/happening-price-form/happening-price-modal.component.js.map +1 -0
- package/esm2022/lib/components/happening-form/happening-prices/happening-prices.component.js +142 -0
- package/esm2022/lib/components/happening-form/happening-prices/happening-prices.component.js.map +1 -0
- package/esm2022/lib/components/happening-participants/happening-participants.component.js +195 -0
- package/esm2022/lib/components/happening-participants/happening-participants.component.js.map +1 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-form.component.js +505 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-form.component.js.map +1 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-modal.component.js +140 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-modal.component.js.map +1 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-modal.service.js +47 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-modal.service.js.map +1 -0
- package/esm2022/lib/components/happening-slot-participants/happening-slot-participants.component.js +74 -0
- package/esm2022/lib/components/happening-slot-participants/happening-slot-participants.component.js.map +1 -0
- package/esm2022/lib/components/happening-slots/happening-slots.component.js +130 -0
- package/esm2022/lib/components/happening-slots/happening-slots.component.js.map +1 -0
- package/esm2022/lib/components/index.js +20 -0
- package/esm2022/lib/components/index.js.map +1 -0
- package/esm2022/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.js +68 -0
- package/esm2022/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.js.map +1 -0
- package/esm2022/lib/components/start-end-datetime-form/start-end-datetime-form.component.js +377 -0
- package/esm2022/lib/components/start-end-datetime-form/start-end-datetime-form.component.js.map +1 -0
- package/esm2022/lib/components/start-end-datetime-form/time-selector.component.js +92 -0
- package/esm2022/lib/components/start-end-datetime-form/time-selector.component.js.map +1 -0
- package/esm2022/lib/components/swipeable-base.component.js +112 -0
- package/esm2022/lib/components/swipeable-base.component.js.map +1 -0
- package/esm2022/lib/components/swipeable-ui.js +64 -0
- package/esm2022/lib/components/swipeable-ui.js.map +1 -0
- package/esm2022/lib/components/week.js +2 -0
- package/esm2022/lib/components/week.js.map +1 -0
- package/esm2022/lib/components/weekday-functions.js +13 -0
- package/esm2022/lib/components/weekday-functions.js.map +1 -0
- package/esm2022/lib/components/weekdays/weekdays-form-base.js +72 -0
- package/esm2022/lib/components/weekdays/weekdays-form-base.js.map +1 -0
- package/esm2022/lib/index.js +3 -0
- package/esm2022/lib/index.js.map +1 -0
- package/esm2022/lib/modals/happening-title-modal/happening-title-modal.component.js +87 -0
- package/esm2022/lib/modals/happening-title-modal/happening-title-modal.component.js.map +1 -0
- package/esm2022/lib/services/calendar-data-provider.js +271 -0
- package/esm2022/lib/services/calendar-data-provider.js.map +1 -0
- package/esm2022/lib/services/calendar-day.js +179 -0
- package/esm2022/lib/services/calendar-day.js.map +1 -0
- package/esm2022/lib/services/calendar-day.service.js +37 -0
- package/esm2022/lib/services/calendar-day.service.js.map +1 -0
- package/esm2022/lib/services/calendar-nav.service.js +36 -0
- package/esm2022/lib/services/calendar-nav.service.js.map +1 -0
- package/esm2022/lib/services/calendar-space.js +152 -0
- package/esm2022/lib/services/calendar-space.js.map +1 -0
- package/esm2022/lib/services/calendar-types.js +52 -0
- package/esm2022/lib/services/calendar-types.js.map +1 -0
- package/esm2022/lib/services/calendarium-services.module.js +16 -0
- package/esm2022/lib/services/calendarium-services.module.js.map +1 -0
- package/esm2022/lib/services/calendarium-space.service.js +16 -0
- package/esm2022/lib/services/calendarium-space.service.js.map +1 -0
- package/esm2022/lib/services/happening.service.js +225 -0
- package/esm2022/lib/services/happening.service.js.map +1 -0
- package/esm2022/lib/services/index.js +6 -0
- package/esm2022/lib/services/index.js.map +1 -0
- package/esm2022/sneat-extensions-schedulus-shared.js +5 -0
- package/esm2022/sneat-extensions-schedulus-shared.js.map +1 -0
- package/index.d.ts +1 -0
- package/lib/components/calendar/calendar-base.component.d.ts +23 -0
- package/lib/components/calendar/calendar-brief.component.d.ts +11 -0
- package/lib/components/calendar/calendar-component-types.d.ts +1 -0
- package/lib/components/calendar/calendar-state.service.d.ts +15 -0
- package/lib/components/calendar/calendar.component.d.ts +32 -0
- package/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.d.ts +13 -0
- package/lib/components/calendar/components/calendar-day/calendar-day-base.component.d.ts +10 -0
- package/lib/components/calendar/components/calendar-day/calendar-day-card.component.d.ts +17 -0
- package/lib/components/calendar/components/calendar-day/calendar-day-tab.component.d.ts +19 -0
- package/lib/components/calendar/components/calendar-day/calendar-day-title.component.d.ts +10 -0
- package/lib/components/calendar/components/calendar-day/calendar-day.component.d.ts +30 -0
- package/lib/components/calendar/components/calendar-filter/calendar-filter.component.d.ts +39 -0
- package/lib/components/calendar/components/calendar-filter/calendar-filter.d.ts +10 -0
- package/lib/components/calendar/components/calendar-filter/contacts-filter.component.d.ts +20 -0
- package/lib/components/calendar/components/calendar-week/calendar-week-card.component.d.ts +15 -0
- package/lib/components/calendar/components/calendar-week/calendar-week-tab.component.d.ts +9 -0
- package/lib/components/calendar/components/calendar-week/calendar-week-title.component.d.ts +7 -0
- package/lib/components/calendar/components/calendar-week/calendar-week.component.d.ts +20 -0
- package/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.d.ts +23 -0
- package/lib/components/calendar/components/day-slot-item/day-slot-item.component.d.ts +19 -0
- package/lib/components/calendar/components/day-slot-item/slot-context-menu.component.d.ts +40 -0
- package/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.d.ts +15 -0
- package/lib/components/calendar/components/singles-tab/single-happenings-list.component.d.ts +22 -0
- package/lib/components/calendar/components/singles-tab/singles-tab.component.d.ts +29 -0
- package/lib/components/calendar/components/timing-badge/timing-badge.component.d.ts +17 -0
- package/lib/components/calendar/weekday.d.ts +7 -0
- package/lib/components/calendar-core.d.ts +10 -0
- package/lib/components/calendar-filter.service.d.ts +8 -0
- package/lib/components/calendar-slots.d.ts +5 -0
- package/lib/components/happening-base.component.d.ts +46 -0
- package/lib/components/happening-card/happening-card.component.d.ts +11 -0
- package/lib/components/happening-component-base-params.d.ts +16 -0
- package/lib/components/happening-form/happening-form.component.d.ts +52 -0
- package/lib/components/happening-form/happening-price-form/happening-price-modal.component.d.ts +29 -0
- package/lib/components/happening-form/happening-prices/happening-prices.component.d.ts +16 -0
- package/lib/components/happening-participants/happening-participants.component.d.ts +24 -0
- package/lib/components/happening-slot-form/happening-slot-form.component.d.ts +76 -0
- package/lib/components/happening-slot-form/happening-slot-modal.component.d.ts +26 -0
- package/lib/components/happening-slot-form/happening-slot-modal.service.d.ts +18 -0
- package/lib/components/happening-slot-participants/happening-slot-participants.component.d.ts +19 -0
- package/lib/components/happening-slots/happening-slots.component.d.ts +28 -0
- package/lib/components/index.d.ts +5 -0
- package/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.d.ts +16 -0
- package/lib/components/start-end-datetime-form/start-end-datetime-form.component.d.ts +53 -0
- package/lib/components/start-end-datetime-form/time-selector.component.d.ts +15 -0
- package/lib/components/swipeable-base.component.d.ts +25 -0
- package/lib/components/swipeable-ui.d.ts +24 -0
- package/lib/components/week.d.ts +4 -0
- package/lib/components/weekday-functions.d.ts +3 -0
- package/lib/components/weekdays/weekdays-form-base.d.ts +31 -0
- package/lib/index.d.ts +2 -0
- package/lib/modals/happening-title-modal/happening-title-modal.component.d.ts +24 -0
- package/lib/services/calendar-data-provider.d.ts +33 -0
- package/lib/services/calendar-day.d.ts +45 -0
- package/lib/services/calendar-day.service.d.ts +18 -0
- package/lib/services/calendar-nav.service.d.ts +14 -0
- package/lib/services/calendar-space.d.ts +23 -0
- package/lib/services/calendar-types.d.ts +10 -0
- package/lib/services/calendarium-services.module.d.ts +6 -0
- package/lib/services/calendarium-space.service.d.ts +8 -0
- package/lib/services/happening.service.d.ts +99 -0
- package/lib/services/index.d.ts +5 -0
- package/package.json +26 -0
- package/sneat-extensions-schedulus-shared.d.ts +5 -0
- package/tsconfig.lib.prod.tsbuildinfo +1 -0
package/esm2022/lib/components/calendar/components/day-slot-item/slot-context-menu.component.js
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, Input, signal, } from '@angular/core';
|
|
2
|
+
import { IonIcon, IonItem, IonItemDivider, IonItemGroup, IonLabel, IonSpinner, IonText, PopoverController, } from '@ionic/angular/standalone';
|
|
3
|
+
import { addSpace, } from '@sneat/contactus-core';
|
|
4
|
+
import { excludeUndefined } from '@sneat/core';
|
|
5
|
+
import { hasRelated } from '@sneat/dto';
|
|
6
|
+
import { WithSpaceInput } from '@sneat/space-services';
|
|
7
|
+
import { ClassName } from '@sneat/ui';
|
|
8
|
+
import { CalendarNavServicesModule } from '../../../../services';
|
|
9
|
+
import { ContactsSelectorModule, ContactsSelectorService, } from '@sneat/contactus-shared';
|
|
10
|
+
import { zipMapBriefsWithIDs } from '@sneat/space-models';
|
|
11
|
+
import { NEVER } from 'rxjs';
|
|
12
|
+
import { HappeningSlotModalService, HappeningSlotModalServiceModule, } from '../../../happening-slot-form/happening-slot-modal.service';
|
|
13
|
+
import { HappeningService, HappeningServiceModule, } from '../../../../services/happening.service';
|
|
14
|
+
import { DaySlotItemComponent } from './day-slot-item.component';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
const notImplemented = 'Sorry, not implemented yet';
|
|
17
|
+
export class SlotContextMenuComponent extends WithSpaceInput {
|
|
18
|
+
get isCancelled() {
|
|
19
|
+
return (this.slotContext?.happening.brief?.status === 'canceled' ||
|
|
20
|
+
!!this.slotContext?.adjustment?.canceled);
|
|
21
|
+
}
|
|
22
|
+
constructor() {
|
|
23
|
+
super();
|
|
24
|
+
// protected readonly happening = signal<IHappeningContext | undefined>(
|
|
25
|
+
// undefined,
|
|
26
|
+
// );
|
|
27
|
+
this.$happeningState = signal(undefined, ...(ngDevMode ? [{ debugName: "$happeningState" }] : []));
|
|
28
|
+
this.$disabled = computed(() => !!this.$happeningState(), ...(ngDevMode ? [{ debugName: "$disabled" }] : []));
|
|
29
|
+
this.popoverController = inject(PopoverController);
|
|
30
|
+
this.happeningService = inject(HappeningService);
|
|
31
|
+
this.contactsSelectorService = inject(ContactsSelectorService);
|
|
32
|
+
this.happeningSlotModalService = inject(HappeningSlotModalService);
|
|
33
|
+
this.onContactAdded = (contact) => {
|
|
34
|
+
if (!this.slotContext) {
|
|
35
|
+
return NEVER;
|
|
36
|
+
}
|
|
37
|
+
if (!this.$space()) {
|
|
38
|
+
return NEVER;
|
|
39
|
+
}
|
|
40
|
+
const happeningID = this.slotContext.happening.id;
|
|
41
|
+
if (!happeningID) {
|
|
42
|
+
return NEVER;
|
|
43
|
+
}
|
|
44
|
+
const request = {
|
|
45
|
+
spaceID: this.$spaceID(),
|
|
46
|
+
happeningID,
|
|
47
|
+
contact: { id: contact.id },
|
|
48
|
+
};
|
|
49
|
+
return this.happeningService.addParticipant(request);
|
|
50
|
+
};
|
|
51
|
+
this.onContactRemoved = (member) => {
|
|
52
|
+
if (!this.slotContext || !this.$space()) {
|
|
53
|
+
return NEVER;
|
|
54
|
+
}
|
|
55
|
+
const request = {
|
|
56
|
+
spaceID: this.$space().id,
|
|
57
|
+
happeningID: this.slotContext.happening.id,
|
|
58
|
+
contact: { id: member.id },
|
|
59
|
+
};
|
|
60
|
+
return this.happeningService.removeParticipant(request);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
assign(event, _target) {
|
|
64
|
+
event.stopPropagation();
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
const space = this.$space();
|
|
67
|
+
if (!space || !this.slotContext) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const contacts = zipMapBriefsWithIDs(this.contactusSpace?.dbo?.contacts)?.map(addSpace(space)) || [];
|
|
71
|
+
const happening = this.slotContext.happening;
|
|
72
|
+
const selectedContacts = contacts
|
|
73
|
+
.filter((m) => hasRelated(happening?.dbo?.related || happening?.brief?.related, {
|
|
74
|
+
module: 'contactus',
|
|
75
|
+
collection: 'contacts',
|
|
76
|
+
spaceID: space.id || '',
|
|
77
|
+
itemID: m.id,
|
|
78
|
+
}))
|
|
79
|
+
.map(addSpace(space));
|
|
80
|
+
const options = {
|
|
81
|
+
// items: from(contacts),
|
|
82
|
+
selectedItems: selectedContacts,
|
|
83
|
+
onAdded: this.onContactAdded,
|
|
84
|
+
onRemoved: this.onContactRemoved,
|
|
85
|
+
};
|
|
86
|
+
this.popoverController.dismiss().catch(console.error);
|
|
87
|
+
this.contactsSelectorService.selectMultipleContacts(options);
|
|
88
|
+
}
|
|
89
|
+
move() {
|
|
90
|
+
this.notImplemented();
|
|
91
|
+
}
|
|
92
|
+
cancelAdjustment(event) {
|
|
93
|
+
event.stopPropagation();
|
|
94
|
+
event.preventDefault();
|
|
95
|
+
const dateID = this.dateID;
|
|
96
|
+
if (!dateID) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const slot = this.slotContext?.slot;
|
|
100
|
+
if (!slot) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const happeningID = this.slotContext?.happening?.id;
|
|
104
|
+
if (!happeningID) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
this.$happeningState.set('cancelling-adjustment');
|
|
108
|
+
this.happeningService
|
|
109
|
+
.cancelAdjustment(this.$spaceID(), happeningID, slot.id, dateID)
|
|
110
|
+
.subscribe({
|
|
111
|
+
next: () => this.dismissPopover(),
|
|
112
|
+
error: (err) => {
|
|
113
|
+
this.errorLogger.logError(err, 'Failed to cancel happening slot adjustment');
|
|
114
|
+
this.$happeningState.set(undefined);
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
edit(event, editMode) {
|
|
119
|
+
const happening = this.slotContext?.happening;
|
|
120
|
+
if (!happening) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (!this.$space()) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const recurring = this.dateID
|
|
127
|
+
? {
|
|
128
|
+
dateID: this.dateID,
|
|
129
|
+
adjustment: this.slotContext?.adjustment,
|
|
130
|
+
editMode,
|
|
131
|
+
}
|
|
132
|
+
: undefined;
|
|
133
|
+
this.happeningSlotModalService
|
|
134
|
+
.editSingleHappeningSlot(event, { ...happening, space: this.$space() }, recurring, this.slotContext?.slot)
|
|
135
|
+
.catch(this.errorLogger.logErrorHandler('Failed in editing single happening slot'));
|
|
136
|
+
this.dismissPopover();
|
|
137
|
+
}
|
|
138
|
+
delete(event) {
|
|
139
|
+
const slot = this.slotContext;
|
|
140
|
+
if (!slot) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (this.slotContext?.repeats === 'weekly' && !slot.wd) {
|
|
144
|
+
throw new Error('this.slot?.repeats === "weekly" && !slot.wd');
|
|
145
|
+
}
|
|
146
|
+
const request = this.createDeleteSlotRequest(event);
|
|
147
|
+
this.$happeningState.set('deleting');
|
|
148
|
+
this.happeningService.deleteSlot(request).subscribe({
|
|
149
|
+
next: () => {
|
|
150
|
+
this.$happeningState.set('deleted');
|
|
151
|
+
this.dismissPopover();
|
|
152
|
+
},
|
|
153
|
+
error: (err) => {
|
|
154
|
+
setTimeout(() => {
|
|
155
|
+
this.$happeningState.set(undefined);
|
|
156
|
+
this.errorLogger.logError(err, 'Failed to delete happening from context menu');
|
|
157
|
+
}, 2000);
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
dismissPopover() {
|
|
162
|
+
this.popoverController.dismiss().catch(this.errorLogger.logErrorHandler('Failed to dismiss popover', {
|
|
163
|
+
show: false,
|
|
164
|
+
feedback: false,
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
archive() {
|
|
168
|
+
this.notImplemented();
|
|
169
|
+
}
|
|
170
|
+
stopEvent(event) {
|
|
171
|
+
if (!this.$space()) {
|
|
172
|
+
throw new Error('!this.$space()');
|
|
173
|
+
}
|
|
174
|
+
if (!this.slotContext) {
|
|
175
|
+
throw new Error('!this.slot');
|
|
176
|
+
}
|
|
177
|
+
event.stopPropagation();
|
|
178
|
+
event.preventDefault();
|
|
179
|
+
return {
|
|
180
|
+
space: this.$space(),
|
|
181
|
+
slotContext: this.slotContext,
|
|
182
|
+
happening: this.slotContext.happening,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
createSlotRefRequest(event) {
|
|
186
|
+
const { slotContext, space, happening } = this.stopEvent(event);
|
|
187
|
+
return {
|
|
188
|
+
spaceID: space.id,
|
|
189
|
+
happeningID: happening.id,
|
|
190
|
+
slotID: slotContext.slot.id,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
createSlotRequest(event, mode) {
|
|
194
|
+
const { slotContext, space, happening } = this.stopEvent(event);
|
|
195
|
+
// const slotsCount = happening.brief?.slots?.length || happening.dto?.slots?.length || 0;
|
|
196
|
+
const request = excludeUndefined({
|
|
197
|
+
spaceID: space.id,
|
|
198
|
+
happeningID: happening.id,
|
|
199
|
+
slotID: mode === 'slot' ? slotContext.slot.id : undefined,
|
|
200
|
+
weekday: mode === 'slot' ? slotContext.wd : undefined,
|
|
201
|
+
date: mode === 'slot' && happening.brief?.type === 'recurring'
|
|
202
|
+
? this.dateID
|
|
203
|
+
: undefined,
|
|
204
|
+
});
|
|
205
|
+
return request;
|
|
206
|
+
}
|
|
207
|
+
createDeleteSlotRequest(event) {
|
|
208
|
+
return this.createSlotRefRequest(event);
|
|
209
|
+
}
|
|
210
|
+
createCancellationRequest(event, mode) {
|
|
211
|
+
return this.createSlotRequest(event, mode);
|
|
212
|
+
}
|
|
213
|
+
setHappeningStatus(status) {
|
|
214
|
+
if (!this.slotContext) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
let happening = this.slotContext.happening;
|
|
218
|
+
if (happening.brief) {
|
|
219
|
+
happening = {
|
|
220
|
+
...happening,
|
|
221
|
+
brief: { ...happening.brief, status },
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
if (happening.dbo) {
|
|
225
|
+
happening = {
|
|
226
|
+
...happening,
|
|
227
|
+
dbo: { ...happening.dbo, status },
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
this.slotContext = {
|
|
231
|
+
...this.slotContext,
|
|
232
|
+
happening,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
revokeCancellation(event) {
|
|
236
|
+
this.$happeningState.set('revoking-cancellation');
|
|
237
|
+
if (!this.slotContext) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const mode = this.slotContext.happening.brief?.status === 'canceled'
|
|
241
|
+
? 'whole'
|
|
242
|
+
: 'slot';
|
|
243
|
+
const request = this.createCancellationRequest(event, mode);
|
|
244
|
+
this.happeningService.revokeHappeningCancellation(request).subscribe({
|
|
245
|
+
next: () => {
|
|
246
|
+
this.$happeningState.set(undefined);
|
|
247
|
+
this.setHappeningStatus('active');
|
|
248
|
+
this.dismissPopover();
|
|
249
|
+
},
|
|
250
|
+
error: (err) => {
|
|
251
|
+
setTimeout(() => {
|
|
252
|
+
this.$happeningState.set(undefined);
|
|
253
|
+
this.errorLogger.logError(err, 'Failed to delete happening from context menu');
|
|
254
|
+
}, 2000);
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
markCanceled(event, mode) {
|
|
259
|
+
this.$happeningState.set(mode == 'slot' ? 'cancelling-single' : 'cancelling-series');
|
|
260
|
+
const request = this.createCancellationRequest(event, mode);
|
|
261
|
+
this.happeningService.cancelHappening(request).subscribe({
|
|
262
|
+
next: () => {
|
|
263
|
+
this.$happeningState.set('canceled');
|
|
264
|
+
this.setHappeningStatus('canceled');
|
|
265
|
+
this.dismissPopover();
|
|
266
|
+
},
|
|
267
|
+
error: (err) => {
|
|
268
|
+
setTimeout(() => {
|
|
269
|
+
this.$happeningState.set(undefined);
|
|
270
|
+
this.errorLogger.logError(err, 'Failed to delete happening from context menu');
|
|
271
|
+
}, 2000);
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
notImplemented() {
|
|
276
|
+
this.dismissPopover();
|
|
277
|
+
setTimeout(() => alert(notImplemented), 100);
|
|
278
|
+
}
|
|
279
|
+
numberOfSlots(happening) {
|
|
280
|
+
let n = 0;
|
|
281
|
+
if (!happening) {
|
|
282
|
+
return n;
|
|
283
|
+
}
|
|
284
|
+
const brief = happening?.brief;
|
|
285
|
+
if (!brief) {
|
|
286
|
+
return n;
|
|
287
|
+
}
|
|
288
|
+
const slots = brief.slots;
|
|
289
|
+
if (!slots) {
|
|
290
|
+
return n;
|
|
291
|
+
}
|
|
292
|
+
Object.values(slots).forEach((slot) => {
|
|
293
|
+
slot.weekdays?.forEach(() => n++);
|
|
294
|
+
});
|
|
295
|
+
return n;
|
|
296
|
+
}
|
|
297
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SlotContextMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
298
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: SlotContextMenuComponent, isStandalone: true, selector: "sneat-slot-context-menu", inputs: { contactusSpace: "contactusSpace", dateID: "dateID", slotContext: "slotContext" }, providers: [{ provide: ClassName, useValue: 'SlotContextMenuComponent' }], usesInheritance: true, ngImport: i0, template: "@if (slotContext) {\n <sneat-day-slot-item\n [$space]=\"$space()\"\n [color]=\"undefined\"\n [$slotContext]=\"slotContext\"\n color=\"light\"\n mode=\"brief\"\n />\n}\n\n<ion-item-group>\n <ion-item-divider color=\"light\">\n <ion-label>Adjust single for {{ dateID }}</ion-label>\n </ion-item-divider>\n @if (isCancelled) {\n <ion-item\n tappable\n (click)=\"revokeCancellation($event)\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n @if ($happeningState() === \"revoking-cancellation\") {\n <ion-label\n >Activating\n <ion-text\n color=\"medium\"\n style=\"font-size: smaller; font-style: italic\"\n >(revoking cancellation)\n </ion-text>\n ...\n </ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label>Revoke cancellation</ion-label>\n }\n </ion-item>\n } @else {\n @if (slotContext?.happening?.brief?.type === \"recurring\") {\n <ion-item\n tappable\n (click)=\"edit($event, 'single')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon slot=\"start\" name=\"calendar-outline\" />\n <ion-label\n >Adjust time for {{ dateID }} @\n {{ slotContext?.timing?.start?.time }}\n </ion-label>\n </ion-item>\n }\n\n @if (slotContext?.adjustment) {\n <ion-item\n tappable\n (click)=\"cancelAdjustment($event)\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n <ion-label>Cancel time adjustment</ion-label>\n </ion-item>\n }\n\n <ion-item\n tappable\n lines=\"full\"\n (click)=\"markCanceled($event, 'slot')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"danger\" />\n @if ($happeningState() === \"cancelling-single\") {\n <ion-label>Marking as canceled...</ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label>\n Cancel 1 on {{ dateID }} \"@{{ slotContext?.timing?.start?.time }}\n </ion-label>\n }\n </ion-item>\n }\n</ion-item-group>\n<ion-item-group>\n <ion-item-divider color=\"light\">\n <ion-label>Edit series</ion-label>\n </ion-item-divider>\n @if (!isCancelled) {\n <ion-item\n tappable\n (click)=\"edit($event, 'series')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"calendar-outline\" slot=\"start\" color=\"success\" />\n <ion-label>Change date or time</ion-label>\n </ion-item>\n <ion-item\n tappable\n (click)=\"assign($event, 'member')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"person-add-outline\" slot=\"start\" color=\"primary\" />\n <ion-label>Assign to member</ion-label>\n </ion-item>\n <ion-item\n tappable\n (click)=\"markCanceled($event, 'whole')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n\n @if ($happeningState() === \"cancelling-series\") {\n <ion-label>Marking as canceled...</ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label\n >Cancel series at {{ slotContext?.timing?.start?.time }}\n </ion-label>\n }\n </ion-item>\n }\n <!--<ion-item tappable (click)=\"edit()\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"create-outline\" slot=\"start\" color=\"success\"></ion-icon>-->\n <!--\t<ion-label>Edit</ion-label>-->\n <!--</ion-item>-->\n <!--<ion-item tappable (click)=\"assign('contact')\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"person-add-outline\" slot=\"start\" color=\"secondary\"></ion-icon>-->\n <!--\t<ion-label>Assign to contact</ion-label>-->\n <!--</ion-item>-->\n\n <!--<ion-item-divider color=\"light\">-->\n <!--\t<ion-label color=\"medium\">Remove from calendar</ion-label>-->\n <!--</ion-item-divider>-->\n\n <!--<ion-item tappable (click)=\"archive()\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"archive-outline\" slot=\"start\" color=\"medium\"></ion-icon>-->\n <!--\t<ion-label color=\"medium\">Archive</ion-label>-->\n <!--</ion-item>-->\n\n <ion-item tappable (click)=\"delete($event)\" [disabled]=\"$disabled()\">\n <ion-icon name=\"trash-outline\" slot=\"start\" color=\"danger\" />\n @switch (slotContext?.happening?.brief?.type) {\n @case (\"recurring\") {\n @if ($happeningState() === \"deleting\") {\n <ion-label color=\"danger\">\n <b>Deleting recurring...</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n } @else {\n <ion-label color=\"danger\">\n <b>Delete recurring slot</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n }\n }\n @case (\"single\") {\n @if ($happeningState() === \"deleting\") {\n <ion-label color=\"danger\">\n <b>Deleting 1-timer...</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n } @else {\n <ion-label color=\"danger\">\n <b>Delete 1-timer slot</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n }\n }\n }\n @if ($happeningState() === \"deleting\") {\n <ion-spinner slot=\"end\" />\n }\n </ion-item>\n</ion-item-group>\n", dependencies: [{ kind: "ngmodule", type: HappeningServiceModule }, { kind: "ngmodule", type: ContactsSelectorModule }, { kind: "ngmodule", type: HappeningSlotModalServiceModule }, { kind: "ngmodule", type: CalendarNavServicesModule }, { kind: "component", type: DaySlotItemComponent, selector: "sneat-day-slot-item", inputs: ["$slotContext", "dateID", "mode", "color", "contactusSpace"] }, { kind: "component", type: IonItemGroup, selector: "ion-item-group" }, { kind: "component", type: IonItemDivider, selector: "ion-item-divider", inputs: ["color", "mode", "sticky"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
299
|
+
}
|
|
300
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SlotContextMenuComponent, decorators: [{
|
|
301
|
+
type: Component,
|
|
302
|
+
args: [{ imports: [
|
|
303
|
+
HappeningServiceModule,
|
|
304
|
+
ContactsSelectorModule,
|
|
305
|
+
HappeningSlotModalServiceModule,
|
|
306
|
+
CalendarNavServicesModule,
|
|
307
|
+
DaySlotItemComponent,
|
|
308
|
+
IonItemGroup,
|
|
309
|
+
IonItemDivider,
|
|
310
|
+
IonLabel,
|
|
311
|
+
IonItem,
|
|
312
|
+
IonSpinner,
|
|
313
|
+
IonText,
|
|
314
|
+
IonIcon,
|
|
315
|
+
], providers: [{ provide: ClassName, useValue: 'SlotContextMenuComponent' }], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-slot-context-menu', template: "@if (slotContext) {\n <sneat-day-slot-item\n [$space]=\"$space()\"\n [color]=\"undefined\"\n [$slotContext]=\"slotContext\"\n color=\"light\"\n mode=\"brief\"\n />\n}\n\n<ion-item-group>\n <ion-item-divider color=\"light\">\n <ion-label>Adjust single for {{ dateID }}</ion-label>\n </ion-item-divider>\n @if (isCancelled) {\n <ion-item\n tappable\n (click)=\"revokeCancellation($event)\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n @if ($happeningState() === \"revoking-cancellation\") {\n <ion-label\n >Activating\n <ion-text\n color=\"medium\"\n style=\"font-size: smaller; font-style: italic\"\n >(revoking cancellation)\n </ion-text>\n ...\n </ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label>Revoke cancellation</ion-label>\n }\n </ion-item>\n } @else {\n @if (slotContext?.happening?.brief?.type === \"recurring\") {\n <ion-item\n tappable\n (click)=\"edit($event, 'single')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon slot=\"start\" name=\"calendar-outline\" />\n <ion-label\n >Adjust time for {{ dateID }} @\n {{ slotContext?.timing?.start?.time }}\n </ion-label>\n </ion-item>\n }\n\n @if (slotContext?.adjustment) {\n <ion-item\n tappable\n (click)=\"cancelAdjustment($event)\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n <ion-label>Cancel time adjustment</ion-label>\n </ion-item>\n }\n\n <ion-item\n tappable\n lines=\"full\"\n (click)=\"markCanceled($event, 'slot')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"danger\" />\n @if ($happeningState() === \"cancelling-single\") {\n <ion-label>Marking as canceled...</ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label>\n Cancel 1 on {{ dateID }} \"@{{ slotContext?.timing?.start?.time }}\n </ion-label>\n }\n </ion-item>\n }\n</ion-item-group>\n<ion-item-group>\n <ion-item-divider color=\"light\">\n <ion-label>Edit series</ion-label>\n </ion-item-divider>\n @if (!isCancelled) {\n <ion-item\n tappable\n (click)=\"edit($event, 'series')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"calendar-outline\" slot=\"start\" color=\"success\" />\n <ion-label>Change date or time</ion-label>\n </ion-item>\n <ion-item\n tappable\n (click)=\"assign($event, 'member')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"person-add-outline\" slot=\"start\" color=\"primary\" />\n <ion-label>Assign to member</ion-label>\n </ion-item>\n <ion-item\n tappable\n (click)=\"markCanceled($event, 'whole')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n\n @if ($happeningState() === \"cancelling-series\") {\n <ion-label>Marking as canceled...</ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label\n >Cancel series at {{ slotContext?.timing?.start?.time }}\n </ion-label>\n }\n </ion-item>\n }\n <!--<ion-item tappable (click)=\"edit()\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"create-outline\" slot=\"start\" color=\"success\"></ion-icon>-->\n <!--\t<ion-label>Edit</ion-label>-->\n <!--</ion-item>-->\n <!--<ion-item tappable (click)=\"assign('contact')\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"person-add-outline\" slot=\"start\" color=\"secondary\"></ion-icon>-->\n <!--\t<ion-label>Assign to contact</ion-label>-->\n <!--</ion-item>-->\n\n <!--<ion-item-divider color=\"light\">-->\n <!--\t<ion-label color=\"medium\">Remove from calendar</ion-label>-->\n <!--</ion-item-divider>-->\n\n <!--<ion-item tappable (click)=\"archive()\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"archive-outline\" slot=\"start\" color=\"medium\"></ion-icon>-->\n <!--\t<ion-label color=\"medium\">Archive</ion-label>-->\n <!--</ion-item>-->\n\n <ion-item tappable (click)=\"delete($event)\" [disabled]=\"$disabled()\">\n <ion-icon name=\"trash-outline\" slot=\"start\" color=\"danger\" />\n @switch (slotContext?.happening?.brief?.type) {\n @case (\"recurring\") {\n @if ($happeningState() === \"deleting\") {\n <ion-label color=\"danger\">\n <b>Deleting recurring...</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n } @else {\n <ion-label color=\"danger\">\n <b>Delete recurring slot</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n }\n }\n @case (\"single\") {\n @if ($happeningState() === \"deleting\") {\n <ion-label color=\"danger\">\n <b>Deleting 1-timer...</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n } @else {\n <ion-label color=\"danger\">\n <b>Delete 1-timer slot</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n }\n }\n }\n @if ($happeningState() === \"deleting\") {\n <ion-spinner slot=\"end\" />\n }\n </ion-item>\n</ion-item-group>\n" }]
|
|
316
|
+
}], ctorParameters: () => [], propDecorators: { contactusSpace: [{
|
|
317
|
+
type: Input,
|
|
318
|
+
args: [{ required: true }]
|
|
319
|
+
}], dateID: [{
|
|
320
|
+
type: Input
|
|
321
|
+
}], slotContext: [{
|
|
322
|
+
type: Input
|
|
323
|
+
}] } });
|
|
324
|
+
//# sourceMappingURL=slot-context-menu.component.js.map
|
package/esm2022/lib/components/calendar/components/day-slot-item/slot-context-menu.component.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-context-menu.component.js","sourceRoot":"","sources":["../../../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/calendar/components/day-slot-item/slot-context-menu.component.ts","../../../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/calendar/components/day-slot-item/slot-context-menu.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n Input,\n signal,\n} from '@angular/core';\nimport {\n IonIcon,\n IonItem,\n IonItemDivider,\n IonItemGroup,\n IonLabel,\n IonSpinner,\n IonText,\n PopoverController,\n} from '@ionic/angular/standalone';\nimport {\n addSpace,\n IContactusSpaceDboAndID,\n IContactWithBrief,\n} from '@sneat/contactus-core';\nimport { excludeUndefined } from '@sneat/core';\nimport { hasRelated } from '@sneat/dto';\nimport { WithSpaceInput } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { CalendarNavServicesModule } from '../../../../services';\nimport {\n HappeningUIState,\n IHappeningContext,\n HappeningStatus,\n} from '@sneat/mod-schedulus-core';\nimport { ISlotUIContext } from '@sneat/mod-schedulus-core';\nimport {\n ContactsSelectorModule,\n ContactsSelectorService,\n IContactSelectorOptions,\n} from '@sneat/contactus-shared';\nimport { ISpaceContext, zipMapBriefsWithIDs } from '@sneat/space-models';\nimport { NEVER, Observable } from 'rxjs';\nimport {\n EditRecurringSlotParams,\n HappeningSlotModalService,\n HappeningSlotModalServiceModule,\n} from '../../../happening-slot-form/happening-slot-modal.service';\nimport {\n HappeningService,\n HappeningServiceModule,\n ICancelHappeningRequest,\n IDeleteSlotRequest,\n IHappeningContactRequest,\n ISlotRefRequest,\n ISlotRequest,\n} from '../../../../services/happening.service';\nimport { DaySlotItemComponent } from './day-slot-item.component';\n\nconst notImplemented = 'Sorry, not implemented yet';\n\n@Component({\n imports: [\n HappeningServiceModule,\n ContactsSelectorModule,\n HappeningSlotModalServiceModule,\n CalendarNavServicesModule,\n DaySlotItemComponent,\n IonItemGroup,\n IonItemDivider,\n IonLabel,\n IonItem,\n IonSpinner,\n IonText,\n IonIcon,\n ],\n providers: [{ provide: ClassName, useValue: 'SlotContextMenuComponent' }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-slot-context-menu',\n templateUrl: 'slot-context-menu.component.html',\n})\nexport class SlotContextMenuComponent extends WithSpaceInput {\n @Input({ required: true }) contactusSpace?: IContactusSpaceDboAndID;\n\n @Input() dateID?: string;\n @Input() public slotContext?: ISlotUIContext;\n\n // protected readonly happening = signal<IHappeningContext | undefined>(\n // \tundefined,\n // );\n\n protected readonly $happeningState = signal<HappeningUIState | undefined>(\n undefined,\n );\n\n public get isCancelled(): boolean {\n return (\n this.slotContext?.happening.brief?.status === 'canceled' ||\n !!this.slotContext?.adjustment?.canceled\n );\n }\n\n protected readonly $disabled = computed(() => !!this.$happeningState());\n\n private readonly popoverController = inject(PopoverController);\n private readonly happeningService = inject(HappeningService);\n private readonly contactsSelectorService = inject(ContactsSelectorService);\n private readonly happeningSlotModalService = inject(\n HappeningSlotModalService,\n );\n\n public constructor() {\n super();\n }\n\n protected assign(event: Event, _target?: 'member'): void {\n event.stopPropagation();\n event.preventDefault();\n const space = this.$space();\n if (!space || !this.slotContext) {\n return;\n }\n const contacts =\n zipMapBriefsWithIDs(this.contactusSpace?.dbo?.contacts)?.map(\n addSpace(space),\n ) || [];\n const happening = this.slotContext.happening;\n const selectedContacts = contacts\n .filter((m) =>\n hasRelated(happening?.dbo?.related || happening?.brief?.related, {\n module: 'contactus',\n collection: 'contacts',\n spaceID: space.id || '',\n itemID: m.id,\n }),\n )\n .map(addSpace(space));\n const options: IContactSelectorOptions = {\n // items: from(contacts),\n selectedItems: selectedContacts,\n onAdded: this.onContactAdded,\n onRemoved: this.onContactRemoved,\n };\n this.popoverController.dismiss().catch(console.error);\n this.contactsSelectorService.selectMultipleContacts(options);\n }\n\n protected move(): void {\n this.notImplemented();\n }\n\n protected cancelAdjustment(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n const dateID = this.dateID;\n if (!dateID) {\n return;\n }\n const slot = this.slotContext?.slot;\n if (!slot) {\n return;\n }\n const happeningID = this.slotContext?.happening?.id;\n if (!happeningID) {\n return;\n }\n\n this.$happeningState.set('cancelling-adjustment');\n this.happeningService\n .cancelAdjustment(this.$spaceID(), happeningID, slot.id, dateID)\n .subscribe({\n next: () => this.dismissPopover(),\n error: (err) => {\n this.errorLogger.logError(\n err,\n 'Failed to cancel happening slot adjustment',\n );\n this.$happeningState.set(undefined);\n },\n });\n }\n\n protected edit(event: Event, editMode: 'series' | 'single'): void {\n const happening = this.slotContext?.happening;\n if (!happening) {\n return;\n }\n if (!this.$space()) {\n return;\n }\n const recurring: EditRecurringSlotParams | undefined = this.dateID\n ? {\n dateID: this.dateID,\n adjustment: this.slotContext?.adjustment,\n editMode,\n }\n : undefined;\n this.happeningSlotModalService\n .editSingleHappeningSlot(\n event,\n { ...happening, space: this.$space() },\n recurring,\n this.slotContext?.slot,\n )\n .catch(\n this.errorLogger.logErrorHandler(\n 'Failed in editing single happening slot',\n ),\n );\n this.dismissPopover();\n }\n\n delete(event: Event): void {\n const slot = this.slotContext;\n if (!slot) {\n return;\n }\n if (this.slotContext?.repeats === 'weekly' && !slot.wd) {\n throw new Error('this.slot?.repeats === \"weekly\" && !slot.wd');\n }\n const request = this.createDeleteSlotRequest(event);\n this.$happeningState.set('deleting');\n this.happeningService.deleteSlot(request).subscribe({\n next: () => {\n this.$happeningState.set('deleted');\n this.dismissPopover();\n },\n error: (err) => {\n setTimeout(() => {\n this.$happeningState.set(undefined);\n this.errorLogger.logError(\n err,\n 'Failed to delete happening from context menu',\n );\n }, 2000);\n },\n });\n }\n\n private dismissPopover(): void {\n this.popoverController.dismiss().catch(\n this.errorLogger.logErrorHandler('Failed to dismiss popover', {\n show: false,\n feedback: false,\n }),\n );\n }\n\n archive(): void {\n this.notImplemented();\n }\n\n private stopEvent(event: Event): {\n slotContext: ISlotUIContext;\n happening: IHappeningContext;\n space: ISpaceContext;\n } {\n if (!this.$space()) {\n throw new Error('!this.$space()');\n }\n if (!this.slotContext) {\n throw new Error('!this.slot');\n }\n event.stopPropagation();\n event.preventDefault();\n return {\n space: this.$space(),\n slotContext: this.slotContext,\n happening: this.slotContext.happening,\n };\n }\n\n private createSlotRefRequest(event: Event): ISlotRefRequest {\n const { slotContext, space, happening } = this.stopEvent(event);\n return {\n spaceID: space.id,\n happeningID: happening.id,\n slotID: slotContext.slot.id,\n };\n }\n\n private createSlotRequest(\n event: Event,\n mode: 'whole' | 'slot',\n ): ISlotRequest {\n const { slotContext, space, happening } = this.stopEvent(event);\n // const slotsCount = happening.brief?.slots?.length || happening.dto?.slots?.length || 0;\n const request: ISlotRequest = excludeUndefined({\n spaceID: space.id,\n happeningID: happening.id,\n slotID: mode === 'slot' ? slotContext.slot.id : undefined,\n weekday: mode === 'slot' ? slotContext.wd : undefined,\n date:\n mode === 'slot' && happening.brief?.type === 'recurring'\n ? this.dateID\n : undefined,\n });\n return request;\n }\n\n private createDeleteSlotRequest(event: Event): IDeleteSlotRequest {\n return this.createSlotRefRequest(event);\n }\n\n createCancellationRequest(\n event: Event,\n mode: 'whole' | 'slot',\n ): ICancelHappeningRequest {\n return this.createSlotRequest(event, mode);\n }\n\n private setHappeningStatus(status: HappeningStatus): void {\n if (!this.slotContext) {\n return;\n }\n let happening = this.slotContext.happening;\n if (happening.brief) {\n happening = {\n ...happening,\n brief: { ...happening.brief, status },\n };\n }\n if (happening.dbo) {\n happening = {\n ...happening,\n dbo: { ...happening.dbo, status },\n };\n }\n this.slotContext = {\n ...this.slotContext,\n happening,\n };\n }\n\n revokeCancellation(event: Event): void {\n this.$happeningState.set('revoking-cancellation');\n if (!this.slotContext) {\n return;\n }\n const mode: 'whole' | 'slot' =\n this.slotContext.happening.brief?.status === 'canceled'\n ? 'whole'\n : 'slot';\n const request = this.createCancellationRequest(event, mode);\n this.happeningService.revokeHappeningCancellation(request).subscribe({\n next: () => {\n this.$happeningState.set(undefined);\n this.setHappeningStatus('active');\n this.dismissPopover();\n },\n error: (err) => {\n setTimeout(() => {\n this.$happeningState.set(undefined);\n this.errorLogger.logError(\n err,\n 'Failed to delete happening from context menu',\n );\n }, 2000);\n },\n });\n }\n\n markCanceled(event: Event, mode: 'whole' | 'slot'): void {\n this.$happeningState.set(\n mode == 'slot' ? 'cancelling-single' : 'cancelling-series',\n );\n const request = this.createCancellationRequest(event, mode);\n this.happeningService.cancelHappening(request).subscribe({\n next: () => {\n this.$happeningState.set('canceled');\n this.setHappeningStatus('canceled');\n this.dismissPopover();\n },\n error: (err) => {\n setTimeout(() => {\n this.$happeningState.set(undefined);\n this.errorLogger.logError(\n err,\n 'Failed to delete happening from context menu',\n );\n }, 2000);\n },\n });\n }\n\n notImplemented(): void {\n this.dismissPopover();\n setTimeout(() => alert(notImplemented), 100);\n }\n\n numberOfSlots(happening?: IHappeningContext): number {\n let n = 0;\n if (!happening) {\n return n;\n }\n const brief = happening?.brief;\n if (!brief) {\n return n;\n }\n const slots = brief.slots;\n if (!slots) {\n return n;\n }\n Object.values(slots).forEach((slot) => {\n slot.weekdays?.forEach(() => n++);\n });\n return n;\n }\n\n private readonly onContactAdded = (\n contact: IContactWithBrief,\n ): Observable<void> => {\n if (!this.slotContext) {\n return NEVER;\n }\n if (!this.$space()) {\n return NEVER;\n }\n const happeningID = this.slotContext.happening.id;\n if (!happeningID) {\n return NEVER;\n }\n const request: IHappeningContactRequest = {\n spaceID: this.$spaceID(),\n happeningID,\n contact: { id: contact.id },\n };\n return this.happeningService.addParticipant(request);\n };\n\n private readonly onContactRemoved = (\n member: IContactWithBrief,\n ): Observable<void> => {\n if (!this.slotContext || !this.$space()) {\n return NEVER;\n }\n const request: IHappeningContactRequest = {\n spaceID: this.$space().id,\n happeningID: this.slotContext.happening.id,\n contact: { id: member.id },\n };\n return this.happeningService.removeParticipant(request);\n };\n}\n","@if (slotContext) {\n <sneat-day-slot-item\n [$space]=\"$space()\"\n [color]=\"undefined\"\n [$slotContext]=\"slotContext\"\n color=\"light\"\n mode=\"brief\"\n />\n}\n\n<ion-item-group>\n <ion-item-divider color=\"light\">\n <ion-label>Adjust single for {{ dateID }}</ion-label>\n </ion-item-divider>\n @if (isCancelled) {\n <ion-item\n tappable\n (click)=\"revokeCancellation($event)\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n @if ($happeningState() === \"revoking-cancellation\") {\n <ion-label\n >Activating\n <ion-text\n color=\"medium\"\n style=\"font-size: smaller; font-style: italic\"\n >(revoking cancellation)\n </ion-text>\n ...\n </ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label>Revoke cancellation</ion-label>\n }\n </ion-item>\n } @else {\n @if (slotContext?.happening?.brief?.type === \"recurring\") {\n <ion-item\n tappable\n (click)=\"edit($event, 'single')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon slot=\"start\" name=\"calendar-outline\" />\n <ion-label\n >Adjust time for {{ dateID }} @\n {{ slotContext?.timing?.start?.time }}\n </ion-label>\n </ion-item>\n }\n\n @if (slotContext?.adjustment) {\n <ion-item\n tappable\n (click)=\"cancelAdjustment($event)\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n <ion-label>Cancel time adjustment</ion-label>\n </ion-item>\n }\n\n <ion-item\n tappable\n lines=\"full\"\n (click)=\"markCanceled($event, 'slot')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"danger\" />\n @if ($happeningState() === \"cancelling-single\") {\n <ion-label>Marking as canceled...</ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label>\n Cancel 1 on {{ dateID }} \"@{{ slotContext?.timing?.start?.time }}\n </ion-label>\n }\n </ion-item>\n }\n</ion-item-group>\n<ion-item-group>\n <ion-item-divider color=\"light\">\n <ion-label>Edit series</ion-label>\n </ion-item-divider>\n @if (!isCancelled) {\n <ion-item\n tappable\n (click)=\"edit($event, 'series')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"calendar-outline\" slot=\"start\" color=\"success\" />\n <ion-label>Change date or time</ion-label>\n </ion-item>\n <ion-item\n tappable\n (click)=\"assign($event, 'member')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"person-add-outline\" slot=\"start\" color=\"primary\" />\n <ion-label>Assign to member</ion-label>\n </ion-item>\n <ion-item\n tappable\n (click)=\"markCanceled($event, 'whole')\"\n [disabled]=\"$disabled()\"\n >\n <ion-icon name=\"close-circle-outline\" slot=\"start\" color=\"warning\" />\n\n @if ($happeningState() === \"cancelling-series\") {\n <ion-label>Marking as canceled...</ion-label>\n <ion-spinner slot=\"end\" />\n } @else {\n <ion-label\n >Cancel series at {{ slotContext?.timing?.start?.time }}\n </ion-label>\n }\n </ion-item>\n }\n <!--<ion-item tappable (click)=\"edit()\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"create-outline\" slot=\"start\" color=\"success\"></ion-icon>-->\n <!--\t<ion-label>Edit</ion-label>-->\n <!--</ion-item>-->\n <!--<ion-item tappable (click)=\"assign('contact')\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"person-add-outline\" slot=\"start\" color=\"secondary\"></ion-icon>-->\n <!--\t<ion-label>Assign to contact</ion-label>-->\n <!--</ion-item>-->\n\n <!--<ion-item-divider color=\"light\">-->\n <!--\t<ion-label color=\"medium\">Remove from calendar</ion-label>-->\n <!--</ion-item-divider>-->\n\n <!--<ion-item tappable (click)=\"archive()\" [disabled]=\"$disabled()\">-->\n <!--\t<ion-icon name=\"archive-outline\" slot=\"start\" color=\"medium\"></ion-icon>-->\n <!--\t<ion-label color=\"medium\">Archive</ion-label>-->\n <!--</ion-item>-->\n\n <ion-item tappable (click)=\"delete($event)\" [disabled]=\"$disabled()\">\n <ion-icon name=\"trash-outline\" slot=\"start\" color=\"danger\" />\n @switch (slotContext?.happening?.brief?.type) {\n @case (\"recurring\") {\n @if ($happeningState() === \"deleting\") {\n <ion-label color=\"danger\">\n <b>Deleting recurring...</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n } @else {\n <ion-label color=\"danger\">\n <b>Delete recurring slot</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n }\n }\n @case (\"single\") {\n @if ($happeningState() === \"deleting\") {\n <ion-label color=\"danger\">\n <b>Deleting 1-timer...</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n } @else {\n <ion-label color=\"danger\">\n <b>Delete 1-timer slot</b>\n <!--\t\t\t({{numberOfSlots(slot?.happening)}} slots)-->\n </ion-label>\n }\n }\n }\n @if ($happeningState() === \"deleting\") {\n <ion-spinner slot=\"end\" />\n }\n </ion-item>\n</ion-item-group>\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, input, } from '@angular/core';
|
|
2
|
+
import { RouterLink } from '@angular/router';
|
|
3
|
+
import { IonButton, IonButtons, IonCard, IonCardContent, IonIcon, IonItem, IonLabel, IonRouterLink, IonSpinner, } from '@ionic/angular/standalone';
|
|
4
|
+
import { CalendarFilterService } from '../../../calendar-filter.service';
|
|
5
|
+
import { HappeningCardComponent } from '../../../happening-card/happening-card.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class RecurringsTabComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.$space = input.required(...(ngDevMode ? [{ debugName: "$space" }] : []));
|
|
10
|
+
this.$recurrings = input.required(...(ngDevMode ? [{ debugName: "$recurrings" }] : []));
|
|
11
|
+
this.$contactusSpace = input.required(...(ngDevMode ? [{ debugName: "$contactusSpace" }] : []));
|
|
12
|
+
this.$allRecurrings = input.required(...(ngDevMode ? [{ debugName: "$allRecurrings" }] : []));
|
|
13
|
+
this.$numberOfHidden = computed(() => (this.$allRecurrings()?.length || 0) - (this.$recurrings()?.length || 0), ...(ngDevMode ? [{ debugName: "$numberOfHidden" }] : []));
|
|
14
|
+
this.filterService = inject(CalendarFilterService);
|
|
15
|
+
this.resetFilter = (event) => this.filterService.resetScheduleFilter(event);
|
|
16
|
+
}
|
|
17
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RecurringsTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
18
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: RecurringsTabComponent, isStandalone: true, selector: "sneat-recurrings-tab", inputs: { $space: { classPropertyName: "$space", publicName: "$space", isSignal: true, isRequired: true, transformFunction: null }, $recurrings: { classPropertyName: "$recurrings", publicName: "$recurrings", isSignal: true, isRequired: true, transformFunction: null }, $contactusSpace: { classPropertyName: "$contactusSpace", publicName: "$contactusSpace", isSignal: true, isRequired: true, transformFunction: null }, $allRecurrings: { classPropertyName: "$allRecurrings", publicName: "$allRecurrings", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@let space = $space();\n@let allRecurrings = $allRecurrings();\n\n@if (allRecurrings) {\n @let numberOfHidden = $numberOfHidden();\n @if (!!numberOfHidden) {\n <ion-item class=\"ion-margin sneat-no-end-padding\">\n @if (numberOfHidden === 1) {\n <ion-label color=\"medium\"\n >{{ numberOfHidden }} out of {{ allRecurrings.length }}\n happenings is hidden by filter.\n </ion-label>\n } @else {\n <ion-label color=\"medium\"\n >{{ numberOfHidden }} out of {{ allRecurrings.length }} happenings are\n hidden by filter.\n </ion-label>\n }\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"resetFilter($event)\">\n <ion-icon slot=\"start\" name=\"close-circle-outline\" color=\"medium\" />\n <ion-label color=\"medium\">Reset filter</ion-label>\n </ion-button>\n </ion-buttons>\n </ion-item>\n }\n\n @if (allRecurrings && space) {\n @for (recurring of $recurrings() || []; track recurring.id) {\n <sneat-happening-card\n [$happening]=\"recurring\"\n [$space]=\"space\"\n [$contactusSpace]=\"$contactusSpace()\"\n />\n } @empty {\n @if ($allRecurrings()) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n No recurring activities have been added yet.\n </ion-label>\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"primary\"\n style=\"text-transform: none\"\n routerLink=\"../new-happening\"\n [queryParams]=\"{ type: 'recurring' }\"\n >\n <ion-icon name=\"duplicate-outline\" color=\"medium\" slot=\"start\" />\n <ion-label>Add 1st recurring</ion-label>\n </ion-button>\n </ion-buttons>\n </ion-item>\n }\n }\n }\n} @else {\n <ion-card>\n <ion-card-content>\n <ion-item class=\"ion-item-no-border\">\n <ion-spinner slot=\"start\" color=\"medium\" />\n <ion-label color=\"medium\">Loading...</ion-label>\n </ion-item>\n </ion-card-content>\n </ion-card>\n}\n", dependencies: [{ kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "directive", type: IonRouterLink, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: HappeningCardComponent, selector: "sneat-happening-card" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
19
|
+
}
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RecurringsTabComponent, decorators: [{
|
|
21
|
+
type: Component,
|
|
22
|
+
args: [{ imports: [
|
|
23
|
+
IonCard,
|
|
24
|
+
IonButtons,
|
|
25
|
+
IonButton,
|
|
26
|
+
IonItem,
|
|
27
|
+
IonLabel,
|
|
28
|
+
IonIcon,
|
|
29
|
+
IonRouterLink,
|
|
30
|
+
RouterLink,
|
|
31
|
+
IonCardContent,
|
|
32
|
+
IonSpinner,
|
|
33
|
+
HappeningCardComponent,
|
|
34
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-recurrings-tab', template: "@let space = $space();\n@let allRecurrings = $allRecurrings();\n\n@if (allRecurrings) {\n @let numberOfHidden = $numberOfHidden();\n @if (!!numberOfHidden) {\n <ion-item class=\"ion-margin sneat-no-end-padding\">\n @if (numberOfHidden === 1) {\n <ion-label color=\"medium\"\n >{{ numberOfHidden }} out of {{ allRecurrings.length }}\n happenings is hidden by filter.\n </ion-label>\n } @else {\n <ion-label color=\"medium\"\n >{{ numberOfHidden }} out of {{ allRecurrings.length }} happenings are\n hidden by filter.\n </ion-label>\n }\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"resetFilter($event)\">\n <ion-icon slot=\"start\" name=\"close-circle-outline\" color=\"medium\" />\n <ion-label color=\"medium\">Reset filter</ion-label>\n </ion-button>\n </ion-buttons>\n </ion-item>\n }\n\n @if (allRecurrings && space) {\n @for (recurring of $recurrings() || []; track recurring.id) {\n <sneat-happening-card\n [$happening]=\"recurring\"\n [$space]=\"space\"\n [$contactusSpace]=\"$contactusSpace()\"\n />\n } @empty {\n @if ($allRecurrings()) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n No recurring activities have been added yet.\n </ion-label>\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"primary\"\n style=\"text-transform: none\"\n routerLink=\"../new-happening\"\n [queryParams]=\"{ type: 'recurring' }\"\n >\n <ion-icon name=\"duplicate-outline\" color=\"medium\" slot=\"start\" />\n <ion-label>Add 1st recurring</ion-label>\n </ion-button>\n </ion-buttons>\n </ion-item>\n }\n }\n }\n} @else {\n <ion-card>\n <ion-card-content>\n <ion-item class=\"ion-item-no-border\">\n <ion-spinner slot=\"start\" color=\"medium\" />\n <ion-label color=\"medium\">Loading...</ion-label>\n </ion-item>\n </ion-card-content>\n </ion-card>\n}\n" }]
|
|
35
|
+
}], propDecorators: { $space: [{ type: i0.Input, args: [{ isSignal: true, alias: "$space", required: true }] }], $recurrings: [{ type: i0.Input, args: [{ isSignal: true, alias: "$recurrings", required: true }] }], $contactusSpace: [{ type: i0.Input, args: [{ isSignal: true, alias: "$contactusSpace", required: true }] }], $allRecurrings: [{ type: i0.Input, args: [{ isSignal: true, alias: "$allRecurrings", required: true }] }] } });
|
|
36
|
+
//# sourceMappingURL=recurrings-tab.component.js.map
|
package/esm2022/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurrings-tab.component.js","sourceRoot":"","sources":["../../../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.ts","../../../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,KAAK,GACN,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,cAAc,EACd,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,UAAU,GACX,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;;AAoB1F,MAAM,OAAO,sBAAsB;IAlBnC;QAmBkB,WAAM,GAAG,KAAK,CAAC,QAAQ,iDAA6B,CAAC;QAErD,gBAAW,GAAG,KAAK,CAAC,QAAQ,sDAEzC,CAAC;QAEY,oBAAe,GAAG,KAAK,CAAC,QAAQ,0DAE7C,CAAC;QAEY,mBAAc,GAAG,KAAK,CAAC,QAAQ,yDAE5C,CAAC;QAEe,oBAAe,GAAG,QAAQ,CAC3C,GAAG,EAAE,CACH,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,2DAC3E,CAAC;QAEM,kBAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACnC,gBAAW,GAAG,CAAC,KAAY,EAAE,EAAE,CAChD,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;KAejD;8GArCY,sBAAsB;kGAAtB,sBAAsB,soBC3CnC,snEAiEA,4CDtCI,OAAO,yLACP,UAAU,8EACV,SAAS,oPACT,OAAO,0NACP,QAAQ,6FACR,OAAO,2JACP,aAAa,0EACb,UAAU,oOACV,cAAc,+EACd,UAAU,yGACV,sBAAsB;;2FAMb,sBAAsB;kBAlBlC,SAAS;8BACC;wBACP,OAAO;wBACP,UAAU;wBACV,SAAS;wBACT,OAAO;wBACP,QAAQ;wBACR,OAAO;wBACP,aAAa;wBACb,UAAU;wBACV,cAAc;wBACd,UAAU;wBACV,sBAAsB;qBACvB,mBACgB,uBAAuB,CAAC,MAAM,YACrC,sBAAsB","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport {\n IonButton,\n IonButtons,\n IonCard,\n IonCardContent,\n IonIcon,\n IonItem,\n IonLabel,\n IonRouterLink,\n IonSpinner,\n} from '@ionic/angular/standalone';\nimport { IContactusSpaceDboAndID } from '@sneat/contactus-core';\nimport { IHappeningWithUiState } from '@sneat/mod-schedulus-core';\nimport { ISpaceContext } from '@sneat/space-models';\nimport { CalendarFilterService } from '../../../calendar-filter.service';\nimport { HappeningCardComponent } from '../../../happening-card/happening-card.component';\n\n@Component({\n imports: [\n IonCard,\n IonButtons,\n IonButton,\n IonItem,\n IonLabel,\n IonIcon,\n IonRouterLink,\n RouterLink,\n IonCardContent,\n IonSpinner,\n HappeningCardComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-recurrings-tab',\n templateUrl: 'recurrings-tab.component.html',\n})\nexport class RecurringsTabComponent {\n public readonly $space = input.required<ISpaceContext | undefined>();\n\n public readonly $recurrings = input.required<\n readonly IHappeningWithUiState[] | undefined\n >();\n\n public readonly $contactusSpace = input.required<\n IContactusSpaceDboAndID | undefined\n >();\n\n public readonly $allRecurrings = input.required<\n readonly IHappeningWithUiState[] | undefined\n >();\n\n protected readonly $numberOfHidden = computed(\n () =>\n (this.$allRecurrings()?.length || 0) - (this.$recurrings()?.length || 0),\n );\n\n private filterService = inject(CalendarFilterService);\n protected readonly resetFilter = (event: Event) =>\n this.filterService.resetScheduleFilter(event);\n\n // @Input({ required: true }) recurrings?: readonly IHappeningWithUiState[];\n // @Input({ required: true }) allRecurrings?: readonly IHappeningWithUiState[];\n // @Input({ required: true }) space?: ISpaceContext;\n\n // protected readonly resetFilter: (event: Event) => void;\n\n // protected get numberOfHidden(): number {\n // \treturn (this.allRecurrings?.length || 0) - (this.recurrings?.length || 0);\n // }\n\n // constructor(filterService: CalendarFilterService) {\n // \tthis.resetFilter = filterService.resetFilterHandler;\n // }\n}\n","@let space = $space();\n@let allRecurrings = $allRecurrings();\n\n@if (allRecurrings) {\n @let numberOfHidden = $numberOfHidden();\n @if (!!numberOfHidden) {\n <ion-item class=\"ion-margin sneat-no-end-padding\">\n @if (numberOfHidden === 1) {\n <ion-label color=\"medium\"\n >{{ numberOfHidden }} out of {{ allRecurrings.length }}\n happenings is hidden by filter.\n </ion-label>\n } @else {\n <ion-label color=\"medium\"\n >{{ numberOfHidden }} out of {{ allRecurrings.length }} happenings are\n hidden by filter.\n </ion-label>\n }\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"resetFilter($event)\">\n <ion-icon slot=\"start\" name=\"close-circle-outline\" color=\"medium\" />\n <ion-label color=\"medium\">Reset filter</ion-label>\n </ion-button>\n </ion-buttons>\n </ion-item>\n }\n\n @if (allRecurrings && space) {\n @for (recurring of $recurrings() || []; track recurring.id) {\n <sneat-happening-card\n [$happening]=\"recurring\"\n [$space]=\"space\"\n [$contactusSpace]=\"$contactusSpace()\"\n />\n } @empty {\n @if ($allRecurrings()) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n No recurring activities have been added yet.\n </ion-label>\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"primary\"\n style=\"text-transform: none\"\n routerLink=\"../new-happening\"\n [queryParams]=\"{ type: 'recurring' }\"\n >\n <ion-icon name=\"duplicate-outline\" color=\"medium\" slot=\"start\" />\n <ion-label>Add 1st recurring</ion-label>\n </ion-button>\n </ion-buttons>\n </ion-item>\n }\n }\n }\n} @else {\n <ion-card>\n <ion-card-content>\n <ion-item class=\"ion-item-no-border\">\n <ion-spinner slot=\"start\" color=\"medium\" />\n <ion-label color=\"medium\">Loading...</ion-label>\n </ion-item>\n </ion-card-content>\n </ion-card>\n}\n"]}
|
package/esm2022/lib/components/calendar/components/singles-tab/single-happenings-list.component.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, Input, inject, } from '@angular/core';
|
|
2
|
+
import { IonButton, IonCard, IonCardContent, IonLabel, IonSpinner, IonText, } from '@ionic/angular/standalone';
|
|
3
|
+
import { WithSpaceInput } from '@sneat/space-services';
|
|
4
|
+
import { ClassName } from '@sneat/ui';
|
|
5
|
+
import { takeUntil } from 'rxjs';
|
|
6
|
+
import { CalendarFilterService } from '../../../calendar-filter.service';
|
|
7
|
+
import { HappeningCardComponent } from '../../../happening-card/happening-card.component';
|
|
8
|
+
import { isMatchingScheduleFilter, } from '../calendar-filter/calendar-filter';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export class SingleHappeningsListComponent extends WithSpaceInput {
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
this.filterService = inject(CalendarFilterService);
|
|
14
|
+
this.$contactusSpace = input.required(...(ngDevMode ? [{ debugName: "$contactusSpace" }] : []));
|
|
15
|
+
this.happeningID = (_, h) => h.id;
|
|
16
|
+
const filterService = this.filterService;
|
|
17
|
+
filterService.filter
|
|
18
|
+
.pipe(takeUntil(this.destroyed$))
|
|
19
|
+
.subscribe((filter) => {
|
|
20
|
+
this.filter = filter;
|
|
21
|
+
this.applyFilter();
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
get numberOfHidden() {
|
|
25
|
+
return ((this.happenings?.length || 0) -
|
|
26
|
+
(this.happeningsMatchingFilter?.length || 0));
|
|
27
|
+
}
|
|
28
|
+
onHappeningRemoved(id) {
|
|
29
|
+
this.happenings = this.happenings?.filter((h) => h.id !== id);
|
|
30
|
+
this.applyFilter();
|
|
31
|
+
}
|
|
32
|
+
applyFilter() {
|
|
33
|
+
// console.log('applyFilter()', this.filter, this.happenings);
|
|
34
|
+
const f = this.filter;
|
|
35
|
+
this.happeningsMatchingFilter = this.happenings?.filter((h) => isMatchingScheduleFilter(h, f));
|
|
36
|
+
}
|
|
37
|
+
clearFilter(event) {
|
|
38
|
+
this.filterService.resetScheduleFilter(event);
|
|
39
|
+
}
|
|
40
|
+
ngOnChanges( /*changes: SimpleChanges*/) {
|
|
41
|
+
this.applyFilter();
|
|
42
|
+
}
|
|
43
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SingleHappeningsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
44
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: SingleHappeningsListComponent, isStandalone: true, selector: "sneat-single-happenings-list", inputs: { happenings: { classPropertyName: "happenings", publicName: "happenings", isSignal: false, isRequired: true, transformFunction: null }, $contactusSpace: { classPropertyName: "$contactusSpace", publicName: "$contactusSpace", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
45
|
+
{ provide: ClassName, useValue: 'SingleHappeningsListComponent' },
|
|
46
|
+
], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (!happenings) {\n <ion-card>\n <ion-card-content>\n <ion-spinner name=\"lines\" class=\"ion-margin-end\" />\n <ion-text color=\"medium\">Loading 1-timers...</ion-text>\n </ion-card-content>\n </ion-card>\n} @else if ($spaceID()) {\n @for (happening of happenings; track happening.id) {\n <sneat-happening-card\n [$space]=\"$space()\"\n [$happening]=\"happening\"\n [$contactusSpace]=\"$contactusSpace()\"\n (deleted)=\"onHappeningRemoved($event)\"\n />\n }\n}\n\n@if (!!numberOfHidden) {\n <div class=\"ion-margin-top\">\n @if (numberOfHidden === 1) {\n <span class=\"ion-margin\">\n 1 out of {{ happenings?.length || 0 }} happenings is hidden by filter.\n </span>\n }\n\n @if (numberOfHidden > 1) {\n <span class=\"ion-margin\">\n {{ numberOfHidden }} out of {{ happenings?.length || 0 }} happenings are\n hidden by filter.\n </span>\n }\n\n <ion-button color=\"medium\" fill=\"outline\" (click)=\"clearFilter($event)\">\n <ion-label>Clear filter</ion-label>\n </ion-button>\n </div>\n}\n\n@if (happenings && !happenings.length) {\n <ion-card>\n <ion-card-content>\n <ion-text color=\"medium\">No records found.</ion-text>\n </ion-card-content>\n </ion-card>\n}\n", dependencies: [{ kind: "component", type: HappeningCardComponent, selector: "sneat-happening-card" }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
47
|
+
}
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SingleHappeningsListComponent, decorators: [{
|
|
49
|
+
type: Component,
|
|
50
|
+
args: [{ imports: [
|
|
51
|
+
HappeningCardComponent,
|
|
52
|
+
IonCard,
|
|
53
|
+
IonCardContent,
|
|
54
|
+
IonSpinner,
|
|
55
|
+
IonText,
|
|
56
|
+
IonButton,
|
|
57
|
+
IonLabel,
|
|
58
|
+
], providers: [
|
|
59
|
+
{ provide: ClassName, useValue: 'SingleHappeningsListComponent' },
|
|
60
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-single-happenings-list', template: "@if (!happenings) {\n <ion-card>\n <ion-card-content>\n <ion-spinner name=\"lines\" class=\"ion-margin-end\" />\n <ion-text color=\"medium\">Loading 1-timers...</ion-text>\n </ion-card-content>\n </ion-card>\n} @else if ($spaceID()) {\n @for (happening of happenings; track happening.id) {\n <sneat-happening-card\n [$space]=\"$space()\"\n [$happening]=\"happening\"\n [$contactusSpace]=\"$contactusSpace()\"\n (deleted)=\"onHappeningRemoved($event)\"\n />\n }\n}\n\n@if (!!numberOfHidden) {\n <div class=\"ion-margin-top\">\n @if (numberOfHidden === 1) {\n <span class=\"ion-margin\">\n 1 out of {{ happenings?.length || 0 }} happenings is hidden by filter.\n </span>\n }\n\n @if (numberOfHidden > 1) {\n <span class=\"ion-margin\">\n {{ numberOfHidden }} out of {{ happenings?.length || 0 }} happenings are\n hidden by filter.\n </span>\n }\n\n <ion-button color=\"medium\" fill=\"outline\" (click)=\"clearFilter($event)\">\n <ion-label>Clear filter</ion-label>\n </ion-button>\n </div>\n}\n\n@if (happenings && !happenings.length) {\n <ion-card>\n <ion-card-content>\n <ion-text color=\"medium\">No records found.</ion-text>\n </ion-card-content>\n </ion-card>\n}\n" }]
|
|
61
|
+
}], ctorParameters: () => [], propDecorators: { happenings: [{
|
|
62
|
+
type: Input,
|
|
63
|
+
args: [{ required: true }]
|
|
64
|
+
}], $contactusSpace: [{ type: i0.Input, args: [{ isSignal: true, alias: "$contactusSpace", required: true }] }] } });
|
|
65
|
+
//# sourceMappingURL=single-happenings-list.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-happenings-list.component.js","sourceRoot":"","sources":["../../../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/calendar/components/singles-tab/single-happenings-list.component.ts","../../../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/calendar/components/singles-tab/single-happenings-list.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n Input,\n OnChanges,\n inject,\n} from '@angular/core';\nimport {\n IonButton,\n IonCard,\n IonCardContent,\n IonLabel,\n IonSpinner,\n IonText,\n} from '@ionic/angular/standalone';\nimport { IContactusSpaceDboAndID } from '@sneat/contactus-core';\nimport { IHappeningContext } from '@sneat/mod-schedulus-core';\nimport { WithSpaceInput } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { takeUntil } from 'rxjs';\nimport { CalendarFilterService } from '../../../calendar-filter.service';\nimport { HappeningCardComponent } from '../../../happening-card/happening-card.component';\nimport {\n ICalendarFilter,\n isMatchingScheduleFilter,\n} from '../calendar-filter/calendar-filter';\n\n@Component({\n imports: [\n HappeningCardComponent,\n IonCard,\n IonCardContent,\n IonSpinner,\n IonText,\n IonButton,\n IonLabel,\n ],\n providers: [\n { provide: ClassName, useValue: 'SingleHappeningsListComponent' },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-single-happenings-list',\n templateUrl: 'single-happenings-list.component.html',\n})\nexport class SingleHappeningsListComponent\n extends WithSpaceInput\n implements OnChanges\n{\n readonly filterService = inject(CalendarFilterService);\n\n @Input({ required: true }) public happenings?: IHappeningContext[];\n\n public readonly $contactusSpace = input.required<\n IContactusSpaceDboAndID | undefined\n >();\n\n private filter?: ICalendarFilter;\n\n protected happeningsMatchingFilter?: IHappeningContext[];\n\n constructor() {\n super();\n const filterService = this.filterService;\n\n filterService.filter\n .pipe(takeUntil(this.destroyed$))\n .subscribe((filter) => {\n this.filter = filter;\n this.applyFilter();\n });\n }\n\n protected readonly happeningID = (_: number, h: IHappeningContext) => h.id;\n\n protected get numberOfHidden(): number {\n return (\n (this.happenings?.length || 0) -\n (this.happeningsMatchingFilter?.length || 0)\n );\n }\n\n protected onHappeningRemoved(id: string): void {\n this.happenings = this.happenings?.filter((h) => h.id !== id);\n this.applyFilter();\n }\n\n private applyFilter(): void {\n // console.log('applyFilter()', this.filter, this.happenings);\n const f = this.filter;\n this.happeningsMatchingFilter = this.happenings?.filter((h) =>\n isMatchingScheduleFilter(h, f),\n );\n }\n\n protected clearFilter(event: Event): void {\n this.filterService.resetScheduleFilter(event);\n }\n\n public ngOnChanges(/*changes: SimpleChanges*/): void {\n this.applyFilter();\n }\n}\n","@if (!happenings) {\n <ion-card>\n <ion-card-content>\n <ion-spinner name=\"lines\" class=\"ion-margin-end\" />\n <ion-text color=\"medium\">Loading 1-timers...</ion-text>\n </ion-card-content>\n </ion-card>\n} @else if ($spaceID()) {\n @for (happening of happenings; track happening.id) {\n <sneat-happening-card\n [$space]=\"$space()\"\n [$happening]=\"happening\"\n [$contactusSpace]=\"$contactusSpace()\"\n (deleted)=\"onHappeningRemoved($event)\"\n />\n }\n}\n\n@if (!!numberOfHidden) {\n <div class=\"ion-margin-top\">\n @if (numberOfHidden === 1) {\n <span class=\"ion-margin\">\n 1 out of {{ happenings?.length || 0 }} happenings is hidden by filter.\n </span>\n }\n\n @if (numberOfHidden > 1) {\n <span class=\"ion-margin\">\n {{ numberOfHidden }} out of {{ happenings?.length || 0 }} happenings are\n hidden by filter.\n </span>\n }\n\n <ion-button color=\"medium\" fill=\"outline\" (click)=\"clearFilter($event)\">\n <ion-label>Clear filter</ion-label>\n </ion-button>\n </div>\n}\n\n@if (happenings && !happenings.length) {\n <ion-card>\n <ion-card-content>\n <ion-text color=\"medium\">No records found.</ion-text>\n </ion-card-content>\n </ion-card>\n}\n"]}
|