@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.
Files changed (194) hide show
  1. package/esm2022/index.js +2 -0
  2. package/esm2022/index.js.map +1 -0
  3. package/esm2022/lib/components/calendar/calendar-base.component.js +83 -0
  4. package/esm2022/lib/components/calendar/calendar-base.component.js.map +1 -0
  5. package/esm2022/lib/components/calendar/calendar-brief.component.js +57 -0
  6. package/esm2022/lib/components/calendar/calendar-brief.component.js.map +1 -0
  7. package/esm2022/lib/components/calendar/calendar-component-types.js +2 -0
  8. package/esm2022/lib/components/calendar/calendar-component-types.js.map +1 -0
  9. package/esm2022/lib/components/calendar/calendar-state.service.js +90 -0
  10. package/esm2022/lib/components/calendar/calendar-state.service.js.map +1 -0
  11. package/esm2022/lib/components/calendar/calendar.component.js +284 -0
  12. package/esm2022/lib/components/calendar/calendar.component.js.map +1 -0
  13. package/esm2022/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.js +45 -0
  14. package/esm2022/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.js.map +1 -0
  15. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-base.component.js +26 -0
  16. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-base.component.js.map +1 -0
  17. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-card.component.js +67 -0
  18. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-card.component.js.map +1 -0
  19. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-tab.component.js +74 -0
  20. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-tab.component.js.map +1 -0
  21. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-title.component.js +27 -0
  22. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day-title.component.js.map +1 -0
  23. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day.component.js +129 -0
  24. package/esm2022/lib/components/calendar/components/calendar-day/calendar-day.component.js.map +1 -0
  25. package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.component.js +162 -0
  26. package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.component.js.map +1 -0
  27. package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.js +17 -0
  28. package/esm2022/lib/components/calendar/components/calendar-filter/calendar-filter.js.map +1 -0
  29. package/esm2022/lib/components/calendar/components/calendar-filter/contacts-filter.component.js +95 -0
  30. package/esm2022/lib/components/calendar/components/calendar-filter/contacts-filter.component.js.map +1 -0
  31. package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-card.component.js +50 -0
  32. package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-card.component.js.map +1 -0
  33. package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-tab.component.js +18 -0
  34. package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-tab.component.js.map +1 -0
  35. package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-title.component.js +15 -0
  36. package/esm2022/lib/components/calendar/components/calendar-week/calendar-week-title.component.js.map +1 -0
  37. package/esm2022/lib/components/calendar/components/calendar-week/calendar-week.component.js +78 -0
  38. package/esm2022/lib/components/calendar/components/calendar-week/calendar-week.component.js.map +1 -0
  39. package/esm2022/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.js +66 -0
  40. package/esm2022/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.js.map +1 -0
  41. package/esm2022/lib/components/calendar/components/day-slot-item/day-slot-item.component.js +93 -0
  42. package/esm2022/lib/components/calendar/components/day-slot-item/day-slot-item.component.js.map +1 -0
  43. package/esm2022/lib/components/calendar/components/day-slot-item/slot-context-menu.component.js +324 -0
  44. package/esm2022/lib/components/calendar/components/day-slot-item/slot-context-menu.component.js.map +1 -0
  45. package/esm2022/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.js +36 -0
  46. package/esm2022/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.js.map +1 -0
  47. package/esm2022/lib/components/calendar/components/singles-tab/single-happenings-list.component.js +65 -0
  48. package/esm2022/lib/components/calendar/components/singles-tab/single-happenings-list.component.js.map +1 -0
  49. package/esm2022/lib/components/calendar/components/singles-tab/singles-tab.component.js +106 -0
  50. package/esm2022/lib/components/calendar/components/singles-tab/singles-tab.component.js.map +1 -0
  51. package/esm2022/lib/components/calendar/components/timing-badge/timing-badge.component.js +25 -0
  52. package/esm2022/lib/components/calendar/components/timing-badge/timing-badge.component.js.map +1 -0
  53. package/esm2022/lib/components/calendar/weekday.js +2 -0
  54. package/esm2022/lib/components/calendar/weekday.js.map +1 -0
  55. package/esm2022/lib/components/calendar-core.js +64 -0
  56. package/esm2022/lib/components/calendar-core.js.map +1 -0
  57. package/esm2022/lib/components/calendar-filter.service.js +28 -0
  58. package/esm2022/lib/components/calendar-filter.service.js.map +1 -0
  59. package/esm2022/lib/components/calendar-slots.js +30 -0
  60. package/esm2022/lib/components/calendar-slots.js.map +1 -0
  61. package/esm2022/lib/components/happening-base.component.js +188 -0
  62. package/esm2022/lib/components/happening-base.component.js.map +1 -0
  63. package/esm2022/lib/components/happening-card/happening-card.component.js +69 -0
  64. package/esm2022/lib/components/happening-card/happening-card.component.js.map +1 -0
  65. package/esm2022/lib/components/happening-component-base-params.js +37 -0
  66. package/esm2022/lib/components/happening-component-base-params.js.map +1 -0
  67. package/esm2022/lib/components/happening-form/happening-form.component.js +348 -0
  68. package/esm2022/lib/components/happening-form/happening-form.component.js.map +1 -0
  69. package/esm2022/lib/components/happening-form/happening-price-form/happening-price-modal.component.js +161 -0
  70. package/esm2022/lib/components/happening-form/happening-price-form/happening-price-modal.component.js.map +1 -0
  71. package/esm2022/lib/components/happening-form/happening-prices/happening-prices.component.js +142 -0
  72. package/esm2022/lib/components/happening-form/happening-prices/happening-prices.component.js.map +1 -0
  73. package/esm2022/lib/components/happening-participants/happening-participants.component.js +195 -0
  74. package/esm2022/lib/components/happening-participants/happening-participants.component.js.map +1 -0
  75. package/esm2022/lib/components/happening-slot-form/happening-slot-form.component.js +505 -0
  76. package/esm2022/lib/components/happening-slot-form/happening-slot-form.component.js.map +1 -0
  77. package/esm2022/lib/components/happening-slot-form/happening-slot-modal.component.js +140 -0
  78. package/esm2022/lib/components/happening-slot-form/happening-slot-modal.component.js.map +1 -0
  79. package/esm2022/lib/components/happening-slot-form/happening-slot-modal.service.js +47 -0
  80. package/esm2022/lib/components/happening-slot-form/happening-slot-modal.service.js.map +1 -0
  81. package/esm2022/lib/components/happening-slot-participants/happening-slot-participants.component.js +74 -0
  82. package/esm2022/lib/components/happening-slot-participants/happening-slot-participants.component.js.map +1 -0
  83. package/esm2022/lib/components/happening-slots/happening-slots.component.js +130 -0
  84. package/esm2022/lib/components/happening-slots/happening-slots.component.js.map +1 -0
  85. package/esm2022/lib/components/index.js +20 -0
  86. package/esm2022/lib/components/index.js.map +1 -0
  87. package/esm2022/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.js +68 -0
  88. package/esm2022/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.js.map +1 -0
  89. package/esm2022/lib/components/start-end-datetime-form/start-end-datetime-form.component.js +377 -0
  90. package/esm2022/lib/components/start-end-datetime-form/start-end-datetime-form.component.js.map +1 -0
  91. package/esm2022/lib/components/start-end-datetime-form/time-selector.component.js +92 -0
  92. package/esm2022/lib/components/start-end-datetime-form/time-selector.component.js.map +1 -0
  93. package/esm2022/lib/components/swipeable-base.component.js +112 -0
  94. package/esm2022/lib/components/swipeable-base.component.js.map +1 -0
  95. package/esm2022/lib/components/swipeable-ui.js +64 -0
  96. package/esm2022/lib/components/swipeable-ui.js.map +1 -0
  97. package/esm2022/lib/components/week.js +2 -0
  98. package/esm2022/lib/components/week.js.map +1 -0
  99. package/esm2022/lib/components/weekday-functions.js +13 -0
  100. package/esm2022/lib/components/weekday-functions.js.map +1 -0
  101. package/esm2022/lib/components/weekdays/weekdays-form-base.js +72 -0
  102. package/esm2022/lib/components/weekdays/weekdays-form-base.js.map +1 -0
  103. package/esm2022/lib/index.js +3 -0
  104. package/esm2022/lib/index.js.map +1 -0
  105. package/esm2022/lib/modals/happening-title-modal/happening-title-modal.component.js +87 -0
  106. package/esm2022/lib/modals/happening-title-modal/happening-title-modal.component.js.map +1 -0
  107. package/esm2022/lib/services/calendar-data-provider.js +271 -0
  108. package/esm2022/lib/services/calendar-data-provider.js.map +1 -0
  109. package/esm2022/lib/services/calendar-day.js +179 -0
  110. package/esm2022/lib/services/calendar-day.js.map +1 -0
  111. package/esm2022/lib/services/calendar-day.service.js +37 -0
  112. package/esm2022/lib/services/calendar-day.service.js.map +1 -0
  113. package/esm2022/lib/services/calendar-nav.service.js +36 -0
  114. package/esm2022/lib/services/calendar-nav.service.js.map +1 -0
  115. package/esm2022/lib/services/calendar-space.js +152 -0
  116. package/esm2022/lib/services/calendar-space.js.map +1 -0
  117. package/esm2022/lib/services/calendar-types.js +52 -0
  118. package/esm2022/lib/services/calendar-types.js.map +1 -0
  119. package/esm2022/lib/services/calendarium-services.module.js +16 -0
  120. package/esm2022/lib/services/calendarium-services.module.js.map +1 -0
  121. package/esm2022/lib/services/calendarium-space.service.js +16 -0
  122. package/esm2022/lib/services/calendarium-space.service.js.map +1 -0
  123. package/esm2022/lib/services/happening.service.js +225 -0
  124. package/esm2022/lib/services/happening.service.js.map +1 -0
  125. package/esm2022/lib/services/index.js +6 -0
  126. package/esm2022/lib/services/index.js.map +1 -0
  127. package/esm2022/sneat-extensions-schedulus-shared.js +5 -0
  128. package/esm2022/sneat-extensions-schedulus-shared.js.map +1 -0
  129. package/index.d.ts +1 -0
  130. package/lib/components/calendar/calendar-base.component.d.ts +23 -0
  131. package/lib/components/calendar/calendar-brief.component.d.ts +11 -0
  132. package/lib/components/calendar/calendar-component-types.d.ts +1 -0
  133. package/lib/components/calendar/calendar-state.service.d.ts +15 -0
  134. package/lib/components/calendar/calendar.component.d.ts +32 -0
  135. package/lib/components/calendar/components/calendar-add-buttons/calendar-add-buttons.component.d.ts +13 -0
  136. package/lib/components/calendar/components/calendar-day/calendar-day-base.component.d.ts +10 -0
  137. package/lib/components/calendar/components/calendar-day/calendar-day-card.component.d.ts +17 -0
  138. package/lib/components/calendar/components/calendar-day/calendar-day-tab.component.d.ts +19 -0
  139. package/lib/components/calendar/components/calendar-day/calendar-day-title.component.d.ts +10 -0
  140. package/lib/components/calendar/components/calendar-day/calendar-day.component.d.ts +30 -0
  141. package/lib/components/calendar/components/calendar-filter/calendar-filter.component.d.ts +39 -0
  142. package/lib/components/calendar/components/calendar-filter/calendar-filter.d.ts +10 -0
  143. package/lib/components/calendar/components/calendar-filter/contacts-filter.component.d.ts +20 -0
  144. package/lib/components/calendar/components/calendar-week/calendar-week-card.component.d.ts +15 -0
  145. package/lib/components/calendar/components/calendar-week/calendar-week-tab.component.d.ts +9 -0
  146. package/lib/components/calendar/components/calendar-week/calendar-week-title.component.d.ts +7 -0
  147. package/lib/components/calendar/components/calendar-week/calendar-week.component.d.ts +20 -0
  148. package/lib/components/calendar/components/calendar-weekday/calendar-weekday.component.d.ts +23 -0
  149. package/lib/components/calendar/components/day-slot-item/day-slot-item.component.d.ts +19 -0
  150. package/lib/components/calendar/components/day-slot-item/slot-context-menu.component.d.ts +40 -0
  151. package/lib/components/calendar/components/recurrings-tab/recurrings-tab.component.d.ts +15 -0
  152. package/lib/components/calendar/components/singles-tab/single-happenings-list.component.d.ts +22 -0
  153. package/lib/components/calendar/components/singles-tab/singles-tab.component.d.ts +29 -0
  154. package/lib/components/calendar/components/timing-badge/timing-badge.component.d.ts +17 -0
  155. package/lib/components/calendar/weekday.d.ts +7 -0
  156. package/lib/components/calendar-core.d.ts +10 -0
  157. package/lib/components/calendar-filter.service.d.ts +8 -0
  158. package/lib/components/calendar-slots.d.ts +5 -0
  159. package/lib/components/happening-base.component.d.ts +46 -0
  160. package/lib/components/happening-card/happening-card.component.d.ts +11 -0
  161. package/lib/components/happening-component-base-params.d.ts +16 -0
  162. package/lib/components/happening-form/happening-form.component.d.ts +52 -0
  163. package/lib/components/happening-form/happening-price-form/happening-price-modal.component.d.ts +29 -0
  164. package/lib/components/happening-form/happening-prices/happening-prices.component.d.ts +16 -0
  165. package/lib/components/happening-participants/happening-participants.component.d.ts +24 -0
  166. package/lib/components/happening-slot-form/happening-slot-form.component.d.ts +76 -0
  167. package/lib/components/happening-slot-form/happening-slot-modal.component.d.ts +26 -0
  168. package/lib/components/happening-slot-form/happening-slot-modal.service.d.ts +18 -0
  169. package/lib/components/happening-slot-participants/happening-slot-participants.component.d.ts +19 -0
  170. package/lib/components/happening-slots/happening-slots.component.d.ts +28 -0
  171. package/lib/components/index.d.ts +5 -0
  172. package/lib/components/start-end-dates-range-form/start-end-dates-range-form.component.d.ts +16 -0
  173. package/lib/components/start-end-datetime-form/start-end-datetime-form.component.d.ts +53 -0
  174. package/lib/components/start-end-datetime-form/time-selector.component.d.ts +15 -0
  175. package/lib/components/swipeable-base.component.d.ts +25 -0
  176. package/lib/components/swipeable-ui.d.ts +24 -0
  177. package/lib/components/week.d.ts +4 -0
  178. package/lib/components/weekday-functions.d.ts +3 -0
  179. package/lib/components/weekdays/weekdays-form-base.d.ts +31 -0
  180. package/lib/index.d.ts +2 -0
  181. package/lib/modals/happening-title-modal/happening-title-modal.component.d.ts +24 -0
  182. package/lib/services/calendar-data-provider.d.ts +33 -0
  183. package/lib/services/calendar-day.d.ts +45 -0
  184. package/lib/services/calendar-day.service.d.ts +18 -0
  185. package/lib/services/calendar-nav.service.d.ts +14 -0
  186. package/lib/services/calendar-space.d.ts +23 -0
  187. package/lib/services/calendar-types.d.ts +10 -0
  188. package/lib/services/calendarium-services.module.d.ts +6 -0
  189. package/lib/services/calendarium-space.service.d.ts +8 -0
  190. package/lib/services/happening.service.d.ts +99 -0
  191. package/lib/services/index.d.ts +5 -0
  192. package/package.json +26 -0
  193. package/sneat-extensions-schedulus-shared.d.ts +5 -0
  194. package/tsconfig.lib.prod.tsbuildinfo +1 -0
@@ -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":"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","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<!--&lt;!&ndash;\t\t<ion-buttons slot=\"start\">&ndash;&gt;-->\n<!--&lt;!&ndash;\t\t\t<ion-button style=\"font-weight: bold\" (click)=\"select(hh, '00')\">{{hh}}:00</ion-button>&ndash;&gt;-->\n<!--&lt;!&ndash;\t\t</ion-buttons>&ndash;&gt;-->\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<!--&lt;!&ndash;\t\t<ion-buttons slot=\"start\">&ndash;&gt;-->\n<!--&lt;!&ndash;\t\t\t<ion-button style=\"font-weight: bold\" (click)=\"select(hh, '00')\">{{hh}}:00</ion-button>&ndash;&gt;-->\n<!--&lt;!&ndash;\t\t</ion-buttons>&ndash;&gt;-->\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<!--&lt;!&ndash;\t\t<ion-buttons slot=\"start\">&ndash;&gt;-->\n<!--&lt;!&ndash;\t\t\t<ion-button style=\"font-weight: bold\" (click)=\"select(hh, '00')\">{{hh}}:00</ion-button>&ndash;&gt;-->\n<!--&lt;!&ndash;\t\t</ion-buttons>&ndash;&gt;-->\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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=week.js.map
@@ -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,3 @@
1
+ export * from './components';
2
+ export * from './services';
3
+ //# sourceMappingURL=index.js.map
@@ -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"]}