cronofy-elements 1.48.2 → 1.49.2

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 (349) hide show
  1. package/dist/.gitkeep +0 -0
  2. package/dist/CronofyElements.js +2 -0
  3. package/{build/CronofyElements.v1.48.2.js.LICENSE.txt → dist/CronofyElements.js.LICENSE.txt} +0 -0
  4. package/package.json +10 -7
  5. package/.babelrc +0 -20
  6. package/.eslintrc.yaml +0 -43
  7. package/.prettierignore +0 -4
  8. package/.prettierrc +0 -7
  9. package/Makefile +0 -92
  10. package/brainstorm.md +0 -76
  11. package/build/CronofyElements.v1.48.2.js +0 -2
  12. package/build/npm/CronofyElements.js +0 -2
  13. package/compat.config.js +0 -25
  14. package/demo/agenda.ejs +0 -71
  15. package/demo/availability-viewer.ejs +0 -322
  16. package/demo/calendar-sync.ejs +0 -149
  17. package/demo/crossbrowser.ejs +0 -228
  18. package/demo/date-time-picker.ejs +0 -213
  19. package/demo/demo-styles.css +0 -134
  20. package/demo/index.ejs +0 -249
  21. package/demo/integration.ejs +0 -482
  22. package/demo/load-elements.ejs +0 -12
  23. package/demo/nav.ejs +0 -14
  24. package/demo/rules.ejs +0 -121
  25. package/demo/server.js +0 -425
  26. package/demo/slot-picker.ejs +0 -197
  27. package/git.README.md +0 -71
  28. package/notes.style.md +0 -197
  29. package/postcss.config.js +0 -3
  30. package/script/i18n-export +0 -11
  31. package/script/i18n-helpers/split_write.rb +0 -25
  32. package/script/i18n-import +0 -22
  33. package/script/i18n-reference-update +0 -241
  34. package/src/js/components/Agenda/Agenda.js +0 -243
  35. package/src/js/components/Agenda/AllDayEventsList.js +0 -37
  36. package/src/js/components/Agenda/Calendar.js +0 -100
  37. package/src/js/components/Agenda/CalendarHeader.js +0 -187
  38. package/src/js/components/Agenda/Event.js +0 -34
  39. package/src/js/components/Agenda/EventAllDay.js +0 -76
  40. package/src/js/components/Agenda/EventAttendees.js +0 -30
  41. package/src/js/components/Agenda/EventDetail.js +0 -111
  42. package/src/js/components/Agenda/EventMessages.js +0 -24
  43. package/src/js/components/Agenda/EventMeta.js +0 -48
  44. package/src/js/components/Agenda/EventTime.js +0 -34
  45. package/src/js/components/Agenda/EventWrapper.js +0 -271
  46. package/src/js/components/Agenda/Location.js +0 -29
  47. package/src/js/components/Agenda/Message.js +0 -22
  48. package/src/js/components/Agenda/TimedEventsList.js +0 -29
  49. package/src/js/components/AvailabilityRules/AddButton.js +0 -60
  50. package/src/js/components/AvailabilityRules/AvailabilityRules.js +0 -45
  51. package/src/js/components/AvailabilityRules/Calendar.js +0 -31
  52. package/src/js/components/AvailabilityRules/CalendarListItem.js +0 -53
  53. package/src/js/components/AvailabilityRules/CalendarProfiles.js +0 -67
  54. package/src/js/components/AvailabilityRules/CalendarSelector.js +0 -104
  55. package/src/js/components/AvailabilityRules/Calendars.js +0 -145
  56. package/src/js/components/AvailabilityRules/Checkmark.js +0 -51
  57. package/src/js/components/AvailabilityRules/DayLabels.js +0 -91
  58. package/src/js/components/AvailabilityRules/Footer.js +0 -109
  59. package/src/js/components/AvailabilityRules/Legend.js +0 -57
  60. package/src/js/components/AvailabilityRules/Loading.js +0 -53
  61. package/src/js/components/AvailabilityRules/RemoveButton.js +0 -57
  62. package/src/js/components/AvailabilityRules/Slot.js +0 -195
  63. package/src/js/components/AvailabilityRules/SlotDisplay.js +0 -27
  64. package/src/js/components/AvailabilityRules/Slots.js +0 -81
  65. package/src/js/components/AvailabilityRules/SlotsDisplay.js +0 -68
  66. package/src/js/components/AvailabilityRules/TimeExpander.js +0 -119
  67. package/src/js/components/AvailabilityRules/TimeLabels.js +0 -89
  68. package/src/js/components/AvailabilityRules/TimeZoneDisplay.js +0 -41
  69. package/src/js/components/AvailabilityRules/ToggleIcon.js +0 -41
  70. package/src/js/components/AvailabilityRules/Tooltip.js +0 -63
  71. package/src/js/components/AvailabilityRules/UnknownCalendar.js +0 -33
  72. package/src/js/components/AvailabilityRules/Week.js +0 -115
  73. package/src/js/components/AvailabilityRules/WeekGrid.js +0 -80
  74. package/src/js/components/AvailabilityRules/Wrapper.js +0 -423
  75. package/src/js/components/AvailabilityRules/contexts/drag-context.js +0 -15
  76. package/src/js/components/AvailabilityRules/scss/_base.buttons.scss +0 -58
  77. package/src/js/components/AvailabilityRules/scss/_base.theme.scss +0 -4
  78. package/src/js/components/AvailabilityRules/scss/_components.timezoneselector.scss +0 -74
  79. package/src/js/components/AvailabilityRules/scss/_generic.reset.scss +0 -13
  80. package/src/js/components/AvailabilityRules/scss/_settings.colours.scss +0 -12
  81. package/src/js/components/AvailabilityRules/scss/availabilityrules.scss +0 -5
  82. package/src/js/components/AvailabilityRules/utils/tz-utils.js +0 -61
  83. package/src/js/components/AvailabilityViewer/AvailabilityViewer.js +0 -524
  84. package/src/js/components/AvailabilityViewer/ColumnHeader.js +0 -35
  85. package/src/js/components/AvailabilityViewer/DayColumn.js +0 -36
  86. package/src/js/components/AvailabilityViewer/DayColumnDisplay.js +0 -33
  87. package/src/js/components/AvailabilityViewer/DayColumnWrapper.js +0 -29
  88. package/src/js/components/AvailabilityViewer/DayLabels.js +0 -41
  89. package/src/js/components/AvailabilityViewer/EmptyColumn.js +0 -29
  90. package/src/js/components/AvailabilityViewer/Footer.js +0 -36
  91. package/src/js/components/AvailabilityViewer/GridFreeSelect.js +0 -33
  92. package/src/js/components/AvailabilityViewer/HoverSlot.js +0 -35
  93. package/src/js/components/AvailabilityViewer/HoverTooltip.js +0 -34
  94. package/src/js/components/AvailabilityViewer/LabelColumn.js +0 -53
  95. package/src/js/components/AvailabilityViewer/LabelItem.js +0 -73
  96. package/src/js/components/AvailabilityViewer/Legend.js +0 -79
  97. package/src/js/components/AvailabilityViewer/Loading.js +0 -57
  98. package/src/js/components/AvailabilityViewer/MonthLabels.js +0 -43
  99. package/src/js/components/AvailabilityViewer/Navigation.js +0 -138
  100. package/src/js/components/AvailabilityViewer/Overlay.js +0 -60
  101. package/src/js/components/AvailabilityViewer/Preloading.js +0 -66
  102. package/src/js/components/AvailabilityViewer/SelectedSlot.js +0 -106
  103. package/src/js/components/AvailabilityViewer/SelectedSlots.js +0 -72
  104. package/src/js/components/AvailabilityViewer/SelectionMask.js +0 -44
  105. package/src/js/components/AvailabilityViewer/Slot.js +0 -237
  106. package/src/js/components/AvailabilityViewer/SlotFreeSelect.js +0 -115
  107. package/src/js/components/AvailabilityViewer/Slots.js +0 -57
  108. package/src/js/components/AvailabilityViewer/TimeExpander.js +0 -93
  109. package/src/js/components/AvailabilityViewer/TimeLines.js +0 -74
  110. package/src/js/components/AvailabilityViewer/TimeSelector.js +0 -243
  111. package/src/js/components/AvailabilityViewer/TimeSelectorTrigger.js +0 -42
  112. package/src/js/components/AvailabilityViewer/TimeZoneDisplay.js +0 -28
  113. package/src/js/components/AvailabilityViewer/ToggleIcon.js +0 -41
  114. package/src/js/components/AvailabilityViewer/Tooltip.js +0 -65
  115. package/src/js/components/AvailabilityViewer/Week.js +0 -255
  116. package/src/js/components/AvailabilityViewer/WeekWrapper.js +0 -132
  117. package/src/js/components/AvailabilityViewer/contexts/page-context.js +0 -17
  118. package/src/js/components/AvailabilityViewer/contexts/page-reducer.js +0 -28
  119. package/src/js/components/AvailabilityViewer/contexts/selection-context.js +0 -25
  120. package/src/js/components/AvailabilityViewer/contexts/selection-reducer.js +0 -18
  121. package/src/js/components/CalendarSync/Active.js +0 -57
  122. package/src/js/components/CalendarSync/AddToggle.js +0 -72
  123. package/src/js/components/CalendarSync/CalendarSync.js +0 -215
  124. package/src/js/components/CalendarSync/EditToggle.js +0 -71
  125. package/src/js/components/CalendarSync/Footer.js +0 -31
  126. package/src/js/components/CalendarSync/Inactive.js +0 -66
  127. package/src/js/components/CalendarSync/Loading.js +0 -52
  128. package/src/js/components/CalendarSync/Pending.js +0 -74
  129. package/src/js/components/CalendarSync/ProfileStatus.js +0 -33
  130. package/src/js/components/CalendarSync/Profiles.js +0 -109
  131. package/src/js/components/CalendarSync/ProviderLogo.js +0 -28
  132. package/src/js/components/CalendarSync/Providers.js +0 -80
  133. package/src/js/components/CalendarSync/RemoveLink.js +0 -96
  134. package/src/js/components/CalendarSync/SelectProvider.js +0 -25
  135. package/src/js/components/CalendarSync/contexts/status-reducer.js +0 -74
  136. package/src/js/components/DateTimePicker/Calendar.js +0 -127
  137. package/src/js/components/DateTimePicker/CalendarHeader.js +0 -80
  138. package/src/js/components/DateTimePicker/Confirm.js +0 -106
  139. package/src/js/components/DateTimePicker/DateTimePicker.js +0 -131
  140. package/src/js/components/DateTimePicker/DayButton.js +0 -38
  141. package/src/js/components/DateTimePicker/DayHeadings.js +0 -33
  142. package/src/js/components/DateTimePicker/Details.js +0 -33
  143. package/src/js/components/DateTimePicker/Error.js +0 -39
  144. package/src/js/components/DateTimePicker/Loading.js +0 -20
  145. package/src/js/components/DateTimePicker/LoadingCalendar.js +0 -21
  146. package/src/js/components/DateTimePicker/NoSlotsFound.js +0 -16
  147. package/src/js/components/DateTimePicker/SequencedSlotButton.js +0 -97
  148. package/src/js/components/DateTimePicker/SlotButton.js +0 -55
  149. package/src/js/components/DateTimePicker/SlotsList.js +0 -45
  150. package/src/js/components/DateTimePicker/Wrapper.js +0 -281
  151. package/src/js/components/DateTimePicker/contexts/status-context.js +0 -19
  152. package/src/js/components/DateTimePicker/contexts/status-reducer.js +0 -276
  153. package/src/js/components/DateTimePicker/contexts/theme-context.js +0 -33
  154. package/src/js/components/DateTimePicker/helpers/theming.js +0 -49
  155. package/src/js/components/DateTimePicker/scss/_base.buttons.scss +0 -58
  156. package/src/js/components/DateTimePicker/scss/_base.layout.scss +0 -28
  157. package/src/js/components/DateTimePicker/scss/_base.theme.scss +0 -17
  158. package/src/js/components/DateTimePicker/scss/_components.calendargrid.scss +0 -78
  159. package/src/js/components/DateTimePicker/scss/_components.calendarheader.scss +0 -71
  160. package/src/js/components/DateTimePicker/scss/_components.confirm.scss +0 -40
  161. package/src/js/components/DateTimePicker/scss/_components.details.scss +0 -20
  162. package/src/js/components/DateTimePicker/scss/_components.error.scss +0 -34
  163. package/src/js/components/DateTimePicker/scss/_components.loading.scss +0 -36
  164. package/src/js/components/DateTimePicker/scss/_components.slotslist.scss +0 -43
  165. package/src/js/components/DateTimePicker/scss/_components.timezoneselector.scss +0 -73
  166. package/src/js/components/DateTimePicker/scss/_generic.reset.scss +0 -18
  167. package/src/js/components/DateTimePicker/scss/_settings.colours.scss +0 -17
  168. package/src/js/components/DateTimePicker/scss/datetimepicker.scss +0 -5
  169. package/src/js/components/DateTimePicker/utils/calendar-keyboard.js +0 -109
  170. package/src/js/components/DateTimePicker/utils/calendar.js +0 -125
  171. package/src/js/components/DateTimePicker/utils/slots.js +0 -288
  172. package/src/js/components/SlotPicker/Confirm.js +0 -160
  173. package/src/js/components/SlotPicker/Days.js +0 -58
  174. package/src/js/components/SlotPicker/Slot.js +0 -72
  175. package/src/js/components/SlotPicker/SlotPicker.js +0 -292
  176. package/src/js/components/SlotPicker/Slots.js +0 -66
  177. package/src/js/components/SlotPicker/TimeSlots.js +0 -91
  178. package/src/js/components/generic/Button.js +0 -26
  179. package/src/js/components/generic/Container.js +0 -33
  180. package/src/js/components/generic/Error.js +0 -77
  181. package/src/js/components/generic/Loading.js +0 -51
  182. package/src/js/components/generic/LoadingSpinner.js +0 -30
  183. package/src/js/components/generic/ShadowScrollbars.js +0 -70
  184. package/src/js/components/generic/TimeZoneSelector.js +0 -158
  185. package/src/js/components/generic/TransitionSlide.js +0 -72
  186. package/src/js/contexts/i18n-context.js +0 -25
  187. package/src/js/contexts/log-context.js +0 -18
  188. package/src/js/contexts/tz-context.js +0 -18
  189. package/src/js/env.example.js +0 -8
  190. package/src/js/helpers/colors.js +0 -33
  191. package/src/js/helpers/comparators.AvailabilityViewer.js +0 -27
  192. package/src/js/helpers/connections.js +0 -370
  193. package/src/js/helpers/events.js +0 -166
  194. package/src/js/helpers/functional.js +0 -4
  195. package/src/js/helpers/generator.js +0 -107
  196. package/src/js/helpers/i18n.js +0 -153
  197. package/src/js/helpers/init.Agenda.js +0 -55
  198. package/src/js/helpers/init.AvailabilityRules.js +0 -195
  199. package/src/js/helpers/init.AvailabilityViewer.js +0 -215
  200. package/src/js/helpers/init.CalendarSync.js +0 -83
  201. package/src/js/helpers/init.DateTimePicker.js +0 -219
  202. package/src/js/helpers/init.SlotPicker.js +0 -89
  203. package/src/js/helpers/init.js +0 -308
  204. package/src/js/helpers/logging.js +0 -78
  205. package/src/js/helpers/mocks.js +0 -871
  206. package/src/js/helpers/slots.js +0 -340
  207. package/src/js/helpers/slots.rules.js +0 -220
  208. package/src/js/helpers/theming.js +0 -93
  209. package/src/js/helpers/translations.js +0 -42
  210. package/src/js/helpers/tz-list.js +0 -136
  211. package/src/js/helpers/utils.AvailabilityRules.js +0 -110
  212. package/src/js/helpers/utils.AvailabilityViewer.js +0 -789
  213. package/src/js/helpers/utils.CalendarSync.js +0 -199
  214. package/src/js/helpers/utils.js +0 -76
  215. package/src/js/hooks/useWindowSize.js +0 -20
  216. package/src/js/main.js +0 -133
  217. package/src/js/next.js +0 -37
  218. package/src/js/styles/_settings.utils.scss +0 -82
  219. package/src/js/styles/colors.js +0 -13
  220. package/src/js/styles/global.js +0 -49
  221. package/src/js/styles/utils.js +0 -81
  222. package/src/js/translations/de/agenda.json +0 -12
  223. package/src/js/translations/de/availability_rules.json +0 -18
  224. package/src/js/translations/de/availability_viewer.json +0 -14
  225. package/src/js/translations/de/calendar_sync.json +0 -14
  226. package/src/js/translations/de/core.json +0 -15
  227. package/src/js/translations/de/date_time_picker.json +0 -14
  228. package/src/js/translations/de/slot_picker.json +0 -9
  229. package/src/js/translations/de/time_zones.json +0 -135
  230. package/src/js/translations/en/agenda.json +0 -12
  231. package/src/js/translations/en/availability_rules.json +0 -18
  232. package/src/js/translations/en/availability_viewer.json +0 -14
  233. package/src/js/translations/en/calendar_sync.json +0 -14
  234. package/src/js/translations/en/core.json +0 -23
  235. package/src/js/translations/en/date_time_picker.json +0 -15
  236. package/src/js/translations/en/slot_picker.json +0 -9
  237. package/src/js/translations/en/time_zones.json +0 -17
  238. package/src/js/translations/es/agenda.json +0 -12
  239. package/src/js/translations/es/availability_rules.json +0 -18
  240. package/src/js/translations/es/availability_viewer.json +0 -14
  241. package/src/js/translations/es/calendar_sync.json +0 -14
  242. package/src/js/translations/es/core.json +0 -15
  243. package/src/js/translations/es/date_time_picker.json +0 -14
  244. package/src/js/translations/es/slot_picker.json +0 -9
  245. package/src/js/translations/es/time_zones.json +0 -203
  246. package/src/js/translations/fr/agenda.json +0 -12
  247. package/src/js/translations/fr/availability_rules.json +0 -18
  248. package/src/js/translations/fr/availability_viewer.json +0 -14
  249. package/src/js/translations/fr/calendar_sync.json +0 -14
  250. package/src/js/translations/fr/core.json +0 -15
  251. package/src/js/translations/fr/date_time_picker.json +0 -14
  252. package/src/js/translations/fr/slot_picker.json +0 -9
  253. package/src/js/translations/fr/time_zones.json +0 -161
  254. package/src/js/translations/fr-CA/agenda.json +0 -12
  255. package/src/js/translations/fr-CA/availability_rules.json +0 -18
  256. package/src/js/translations/fr-CA/availability_viewer.json +0 -14
  257. package/src/js/translations/fr-CA/calendar_sync.json +0 -14
  258. package/src/js/translations/fr-CA/core.json +0 -23
  259. package/src/js/translations/fr-CA/date_time_picker.json +0 -14
  260. package/src/js/translations/fr-CA/slot_picker.json +0 -9
  261. package/src/js/translations/fr-CA/time_zones.json +0 -163
  262. package/src/js/translations/it/agenda.json +0 -12
  263. package/src/js/translations/it/availability_rules.json +0 -18
  264. package/src/js/translations/it/availability_viewer.json +0 -14
  265. package/src/js/translations/it/calendar_sync.json +0 -14
  266. package/src/js/translations/it/core.json +0 -15
  267. package/src/js/translations/it/date_time_picker.json +0 -14
  268. package/src/js/translations/it/slot_picker.json +0 -9
  269. package/src/js/translations/it/time_zones.json +0 -126
  270. package/src/js/translations/ja/agenda.json +0 -12
  271. package/src/js/translations/ja/availability_rules.json +0 -18
  272. package/src/js/translations/ja/availability_viewer.json +0 -14
  273. package/src/js/translations/ja/calendar_sync.json +0 -14
  274. package/src/js/translations/ja/core.json +0 -15
  275. package/src/js/translations/ja/date_formats.json +0 -5
  276. package/src/js/translations/ja/date_time_picker.json +0 -14
  277. package/src/js/translations/ja/slot_picker.json +0 -9
  278. package/src/js/translations/ja/time_zones.json +0 -435
  279. package/src/js/translations/nl/agenda.json +0 -12
  280. package/src/js/translations/nl/availability_rules.json +0 -18
  281. package/src/js/translations/nl/availability_viewer.json +0 -14
  282. package/src/js/translations/nl/calendar_sync.json +0 -14
  283. package/src/js/translations/nl/core.json +0 -15
  284. package/src/js/translations/nl/date_time_picker.json +0 -14
  285. package/src/js/translations/nl/slot_picker.json +0 -9
  286. package/src/js/translations/nl/time_zones.json +0 -118
  287. package/src/js/translations/ru/agenda.json +0 -12
  288. package/src/js/translations/ru/availability_rules.json +0 -18
  289. package/src/js/translations/ru/availability_viewer.json +0 -14
  290. package/src/js/translations/ru/calendar_sync.json +0 -14
  291. package/src/js/translations/ru/core.json +0 -15
  292. package/src/js/translations/ru/date_time_picker.json +0 -14
  293. package/src/js/translations/ru/slot_picker.json +0 -9
  294. package/src/js/translations/ru/time_zones.json +0 -435
  295. package/src/js/translations/sv/agenda.json +0 -12
  296. package/src/js/translations/sv/availability_rules.json +0 -18
  297. package/src/js/translations/sv/availability_viewer.json +0 -14
  298. package/src/js/translations/sv/calendar_sync.json +0 -14
  299. package/src/js/translations/sv/core.json +0 -15
  300. package/src/js/translations/sv/date_time_picker.json +0 -14
  301. package/src/js/translations/sv/slot_picker.json +0 -9
  302. package/src/js/translations/sv/time_zones.json +0 -136
  303. package/tests/AvailabilityRules/AvailabilityRules.test.js +0 -39
  304. package/tests/AvailabilityRules/__snapshots__/AvailabilityRules.test.js.snap +0 -1045
  305. package/tests/AvailabilityViewer/Navigation.test.js +0 -130
  306. package/tests/AvailabilityViewer/contexts/page-reducer.test.js +0 -87
  307. package/tests/AvailabilityViewer/reducer.test.js +0 -73
  308. package/tests/CalendarSync/Active.test.js +0 -25
  309. package/tests/CalendarSync/AddToggle.test.js +0 -57
  310. package/tests/CalendarSync/EditToggle.test.js +0 -57
  311. package/tests/CalendarSync/Inactive.test.js +0 -26
  312. package/tests/CalendarSync/Pending.test.js +0 -25
  313. package/tests/CalendarSync/ProviderLogo.test.js +0 -95
  314. package/tests/CalendarSync/__snapshots__/Active.test.js.snap +0 -61
  315. package/tests/CalendarSync/__snapshots__/Inactive.test.js.snap +0 -78
  316. package/tests/CalendarSync/__snapshots__/Pending.test.js.snap +0 -90
  317. package/tests/CalendarSync/__snapshots__/ProviderLogo.test.js.snap +0 -267
  318. package/tests/CalendarSync/init.CalendarSync.test.js +0 -302
  319. package/tests/CalendarSync/mocks/theme.js +0 -14
  320. package/tests/CalendarSync/status-reducer.test.js +0 -435
  321. package/tests/DateTimePicker/SequencedSlotButton.test.js +0 -157
  322. package/tests/DateTimePicker/SlotButton.test.js +0 -118
  323. package/tests/DateTimePicker/contexts/status-reducer.test.js +0 -1036
  324. package/tests/DateTimePicker/dummy-data.js +0 -883
  325. package/tests/DateTimePicker/utils.test.js +0 -515
  326. package/tests/colors.test.js +0 -70
  327. package/tests/components/TimezoneSelector.test.js +0 -124
  328. package/tests/components/main.test.js +0 -203
  329. package/tests/components/rtl-utils.js +0 -32
  330. package/tests/connections.test.js +0 -684
  331. package/tests/events.test.js +0 -472
  332. package/tests/generator.test.js +0 -74
  333. package/tests/i18n.test.js +0 -255
  334. package/tests/init.Agenda.test.js +0 -122
  335. package/tests/init.AvailabilityRules.test.js +0 -279
  336. package/tests/init.AvailabilityViewer.test.js +0 -740
  337. package/tests/init.SlotPicker.test.js +0 -166
  338. package/tests/init.test.js +0 -231
  339. package/tests/logging.test.js +0 -235
  340. package/tests/mocks/i18n.js +0 -3
  341. package/tests/mocks/theme.js +0 -3
  342. package/tests/setupJest.js +0 -8
  343. package/tests/slots.rules.test.js +0 -195
  344. package/tests/slots.test.js +0 -278
  345. package/tests/utils.AvailabilityRules.test.js +0 -221
  346. package/tests/utils.AvailabilityViewer.test.js +0 -1800
  347. package/tests/utils.CalendarSync.test.js +0 -277
  348. package/tests/utils.test.js +0 -119
  349. package/webpack.config.js +0 -114
@@ -1,281 +0,0 @@
1
- import React, { useEffect, useRef, useState } from "react";
2
- import moment from "moment";
3
-
4
- import { cropPeriodsArbitrarily, getSlots } from "./utils/slots";
5
-
6
- import Calendar from "./Calendar";
7
- import Confirm from "./Confirm";
8
- import Error from "./Error";
9
- import Details from "./Details";
10
- import Loading from "./Loading";
11
- import LoadingCalendar from "./LoadingCalendar";
12
- import NoSlotsFound from "./NoSlotsFound";
13
- import SlotsList from "./SlotsList";
14
-
15
- import { useStatus } from "./contexts/status-context";
16
- import { useTheme } from "./contexts/theme-context";
17
- import { useTz } from "../../contexts/tz-context";
18
-
19
- const Wrapper = () => {
20
- const [status, dispatchStatus] = useStatus();
21
- const [tz] = useTz();
22
- const theme = useTheme();
23
-
24
- const [loadingCalendar, setLoadingCalendar] = useState(true);
25
-
26
- const confirmButtonRef = useRef();
27
- const firstRender = useRef(true);
28
-
29
- const fetchMonthSlots = (query, month) => {
30
- return getSlots({
31
- query,
32
- auth: status.auth,
33
- tzid: status.tzid,
34
- sequence: status.sequenced_availability,
35
- })
36
- .then(res => {
37
- if (res.length < 512) {
38
- dispatchStatus({
39
- type: "SET_SLOTS",
40
- slots: res,
41
- tzid: tz.selectedTzid.tzid,
42
- month,
43
- });
44
- return;
45
- }
46
-
47
- dispatchStatus({
48
- type: "SET_SLOTS",
49
- slots: res,
50
- tzid: tz.selectedTzid.tzid,
51
- });
52
-
53
- // If we get here, the API has returned the maximum number
54
- // of slots allowed, so we need to crop the query and try
55
- // again to ensure we haven't missed any slots.
56
- const startOfLastSlot = res[res.length - 1].start;
57
- const endOfLastPeriod = query.query_periods[query.query_periods.length - 1].end;
58
-
59
- const boundsForCropping = {
60
- start: startOfLastSlot,
61
- end: endOfLastPeriod,
62
- };
63
-
64
- const croppedPeriods = cropPeriodsArbitrarily(
65
- query.query_periods,
66
- boundsForCropping
67
- );
68
- const croppedQuery = { ...query, query_periods: croppedPeriods };
69
-
70
- // Rerun the query
71
- return fetchMonthSlots(croppedQuery, month);
72
- })
73
- .catch(error => {
74
- if (error.type === 422) {
75
- dispatchStatus({
76
- type: "ERROR_LOADING_SLOTS",
77
- error,
78
- month,
79
- });
80
- return;
81
- }
82
- dispatchStatus({ type: "ERROR_GETTING_SLOTS", error });
83
- });
84
- };
85
-
86
- useEffect(() => {
87
- if (!status.query.query_periods) {
88
- return;
89
- }
90
-
91
- const currentMonth = status.months.find(m => m.current);
92
-
93
- const croppedMonths = status.months.filter(el => {
94
- return status.monthlyView.monthsInView.some(f => {
95
- return f === el.month && el.loading && !el.current;
96
- });
97
- });
98
-
99
- // Get slots for current month
100
- fetchMonthSlots(currentMonth.query, currentMonth.month)
101
- .then(() => {
102
- // Get slots for remaining months
103
- croppedMonths.forEach(month => fetchMonthSlots(month.query, month.month));
104
- })
105
- .catch(error => {
106
- dispatchStatus({ type: "ERROR_GETTING_SLOTS", error });
107
- });
108
- }, []);
109
-
110
- useEffect(() => {
111
- //stops this from firing on first render which would double up the initial API calls
112
- if (firstRender.current) {
113
- firstRender.current = false;
114
- return;
115
- }
116
- if (status.monthlyView.monthsInView) {
117
- //check if any of the months in view haven't been fetched yet
118
- const croppedMonths = status.months.filter(el => {
119
- return status.monthlyView.monthsInView.some(f => {
120
- return f === el.month && el.loading === true;
121
- });
122
- });
123
- //if they haven't, fetch them.
124
- if (croppedMonths.length > 0) {
125
- croppedMonths.forEach(month => fetchMonthSlots(month.query, month.month));
126
- }
127
- }
128
- }, [status.monthlyView.monthsInView]);
129
-
130
- useEffect(() => {
131
- if (!status.slotInjectionPoint) {
132
- return;
133
- }
134
-
135
- const weeksInMonth = status.monthlyView.days;
136
- const firstDay = moment(weeksInMonth[0][0].date, "YYYY-MM-DD");
137
- const lastWeekInMonth = weeksInMonth[weeksInMonth.length - 1];
138
- const lastDay = moment(lastWeekInMonth[lastWeekInMonth.length - 1].date, "YYYY-MM-DD");
139
-
140
- const injectionPoint = moment(status.slotInjectionPoint, "YYYY-MM-DD");
141
-
142
- if (!injectionPoint.isBetween(firstDay, lastDay, "day", "[]")) {
143
- return;
144
- }
145
-
146
- dispatchStatus({
147
- type: "RECALCULATE_MONTH_VIEW",
148
- tzid: tz.selectedTzid.tzid,
149
- });
150
- }, [status.slotInjectionPoint]);
151
-
152
- useEffect(() => {
153
- const fetchCount = status.slotFetchCount;
154
- const monthsCount = status.months.length;
155
- const finishedCallingAllSlots = fetchCount === monthsCount;
156
- const hasAvailableDays = status.availableDays.length;
157
-
158
- // No slots found but not all months called so try the next month
159
- if (!finishedCallingAllSlots && !hasAvailableDays && fetchCount >= 2) {
160
- const croppedMonths = status.months.filter(el => {
161
- return el.loading === true;
162
- });
163
- fetchMonthSlots(croppedMonths[0].query, croppedMonths[0].month);
164
- return;
165
- }
166
-
167
- // No slots available after all queries have been made
168
- if (finishedCallingAllSlots && !hasAvailableDays) {
169
- dispatchStatus({ type: "NO_SLOTS_FOUND" });
170
- return;
171
- }
172
-
173
- // Set selectedDay to first available day
174
- if (!status.selectedDay && hasAvailableDays) {
175
- dispatchStatus({
176
- type: "SELECT_DAY",
177
- day: status.availableDays[0],
178
- tzid: tz.selectedTzid.tzid,
179
- });
180
- return;
181
- }
182
-
183
- if (!status.selectedDay && !hasAvailableDays) {
184
- return;
185
- }
186
-
187
- // For allowing only this to be called once slots have been fetched
188
- // Since we know the first month that is being fetched will be for the initial selected day
189
- if (status.selectedDay && fetchCount >= 1 && !status.selected) {
190
- const currentMonth = moment(status.selectedDay, "YYYY-MM-DD").format("YYYY-MM");
191
- const month = status.months.filter(el => {
192
- return el.month === currentMonth;
193
- })[0];
194
- const monthStillLoading = month ? month.loading : false;
195
- const dayIsAvailable = status.availableDays.includes(status.selectedDay);
196
-
197
- //Only set the selectedDay if the month is finished loading or if the day has slots available
198
- if (!monthStillLoading || dayIsAvailable) {
199
- dispatchStatus({
200
- type: "SELECT_DAY",
201
- day: status.selectedDay,
202
- tzid: tz.selectedTzid.tzid,
203
- });
204
- return;
205
- }
206
- }
207
- }, [status.slotFetchCount, status.availableDays]);
208
-
209
- useEffect(() => {
210
- if (status.selectedDay) {
211
- const selectedDayParts = status.selectedDay.split("-");
212
- const currentMonthParts = status.monthlyView.month.split("-");
213
- const inCurrentMonth = currentMonthParts[1] === selectedDayParts[1];
214
-
215
- if (!inCurrentMonth) {
216
- const newMonth = moment(status.selectedDay, "YYYY-MM-DD").format("YYYY-MM");
217
- dispatchStatus({
218
- type: "SELECT_MONTH",
219
- month: newMonth,
220
- tzid: tz.selectedTzid.tzid,
221
- });
222
- }
223
- }
224
- }, [status.selectedDay]);
225
-
226
- useEffect(() => {
227
- if (status.columnView === "confirm") {
228
- confirmButtonRef.current.focus();
229
- }
230
- }, [status.columnView]);
231
-
232
- useEffect(() => {
233
- if (tz.selectedTzid.tzid) {
234
- dispatchStatus({ type: "SELECT_TZID", tzid: tz.selectedTzid.tzid });
235
- }
236
- }, [tz.selectedTzid.tzid]);
237
-
238
- useEffect(() => {
239
- if (status.months) {
240
- for (let month of status.monthlyView.monthsInView) {
241
- const monthLoading = status.months.find(m => m.month === month);
242
- if (monthLoading && monthLoading.loading) {
243
- setLoadingCalendar(true);
244
- return;
245
- } else {
246
- setLoadingCalendar(false);
247
- }
248
- }
249
- }
250
- }, [status.monthlyView, status.months]);
251
-
252
- return (
253
- <section className={theme.classBuilder()} style={theme.customProperties}>
254
- <Details duration={status.duration} locale={status.locale} />
255
- <div className={theme.classBuilder("wrapper")}>
256
- <div
257
- className={
258
- theme.classBuilder("column--left") +
259
- (status.slotFetchCount < 0
260
- ? ""
261
- : " " + theme.classBuilder(" column--calendar--no-slots"))
262
- }
263
- >
264
- <Calendar />
265
- {loadingCalendar && <LoadingCalendar />}
266
- </div>
267
- <div className={theme.classBuilder("column--right")}>
268
- {status.columnView === "error" && <Error />}
269
- {status.columnView === "loading" && <Loading />}
270
- {status.columnView === "no-slots" && <NoSlotsFound />}
271
- {status.columnView === "slots" && <SlotsList />}
272
- {status.columnView === "confirm" && (
273
- <Confirm confirmButtonRef={confirmButtonRef} />
274
- )}
275
- </div>
276
- </div>
277
- </section>
278
- );
279
- };
280
-
281
- export default Wrapper;
@@ -1,19 +0,0 @@
1
- import React, { createContext, useContext, useReducer } from "react";
2
-
3
- import { statusReducer } from "./status-reducer";
4
-
5
- const StatusContext = createContext();
6
-
7
- export const StatusProvider = ({ children, options }) => {
8
- const [status, dispatchStatus] = useReducer(statusReducer, options);
9
- return (
10
- <StatusContext.Provider value={[status, dispatchStatus]}>{children}</StatusContext.Provider>
11
- );
12
- };
13
- export const useStatus = () => {
14
- const context = useContext(StatusContext);
15
- if (context === undefined) {
16
- throw new Error("useStatus must be used within a StatusProvider");
17
- }
18
- return context;
19
- };
@@ -1,276 +0,0 @@
1
- import moment from "moment-timezone";
2
-
3
- import {
4
- addSlotsToObject,
5
- getSlotsByDay,
6
- getAvailableDays,
7
- getLocalDayFromUtc,
8
- removeMonthFromLoading,
9
- addSequencedSlotsToObject,
10
- } from "../utils/slots";
11
- import { getMonthsInDisplay, parseTimeSlots } from "../utils/calendar";
12
- import { uniqueItems } from "../../../helpers/utils";
13
-
14
- export const statusReducer = (state, action) => {
15
- const { type, ...actionBody } = action;
16
-
17
- const sendSlotNotification = tzid => {
18
- const notification = {
19
- notification: {
20
- type: "slot_selected",
21
- slot: state.selected,
22
- tzid: tzid,
23
- },
24
- };
25
- state.callback(notification);
26
- };
27
-
28
- switch (action.type) {
29
- case "CANCEL_SLOT_SELECTION": {
30
- return {
31
- ...state,
32
- columnView: "slots",
33
- focusedSlot: state.selected.start,
34
- selected: false,
35
- };
36
- }
37
-
38
- case "CONFIRM_SELECTION": {
39
- sendSlotNotification(action.tzid);
40
- return state;
41
- }
42
-
43
- case "ERROR_GETTING_SLOTS": {
44
- const notification = {
45
- notification: {
46
- type: "error",
47
- message: "There was an error getting the slots",
48
- body: action.error.body,
49
- },
50
- };
51
- state.callback(notification);
52
- return { ...state, error: action.error, columnView: "error" };
53
- }
54
-
55
- case "ERROR_LOADING_SLOTS": {
56
- const notification = {
57
- notification: {
58
- type: "error",
59
- message:
60
- "There was a problem with your availability query. Slots for the month of " +
61
- action.month +
62
- " could not be loaded.",
63
- body: action.error.body,
64
- },
65
- };
66
- const months = removeMonthFromLoading(state.months, action.month);
67
- state.callback(notification);
68
- return { ...state, months };
69
- }
70
-
71
- case "NO_SLOTS_FOUND": {
72
- const notification = {
73
- notification: {
74
- type: "no_slots_found",
75
- },
76
- };
77
- state.callback(notification);
78
- return { ...state, columnView: "no-slots" };
79
- }
80
-
81
- case "RECALCULATE_MONTH_VIEW": {
82
- const monthlyView = {
83
- month: state.monthlyView.month,
84
- hasNext: state.monthlyView.hasNext,
85
- hasPrev: state.monthlyView.hasPrev,
86
- monthsInView: state.monthlyView.monthsInView,
87
- days: parseTimeSlots({
88
- slots: state.slots,
89
- month: state.monthlyView.month,
90
- tzid: action.tzid,
91
- startDay: state.startDay,
92
- }),
93
- };
94
-
95
- return {
96
- ...state,
97
- monthlyView,
98
- };
99
- }
100
-
101
- case "SET_SLOTS": {
102
- if (!action.slots.length > 0) {
103
- const months = removeMonthFromLoading(state.months, action.month);
104
- return {
105
- ...state,
106
- months,
107
- slotFetchCount: state.slotFetchCount + 1,
108
- };
109
- }
110
-
111
- // Add action slots to state slots
112
- const slotsObject = state.sequenced_availability
113
- ? addSequencedSlotsToObject(state.slots, action.slots, state.query.sequence)
114
- : addSlotsToObject(state.slots, action.slots);
115
-
116
- // since we already know the available days for state slots
117
- // find available days for action.slots and add them to state availableDays
118
- // this way we don't have to loop through the entirety of the state slotsObject
119
- // every time new slots are rendered
120
- const actionSlotsObject = state.sequenced_availability
121
- ? addSequencedSlotsToObject({}, action.slots, [])
122
- : addSlotsToObject({}, action.slots);
123
-
124
- const availableDays = uniqueItems([
125
- ...state.availableDays,
126
- ...getAvailableDays(actionSlotsObject, action.tzid),
127
- ]).sort();
128
-
129
- // if month is passed in, we render that month as done
130
- // this change is for continiously loading slots as opposed to waiting for entire month
131
- // to be loaded
132
- let months = state.months;
133
- if (action.month) {
134
- months = removeMonthFromLoading(state.months, action.month);
135
- }
136
-
137
- const injectionPoint = state.sequenced_availability
138
- ? getLocalDayFromUtc(action.slots[0].sequence[0].start, action.tzid)
139
- : getLocalDayFromUtc(action.slots[0].start, action.tzid);
140
-
141
- return {
142
- ...state,
143
- availableDays,
144
- months,
145
- slots: slotsObject,
146
- slotFetchCount: state.slotFetchCount + 1,
147
- slotInjectionPoint: injectionPoint,
148
- };
149
- }
150
-
151
- case "SET_FOCUS": {
152
- return {
153
- ...state,
154
- focusedDay: action.focusedDay,
155
- };
156
- }
157
-
158
- case "SELECT_DAY": {
159
- const daySlots = getSlotsByDay(state.slots, action.day, action.tzid);
160
- const focusedSlot = state.sequenced_availability
161
- ? daySlots[0]?.reduce((prev, current) => {
162
- return prev.start < current.start ? prev.start : current.start;
163
- })
164
- : daySlots[0]?.start;
165
-
166
- return {
167
- ...state,
168
- selectedDay: action.day,
169
- focusedDay: action.day,
170
- focusedSlot: focusedSlot,
171
- columnView: "slots",
172
- daySlots,
173
- populated: true,
174
- };
175
- }
176
- case "SELECT_MONTH": {
177
- const actionMonthObject = moment(action.month, "YYYY-MM");
178
-
179
- if (
180
- !actionMonthObject.isBetween(
181
- state.startDateObject,
182
- state.endDateObject,
183
- "month",
184
- "[]"
185
- )
186
- ) {
187
- return state;
188
- }
189
-
190
- const months = state.months.map(month => ({
191
- ...month,
192
- current: month.month === action.month,
193
- }));
194
-
195
- const monthlyView = {
196
- month: action.month,
197
- hasNext: actionMonthObject.isBefore(state.endDateObject, "month"),
198
- hasPrev: actionMonthObject.isAfter(state.startDateObject, "month"),
199
- monthsInView: getMonthsInDisplay(action.month, state.startDay),
200
- days: parseTimeSlots({
201
- tzid: action.tzid,
202
- slots: state.slots,
203
- month: action.month,
204
- startDay: state.startDay,
205
- }),
206
- };
207
-
208
- let focusedDay = action.focusedDay ?? false;
209
-
210
- return {
211
- ...state,
212
- months,
213
- focusedDay,
214
- monthlyView,
215
- };
216
- }
217
-
218
- case "SELECT_SLOT": {
219
- state = {
220
- ...state,
221
- selected: action.slot,
222
- focusedSlot: action.slot.start,
223
- };
224
- if (state.mode === "no_confirm") {
225
- sendSlotNotification(action.tzid);
226
- } else {
227
- state.columnView = "confirm";
228
- }
229
- return state;
230
- }
231
-
232
- case "SELECT_TZID": {
233
- const availableDays = getAvailableDays(state.slots, action.tzid);
234
- const daySlots = getSlotsByDay(state.slots, state.selectedDay, action.tzid);
235
-
236
- const monthlyView = {
237
- month: state.monthlyView.month,
238
- hasNext: state.monthlyView.hasNext,
239
- hasPrev: state.monthlyView.hasPrev,
240
- monthsInView: state.monthlyView.monthsInView,
241
- days: parseTimeSlots({
242
- slots: state.slots,
243
- month: state.monthlyView.month,
244
- tzid: action.tzid,
245
- startDay: state.startDay,
246
- }),
247
- };
248
-
249
- state = {
250
- ...state,
251
- availableDays,
252
- daySlots,
253
- monthlyView,
254
- };
255
-
256
- if (state.selected.start) {
257
- const selectedDay = getLocalDayFromUtc(state.selected.start, action.tzid);
258
- const daySlots = getSlotsByDay(state.slots, selectedDay, action.tzid);
259
-
260
- state = {
261
- ...state,
262
- daySlots,
263
- selectedDay,
264
- focusedDay: selectedDay,
265
- };
266
-
267
- if (state.mode === "no_confirm") sendSlotNotification(action.tzid);
268
- }
269
-
270
- return state;
271
- }
272
- default: {
273
- throw new Error(`Unsupported action type: ${action.type}`);
274
- }
275
- }
276
- };
@@ -1,33 +0,0 @@
1
- import React, { createContext, useContext, useState } from "react";
2
-
3
- import { parseStyleOptions, parseCustomProperties, classBuilder } from "../helpers/theming";
4
-
5
- const ThemeContext = createContext();
6
-
7
- export const ThemeProvider = ({ children, options }) => {
8
- const style = {
9
- color: "red",
10
- };
11
- const [theme, setTheme] = useState(() => {
12
- const styles = parseStyleOptions(options.styles, options.name);
13
- const customProperties = parseCustomProperties(styles.colors);
14
- return {
15
- ...styles,
16
- customProperties,
17
- classBuilder: classBuilder(styles.prefix, options.name),
18
- };
19
- // customProperties: setCustomProperties(options.styles)
20
- });
21
- return (
22
- <ThemeContext.Provider style={style} value={theme}>
23
- {children}
24
- </ThemeContext.Provider>
25
- );
26
- };
27
- export const useTheme = () => {
28
- const context = useContext(ThemeContext);
29
- if (context === undefined) {
30
- throw new Error("useTheme must be used within a ThemeProvider");
31
- }
32
- return context;
33
- };
@@ -1,49 +0,0 @@
1
- import { objectToArray } from "../../../helpers/utils";
2
-
3
- export const logColor = color =>
4
- console.log(`%c ${color.padEnd(25, " ")} `, `background: ${color};`);
5
-
6
- export const parseStyleOptions = (styleOptions = {}, elementName = "CronofyElement") => {
7
- const colors = styleOptions.colors || {};
8
- //Coerce a misnamed option in an early version to avoid making a breaking change
9
- if (colors.buttonHoverText) {
10
- colors.buttonTextHover = colors.buttonTextHover
11
- ? colors.buttonTextHover
12
- : colors.buttonHoverText;
13
- delete colors.buttonHoverText;
14
- }
15
- const theme = {
16
- ...styleOptions,
17
- prefix: styleOptions.prefix || elementName,
18
- name: elementName,
19
- colors: {
20
- black: "#000000",
21
- white: "#ffffff",
22
- neutralDark: "#6f6f6f",
23
- neutral: "#999999",
24
- neutralLight: "#e4ebf2",
25
- button: "#ffffff",
26
- buttonConfirm: "#e2fac8",
27
- buttonHover: "#c0e992",
28
- buttonText: "#000000",
29
- buttonTextHover: "#000000",
30
- buttonActive: "#7ed321",
31
- buttonActiveText: "#000000",
32
- ...colors,
33
- },
34
- };
35
- return theme;
36
- };
37
-
38
- export const parseCustomProperties = colors =>
39
- objectToArray(colors)
40
- .filter(color => typeof color.value === "string")
41
- .map(color => ({ [`--${color.key}`]: color.value }))
42
- .reduce((acc, color) => ({ ...acc, ...color }), {});
43
-
44
- export const classBuilder = (prefix, name) => slugs => {
45
- if (!slugs) return `${prefix} ${name}`;
46
- const slugsList = slugs.split(" ");
47
- const className = slugsList.map(slug => `${prefix}__${slug} ${name}__${slug}`).join(" ");
48
- return className;
49
- };