@sneat/extensions-schedulus-main 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.
Files changed (29) hide show
  1. package/esm2022/index.js +2 -0
  2. package/esm2022/index.js.map +1 -0
  3. package/esm2022/lib/index.js +2 -0
  4. package/esm2022/lib/index.js.map +1 -0
  5. package/esm2022/lib/pages/calendar/calendar-page.component.js +99 -0
  6. package/esm2022/lib/pages/calendar/calendar-page.component.js.map +1 -0
  7. package/esm2022/lib/pages/calendar-base-page.js +8 -0
  8. package/esm2022/lib/pages/calendar-base-page.js.map +1 -0
  9. package/esm2022/lib/pages/happening/happening-base-page.js +132 -0
  10. package/esm2022/lib/pages/happening/happening-base-page.js.map +1 -0
  11. package/esm2022/lib/pages/happening/happening-page.component.js +33 -0
  12. package/esm2022/lib/pages/happening/happening-page.component.js.map +1 -0
  13. package/esm2022/lib/pages/new-happening/new-happening-page.component.js +120 -0
  14. package/esm2022/lib/pages/new-happening/new-happening-page.component.js.map +1 -0
  15. package/esm2022/lib/schedulus-routing.js +40 -0
  16. package/esm2022/lib/schedulus-routing.js.map +1 -0
  17. package/esm2022/sneat-extensions-schedulus-main.js +5 -0
  18. package/esm2022/sneat-extensions-schedulus-main.js.map +1 -0
  19. package/index.d.ts +1 -0
  20. package/lib/index.d.ts +1 -0
  21. package/lib/pages/calendar/calendar-page.component.d.ts +18 -0
  22. package/lib/pages/calendar-base-page.d.ts +4 -0
  23. package/lib/pages/happening/happening-base-page.d.ts +16 -0
  24. package/lib/pages/happening/happening-page.component.d.ts +7 -0
  25. package/lib/pages/new-happening/new-happening-page.component.d.ts +17 -0
  26. package/lib/schedulus-routing.d.ts +2 -0
  27. package/package.json +26 -0
  28. package/sneat-extensions-schedulus-main.d.ts +5 -0
  29. package/tsconfig.lib.prod.tsbuildinfo +1 -0
@@ -0,0 +1,2 @@
1
+ export * from './lib';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/extensions/schedulus/main/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC","sourcesContent":["export * from './lib';\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './schedulus-routing';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/extensions/schedulus/main/src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC","sourcesContent":["export * from './schedulus-routing';\n"]}
@@ -0,0 +1,99 @@
1
+ import { ChangeDetectionStrategy, Component, signal, inject, } from '@angular/core';
2
+ import { IonBackButton, IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonLabel, IonMenuButton, IonTitle, IonToolbar, } from '@ionic/angular/standalone';
3
+ import { virtualSliderAnimations } from '@sneat/components';
4
+ import { ScheduleNavService, ScheduleNavServiceModule, } from '@sneat/mod-schedulus-core';
5
+ import { SpaceBaseComponent, SpaceComponentBaseParams, SpacePageTitleComponent, } from '@sneat/space-components';
6
+ import { CalendarComponent, } from '@sneat/extensions-schedulus-shared';
7
+ import { SpaceServiceModule } from '@sneat/space-services';
8
+ import { ClassName } from '@sneat/ui';
9
+ import * as i0 from "@angular/core";
10
+ export class CalendarPageComponent extends SpaceBaseComponent {
11
+ constructor() {
12
+ super();
13
+ this.scheduleNavService = inject(ScheduleNavService);
14
+ this.$tab = signal('day', ...(ngDevMode ? [{ debugName: "$tab" }] : []));
15
+ this.$date = signal('', ...(ngDevMode ? [{ debugName: "$date" }] : []));
16
+ this.$member = signal(undefined, ...(ngDevMode ? [{ debugName: "$member" }] : []));
17
+ // private filter: ICalendarFilter = emptyCalendarFilter;
18
+ this.onQueryParamsChanged = (queryParams) => {
19
+ const tab = queryParams.get('tab');
20
+ if (tab) {
21
+ switch (tab) {
22
+ case 'day':
23
+ case 'week':
24
+ case 'recurrings':
25
+ case 'singles':
26
+ this.$tab.set(tab);
27
+ break;
28
+ default:
29
+ // history.replaceState(history.state, document.title, `${location.href}?tab=${this.tab}`);
30
+ break;
31
+ }
32
+ }
33
+ const date = queryParams.get('date');
34
+ if (date && date.match(/^\d{4}-\d{2}-\d{2}$/)) {
35
+ this.$date.set(date);
36
+ // this.activeDay.date = isoStringsToDate(date);
37
+ }
38
+ const memberID = queryParams.get('member');
39
+ if (memberID) {
40
+ // this.filterService.next({ ...this.filter, contactIDs: [memberID] });
41
+ }
42
+ };
43
+ // filterService.filter.subscribe({
44
+ // next: (filter) => {
45
+ // this.filter = filter;
46
+ // },
47
+ // });
48
+ this.route?.queryParamMap.subscribe({
49
+ next: this.onQueryParamsChanged,
50
+ });
51
+ }
52
+ onTabChanged(tab) {
53
+ this.$tab.set(tab);
54
+ let { href } = location;
55
+ if (!href.includes('?')) {
56
+ href += '?tab=';
57
+ }
58
+ href = href.replace(/tab=.*?(&|$)/, `tab=${tab}`);
59
+ history.replaceState(history.state, document.title, href);
60
+ }
61
+ onDateChanged(date) {
62
+ this.$date.set(date);
63
+ }
64
+ goNew(type) {
65
+ if (!this.space) {
66
+ return;
67
+ }
68
+ const params = { type: type };
69
+ this.scheduleNavService.goNewHappening(this.space, params);
70
+ }
71
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CalendarPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
72
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: CalendarPageComponent, isStandalone: true, selector: "sneat-schedule-page", providers: [
73
+ { provide: ClassName, useValue: 'CalendarPageComponent' },
74
+ SpaceComponentBaseParams,
75
+ ], usesInheritance: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button with-end-buttons\">\n <ion-buttons slot=\"start\">\n <!--\t\t\t<ion-menu-button></ion-menu-button>-->\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n @if ($member(); as member) {\n <ion-title>\uD83D\uDCC5 {{ member.brief?.title }}</ion-title>\n } @else {\n <sneat-space-page-title\n [space]=\"space\"\n generalTitle=\"Schedule\"\n icon=\"\uD83D\uDCC5\"\n [titlesBySpaceType]=\"{\n family: 'Family calendar',\n personal: 'Personal calendar',\n }\"\n />\n }\n <ion-buttons slot=\"end\">\n <ion-button\n class=\"sneat-hide-if-width-less-638\"\n color=\"primary\"\n [disabled]=\"!space.id\"\n (click)=\"goNew('recurring')\"\n style=\"text-transform: none\"\n >\n <ion-icon name=\"duplicate-outline\" slot=\"start\" />\n <ion-label class=\"sneat-hide-if-width-less-766\"\n >Add recurring\n </ion-label>\n </ion-button>\n <ion-button\n class=\"sneat-hide-if-width-less-638\"\n color=\"primary\"\n [disabled]=\"!space.id\"\n (click)=\"goNew('single')\"\n style=\"text-transform: none\"\n >\n <ion-icon name=\"add-circle-outline\" slot=\"start\" />\n <ion-label class=\"sneat-hide-if-width-less-766\">Add 1-timer</ion-label>\n </ion-button>\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-calendar\n [$space]=\"$space()\"\n [tab]=\"$tab()\"\n (tabChanged)=\"onTabChanged($event)\"\n (dateChanged)=\"onDateChanged($event)\"\n />\n</ion-content>\n", styles: ["ion-list.no-v-padding{padding-top:0;padding-bottom:0}ion-checkbox{margin-right:1em}ion-footer ion-toolbar{--padding-start: 4px}ion-footer ion-toolbar ion-button{--margin-top: 0;--margin-bottom: 0;text-transform:none}\n"], dependencies: [{ kind: "component", type: SpacePageTitleComponent, selector: "sneat-space-page-title", inputs: ["icon", "generalTitle", "space", "titlesBySpaceType"] }, { kind: "ngmodule", type: ScheduleNavServiceModule }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonBackButton, selector: "ion-back-button" }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { 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: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }, { kind: "ngmodule", type: SpaceServiceModule }, { kind: "component", type: CalendarComponent, selector: "sneat-calendar", inputs: ["member", "tab"], outputs: ["tabChanged", "dateChanged"] }], animations: virtualSliderAnimations, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CalendarPageComponent, decorators: [{
78
+ type: Component,
79
+ args: [{ imports: [
80
+ SpacePageTitleComponent,
81
+ ScheduleNavServiceModule,
82
+ IonHeader,
83
+ IonToolbar,
84
+ IonButtons,
85
+ IonBackButton,
86
+ IonTitle,
87
+ IonIcon,
88
+ IonLabel,
89
+ IonButton,
90
+ IonContent,
91
+ IonMenuButton,
92
+ SpaceServiceModule,
93
+ CalendarComponent,
94
+ ], providers: [
95
+ { provide: ClassName, useValue: 'CalendarPageComponent' },
96
+ SpaceComponentBaseParams,
97
+ ], animations: virtualSliderAnimations, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-schedule-page', template: "<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button with-end-buttons\">\n <ion-buttons slot=\"start\">\n <!--\t\t\t<ion-menu-button></ion-menu-button>-->\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n @if ($member(); as member) {\n <ion-title>\uD83D\uDCC5 {{ member.brief?.title }}</ion-title>\n } @else {\n <sneat-space-page-title\n [space]=\"space\"\n generalTitle=\"Schedule\"\n icon=\"\uD83D\uDCC5\"\n [titlesBySpaceType]=\"{\n family: 'Family calendar',\n personal: 'Personal calendar',\n }\"\n />\n }\n <ion-buttons slot=\"end\">\n <ion-button\n class=\"sneat-hide-if-width-less-638\"\n color=\"primary\"\n [disabled]=\"!space.id\"\n (click)=\"goNew('recurring')\"\n style=\"text-transform: none\"\n >\n <ion-icon name=\"duplicate-outline\" slot=\"start\" />\n <ion-label class=\"sneat-hide-if-width-less-766\"\n >Add recurring\n </ion-label>\n </ion-button>\n <ion-button\n class=\"sneat-hide-if-width-less-638\"\n color=\"primary\"\n [disabled]=\"!space.id\"\n (click)=\"goNew('single')\"\n style=\"text-transform: none\"\n >\n <ion-icon name=\"add-circle-outline\" slot=\"start\" />\n <ion-label class=\"sneat-hide-if-width-less-766\">Add 1-timer</ion-label>\n </ion-button>\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-calendar\n [$space]=\"$space()\"\n [tab]=\"$tab()\"\n (tabChanged)=\"onTabChanged($event)\"\n (dateChanged)=\"onDateChanged($event)\"\n />\n</ion-content>\n", styles: ["ion-list.no-v-padding{padding-top:0;padding-bottom:0}ion-checkbox{margin-right:1em}ion-footer ion-toolbar{--padding-start: 4px}ion-footer ion-toolbar ion-button{--margin-top: 0;--margin-bottom: 0;text-transform:none}\n"] }]
98
+ }], ctorParameters: () => [] });
99
+ //# sourceMappingURL=calendar-page.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-page.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/main/src/lib/pages/calendar/calendar-page.component.ts","../../../../../../../../../libs/extensions/schedulus/main/src/lib/pages/calendar/calendar-page.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n signal,\n inject,\n} from '@angular/core';\nimport { ParamMap } from '@angular/router';\nimport {\n IonBackButton,\n IonButton,\n IonButtons,\n IonContent,\n IonHeader,\n IonIcon,\n IonLabel,\n IonMenuButton,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular/standalone';\nimport { virtualSliderAnimations } from '@sneat/components';\nimport {\n HappeningType,\n NewHappeningParams,\n ScheduleNavService,\n ScheduleNavServiceModule,\n} from '@sneat/mod-schedulus-core';\nimport {\n SpaceBaseComponent,\n SpaceComponentBaseParams,\n SpacePageTitleComponent,\n} from '@sneat/space-components';\nimport { IMemberContext } from '@sneat/contactus-core';\nimport {\n CalendarComponent,\n CalendarTab,\n} from '@sneat/extensions-schedulus-shared';\nimport { SpaceServiceModule } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\n\n@Component({\n imports: [\n SpacePageTitleComponent,\n ScheduleNavServiceModule,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonTitle,\n IonIcon,\n IonLabel,\n IonButton,\n IonContent,\n IonMenuButton,\n SpaceServiceModule,\n CalendarComponent,\n ],\n providers: [\n { provide: ClassName, useValue: 'CalendarPageComponent' },\n SpaceComponentBaseParams,\n ],\n animations: virtualSliderAnimations,\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-schedule-page',\n templateUrl: './calendar-page.component.html',\n styleUrls: ['./calendar-page.component.scss'],\n})\nexport class CalendarPageComponent extends SpaceBaseComponent {\n private readonly scheduleNavService = inject(ScheduleNavService);\n\n protected readonly $tab = signal<CalendarTab>('day');\n protected readonly $date = signal('');\n protected readonly $member = signal<IMemberContext | undefined>(undefined);\n\n public constructor() {\n super();\n\n // filterService.filter.subscribe({\n // \tnext: (filter) => {\n // \t\tthis.filter = filter;\n // \t},\n // });\n\n this.route?.queryParamMap.subscribe({\n next: this.onQueryParamsChanged,\n });\n }\n\n // private filter: ICalendarFilter = emptyCalendarFilter;\n\n private readonly onQueryParamsChanged = (queryParams: ParamMap) => {\n const tab = queryParams.get('tab') as CalendarTab;\n if (tab) {\n switch (tab) {\n case 'day':\n case 'week':\n case 'recurrings':\n case 'singles':\n this.$tab.set(tab);\n break;\n default:\n // history.replaceState(history.state, document.title, `${location.href}?tab=${this.tab}`);\n break;\n }\n }\n const date = queryParams.get('date');\n if (date && date.match(/^\\d{4}-\\d{2}-\\d{2}$/)) {\n this.$date.set(date);\n // this.activeDay.date = isoStringsToDate(date);\n }\n const memberID = queryParams.get('member');\n if (memberID) {\n // this.filterService.next({ ...this.filter, contactIDs: [memberID] });\n }\n };\n\n protected onTabChanged(tab: CalendarTab): void {\n this.$tab.set(tab);\n let { href } = location;\n if (!href.includes('?')) {\n href += '?tab=';\n }\n href = href.replace(/tab=.*?(&|$)/, `tab=${tab}`);\n history.replaceState(history.state, document.title, href);\n }\n\n protected onDateChanged(date: string): void {\n this.$date.set(date);\n }\n\n protected goNew(type: HappeningType): void {\n if (!this.space) {\n return;\n }\n const params: NewHappeningParams = { type: type };\n this.scheduleNavService.goNewHappening(this.space, params);\n }\n}\n","<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button with-end-buttons\">\n <ion-buttons slot=\"start\">\n <!--\t\t\t<ion-menu-button></ion-menu-button>-->\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n @if ($member(); as member) {\n <ion-title>📅 {{ member.brief?.title }}</ion-title>\n } @else {\n <sneat-space-page-title\n [space]=\"space\"\n generalTitle=\"Schedule\"\n icon=\"📅\"\n [titlesBySpaceType]=\"{\n family: 'Family calendar',\n personal: 'Personal calendar',\n }\"\n />\n }\n <ion-buttons slot=\"end\">\n <ion-button\n class=\"sneat-hide-if-width-less-638\"\n color=\"primary\"\n [disabled]=\"!space.id\"\n (click)=\"goNew('recurring')\"\n style=\"text-transform: none\"\n >\n <ion-icon name=\"duplicate-outline\" slot=\"start\" />\n <ion-label class=\"sneat-hide-if-width-less-766\"\n >Add recurring\n </ion-label>\n </ion-button>\n <ion-button\n class=\"sneat-hide-if-width-less-638\"\n color=\"primary\"\n [disabled]=\"!space.id\"\n (click)=\"goNew('single')\"\n style=\"text-transform: none\"\n >\n <ion-icon name=\"add-circle-outline\" slot=\"start\" />\n <ion-label class=\"sneat-hide-if-width-less-766\">Add 1-timer</ion-label>\n </ion-button>\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-calendar\n [$space]=\"$space()\"\n [tab]=\"$tab()\"\n (tabChanged)=\"onTabChanged($event)\"\n (dateChanged)=\"onDateChanged($event)\"\n />\n</ion-content>\n"]}
@@ -0,0 +1,8 @@
1
+ import { SpaceBaseComponent } from '@sneat/space-components';
2
+ export class CalendarBasePage extends SpaceBaseComponent {
3
+ constructor() {
4
+ super();
5
+ this.$defaultBackUrlSpacePath.set('calendar');
6
+ }
7
+ }
8
+ //# sourceMappingURL=calendar-base-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-base-page.js","sourceRoot":"","sources":["../../../../../../../../libs/extensions/schedulus/main/src/lib/pages/calendar-base-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,OAAgB,gBAAiB,SAAQ,kBAAkB;IAC/D;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;CACF","sourcesContent":["import { SpaceBaseComponent } from '@sneat/space-components';\n\nexport abstract class CalendarBasePage extends SpaceBaseComponent {\n protected constructor() {\n super();\n this.$defaultBackUrlSpacePath.set('calendar');\n }\n}\n"]}
@@ -0,0 +1,132 @@
1
+ import { computed, signal } from '@angular/core';
2
+ import { distinctUntilChanged, map, Subject, takeUntil, } from 'rxjs';
3
+ import { CalendarBasePage } from '../calendar-base-page';
4
+ const emptyHappeningContext = { id: '', space: { id: '' } };
5
+ export class HappeningBasePage extends CalendarBasePage {
6
+ constructor(params) {
7
+ // typeof SingleHappeningKind | typeof RegularHappeningKind>,
8
+ super();
9
+ this.params = params;
10
+ this.happeningID$ = new Subject(); //TODO: switch to $happeningID signal?
11
+ this.$happening = signal(emptyHappeningContext, ...(ngDevMode ? [{ debugName: "$happening" }] : []));
12
+ this.$happeningID = computed(() => this.$happening().id || undefined, ...(ngDevMode ? [{ debugName: "$happeningID" }] : []));
13
+ this.setHappening = (happening) => {
14
+ const prevHappening = this.$happening();
15
+ if (!happening.dbo && prevHappening.brief) {
16
+ happening = { ...happening, brief: prevHappening.brief };
17
+ }
18
+ if (!this.$spaceID() && happening.space) {
19
+ this.setSpaceRef(happening.space); // we probably should never hit this case
20
+ }
21
+ this.$happening.set(happening);
22
+ };
23
+ this.onHappeningIDChanged = (id) => {
24
+ if (!id) {
25
+ this.$happening.set(emptyHappeningContext);
26
+ return;
27
+ }
28
+ if (this.$happeningID() === id) {
29
+ return;
30
+ }
31
+ const space = this.space;
32
+ if (!space) {
33
+ console.error('Space is not defined');
34
+ }
35
+ this.setHappening({ id, space });
36
+ this.watchHappeningChanges(id);
37
+ };
38
+ try {
39
+ const happening = window.history.state
40
+ .happening;
41
+ if (happening) {
42
+ this.happeningID$.next(happening.id);
43
+ this.setHappening(happening);
44
+ this.watchHappeningChanges(happening.id, happening.space);
45
+ }
46
+ this.trackHappeningIDFromUrl();
47
+ }
48
+ catch (e) {
49
+ console.error(`Failed in ${this.className}.HappeningBasePage.constructor()`, e);
50
+ }
51
+ this.spaceChanged$.subscribe({
52
+ next: (space) => {
53
+ const happening = this.$happening();
54
+ if (space && happening) {
55
+ this.setHappening({ ...happening, space: space });
56
+ }
57
+ else if (!space) {
58
+ this.$happening.set(emptyHappeningContext);
59
+ }
60
+ },
61
+ });
62
+ }
63
+ onSpaceIdChanged() {
64
+ super.onSpaceIdChanged();
65
+ this.calendariumSpaceSub?.unsubscribe();
66
+ this.calendariumSpaceSub = this.params.calendariumSpaceService
67
+ .watchSpaceModuleRecord(this.space.id)
68
+ .subscribe({
69
+ next: (calendariumSpace) => {
70
+ const happening = this.$happening();
71
+ if (happening?.id &&
72
+ !happening?.dbo // If we loaded happening record we use it as a brief and ignore the brief from calendariumSpace
73
+ ) {
74
+ const brief = calendariumSpace.dbo?.recurringHappenings?.[happening?.id];
75
+ if (brief) {
76
+ this.setHappening({ ...happening, brief });
77
+ }
78
+ }
79
+ },
80
+ });
81
+ }
82
+ watchHappeningChanges(id, space) {
83
+ if (!space) {
84
+ space = this.space;
85
+ }
86
+ if (!space?.id) {
87
+ console.warn('watchHappeningChanges: space is not defined');
88
+ return;
89
+ }
90
+ try {
91
+ this.params.happeningService
92
+ .watchHappeningByID(space, id)
93
+ .pipe(this.takeUntilDestroyed(), takeUntil(this.happeningID$))
94
+ .subscribe({
95
+ next: (happening) => {
96
+ // This can be called twice - first for `snapshot.type=added`, then `snapshot.type=modified`
97
+ console.log('watchHappeningChanges() => happeningService.watchHappeningByID() => happening:', happening);
98
+ if (happening.id === this.$happeningID()) {
99
+ this.setHappening(happening);
100
+ }
101
+ },
102
+ error: this.logErrorHandler('failed to get happening by ID'),
103
+ });
104
+ }
105
+ catch (e) {
106
+ console.error(`Failed in ${this.className}.watchHappeningChanges(id=${id})`, e);
107
+ }
108
+ }
109
+ trackHappeningIDFromUrl() {
110
+ this.route?.params
111
+ .pipe(this.takeUntilDestroyed(), map((params) => params['happeningID']), distinctUntilChanged())
112
+ .subscribe({
113
+ next: (happeningID) => {
114
+ if (this.$happeningID() !== happeningID) {
115
+ this.$happening.set({
116
+ id: happeningID,
117
+ space: this.$space(),
118
+ });
119
+ this.happeningID$.next(happeningID);
120
+ }
121
+ },
122
+ });
123
+ this.happeningID$
124
+ .pipe(this.takeUntilDestroyed(), distinctUntilChanged())
125
+ .subscribe({
126
+ next: (happeningID) => {
127
+ this.onHappeningIDChanged(happeningID);
128
+ },
129
+ });
130
+ }
131
+ }
132
+ //# sourceMappingURL=happening-base-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happening-base-page.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/main/src/lib/pages/happening/happening-base-page.ts"],"names":[],"mappings":"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","sourcesContent":["import { computed, signal } from '@angular/core';\nimport { ISpaceRef } from '@sneat/core';\nimport { IHappeningContext } from '@sneat/mod-schedulus-core';\nimport {\n distinctUntilChanged,\n map,\n Subject,\n Subscription,\n takeUntil,\n} from 'rxjs';\nimport { CalendarBasePage } from '../calendar-base-page';\nimport { HappeningComponentBaseParams } from '@sneat/extensions-schedulus-shared';\n\nconst emptyHappeningContext = { id: '', space: { id: '' } };\n\nexport abstract class HappeningBasePage extends CalendarBasePage {\n private readonly happeningID$ = new Subject<string>(); //TODO: switch to $happeningID signal?\n protected readonly $happening = signal<IHappeningContext>(\n emptyHappeningContext,\n );\n protected readonly $happeningID = computed<string | undefined>(\n () => this.$happening().id || undefined,\n );\n\n // private calendariumSpaceDbo?: ICalendariumSpaceDbo | null;\n private calendariumSpaceSub?: Subscription;\n\n protected constructor(\n protected readonly params: HappeningComponentBaseParams, // \tHappeningModuleSchema,\n ) {\n // \ttypeof SingleHappeningKind | typeof RegularHappeningKind>,\n super();\n try {\n const happening = window.history.state\n .happening as unknown as IHappeningContext;\n if (happening) {\n this.happeningID$.next(happening.id);\n this.setHappening(happening);\n this.watchHappeningChanges(happening.id, happening.space);\n }\n this.trackHappeningIDFromUrl();\n } catch (e) {\n console.error(\n `Failed in ${this.className}.HappeningBasePage.constructor()`,\n e,\n );\n }\n this.spaceChanged$.subscribe({\n next: (space) => {\n const happening = this.$happening();\n if (space && happening) {\n this.setHappening({ ...happening, space: space });\n } else if (!space) {\n this.$happening.set(emptyHappeningContext);\n }\n },\n });\n }\n\n protected override onSpaceIdChanged(): void {\n super.onSpaceIdChanged();\n this.calendariumSpaceSub?.unsubscribe();\n this.calendariumSpaceSub = this.params.calendariumSpaceService\n .watchSpaceModuleRecord(this.space.id)\n .subscribe({\n next: (calendariumSpace) => {\n const happening = this.$happening();\n if (\n happening?.id &&\n !happening?.dbo // If we loaded happening record we use it as a brief and ignore the brief from calendariumSpace\n ) {\n const brief =\n calendariumSpace.dbo?.recurringHappenings?.[happening?.id];\n if (brief) {\n this.setHappening(\n { ...happening, brief },\n );\n }\n }\n },\n });\n }\n\n protected readonly setHappening = (\n happening: IHappeningContext,\n ): void => {\n const prevHappening = this.$happening();\n if (!happening.dbo && prevHappening.brief) {\n happening = { ...happening, brief: prevHappening.brief };\n }\n if (!this.$spaceID() && happening.space) {\n this.setSpaceRef(happening.space); // we probably should never hit this case\n }\n this.$happening.set(happening);\n };\n\n private readonly onHappeningIDChanged = (id?: string): void => {\n if (!id) {\n this.$happening.set(emptyHappeningContext);\n return;\n }\n if (this.$happeningID() === id) {\n return;\n }\n const space = this.space;\n if (!space) {\n console.error('Space is not defined');\n }\n this.setHappening({ id, space });\n this.watchHappeningChanges(id);\n };\n\n private watchHappeningChanges(id: string, space?: ISpaceRef): void {\n if (!space) {\n space = this.space;\n }\n if (!space?.id) {\n console.warn('watchHappeningChanges: space is not defined');\n return;\n }\n try {\n this.params.happeningService\n .watchHappeningByID(space, id)\n .pipe(this.takeUntilDestroyed(), takeUntil(this.happeningID$))\n .subscribe({\n next: (happening) => {\n // This can be called twice - first for `snapshot.type=added`, then `snapshot.type=modified`\n console.log(\n 'watchHappeningChanges() => happeningService.watchHappeningByID() => happening:',\n happening,\n );\n if (happening.id === this.$happeningID()) {\n this.setHappening(happening);\n }\n },\n error: this.logErrorHandler('failed to get happening by ID'),\n });\n } catch (e) {\n console.error(\n `Failed in ${this.className}.watchHappeningChanges(id=${id})`,\n e,\n );\n }\n }\n\n private trackHappeningIDFromUrl(): void {\n this.route?.params\n .pipe(\n this.takeUntilDestroyed(),\n map((params) => params['happeningID']),\n distinctUntilChanged(),\n )\n .subscribe({\n next: (happeningID) => {\n if (this.$happeningID() !== happeningID) {\n this.$happening.set({\n id: happeningID,\n space: this.$space(),\n });\n this.happeningID$.next(happeningID);\n }\n },\n });\n this.happeningID$\n .pipe(this.takeUntilDestroyed(), distinctUntilChanged())\n .subscribe({\n next: (happeningID) => {\n this.onHappeningIDChanged(happeningID);\n },\n });\n }\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
2
+ import { IonBackButton, IonButtons, IonContent, IonHeader, IonMenuButton, IonTitle, IonToolbar, } from '@ionic/angular/standalone';
3
+ import { ContactusServicesModule } from '@sneat/contactus-services';
4
+ import { SpaceServiceModule } from '@sneat/space-services';
5
+ import { ClassName } from '@sneat/ui';
6
+ import { HappeningBasePage } from './happening-base-page';
7
+ import { HappeningComponentBaseParams, HappeningComponentBaseParamsModule, HappeningFormComponent, HappeningServiceModule, } from '@sneat/extensions-schedulus-shared';
8
+ import * as i0 from "@angular/core";
9
+ export class HappeningPageComponent extends HappeningBasePage {
10
+ constructor() {
11
+ super(inject(HappeningComponentBaseParams));
12
+ }
13
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: HappeningPageComponent, isStandalone: true, selector: "sneat-happening-page", providers: [{ provide: ClassName, useValue: 'HappeningPageComponent' }], usesInheritance: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title color=\"medium\">\n @if ($happening(); as happening) {\n @switch (happening.brief?.type) {\n @case (\"recurring\") {\n Recurring happening\n }\n @case (\"single\") {\n One-time happening\n }\n @default {\n {{ happening.brief?.title || happening.id }}\n }\n }\n } @else {\n Loading...\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-happening-form\n [$space]=\"$space()\"\n [$happening]=\"$happening()\"\n (happeningChange)=\"$happening.set($event)\"\n />\n <!--\t<ion-card>-->\n <!--\t\t<ion-item>-->\n <!--\t\t\t<ion-label>Title: {{happening?.brief?.title}}</ion-label>-->\n <!--\t\t</ion-item>-->\n <!--\t</ion-card>-->\n <!--\t<ion-card>-->\n <!--\t\t<ion-item-group>-->\n <!--\t\t\t<ion-item-divider>-->\n <!--\t\t\t\t<ion-label>Timetable</ion-label>-->\n <!--\t\t\t</ion-item-divider>-->\n <!--\t\t\t<sneat-recurring-slots [slots]=\"happening?.dto?.slots\"></sneat-recurring-slots>-->\n <!--\t\t</ion-item-group>-->\n <!--\t</ion-card>-->\n</ion-content>\n", dependencies: [{ kind: "ngmodule", type: HappeningServiceModule }, { kind: "component", type: HappeningFormComponent, selector: "sneat-happening-form", inputs: ["$happening", "wd", "date"], outputs: ["happeningChange"] }, { kind: "ngmodule", type: ContactusServicesModule }, { kind: "ngmodule", type: HappeningComponentBaseParamsModule }, { kind: "ngmodule", type: SpaceServiceModule }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }, { kind: "component", type: IonBackButton, selector: "ion-back-button" }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningPageComponent, decorators: [{
17
+ type: Component,
18
+ args: [{ imports: [
19
+ HappeningServiceModule,
20
+ HappeningFormComponent,
21
+ ContactusServicesModule,
22
+ HappeningComponentBaseParamsModule,
23
+ SpaceServiceModule,
24
+ IonHeader,
25
+ IonButtons,
26
+ IonToolbar,
27
+ IonMenuButton,
28
+ IonBackButton,
29
+ IonTitle,
30
+ IonContent,
31
+ ], providers: [{ provide: ClassName, useValue: 'HappeningPageComponent' }], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-happening-page', template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title color=\"medium\">\n @if ($happening(); as happening) {\n @switch (happening.brief?.type) {\n @case (\"recurring\") {\n Recurring happening\n }\n @case (\"single\") {\n One-time happening\n }\n @default {\n {{ happening.brief?.title || happening.id }}\n }\n }\n } @else {\n Loading...\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-happening-form\n [$space]=\"$space()\"\n [$happening]=\"$happening()\"\n (happeningChange)=\"$happening.set($event)\"\n />\n <!--\t<ion-card>-->\n <!--\t\t<ion-item>-->\n <!--\t\t\t<ion-label>Title: {{happening?.brief?.title}}</ion-label>-->\n <!--\t\t</ion-item>-->\n <!--\t</ion-card>-->\n <!--\t<ion-card>-->\n <!--\t\t<ion-item-group>-->\n <!--\t\t\t<ion-item-divider>-->\n <!--\t\t\t\t<ion-label>Timetable</ion-label>-->\n <!--\t\t\t</ion-item-divider>-->\n <!--\t\t\t<sneat-recurring-slots [slots]=\"happening?.dto?.slots\"></sneat-recurring-slots>-->\n <!--\t\t</ion-item-group>-->\n <!--\t</ion-card>-->\n</ion-content>\n" }]
32
+ }], ctorParameters: () => [] });
33
+ //# sourceMappingURL=happening-page.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happening-page.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/main/src/lib/pages/happening/happening-page.component.ts","../../../../../../../../../libs/extensions/schedulus/main/src/lib/pages/happening/happening-page.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,QAAQ,EACR,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;;AAsB5C,MAAM,OAAO,sBAAuB,SAAQ,iBAAiB;IAC3D;QACE,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAC9C,CAAC;8GAHU,sBAAsB;kGAAtB,sBAAsB,mEALtB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,iDCpCzE,y4CAgDA,2CDzBI,sBAAsB,+BACtB,sBAAsB,oIACtB,uBAAuB,8BACvB,kCAAkC,8BAClC,kBAAkB,+BAClB,SAAS,oGACT,UAAU,8EACV,UAAU,mFACV,aAAa,+HACb,aAAa,4DACb,QAAQ,iFACR,UAAU;;2FAOD,sBAAsB;kBApBlC,SAAS;8BACC;wBACP,sBAAsB;wBACtB,sBAAsB;wBACtB,uBAAuB;wBACvB,kCAAkC;wBAClC,kBAAkB;wBAClB,SAAS;wBACT,UAAU;wBACV,UAAU;wBACV,aAAa;wBACb,aAAa;wBACb,QAAQ;wBACR,UAAU;qBACX,aACU,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,mBACtD,uBAAuB,CAAC,MAAM,YACrC,sBAAsB","sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport {\n IonBackButton,\n IonButtons,\n IonContent,\n IonHeader,\n IonMenuButton,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular/standalone';\nimport { ContactusServicesModule } from '@sneat/contactus-services';\nimport { SpaceServiceModule } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { HappeningBasePage } from './happening-base-page';\nimport {\n HappeningComponentBaseParams,\n HappeningComponentBaseParamsModule,\n HappeningFormComponent,\n HappeningServiceModule,\n} from '@sneat/extensions-schedulus-shared';\n\n@Component({\n imports: [\n HappeningServiceModule,\n HappeningFormComponent,\n ContactusServicesModule,\n HappeningComponentBaseParamsModule,\n SpaceServiceModule,\n IonHeader,\n IonButtons,\n IonToolbar,\n IonMenuButton,\n IonBackButton,\n IonTitle,\n IonContent,\n ],\n providers: [{ provide: ClassName, useValue: 'HappeningPageComponent' }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-happening-page',\n templateUrl: './happening-page.component.html',\n})\nexport class HappeningPageComponent extends HappeningBasePage {\n public constructor() {\n super(inject(HappeningComponentBaseParams));\n }\n}\n","<ion-header>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title color=\"medium\">\n @if ($happening(); as happening) {\n @switch (happening.brief?.type) {\n @case (\"recurring\") {\n Recurring happening\n }\n @case (\"single\") {\n One-time happening\n }\n @default {\n {{ happening.brief?.title || happening.id }}\n }\n }\n } @else {\n Loading...\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-happening-form\n [$space]=\"$space()\"\n [$happening]=\"$happening()\"\n (happeningChange)=\"$happening.set($event)\"\n />\n <!--\t<ion-card>-->\n <!--\t\t<ion-item>-->\n <!--\t\t\t<ion-label>Title: {{happening?.brief?.title}}</ion-label>-->\n <!--\t\t</ion-item>-->\n <!--\t</ion-card>-->\n <!--\t<ion-card>-->\n <!--\t\t<ion-item-group>-->\n <!--\t\t\t<ion-item-divider>-->\n <!--\t\t\t\t<ion-label>Timetable</ion-label>-->\n <!--\t\t\t</ion-item-divider>-->\n <!--\t\t\t<sneat-recurring-slots [slots]=\"happening?.dto?.slots\"></sneat-recurring-slots>-->\n <!--\t\t</ion-item-group>-->\n <!--\t</ion-card>-->\n</ion-content>\n"]}
@@ -0,0 +1,120 @@
1
+ import { Component, signal, ViewChild } from '@angular/core';
2
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
3
+ import { IonBackButton, IonButtons, IonContent, IonHeader, IonTitle, IonToolbar, } from '@ionic/angular/standalone';
4
+ import { ContactusServicesModule } from '@sneat/contactus-services';
5
+ import { newEmptyHappeningContext, } from '@sneat/mod-schedulus-core';
6
+ import { SpaceComponentBaseParams } from '@sneat/space-components';
7
+ import { SpaceServiceModule } from '@sneat/space-services';
8
+ import { ClassName } from '@sneat/ui';
9
+ import { first } from 'rxjs';
10
+ import { CalendarBasePage } from '../calendar-base-page';
11
+ import { HappeningFormComponent } from '@sneat/extensions-schedulus-shared';
12
+ import * as i0 from "@angular/core";
13
+ export class NewHappeningPageComponent extends CalendarBasePage {
14
+ constructor() {
15
+ super();
16
+ this.$happening = signal({
17
+ id: '',
18
+ space: { id: '' },
19
+ }, ...(ngDevMode ? [{ debugName: "$happening" }] : []));
20
+ this.isToDo = location.pathname.includes('/new-task');
21
+ this.date = history.state.date || '';
22
+ const type = window.history.state?.type;
23
+ if (type && this.space?.id && !this.$happening().id) {
24
+ this.createHappeningContext(type);
25
+ }
26
+ this.route.queryParamMap
27
+ .pipe(this.takeUntilDestroyed(), first())
28
+ .subscribe({
29
+ next: (queryParams) => {
30
+ console.log('NewHappeningPage.constructor() => queryParams:', queryParams);
31
+ const type = queryParams.get('type');
32
+ if (type !== 'single' && type !== 'recurring') {
33
+ console.warn('unknown happening type passed in URL: type=' + type);
34
+ return;
35
+ }
36
+ if (this.space && !this.$happening().id) {
37
+ this.createHappeningContext(type);
38
+ }
39
+ if (!this.wd) {
40
+ this.wd = queryParams.get('wd');
41
+ }
42
+ if (!this.date) {
43
+ this.date = queryParams.get('date') || '';
44
+ }
45
+ // if (!this.initialHappeningType) {
46
+ // this.initialHappeningType = queryParams.get('type') as HappeningType;
47
+ // }
48
+ },
49
+ error: this.logErrorHandler('failed to get query params'),
50
+ });
51
+ this.spaceChanged$.pipe(this.takeUntilDestroyed()).subscribe({
52
+ next: () => {
53
+ const happening = this.$happening();
54
+ if (happening) {
55
+ this.$happening.set({ ...happening, space: this.space });
56
+ }
57
+ },
58
+ });
59
+ }
60
+ createHappeningContext(type) {
61
+ const space = this.space;
62
+ if (!space) {
63
+ throw new Error('!space');
64
+ }
65
+ this.$happening.set(newEmptyHappeningContext(space, type, 'activity', 'active'));
66
+ }
67
+ // TODO(fix): protected onCommuneIdsChanged() {
68
+ // super.onCommuneIdsChanged();
69
+ // this.subscriptions.push(this.memberService.watchByCommuneId(this.communeRealId).subscribe(members => {
70
+ // this.members = members.map(m => new Member(m));
71
+ // this.members.sort((a, b) => a.title > b.title ? 1 : b.title > a.title ? -1 : 0); // TODO: Decouple
72
+ // this.adults = this.members.filter(m => m.dto.age === 'adult');
73
+ // this.kids = this.members.filter(m => m.dto.age === 'child');
74
+ // }));
75
+ // }
76
+ onHappeningChanged(happening) {
77
+ const happeningType = happening.brief?.type;
78
+ const typeChange = happeningType && happeningType !== happening.brief?.type;
79
+ this.$happening.set(happening);
80
+ if (typeChange) {
81
+ this.onHappeningTypeChanged(happeningType);
82
+ }
83
+ }
84
+ onHappeningTypeChanged(happeningType) {
85
+ let { href } = location;
86
+ if (!href.includes('?')) {
87
+ href += '?type=';
88
+ }
89
+ href = href.replace(/type=\w*/, `type=${happeningType}`);
90
+ history.replaceState(history.state, document.title, href);
91
+ }
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NewHappeningPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
93
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: NewHappeningPageComponent, isStandalone: true, selector: "sneat-happening-new", providers: [
94
+ { provide: ClassName, useValue: 'NewHappeningPageComponent' },
95
+ SpaceComponentBaseParams,
96
+ ], viewQueries: [{ propertyName: "happeningPageFormComponent", first: true, predicate: ["happeningPageFormComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n @if (isToDo) {\n <ion-title>\n New task\n @if (space) {\n &#64; {{ space.brief?.title }}\n }\n </ion-title>\n } @else {\n <ion-title>\n @if (space) {\n New happening &#64; {{ space.brief?.title }}\n } @else {\n New activity\n }\n </ion-title>\n }\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-happening-form\n #happeningPageFormComponent\n [$space]=\"$space()\"\n [$happening]=\"$happening()\"\n (happeningChange)=\"onHappeningChanged($event)\"\n [wd]=\"wd\"\n [date]=\"date\"\n />\n</ion-content>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: HappeningFormComponent, selector: "sneat-happening-form", inputs: ["$happening", "wd", "date"], outputs: ["happeningChange"] }, { kind: "ngmodule", type: ContactusServicesModule }, { kind: "ngmodule", type: SpaceServiceModule }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonBackButton, selector: "ion-back-button" }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }] }); }
97
+ }
98
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NewHappeningPageComponent, decorators: [{
99
+ type: Component,
100
+ args: [{ selector: 'sneat-happening-new', imports: [
101
+ FormsModule,
102
+ ReactiveFormsModule,
103
+ HappeningFormComponent,
104
+ ContactusServicesModule,
105
+ SpaceServiceModule,
106
+ IonHeader,
107
+ IonToolbar,
108
+ IonButtons,
109
+ IonBackButton,
110
+ IonTitle,
111
+ IonContent,
112
+ ], providers: [
113
+ { provide: ClassName, useValue: 'NewHappeningPageComponent' },
114
+ SpaceComponentBaseParams,
115
+ ], template: "<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n @if (isToDo) {\n <ion-title>\n New task\n @if (space) {\n &#64; {{ space.brief?.title }}\n }\n </ion-title>\n } @else {\n <ion-title>\n @if (space) {\n New happening &#64; {{ space.brief?.title }}\n } @else {\n New activity\n }\n </ion-title>\n }\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-happening-form\n #happeningPageFormComponent\n [$space]=\"$space()\"\n [$happening]=\"$happening()\"\n (happeningChange)=\"onHappeningChanged($event)\"\n [wd]=\"wd\"\n [date]=\"date\"\n />\n</ion-content>\n" }]
116
+ }], ctorParameters: () => [], propDecorators: { happeningPageFormComponent: [{
117
+ type: ViewChild,
118
+ args: ['happeningPageFormComponent']
119
+ }] } });
120
+ //# sourceMappingURL=new-happening-page.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-happening-page.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/main/src/lib/pages/new-happening/new-happening-page.component.ts","../../../../../../../../../libs/extensions/schedulus/main/src/lib/pages/new-happening/new-happening-page.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, signal, ViewChild } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n IonBackButton,\n IonButtons,\n IonContent,\n IonHeader,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular/standalone';\nimport { ContactusServicesModule } from '@sneat/contactus-services';\nimport {\n HappeningType,\n WeekdayCode2,\n IHappeningContext,\n newEmptyHappeningContext,\n} from '@sneat/mod-schedulus-core';\nimport { SpaceComponentBaseParams } from '@sneat/space-components';\nimport { SpaceServiceModule } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { first } from 'rxjs';\nimport { CalendarBasePage } from '../calendar-base-page';\nimport { HappeningFormComponent } from '@sneat/extensions-schedulus-shared';\n\n@Component({\n selector: 'sneat-happening-new',\n templateUrl: './new-happening-page.component.html',\n imports: [\n FormsModule,\n ReactiveFormsModule,\n HappeningFormComponent,\n ContactusServicesModule,\n SpaceServiceModule,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonTitle,\n IonContent,\n ],\n providers: [\n { provide: ClassName, useValue: 'NewHappeningPageComponent' },\n SpaceComponentBaseParams,\n ],\n})\nexport class NewHappeningPageComponent extends CalendarBasePage {\n @ViewChild('happeningPageFormComponent')\n happeningPageFormComponent?: HappeningFormComponent;\n\n protected isToDo: boolean;\n\n // protected initialHappeningType?: HappeningType;\n protected wd?: WeekdayCode2;\n protected date?: string;\n\n protected readonly $happening = signal<IHappeningContext>({\n id: '',\n space: { id: '' },\n });\n\n constructor() {\n super();\n this.isToDo = location.pathname.includes('/new-task');\n this.date = (history.state.date as string) || '';\n\n const type = window.history.state?.type as HappeningType;\n if (type && this.space?.id && !this.$happening().id) {\n this.createHappeningContext(type);\n }\n this.route.queryParamMap\n .pipe(this.takeUntilDestroyed(), first())\n .subscribe({\n next: (queryParams) => {\n console.log(\n 'NewHappeningPage.constructor() => queryParams:',\n queryParams,\n );\n const type = queryParams.get('type');\n if (type !== 'single' && type !== 'recurring') {\n console.warn('unknown happening type passed in URL: type=' + type);\n return;\n }\n if (this.space && !this.$happening().id) {\n this.createHappeningContext(type);\n }\n if (!this.wd) {\n this.wd = queryParams.get('wd') as WeekdayCode2;\n }\n if (!this.date) {\n this.date = queryParams.get('date') || '';\n }\n // if (!this.initialHappeningType) {\n // \tthis.initialHappeningType = queryParams.get('type') as HappeningType;\n // }\n },\n error: this.logErrorHandler('failed to get query params'),\n });\n this.spaceChanged$.pipe(this.takeUntilDestroyed()).subscribe({\n next: () => {\n const happening = this.$happening();\n if (happening) {\n this.$happening.set({ ...happening, space: this.space });\n }\n },\n });\n }\n\n private createHappeningContext(type: HappeningType): void {\n const space = this.space;\n if (!space) {\n throw new Error('!space');\n }\n this.$happening.set(\n newEmptyHappeningContext(space, type, 'activity', 'active'),\n );\n }\n\n // TODO(fix): protected onCommuneIdsChanged() {\n // super.onCommuneIdsChanged();\n // this.subscriptions.push(this.memberService.watchByCommuneId(this.communeRealId).subscribe(members => {\n // this.members = members.map(m => new Member(m));\n // this.members.sort((a, b) => a.title > b.title ? 1 : b.title > a.title ? -1 : 0); // TODO: Decouple\n // this.adults = this.members.filter(m => m.dto.age === 'adult');\n // this.kids = this.members.filter(m => m.dto.age === 'child');\n // }));\n // }\n\n protected onHappeningChanged(happening: IHappeningContext): void {\n const happeningType = happening.brief?.type;\n const typeChange = happeningType && happeningType !== happening.brief?.type;\n this.$happening.set(happening);\n if (typeChange) {\n this.onHappeningTypeChanged(happeningType);\n }\n }\n\n private onHappeningTypeChanged(happeningType: HappeningType): void {\n let { href } = location;\n if (!href.includes('?')) {\n href += '?type=';\n }\n href = href.replace(/type=\\w*/, `type=${happeningType}`);\n history.replaceState(history.state, document.title, href);\n }\n}\n","<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n @if (isToDo) {\n <ion-title>\n New task\n @if (space) {\n &#64; {{ space.brief?.title }}\n }\n </ion-title>\n } @else {\n <ion-title>\n @if (space) {\n New happening &#64; {{ space.brief?.title }}\n } @else {\n New activity\n }\n </ion-title>\n }\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-happening-form\n #happeningPageFormComponent\n [$space]=\"$space()\"\n [$happening]=\"$happening()\"\n (happeningChange)=\"onHappeningChanged($event)\"\n [wd]=\"wd\"\n [date]=\"date\"\n />\n</ion-content>\n"]}
@@ -0,0 +1,40 @@
1
+ // import {guardRoute} from '../../utils/guard-route';
2
+ export const calendariumRoutes = [
3
+ {
4
+ path: 'calendar',
5
+ data: { title: 'Calendar' },
6
+ loadComponent: () => import('./pages/calendar/calendar-page.component').then((m) => m.CalendarPageComponent),
7
+ // ...guardRoute,
8
+ },
9
+ {
10
+ path: 'new-happening',
11
+ data: { title: 'New happening' },
12
+ loadComponent: () => import('./pages/new-happening/new-happening-page.component').then((m) => m.NewHappeningPageComponent),
13
+ // ...guardRoute,
14
+ },
15
+ {
16
+ path: 'happening/:happeningID',
17
+ data: { title: 'Happening' },
18
+ loadComponent: () => import('./pages/happening/happening-page.component').then((m) => m.HappeningPageComponent),
19
+ // ...guardRoute,
20
+ },
21
+ // {
22
+ // path: 'new-task',
23
+ // loadChildren: () => import('./new-happening/new-happening-page.module')
24
+ // .then(m => m.NewHappeningPageModule),
25
+ // ...guardRoute,
26
+ // },
27
+ // {
28
+ // path: 'regular-task',
29
+ // loadChildren: () => import('./happening/regular/regular-happening.page.module')
30
+ // .then(m => m.RegularHappeningPageModule),
31
+ // ...guardRoute,
32
+ // },
33
+ // {
34
+ // path: 'task',
35
+ // loadChildren: () => import('./happening/single/single-happening-page.module')
36
+ // .then(m => m.SingleHappeningPageModule),
37
+ // ...guardRoute,
38
+ // },
39
+ ];
40
+ //# sourceMappingURL=schedulus-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedulus-routing.js","sourceRoot":"","sources":["../../../../../../../libs/extensions/schedulus/main/src/lib/schedulus-routing.ts"],"names":[],"mappings":"AACA,sDAAsD;AAEtD,MAAM,CAAC,MAAM,iBAAiB,GAAY;IACxC;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;QAC3B,aAAa,EAAE,GAAG,EAAE,CAClB,MAAM,CAAC,0CAA0C,CAAC,CAAC,IAAI,CACrD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAC/B;QACH,iBAAiB;KAClB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE;QAChC,aAAa,EAAE,GAAG,EAAE,CAClB,MAAM,CAAC,oDAAoD,CAAC,CAAC,IAAI,CAC/D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,yBAAyB,CACnC;QACH,iBAAiB;KAClB;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;QAC5B,aAAa,EAAE,GAAG,EAAE,CAClB,MAAM,CAAC,4CAA4C,CAAC,CAAC,IAAI,CACvD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAChC;QACH,iBAAiB;KAClB;IACD,IAAI;IACJ,qBAAqB;IACrB,2EAA2E;IAC3E,0CAA0C;IAC1C,kBAAkB;IAClB,KAAK;IACL,IAAI;IACJ,yBAAyB;IACzB,mFAAmF;IACnF,8CAA8C;IAC9C,kBAAkB;IAClB,KAAK;IACL,IAAI;IACJ,iBAAiB;IACjB,iFAAiF;IACjF,6CAA6C;IAC7C,kBAAkB;IAClB,KAAK;CACN,CAAC","sourcesContent":["import { Route } from '@angular/router';\n// import {guardRoute} from '../../utils/guard-route';\n\nexport const calendariumRoutes: Route[] = [\n {\n path: 'calendar',\n data: { title: 'Calendar' },\n loadComponent: () =>\n import('./pages/calendar/calendar-page.component').then(\n (m) => m.CalendarPageComponent,\n ),\n // ...guardRoute,\n },\n {\n path: 'new-happening',\n data: { title: 'New happening' },\n loadComponent: () =>\n import('./pages/new-happening/new-happening-page.component').then(\n (m) => m.NewHappeningPageComponent,\n ),\n // ...guardRoute,\n },\n {\n path: 'happening/:happeningID',\n data: { title: 'Happening' },\n loadComponent: () =>\n import('./pages/happening/happening-page.component').then(\n (m) => m.HappeningPageComponent,\n ),\n // ...guardRoute,\n },\n // {\n // \tpath: 'new-task',\n // \tloadChildren: () => import('./new-happening/new-happening-page.module')\n // \t\t.then(m => m.NewHappeningPageModule),\n // \t...guardRoute,\n // },\n // {\n // \tpath: 'regular-task',\n // \tloadChildren: () => import('./happening/regular/regular-happening.page.module')\n // \t\t.then(m => m.RegularHappeningPageModule),\n // \t...guardRoute,\n // },\n // {\n // \tpath: 'task',\n // \tloadChildren: () => import('./happening/single/single-happening-page.module')\n // \t\t.then(m => m.SingleHappeningPageModule),\n // \t...guardRoute,\n // },\n];\n"]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=sneat-extensions-schedulus-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sneat-extensions-schedulus-main.js","sourceRoot":"","sources":["../../../../../../libs/extensions/schedulus/main/src/sneat-extensions-schedulus-main.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC","sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"]}
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lib';
package/lib/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './schedulus-routing';
@@ -0,0 +1,18 @@
1
+ import { HappeningType } from '@sneat/mod-schedulus-core';
2
+ import { SpaceBaseComponent } from '@sneat/space-components';
3
+ import { IMemberContext } from '@sneat/contactus-core';
4
+ import { CalendarTab } from '@sneat/extensions-schedulus-shared';
5
+ import * as i0 from "@angular/core";
6
+ export declare class CalendarPageComponent extends SpaceBaseComponent {
7
+ private readonly scheduleNavService;
8
+ protected readonly $tab: import("@angular/core").WritableSignal<CalendarTab>;
9
+ protected readonly $date: import("@angular/core").WritableSignal<string>;
10
+ protected readonly $member: import("@angular/core").WritableSignal<IMemberContext | undefined>;
11
+ constructor();
12
+ private readonly onQueryParamsChanged;
13
+ protected onTabChanged(tab: CalendarTab): void;
14
+ protected onDateChanged(date: string): void;
15
+ protected goNew(type: HappeningType): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalendarPageComponent, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<CalendarPageComponent, "sneat-schedule-page", never, {}, {}, never, never, true, never>;
18
+ }