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,524 +0,0 @@
1
- import React, { useState, useEffect, useRef, useReducer } from "react";
2
- import { css } from "@emotion/core";
3
-
4
- import * as connections from "../../helpers/connections";
5
- import { generateDummySlots, getSlotsForPage, calculateSlotHeight } from "../../helpers/slots";
6
- import { objectIsEmpty, uniqueItems } from "../../helpers/utils";
7
- import {
8
- addKeysToSlots,
9
- checkSelectedState,
10
- cropDaysToWindow,
11
- cropQuery,
12
- generatePageSlots,
13
- generateStaticPages,
14
- } from "../../helpers/utils.AvailabilityViewer";
15
- import { parseStyleOptions } from "../../helpers/theming";
16
- import { i18nConstructor } from "../../helpers/i18n";
17
- import { logConstructor } from "../../helpers/logging";
18
-
19
- import Footer from "./Footer";
20
- import WeekWrapper from "./WeekWrapper";
21
-
22
- import Container from "../generic/Container";
23
- import { pageReducer } from "./contexts/page-reducer";
24
- import { PagesProvider } from "./contexts/page-context";
25
- import { selectionReducer } from "./contexts/selection-reducer";
26
- import { SelectionProvider } from "./contexts/selection-context";
27
-
28
- export const LoggingContext = React.createContext();
29
- export const I18nContext = React.createContext();
30
- export const LimitsContext = React.createContext();
31
- export const MasterSlotsContext = React.createContext();
32
- export const SlotsContext = React.createContext();
33
- export const StatusContext = React.createContext();
34
- export const ThemeContext = React.createContext();
35
-
36
- const AvailabilityViewer = ({ options, error, eventCallback }) => {
37
- const [log, setLog] = useState(
38
- logConstructor(
39
- options.config.logs,
40
- "Availability Viewer",
41
- options.callback ? options.callback : false
42
- )
43
- );
44
-
45
- const [selection, dispatchSelection] = useReducer(selectionReducer, {
46
- selectedSlots: {},
47
- });
48
-
49
- const [theme, setTheme] = useState(() => ({
50
- ...parseStyleOptions({ ...options.styles }, "CronofyAvailabilityViewer"),
51
- slotHeightCalc: calculateSlotHeight({
52
- duration: options.query.required_duration
53
- ? options.query.required_duration.minutes
54
- : 60,
55
- interval: options.config.interval,
56
- }),
57
- sizes: {
58
- breakpoints: {
59
- small: 650,
60
- },
61
- columnWidth: 100,
62
- labelWidth: 60,
63
- labelWidthSmall: 24,
64
- wrapperWidth: false,
65
- wrapperUnderflow: 0,
66
- },
67
- }));
68
-
69
- const [i18n, setI18n] = useState(
70
- i18nConstructor({
71
- context: "availability_viewer",
72
- locale: options.locale,
73
- allPhrases: options.translations,
74
- tzid: options.tzid,
75
- })
76
- );
77
-
78
- const [status, setStatus] = useState({
79
- customtzid: options.customtzid,
80
- error: false,
81
- loading: true,
82
- locale: options.locale,
83
- mode: options.config.mode,
84
- boundsControl: options.config.boundsControl,
85
- maxSelection: options.config.max_selection_count
86
- ? parseInt(options.config.max_selection_count)
87
- : false,
88
- preloading: false,
89
- notificationCallback: options.callback
90
- ? options.callback
91
- : () => log.warn("No `callback` option has been provided"),
92
- slotSelection: options.config.slot_selection,
93
- tzid: options.tzid,
94
- pagesLoaded: [],
95
- startDay: options.config.startDay,
96
- allowExpansion: options.config.allowExpansion,
97
- });
98
-
99
- const [rawData, setRawData] = useState(false);
100
-
101
- const [slotData, setSlotData] = useState(generateDummySlots());
102
-
103
- const [pages, dispatchPages] = useReducer(
104
- pageReducer,
105
- generateStaticPages(options.query.query_periods, options.config.startDay, status.tzid)
106
- );
107
-
108
- const [slotsForPage, setSlotsForPage] = useState(() =>
109
- getSlotsForPage(slotData, pages.current)
110
- );
111
-
112
- const [limits, setLimits] = useState({
113
- duration: options.query ? options.query.required_duration.minutes : 60,
114
- start: options.config.start_time ? options.config.start_time : "09:00",
115
- end: options.config.end_time ? options.config.end_time : "17:30",
116
- interval: options.config.interval,
117
- });
118
-
119
- const debounceTimeout = useRef();
120
-
121
- const triggerSlotsForPage = () => {
122
- const slots = getSlotsForPage(slotData, pages.current);
123
- setSlotsForPage(slots);
124
- };
125
-
126
- // This is a wrapper for our `connections.getAvailability()` call.
127
- // We always want to handle errors the same way, but need to handle the response
128
- // differently depending on the scenario (checking visible period and updating
129
- // the grid, vs. checking all pages to test if *anything* is available).
130
- const handleGetAvailability = ({ query, callback }) => {
131
- connections
132
- .getAvailability(
133
- options.token,
134
- options.domains.apiDomain,
135
- query,
136
- `AvailabilityViewer`,
137
- status.tzid,
138
- options.demo
139
- )
140
- .then(res => {
141
- if (
142
- typeof res.available_slots === "undefined" &&
143
- typeof res.available_periods === "undefined"
144
- ) {
145
- throw {
146
- type: 400,
147
- message:
148
- "Check your `token`, `target`, and `query` params are correct. Full details can be found on the Cronofy Elements documention page: https://docs.cronofy.com/developers/ui-elements/",
149
- };
150
- }
151
- const response =
152
- query.response_format === "overlapping_slots"
153
- ? res.available_slots
154
- : res.available_periods;
155
-
156
- callback(response, query);
157
- })
158
- .catch(error => {
159
- setStatus({
160
- ...status,
161
- error,
162
- loading: false,
163
- preloading: false,
164
- });
165
-
166
- const errorMessage = error.message ? error.message : error;
167
- const errorOutput = {};
168
- if (error.docsSlug) {
169
- errorOutput.docsSlug = error.docsSlug;
170
- }
171
- if (error.body) {
172
- errorOutput.errorObject = error.body;
173
- }
174
- log.error(errorMessage, errorOutput);
175
- return error;
176
- });
177
- };
178
-
179
- const handleNormalAvailability = response => {
180
- if (response.length < 1) {
181
- // There isn't any availability for the selected
182
- // page. Check if *anything* is available...
183
- checkAllAvailability(options.query);
184
- } else {
185
- const notification = {
186
- notification: { type: "visible_slots" },
187
- };
188
- status.notificationCallback(notification);
189
- }
190
-
191
- // Happy path.
192
- // We've checked availability, there *is* availability, and
193
- // now we need to show that availability in the grid.
194
-
195
- const slotsWithKeys = addKeysToSlots(response);
196
-
197
- setRawData({ ...rawData, ...slotsWithKeys });
198
-
199
- const pagesLoaded = uniqueItems([...status.pagesLoaded, pages.current]);
200
-
201
- setStatus({
202
- ...status,
203
- error: false,
204
- loading: false,
205
- preloading: false,
206
- pagesLoaded,
207
- });
208
- };
209
-
210
- const handleFreeSelectAvailability = response => {
211
- const slotsWithKeys = addKeysToSlots(response);
212
- setRawData({ ...rawData, ...slotsWithKeys });
213
- const pagesLoaded = Array.from(Array(pages.total).keys()).map(i => i + 1);
214
- setStatus({
215
- ...status,
216
- error: false,
217
- loading: false,
218
- preloading: false,
219
- pagesLoaded,
220
- });
221
- };
222
-
223
- const handleEmptyAvailability = (empty, query) => {
224
- // Remove `max_results` from the query
225
- const { max_results, ...cleanQuery } = query;
226
-
227
- let notification;
228
- if (empty) {
229
- // There is no availability for any of the
230
- // pages shown in the viewer.
231
- notification = {
232
- notification: {
233
- type: "no_slots_found",
234
- query: cleanQuery,
235
- },
236
- };
237
- } else {
238
- // There is no availability for the page that
239
- // is currently visible, but there is at least
240
- // one free slot in one of the offscreen pages.
241
- notification = {
242
- notification: {
243
- type: "no_visible_slots",
244
- },
245
- };
246
- }
247
- status.notificationCallback(notification);
248
- };
249
-
250
- const checkAllAvailability = (query, days = false) => {
251
- // Ensure we're not querying more than 35 days.
252
- const croppedDays = cropDaysToWindow(days ? days : pages.days);
253
- // NOTE: if `days` is set then we're recurring and `days`
254
- // represents the remaining days to be queried. If `days`
255
- // is not set then this is the first time round, so we'll
256
- // use all the days from `pages`.
257
-
258
- // If there's an `overflow`, we'll want to keep recurring
259
- // until all the days have been queried (or until we find
260
- // an available slot).
261
- const recur = croppedDays.overflow.length > 0;
262
-
263
- // At this point we're only interested in the binary
264
- // question of has-availability/has-no-availability.
265
- // `max_results: 1` ensures we're making the most
266
- // light-weight request we can.
267
- const croppedQuery = cropQuery(
268
- { ...query, max_results: 1 },
269
- {
270
- currentPage: pages.current,
271
- days: croppedDays.days,
272
- startTime: limits.start,
273
- endTime: limits.end,
274
- tzid: status.tzid,
275
- },
276
- true // this is where we ignore page divisions
277
- );
278
-
279
- if (croppedQuery.query_periods.length < 1) return;
280
-
281
- handleGetAvailability({
282
- query: croppedQuery,
283
- callback: res => {
284
- if (res.length < 1) {
285
- if (recur) {
286
- return checkAllAvailability(query, croppedDays.overflow);
287
- }
288
- return handleEmptyAvailability(true, croppedQuery);
289
- }
290
- return handleEmptyAvailability(false, croppedQuery);
291
- },
292
- });
293
- };
294
-
295
- const triggerDataFetching = () => {
296
- if (!error) {
297
- if (status.mode === "free_select") {
298
- const freeSelectQuery = {
299
- ...options.query,
300
- max_results: 512,
301
- start_interval: { minutes: limits.interval },
302
- };
303
-
304
- return handleGetAvailability({
305
- query: freeSelectQuery,
306
- callback: handleFreeSelectAvailability,
307
- });
308
- }
309
-
310
- const emptyQuery = options.query.query_periods.length < 1;
311
-
312
- let query = {
313
- ...options.query,
314
- response_format: "overlapping_slots",
315
- start_interval: { minutes: limits.interval },
316
- };
317
-
318
- const croppedQuery = cropQuery(query, {
319
- currentPage: pages.current,
320
- days: pages.days,
321
- startTime: limits.start,
322
- endTime: limits.end,
323
- tzid: status.tzid,
324
- });
325
-
326
- if (croppedQuery.query_periods.length > 0) {
327
- // Happy Path.
328
- // Check the visible page's availability, and pass
329
- // the result into `handleNormalAvailability()`
330
- handleGetAvailability({
331
- query: croppedQuery,
332
- callback: handleNormalAvailability,
333
- });
334
- } else {
335
- if (!emptyQuery) {
336
- // If we get here, the query_periods are not within the visible window.
337
- // Empty queries will have triggered a `log.warn` earlier.
338
- log.info("The provided query_periods are not within the visible window");
339
- // Passing an empty array to `handleNormalAvailability()`
340
- // to trigger the page being updated when there is an empty week
341
- // in the middle of a query period.
342
- handleNormalAvailability([]);
343
- }
344
- if (status.slotSelection === "unrestricted" && emptyQuery) {
345
- setRawData([]);
346
- }
347
- setStatus({
348
- ...status,
349
- error: false,
350
- loading: false,
351
- preloading: false,
352
- });
353
- }
354
- } else {
355
- setStatus({
356
- ...status,
357
- error: {
358
- type: 400,
359
- message: "There was a problem with your initialization options.",
360
- },
361
- loading: false,
362
- });
363
- }
364
- };
365
-
366
- useEffect(() => {
367
- eventCallback(event => {
368
- dispatchPages({ type: event });
369
- });
370
- }, []);
371
-
372
- useEffect(() => {
373
- if (!pages.set) return;
374
-
375
- if (debounceTimeout.current) clearTimeout(debounceTimeout.current);
376
- debounceTimeout.current = setTimeout(() => {
377
- triggerSlotsForPage();
378
-
379
- if (rawData && status.mode === "free_select") {
380
- // We're in free_select and we've already got our rawData, so
381
- // let's reset the loading graphics and bail...
382
- setStatus(status => ({
383
- ...status,
384
- error: false,
385
- loading: false,
386
- preloading: false,
387
- }));
388
- return;
389
- }
390
- triggerDataFetching();
391
- }, 250);
392
- }, [pages]);
393
-
394
- useEffect(() => {
395
- const pageNotification = {
396
- notification: {
397
- type: "displayed_dates_changed",
398
- firstDay: slotsForPage[0]["day"],
399
- lastDay: slotsForPage[slotsForPage.length - 1]["day"],
400
- hasNext: pages.hasNext,
401
- hasPrev: pages.hasPrev,
402
- },
403
- };
404
- status.notificationCallback(pageNotification);
405
- }, [slotsForPage[0]["day"]]);
406
-
407
- useEffect(() => {
408
- triggerSlotsForPage();
409
- }, [slotData]);
410
-
411
- useEffect(() => {
412
- if (objectIsEmpty(rawData)) return;
413
-
414
- if (status.mode !== "free_select") {
415
- setStatus({
416
- ...status,
417
- error: false,
418
- loading: false,
419
- preloading: true,
420
- });
421
- triggerDataFetching();
422
- }
423
-
424
- if (status.mode === "free_select") {
425
- const slots = generatePageSlots({
426
- availablePeriods: rawData,
427
- selectedSlots: selection.selectedSlots,
428
- limits,
429
- pages,
430
- tzid: status.tzid,
431
- unrestricted: status.slotSelection === "unrestricted",
432
- freeSelect: status.mode === "free_select",
433
- });
434
- let updatedSlots = slots.slots;
435
- setSlotData(oldSlots => {
436
- if (status.mode === "free_select") {
437
- // If we're overriding the slots state (with `setSlotData`), then
438
- // We'll need to make sure we persit any "selected" slots.
439
- updatedSlots = checkSelectedState(slots.slots, oldSlots);
440
- }
441
- return updatedSlots;
442
- });
443
- }
444
- }, [limits]);
445
-
446
- useEffect(() => {
447
- if (rawData) {
448
- const slots = generatePageSlots({
449
- availablePeriods: rawData,
450
- selectedSlots: selection.selectedSlots,
451
- limits,
452
- pages,
453
- tzid: status.tzid,
454
- unrestricted: status.slotSelection === "unrestricted",
455
- freeSelect: status.mode === "free_select",
456
- });
457
- let updatedSlots = slots.slots;
458
- setSlotData(oldSlots => {
459
- if (status.mode === "free_select") {
460
- // If we're overriding the slots state (with `setSlotData`), then
461
- // We'll need to make sure we persit any "selected" slots.
462
- updatedSlots = checkSelectedState(slots.slots, oldSlots);
463
- }
464
- return updatedSlots;
465
- });
466
- }
467
- }, [rawData]);
468
-
469
- useEffect(() => {
470
- if (rawData && selection.selectedSlots && status.mode === "multi_select") {
471
- // Recalculate slots for collision detection
472
- const slots = generatePageSlots({
473
- availablePeriods: rawData,
474
- selectedSlots: selection.selectedSlots,
475
- limits,
476
- pages,
477
- tzid: status.tzid,
478
- unrestricted: status.slotSelection === "unrestricted",
479
- freeSelect: status.mode === "free_select",
480
- });
481
- let updatedSlots = slots.slots;
482
- setSlotData(updatedSlots);
483
- }
484
- }, [selection.selectedSlots]);
485
-
486
- return (
487
- <LoggingContext.Provider value={log}>
488
- <I18nContext.Provider value={i18n}>
489
- <ThemeContext.Provider value={[theme, setTheme]}>
490
- <StatusContext.Provider value={[status, setStatus]}>
491
- <MasterSlotsContext.Provider value={[slotData, setSlotData]}>
492
- <SelectionProvider
493
- value={selection.selectedSlots}
494
- dispatch={dispatchSelection}
495
- >
496
- <SlotsContext.Provider value={slotsForPage}>
497
- <LimitsContext.Provider value={[limits, setLimits]}>
498
- <Container
499
- height={"auto"}
500
- css={css`
501
- max-width: 100%;
502
- @media (max-width: 550px) {
503
- overflow: hidden;
504
- }
505
- `}
506
- className={`${theme.prefix}`}
507
- >
508
- <PagesProvider value={pages} dispatch={dispatchPages}>
509
- <WeekWrapper />
510
- <Footer />
511
- </PagesProvider>
512
- </Container>
513
- </LimitsContext.Provider>
514
- </SlotsContext.Provider>
515
- </SelectionProvider>
516
- </MasterSlotsContext.Provider>
517
- </StatusContext.Provider>
518
- </ThemeContext.Provider>
519
- </I18nContext.Provider>
520
- </LoggingContext.Provider>
521
- );
522
- };
523
-
524
- export default AvailabilityViewer;
@@ -1,35 +0,0 @@
1
- import React, { useContext } from "react";
2
- import { css } from "@emotion/core";
3
-
4
- import { ThemeContext } from "./AvailabilityViewer";
5
-
6
- const ColumnHeader = ({ dayNumber, dayName }) => {
7
- const [theme, setTheme] = useContext(ThemeContext);
8
- return (
9
- <div
10
- css={css`
11
- display: block;
12
- padding: 10px 4px;
13
- flex-grow: 1;
14
- flex-shrink: 1;
15
- width: 100%;
16
- text-align: center;
17
- `}
18
- className={`${theme.prefix}__column-header`}
19
- >
20
- <span
21
- css={css`
22
- @media (max-width: 550px) {
23
- display: block;
24
- }
25
- `}
26
- className={`${theme.prefix}__column-header__day`}
27
- >
28
- {dayName}
29
- </span>{" "}
30
- <span className={`${theme.prefix}__column-header__ordinal`}>{dayNumber}</span>
31
- </div>
32
- );
33
- };
34
-
35
- export default ColumnHeader;
@@ -1,36 +0,0 @@
1
- import React, { useContext } from "react";
2
- import { css } from "@emotion/core";
3
-
4
- import EmptyColumn from "./EmptyColumn";
5
- import Overlay from "./Overlay";
6
-
7
- import { ThemeContext } from "./AvailabilityViewer";
8
-
9
- const DayColumn = ({ day, columnCount, toggleMultiple = false }) => {
10
- const [theme, setTheme] = useContext(ThemeContext);
11
- return (
12
- <div
13
- css={css`
14
- width: ${theme.sizes.columnWidth}px;
15
- height: 100%;
16
- flex-grow: 0;
17
- display: flex;
18
- flex-direction: column;
19
- position: relative;
20
- `}
21
- >
22
- {day.slots.length > 0 ? (
23
- <Overlay
24
- columnCount={columnCount}
25
- day={day}
26
- stylePrefix={theme.prefix}
27
- toggleMultiple={toggleMultiple}
28
- />
29
- ) : (
30
- <EmptyColumn />
31
- )}
32
- </div>
33
- );
34
- };
35
-
36
- export default DayColumn;
@@ -1,33 +0,0 @@
1
- import React, { memo, useContext } from "react";
2
- import { css } from "@emotion/core";
3
-
4
- import Slots from "./Slots";
5
-
6
- import { ThemeContext } from "./AvailabilityViewer";
7
-
8
- let DayColumnDisplay = ({ day }) => {
9
- const [theme, setTheme] = useContext(ThemeContext);
10
- return (
11
- <div
12
- css={css`
13
- width: ${theme.sizes.columnWidth}px;
14
- height: 100%;
15
- flex-grow: 0;
16
- display: flex;
17
- flex-direction: column;
18
- border-right: 1px solid ${theme.colors.hairline};
19
- position: relative;
20
- &:last-of-type {
21
- border-right: none;
22
- }
23
- `}
24
- className={`${theme.prefix}__grid-column`}
25
- >
26
- <Slots day={day} />
27
- </div>
28
- );
29
- };
30
-
31
- DayColumnDisplay = memo(DayColumnDisplay);
32
-
33
- export default DayColumnDisplay;
@@ -1,29 +0,0 @@
1
- import React, { memo, useContext } from "react";
2
- import { css } from "@emotion/core";
3
-
4
- import { ThemeContext } from "./AvailabilityViewer";
5
-
6
- let DayColumnWrapper = ({ children, layer = 1 }) => {
7
- const [theme, setTheme] = useContext(ThemeContext);
8
- return (
9
- <div
10
- css={css`
11
- display: flex;
12
- justify-content: stretch;
13
- position: absolute;
14
- z-index: ${layer};
15
- top: 0;
16
- left: 0;
17
- width: 100%;
18
- height: 100%;
19
- `}
20
- className={`${theme.prefix}__grid-columns`}
21
- >
22
- {children}
23
- </div>
24
- );
25
- };
26
-
27
- DayColumnWrapper = memo(DayColumnWrapper);
28
-
29
- export default DayColumnWrapper;
@@ -1,41 +0,0 @@
1
- import React, { useContext } from "react";
2
- import { css } from "@emotion/core";
3
-
4
- import ColumnHeader from "./ColumnHeader";
5
-
6
- import { ThemeContext } from "./AvailabilityViewer";
7
- import { LabelsContext } from "./WeekWrapper";
8
-
9
- const DayLabels = () => {
10
- const labels = useContext(LabelsContext);
11
- const [theme, setTheme] = useContext(ThemeContext);
12
-
13
- const headers = labels.days.map(day => (
14
- <ColumnHeader key={`header__${day.date}`} dayNumber={day.number} dayName={day.name} />
15
- ));
16
-
17
- return (
18
- <div
19
- css={css`
20
- display: flex;
21
- justify-content: stretch;
22
- width: 100%;
23
- `}
24
- className={`${theme.prefix}__day-headers`}
25
- >
26
- <span
27
- css={css`
28
- width: ${theme.sizes.labelWidth}px;
29
- flex-grow: 0;
30
- flex-shrink: 0;
31
- @media (max-width: ${theme.sizes.breakpoints.small}px) {
32
- width: ${theme.sizes.labelWidthSmall}px;
33
- }
34
- `}
35
- />
36
- {headers}
37
- </div>
38
- );
39
- };
40
-
41
- export default DayLabels;