@sneat/extensions-schedulus-shared 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.js +2 -0
- package/esm2022/index.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar-base.component.js +83 -0
- package/esm2022/lib/components/calendar/calendar-base.component.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar-brief.component.js +57 -0
- package/esm2022/lib/components/calendar/calendar-brief.component.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar-component-types.js +2 -0
- package/esm2022/lib/components/calendar/calendar-component-types.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar-state.service.js +90 -0
- package/esm2022/lib/components/calendar/calendar-state.service.js.map +1 -0
- package/esm2022/lib/components/calendar/calendar.component.js +284 -0
- package/esm2022/lib/components/calendar/calendar.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.js +45 -0
- package/esm2022/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-base.component.js +26 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-base.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-card.component.js +67 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-card.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-tab.component.js +74 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-tab.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-title.component.js +27 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-title.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day.component.js +129 -0
- package/esm2022/lib/components/calendar/components/calendar-day/calendar-day.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.component.js +162 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.js +17 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/contacts-filter.component.js +95 -0
- package/esm2022/lib/components/calendar/components/calendar-filter/contacts-filter.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-card.component.js +50 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-card.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-tab.component.js +18 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-tab.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-title.component.js +15 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-title.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week.component.js +78 -0
- package/esm2022/lib/components/calendar/components/calendar-week/calendar-week.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.js +66 -0
- package/esm2022/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/day-slot-item/day-slot-item.component.js +93 -0
- package/esm2022/lib/components/calendar/components/day-slot-item/day-slot-item.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/day-slot-item/slot-context-menu.component.js +324 -0
- package/esm2022/lib/components/calendar/components/day-slot-item/slot-context-menu.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.js +36 -0
- package/esm2022/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/singles-tab/single-happenings-list.component.js +65 -0
- package/esm2022/lib/components/calendar/components/singles-tab/single-happenings-list.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/singles-tab/singles-tab.component.js +106 -0
- package/esm2022/lib/components/calendar/components/singles-tab/singles-tab.component.js.map +1 -0
- package/esm2022/lib/components/calendar/components/timing-badge/timing-badge.component.js +25 -0
- package/esm2022/lib/components/calendar/components/timing-badge/timing-badge.component.js.map +1 -0
- package/esm2022/lib/components/calendar/weekday.js +2 -0
- package/esm2022/lib/components/calendar/weekday.js.map +1 -0
- package/esm2022/lib/components/calendar-core.js +64 -0
- package/esm2022/lib/components/calendar-core.js.map +1 -0
- package/esm2022/lib/components/calendar-filter.service.js +28 -0
- package/esm2022/lib/components/calendar-filter.service.js.map +1 -0
- package/esm2022/lib/components/calendar-slots.js +30 -0
- package/esm2022/lib/components/calendar-slots.js.map +1 -0
- package/esm2022/lib/components/happening-base.component.js +188 -0
- package/esm2022/lib/components/happening-base.component.js.map +1 -0
- package/esm2022/lib/components/happening-card/happening-card.component.js +69 -0
- package/esm2022/lib/components/happening-card/happening-card.component.js.map +1 -0
- package/esm2022/lib/components/happening-component-base-params.js +37 -0
- package/esm2022/lib/components/happening-component-base-params.js.map +1 -0
- package/esm2022/lib/components/happening-form/happening-form.component.js +348 -0
- package/esm2022/lib/components/happening-form/happening-form.component.js.map +1 -0
- package/esm2022/lib/components/happening-form/happening-price-form/happening-price-modal.component.js +161 -0
- package/esm2022/lib/components/happening-form/happening-price-form/happening-price-modal.component.js.map +1 -0
- package/esm2022/lib/components/happening-form/happening-prices/happening-prices.component.js +142 -0
- package/esm2022/lib/components/happening-form/happening-prices/happening-prices.component.js.map +1 -0
- package/esm2022/lib/components/happening-participants/happening-participants.component.js +195 -0
- package/esm2022/lib/components/happening-participants/happening-participants.component.js.map +1 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-form.component.js +505 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-form.component.js.map +1 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-modal.component.js +140 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-modal.component.js.map +1 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-modal.service.js +47 -0
- package/esm2022/lib/components/happening-slot-form/happening-slot-modal.service.js.map +1 -0
- package/esm2022/lib/components/happening-slot-participants/happening-slot-participants.component.js +74 -0
- package/esm2022/lib/components/happening-slot-participants/happening-slot-participants.component.js.map +1 -0
- package/esm2022/lib/components/happening-slots/happening-slots.component.js +130 -0
- package/esm2022/lib/components/happening-slots/happening-slots.component.js.map +1 -0
- package/esm2022/lib/components/index.js +20 -0
- package/esm2022/lib/components/index.js.map +1 -0
- package/esm2022/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.js +68 -0
- package/esm2022/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.js.map +1 -0
- package/esm2022/lib/components/start-end-datetime-form/start-end-datetime-form.component.js +377 -0
- package/esm2022/lib/components/start-end-datetime-form/start-end-datetime-form.component.js.map +1 -0
- package/esm2022/lib/components/start-end-datetime-form/time-selector.component.js +92 -0
- package/esm2022/lib/components/start-end-datetime-form/time-selector.component.js.map +1 -0
- package/esm2022/lib/components/swipeable-base.component.js +112 -0
- package/esm2022/lib/components/swipeable-base.component.js.map +1 -0
- package/esm2022/lib/components/swipeable-ui.js +64 -0
- package/esm2022/lib/components/swipeable-ui.js.map +1 -0
- package/esm2022/lib/components/week.js +2 -0
- package/esm2022/lib/components/week.js.map +1 -0
- package/esm2022/lib/components/weekday-functions.js +13 -0
- package/esm2022/lib/components/weekday-functions.js.map +1 -0
- package/esm2022/lib/components/weekdays/weekdays-form-base.js +72 -0
- package/esm2022/lib/components/weekdays/weekdays-form-base.js.map +1 -0
- package/esm2022/lib/index.js +3 -0
- package/esm2022/lib/index.js.map +1 -0
- package/esm2022/lib/modals/happening-title-modal/happening-title-modal.component.js +87 -0
- package/esm2022/lib/modals/happening-title-modal/happening-title-modal.component.js.map +1 -0
- package/esm2022/lib/services/calendar-data-provider.js +271 -0
- package/esm2022/lib/services/calendar-data-provider.js.map +1 -0
- package/esm2022/lib/services/calendar-day.js +179 -0
- package/esm2022/lib/services/calendar-day.js.map +1 -0
- package/esm2022/lib/services/calendar-day.service.js +37 -0
- package/esm2022/lib/services/calendar-day.service.js.map +1 -0
- package/esm2022/lib/services/calendar-nav.service.js +36 -0
- package/esm2022/lib/services/calendar-nav.service.js.map +1 -0
- package/esm2022/lib/services/calendar-space.js +152 -0
- package/esm2022/lib/services/calendar-space.js.map +1 -0
- package/esm2022/lib/services/calendar-types.js +52 -0
- package/esm2022/lib/services/calendar-types.js.map +1 -0
- package/esm2022/lib/services/calendarium-services.module.js +16 -0
- package/esm2022/lib/services/calendarium-services.module.js.map +1 -0
- package/esm2022/lib/services/calendarium-space.service.js +16 -0
- package/esm2022/lib/services/calendarium-space.service.js.map +1 -0
- package/esm2022/lib/services/happening.service.js +225 -0
- package/esm2022/lib/services/happening.service.js.map +1 -0
- package/esm2022/lib/services/index.js +6 -0
- package/esm2022/lib/services/index.js.map +1 -0
- package/esm2022/sneat-extensions-schedulus-shared.js +5 -0
- package/esm2022/sneat-extensions-schedulus-shared.js.map +1 -0
- package/index.d.ts +1 -0
- package/lib/components/calendar/calendar-base.component.d.ts +23 -0
- package/lib/components/calendar/calendar-brief.component.d.ts +11 -0
- package/lib/components/calendar/calendar-component-types.d.ts +1 -0
- package/lib/components/calendar/calendar-state.service.d.ts +15 -0
- package/lib/components/calendar/calendar.component.d.ts +32 -0
- package/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.d.ts +13 -0
- package/lib/components/calendar/components/calendar-day/calendar-day-base.component.d.ts +10 -0
- package/lib/components/calendar/components/calendar-day/calendar-day-card.component.d.ts +17 -0
- package/lib/components/calendar/components/calendar-day/calendar-day-tab.component.d.ts +19 -0
- package/lib/components/calendar/components/calendar-day/calendar-day-title.component.d.ts +10 -0
- package/lib/components/calendar/components/calendar-day/calendar-day.component.d.ts +30 -0
- package/lib/components/calendar/components/calendar-filter/calendar-filter.component.d.ts +39 -0
- package/lib/components/calendar/components/calendar-filter/calendar-filter.d.ts +10 -0
- package/lib/components/calendar/components/calendar-filter/contacts-filter.component.d.ts +20 -0
- package/lib/components/calendar/components/calendar-week/calendar-week-card.component.d.ts +15 -0
- package/lib/components/calendar/components/calendar-week/calendar-week-tab.component.d.ts +9 -0
- package/lib/components/calendar/components/calendar-week/calendar-week-title.component.d.ts +7 -0
- package/lib/components/calendar/components/calendar-week/calendar-week.component.d.ts +20 -0
- package/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.d.ts +23 -0
- package/lib/components/calendar/components/day-slot-item/day-slot-item.component.d.ts +19 -0
- package/lib/components/calendar/components/day-slot-item/slot-context-menu.component.d.ts +40 -0
- package/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.d.ts +15 -0
- package/lib/components/calendar/components/singles-tab/single-happenings-list.component.d.ts +22 -0
- package/lib/components/calendar/components/singles-tab/singles-tab.component.d.ts +29 -0
- package/lib/components/calendar/components/timing-badge/timing-badge.component.d.ts +17 -0
- package/lib/components/calendar/weekday.d.ts +7 -0
- package/lib/components/calendar-core.d.ts +10 -0
- package/lib/components/calendar-filter.service.d.ts +8 -0
- package/lib/components/calendar-slots.d.ts +5 -0
- package/lib/components/happening-base.component.d.ts +46 -0
- package/lib/components/happening-card/happening-card.component.d.ts +11 -0
- package/lib/components/happening-component-base-params.d.ts +16 -0
- package/lib/components/happening-form/happening-form.component.d.ts +52 -0
- package/lib/components/happening-form/happening-price-form/happening-price-modal.component.d.ts +29 -0
- package/lib/components/happening-form/happening-prices/happening-prices.component.d.ts +16 -0
- package/lib/components/happening-participants/happening-participants.component.d.ts +24 -0
- package/lib/components/happening-slot-form/happening-slot-form.component.d.ts +76 -0
- package/lib/components/happening-slot-form/happening-slot-modal.component.d.ts +26 -0
- package/lib/components/happening-slot-form/happening-slot-modal.service.d.ts +18 -0
- package/lib/components/happening-slot-participants/happening-slot-participants.component.d.ts +19 -0
- package/lib/components/happening-slots/happening-slots.component.d.ts +28 -0
- package/lib/components/index.d.ts +5 -0
- package/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.d.ts +16 -0
- package/lib/components/start-end-datetime-form/start-end-datetime-form.component.d.ts +53 -0
- package/lib/components/start-end-datetime-form/time-selector.component.d.ts +15 -0
- package/lib/components/swipeable-base.component.d.ts +25 -0
- package/lib/components/swipeable-ui.d.ts +24 -0
- package/lib/components/week.d.ts +4 -0
- package/lib/components/weekday-functions.d.ts +3 -0
- package/lib/components/weekdays/weekdays-form-base.d.ts +31 -0
- package/lib/index.d.ts +2 -0
- package/lib/modals/happening-title-modal/happening-title-modal.component.d.ts +24 -0
- package/lib/services/calendar-data-provider.d.ts +33 -0
- package/lib/services/calendar-day.d.ts +45 -0
- package/lib/services/calendar-day.service.d.ts +18 -0
- package/lib/services/calendar-nav.service.d.ts +14 -0
- package/lib/services/calendar-space.d.ts +23 -0
- package/lib/services/calendar-types.d.ts +10 -0
- package/lib/services/calendarium-services.module.d.ts +6 -0
- package/lib/services/calendarium-space.service.d.ts +8 -0
- package/lib/services/happening.service.d.ts +99 -0
- package/lib/services/index.d.ts +5 -0
- package/package.json +26 -0
- package/sneat-extensions-schedulus-shared.d.ts +5 -0
- package/tsconfig.lib.prod.tsbuildinfo +1 -0
package/esm2022/lib/components/start-end-datetime-form/start-end-datetime-form.component.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-end-datetime-form.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/start-end-datetime-form/start-end-datetime-form.component.ts","../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/start-end-datetime-form/start-end-datetime-form.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,EAEL,MAAM,EAEN,SAAS,EACT,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,MAAM,EACN,SAAS,EACT,eAAe,EACf,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAA0B,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,+BAA+B,EAAE,MAAM,oEAAoE,CAAC;AACrH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;;AA6BlE,MAAM,OAAO,6BAA6B;IAmD9B,eAAe,CAAC,MAAe;QACvC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,IAAc,QAAQ;QACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,IAAc,aAAa;QACzB,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;IACnC,CAAC;IAED,iCAAiC;IACjC,4BAA4B;IAC5B,sCAAsC;IACtC,MAAM;IACN,+BAA+B;IAC/B,sDAAsD;IACtD,KAAK;IACL,0BAA0B;IAC1B,oCAAoC;IACpC,MAAM;IACN,6BAA6B;IAC7B,gDAAgD;IAChD,KAAK;IACL,6BAA6B;IAC7B,gBAAgB;IAChB,kDAAkD;IAClD,MAAM;IACN,kBAAkB;IAClB,IAAI;IAEJ,sEAAsE;IACtE,IAAW,OAAO;QAChB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,CACL,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAChE,CAAC;IACJ,CAAC;IAED;QA3FiB,gBAAW,GAAG,MAAM,CAAe,WAAW,CAAC,CAAC;QAChD,oBAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAMhC,WAAM,GAAY,WAAW,CAAC;QACtC,iBAAY,GAAG,IAAI,YAAY,EAAW,CAAC;QAE3C,aAAQ,GAAG,IAAI,YAAY,EAAW,CAAC;QAIvC,UAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,YAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;aAC/D,WAAW,EAAE;aACb,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEV,QAAG,GAAuB,UAAU,CAAC;QACrC,kBAAa,GAAwB,SAAS,CAAC;QACzD,uEAAuE;QAEpD,cAAS,GAAG,IAAI,WAAW,CAC5C,EAAE,EAAE,kGAAkG;QACtG;YACE,wBAAwB;YACxB,UAAU,EAAE,UAAU,CAAC,QAAQ;SAChC,CACF,CAAC;QACiB,YAAO,GAAG,IAAI,WAAW,CAAS,EAAE,EAAE;QACvD,mCAAmC;SACpC,CAAC,CAAC;QACgB,cAAS,GAAG,IAAI,WAAW,CAAS,EAAE,EAAE;YACzD,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;SACzE,CAAC,CAAC;QACgB,YAAO,GAAG,IAAI,WAAW,CAAS,EAAE,EAAE;YACvD,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;SACzE,CAAC,CAAC;QACgB,aAAQ,GAAG,IAAI,WAAW,CAAS,EAAE,EAAE;YACxD,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;SAClC,CAAC,CAAC;QAEgB,SAAI,GAAG,IAAI,gBAAgB,CAAC;YAC7C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QA2UgB,eAAU,GAAG,UAAU,CAAC;QA/RzC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,mBAAmB,EAAE,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,aAAa;QAEnB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,kDAAkD;QAClD,0CAA0C;QAC1C,IAAI;QACJ,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;YAC1C,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,YAAY,CAAC,KAAa;QAClC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,QAAQ,CACvB,IAAI,KAAK,CAAC,wBAAwB,GAAG,KAAK,CAAC,EAC3C,oBAAoB,CACrB,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,IAAI,CAAC,MAAM;YACd,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;SAC7C,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACvC,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,aAAa;gBAChB,EAAE,QAAQ,EAAE;iBACX,IAAI,CAAC,GAAG,EAAE;gBACT,4EAA4E;gBAC5E,IAAI,CAAC,aAAa,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YACnE,CAAC,CAAC;iBACD,KAAK,CACJ,IAAI,CAAC,WAAW,CAAC,eAAe,CAC9B,uCAAuC,CACxC,CACF,CAAC;QACN,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAES,UAAU,CAAC,CAAoC;QACvD,IAAI,CAAC,GAAqB,SAAS,CAAC;QACpC,IAAI,CAAC;YACH,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3C,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3C,CAAC,GAAG,gBAAgB,CAAC,SAAS,IAAI,YAAY,EAAE,SAAS,CAAC,CAAC;YAC3D,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACX,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;YACD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACZ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBACzB,4CAA4C;gBAC5C,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,MAAM,GAAG;oBACZ,GAAG,IAAI,CAAC,MAAM;oBACd,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;iBACjD,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBACzB,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,MAAM,GAAG;oBACZ,GAAG,IAAI,CAAC,MAAM;oBACd,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;iBACjD,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;YACD,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,iBAAiB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,IACjE,IAAI,CAAC,SAAS,CAAC,KACjB,MAAM,CAAC,EAAE,EACT,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,wBAAwB;IACxB,sBAAsB;IACtB,mDAAmD;IACnD,YAAY;IACZ,mBAAmB;IACnB,mDAAmD;IACnD,YAAY;IACZ,KAAK;IACL,IAAI;IAEM,YAAY,CAAC,KAAY,EAAE,IAA0B;QAC7D,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,CAAO,CAAC;QACZ,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,CAAC,GAAG,KAAK,CAAC;gBACV,MAAM;YACR,KAAK,UAAU;gBACb,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;gBACf,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC/B,MAAM;QACV,CAAC;QACD,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG;gBACZ,GAAG,IAAI,CAAC,MAAM;gBACd,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;aAC5C,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,OAAgB;QACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAES,OAAO;QACf,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YACvD,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAES,eAAe;QACvB,kEAAkE;QAClE,MAAM,SAAS,GAAI,IAAI,CAAC,SAAS,CAAC,KAAgB,IAAI,EAAE,CAAC;QACzD,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAES,kBAAkB;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,IAAI;YACP,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,EAAE;SAC3D,CAAC;QACF,IACE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK;YACpB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAe,CAAC,CAAC;YACrD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK;gBAClB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAe,CAAC,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK;gBACpB,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAe,CAAC,CAAC,EACpD,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAES,kBAAkB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,IAAI;YACP,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,EAAE;SAC3D,CAAC;QACF,IACE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI;YACvB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI;YACxB,IAAI,CAAC,SAAS,CAAC,KAAK,EACpB,CAAC;YACD,IAAI,CAAC,MAAM,GAAG;gBACZ,GAAG,IAAI,CAAC,MAAM;gBACd,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;aAC5D,CAAC;QACJ,CAAC;QACD,IACE,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAe,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,EACnB,CAAC;YACD,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAES,iBAAiB;QACzB,oEAAoE;QACpE,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAe,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAe,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE7C,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,QAAQ,GAAG,EAAE,CAAC;QAElC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE;YAC1B,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,GAAG,OAAO,IAAI,MAAM,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAES,gBAAgB;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,IAAI;YACP,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE;SACrD,CAAC;QACF,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAe,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IAC7C,CAAC;IAEO,WAAW;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAe,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAe,CAAC;QAE7C,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC;QAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC;QAEpC,MAAM,eAAe,GAAG,KAAK,GAAG,OAAO,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;IACpD,CAAC;8GA1XU,6BAA6B;kGAA7B,6BAA6B,uXC7E1C,0gZAySA,2CDnPI,mBAAmB,yTACnB,WAAW,uPACX,qBAAqB,+GACrB,+BAA+B,4HAC/B,8BAA8B,oEAC9B,YAAY,6IACZ,iBAAiB,qJACjB,OAAO,wEACP,MAAM,oDACN,MAAM,kTACN,OAAO,0NACP,QAAQ,8eACR,QAAQ,6FACR,UAAU,8EACV,SAAS,oPACT,OAAO,2JACP,QAAQ,sDACR,WAAW,ohBACX,eAAe,6FACf,SAAS,kVACT,UAAU;;2FAGD,6BAA6B;kBA3BzC,SAAS;+BACE,+BAA+B,WAEhC;wBACP,mBAAmB;wBACnB,WAAW;wBACX,qBAAqB;wBACrB,+BAA+B;wBAC/B,8BAA8B;wBAC9B,YAAY;wBACZ,iBAAiB;wBACjB,OAAO;wBACP,MAAM;wBACN,MAAM;wBACN,OAAO;wBACP,QAAQ;wBACR,QAAQ;wBACR,UAAU;wBACV,SAAS;wBACT,OAAO;wBACP,QAAQ;wBACR,WAAW;wBACX,eAAe;wBACf,SAAS;wBACT,UAAU;qBACX;;sBAMA,KAAK;;sBACL,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAExB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,MAAM;;sBAEN,MAAM;;sBAEN,SAAS;uBAAC,eAAe","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n inject,\n} from '@angular/core';\nimport {\n FormControl,\n FormsModule,\n ReactiveFormsModule,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport {\n IonAccordion,\n IonAccordionGroup,\n IonButton,\n IonButtons,\n IonCol,\n IonDatetime,\n IonGrid,\n IonIcon,\n IonInput,\n IonItem,\n IonLabel,\n IonModal,\n IonPopover,\n IonRow,\n IonSelect,\n IonSelectOption,\n ModalController,\n} from '@ionic/angular/standalone';\nimport {\n dateToIso,\n isoStringsToDate,\n isValidaTimeString,\n isValidDateString,\n SneatSelectAllOnFocusDirective,\n} from '@sneat/core';\nimport { emptyTiming, HappeningType, ITiming } from '@sneat/mod-schedulus-core';\nimport { dateToTimeOnlyStr } from '@sneat/mod-schedulus-core';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport { isTomorrow } from '../calendar-core';\nimport { StartEndDatesRangeFormComponent } from '../start-end-dates-range-form/start-end-dates-range-form.component';\nimport { TimeSelectorComponent } from './time-selector.component';\n\n@Component({\n selector: 'sneat-start-end-datetime-form',\n templateUrl: 'start-end-datetime-form.component.html',\n imports: [\n ReactiveFormsModule,\n FormsModule,\n TimeSelectorComponent,\n StartEndDatesRangeFormComponent,\n SneatSelectAllOnFocusDirective,\n IonAccordion,\n IonAccordionGroup,\n IonGrid,\n IonRow,\n IonCol,\n IonItem,\n IonInput,\n IonLabel,\n IonButtons,\n IonButton,\n IonIcon,\n IonModal,\n IonDatetime,\n IonSelectOption,\n IonSelect,\n IonPopover,\n ],\n})\nexport class StartEndDatetimeFormComponent implements OnChanges {\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly modalController = inject(ModalController);\n\n @Input() addSlotLabel?: string;\n @Input({ required: true }) mode?: HappeningType;\n @Input({ required: true }) date?: string;\n\n @Input({ required: true }) timing: ITiming = emptyTiming;\n @Output() readonly timingChange = new EventEmitter<ITiming>();\n\n @Output() readonly addClick = new EventEmitter<ITiming>();\n\n @ViewChild('durationInput') durationInput?: IonInput;\n\n protected readonly today = new Date();\n protected maxDate = new Date(this.today.getFullYear() + 1, 11, 31)\n .toISOString()\n .substring(0, 10);\n\n protected tab: 'duration' | 'end' = 'duration';\n protected durationUnits: 'minutes' | 'hours' = 'minutes';\n // protected startDateVal? = new Date().toISOString().substring(0, 10);\n\n protected readonly startDate = new FormControl<string>(\n '', //TODO: set to current date only for single happenings: new Date().toISOString().substring(0, 10),\n {\n // dateToIso(new Date())\n validators: Validators.required,\n },\n );\n protected readonly endDate = new FormControl<string>('', {\n // validators: Validators.required,\n });\n protected readonly startTime = new FormControl<string>('', {\n validators: [Validators.required, Validators.pattern(/[0-2]\\d:[0-5]\\d/)],\n });\n protected readonly endTime = new FormControl<string>('', {\n validators: [Validators.required, Validators.pattern(/[0-2]\\d:[0-5]\\d/)],\n });\n protected readonly duration = new FormControl<number>(60, {\n validators: [Validators.required],\n });\n\n protected readonly form = new UntypedFormGroup({\n startDate: this.startDate,\n startTime: this.startTime,\n endTime: this.endTime,\n duration: this.duration,\n });\n\n protected onTimingChanged(timing: ITiming): void {\n this.timingChange.emit(timing);\n }\n\n protected get disabled(): boolean {\n return !this.mode;\n }\n\n protected get hideStartDate(): boolean {\n return this.mode === 'recurring';\n }\n\n // public get timing(): ITiming {\n // \tlet start: IDateTime = {\n // \t\ttime: this.startTime.value || '',\n // \t};\n // \tif (this.startDate.value) {\n // \t\tstart = { ...start, date: this.startDate.value };\n // \t}\n // \tlet end: IDateTime = {\n // \t\ttime: this.endTime.value || '',\n // \t};\n // \tif (this.endDate.value) {\n // \t\tend = { ...end, date: this.endDate.value };\n // \t}\n // \tconst timing: ITiming = {\n // \t\tstart, end,\n // \t\tdurationMinutes: Number(this.duration.value),\n // \t};\n // \treturn timing;\n // }\n\n // Is public property as might be used by component's parent component\n public get isValid(): boolean {\n this.form.markAllAsTouched();\n return (\n isValidaTimeString(this.startTime.value || '') &&\n (!this.endTime.value || isValidaTimeString(this.endTime.value))\n );\n }\n\n constructor() {\n this.endTime.disable();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['date']) {\n this.onDateChanged();\n }\n\n const happeningSlotChange = changes['timing'];\n if (happeningSlotChange?.currentValue) {\n this.onTimingChange();\n }\n }\n\n private onDateChanged(): void {\n\n if (this.mode === 'single') {\n if (!this.startDate.dirty) {\n const date = this.date || new Date().toISOString().substring(0, 10);\n this.startDate.setValue(date);\n }\n } else {\n this.startDate.setValue('');\n }\n }\n\n private onTimingChange(): void {\n // if (this.happeningSlot.repeats === 'UNKNOWN') {\n // \tthis.setRepeatsBasedOnHappeningType();\n // }\n if (!this.startDate.dirty) {\n const startDate = this.timing.start?.date;\n if (startDate) {\n this.startDate.setValue(startDate);\n }\n }\n if (!this.startTime.dirty) {\n this.startTime.setValue(this.timing.start?.time || '');\n }\n if (!this.endDate.dirty) {\n this.endDate.setValue(this.timing.end?.date || '');\n }\n if (!this.endTime.dirty) {\n this.endTime.setValue(this.timing.end?.time || '');\n }\n this.setDuration();\n }\n\n protected setStartTime(value: string): void {\n if (!isValidaTimeString(value)) {\n this.errorLogger.logError(\n new Error('not valid time string:' + value),\n 'Invalid start time',\n );\n return;\n }\n this.modalController.dismiss().catch(console.error);\n this.startTime.setValue(value);\n this.timing = {\n ...this.timing,\n start: { ...this.timing.start, time: value },\n };\n this.setEndTime();\n this.emitTimingChanged('setStartTime');\n setTimeout(() => {\n this.durationInput\n ?.setFocus()\n .then(() => {\n // TODO: Remove this workaround once SneatSelectAllOnFocusDirective is fixed\n this.durationInput?.getInputElement()?.then((el) => el.select());\n })\n .catch(\n this.errorLogger.logErrorHandler(\n 'Failed to set focus to duration input',\n ),\n );\n }, 50);\n }\n\n protected addToStart(v: { days?: number; hours?: number }): void {\n let d: Date | undefined = undefined;\n try {\n let startDate = this.startDate.value || '';\n let startTime = this.startTime.value || '';\n d = isoStringsToDate(startDate || '2000-01-01', startTime);\n if (v.days) {\n d.setDate(d.getDate() + v.days);\n }\n if (v.hours) {\n d.setTime(d.getTime() + v.hours * 60 * 60 * 1000);\n }\n if (this.startDate.value) {\n // For recurring events startDate is not set\n startDate = dateToIso(d);\n this.timing = {\n ...this.timing,\n start: { ...this.timing.start, date: startDate },\n };\n this.startDate.setValue(startDate);\n }\n if (this.startTime.value) {\n startTime = dateToTimeOnlyStr(d);\n this.timing = {\n ...this.timing,\n start: { ...this.timing.start, time: startTime },\n };\n this.startTime.setValue(startTime);\n }\n this.setEndTime();\n this.emitTimingChanged('addToStart');\n } catch (e) {\n throw new Error(\n `failed to add ${JSON.stringify(v)} to ${d} [${this.startDate.value} ${\n this.startTime.value\n }]: ${e}`,\n { cause: e },\n );\n }\n }\n\n // private setRepeatsBasedOnHappeningType(): void {\n // \tswitch (this.mode) {\n // \t\tcase 'recurring':\n // \t\t\tthis.happeningSlot = {...this.happeningSlot};\n // \t\t\tbreak;\n // \t\tcase 'single':\n // \t\t\tthis.happeningSlot = {...this.happeningSlot};\n // \t\t\tbreak;\n // \t}\n // }\n\n protected setStartDate(event: Event, code: 'today' | 'tomorrow'): void {\n const today = new Date();\n let d: Date;\n switch (code) {\n case 'today':\n d = today;\n break;\n case 'tomorrow':\n d = new Date();\n d.setDate(today.getDate() + 1);\n break;\n }\n if (d) {\n const date = dateToIso(d);\n this.startDate.setValue(date);\n this.timing = {\n ...this.timing,\n start: { ...this.timing.start, date: date },\n };\n this.emitTimingChanged('setStartDate');\n }\n }\n\n private emitTimingChanged(_source?: string): void {\n this.timingChange.emit(this.timing);\n }\n\n protected addSlot(): void {\n if (this.mode === 'single' && !this.timing.start?.date) {\n alert('Please select date');\n return;\n }\n this.timingChange.emit(this.timing);\n this.addClick.emit(this.timing);\n }\n\n protected onStartTimeBlur(): void {\n // console.log('StartEndDatetimeFormComponent.onStartTimeBlur()');\n const startTime = (this.startTime.value as string) || '';\n if (startTime.match(/^\\d{2}$/)) {\n this.startTime.setValue(startTime + ':00');\n }\n }\n\n protected onStartDateChanged(): void {\n let startDate = this.startDate.value || '';\n if (startDate.includes('T')) {\n startDate = startDate.split('T')[0];\n this.startDate.setValue(startDate);\n }\n const slot = this.timing;\n this.timing = {\n ...slot,\n start: { ...slot.start, date: this.startDate.value || '' },\n };\n if (\n (!this.startTime.value ||\n isValidaTimeString(this.startTime.value as string)) &&\n (!this.endTime.value ||\n isValidaTimeString(this.endTime.value as string)) &&\n (!this.startDate.value ||\n isValidDateString(this.startDate.value as string))\n ) {\n this.emitTimingChanged('onStartDateChanged');\n }\n }\n\n protected onStartTimeChanged(): void {\n const slot = this.timing;\n this.timing = {\n ...slot,\n start: { ...slot.start, time: this.startTime.value || '' },\n };\n if (\n this.timing.start?.time &&\n !this.timing.start?.date &&\n this.startDate.value\n ) {\n this.timing = {\n ...this.timing,\n start: { ...this.timing.start, date: this.startDate.value },\n };\n }\n if (\n isValidaTimeString(this.startTime.value as string) &&\n this.duration.value\n ) {\n this.setEndTime();\n }\n }\n\n protected onDurationChanged(): void {\n // console.log('StartEndDatetimeFormComponent.onDurationChanged()');\n if (isValidaTimeString(this.startTime.value as string)) {\n this.setEndTime();\n } else {\n this.emitTimingChanged('onDurationChanged');\n }\n }\n\n private setEndTime(): void {\n const startTime = this.startTime.value as string;\n const startHour = Number(startTime.substring(0, 2));\n const startMin = Number(startTime.substring(3, 5));\n\n const duration = Number(this.duration.value);\n\n const durationHours = ~~(duration / 60);\n const durationMin = duration % 60;\n\n const toStr = (v: number) => {\n const s = '00' + ('' + v).replace(/^0+/, '');\n return s.substring(s.length - 2, s.length);\n };\n\n const endHour = toStr(startHour + durationHours);\n const endMin = toStr(startMin + durationMin);\n const endTime = `${endHour}:${endMin}`;\n this.timing = { ...this.timing, end: { time: endTime } };\n this.endTime.setValue(endTime);\n this.emitTimingChanged('setEndTime');\n }\n\n protected onEndTimeChanged(): void {\n const slot = this.timing;\n this.timing = {\n ...slot,\n end: { ...slot.end, time: this.endTime.value || '' },\n };\n if (isValidaTimeString(this.startTime.value as string)) {\n this.setDuration();\n }\n this.emitTimingChanged('onEndTimeChanged');\n }\n\n private setDuration(): void {\n const startTime = this.startTime.value as string;\n const endTime = this.endTime.value as string;\n\n if (!startTime || !endTime) {\n return;\n }\n\n const startHour = Number(startTime.substring(0, 2));\n const startMin = Number(startTime.substring(3, 5));\n const startAt = startHour * 60 + startMin;\n\n const endHour = Number(endTime.substring(0, 2));\n const endMin = Number(endTime.substring(3, 5));\n const endAt = endHour * 60 + endMin;\n\n const durationMinutes = endAt - startAt;\n this.duration.setValue(durationMinutes);\n this.timing = { ...this.timing, durationMinutes };\n }\n\n protected readonly isTomorrow = isTomorrow;\n}\n","@switch (mode) {\n @case (\"recurring\") {\n <!-- TODO(help-wanted): use CSS class, preferably from Ionic -->\n <ion-grid class=\"ion-grid-layout\" style=\"border-top: 1px solid lightgray\">\n <ion-row>\n <ion-col size=\"12\" size-md=\"4\">\n <ion-item class=\"sneat-no-end-padding\" lines=\"none\">\n <ion-input\n type=\"time\"\n label=\"At\"\n #startTimeInput\n [formControl]=\"startTime\"\n (ionBlur)=\"onStartTimeBlur()\"\n (ionChange)=\"onStartTimeChanged()\"\n />\n @if (startTime.touched && !startTime.valid && !!startTime.errors) {\n <ion-label color=\"danger\" slot=\"end\"> Required field </ion-label>\n }\n <ion-buttons slot=\"end\" class=\"ion-no-margin ion-no-padding\">\n <ion-button id=\"quick-pick-start-time-recurring\" color=\"medium\">\n <!--\t\t\t<ion-label>Pick</ion-label>-->\n <ion-icon name=\"chevron-down-outline\" slot=\"end\" />\n </ion-button>\n <ion-modal trigger=\"quick-pick-start-time-recurring\">\n <ng-template>\n <sneat-time-selector (selected)=\"setStartTime($event)\" />\n </ng-template>\n </ion-modal>\n <!-- Commented out as does not fit into modal - we might want to show only on wide screens -->\n <!--\t\t\t\t\t<ion-button-->\n <!--\t\t\t\t\t\t*ngIf=\"startTime.value\"-->\n <!--\t\t\t\t\t\tcolor=\"medium\"-->\n <!--\t\t\t\t\t\t(click)=\"addToStart({ hours: -1 })\"-->\n <!--\t\t\t\t\t>-->\n <!--\t\t\t\t\t\t<ion-icon name=\"chevron-back-outline\" slot=\"start\" />-->\n <!--\t\t\t\t\t\t<ion-label>-1h</ion-label>-->\n <!--\t\t\t\t\t</ion-button>-->\n <!--\t\t\t\t\t<ion-button-->\n <!--\t\t\t\t\t\t*ngIf=\"startTime.value\"-->\n <!--\t\t\t\t\t\tcolor=\"medium\"-->\n <!--\t\t\t\t\t\t(click)=\"addToStart({ hours: +1 })\"-->\n <!--\t\t\t\t\t>-->\n <!--\t\t\t\t\t\t<ion-label>+1h</ion-label>-->\n <!--\t\t\t\t\t\t<ion-icon name=\"chevron-forward-outline\" slot=\"end\" />-->\n <!--\t\t\t\t\t</ion-button>-->\n </ion-buttons>\n </ion-item>\n </ion-col>\n <ion-col size=\"12\" size-md=\"5\">\n <ion-item lines=\"none\">\n <ion-input\n #durationInput\n label=\"For\"\n [formControl]=\"duration\"\n (ionChange)=\"onDurationChanged()\"\n type=\"number\"\n style=\"text-align: right\"\n />\n <ion-select\n slot=\"end\"\n interface=\"popover\"\n [(ngModel)]=\"durationUnits\"\n >\n <ion-select-option value=\"minutes\">minutes</ion-select-option>\n <ion-select-option value=\"hours\">hours</ion-select-option>\n </ion-select>\n </ion-item>\n </ion-col>\n <ion-col size=\"12\" size-md=\"3\">\n <ion-item lines=\"none\">\n <ion-input\n type=\"time\"\n label=\"Ends at\"\n [formControl]=\"endTime\"\n (ionChange)=\"onEndTimeChanged()\"\n placeholder=\"HH:MM\"\n />\n </ion-item>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- TODO(help-wanted): use CSS class, preferably from Ionic -->\n <ion-accordion-group\n style=\"\n border-top: 1px solid lightgray;\n border-bottom: 1px solid lightgray;\n \"\n >\n <ion-accordion value=\"dates\">\n <ion-item slot=\"header\" color=\"light\">\n <ion-label color=\"medium\">Dates (start & end)</ion-label>\n </ion-item>\n <sneat-start-end-dates-range-form\n slot=\"content\"\n [timing]=\"timing\"\n (timingChange)=\"onTimingChanged($event)\"\n />\n </ion-accordion>\n </ion-accordion-group>\n }\n @case (\"single\") {\n <ion-grid class=\"ion-grid-layout\">\n @if (!startDate.value || !startTime.value) {\n <ion-row>\n <ion-col size=\"12\" size-lg=\"5\">\n <ion-datetime\n [min]=\"today.toISOString().substring(0, 10)\"\n [max]=\"maxDate\"\n presentation=\"date\"\n [formControl]=\"startDate\"\n (ionChange)=\"onStartDateChanged()\"\n >\n <ion-buttons slot=\"buttons\">\n <ion-button\n color=\"medium\"\n (click)=\"setStartDate($event, 'today')\"\n >Today\n </ion-button>\n <ion-button\n color=\"medium\"\n (click)=\"setStartDate($event, 'tomorrow')\"\n >Tomorrow\n </ion-button>\n </ion-buttons>\n </ion-datetime>\n </ion-col>\n <ion-col size=\"12\" size-lg=\"7\">\n <sneat-time-selector\n [hideHeader]=\"true\"\n (selected)=\"startTime.setValue($event); onStartTimeChanged()\"\n />\n </ion-col>\n </ion-row>\n }\n @if (startDate.value && startTime.value) {\n <ion-row>\n <ion-col size=\"12\" size-sm=\"6\">\n <ion-item class=\"sneat-no-end-padding\">\n <ion-input\n label=\"On\"\n type=\"date\"\n [formControl]=\"startDate\"\n (ionChange)=\"onStartDateChanged()\"\n />\n <!--\t\t\t\t<ion-buttons-->\n <!--\t\t\t\t\tslot=\"end\"-->\n <!--\t\t\t\t\t*ngIf=\"!startDate?.value\"-->\n <!--\t\t\t\t\tclass=\"ion-no-margin ion-no-padding\"-->\n <!--\t\t\t\t>-->\n <!--\t\t\t\t\t<ion-button-->\n <!--\t\t\t\t\t\tcolor=\"medium\"-->\n <!--\t\t\t\t\t\t(click)=\"setStartDate($event, 'today')\"-->\n <!--\t\t\t\t\t\ttitle=\"Today\"-->\n <!--\t\t\t\t\t>-->\n <!--\t\t\t\t\t\t<ion-icon name=\"today-outline\" />-->\n <!--\t\t\t\t\t</ion-button>-->\n <!--\t\t\t\t\t<ion-button-->\n <!--\t\t\t\t\t\tvalue=\"tomorrow\"-->\n <!--\t\t\t\t\t\tcolor=\"medium\"-->\n <!--\t\t\t\t\t\t(click)=\"setStartDate($event, 'tomorrow')\"-->\n <!--\t\t\t\t\t>-->\n <!--\t\t\t\t\t\t<ion-label>+1D</ion-label>-->\n <!--\t\t\t\t\t</ion-button>-->\n <!--\t\t\t\t</ion-buttons>-->\n @if (startDate.value) {\n <ion-buttons slot=\"end\" class=\"ion-no-margin ion-no-padding\">\n <ion-button id=\"quick-pick-start-date\" color=\"medium\">\n <!--\t\t\t<ion-label>Pick</ion-label>-->\n <ion-icon name=\"chevron-down-outline\" slot=\"end\" />\n </ion-button>\n <ion-button color=\"medium\" (click)=\"addToStart({ days: -1 })\">\n <ion-icon name=\"chevron-back-outline\" slot=\"start\" />\n <ion-label>-1</ion-label>\n </ion-button>\n <ion-button color=\"medium\" (click)=\"addToStart({ days: +1 })\">\n <ion-label>+1</ion-label>\n <ion-icon name=\"chevron-forward-outline\" slot=\"end\" />\n </ion-button>\n <ion-popover\n trigger=\"quick-pick-start-date\"\n [dismissOnSelect]=\"true\"\n >\n <ng-template>\n <ion-item tappable (click)=\"setStartDate($event, 'today')\"\n >Today\n </ion-item>\n <ion-item\n tappable\n (click)=\"setStartDate($event, 'tomorrow')\"\n >Tomorrow\n </ion-item>\n <!--\t\t\t\t<ion-item-divider color=\"light\">Next week</ion-item-divider>-->\n <!--\t\t\t\t<ion-item><ion-text color=\"medium\">Next week -</ion-text> Monday</ion-item>-->\n <!--\t\t\t\t<ion-item><ion-text color=\"medium\">Next week -</ion-text> Tuesday</ion-item>-->\n <!--\t\t\t\t<ion-item><ion-text color=\"medium\">Next week -</ion-text> Wednesday</ion-item>-->\n <!--\t\t\t\t<ion-item><ion-text color=\"medium\">Next week -</ion-text> Thursday</ion-item>-->\n <!--\t\t\t\t<ion-item><ion-text color=\"medium\">Next week -</ion-text> Friday</ion-item>-->\n <!--\t\t\t\t<ion-item><ion-text color=\"medium\">Next week -</ion-text> Saturday</ion-item>-->\n <!--\t\t\t\t<ion-item><ion-text color=\"medium\">Next week -</ion-text> Sunday</ion-item>-->\n </ng-template>\n </ion-popover>\n </ion-buttons>\n }\n </ion-item>\n </ion-col>\n <ion-col size=\"12\" size-sm=\"6\">\n <ion-item class=\"sneat-no-end-padding\">\n <ion-input\n type=\"time\"\n label=\"At\"\n #startTimeInput\n [formControl]=\"startTime\"\n (ionBlur)=\"onStartTimeBlur()\"\n (ionChange)=\"onStartTimeChanged()\"\n />\n @if (\n startTime.touched && !startTime.valid && !!startTime.errors\n ) {\n <ion-label color=\"danger\" slot=\"end\">\n Required field\n </ion-label>\n }\n <ion-buttons slot=\"end\" class=\"ion-no-margin ion-no-padding\">\n <ion-button id=\"quick-pick-start-time-single\" color=\"medium\">\n <!--\t\t\t<ion-label>Pick</ion-label>-->\n <ion-icon name=\"chevron-down-outline\" slot=\"end\" />\n </ion-button>\n <ion-modal trigger=\"quick-pick-start-time-single\">\n <ng-template>\n <sneat-time-selector (selected)=\"setStartTime($event)\" />\n </ng-template>\n </ion-modal>\n @if (startTime.value) {\n <ion-button\n color=\"medium\"\n (click)=\"addToStart({ hours: -1 })\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"start\" />\n <ion-label>-1h</ion-label>\n </ion-button>\n <ion-button\n color=\"medium\"\n (click)=\"addToStart({ hours: +1 })\"\n >\n <ion-label>+1h</ion-label>\n <ion-icon name=\"chevron-forward-outline\" slot=\"end\" />\n </ion-button>\n }\n </ion-buttons>\n </ion-item>\n </ion-col>\n </ion-row>\n }\n @if (startDate.value && startTime.value) {\n <ion-row>\n <ion-col size=\"12\" size-sm=\"6\">\n <ion-item lines=\"none\">\n <ion-input\n label=\"Duration\"\n sneatSelectAllOnFocus\n [formControl]=\"duration\"\n (ionChange)=\"onDurationChanged()\"\n type=\"number\"\n style=\"text-align: right\"\n />\n <ion-select\n slot=\"end\"\n interface=\"popover\"\n [(ngModel)]=\"durationUnits\"\n >\n <ion-select-option value=\"minutes\">minutes</ion-select-option>\n <ion-select-option value=\"hours\">hours</ion-select-option>\n </ion-select>\n </ion-item>\n </ion-col>\n <ion-col size=\"6\" size-sm=\"3\">\n <ion-item lines=\"none\">\n <ion-input\n type=\"time\"\n label=\"Ends at\"\n [formControl]=\"endTime\"\n (ionChange)=\"onEndTimeChanged()\"\n placeholder=\"HH:MM\"\n />\n </ion-item>\n </ion-col>\n <ion-col size=\"6\" size-sm=\"3\">\n <ion-button expand=\"full\" class=\"ion-margin\" (click)=\"addSlot()\"\n >{{ addSlotLabel }}\n </ion-button>\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n }\n}\n"]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { FormsModule } from '@angular/forms';
|
|
3
|
+
import { IonButton, IonButtons, IonCol, IonGrid, IonIcon, IonItem, IonLabel, IonRow, IonSegment, IonSegmentButton, ModalController, } from '@ionic/angular/standalone';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
const morningHours = [
|
|
7
|
+
'00',
|
|
8
|
+
'01',
|
|
9
|
+
'02',
|
|
10
|
+
'03',
|
|
11
|
+
'04',
|
|
12
|
+
'05',
|
|
13
|
+
'06',
|
|
14
|
+
'07',
|
|
15
|
+
'08',
|
|
16
|
+
];
|
|
17
|
+
const dayHours = [
|
|
18
|
+
'09',
|
|
19
|
+
'10',
|
|
20
|
+
'11',
|
|
21
|
+
'12',
|
|
22
|
+
'13',
|
|
23
|
+
'14',
|
|
24
|
+
'15',
|
|
25
|
+
'16',
|
|
26
|
+
'17',
|
|
27
|
+
];
|
|
28
|
+
const eveningHours = [
|
|
29
|
+
'16',
|
|
30
|
+
'17',
|
|
31
|
+
'18',
|
|
32
|
+
'19',
|
|
33
|
+
'20',
|
|
34
|
+
'21',
|
|
35
|
+
'22',
|
|
36
|
+
'23',
|
|
37
|
+
'00',
|
|
38
|
+
];
|
|
39
|
+
export class TimeSelectorComponent {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.modalController = inject(ModalController);
|
|
42
|
+
this.hideHeader = false;
|
|
43
|
+
this.selected = new EventEmitter();
|
|
44
|
+
this.tab = 'day';
|
|
45
|
+
this.hours = dayHours;
|
|
46
|
+
// console.log('TimeSelectorComponent.constructor()');
|
|
47
|
+
}
|
|
48
|
+
select(hh, mm) {
|
|
49
|
+
this.selected.emit(hh + ':' + mm);
|
|
50
|
+
}
|
|
51
|
+
close() {
|
|
52
|
+
this.modalController.dismiss().catch(console.error);
|
|
53
|
+
}
|
|
54
|
+
onTabChanged(event) {
|
|
55
|
+
event.stopPropagation();
|
|
56
|
+
switch (this.tab) {
|
|
57
|
+
case 'morning':
|
|
58
|
+
this.hours = morningHours;
|
|
59
|
+
break;
|
|
60
|
+
case 'day':
|
|
61
|
+
this.hours = dayHours;
|
|
62
|
+
break;
|
|
63
|
+
case 'evening':
|
|
64
|
+
this.hours = eveningHours;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TimeSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
70
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: TimeSelectorComponent, isStandalone: true, selector: "sneat-time-selector", inputs: { hideHeader: "hideHeader" }, outputs: { selected: "selected" }, ngImport: i0, template: "@if (!hideHeader) {\n <ion-item color=\"primary\" class=\"sneat-tiny-end-padding\">\n <ion-label>Start time</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\">\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-item>\n}\n\n<ion-segment [(ngModel)]=\"tab\" (ionChange)=\"onTabChanged($event)\">\n <ion-segment-button value=\"morning\">Morning</ion-segment-button>\n <ion-segment-button value=\"day\">Day</ion-segment-button>\n <ion-segment-button value=\"evening\">Evening</ion-segment-button>\n</ion-segment>\n<!--<ion-list>-->\n<!--\t<ion-item *ngFor=\"let hh of hours\" >-->\n<!--<!–\t\t<ion-buttons slot=\"start\">–>-->\n<!--<!–\t\t\t<ion-button style=\"font-weight: bold\" (click)=\"select(hh, '00')\">{{hh}}:00</ion-button>–>-->\n<!--<!–\t\t</ion-buttons>–>-->\n<!--\t\t<ion-buttons>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '00')\"><ion-text color=\"medium\">{{hh}}</ion-text>:00</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '10')\"><ion-text color=\"medium\">{{hh}}</ion-text>:10</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '15')\"><ion-text color=\"medium\">{{hh}}</ion-text>:15</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '20')\"><ion-text color=\"medium\">{{hh}}</ion-text>:20</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '30')\"><ion-text color=\"medium\">{{hh}}</ion-text>:30</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '45')\"><ion-text color=\"medium\">{{hh}}</ion-text>:45</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '50')\"><ion-text color=\"medium\">{{hh}}</ion-text>:50</ion-button>-->\n<!--\t\t</ion-buttons>-->\n<!--\t</ion-item>-->\n<!--</ion-list>-->\n<div class=\"ion-padding\">\n <ion-grid class=\"ion-grid-layout\">\n @for (hh of hours; track hh) {\n <ion-row>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"outline\" (click)=\"select(hh, '00')\"\n >{{ hh }}:00\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '15')\"\n >{{ hh }}:15\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '30')\"\n >{{ hh }}:30\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '45')\"\n >{{ hh }}:45\n </ion-button>\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: 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: IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: IonSegmentButton, selector: "ion-segment-button", inputs: ["contentId", "disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: IonRow, selector: "ion-row" }, { kind: "component", type: IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }] }); }
|
|
71
|
+
}
|
|
72
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TimeSelectorComponent, decorators: [{
|
|
73
|
+
type: Component,
|
|
74
|
+
args: [{ selector: 'sneat-time-selector', imports: [
|
|
75
|
+
FormsModule,
|
|
76
|
+
IonItem,
|
|
77
|
+
IonLabel,
|
|
78
|
+
IonButtons,
|
|
79
|
+
IonButton,
|
|
80
|
+
IonSegment,
|
|
81
|
+
IonSegmentButton,
|
|
82
|
+
IonIcon,
|
|
83
|
+
IonGrid,
|
|
84
|
+
IonRow,
|
|
85
|
+
IonCol,
|
|
86
|
+
], template: "@if (!hideHeader) {\n <ion-item color=\"primary\" class=\"sneat-tiny-end-padding\">\n <ion-label>Start time</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\">\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-item>\n}\n\n<ion-segment [(ngModel)]=\"tab\" (ionChange)=\"onTabChanged($event)\">\n <ion-segment-button value=\"morning\">Morning</ion-segment-button>\n <ion-segment-button value=\"day\">Day</ion-segment-button>\n <ion-segment-button value=\"evening\">Evening</ion-segment-button>\n</ion-segment>\n<!--<ion-list>-->\n<!--\t<ion-item *ngFor=\"let hh of hours\" >-->\n<!--<!–\t\t<ion-buttons slot=\"start\">–>-->\n<!--<!–\t\t\t<ion-button style=\"font-weight: bold\" (click)=\"select(hh, '00')\">{{hh}}:00</ion-button>–>-->\n<!--<!–\t\t</ion-buttons>–>-->\n<!--\t\t<ion-buttons>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '00')\"><ion-text color=\"medium\">{{hh}}</ion-text>:00</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '10')\"><ion-text color=\"medium\">{{hh}}</ion-text>:10</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '15')\"><ion-text color=\"medium\">{{hh}}</ion-text>:15</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '20')\"><ion-text color=\"medium\">{{hh}}</ion-text>:20</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '30')\"><ion-text color=\"medium\">{{hh}}</ion-text>:30</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '45')\"><ion-text color=\"medium\">{{hh}}</ion-text>:45</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '50')\"><ion-text color=\"medium\">{{hh}}</ion-text>:50</ion-button>-->\n<!--\t\t</ion-buttons>-->\n<!--\t</ion-item>-->\n<!--</ion-list>-->\n<div class=\"ion-padding\">\n <ion-grid class=\"ion-grid-layout\">\n @for (hh of hours; track hh) {\n <ion-row>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"outline\" (click)=\"select(hh, '00')\"\n >{{ hh }}:00\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '15')\"\n >{{ hh }}:15\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '30')\"\n >{{ hh }}:30\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '45')\"\n >{{ hh }}:45\n </ion-button>\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</div>\n" }]
|
|
87
|
+
}], ctorParameters: () => [], propDecorators: { hideHeader: [{
|
|
88
|
+
type: Input
|
|
89
|
+
}], selected: [{
|
|
90
|
+
type: Output
|
|
91
|
+
}] } });
|
|
92
|
+
//# sourceMappingURL=time-selector.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-selector.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/start-end-datetime-form/time-selector.component.ts","../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/start-end-datetime-form/time-selector.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,MAAM,EACN,UAAU,EACV,gBAAgB,EAChB,eAAe,GAChB,MAAM,2BAA2B,CAAC;;;AAEnC,MAAM,YAAY,GAAa;IAC7B,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC;AAEF,MAAM,QAAQ,GAAa;IACzB,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC;AAEF,MAAM,YAAY,GAAa;IAC7B,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC;AAmBF,MAAM,OAAO,qBAAqB;IAUhC;QATiB,oBAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAElD,eAAU,GAAG,KAAK,CAAC;QACT,aAAQ,GAAG,IAAI,YAAY,EAAU,CAAC;QAEzD,QAAG,GAAkC,KAAK,CAAC;QAEpC,UAAK,GAAa,QAAQ,CAAC;QAGhC,sDAAsD;IACxD,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,EAAU;QAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,YAAY,CAAC,KAAY;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,KAAK,SAAS;gBACZ,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC1B,MAAM;YACR,KAAK,KAAK;gBACR,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC1B,MAAM;QACV,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;8GApCU,qBAAqB;kGAArB,qBAAqB,wJCrElC,quFA4DA,2CDJI,WAAW,+VACX,OAAO,0NACP,QAAQ,6FACR,UAAU,8EACV,SAAS,oPACT,UAAU,uJACV,gBAAgB,qIAChB,OAAO,2JACP,OAAO,wEACP,MAAM,oDACN,MAAM;;2FAGG,qBAAqB;kBAjBjC,SAAS;+BACE,qBAAqB,WAEtB;wBACP,WAAW;wBACX,OAAO;wBACP,QAAQ;wBACR,UAAU;wBACV,SAAS;wBACT,UAAU;wBACV,gBAAgB;wBAChB,OAAO;wBACP,OAAO;wBACP,MAAM;wBACN,MAAM;qBACP;;sBAKA,KAAK;;sBACL,MAAM","sourcesContent":["import { Component, EventEmitter, Input, Output, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n IonButton,\n IonButtons,\n IonCol,\n IonGrid,\n IonIcon,\n IonItem,\n IonLabel,\n IonRow,\n IonSegment,\n IonSegmentButton,\n ModalController,\n} from '@ionic/angular/standalone';\n\nconst morningHours: string[] = [\n '00',\n '01',\n '02',\n '03',\n '04',\n '05',\n '06',\n '07',\n '08',\n];\n\nconst dayHours: string[] = [\n '09',\n '10',\n '11',\n '12',\n '13',\n '14',\n '15',\n '16',\n '17',\n];\n\nconst eveningHours: string[] = [\n '16',\n '17',\n '18',\n '19',\n '20',\n '21',\n '22',\n '23',\n '00',\n];\n\n@Component({\n selector: 'sneat-time-selector',\n templateUrl: './time-selector.component.html',\n imports: [\n FormsModule,\n IonItem,\n IonLabel,\n IonButtons,\n IonButton,\n IonSegment,\n IonSegmentButton,\n IonIcon,\n IonGrid,\n IonRow,\n IonCol,\n ],\n})\nexport class TimeSelectorComponent {\n private readonly modalController = inject(ModalController);\n\n @Input() hideHeader = false;\n @Output() readonly selected = new EventEmitter<string>();\n\n tab: 'morning' | 'day' | 'evening' = 'day';\n\n public hours: string[] = dayHours;\n\n constructor() {\n // console.log('TimeSelectorComponent.constructor()');\n }\n\n select(hh: string, mm: string) {\n this.selected.emit(hh + ':' + mm);\n }\n\n close(): void {\n this.modalController.dismiss().catch(console.error);\n }\n\n onTabChanged(event: Event): boolean {\n event.stopPropagation();\n switch (this.tab) {\n case 'morning':\n this.hours = morningHours;\n break;\n case 'day':\n this.hours = dayHours;\n break;\n case 'evening':\n this.hours = eveningHours;\n break;\n }\n return false;\n }\n}\n","@if (!hideHeader) {\n <ion-item color=\"primary\" class=\"sneat-tiny-end-padding\">\n <ion-label>Start time</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\">\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-item>\n}\n\n<ion-segment [(ngModel)]=\"tab\" (ionChange)=\"onTabChanged($event)\">\n <ion-segment-button value=\"morning\">Morning</ion-segment-button>\n <ion-segment-button value=\"day\">Day</ion-segment-button>\n <ion-segment-button value=\"evening\">Evening</ion-segment-button>\n</ion-segment>\n<!--<ion-list>-->\n<!--\t<ion-item *ngFor=\"let hh of hours\" >-->\n<!--<!–\t\t<ion-buttons slot=\"start\">–>-->\n<!--<!–\t\t\t<ion-button style=\"font-weight: bold\" (click)=\"select(hh, '00')\">{{hh}}:00</ion-button>–>-->\n<!--<!–\t\t</ion-buttons>–>-->\n<!--\t\t<ion-buttons>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '00')\"><ion-text color=\"medium\">{{hh}}</ion-text>:00</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '10')\"><ion-text color=\"medium\">{{hh}}</ion-text>:10</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '15')\"><ion-text color=\"medium\">{{hh}}</ion-text>:15</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '20')\"><ion-text color=\"medium\">{{hh}}</ion-text>:20</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '30')\"><ion-text color=\"medium\">{{hh}}</ion-text>:30</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '45')\"><ion-text color=\"medium\">{{hh}}</ion-text>:45</ion-button>-->\n<!--\t\t\t<ion-button (click)=\"select(hh, '50')\"><ion-text color=\"medium\">{{hh}}</ion-text>:50</ion-button>-->\n<!--\t\t</ion-buttons>-->\n<!--\t</ion-item>-->\n<!--</ion-list>-->\n<div class=\"ion-padding\">\n <ion-grid class=\"ion-grid-layout\">\n @for (hh of hours; track hh) {\n <ion-row>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"outline\" (click)=\"select(hh, '00')\"\n >{{ hh }}:00\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '15')\"\n >{{ hh }}:15\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '30')\"\n >{{ hh }}:30\n </ion-button>\n </ion-col>\n <ion-col style=\"text-align: center\">\n <ion-button color=\"dark\" fill=\"clear\" (click)=\"select(hh, '45')\"\n >{{ hh }}:45\n </ion-button>\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</div>\n"]}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
|
+
import { hideVirtualSlide, showVirtualSlide, } from '@sneat/components';
|
|
3
|
+
import { dateToIso } from '@sneat/core';
|
|
4
|
+
import { SneatBaseComponent } from '@sneat/ui';
|
|
5
|
+
import { animationState, areSameDates } from './calendar-core';
|
|
6
|
+
import { addDays, getToday, } from './calendar/calendar-state.service';
|
|
7
|
+
// @Injectable()
|
|
8
|
+
export class SwipeableBaseComponent extends SneatBaseComponent {
|
|
9
|
+
get dateAsIsoString() {
|
|
10
|
+
return dateToIso(this.$date());
|
|
11
|
+
}
|
|
12
|
+
get activeSlide() {
|
|
13
|
+
return this.$parity() === 'odd' ? this.oddSlide : this.evenSlide;
|
|
14
|
+
}
|
|
15
|
+
// public get passiveSlide(): Swipeable | undefined {
|
|
16
|
+
// return this.parity === 'odd' ? this.oddSlide : this.evenSlide;
|
|
17
|
+
// }
|
|
18
|
+
constructor(scheduleSateService, stepDays) {
|
|
19
|
+
super();
|
|
20
|
+
this.scheduleSateService = scheduleSateService;
|
|
21
|
+
this.stepDays = stepDays;
|
|
22
|
+
this.shiftDays = 0;
|
|
23
|
+
this.$parity = signal('odd', ...(ngDevMode ? [{ debugName: "$parity" }] : []));
|
|
24
|
+
this.$date = signal(getToday(), ...(ngDevMode ? [{ debugName: "$date" }] : []));
|
|
25
|
+
this.isEvenSlideActivated = false;
|
|
26
|
+
// protected isToday(): boolean {
|
|
27
|
+
// return isToday(this.date);
|
|
28
|
+
// }
|
|
29
|
+
this.$isDefaultDate = computed(() => {
|
|
30
|
+
const defaultDate = addDays(new Date(), this.shiftDays);
|
|
31
|
+
return areSameDates(this.$date(), defaultDate);
|
|
32
|
+
}, ...(ngDevMode ? [{ debugName: "$isDefaultDate" }] : []));
|
|
33
|
+
// this.animationState = this.parity === 'odd' ? showVirtualSlide : hideVirtualSlide;
|
|
34
|
+
scheduleSateService.dateChanged.subscribe({
|
|
35
|
+
next: (value) => this.onDateChanged(value),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
swipeLeft() {
|
|
39
|
+
this.swipeNext();
|
|
40
|
+
}
|
|
41
|
+
swipeNext() {
|
|
42
|
+
this.isEvenSlideActivated = true;
|
|
43
|
+
this.scheduleSateService.shiftDays(+this.stepDays);
|
|
44
|
+
}
|
|
45
|
+
setToday() {
|
|
46
|
+
this.scheduleSateService.setToday();
|
|
47
|
+
}
|
|
48
|
+
// setSlidesAnimationState(): void {
|
|
49
|
+
// switch (this.tab) {
|
|
50
|
+
// case 'day': {
|
|
51
|
+
// const isOdd = this.parity === 'odd';
|
|
52
|
+
// this.oddDay.animationState = isOdd ? showVirtualSlide : hideVirtualSlide;
|
|
53
|
+
// this.evenDay.animationState = !isOdd ? showVirtualSlide : hideVirtualSlide;
|
|
54
|
+
// break;
|
|
55
|
+
// }
|
|
56
|
+
// case 'week': {
|
|
57
|
+
// const isOdd = this.activeWeekParity === 'odd';
|
|
58
|
+
// this.oddWeek.animationState = isOdd ? showVirtualSlide : hideVirtualSlide;
|
|
59
|
+
// this.evenWeek.animationState = !isOdd ? showVirtualSlide : hideVirtualSlide;
|
|
60
|
+
// break;
|
|
61
|
+
// }
|
|
62
|
+
// }
|
|
63
|
+
// }
|
|
64
|
+
swipePrev() {
|
|
65
|
+
this.isEvenSlideActivated = true;
|
|
66
|
+
this.scheduleSateService.shiftDays(-this.stepDays);
|
|
67
|
+
}
|
|
68
|
+
swipeRight() {
|
|
69
|
+
this.swipePrev();
|
|
70
|
+
}
|
|
71
|
+
onDateChanged(changed) {
|
|
72
|
+
// this.parity = this.parity === 'odd' ? 'even' : 'odd';
|
|
73
|
+
if (!this.oddSlide || !this.evenSlide) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.$date.set(changed.date);
|
|
77
|
+
if (!changed.shiftDirection) {
|
|
78
|
+
const passive = {
|
|
79
|
+
...changed,
|
|
80
|
+
date: addDays(changed.date, this.stepDays),
|
|
81
|
+
};
|
|
82
|
+
switch (this.$parity()) {
|
|
83
|
+
case 'odd':
|
|
84
|
+
this.oddSlide = this.oddSlide.setDate(changed, 'show');
|
|
85
|
+
this.evenSlide = this.evenSlide.setDate(passive, 'hide');
|
|
86
|
+
break;
|
|
87
|
+
case 'even':
|
|
88
|
+
this.evenSlide = this.evenSlide.setDate(changed, 'show');
|
|
89
|
+
this.oddSlide = this.oddSlide.setDate(passive, 'hide');
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
switch (this.$parity()) {
|
|
95
|
+
case 'odd':
|
|
96
|
+
this.oddSlide = { ...this.oddSlide, animationState: hideVirtualSlide };
|
|
97
|
+
this.evenSlide = this.evenSlide.setDate(changed, showVirtualSlide);
|
|
98
|
+
this.$parity.set('even');
|
|
99
|
+
break;
|
|
100
|
+
case 'even':
|
|
101
|
+
this.evenSlide = {
|
|
102
|
+
...this.evenSlide,
|
|
103
|
+
animationState: hideVirtualSlide,
|
|
104
|
+
};
|
|
105
|
+
this.oddSlide = this.oddSlide.setDate(changed, showVirtualSlide);
|
|
106
|
+
this.$parity.set('odd');
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
this.animationState = animationState(this.$parity(), changed.shiftDirection);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=swipeable-base.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swipeable-base.component.js","sourceRoot":"","sources":["../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/swipeable-base.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { computed, signal } from '@angular/core';\nimport {\n hideVirtualSlide,\n showVirtualSlide,\n VirtualSliderAnimationStates,\n} from '@sneat/components';\nimport { dateToIso } from '@sneat/core';\nimport { SneatBaseComponent } from '@sneat/ui';\nimport { animationState, areSameDates } from './calendar-core';\nimport {\n addDays,\n getToday,\n IDateChanged,\n CalendarStateService,\n} from './calendar/calendar-state.service';\nimport { Parity, Swipeable } from './swipeable-ui';\n\n// @Injectable()\nexport abstract class SwipeableBaseComponent extends SneatBaseComponent {\n public shiftDays = 0;\n\n public readonly $parity = signal<Parity>('odd');\n\n public readonly $date = signal(getToday());\n\n public get dateAsIsoString(): string {\n return dateToIso(this.$date());\n }\n\n public animationState?: VirtualSliderAnimationStates;\n protected isEvenSlideActivated = false;\n\n protected oddSlide?: Swipeable;\n protected evenSlide?: Swipeable;\n\n public get activeSlide(): Swipeable | undefined {\n return this.$parity() === 'odd' ? this.oddSlide : this.evenSlide;\n }\n\n // public get passiveSlide(): Swipeable | undefined {\n // \treturn this.parity === 'odd' ? this.oddSlide : this.evenSlide;\n // }\n\n protected constructor(\n protected readonly scheduleSateService: CalendarStateService,\n private readonly stepDays: number,\n ) {\n super();\n // this.animationState = this.parity === 'odd' ? showVirtualSlide : hideVirtualSlide;\n scheduleSateService.dateChanged.subscribe({\n next: (value) => this.onDateChanged(value),\n });\n }\n\n // protected isToday(): boolean {\n // \treturn isToday(this.date);\n // }\n\n protected readonly $isDefaultDate = computed(() => {\n const defaultDate = addDays(new Date(), this.shiftDays);\n return areSameDates(this.$date(), defaultDate);\n });\n\n protected swipeLeft(): void {\n this.swipeNext();\n }\n\n protected swipeNext(): void {\n this.isEvenSlideActivated = true;\n this.scheduleSateService.shiftDays(+this.stepDays);\n }\n\n protected setToday(): void {\n this.scheduleSateService.setToday();\n }\n\n // setSlidesAnimationState(): void {\n // \tswitch (this.tab) {\n // \t\tcase 'day': {\n // \t\t\tconst isOdd = this.parity === 'odd';\n // \t\t\tthis.oddDay.animationState = isOdd ? showVirtualSlide : hideVirtualSlide;\n // \t\t\tthis.evenDay.animationState = !isOdd ? showVirtualSlide : hideVirtualSlide;\n // \t\t\tbreak;\n // \t\t}\n // \t\tcase 'week': {\n // \t\t\tconst isOdd = this.activeWeekParity === 'odd';\n // \t\t\tthis.oddWeek.animationState = isOdd ? showVirtualSlide : hideVirtualSlide;\n // \t\t\tthis.evenWeek.animationState = !isOdd ? showVirtualSlide : hideVirtualSlide;\n // \t\t\tbreak;\n // \t\t}\n // \t}\n // }\n\n protected swipePrev(): void {\n this.isEvenSlideActivated = true;\n this.scheduleSateService.shiftDays(-this.stepDays);\n }\n\n protected swipeRight(): void {\n this.swipePrev();\n }\n\n protected onDateChanged(changed: IDateChanged): void {\n // this.parity = this.parity === 'odd' ? 'even' : 'odd';\n if (!this.oddSlide || !this.evenSlide) {\n return;\n }\n this.$date.set(changed.date);\n if (!changed.shiftDirection) {\n const passive: IDateChanged = {\n ...changed,\n date: addDays(changed.date, this.stepDays),\n };\n switch (this.$parity()) {\n case 'odd':\n this.oddSlide = this.oddSlide.setDate(changed, 'show');\n this.evenSlide = this.evenSlide.setDate(passive, 'hide');\n break;\n case 'even':\n this.evenSlide = this.evenSlide.setDate(changed, 'show');\n this.oddSlide = this.oddSlide.setDate(passive, 'hide');\n break;\n }\n return;\n }\n switch (this.$parity()) {\n case 'odd':\n this.oddSlide = { ...this.oddSlide, animationState: hideVirtualSlide };\n this.evenSlide = this.evenSlide.setDate(changed, showVirtualSlide);\n this.$parity.set('even');\n break;\n case 'even':\n this.evenSlide = {\n ...this.evenSlide,\n animationState: hideVirtualSlide,\n };\n this.oddSlide = this.oddSlide.setDate(changed, showVirtualSlide);\n this.$parity.set('odd');\n break;\n }\n this.animationState = animationState(\n this.$parity(),\n changed.shiftDirection,\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { hideVirtualSlide, showVirtualSlide, } from '@sneat/components';
|
|
2
|
+
import { dateToIso, getWeekStartDate } from '@sneat/core';
|
|
3
|
+
import { createWeekday } from './weekday-functions';
|
|
4
|
+
function initialAnimationState(parity) {
|
|
5
|
+
return parity === 'odd' ? showVirtualSlide : hideVirtualSlide;
|
|
6
|
+
}
|
|
7
|
+
export function swipeableDay(parity, date, spaceDaysProvider, destroyed) {
|
|
8
|
+
// console.log(`swipeableDay(parity=${parity}, date=${dateToIso(date)})`);
|
|
9
|
+
const weekday = createWeekday(date, spaceDaysProvider);
|
|
10
|
+
const animationState = initialAnimationState(parity);
|
|
11
|
+
const activeDateID = dateToIso(date);
|
|
12
|
+
let result = {
|
|
13
|
+
parity,
|
|
14
|
+
spaceDaysProvider,
|
|
15
|
+
weekday,
|
|
16
|
+
destroyed,
|
|
17
|
+
animationState,
|
|
18
|
+
activeDateID,
|
|
19
|
+
setDate: undefined,
|
|
20
|
+
};
|
|
21
|
+
const setDate = (changed, animationState) => {
|
|
22
|
+
// console.log(`swipeableDay.setDate(), changed:`, changedToLog);
|
|
23
|
+
const { date } = changed;
|
|
24
|
+
const v = {
|
|
25
|
+
...result,
|
|
26
|
+
animationState,
|
|
27
|
+
activeDateID: dateToIso(date),
|
|
28
|
+
weekday: createWeekday(date, spaceDaysProvider),
|
|
29
|
+
};
|
|
30
|
+
return v;
|
|
31
|
+
};
|
|
32
|
+
result = { ...result, setDate };
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
export function swipeableWeek(parity, date,
|
|
36
|
+
// spaceDaysProvider: SpaceDaysProvider,
|
|
37
|
+
destroyed) {
|
|
38
|
+
// console.log('swipeableWeek', parity, date);
|
|
39
|
+
const activeDateID = dateToIso(date);
|
|
40
|
+
const animationState = initialAnimationState(parity);
|
|
41
|
+
let result = {
|
|
42
|
+
animationState,
|
|
43
|
+
startDate: getWeekStartDate(date, 0),
|
|
44
|
+
endDate: getWeekStartDate(date, 6),
|
|
45
|
+
parity,
|
|
46
|
+
activeDateID,
|
|
47
|
+
destroyed,
|
|
48
|
+
setDate: undefined,
|
|
49
|
+
};
|
|
50
|
+
const setActiveDate = (changed, animationState) => {
|
|
51
|
+
const { date } = changed;
|
|
52
|
+
const v = {
|
|
53
|
+
...result,
|
|
54
|
+
animationState,
|
|
55
|
+
activeDateID: dateToIso(date),
|
|
56
|
+
startDate: getWeekStartDate(date, 0),
|
|
57
|
+
endDate: getWeekStartDate(date, 6),
|
|
58
|
+
};
|
|
59
|
+
return v;
|
|
60
|
+
};
|
|
61
|
+
result = { ...result, setDate: setActiveDate };
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=swipeable-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swipeable-ui.js","sourceRoot":"","sources":["../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/swipeable-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAM1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiBpD,SAAS,qBAAqB,CAAC,MAAc;IAC3C,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,IAAU,EACV,iBAAuC,EACvC,SAA2B;IAE3B,0EAA0E;IAC1E,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,MAAM,GAAiB;QACzB,MAAM;QACN,iBAAiB;QACjB,OAAO;QACP,SAAS;QACT,cAAc;QACd,YAAY;QACZ,OAAO,EAAE,SAA+D;KACzE,CAAC;IACF,MAAM,OAAO,GAAG,CACd,OAAqB,EACrB,cAA4C,EAC5C,EAAE;QACF,iEAAiE;QACjE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,MAAM,CAAC,GAAiB;YACtB,GAAG,MAAM;YACT,cAAc;YACd,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC;YAC7B,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC;SAChD,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC;AA0ED,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,IAAU;AACV,wCAAwC;AACxC,SAA2B;IAE3B,8CAA8C;IAC9C,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,MAAM,GAAkB;QAC1B,cAAc;QACd,SAAS,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,MAAM;QACN,YAAY;QACZ,SAAS;QACT,OAAO,EAAE,SAAgE;KAC1E,CAAC;IACF,MAAM,aAAa,GAAG,CACpB,OAAqB,EACrB,cAA4C,EAC5C,EAAE;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,MAAM,CAAC,GAAkB;YACvB,GAAG,MAAM;YACT,cAAc;YACd,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC;YAC7B,SAAS,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;SACnC,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAC/C,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import {\n hideVirtualSlide,\n showVirtualSlide,\n VirtualSlideAnimationsStates,\n} from '@sneat/components';\nimport { dateToIso, getWeekStartDate } from '@sneat/core';\nimport { Weekday } from './calendar/weekday';\nimport { Observable } from 'rxjs';\nimport { CalendarDataProvider } from '../services/calendar-data-provider';\nimport { IDateChanged } from './calendar/calendar-state.service';\nimport { Week } from './week';\nimport { createWeekday } from './weekday-functions';\n\nexport type Parity = 'odd' | 'even'; // TODO: change to 'current' | 'next' | 'prev';\n\nexport interface Swipeable {\n // TODO: Is in process of migrating to SwipeableCardBaseComponent?\n // id: string;\n readonly animationState: VirtualSlideAnimationsStates;\n readonly parity: Parity;\n readonly destroyed: Observable<void>;\n readonly activeDateID: string;\n readonly setDate: (\n changed: IDateChanged,\n animationState: VirtualSlideAnimationsStates,\n ) => Swipeable;\n}\n\nfunction initialAnimationState(parity: Parity): VirtualSlideAnimationsStates {\n return parity === 'odd' ? showVirtualSlide : hideVirtualSlide;\n}\n\nexport function swipeableDay(\n parity: Parity,\n date: Date,\n spaceDaysProvider: CalendarDataProvider,\n destroyed: Observable<void>,\n): SwipeableDay {\n // console.log(`swipeableDay(parity=${parity}, date=${dateToIso(date)})`);\n const weekday = createWeekday(date, spaceDaysProvider);\n const animationState = initialAnimationState(parity);\n const activeDateID = dateToIso(date);\n let result: SwipeableDay = {\n parity,\n spaceDaysProvider,\n weekday,\n destroyed,\n animationState,\n activeDateID,\n setDate: undefined as unknown as (changed: IDateChanged) => SwipeableDay,\n };\n const setDate = (\n changed: IDateChanged,\n animationState: VirtualSlideAnimationsStates,\n ) => {\n // console.log(`swipeableDay.setDate(), changed:`, changedToLog);\n const { date } = changed;\n const v: SwipeableDay = {\n ...result,\n animationState,\n activeDateID: dateToIso(date),\n weekday: createWeekday(date, spaceDaysProvider),\n };\n return v;\n };\n result = { ...result, setDate };\n return result;\n}\n\nexport interface SwipeableDay extends Swipeable {\n // private readonly dayChanged = new Subject<void>();\n weekday: Weekday;\n spaceDaysProvider: CalendarDataProvider;\n // public animationState: VirtualSlideAnimationsStates;\n\n // constructor(\n // \tpublic readonly parity: Parity,\n // \tpublic date: Date,\n // \tprivate readonly spaceDaysProvider: SpaceDaysProvider,\n // \tprivate readonly destroyed: Observable<void>,\n // ) {\n // \tthis.animationState = parity === 'odd' ? showVirtualSlide : hideVirtualSlide;\n // \tthis.id = dateToIso(date);\n // \tconsole.log(`SwipeableDay.constructor(parity=${parity}, date=${this.id})`);\n // \tthis.weekday = this.createDay(date);\n // }\n //\n // public setActiveDate(date: Date): void {\n // \tconst id = dateToIso(date);\n // \tif (id === '1970-01-01') {\n // \t\tthrow new Error('an attempt to set an empty date 1970-01-01');\n // \t}\n // \tconsole.log(`SwipeableDay.changeDate(${id}), parity=${this.parity}`);\n // \tif (id === this.id) {\n // \t\tconsole.warn(`SwipeableDay.changeDate() - got duplicate call with same day \"${id}\"`);\n // \t\treturn;\n // \t}\n // \tthis.id = id;\n // \tthis.date = date;\n // \tthis.dayChanged.next();\n // \tthis.weekday = this.createDay(date);\n // }\n //\n // private createDay(date: Date): Weekday {\n // \tconst id = getWd2(date);\n // \treturn {\n // \t\tid,\n // \t\tlongTitle: wdCodeToWeekdayLongName(id),\n // \t\tday: this.spaceDaysProvider.getTeamDay(date),\n // \t};\n // }\n}\n\nexport interface SwipeableWeek extends Swipeable, Week {\n readonly startDate: Date;\n readonly endDate: Date;\n\n // public _activeDate: Date;\n //\n // public get activeDate() {\n // \treturn this._activeDate;\n // }\n //\n // constructor(\n // \tpublic readonly parity: Parity,\n // \tprivate readonly spaceDaysProvider: SpaceDaysProvider,\n // \tprivate readonly destroyed: Observable<void>,\n // ) {\n // \tthis.animationState = parity === 'odd' ? showVirtualSlide : hideVirtualSlide;\n // \tthis._activeDate = new Date();\n // \tthis.startDate = getWeekdayDate(this._activeDate, 0);\n // \tthis.endDate = getWeekdayDate(this._activeDate, 6);\n // }\n //\n // public setActiveDate(v: Date) {\n // \tthis._activeDate = v;\n // \tthis.startDate = getWeekdayDate(v, 0);\n // \tthis.endDate = getWeekdayDate(v, 6);\n // }\n}\n\nexport function swipeableWeek(\n parity: Parity,\n date: Date,\n // spaceDaysProvider: SpaceDaysProvider,\n destroyed: Observable<void>,\n): SwipeableWeek {\n // console.log('swipeableWeek', parity, date);\n const activeDateID = dateToIso(date);\n const animationState = initialAnimationState(parity);\n let result: SwipeableWeek = {\n animationState,\n startDate: getWeekStartDate(date, 0),\n endDate: getWeekStartDate(date, 6),\n parity,\n activeDateID,\n destroyed,\n setDate: undefined as unknown as (changed: IDateChanged) => SwipeableWeek,\n };\n const setActiveDate = (\n changed: IDateChanged,\n animationState: VirtualSlideAnimationsStates,\n ) => {\n const { date } = changed;\n const v: SwipeableWeek = {\n ...result,\n animationState,\n activeDateID: dateToIso(date),\n startDate: getWeekStartDate(date, 0),\n endDate: getWeekStartDate(date, 6),\n };\n return v;\n };\n result = { ...result, setDate: setActiveDate };\n return result;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"week.js","sourceRoot":"","sources":["../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/week.ts"],"names":[],"mappings":"","sourcesContent":["export interface Week {\n startDate: Date; // e.g. Monday\n endDate: Date; // e.g. Sunday\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getWd2, wdCodeToWeekdayLongName } from '@sneat/mod-schedulus-core';
|
|
2
|
+
export function createWeekday(date, spaceDaysProvider) {
|
|
3
|
+
const id = getWd2(date);
|
|
4
|
+
const day = spaceDaysProvider.getCalendarDay(date);
|
|
5
|
+
const weekday = {
|
|
6
|
+
id,
|
|
7
|
+
day,
|
|
8
|
+
longTitle: wdCodeToWeekdayLongName(id),
|
|
9
|
+
};
|
|
10
|
+
// console.log('createWeekday();', date, spaceDaysProvider, weekday);
|
|
11
|
+
return weekday;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=weekday-functions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weekday-functions.js","sourceRoot":"","sources":["../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/weekday-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAI5E,MAAM,UAAU,aAAa,CAC3B,IAAU,EACV,iBAAuC;IAEvC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,GAAG,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,OAAO,GAAY;QACvB,EAAE;QACF,GAAG;QACH,SAAS,EAAE,uBAAuB,CAAC,EAAE,CAAC;KACvC,CAAC;IACF,qEAAqE;IACrE,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { getWd2, wdCodeToWeekdayLongName } from '@sneat/mod-schedulus-core';\nimport { CalendarDataProvider } from '../services/calendar-data-provider';\nimport { Weekday } from './calendar/weekday';\n\nexport function createWeekday(\n date: Date,\n spaceDaysProvider: CalendarDataProvider,\n): Weekday {\n const id = getWd2(date);\n const day = spaceDaysProvider.getCalendarDay(date);\n const weekday: Weekday = {\n id,\n day,\n longTitle: wdCodeToWeekdayLongName(id),\n };\n // console.log('createWeekday();', date, spaceDaysProvider, weekday);\n return weekday;\n}\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
|
+
import { SneatBaseComponent } from '@sneat/ui';
|
|
3
|
+
// const weekdayRequired: ValidatorFn = (
|
|
4
|
+
// control: AbstractControl,
|
|
5
|
+
// ): ValidationErrors | null => {
|
|
6
|
+
// const formGroup = control as UntypedFormGroup;
|
|
7
|
+
// const weekdaySelected = Object.values(formGroup.value).includes(true);
|
|
8
|
+
// if (weekdaySelected) {
|
|
9
|
+
// return null;
|
|
10
|
+
// }
|
|
11
|
+
// return { required: 'Please select at least 1 weekday.' };
|
|
12
|
+
// };
|
|
13
|
+
export class WeekdaysFormBase extends SneatBaseComponent {
|
|
14
|
+
onWeekdaysCheckboxChange(checked) {
|
|
15
|
+
Object.entries(this.weekdayById).forEach((c) => {
|
|
16
|
+
if (!this.isWeekend(c[0])) {
|
|
17
|
+
c[1].set(checked);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
isWeekend(day) {
|
|
22
|
+
return day === 'sa' || day === 'su';
|
|
23
|
+
}
|
|
24
|
+
onWeekendCheckboxChange(checked) {
|
|
25
|
+
Object.entries(this.weekdayById).forEach((c) => {
|
|
26
|
+
if (this.isWeekend(c[0])) {
|
|
27
|
+
c[1].set(checked);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
onWeekdayChanged(wd, checked) {
|
|
32
|
+
this.weekdayById[wd].set(checked);
|
|
33
|
+
}
|
|
34
|
+
constructor(isWeekdayRequired) {
|
|
35
|
+
super();
|
|
36
|
+
this.isWeekdayRequired = isWeekdayRequired;
|
|
37
|
+
this.weekdayMo = signal(false, ...(ngDevMode ? [{ debugName: "weekdayMo" }] : []));
|
|
38
|
+
this.weekdayTu = signal(false, ...(ngDevMode ? [{ debugName: "weekdayTu" }] : []));
|
|
39
|
+
this.weekdayWe = signal(false, ...(ngDevMode ? [{ debugName: "weekdayWe" }] : []));
|
|
40
|
+
this.weekdayTh = signal(false, ...(ngDevMode ? [{ debugName: "weekdayTh" }] : []));
|
|
41
|
+
this.weekdayFr = signal(false, ...(ngDevMode ? [{ debugName: "weekdayFr" }] : []));
|
|
42
|
+
this.weekdaySa = signal(false, ...(ngDevMode ? [{ debugName: "weekdaySa" }] : []));
|
|
43
|
+
this.weekdaySu = signal(false, ...(ngDevMode ? [{ debugName: "weekdaySu" }] : []));
|
|
44
|
+
this.hasWeekdaySelected = computed(() => this.weekdayMo() ||
|
|
45
|
+
this.weekdayTu() ||
|
|
46
|
+
this.weekdayWe() ||
|
|
47
|
+
this.weekdayTh() ||
|
|
48
|
+
this.weekdayFr() ||
|
|
49
|
+
this.weekdaySa() ||
|
|
50
|
+
this.weekdaySu(), ...(ngDevMode ? [{ debugName: "hasWeekdaySelected" }] : []));
|
|
51
|
+
this.weekdaysCheckbox = computed(() => this.weekdayMo() &&
|
|
52
|
+
this.weekdayTu() &&
|
|
53
|
+
this.weekdayWe() &&
|
|
54
|
+
this.weekdayTh() &&
|
|
55
|
+
this.weekdayFr(), ...(ngDevMode ? [{ debugName: "weekdaysCheckbox" }] : []));
|
|
56
|
+
this.weekendCheckbox = computed(() => this.weekdaySa() && this.weekdaySu(), ...(ngDevMode ? [{ debugName: "weekendCheckbox" }] : []));
|
|
57
|
+
this.allWeekdaysSelected = computed(() => this.weekdaysCheckbox() && this.weekendCheckbox(), ...(ngDevMode ? [{ debugName: "allWeekdaysSelected" }] : []));
|
|
58
|
+
this.weekdayById = {
|
|
59
|
+
mo: this.weekdayMo,
|
|
60
|
+
tu: this.weekdayTu,
|
|
61
|
+
we: this.weekdayWe,
|
|
62
|
+
th: this.weekdayTh,
|
|
63
|
+
fr: this.weekdayFr,
|
|
64
|
+
sa: this.weekdaySa,
|
|
65
|
+
su: this.weekdaySu,
|
|
66
|
+
};
|
|
67
|
+
this.selectedWeekdayCodes = computed(() => Object.entries(this.weekdayById)
|
|
68
|
+
.filter(([, c]) => c())
|
|
69
|
+
.map(([wd]) => wd), ...(ngDevMode ? [{ debugName: "selectedWeekdayCodes" }] : []));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=weekdays-form-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weekdays-form-base.js","sourceRoot":"","sources":["../../../../../../../../../libs/extensions/schedulus/shared/src/lib/components/weekdays/weekdays-form-base.ts"],"names":[],"mappings":"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","sourcesContent":["import { computed, signal } from '@angular/core';\n// import {\n// \tAbstractControl,\n// \tFormGroup,\n// \tUntypedFormGroup,\n// \tValidationErrors,\n// \tValidatorFn,\n// } from '@angular/forms';\nimport { WeekdayCode2 } from '@sneat/mod-schedulus-core';\nimport { SneatBaseComponent } from '@sneat/ui';\n\n// const weekdayRequired: ValidatorFn = (\n// \tcontrol: AbstractControl,\n// ): ValidationErrors | null => {\n// \tconst formGroup = control as UntypedFormGroup;\n// \tconst weekdaySelected = Object.values(formGroup.value).includes(true);\n// \tif (weekdaySelected) {\n// \t\treturn null;\n// \t}\n// \treturn { required: 'Please select at least 1 weekday.' };\n// };\n\nexport abstract class WeekdaysFormBase extends SneatBaseComponent {\n protected readonly weekdayMo = signal(false);\n protected readonly weekdayTu = signal(false);\n protected readonly weekdayWe = signal(false);\n protected readonly weekdayTh = signal(false);\n protected readonly weekdayFr = signal(false);\n protected readonly weekdaySa = signal(false);\n protected readonly weekdaySu = signal(false);\n\n protected readonly hasWeekdaySelected = computed(\n () =>\n this.weekdayMo() ||\n this.weekdayTu() ||\n this.weekdayWe() ||\n this.weekdayTh() ||\n this.weekdayFr() ||\n this.weekdaySa() ||\n this.weekdaySu(),\n );\n\n protected readonly weekdaysCheckbox = computed(\n () =>\n this.weekdayMo() &&\n this.weekdayTu() &&\n this.weekdayWe() &&\n this.weekdayTh() &&\n this.weekdayFr(),\n );\n\n protected readonly weekendCheckbox = computed(\n () => this.weekdaySa() && this.weekdaySu(),\n );\n\n protected readonly allWeekdaysSelected = computed(\n () => this.weekdaysCheckbox() && this.weekendCheckbox(),\n );\n\n protected onWeekdaysCheckboxChange(checked: boolean): void {\n Object.entries(this.weekdayById).forEach((c) => {\n if (!this.isWeekend(c[0])) {\n c[1].set(checked);\n }\n });\n }\n\n private isWeekend(day: string): boolean {\n return day === 'sa' || day === 'su';\n }\n\n protected onWeekendCheckboxChange(checked: boolean): void {\n Object.entries(this.weekdayById).forEach((c) => {\n if (this.isWeekend(c[0])) {\n c[1].set(checked);\n }\n });\n }\n\n protected onWeekdayChanged(wd: WeekdayCode2, checked: boolean): void {\n this.weekdayById[wd].set(checked);\n }\n\n protected readonly weekdayById = {\n mo: this.weekdayMo,\n tu: this.weekdayTu,\n we: this.weekdayWe,\n th: this.weekdayTh,\n fr: this.weekdayFr,\n sa: this.weekdaySa,\n su: this.weekdaySu,\n };\n\n protected readonly selectedWeekdayCodes = computed(() =>\n Object.entries(this.weekdayById)\n .filter(([, c]) => c())\n .map(([wd]) => wd as WeekdayCode2),\n );\n\n protected constructor(protected readonly isWeekdayRequired: boolean) {\n super();\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/extensions/schedulus/shared/src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC","sourcesContent":["export * from './components';\nexport * from './services';\n"]}
|