@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"happening-slot-form.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/happening-slot-form/happening-slot-form.component.ts","../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/happening-slot-form/happening-slot-form.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,KAAK,EAGL,MAAM,EACN,MAAM,EAEN,SAAS,EACT,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,WAAW,EACX,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,cAAc,EACd,QAAQ,EACR,OAAO,EACP,MAAM,EACN,SAAS,EACT,eAAe,EACf,UAAU,EACV,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,SAAS,EAAe,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EACL,WAAW,GAUZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,8DAA8D,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;;;AA4CpE;;;;GAIG;AACH,MAAM,OAAO,0BACX,SAAQ,gBAAgB;IA6Cd,oBAAoB,CAAC,CAAS;QACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAA2B,CAAC,CAAC;IACpD,CAAC;IAwDD;QACE,KAAK,CAAC,IAAI,CAAC,CAAC;QArGK,cAAS,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QACtC,qBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAE7C,eAAU,GAAG,KAAK,CAAC,QAAQ,qDAAqB,CAAC;QACjD,iBAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,wDAAC,CAAC;QACjD,mBAAc,GAAG,QAAQ,CAC1C,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,0DACpC,CAAC;QAMO,WAAM,GAAG,KAAK,CAAC;QAEL,cAAS,GAAG,IAAI,YAAY,EAAkB,CAAC;QAC/C,oBAAe,GAAG,IAAI,YAAY,EAAqB,CAAC;QACxD,sBAAiB,GAAG,IAAI,YAAY,EAAW,CAAC;QAKzD,WAAM,GAAY,WAAW,CAAC;QAErB,UAAK,GAAG,MAAM,CAAC,EAAE,iDAAC,CAAC;QAE5B,QAAG,GAAqB,MAAM,CAAC;QAEzC,oBAAoB;QACpB,iDAAiD;QAE9B,mBAAc,GAA2B;YAC1D,wFAAwF;YACxF,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACjC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;YACnC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;SAClC,CAAC;QAEiB,gBAAW,GAAG,MAAM,CAAmB,EAAE,uDAAC,CAAC;QAE3C,gBAAW,GAAG,MAAM,CAAC,CAAC,uDAAC,CAAC;QAMjC,wBAAmB,GAAG,EAAE,CAAC;QAEhB,eAAU,GAAG,MAAM,CAAC,KAAK,sDAAC,CAAC;QAE3B,iBAAY,GAA2B;YACxD,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE;YAC5C,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE;YAC7C,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,EAAE;YAC9C,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE;YAC7C,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,EAAE;YAC9C,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE;SAChD,CAAC;QAEiB,aAAQ,GAAG,IAAI,gBAAgB,CAAC;YACjD,aAAa,EAAE,IAAI,WAAW,CAAS,EAAE,CAAC;YAC1C,eAAe,EAAE,IAAI,WAAW,CAAS,EAAE,CAAC;SAC7C,CAAC,CAAC;QAEgB,YAAO,GAAG,MAAM,CAAsB,SAAS,mDAAC,CAAC;QAEjD,iBAAY,GAAG,QAAQ,CACxC,GAAG,EAAE;QACH,gCAAgC;QAChC,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ;YAC3B,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS;gBAC3B,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,wDACpD,CAAC;QAEiB,iBAAY,GAAG,QAAQ,CAAC,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACrD,OAAO,CACL,IAAI,CAAC,cAAc,EAAE,KAAK,QAAQ;gBAClC,yBAAyB;gBACzB,CAAC,OAAO,KAAK,QAAQ,IAAI,kBAAkB,CAAC;gBAC5C,CAAC,OAAO,KAAK,SAAS;oBACpB,CAAC,CAAC,WAAW,KAAK,aAAa,IAAI,CAAC,CAAC,WAAW,CAAC;wBAC/C,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAC3D,CAAC;QACJ,CAAC,wDAAC,CAAC;QAEgB,sBAAiB,GAAG,QAAQ,CAAC,GAAG,EAAE;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,OAAO;YACL,yBAAyB;YACzB,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACnD,CAAC,OAAO,KAAK,SAAS,IAAI,WAAW,KAAK,aAAa,IAAI,CAAC,CAAC,WAAW,CAAC,CAC1E,CAAC;QACJ,CAAC,6DAAC,CAAC;QAwIgB,gBAAW,GAAG,IAAI,WAAW,CAC9C,SAAS,CACV,CAAC;QAEiB,cAAS,GAAwB;YAClD,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACf,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YACpB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YACpB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YACpB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;SACzB,CAAC;QAEiB,WAAM,GAAa;YACpC,SAAS;YACT,UAAU;YACV,OAAO;YACP,OAAO;YACP,KAAK;YACL,MAAM;YACN,MAAM;YACN,QAAQ;YACR,WAAW;YACX,SAAS;YACT,UAAU;YACV,UAAU;SACX,CAAC;QA9JA,0BAA0B;QAC1B,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAkB,CAAC;QAC/D,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,8EAA8E;QAC9E,yCAAyC;QACzC,MAAM;IACR,CAAC;IAED,8CAA8C;IAC9C,kBAAkB;IAClB,+CAA+C;IAC/C,KAAK;IACL,IAAI;IAEJ,yBAAyB;IACzB,kBAAkB;IAClB,eAAe;IACf,yEAAyE;IACzE,IAAI;IAEM,gBAAgB,CAAC,KAAa;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAgB,CAAC,CAAC;IACrC,CAAC;IAEO,WAAW,CAAC,MAAgB;QAClC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CAAC,MAAgB;QACpC,uDAAuD;QACvD,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACxE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,kCAAkC;QAClC,6BAA6B;QAC7B,EAAE;QACF,2BAA2B;QAC3B,oCAAoC;QACpC,4BAA4B;QAC5B,wCAAwC;QACxC,mIAAmI;QACnI,wBAAwB;QACxB,gBAAgB;QAChB,iBAAiB;QACjB,0CAA0C;QAC1C,0BAA0B;QAC1B,4CAA4C;QAC5C,gBAAgB;QAChB,mCAAmC;QACnC,gBAAgB;QAChB,gCAAgC;QAChC,SAAS;QACT,2BAA2B;QAC3B,SAAS;QACT,QAAQ;QACR,oBAAoB;QACpB,QAAQ;QACR,eAAe;QACf,OAAO;QACP,kBAAkB;QAClB,uBAAuB;QACvB,gCAAgC;QAChC,sCAAsC;QACtC,wBAAwB;QACxB,SAAS;QACT,SAAS;QACT,QAAQ;QACR,OAAO;QACP,sBAAsB;QACtB,uBAAuB;QACvB,gCAAgC;QAChC,SAAS;QACT,SAAS;QACT,MAAM;QACN,qBAAqB;QACrB,qBAAqB;QACrB,2EAA2E;QAC3E,OAAO;QACP,qBAAqB;QACrB,yCAAyC;QACzC,OAAO;QACP,2EAA2E;QAC3E,WAAW;QACX,IAAI;QACJ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,WAAW,EAAE,CAAC;YAC1C,IAAI,GAAG;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE;aACtC,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YACzD,IAAI,CAAC,GAAiB,EAAE,CAAC;YACzB,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAChC,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;gBAC5B,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC;YAC/C,CAAC;YACD,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC9B,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,eAAe,EAAE,CAAC;YACnD,CAAC;YACD,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY,CAAC,MAAgB;QACnC,MAAM,OAAO,GACX,IAAI,CAAC,cAAc,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO;YACL,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;YAC1B,OAAO;SACR,CAAC;IACJ,CAAC;IA8BS,cAAc,CAAC,KAAa;QACpC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAc,CAAC,CAAC;QAC1C,QAAQ,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC/B,KAAK,UAAU;gBACb,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;gBAC9B,MAAM;YACR,KAAK,SAAS,CAAC;YACf,KAAK,OAAO,CAAC;YACb,KAAK,KAAK,CAAC;YACX,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS,CAAC;YACf,KAAK,UAAU;gBACb,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;gBAC9B,MAAM;YACR,KAAK,OAAO,CAAC;YACb,KAAK,MAAM,CAAC;YACZ,KAAK,WAAW,CAAC;YACjB,KAAK,UAAU;gBACb,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;gBAC9B,MAAM;QACV,CAAC;IACH,CAAC;IAES,aAAa,CAAC,GAAW;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAES,UAAU;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,GAAmB;YACzB,OAAO,EAAE,SAAS;SACnB,CAAC;QAEF,QAAQ,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACvB,KAAK,SAAS;gBACZ,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACvD,MAAM;QACV,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CAAC,MAAgB;QACzC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAErC,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAElC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,SAAS,GAAG;YACV,GAAG,SAAS;YACZ,KAAK,EAAE;gBACL,GAAG,SAAS,CAAC,KAAK;gBAClB,KAAK,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE;aACrD;SACF,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAEO,aAAa;QACnB,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,mBAAmB;SACpB,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,OAAiB;QACtC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,aAAa,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAES,WAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAIW,SAAS;YAC/B,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO;YAC/B,CAAC,CAAC,IAAI,CAAC,IAAI;gBACT,CAAC,CAAC,CAAC,OAAe,EAAE,WAAmB,EAAE,IAA0B,EAAE,EAAE,CACnE,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAC9B,OAAO,EACP,WAAW,EACX,IAAI,EACJ,IAAI,CAAC,IAAI,IAAI,EAAE,CAChB;gBACL,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAEvC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC;YACvD,IAAI,EAAE,GAAG,EAAE;gBACT,IAAI,CAAC,SAAS;qBACX,OAAO,EAAE;qBACT,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACxE,CAAC;YACD,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC;gBAClE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAES,YAAY;QACpB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAES,OAAO,CAAC,OAAiB;QACjC,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAEO,OAAO,CAAC,MAAgB;QAC9B,QAAQ,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC9B,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC/B,QAAQ,OAAO,EAAE,CAAC;oBAChB,KAAK,QAAQ;wBACX,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBACpC,KAAK,SAAS;wBACZ,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;oBACrC,KAAK,QAAQ;wBACX,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC9B,KAAK,SAAS,CAAC;oBACf;wBACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YACD,KAAK,SAAS;gBACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,8CAA8C;IAC9C,0DAA0D;IAC1D,wEAAwE;IACxE,0EAA0E;IAC1E,mGAAmG;IACnG,2CAA2C;IAC3C,sCAAsC;IACtC,gCAAgC;IAChC,KAAK;IACL,IAAI;IACJ,EAAE;IACF,kCAAkC;IAClC,mEAAmE;IACnE,wEAAwE;IACxE,0EAA0E;IAC1E,mGAAmG;IACnG,2CAA2C;IAC3C,sCAAsC;IACtC,gCAAgC;IAChC,KAAK;IACL,IAAI;IACJ,EAAE;IACF,oDAAoD;IACpD,mEAAmE;IACnE,+DAA+D;IAC/D,0EAA0E;IAC1E,2GAA2G;IAC3G,oDAAoD;IACpD,+CAA+C;IAC/C,KAAK;IACL,+BAA+B;IAC/B,IAAI;IAEG,mBAAmB;QACxB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,qFAAqF;QACrF,eAAe;QACf,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAES,eAAe,CAAC,MAAe;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,WAAW,CAAC,OAAsB;QACvC,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;oBAC5B,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;8GAjgBU,0BAA0B;kGAA1B,0BAA0B,w5BAZ1B;YACT,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,EAAE;YAC9D,gBAAgB;SACjB,oMC7FH,wnVA8TA,2CDtPI,WAAW,4lBACX,mBAAmB,kNACnB,uBAAuB,8WACvB,6BAA6B,qKAC7B,OAAO,wEACP,MAAM,oDACN,MAAM,kTACN,OAAO,0NACP,SAAS,kVACT,eAAe,6FACf,WAAW,qMACX,cAAc,kGACd,OAAO,yFACP,QAAQ,6FACR,SAAS,oPACT,UAAU,yGACV,OAAO;;2FAcE,0BAA0B;kBAhCtC,SAAS;8BACC;wBACP,WAAW;wBACX,mBAAmB;wBACnB,uBAAuB;wBACvB,6BAA6B;wBAC7B,OAAO;wBACP,MAAM;wBACN,MAAM;wBACN,OAAO;wBACP,SAAS;wBACT,eAAe;wBACf,WAAW;wBACX,cAAc;wBACd,OAAO;wBACP,QAAQ;wBACR,SAAS;wBACT,UAAU;wBACV,OAAO;qBACR,aACU;wBACT,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,EAAE;wBAC9D,gBAAgB;qBACjB,YACS,2BAA2B;;sBAqBpC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBAEL,MAAM;;sBACN,MAAM;;sBACN,MAAM;;sBAEN,SAAS;uBAAC,sBAAsB","sourcesContent":["import {\n Component,\n computed,\n EventEmitter,\n input,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n signal,\n SimpleChanges,\n ViewChild,\n inject,\n} from '@angular/core';\nimport {\n FormControl,\n FormsModule,\n ReactiveFormsModule,\n UntypedFormGroup,\n} from '@angular/forms';\nimport {\n IonButton,\n IonCheckbox,\n IonCol,\n IonGrid,\n IonIcon,\n IonItem,\n IonItemDivider,\n IonLabel,\n IonList,\n IonRow,\n IonSelect,\n IonSelectOption,\n IonSpinner,\n ModalController,\n} from '@ionic/angular/standalone';\nimport { ClassName, ISelectItem, SelectFromListComponent } from '@sneat/ui';\nimport {\n emptyTiming,\n IHappeningSlot,\n ITiming,\n MonthlyMode,\n SlotLocation,\n WeekdayCode2,\n IHappeningContext,\n Month,\n RepeatPeriod,\n IHappeningSlotWithID,\n} from '@sneat/mod-schedulus-core';\nimport { newRandomId } from '@sneat/random';\nimport { Observable } from 'rxjs';\nimport { StartEndDatetimeFormComponent } from '../start-end-datetime-form/start-end-datetime-form.component';\nimport { WeekdaysFormBase } from '../weekdays/weekdays-form-base';\nimport { HappeningService } from '../../services/happening.service';\n\ntype Happens = 'once' | 'weekly' | 'monthly' | 'yearly' | 'fortnightly';\ntype Repeats = Exclude<Happens, 'once'>;\n\nexport type HappeningSlotFormMode = 'modal' | 'in-form';\n\nexport interface IHappeningSlotFormComponentInputs {\n mode?: HappeningSlotFormMode;\n happening?: IHappeningContext;\n slotID?: string;\n slot?: IHappeningSlot;\n wd?: WeekdayCode2;\n date?: string;\n isToDo?: boolean;\n}\n\n@Component({\n imports: [\n FormsModule,\n ReactiveFormsModule,\n SelectFromListComponent,\n StartEndDatetimeFormComponent,\n IonGrid,\n IonRow,\n IonCol,\n IonItem,\n IonSelect,\n IonSelectOption,\n IonCheckbox,\n IonItemDivider,\n IonList,\n IonLabel,\n IonButton,\n IonSpinner,\n IonIcon,\n ],\n providers: [\n { provide: ClassName, useValue: 'RecurringSlotFormComponent' },\n HappeningService,\n ],\n selector: 'sneat-happening-slot-form',\n templateUrl: './happening-slot-form.component.html',\n})\n/*\n INTENTIONALLY not decoupling weekdays form (WeekdaysFormBase) into a separate component\n as markup of the form is tightly coupled with the weekdays form\n as weekend & weekdays checkboxes are in the header of the form\n */\nexport class HappeningSlotFormComponent\n extends WeekdaysFormBase\n implements OnChanges, OnDestroy, IHappeningSlotFormComponentInputs\n{\n protected readonly modalCtrl = inject(ModalController);\n private readonly happeningService = inject(HappeningService);\n\n public readonly $happening = input.required<IHappeningContext>();\n public readonly $happeningID = computed(() => this.$happening().id);\n protected readonly $happeningType = computed(\n () => this.$happening().brief?.type,\n );\n\n @Input({ required: true }) mode?: HappeningSlotFormMode;\n @Input() slot?: IHappeningSlotWithID;\n @Input() wd?: WeekdayCode2;\n @Input() date?: string;\n @Input() isToDo = false;\n\n @Output() readonly slotAdded = new EventEmitter<IHappeningSlot>();\n @Output() readonly happeningChange = new EventEmitter<IHappeningContext>();\n @Output() readonly eventTimesChanged = new EventEmitter<ITiming>();\n\n @ViewChild('startEndDatetimeForm')\n startEndDatetimeForm?: StartEndDatetimeFormComponent;\n\n protected timing: ITiming = emptyTiming;\n\n protected readonly error = signal('');\n\n protected tab: 'when' | 'where' = 'when';\n\n // minDate = '2000';\n // maxDate = '' + (new Date().getFullYear() + 5);\n\n protected readonly repeatsOptions: readonly ISelectItem[] = [\n // { id: 'daily', title: 'Daily' }, // Daily does not make much sense, weekly covers it\n { id: 'weekly', title: 'Weekly' },\n { id: 'monthly', title: 'Monthly' },\n { id: 'yearly', title: 'Yearly' },\n ];\n\n protected readonly monthlyMode = signal<MonthlyMode | ''>('');\n\n protected readonly monthlyDate = signal(0);\n\n protected onMonthlyModeChanged(s: string): void {\n this.monthlyMode.set(s as unknown as MonthlyMode);\n }\n\n protected numberOfDaysInMonth = 28;\n\n protected readonly isUpdating = signal(false);\n\n protected readonly monthlyModes: readonly ISelectItem[] = [\n { id: 'monthly-day', title: 'Specific day' },\n { id: 'monthly-week-1', title: 'First week' },\n { id: 'monthly-week-2', title: 'Second week' },\n { id: 'monthly-week-3', title: 'Third week' },\n { id: 'monthly-week-4', title: 'Fourth week' },\n { id: 'monthly-week-last', title: 'Last week' },\n ];\n\n protected readonly slotForm = new UntypedFormGroup({\n locationTitle: new FormControl<string>(''),\n locationAddress: new FormControl<string>(''),\n });\n\n protected readonly repeats = signal<Repeats | undefined>(undefined);\n\n protected readonly showWeekdays = computed(\n () =>\n // this.happens() === 'daily' ||\n this.repeats() === 'weekly' ||\n (this.repeats() === 'monthly' &&\n this.monthlyMode()?.startsWith('monthly-week')),\n );\n\n protected readonly showTimeForm = computed(() => {\n const happens = this.repeats();\n const monthlyMode = this.monthlyMode();\n const monthlyDate = this.monthlyDate();\n const hasWeekdaySelected = this.hasWeekdaySelected();\n return (\n this.$happeningType() === 'single' ||\n // happens === 'daily' ||\n (happens === 'weekly' && hasWeekdaySelected) ||\n (happens === 'monthly' &&\n ((monthlyMode === 'monthly-day' && !!monthlyDate) ||\n (monthlyMode.includes('week') && hasWeekdaySelected)))\n );\n });\n\n protected readonly showAddSlotButton = computed(() => {\n const happens = this.repeats();\n const monthlyMode = this.monthlyMode();\n const monthlyDate = this.monthlyDate();\n return (\n // happens === 'daily' ||\n (happens === 'weekly' && this.hasWeekdaySelected()) ||\n (happens === 'monthly' && monthlyMode === 'monthly-day' && !!monthlyDate)\n );\n });\n\n public constructor() {\n super(true);\n // const now = new Date();\n const preselectedWd = window.history.state?.wd as WeekdayCode2;\n if (preselectedWd) {\n this.weekdayById[preselectedWd].set(true);\n }\n // this.weekdaysForm.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe({\n // \tnext: () => (this.error = undefined),\n // });\n }\n\n // ngOnChanges(changes: SimpleChanges): void {\n // \tif (this.wd) {\n // \t\tthis.weekdayById[this.wd]?.setValue(true);\n // \t}\n // }\n\n // dismissModal(): void {\n // \tthis.modalCtrl\n // \t\t.dismiss()\n // \t\t.catch(this.errorLogger.logErrorHandler('failed to dismiss modal'));\n // }\n\n protected onRepeatsChanged(value: string): void {\n this.repeats.set(value as Repeats);\n }\n\n private addOnceSlot(timing?: ITiming): IHappeningSlot | undefined {\n this.slotForm.markAsTouched();\n const slot = this.initiateSlot(timing);\n return slot;\n }\n\n private addWeeklySlot(timing?: ITiming): IHappeningSlot | undefined {\n // this.weekdaysForm.markAsTouched({ onlySelf: true });\n this.slotForm.markAsTouched();\n if (this.$happeningType() === 'recurring' && !this.hasWeekdaySelected()) {\n this.error.set('At least 1 weekday should be selected');\n }\n if (!this.startEndDatetimeForm?.isValid) {\n return undefined;\n }\n // if (!this.weekdaysForm.valid) {\n // \tthis.showWeekday = false;\n //\n // \tthis.alertCtrl.create({\n // \t\theader: 'Please select day(s)',\n // \t\tinputs: wd2.map(wd => {\n // \t\t\t// tslint:disable-next-line:no-any\n // \t\t\tconst result: { type: 'checkbox'; name: WeekdayCode2; value: WeekdayCode2; label: string; handler: (input: any) => void } = {\n // \t\t\t\ttype: 'checkbox',\n // \t\t\t\tname: wd,\n // \t\t\t\tvalue: wd,\n // \t\t\t\tlabel: wdCodeToWeekdayLongName(wd),\n // \t\t\t\thandler: input => {\n // \t\t\t\t\tconst v = this.weekdaysForm.get(wd);\n // \t\t\t\t\tif (v) {\n // \t\t\t\t\t\tv.setValue(input.checked);\n // \t\t\t\t\t} else {\n // \t\t\t\t\t\tconsole.error('!v', v);\n // \t\t\t\t\t}\n // \t\t\t\t\tconsole.log(input);\n // \t\t\t\t},\n // \t\t\t};\n // \t\t\treturn result;\n // \t\t}),\n // \t\tbuttons: [\n // \t\t\t{\n // \t\t\t\ttext: 'OK',\n // \t\t\t\thandler: () => {\n // \t\t\t\t\tthis.showWeekday = true;\n // \t\t\t\t\tif (this.weekdaysForm.valid) {\n // \t\t\t\t\t\tthis.addSlot();\n // \t\t\t\t\t}\n // \t\t\t\t},\n // \t\t\t},\n // \t\t\t{\n // \t\t\t\ttext: 'Cancel',\n // \t\t\t\thandler: () => {\n // \t\t\t\t\tthis.showWeekday = true;\n // \t\t\t\t},\n // \t\t\t}],\n // \t})\n // \t\t.then(alert => {\n // \t\t\talert.present()\n // \t\t\t\t.catch(this.errorLogger.logErrorHandler('failed to present alert'));\n // \t\t})\n // \t\t.then(value => {\n // \t\t\tconsole.log('Alert value:', value);\n // \t\t})\n // \t\t.catch(this.errorLogger.logErrorHandler('failed to create an alert'));\n // \treturn;\n // }\n if (!this.slotForm.valid) {\n return undefined;\n }\n const formValue = this.slotForm.value;\n if (!this.timing) {\n throw new Error('!this.timing');\n }\n let slot = this.initiateSlot(timing);\n if (this.$happeningType() === 'recurring') {\n slot = {\n ...slot,\n weekdays: this.selectedWeekdayCodes(),\n };\n }\n if (formValue.locationTitle || formValue.locationAddress) {\n let l: SlotLocation = {};\n slot = { ...slot, location: l };\n if (formValue.locationTitle) {\n l = { ...l, title: formValue.locationTitle };\n }\n if (formValue.locationAddress) {\n l = { ...l, address: formValue.locationAddress };\n }\n slot = { ...slot, location: l };\n }\n return slot;\n }\n\n private initiateSlot(timing?: ITiming): IHappeningSlot {\n const repeats: RepeatPeriod | undefined =\n this.$happeningType() === 'single' ? 'once' : this.repeats();\n if (!repeats) {\n throw new Error('!repeats');\n }\n return {\n ...(timing || this.timing),\n repeats,\n };\n }\n\n protected readonly yearlyMonth = new FormControl<Month | undefined>(\n undefined,\n );\n\n protected readonly monthDays: readonly number[][] = [\n [1, 2, 3, 4, 5],\n [6, 7, 8, 9, 10],\n [11, 12, 13, 14, 15],\n [16, 17, 18, 19, 20],\n [21, 22, 23, 24, 25],\n [26, 27, 28, 29, 30, 31],\n ];\n\n protected readonly months: string[] = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n\n protected setYearlyMonth(month: string): void {\n this.yearlyMonth.setValue(month as Month);\n switch (this.yearlyMonth.value) {\n case 'February':\n this.numberOfDaysInMonth = 28;\n break;\n case 'January':\n case 'March':\n case 'May':\n case 'July':\n case 'August':\n case 'October':\n case 'December':\n this.numberOfDaysInMonth = 31;\n break;\n case 'April':\n case 'June':\n case 'September':\n case 'November':\n this.numberOfDaysInMonth = 30;\n break;\n }\n }\n\n protected setMonthlyDay(day: number): void {\n this.monthlyDate.set(day);\n }\n\n protected addDaySlot(): IHappeningSlot | undefined {\n const day = this.monthlyDate();\n let slot: IHappeningSlot = {\n repeats: 'monthly',\n };\n\n switch (this.repeats()) {\n case 'monthly':\n slot = { ...slot, day };\n break;\n case 'yearly':\n if (!this.yearlyMonth.value) {\n return;\n }\n slot = { ...slot, day, month: this.yearlyMonth.value };\n break;\n }\n return slot;\n }\n\n private addSlotToHappening(timing?: ITiming): void {\n if (!this.$happening().brief) {\n throw new Error('!this.happening?.brief');\n }\n const slot = this.getSlot(timing);\n if (!slot) {\n return;\n }\n const slotID = this.generateSlotID();\n\n let happening = this.$happening();\n\n if (!happening.brief) {\n return;\n }\n\n happening = {\n ...happening,\n brief: {\n ...happening.brief,\n slots: { ...happening.brief?.slots, [slotID]: slot },\n },\n };\n this.slotAdded.emit(slot);\n this.happeningChange.emit(happening);\n }\n\n private addYearlySlot(): IHappeningSlot {\n return {\n repeats: 'yearly',\n // day: ['may-21'],\n };\n }\n\n private addMonthlySlot(_timing?: ITiming): IHappeningSlot | undefined {\n if (this.monthlyMode() === 'monthly-day') {\n return this.addDaySlot();\n }\n return undefined;\n }\n\n protected saveChanges(): void {\n const slot = this.getSlot();\n const happening = this.$happening();\n const spaceID = happening.space.id;\n const happeningID = happening.id;\n if (!spaceID || !happeningID || !slot) {\n return;\n }\n let id = this.slot?.id;\n const isNewSlot = !id;\n const putSlot: (\n spaceID: string,\n happeningID: string,\n slot: IHappeningSlotWithID,\n ) => Observable<void> = isNewSlot\n ? this.happeningService.addSlot\n : this.date\n ? (spaceID: string, happeningID: string, slot: IHappeningSlotWithID) =>\n this.happeningService.adjustSlot(\n spaceID,\n happeningID,\n slot,\n this.date || '',\n )\n : this.happeningService.updateSlot;\n\n if (!id) {\n id = this.generateSlotID();\n }\n this.isUpdating.set(true);\n putSlot(spaceID, happeningID, { ...slot, id }).subscribe({\n next: () => {\n this.modalCtrl\n .dismiss()\n .catch(this.errorLogger.logErrorHandler('failed to dismiss modal'));\n },\n error: (err) => {\n this.errorLogger.logError(err, 'failed to update happening slot');\n this.isUpdating.set(false);\n },\n });\n }\n\n protected applyChanges(): void {\n if (this.slot) {\n this.saveChanges();\n } else {\n this.addSlot();\n }\n }\n\n protected addSlot(_timing?: ITiming): void {\n if (this.$happeningID()) {\n this.saveChanges();\n } else {\n this.addSlotToHappening();\n }\n }\n\n private generateSlotID(): string {\n for (let i = 0; i < 10; i++) {\n const slotID = newRandomId({ len: 4 });\n if (!this.$happening().brief?.slots?.[slotID]) {\n return slotID;\n }\n }\n throw new Error('failed to generate unique slot ID');\n }\n\n private getSlot(timing?: ITiming): IHappeningSlot | undefined {\n switch (this.$happeningType()) {\n case 'single':\n return this.addOnceSlot(timing);\n case 'recurring': {\n const repeats = this.repeats();\n switch (repeats) {\n case 'weekly':\n return this.addWeeklySlot(timing);\n case 'monthly':\n return this.addMonthlySlot(timing);\n case 'yearly':\n return this.addYearlySlot();\n case undefined:\n default:\n throw new Error(`unknown repeats=[${repeats}]`);\n }\n }\n case undefined:\n throw new Error('happeningType is undefined');\n }\n }\n\n // onTimeStartsChanged(event: Event): void {\n // \tconst { detail } = (event as CustomEvent);\n // \tconst startInMinutes = ionTimeToMinutes(detail.value);\n // \tconst durationInMinutes = ionTimeToMinutes(this.timeDuration.value);\n // \tconst endInISO = minutesToIonTime(startInMinutes + durationInMinutes);\n // \t// console.log(startInMinutes, durationInMinutes, endInISO, 'timeEnds.value:', timeEnds.value);\n // \tif (this.timeEnds.value !== endInISO) {\n // \t\tthis.timeEnds.setValue(endInISO);\n // \t\tthis.onEventTimesChanged();\n // \t}\n // }\n //\n // onTimeDurationChanged(): void {\n // \tconst startInMinutes = ionTimeToMinutes(this.timeStarts.value);\n // \tconst durationInMinutes = ionTimeToMinutes(this.timeDuration.value);\n // \tconst endInISO = minutesToIonTime(startInMinutes + durationInMinutes);\n // \t// console.log(startInMinutes, durationInMinutes, endInISO, 'timeEnds.value:', timeEnds.value);\n // \tif (this.timeEnds.value !== endInISO) {\n // \t\tthis.timeEnds.setValue(endInISO);\n // \t\tthis.onEventTimesChanged();\n // \t}\n // }\n //\n // onTimeEndsChanged(/*event: CustomEvent*/): void {\n // \tconst startInMinutes = ionTimeToMinutes(this.timeStarts.value);\n // \tconst endInMinutes = ionTimeToMinutes(this.timeEnds.value);\n // \tconst durationInISO = minutesToIonTime(endInMinutes - startInMinutes);\n // \t// console.log(startInMinutes, durationInISO, endInMinutes, 'timeDuration.value:', timeDuration.value);\n // \tif (this.timeDuration.value !== durationInISO) {\n // \t\tthis.timeDuration.setValue(durationInISO);\n // \t}\n // \tthis.onEventTimesChanged();\n // }\n\n public onEventTimesChanged(): void {\n if (!this.date) {\n return;\n }\n // const timestamp = (c: FormControl): number => isoStringsToDate(this.date, c.value)\n // \t.getTime();\n this.eventTimesChanged.emit(this.timing);\n }\n\n protected onTimingChanged(timing: ITiming): void {\n this.timing = timing;\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['wd']) {\n const wd = this.wd;\n if (wd) {\n this.weekdayById[wd].set(true);\n }\n }\n if (changes['slot']) {\n const slot = this.slot;\n if (slot) {\n if (slot.repeats !== 'once' && slot.repeats !== 'UNKNOWN') {\n this.repeats.set(slot?.repeats);\n }\n slot.weekdays?.forEach((wd) => {\n this.weekdayById[wd].set(true);\n });\n this.timing = slot;\n }\n }\n }\n}\n\n// function ionTimeToMinutes(v: string): number {\n// \tif (v.includes('T')) {\n// \t\tv = v.split('T')[1];\n// \t}\n// \tconst [hours, minutes] = v.split(':')\n// \t\t.map(i => +i);\n// \t// tslint:disable-next-line:no-magic-numbers\n// \treturn hours * 60 + minutes;\n// }\n\n// function minutesToIonTime(v: number): string {\n// \t// tslint:disable-next-line:no-magic-numbers\n// \tconst minutes = v % 60;\n// \t// tslint:disable-next-line:no-magic-numbers\n// \tconst hh = ((v - minutes) / 60).toString()\n// \t\t// tslint:disable-next-line:no-magic-numbers\n// \t\t.padStart(2, '0');\n// \tconst mm = minutes.toString()\n// \t\t// tslint:disable-next-line:no-magic-numbers\n// \t\t.padStart(2, '0');\n// \treturn `${hh}:${mm}`;\n// }\n","<!--wd: {{ wd }}; date: {{date}}-->\n<!--<ion-item-divider color=\"primary\" class=\"sneat-no-end-padding\" *ngIf=\"mode === 'modal'\">-->\n<!--\t<ion-label style=\"font-weight: bold\">New slot</ion-label>-->\n<!--\t<ion-buttons slot=\"end\" class=\"sneat-no-end-margin\">-->\n<!--\t\t<ion-button title=\"Cancel\" (click)=\"dismissModal()\">-->\n<!--\t\t\t<ion-label color=\"light\">Cancel</ion-label>-->\n<!--\t\t\t<ion-icon name=\"close-outline\" slot=\"end\" />-->\n<!--\t\t</ion-button>-->\n<!--\t</ion-buttons>-->\n<!--</ion-item-divider>-->\n<!--<ion-item *ngIf=\"happeningType === 'single'\">-->\n<!--\t<ion-label *ngIf=\"isToDo && !date\">Due</ion-label>-->\n<!--\t<ion-label *ngIf=\"isToDo && date\">Due on</ion-label>-->\n<!--\t<ion-label *ngIf=\"!isToDo\">Takes place on</ion-label>-->\n<!--\t<ion-datetime [min]=\"minDate\" [max]=\"maxDate\" [(ngModel)]=\"date\"-->\n<!--\t\t\t\t\t\t\t\t(ionChange)=\"onEventTimesChanged()\"></ion-datetime>-->\n<!--</ion-item>-->\n\n<!--<ion-item-divider color=\"light\">-->\n<!--\t<ion-segment [(ngModel)]=\"tab\" color=\"dark\">-->\n<!--\t\t<ion-segment-button value=\"when\">-->\n<!--\t\t\t<ion-label>When</ion-label>-->\n<!--\t\t</ion-segment-button>-->\n<!--\t\t<ion-segment-button value=\"where\">-->\n<!--\t\t\t<ion-label>Where</ion-label>-->\n<!--\t\t</ion-segment-button>-->\n<!--\t</ion-segment>-->\n<!--</ion-item-divider>-->\n\n@if ($happeningType() === \"recurring\") {\n @if (repeats()) {\n <ion-grid class=\"ion-grid-layout\">\n <ion-row>\n <ion-col>\n <ion-item color=\"light\" lines=\"full\">\n <ion-select\n label=\"Repeats\"\n interface=\"popover\"\n [value]=\"repeats()\"\n (ionChange)=\"onRepeatsChanged($event.detail.value)\"\n >\n @for (repeatOption of repeatsOptions; track repeatOption.id) {\n <ion-select-option [value]=\"repeatOption.id\">\n {{ repeatOption.title }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n </ion-col>\n @if (showWeekdays()) {\n <ion-col>\n <ion-item color=\"light\" lines=\"full\">\n <ion-checkbox\n color=\"medium\"\n labelPlacement=\"end\"\n slot=\"end\"\n [checked]=\"weekdaysCheckbox()\"\n (ionChange)=\"onWeekdaysCheckboxChange($event.detail.checked)\"\n >\n <ion-label color=\"medium\">W-days</ion-label>\n </ion-checkbox>\n <ion-checkbox\n color=\"medium\"\n labelPlacement=\"end\"\n slot=\"end\"\n [checked]=\"weekendCheckbox()\"\n (ionChange)=\"onWeekendCheckboxChange($event.detail.checked)\"\n >\n <ion-label color=\"medium\">W-end</ion-label>\n </ion-checkbox>\n </ion-item>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n } @else {\n <sneat-select-from-list\n label=\"Repeats\"\n listLabelColor=\"light\"\n [value]=\"repeats() || ''\"\n [items]=\"repeatsOptions\"\n [isReadonly]=\"!!date\"\n (valueChange)=\"onRepeatsChanged($event)\"\n labelPlacement=\"end\"\n listLabel=\"divider\"\n justify=\"start\"\n />\n }\n\n @if (repeats() === \"monthly\") {\n <!--\t\t<ion-item-divider>-->\n <!--\t\t\t<ion-label>On</ion-label>-->\n <!--\t\t</ion-item-divider>-->\n <sneat-select-from-list\n label=\"On\"\n [value]=\"monthlyMode()\"\n [items]=\"monthlyModes\"\n [isReadonly]=\"!!date\"\n (valueChange)=\"onMonthlyModeChanged($event)\"\n labelPlacement=\"end\"\n listLabel=\"divider\"\n justify=\"start\"\n />\n }\n\n @if (showWeekdays()) {\n @if (!hasWeekdaySelected()) {\n <ion-item-divider> Choose day of the week </ion-item-divider>\n }\n <form>\n <ion-grid class=\"ion-grid-layout\">\n <ion-row>\n <ion-col size=\"4\">\n <ion-item lines=\"none\">\n <ion-checkbox\n slot=\"start\"\n value=\"mo\"\n [checked]=\"weekdayMo()\"\n (ionChange)=\"onWeekdayChanged('mo', $event.detail.checked)\"\n labelPlacement=\"end\"\n >Monday\n </ion-checkbox>\n </ion-item>\n <ion-item lines=\"none\">\n <ion-checkbox\n slot=\"start\"\n value=\"tu\"\n [checked]=\"weekdayTu()\"\n (ionChange)=\"onWeekdayChanged('tu', $event.detail.checked)\"\n labelPlacement=\"end\"\n >Tuesday\n </ion-checkbox>\n </ion-item>\n <ion-item lines=\"none\">\n <ion-checkbox\n slot=\"start\"\n value=\"we\"\n [checked]=\"weekdayWe()\"\n (ionChange)=\"onWeekdayChanged('we', $event.detail.checked)\"\n labelPlacement=\"end\"\n >Wednesday\n </ion-checkbox>\n </ion-item>\n </ion-col>\n <ion-col size=\"4\">\n <ion-item lines=\"none\">\n <ion-checkbox\n slot=\"start\"\n value=\"th\"\n [checked]=\"weekdayTh()\"\n (ionChange)=\"onWeekdayChanged('th', $event.detail.checked)\"\n labelPlacement=\"end\"\n >Thursday\n </ion-checkbox>\n </ion-item>\n <ion-item lines=\"none\">\n <ion-checkbox\n slot=\"start\"\n value=\"fr\"\n [checked]=\"weekdayFr()\"\n (ionChange)=\"onWeekdayChanged('fr', $event.detail.checked)\"\n labelPlacement=\"end\"\n >Friday\n </ion-checkbox>\n </ion-item>\n </ion-col>\n <ion-col size=\"4\">\n <ion-item lines=\"none\">\n <ion-checkbox\n slot=\"start\"\n value=\"sa\"\n [checked]=\"weekdaySa()\"\n (ionChange)=\"onWeekdayChanged('sa', $event.detail.checked)\"\n labelPlacement=\"end\"\n >Saturday\n </ion-checkbox>\n </ion-item>\n <ion-item lines=\"none\">\n <ion-checkbox\n slot=\"start\"\n value=\"su\"\n [checked]=\"weekdaySu()\"\n (ionChange)=\"onWeekdayChanged('su', $event.detail.checked)\"\n labelPlacement=\"end\"\n >Sunday\n </ion-checkbox>\n </ion-item>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n }\n @if (repeats() === \"yearly\") {\n @if (yearlyMonth) {\n <ion-item>\n <ion-select\n label=\"Month\"\n interface=\"popover\"\n [formControl]=\"yearlyMonth\"\n (ionChange)=\"setYearlyMonth($event.detail.value)\"\n >\n @for (month of months; track month) {\n <ion-select-option [value]=\"month\">{{ month }}</ion-select-option>\n }\n </ion-select>\n </ion-item>\n } @else {\n <ion-item-divider>Select month</ion-item-divider>\n <ion-item>\n @for (month of months; track month) {\n <ion-button\n class=\"ion-margin-end\"\n color=\"light\"\n (click)=\"setYearlyMonth(month)\"\n >{{ month }}\n </ion-button>\n }\n </ion-item>\n }\n }\n\n @if (\n (repeats() === \"monthly\" && monthlyMode() === \"monthly-day\") ||\n (repeats() === \"yearly\" && yearlyMonth.value)\n ) {\n <ion-item-divider>Choose date</ion-item-divider>\n <ion-grid>\n @for (daysRow of monthDays; let rowIndex = $index; track rowIndex) {\n <ion-row>\n @for (day of daysRow; track day) {\n <ion-col size=\"2\">\n <ion-button color=\"light\" (click)=\"setMonthlyDay(day)\"\n >{{ day }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n <!--\t\t\t<ion-row>-->\n <!--\t\t\t\t@for (i of [].constructor(numberOfDaysInMonth - 25); track i) {-->\n <!--\t\t\t\t\t<ion-col size=\"2\">-->\n <!--\t\t\t\t\t\t<ion-button color=\"light\" (click)=\"setMonthlyDay($index + 25 + 1)\"-->\n <!--\t\t\t\t\t\t\t>{{ $index + 25 + 1 }}-->\n <!--\t\t\t\t\t\t</ion-button>-->\n <!--\t\t\t\t\t</ion-col>-->\n <!--\t\t\t\t}-->\n <!--\t\t\t</ion-row>-->\n </ion-grid>\n }\n}\n\n@if (showTimeForm()) {\n <!--\t<ion-item-divider color=\"light\">-->\n <!--\t\t<ion-label>When</ion-label>-->\n <!--\t</ion-item-divider>-->\n <!--\t\t<ion-item-divider color=\"light\">When</ion-item-divider>-->\n <sneat-start-end-datetime-form\n #startEndDatetimeForm\n [date]=\"date\"\n [mode]=\"$happeningType()\"\n [timing]=\"timing\"\n addSlotLabel=\"Add slot\"\n (timingChange)=\"onTimingChanged($event)\"\n (addClick)=\"addSlot($event)\"\n />\n}\n\n<!--\t\t\t<ion-item-divider color=\"light\">Where</ion-item-divider>-->\n<!--\t\t\t<ion-item class=\"ion-padding-start\">-->\n<!--\t\t\t\t<ion-textarea label=\"Address / room / directions\" labelPlacement=\"stacked\"></ion-textarea>-->\n<!--\t\t\t</ion-item>-->\n\n<!-- @if (\"tab === 'where'\") { -->\n<!--\t<ion-item-divider color=\"light\">Where</ion-item-divider>-->\n<!--\t<ion-item>-->\n<!--\t\t<ion-label position=\"floating\">Address / room / directions</ion-label>-->\n<!--\t\t<ion-textarea></ion-textarea>-->\n<!--\t</ion-item>-->\n<!-- }-->\n\n<!--<ng-container *ngIf=\"tab === 'when'\">-->\n\n<!--</ng-container>-->\n\n<!--happeningType: {{happeningType}}, happens: {{happens}};-->\n\n@if (error() || showAddSlotButton()) {\n <ion-list lines=\"none\">\n @if (error()) {\n <ion-item>\n <ion-label color=\"danger\">{{ error() }}</ion-label>\n </ion-item>\n }\n\n @if (showAddSlotButton()) {\n <ion-item>\n <ion-button\n slot=\"end\"\n color=\"primary\"\n [disabled]=\"isUpdating()\"\n (click)=\"applyChanges()\"\n size=\"medium\"\n >\n @if (slot) {\n <ion-icon name=\"save-outline\" slot=\"start\" />\n <ion-label>Update slot</ion-label>\n } @else {\n <ion-icon name=\"add-outline\" slot=\"start\" />\n <ion-label>Add slot</ion-label>\n }\n @if (isUpdating()) {\n <ion-spinner name=\"lines-small\" slot=\"end\"></ion-spinner>\n }\n </ion-button>\n </ion-item>\n }\n </ion-list>\n}\n"]}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, inject, } from '@angular/core';
|
|
2
|
+
import { IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonTitle, IonToolbar, ModalController, } from '@ionic/angular/standalone';
|
|
3
|
+
import { emptyHappeningSlot, } from '@sneat/mod-schedulus-core';
|
|
4
|
+
import { ErrorLogger } from '@sneat/core';
|
|
5
|
+
// import { HappeningService } from '../../services/happening.service';
|
|
6
|
+
import { Subject } from 'rxjs';
|
|
7
|
+
import { HappeningSlotFormComponent, } from './happening-slot-form.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class HappeningSlotModalComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.errorLogger = inject(ErrorLogger);
|
|
12
|
+
this.modalController = inject(ModalController);
|
|
13
|
+
this.destroyed = new Subject();
|
|
14
|
+
this.happening = {
|
|
15
|
+
id: '',
|
|
16
|
+
space: { id: '' },
|
|
17
|
+
};
|
|
18
|
+
this.slot = emptyHappeningSlot;
|
|
19
|
+
this.happeningSlotChange = new EventEmitter();
|
|
20
|
+
}
|
|
21
|
+
onTimingChanged(timing) {
|
|
22
|
+
if (timing == emptyHappeningSlot) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!timing.end) {
|
|
26
|
+
this.errorLogger.logError('timing has no end');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// if (!timing.durationMinutes) {
|
|
30
|
+
// this.errorLogger.logError('timing has no durationMinutes');
|
|
31
|
+
// return;
|
|
32
|
+
// }
|
|
33
|
+
this.slot = { ...this.slot, ...timing };
|
|
34
|
+
this.emitHappeningSlotChange();
|
|
35
|
+
}
|
|
36
|
+
onHappeningChanged(happening) {
|
|
37
|
+
this.happening = happening;
|
|
38
|
+
this.emitHappeningSlotChange();
|
|
39
|
+
}
|
|
40
|
+
emitHappeningSlotChange() {
|
|
41
|
+
this.happeningSlotChange.emit(this.slot);
|
|
42
|
+
}
|
|
43
|
+
async close(event) {
|
|
44
|
+
event.stopPropagation();
|
|
45
|
+
await this.modalController.dismiss();
|
|
46
|
+
}
|
|
47
|
+
// async save(event: Event): Promise<void> {
|
|
48
|
+
// console.log('save()', event);
|
|
49
|
+
// event.stopPropagation();
|
|
50
|
+
// if (!this.space) {
|
|
51
|
+
// this.errorLogger.logError('space context is not set');
|
|
52
|
+
// return;
|
|
53
|
+
// }
|
|
54
|
+
// if (!this.happening) {
|
|
55
|
+
// this.errorLogger.logError('happening context is not set');
|
|
56
|
+
// return;
|
|
57
|
+
// }
|
|
58
|
+
// switch (this.happening.brief?.type) {
|
|
59
|
+
// case 'single':
|
|
60
|
+
// }
|
|
61
|
+
// alert('breakpoint');
|
|
62
|
+
// if (this.happening?.brief?.type === 'single' || !this.dateID) {
|
|
63
|
+
// this.happeningService
|
|
64
|
+
// .updateSlot(this.space.id, this.happening.id, this.slot)
|
|
65
|
+
// .pipe(takeUntil(this.destroyed))
|
|
66
|
+
// .subscribe({
|
|
67
|
+
// next: () =>
|
|
68
|
+
// this.modalController
|
|
69
|
+
// .dismiss()
|
|
70
|
+
// .catch(this.errorLogger.logErrorHandler('failed to close modal')),
|
|
71
|
+
// error: this.errorLogger.logErrorHandler(
|
|
72
|
+
// 'Failed to update happening slot',
|
|
73
|
+
// ),
|
|
74
|
+
// });
|
|
75
|
+
// } else if (this.happening?.brief?.type === 'recurring' && this.dateID) {
|
|
76
|
+
// this.happeningService
|
|
77
|
+
// .adjustSlot(this.space.id, this.happening.id, this.slot, this.dateID)
|
|
78
|
+
// .pipe(takeUntil(this.destroyed))
|
|
79
|
+
// .subscribe({
|
|
80
|
+
// next: () =>
|
|
81
|
+
// this.modalController
|
|
82
|
+
// .dismiss()
|
|
83
|
+
// .catch(this.errorLogger.logErrorHandler('failed to close modal')),
|
|
84
|
+
// error: this.errorLogger.logErrorHandler(
|
|
85
|
+
// 'Failed to adjust happening slot',
|
|
86
|
+
// ),
|
|
87
|
+
// });
|
|
88
|
+
// }
|
|
89
|
+
// }
|
|
90
|
+
ngOnInit() {
|
|
91
|
+
// console.log('HappeningSlotModalComponent.ngOnInit()', this.slot);
|
|
92
|
+
this.processHappening();
|
|
93
|
+
}
|
|
94
|
+
ngOnChanges(changes) {
|
|
95
|
+
if (changes['happening']) {
|
|
96
|
+
this.processHappening();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
processHappening() {
|
|
100
|
+
// if (this.happening?.brief?.type === 'single') {
|
|
101
|
+
// if (this.happening?.brief?.slots?.length === 1) {
|
|
102
|
+
// this.singleSlot = this.happening.brief.slots[0];
|
|
103
|
+
// }
|
|
104
|
+
// }
|
|
105
|
+
}
|
|
106
|
+
ngOnDestroy() {
|
|
107
|
+
this.destroyed.next();
|
|
108
|
+
this.destroyed.complete();
|
|
109
|
+
}
|
|
110
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
111
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: HappeningSlotModalComponent, isStandalone: true, selector: "sneat-slot-modal", inputs: { space: "space", happening: "happening", slot: "slot", adjustment: "adjustment", dateID: "dateID" }, outputs: { happeningSlotChange: "happeningSlotChange" }, usesOnChanges: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-title>\n {{ happening.brief?.title || \"Happening Slot Modal\" }}\n @if (dateID) {\n on {{ dateID }}\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close($event)\" title=\"Close\">\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-happening-slot-form\n mode=\"modal\"\n [$happening]=\"happening\"\n [slot]=\"slot\"\n [date]=\"dateID\"\n (happeningChange)=\"onHappeningChanged($event)\"\n />\n\n <!--\t<ion-item-group>-->\n <!--\t\t<ion-item-divider color=\"light\">When</ion-item-divider>-->\n <!--\t\t<sneat-start-end-datetime-form-->\n <!--\t\t\tmode=\"single\"-->\n <!--\t\t\t[timing]=\"adjustment?.slot || happeningSlot\"-->\n <!--\t\t\t[date]=\"this.dateID\"-->\n <!--\t\t\t(timingChange)=\"onTimingChanged($event)\"-->\n <!--\t\t/>-->\n\n <!--\t\t<ion-item-divider color=\"light\">Where</ion-item-divider>-->\n <!--\t\t<ion-item>-->\n <!--\t\t\t<ion-label position=\"floating\">Address</ion-label>-->\n <!--\t\t\t<ion-textarea />-->\n <!--\t\t</ion-item>-->\n <!--\t\t<div class=\"ion-padding\">-->\n <!--\t\t\t<ion-button color=\"primary\" size=\"large\" (click)=\"save($event)\">-->\n <!--\t\t\t\tSave changes-->\n <!--\t\t\t</ion-button>-->\n <!--\t\t\t<ion-button-->\n <!--\t\t\t\tcolor=\"danger\"-->\n <!--\t\t\t\tfill=\"clear\"-->\n <!--\t\t\t\tclass=\"ion-margin-horizontal\"-->\n <!--\t\t\t\t(click)=\"close($event)\"-->\n <!--\t\t\t>-->\n <!--\t\t\t\tCancel-->\n <!--\t\t\t</ion-button>-->\n <!--\t\t</div>-->\n <!--\t</ion-item-group>-->\n</ion-content>\n", dependencies: [{ kind: "component", type: HappeningSlotFormComponent, selector: "sneat-happening-slot-form", inputs: ["$happening", "mode", "slot", "wd", "date", "isToDo"], outputs: ["slotAdded", "happeningChange", "eventTimesChanged"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
112
|
+
}
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalComponent, decorators: [{
|
|
114
|
+
type: Component,
|
|
115
|
+
args: [{ selector: 'sneat-slot-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
116
|
+
HappeningSlotFormComponent,
|
|
117
|
+
IonHeader,
|
|
118
|
+
IonToolbar,
|
|
119
|
+
IonTitle,
|
|
120
|
+
IonButtons,
|
|
121
|
+
IonButton,
|
|
122
|
+
IonIcon,
|
|
123
|
+
IonContent,
|
|
124
|
+
], template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-title>\n {{ happening.brief?.title || \"Happening Slot Modal\" }}\n @if (dateID) {\n on {{ dateID }}\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close($event)\" title=\"Close\">\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-happening-slot-form\n mode=\"modal\"\n [$happening]=\"happening\"\n [slot]=\"slot\"\n [date]=\"dateID\"\n (happeningChange)=\"onHappeningChanged($event)\"\n />\n\n <!--\t<ion-item-group>-->\n <!--\t\t<ion-item-divider color=\"light\">When</ion-item-divider>-->\n <!--\t\t<sneat-start-end-datetime-form-->\n <!--\t\t\tmode=\"single\"-->\n <!--\t\t\t[timing]=\"adjustment?.slot || happeningSlot\"-->\n <!--\t\t\t[date]=\"this.dateID\"-->\n <!--\t\t\t(timingChange)=\"onTimingChanged($event)\"-->\n <!--\t\t/>-->\n\n <!--\t\t<ion-item-divider color=\"light\">Where</ion-item-divider>-->\n <!--\t\t<ion-item>-->\n <!--\t\t\t<ion-label position=\"floating\">Address</ion-label>-->\n <!--\t\t\t<ion-textarea />-->\n <!--\t\t</ion-item>-->\n <!--\t\t<div class=\"ion-padding\">-->\n <!--\t\t\t<ion-button color=\"primary\" size=\"large\" (click)=\"save($event)\">-->\n <!--\t\t\t\tSave changes-->\n <!--\t\t\t</ion-button>-->\n <!--\t\t\t<ion-button-->\n <!--\t\t\t\tcolor=\"danger\"-->\n <!--\t\t\t\tfill=\"clear\"-->\n <!--\t\t\t\tclass=\"ion-margin-horizontal\"-->\n <!--\t\t\t\t(click)=\"close($event)\"-->\n <!--\t\t\t>-->\n <!--\t\t\t\tCancel-->\n <!--\t\t\t</ion-button>-->\n <!--\t\t</div>-->\n <!--\t</ion-item-group>-->\n</ion-content>\n" }]
|
|
125
|
+
}], propDecorators: { space: [{
|
|
126
|
+
type: Input,
|
|
127
|
+
args: [{ required: true }]
|
|
128
|
+
}], happening: [{
|
|
129
|
+
type: Input,
|
|
130
|
+
args: [{ required: true }]
|
|
131
|
+
}], slot: [{
|
|
132
|
+
type: Input
|
|
133
|
+
}], adjustment: [{
|
|
134
|
+
type: Input
|
|
135
|
+
}], dateID: [{
|
|
136
|
+
type: Input
|
|
137
|
+
}], happeningSlotChange: [{
|
|
138
|
+
type: Output
|
|
139
|
+
}] } });
|
|
140
|
+
//# sourceMappingURL=happening-slot-modal.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"happening-slot-modal.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/happening-slot-form/happening-slot-modal.component.ts","../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/happening-slot-form/happening-slot-modal.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n OnInit,\n inject,\n} from '@angular/core';\nimport {\n IonButton,\n IonButtons,\n IonContent,\n IonHeader,\n IonIcon,\n IonTitle,\n IonToolbar,\n ModalController,\n} from '@ionic/angular/standalone';\nimport {\n emptyHappeningSlot,\n IHappeningAdjustment,\n ITiming,\n IHappeningContext,\n IHappeningSlotWithID,\n} from '@sneat/mod-schedulus-core';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport { ISpaceContext } from '@sneat/space-models';\n// import { HappeningService } from '../../services/happening.service';\nimport { Subject } from 'rxjs';\nimport {\n HappeningSlotFormComponent,\n IHappeningSlotFormComponentInputs,\n} from './happening-slot-form.component';\n\n@Component({\n selector: 'sneat-slot-modal',\n templateUrl: './happening-slot-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // providers: [HappeningService],\n imports: [\n HappeningSlotFormComponent,\n IonHeader,\n IonToolbar,\n IonTitle,\n IonButtons,\n IonButton,\n IonIcon,\n IonContent,\n ],\n})\nexport class HappeningSlotModalComponent\n implements OnChanges, OnDestroy, IHappeningSlotFormComponentInputs, OnInit\n{\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly modalController = inject(ModalController);\n\n private readonly destroyed = new Subject<void>();\n\n @Input({ required: true }) space?: ISpaceContext;\n @Input({ required: true }) happening: IHappeningContext = {\n id: '',\n space: { id: '' },\n };\n @Input() slot: IHappeningSlotWithID = emptyHappeningSlot;\n @Input() adjustment?: IHappeningAdjustment;\n\n @Input() dateID?: string; // For re-scheduling recurring event for a specific day\n\n @Output() readonly happeningSlotChange =\n new EventEmitter<IHappeningSlotWithID>();\n\n onTimingChanged(timing: ITiming): void {\n if (timing == emptyHappeningSlot) {\n return;\n }\n if (!timing.end) {\n this.errorLogger.logError('timing has no end');\n return;\n }\n // if (!timing.durationMinutes) {\n // \tthis.errorLogger.logError('timing has no durationMinutes');\n // \treturn;\n // }\n this.slot = { ...this.slot, ...timing };\n this.emitHappeningSlotChange();\n }\n\n protected onHappeningChanged(happening: IHappeningContext): void {\n this.happening = happening;\n this.emitHappeningSlotChange();\n }\n\n private emitHappeningSlotChange(): void {\n this.happeningSlotChange.emit(this.slot);\n }\n\n async close(event: Event): Promise<void> {\n event.stopPropagation();\n await this.modalController.dismiss();\n }\n\n // async save(event: Event): Promise<void> {\n // \tconsole.log('save()', event);\n // \tevent.stopPropagation();\n // \tif (!this.space) {\n // \t\tthis.errorLogger.logError('space context is not set');\n // \t\treturn;\n // \t}\n // \tif (!this.happening) {\n // \t\tthis.errorLogger.logError('happening context is not set');\n // \t\treturn;\n // \t}\n // \tswitch (this.happening.brief?.type) {\n // \t\tcase 'single':\n // \t}\n // \talert('breakpoint');\n // \tif (this.happening?.brief?.type === 'single' || !this.dateID) {\n // \t\tthis.happeningService\n // \t\t\t.updateSlot(this.space.id, this.happening.id, this.slot)\n // \t\t\t.pipe(takeUntil(this.destroyed))\n // \t\t\t.subscribe({\n // \t\t\t\tnext: () =>\n // \t\t\t\t\tthis.modalController\n // \t\t\t\t\t\t.dismiss()\n // \t\t\t\t\t\t.catch(this.errorLogger.logErrorHandler('failed to close modal')),\n // \t\t\t\terror: this.errorLogger.logErrorHandler(\n // \t\t\t\t\t'Failed to update happening slot',\n // \t\t\t\t),\n // \t\t\t});\n // \t} else if (this.happening?.brief?.type === 'recurring' && this.dateID) {\n // \t\tthis.happeningService\n // \t\t\t.adjustSlot(this.space.id, this.happening.id, this.slot, this.dateID)\n // \t\t\t.pipe(takeUntil(this.destroyed))\n // \t\t\t.subscribe({\n // \t\t\t\tnext: () =>\n // \t\t\t\t\tthis.modalController\n // \t\t\t\t\t\t.dismiss()\n // \t\t\t\t\t\t.catch(this.errorLogger.logErrorHandler('failed to close modal')),\n // \t\t\t\terror: this.errorLogger.logErrorHandler(\n // \t\t\t\t\t'Failed to adjust happening slot',\n // \t\t\t\t),\n // \t\t\t});\n // \t}\n // }\n\n ngOnInit(): void {\n // console.log('HappeningSlotModalComponent.ngOnInit()', this.slot);\n this.processHappening();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['happening']) {\n this.processHappening();\n }\n }\n\n private processHappening(): void {\n // if (this.happening?.brief?.type === 'single') {\n // \tif (this.happening?.brief?.slots?.length === 1) {\n // \t\tthis.singleSlot = this.happening.brief.slots[0];\n // \t}\n // }\n }\n\n ngOnDestroy(): void {\n this.destroyed.next();\n this.destroyed.complete();\n }\n}\n","<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-title>\n {{ happening.brief?.title || \"Happening Slot Modal\" }}\n @if (dateID) {\n on {{ dateID }}\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close($event)\" title=\"Close\">\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-happening-slot-form\n mode=\"modal\"\n [$happening]=\"happening\"\n [slot]=\"slot\"\n [date]=\"dateID\"\n (happeningChange)=\"onHappeningChanged($event)\"\n />\n\n <!--\t<ion-item-group>-->\n <!--\t\t<ion-item-divider color=\"light\">When</ion-item-divider>-->\n <!--\t\t<sneat-start-end-datetime-form-->\n <!--\t\t\tmode=\"single\"-->\n <!--\t\t\t[timing]=\"adjustment?.slot || happeningSlot\"-->\n <!--\t\t\t[date]=\"this.dateID\"-->\n <!--\t\t\t(timingChange)=\"onTimingChanged($event)\"-->\n <!--\t\t/>-->\n\n <!--\t\t<ion-item-divider color=\"light\">Where</ion-item-divider>-->\n <!--\t\t<ion-item>-->\n <!--\t\t\t<ion-label position=\"floating\">Address</ion-label>-->\n <!--\t\t\t<ion-textarea />-->\n <!--\t\t</ion-item>-->\n <!--\t\t<div class=\"ion-padding\">-->\n <!--\t\t\t<ion-button color=\"primary\" size=\"large\" (click)=\"save($event)\">-->\n <!--\t\t\t\tSave changes-->\n <!--\t\t\t</ion-button>-->\n <!--\t\t\t<ion-button-->\n <!--\t\t\t\tcolor=\"danger\"-->\n <!--\t\t\t\tfill=\"clear\"-->\n <!--\t\t\t\tclass=\"ion-margin-horizontal\"-->\n <!--\t\t\t\t(click)=\"close($event)\"-->\n <!--\t\t\t>-->\n <!--\t\t\t\tCancel-->\n <!--\t\t\t</ion-button>-->\n <!--\t\t</div>-->\n <!--\t</ion-item-group>-->\n</ion-content>\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Injectable, NgModule, inject } from '@angular/core';
|
|
2
|
+
import { ModalController } from '@ionic/angular/standalone';
|
|
3
|
+
import { HappeningSlotModalComponent } from './happening-slot-modal.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class HappeningSlotModalService {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.modalController = inject(ModalController);
|
|
8
|
+
}
|
|
9
|
+
async editSingleHappeningSlot(event, happening, recurring, slot) {
|
|
10
|
+
// console.log('editSingleHappeningSlot()', happening, recurring, slot);
|
|
11
|
+
event.stopPropagation();
|
|
12
|
+
event.preventDefault();
|
|
13
|
+
const space = happening.space;
|
|
14
|
+
if (!space) {
|
|
15
|
+
return Promise.reject('no space context');
|
|
16
|
+
}
|
|
17
|
+
const modal = await this.modalController.create({
|
|
18
|
+
component: HappeningSlotModalComponent,
|
|
19
|
+
componentProps: {
|
|
20
|
+
space,
|
|
21
|
+
happening,
|
|
22
|
+
slot,
|
|
23
|
+
adjustment: recurring?.adjustment,
|
|
24
|
+
dateID: recurring?.dateID,
|
|
25
|
+
isModal: true,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
await modal.present();
|
|
29
|
+
}
|
|
30
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
31
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalService }); }
|
|
32
|
+
}
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalService, decorators: [{
|
|
34
|
+
type: Injectable
|
|
35
|
+
}] });
|
|
36
|
+
export class HappeningSlotModalServiceModule {
|
|
37
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalServiceModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
38
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalServiceModule }); }
|
|
39
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalServiceModule, providers: [HappeningSlotModalService] }); }
|
|
40
|
+
}
|
|
41
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotModalServiceModule, decorators: [{
|
|
42
|
+
type: NgModule,
|
|
43
|
+
args: [{
|
|
44
|
+
providers: [HappeningSlotModalService],
|
|
45
|
+
}]
|
|
46
|
+
}] });
|
|
47
|
+
//# sourceMappingURL=happening-slot-modal.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"happening-slot-modal.service.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/happening-slot-form/happening-slot-modal.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAM5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;;AAS/E,MAAM,OAAO,yBAAyB;IADtC;QAEmB,oBAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;KA4B5D;IA1BC,KAAK,CAAC,uBAAuB,CAC3B,KAAY,EACZ,SAA4B,EAC5B,SAAmC,EACnC,IAA2B;QAE3B,wEAAwE;QACxE,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;YAC9C,SAAS,EAAE,2BAA2B;YACtC,cAAc,EAAE;gBACd,KAAK;gBACL,SAAS;gBACT,IAAI;gBACJ,UAAU,EAAE,SAAS,EAAE,UAAU;gBACjC,MAAM,EAAE,SAAS,EAAE,MAAM;gBACzB,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;8GA5BU,yBAAyB;kHAAzB,yBAAyB;;2FAAzB,yBAAyB;kBADrC,UAAU;;AAmCX,MAAM,OAAO,+BAA+B;8GAA/B,+BAA+B;+GAA/B,+BAA+B;+GAA/B,+BAA+B,aAF/B,CAAC,yBAAyB,CAAC;;2FAE3B,+BAA+B;kBAH3C,QAAQ;mBAAC;oBACR,SAAS,EAAE,CAAC,yBAAyB,CAAC;iBACvC","sourcesContent":["import { Injectable, NgModule, inject } from '@angular/core';\nimport { ModalController } from '@ionic/angular/standalone';\nimport {\n IHappeningContext,\n ISlotAdjustment,\n IHappeningSlotWithID,\n} from '@sneat/mod-schedulus-core';\nimport { HappeningSlotModalComponent } from './happening-slot-modal.component';\n\nexport interface EditRecurringSlotParams {\n dateID: string;\n editMode: 'series' | 'single';\n adjustment?: ISlotAdjustment;\n}\n\n@Injectable()\nexport class HappeningSlotModalService {\n private readonly modalController = inject(ModalController);\n\n async editSingleHappeningSlot(\n event: Event,\n happening: IHappeningContext,\n recurring?: EditRecurringSlotParams,\n slot?: IHappeningSlotWithID,\n ): Promise<void> {\n // console.log('editSingleHappeningSlot()', happening, recurring, slot);\n event.stopPropagation();\n event.preventDefault();\n const space = happening.space;\n if (!space) {\n return Promise.reject('no space context');\n }\n const modal = await this.modalController.create({\n component: HappeningSlotModalComponent,\n componentProps: {\n space,\n happening,\n slot,\n adjustment: recurring?.adjustment,\n dateID: recurring?.dateID,\n isModal: true,\n },\n });\n await modal.present();\n }\n}\n\n@NgModule({\n providers: [HappeningSlotModalService],\n})\nexport class HappeningSlotModalServiceModule {}\n"]}
|
package/esm2022/lib/components/happening-slot-participants/happening-slot-participants.component.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, input, signal, computed, effect, inject, } from '@angular/core';
|
|
2
|
+
import { IonBadge, IonLabel } from '@ionic/angular/standalone';
|
|
3
|
+
import { PersonNamesPipe } from '@sneat/auth-ui';
|
|
4
|
+
import { ContactusSpaceService } from '@sneat/contactus-services';
|
|
5
|
+
import { getRelatedItemByIDs, getRelatedItems } from '@sneat/dto';
|
|
6
|
+
import { ClassName, SneatBaseComponent } from '@sneat/ui';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class HappeningSlotParticipantsComponent extends SneatBaseComponent {
|
|
9
|
+
// private readonly spaceID$ = new Subject<string>();
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
this.changedDetectorRef = inject(ChangeDetectorRef);
|
|
13
|
+
this.contactusService = inject(ContactusSpaceService);
|
|
14
|
+
this.$spaceContacts = signal(undefined, ...(ngDevMode ? [{ debugName: "$spaceContacts" }] : []));
|
|
15
|
+
this.$happeningSlot = input.required(...(ngDevMode ? [{ debugName: "$happeningSlot" }] : []));
|
|
16
|
+
this.$relatedItems = computed(() => {
|
|
17
|
+
const happeningSlot = this.$happeningSlot();
|
|
18
|
+
return getRelatedItems('contactus', 'contacts', happeningSlot.happening.brief?.related);
|
|
19
|
+
}, ...(ngDevMode ? [{ debugName: "$relatedItems" }] : []));
|
|
20
|
+
this.$contacts = computed(() => {
|
|
21
|
+
const spaceID = this.$happeningSlot().happening?.space?.id || '';
|
|
22
|
+
if (!spaceID) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const relatedItems = this.$relatedItems();
|
|
26
|
+
const spaceContacts = this.$spaceContacts();
|
|
27
|
+
const space = { id: spaceID };
|
|
28
|
+
const contacts = spaceContacts
|
|
29
|
+
?.filter((c) => !!getRelatedItemByIDs(relatedItems, c.id, spaceID))
|
|
30
|
+
?.map((c) => Object.assign(c, { space })) || [];
|
|
31
|
+
return contacts.filter((c) => !!c?.brief) || [];
|
|
32
|
+
}, ...(ngDevMode ? [{ debugName: "$contacts" }] : []));
|
|
33
|
+
this.$spaceID = computed(() => this.$happeningSlot().happening.space.id, ...(ngDevMode ? [{ debugName: "$spaceID" }] : []));
|
|
34
|
+
effect(() => {
|
|
35
|
+
const spaceID = this.$spaceID();
|
|
36
|
+
this.onSpaceIDChanged(spaceID);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
isUniqueFirstName(contact) {
|
|
40
|
+
const firstName = contact.brief?.names?.firstName;
|
|
41
|
+
if (!firstName) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return !!this.$contacts()?.some((c) => c.brief?.names?.firstName === firstName);
|
|
45
|
+
}
|
|
46
|
+
onSpaceIDChanged(spaceID) {
|
|
47
|
+
// console.log('HappeningSlotParticipantsComponent.onSpaceIDChanged()', spaceID);
|
|
48
|
+
const space = { id: spaceID };
|
|
49
|
+
this.contactusService
|
|
50
|
+
.watchContactBriefs(spaceID)
|
|
51
|
+
.pipe(this.takeUntilDestroyed())
|
|
52
|
+
.subscribe({
|
|
53
|
+
next: (contacts) => {
|
|
54
|
+
// console.log(
|
|
55
|
+
// 'HappeningSlotParticipantsComponent.contacts =>',
|
|
56
|
+
// this.happeningSlot?.slotID,
|
|
57
|
+
// contacts,
|
|
58
|
+
// );
|
|
59
|
+
this.$spaceContacts.set(contacts.map((c) => ({ ...c, space })));
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotParticipantsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
64
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: HappeningSlotParticipantsComponent, isStandalone: true, selector: "sneat-happening-slot-participants", inputs: { $happeningSlot: { classPropertyName: "$happeningSlot", publicName: "$happeningSlot", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
65
|
+
{ provide: ClassName, useValue: 'HappeningSlotParticipantsComponent' },
|
|
66
|
+
], usesInheritance: true, ngImport: i0, template: "@for (contact of $contacts(); track contact.id) {\n <ion-badge color=\"light\" class=\"ion-margin-end\">\n <ion-label color=\"medium\">{{\n isUniqueFirstName(contact)\n ? contact.brief.names?.firstName\n : (contact.brief.names | personNames)\n }}</ion-label>\n </ion-badge>\n}\n", dependencies: [{ kind: "component", type: IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "pipe", type: PersonNamesPipe, name: "personNames" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
67
|
+
}
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotParticipantsComponent, decorators: [{
|
|
69
|
+
type: Component,
|
|
70
|
+
args: [{ imports: [PersonNamesPipe, IonBadge, IonLabel], providers: [
|
|
71
|
+
{ provide: ClassName, useValue: 'HappeningSlotParticipantsComponent' },
|
|
72
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-happening-slot-participants', template: "@for (contact of $contacts(); track contact.id) {\n <ion-badge color=\"light\" class=\"ion-margin-end\">\n <ion-label color=\"medium\">{{\n isUniqueFirstName(contact)\n ? contact.brief.names?.firstName\n : (contact.brief.names | personNames)\n }}</ion-label>\n </ion-badge>\n}\n" }]
|
|
73
|
+
}], ctorParameters: () => [], propDecorators: { $happeningSlot: [{ type: i0.Input, args: [{ isSignal: true, alias: "$happeningSlot", required: true }] }] } });
|
|
74
|
+
//# sourceMappingURL=happening-slot-participants.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"happening-slot-participants.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/happening-slot-participants/happening-slot-participants.component.ts","../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/happening-slot-participants/happening-slot-participants.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;;AAW1D,MAAM,OAAO,kCAAmC,SAAQ,kBAAkB;IAuCxE,qDAAqD;IAErD;QACE,KAAK,EAAE,CAAC;QAzCO,uBAAkB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC/C,qBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAG/C,mBAAc,GAAG,MAAM,CAExC,SAAS,0DAAC,CAAC;QAEG,mBAAc,GAAG,KAAK,CAAC,QAAQ,yDAAkB,CAAC;QAE/C,kBAAa,GAAG,QAAQ,CAAC,GAAG,EAAE;YAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5C,OAAO,eAAe,CACpB,WAAW,EACX,UAAU,EACV,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CACvC,CAAC;QACJ,CAAC,yDAAC,CAAC;QAEO,cAAS,GAAG,QAAQ,CAAC,GAAG,EAAE;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAc,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;YACzC,MAAM,QAAQ,GACZ,aAAa;gBACX,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACnE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC,qDAAC,CAAC;QAEc,aAAQ,GAAG,QAAQ,CAClC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,oDAC/C,CAAC;QAMA,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAES,iBAAiB,CAAC,OAAkC;QAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,KAAK,SAAS,CAC/C,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,OAAe;QACtC,iFAAiF;QACjF,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,gBAAgB;aAClB,kBAAkB,CAAC,OAAO,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;aAC/B,SAAS,CAAC;YACT,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACjB,eAAe;gBACf,qDAAqD;gBACrD,+BAA+B;gBAC/B,aAAa;gBACb,KAAK;gBACL,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;SACF,CAAC,CAAC;IACP,CAAC;8GA3EU,kCAAkC;kGAAlC,kCAAkC,8OAPlC;YACT,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,oCAAoC,EAAE;SACvE,iDC1BH,mTASA,4CDc6B,QAAQ,iFAAE,QAAQ,wFAAnC,eAAe;;2FAQd,kCAAkC;kBAT9C,SAAS;8BACC,CAAC,eAAe,EAAE,QAAQ,EAAE,QAAQ,CAAC,aACnC;wBACT,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,oCAAoC,EAAE;qBACvE,mBACgB,uBAAuB,CAAC,MAAM,YACrC,mCAAmC","sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n input,\n signal,\n computed,\n effect,\n inject,\n} from '@angular/core';\nimport { IonBadge, IonLabel } from '@ionic/angular/standalone';\nimport { PersonNamesPipe } from '@sneat/auth-ui';\nimport {\n IContactWithBrief,\n IContactWithBriefAndSpace,\n} from '@sneat/contactus-core';\nimport { ContactusSpaceService } from '@sneat/contactus-services';\nimport { getRelatedItemByIDs, getRelatedItems } from '@sneat/dto';\nimport { ISlotUIContext } from '@sneat/mod-schedulus-core';\nimport { ISpaceRef } from '@sneat/core';\nimport { ClassName, SneatBaseComponent } from '@sneat/ui';\n\n@Component({\n imports: [PersonNamesPipe, IonBadge, IonLabel],\n providers: [\n { provide: ClassName, useValue: 'HappeningSlotParticipantsComponent' },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-happening-slot-participants',\n templateUrl: 'happening-slot-participants.component.html',\n})\nexport class HappeningSlotParticipantsComponent extends SneatBaseComponent {\n private readonly changedDetectorRef = inject(ChangeDetectorRef);\n private readonly contactusService = inject(ContactusSpaceService);\n\n protected contacts?: readonly IContactWithBriefAndSpace[];\n protected readonly $spaceContacts = signal<\n readonly IContactWithBrief[] | undefined\n >(undefined);\n\n public readonly $happeningSlot = input.required<ISlotUIContext>();\n\n protected readonly $relatedItems = computed(() => {\n const happeningSlot = this.$happeningSlot();\n return getRelatedItems(\n 'contactus',\n 'contacts',\n happeningSlot.happening.brief?.related,\n );\n });\n\n protected $contacts = computed(() => {\n const spaceID = this.$happeningSlot().happening?.space?.id || '';\n if (!spaceID) {\n return;\n }\n const relatedItems = this.$relatedItems();\n const spaceContacts = this.$spaceContacts();\n const space: ISpaceRef = { id: spaceID };\n const contacts: readonly IContactWithBriefAndSpace[] =\n spaceContacts\n ?.filter((c) => !!getRelatedItemByIDs(relatedItems, c.id, spaceID))\n ?.map((c) => Object.assign(c, { space })) || [];\n return contacts.filter((c) => !!c?.brief) || [];\n });\n\n private readonly $spaceID = computed(\n () => this.$happeningSlot().happening.space.id,\n );\n\n // private readonly spaceID$ = new Subject<string>();\n\n public constructor() {\n super();\n effect(() => {\n const spaceID = this.$spaceID();\n this.onSpaceIDChanged(spaceID);\n });\n }\n\n protected isUniqueFirstName(contact: IContactWithBriefAndSpace): boolean {\n const firstName = contact.brief?.names?.firstName;\n if (!firstName) {\n return false;\n }\n return !!this.$contacts()?.some(\n (c) => c.brief?.names?.firstName === firstName,\n );\n }\n\n private onSpaceIDChanged(spaceID: string): void {\n // console.log('HappeningSlotParticipantsComponent.onSpaceIDChanged()', spaceID);\n const space = { id: spaceID };\n this.contactusService\n .watchContactBriefs(spaceID)\n .pipe(this.takeUntilDestroyed())\n .subscribe({\n next: (contacts) => {\n // console.log(\n // \t'HappeningSlotParticipantsComponent.contacts =>',\n // \tthis.happeningSlot?.slotID,\n // \tcontacts,\n // );\n this.$spaceContacts.set(contacts.map((c) => ({ ...c, space })));\n },\n });\n }\n}\n","@for (contact of $contacts(); track contact.id) {\n <ion-badge color=\"light\" class=\"ion-margin-end\">\n <ion-label color=\"medium\">{{\n isUniqueFirstName(contact)\n ? contact.brief.names?.firstName\n : (contact.brief.names | personNames)\n }}</ion-label>\n </ion-badge>\n}\n"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, EventEmitter, input, Output, signal, inject, } from '@angular/core';
|
|
2
|
+
import { IonBadge, IonButton, IonButtons, IonIcon, IonItem, IonLabel, IonSpinner, IonText, } from '@ionic/angular/standalone';
|
|
3
|
+
import { Numeral2Pipe } from '@sneat/components';
|
|
4
|
+
import { WdToWeekdayPipe, } from '@sneat/mod-schedulus-core';
|
|
5
|
+
import { ErrorLogger } from '@sneat/core';
|
|
6
|
+
import { HappeningService, } from '../../services/happening.service';
|
|
7
|
+
import { HappeningSlotModalService, HappeningSlotModalServiceModule, } from '../happening-slot-form/happening-slot-modal.service';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class HappeningSlotsComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.errorLogger = inject(ErrorLogger);
|
|
12
|
+
this.happeningService = inject(HappeningService);
|
|
13
|
+
this.happeningSlotModalService = inject(HappeningSlotModalService);
|
|
14
|
+
this.happening = input.required(...(ngDevMode ? [{ debugName: "happening" }] : []));
|
|
15
|
+
this.wd = input(...(ngDevMode ? [undefined, { debugName: "wd" }] : []));
|
|
16
|
+
this.slotSelected = new EventEmitter();
|
|
17
|
+
this.happeningChange = new EventEmitter();
|
|
18
|
+
this.$slots = computed(() => Object.entries(this.happening().brief?.slots || {}).map(([id, slot]) => Object.assign(slot, { id })), ...(ngDevMode ? [{ debugName: "$slots" }] : []));
|
|
19
|
+
this.hasAnyWd = (slot, ...wds) => wds.some((wd) => !!slot.weekdays?.includes(wd));
|
|
20
|
+
this.$deletingSlotIDs = signal([], ...(ngDevMode ? [{ debugName: "$deletingSlotIDs" }] : []));
|
|
21
|
+
}
|
|
22
|
+
removeSlot(event, slot) {
|
|
23
|
+
event.preventDefault();
|
|
24
|
+
event.stopPropagation();
|
|
25
|
+
const happening = this.happening();
|
|
26
|
+
if (!happening.brief) {
|
|
27
|
+
throw new Error('!this.happening?.brief');
|
|
28
|
+
}
|
|
29
|
+
if (happening.id) {
|
|
30
|
+
this.deleteSlot(slot);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.removeSlotFromHappening(slot);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
removeSlotFromHappening(slot) {
|
|
37
|
+
const happening = this.happening();
|
|
38
|
+
if (!happening.brief) {
|
|
39
|
+
throw new Error('!this.happening');
|
|
40
|
+
}
|
|
41
|
+
this.onHappeningChanged({
|
|
42
|
+
...happening,
|
|
43
|
+
brief: {
|
|
44
|
+
...happening.brief,
|
|
45
|
+
slots: Object.fromEntries(Object.entries(happening.brief?.slots || {}).filter(([id]) => id !== slot.id)),
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
deleteSlot(slot) {
|
|
50
|
+
const happening = this.happening();
|
|
51
|
+
if (!happening.brief) {
|
|
52
|
+
throw new Error('!this.happening?.brief');
|
|
53
|
+
}
|
|
54
|
+
const happeningID = happening.id;
|
|
55
|
+
if (!happeningID) {
|
|
56
|
+
throw new Error('!happeningID');
|
|
57
|
+
}
|
|
58
|
+
const spaceID = happening.space.id;
|
|
59
|
+
if (!spaceID) {
|
|
60
|
+
throw new Error('!spaceID');
|
|
61
|
+
}
|
|
62
|
+
const request = {
|
|
63
|
+
spaceID: spaceID,
|
|
64
|
+
happeningID,
|
|
65
|
+
slotID: slot.id,
|
|
66
|
+
};
|
|
67
|
+
this.$deletingSlotIDs.set([...this.$deletingSlotIDs(), slot.id]);
|
|
68
|
+
const removeFromDeletingSlotIDs = (delay) => setTimeout(() => this.$deletingSlotIDs.set(this.$deletingSlotIDs().filter((id) => id !== slot.id)), delay);
|
|
69
|
+
this.happeningService.deleteSlot(request).subscribe({
|
|
70
|
+
next: () => {
|
|
71
|
+
this.removeSlotFromHappening(slot);
|
|
72
|
+
removeFromDeletingSlotIDs(0);
|
|
73
|
+
},
|
|
74
|
+
error: (err) => {
|
|
75
|
+
this.errorLogger.logError(err, 'failed to delete slot');
|
|
76
|
+
removeFromDeletingSlotIDs(300);
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
selectSlot(event, slot) {
|
|
81
|
+
this.slotSelected.emit(slot);
|
|
82
|
+
this.showEditSlot(event, slot);
|
|
83
|
+
}
|
|
84
|
+
onHappeningChanged(happening) {
|
|
85
|
+
this.happeningChange.emit(happening);
|
|
86
|
+
}
|
|
87
|
+
showEditSlot(event, slot) {
|
|
88
|
+
event.stopPropagation();
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
const happening = this.happening();
|
|
91
|
+
this.happeningSlotModalService
|
|
92
|
+
.editSingleHappeningSlot(event, happening, undefined, slot)
|
|
93
|
+
.catch(this.errorLogger.logErrorHandler('failed to open edit modal'));
|
|
94
|
+
// this.addSlotParams = undefined;
|
|
95
|
+
// this.editingSlot = slot;
|
|
96
|
+
// this.isShowingSlotFormModal = true;
|
|
97
|
+
}
|
|
98
|
+
showAddSlot(event) {
|
|
99
|
+
const happening = this.happening();
|
|
100
|
+
this.happeningSlotModalService
|
|
101
|
+
.editSingleHappeningSlot(event, happening)
|
|
102
|
+
.catch(this.errorLogger.logErrorHandler('failed to open edit modal'));
|
|
103
|
+
// this.editingSlot = undefined;
|
|
104
|
+
// this.addSlotParams = params;
|
|
105
|
+
// this.isShowingSlotFormModal = true;
|
|
106
|
+
}
|
|
107
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
108
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: HappeningSlotsComponent, isStandalone: true, selector: "sneat-happening-slots", inputs: { happening: { classPropertyName: "happening", publicName: "happening", isSignal: true, isRequired: true, transformFunction: null }, wd: { classPropertyName: "wd", publicName: "wd", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { slotSelected: "slotSelected", happeningChange: "happeningChange" }, ngImport: i0, template: "<ion-item color=\"light\" class=\"sneat-tiny-end-padding\">\n <ion-label>When</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button\n title=\"Add slot\"\n (click)=\"showAddSlot($event)\"\n [color]=\"$slots()?.length ? 'primary' : 'danger'\"\n >\n <ion-icon name=\"add-outline\" slot=\"start\" />\n <ion-label>Add slot</ion-label>\n </ion-button>\n </ion-buttons>\n</ion-item>\n@if ($slots() && !$slots()?.length) {\n <ion-item>\n <ion-label><i>No slots have been added yet.</i></ion-label>\n </ion-item>\n}\n@for (slot of $slots(); track slot.id; let last = $last) {\n <ion-item\n button=\"button\"\n class=\"with-buttons sneat-tiny-end-padding\"\n [lines]=\"last ? 'full' : 'inset'\"\n (click)=\"selectSlot($event, slot)\"\n >\n @if (slot.start || slot.end) {\n <ion-buttons slot=\"start\">\n <!-- TODO(help-wanted): align to the top -->\n <div style=\"text-align: center\">\n @if (slot.start) {\n <ion-badge style=\"display: block\" color=\"light\">\n @if (slot.start.date) {\n <b>{{ slot.start.date }}</b>\n }\n\n @ {{ slot.start.time }}\n </ion-badge>\n }\n @if (slot.durationMinutes) {\n <ion-text\n color=\"medium\"\n style=\"display: block; font-size: small; margin-top: 0.75em\"\n >\n {{ slot.durationMinutes }} mins\n </ion-text>\n }\n </div>\n </ion-buttons>\n }\n\n @if (slot.repeats === \"monthly\") {\n @if (slot.start) {\n on\n } @else {\n On\n }\n {{ slot.day | numeral }}\n of every month\n }\n\n @if (slot.repeats === \"yearly\") {\n Every year on {{ slot.day | numeral }} of {{ slot.month }}\n }\n\n <ion-label text-wrap>\n <p>\n @if (slot.weekdays?.length === 7) {\n Every day\n } @else if (\n slot.weekdays?.length === 5 && !hasAnyWd(slot, \"sa\", \"su\")\n ) {\n Weekdays\n } @else if (slot.weekdays?.length === 2 && hasAnyWd(slot, \"sa\", \"su\")) {\n Weekends\n } @else {\n @for (wd of slot.weekdays; track wd) {\n <ion-badge color=\"light\" style=\"margin-right: 4px\">\n {{ wd | wdToWeekday }}\n </ion-badge>\n }\n }\n </p>\n <p>\n @if (slot.location && (slot.location.title || slot.location.address)) {\n @ {{ slot.location.title || slot.location.address }}\n @if (slot.end) {\n , ends at\n {{ slot.end.time }}\n }\n } @else if (slot.end) {\n Ends at {{ slot.end.time }}\n }\n </p>\n </ion-label>\n <ion-buttons slot=\"end\">\n @if (!$deletingSlotIDs().includes(slot.id)) {\n <ion-button\n title=\"Edit\"\n color=\"medium\"\n (click)=\"showEditSlot($event, slot)\"\n >\n <ion-icon name=\"create-outline\" />\n </ion-button>\n }\n @if (!happening().id || ($slots()?.length || 0) > 1) {\n <ion-button\n [disabled]=\"$deletingSlotIDs().includes(slot.id)\"\n (click)=\"removeSlot($event, slot)\"\n color=\"medium\"\n >\n @if ($deletingSlotIDs().includes(slot.id)) {\n @if ($deletingSlotIDs().includes(slot.id)) {\n <ion-spinner name=\"lines-small\" slot=\"end\" />\n }\n <ion-label style=\"text-transform: none\">Deleting...</ion-label>\n } @else {\n <ion-icon name=\"close-outline\" />\n }\n </ion-button>\n }\n </ion-buttons>\n </ion-item>\n}\n<!--<ion-modal-->\n<!--\t#addSlotModal-->\n<!--\t[isOpen]=\"isShowingSlotFormModal\"-->\n<!--\t(ionModalDidDismiss)=\"onSlotFormModalDismissed($event)\"-->\n<!-->-->\n<!--\t<!–\tclass=\"auto-height\"–>-->\n\n<!--\t<ng-template>-->\n<!--\t\t<ion-header>-->\n<!--\t\t\t<ion-toolbar color=\"primary\">-->\n<!--\t\t\t\t<ion-title>-->\n<!--\t\t\t\t\t@if (editingSlot) {-->\n<!--\t\t\t\t\t\t{{ happening?.brief?.title || \"Edit happening\" }}-->\n<!--\t\t\t\t\t} @else {-->\n<!--\t\t\t\t\t\tNew slot-->\n<!--\t\t\t\t\t}-->\n<!--\t\t\t\t</ion-title>-->\n<!--\t\t\t\t<ion-buttons slot=\"end\">-->\n<!--\t\t\t\t\t<ion-button (click)=\"addSlotModal.dismiss()\">-->\n<!--\t\t\t\t\t\t<ion-icon name=\"close-outline\" slot=\"icon-only\" />-->\n<!--\t\t\t\t\t</ion-button>-->\n<!--\t\t\t\t</ion-buttons>-->\n<!--\t\t\t</ion-toolbar>-->\n<!--\t\t</ion-header>-->\n<!--\t\t<ion-content>-->\n<!--\t\t\t<!–\t\t\t<div class=\"modal-wrapper\">–>-->\n<!--\t\t\t<sneat-happening-slot-form-->\n<!--\t\t\t\tclass=\"modal-content\"-->\n<!--\t\t\t\tmode=\"modal\"-->\n<!--\t\t\t\t[wd]=\"addSlotParams?.wd\"-->\n<!--\t\t\t\t[(happening)]=\"happening\"-->\n<!--\t\t\t\t[slot]=\"editingSlot\"-->\n<!--\t\t\t\t[isToDo]=\"false\"-->\n<!--\t\t\t\t(slotAdded)=\"onSlotAdded($event)\"-->\n<!--\t\t\t\t(happeningChange)=\"onHappeningChanged($event)\"-->\n<!--\t\t\t/>-->\n<!--\t\t\t<!–\t\t\t</div>–>-->\n<!--\t\t</ion-content>-->\n<!--\t</ng-template>-->\n<!--</ion-modal>-->\n", dependencies: [{ kind: "ngmodule", type: HappeningSlotModalServiceModule }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "pipe", type: WdToWeekdayPipe, name: "wdToWeekday" }, { kind: "pipe", type: Numeral2Pipe, name: "numeral" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
109
|
+
}
|
|
110
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: HappeningSlotsComponent, decorators: [{
|
|
111
|
+
type: Component,
|
|
112
|
+
args: [{ imports: [
|
|
113
|
+
HappeningSlotModalServiceModule,
|
|
114
|
+
WdToWeekdayPipe,
|
|
115
|
+
Numeral2Pipe,
|
|
116
|
+
IonLabel,
|
|
117
|
+
IonButtons,
|
|
118
|
+
IonButton,
|
|
119
|
+
IonIcon,
|
|
120
|
+
IonItem,
|
|
121
|
+
IonText,
|
|
122
|
+
IonBadge,
|
|
123
|
+
IonSpinner,
|
|
124
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-happening-slots', template: "<ion-item color=\"light\" class=\"sneat-tiny-end-padding\">\n <ion-label>When</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button\n title=\"Add slot\"\n (click)=\"showAddSlot($event)\"\n [color]=\"$slots()?.length ? 'primary' : 'danger'\"\n >\n <ion-icon name=\"add-outline\" slot=\"start\" />\n <ion-label>Add slot</ion-label>\n </ion-button>\n </ion-buttons>\n</ion-item>\n@if ($slots() && !$slots()?.length) {\n <ion-item>\n <ion-label><i>No slots have been added yet.</i></ion-label>\n </ion-item>\n}\n@for (slot of $slots(); track slot.id; let last = $last) {\n <ion-item\n button=\"button\"\n class=\"with-buttons sneat-tiny-end-padding\"\n [lines]=\"last ? 'full' : 'inset'\"\n (click)=\"selectSlot($event, slot)\"\n >\n @if (slot.start || slot.end) {\n <ion-buttons slot=\"start\">\n <!-- TODO(help-wanted): align to the top -->\n <div style=\"text-align: center\">\n @if (slot.start) {\n <ion-badge style=\"display: block\" color=\"light\">\n @if (slot.start.date) {\n <b>{{ slot.start.date }}</b>\n }\n\n @ {{ slot.start.time }}\n </ion-badge>\n }\n @if (slot.durationMinutes) {\n <ion-text\n color=\"medium\"\n style=\"display: block; font-size: small; margin-top: 0.75em\"\n >\n {{ slot.durationMinutes }} mins\n </ion-text>\n }\n </div>\n </ion-buttons>\n }\n\n @if (slot.repeats === \"monthly\") {\n @if (slot.start) {\n on\n } @else {\n On\n }\n {{ slot.day | numeral }}\n of every month\n }\n\n @if (slot.repeats === \"yearly\") {\n Every year on {{ slot.day | numeral }} of {{ slot.month }}\n }\n\n <ion-label text-wrap>\n <p>\n @if (slot.weekdays?.length === 7) {\n Every day\n } @else if (\n slot.weekdays?.length === 5 && !hasAnyWd(slot, \"sa\", \"su\")\n ) {\n Weekdays\n } @else if (slot.weekdays?.length === 2 && hasAnyWd(slot, \"sa\", \"su\")) {\n Weekends\n } @else {\n @for (wd of slot.weekdays; track wd) {\n <ion-badge color=\"light\" style=\"margin-right: 4px\">\n {{ wd | wdToWeekday }}\n </ion-badge>\n }\n }\n </p>\n <p>\n @if (slot.location && (slot.location.title || slot.location.address)) {\n @ {{ slot.location.title || slot.location.address }}\n @if (slot.end) {\n , ends at\n {{ slot.end.time }}\n }\n } @else if (slot.end) {\n Ends at {{ slot.end.time }}\n }\n </p>\n </ion-label>\n <ion-buttons slot=\"end\">\n @if (!$deletingSlotIDs().includes(slot.id)) {\n <ion-button\n title=\"Edit\"\n color=\"medium\"\n (click)=\"showEditSlot($event, slot)\"\n >\n <ion-icon name=\"create-outline\" />\n </ion-button>\n }\n @if (!happening().id || ($slots()?.length || 0) > 1) {\n <ion-button\n [disabled]=\"$deletingSlotIDs().includes(slot.id)\"\n (click)=\"removeSlot($event, slot)\"\n color=\"medium\"\n >\n @if ($deletingSlotIDs().includes(slot.id)) {\n @if ($deletingSlotIDs().includes(slot.id)) {\n <ion-spinner name=\"lines-small\" slot=\"end\" />\n }\n <ion-label style=\"text-transform: none\">Deleting...</ion-label>\n } @else {\n <ion-icon name=\"close-outline\" />\n }\n </ion-button>\n }\n </ion-buttons>\n </ion-item>\n}\n<!--<ion-modal-->\n<!--\t#addSlotModal-->\n<!--\t[isOpen]=\"isShowingSlotFormModal\"-->\n<!--\t(ionModalDidDismiss)=\"onSlotFormModalDismissed($event)\"-->\n<!-->-->\n<!--\t<!–\tclass=\"auto-height\"–>-->\n\n<!--\t<ng-template>-->\n<!--\t\t<ion-header>-->\n<!--\t\t\t<ion-toolbar color=\"primary\">-->\n<!--\t\t\t\t<ion-title>-->\n<!--\t\t\t\t\t@if (editingSlot) {-->\n<!--\t\t\t\t\t\t{{ happening?.brief?.title || \"Edit happening\" }}-->\n<!--\t\t\t\t\t} @else {-->\n<!--\t\t\t\t\t\tNew slot-->\n<!--\t\t\t\t\t}-->\n<!--\t\t\t\t</ion-title>-->\n<!--\t\t\t\t<ion-buttons slot=\"end\">-->\n<!--\t\t\t\t\t<ion-button (click)=\"addSlotModal.dismiss()\">-->\n<!--\t\t\t\t\t\t<ion-icon name=\"close-outline\" slot=\"icon-only\" />-->\n<!--\t\t\t\t\t</ion-button>-->\n<!--\t\t\t\t</ion-buttons>-->\n<!--\t\t\t</ion-toolbar>-->\n<!--\t\t</ion-header>-->\n<!--\t\t<ion-content>-->\n<!--\t\t\t<!–\t\t\t<div class=\"modal-wrapper\">–>-->\n<!--\t\t\t<sneat-happening-slot-form-->\n<!--\t\t\t\tclass=\"modal-content\"-->\n<!--\t\t\t\tmode=\"modal\"-->\n<!--\t\t\t\t[wd]=\"addSlotParams?.wd\"-->\n<!--\t\t\t\t[(happening)]=\"happening\"-->\n<!--\t\t\t\t[slot]=\"editingSlot\"-->\n<!--\t\t\t\t[isToDo]=\"false\"-->\n<!--\t\t\t\t(slotAdded)=\"onSlotAdded($event)\"-->\n<!--\t\t\t\t(happeningChange)=\"onHappeningChanged($event)\"-->\n<!--\t\t\t/>-->\n<!--\t\t\t<!–\t\t\t</div>–>-->\n<!--\t\t</ion-content>-->\n<!--\t</ng-template>-->\n<!--</ion-modal>-->\n" }]
|
|
125
|
+
}], propDecorators: { happening: [{ type: i0.Input, args: [{ isSignal: true, alias: "happening", required: true }] }], wd: [{ type: i0.Input, args: [{ isSignal: true, alias: "wd", required: false }] }], slotSelected: [{
|
|
126
|
+
type: Output
|
|
127
|
+
}], happeningChange: [{
|
|
128
|
+
type: Output
|
|
129
|
+
}] } });
|
|
130
|
+
//# sourceMappingURL=happening-slots.component.js.map
|