@iamproperty/components 7.3.0 → 7.5.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 (327) hide show
  1. package/README.md +1 -1
  2. package/assets/css/components/actionbar.component.css +1 -1
  3. package/assets/css/components/actionbar.component.css.map +1 -1
  4. package/assets/css/components/actionbar.global.css +1 -1
  5. package/assets/css/components/actionbar.global.css.map +1 -1
  6. package/assets/css/components/address-lookup.component.css +1 -0
  7. package/assets/css/components/address-lookup.component.css.map +1 -0
  8. package/assets/css/components/barchart.component.css +1 -1
  9. package/assets/css/components/barchart.component.css.map +1 -1
  10. package/assets/css/components/calendar.component.css +1 -0
  11. package/assets/css/components/calendar.component.css.map +1 -0
  12. package/assets/css/components/calendar.config.css +1 -0
  13. package/assets/css/components/calendar.config.css.map +1 -0
  14. package/assets/css/components/card.component.css +1 -1
  15. package/assets/css/components/card.component.css.map +1 -1
  16. package/assets/css/components/carousel.component.css +1 -1
  17. package/assets/css/components/carousel.component.css.map +1 -1
  18. package/assets/css/components/charts.css +1 -1
  19. package/assets/css/components/charts.css.map +1 -1
  20. package/assets/css/components/collapsible-side.css +1 -1
  21. package/assets/css/components/collapsible-side.css.map +1 -1
  22. package/assets/css/components/content.component.css +1 -0
  23. package/assets/css/components/content.component.css.map +1 -0
  24. package/assets/css/components/darkmode.component.css +1 -0
  25. package/assets/css/components/darkmode.component.css.map +1 -0
  26. package/assets/css/components/doughnutchart.component.css +1 -1
  27. package/assets/css/components/doughnutchart.component.css.map +1 -1
  28. package/assets/css/components/fileupload.css.map +1 -1
  29. package/assets/css/components/inline-edit.css +1 -1
  30. package/assets/css/components/inline-edit.css.map +1 -1
  31. package/assets/css/components/marketing.component.css +1 -0
  32. package/assets/css/components/marketing.component.css.map +1 -0
  33. package/assets/css/components/menu.component.css.map +1 -1
  34. package/assets/css/components/{menu.css → menu.global.css} +1 -1
  35. package/assets/css/components/menu.global.css.map +1 -0
  36. package/assets/css/components/milestone.css +1 -0
  37. package/assets/css/components/milestone.css.map +1 -0
  38. package/assets/css/components/multi-step.component.css +1 -1
  39. package/assets/css/components/multi-step.component.css.map +1 -1
  40. package/assets/css/components/multiselect.css +1 -1
  41. package/assets/css/components/multiselect.css.map +1 -1
  42. package/assets/css/components/multiselect.preload.css +1 -1
  43. package/assets/css/components/multiselect.preload.css.map +1 -1
  44. package/assets/css/components/nav.component.css +1 -1
  45. package/assets/css/components/nav.component.css.map +1 -1
  46. package/assets/css/components/nav.global.css +1 -1
  47. package/assets/css/components/nav.global.css.map +1 -1
  48. package/assets/css/components/notification.css +1 -1
  49. package/assets/css/components/notification.css.map +1 -1
  50. package/assets/css/components/pagination.css.map +1 -1
  51. package/assets/css/components/property-searchbar.css +1 -1
  52. package/assets/css/components/property-searchbar.css.map +1 -1
  53. package/assets/css/components/rank.component.css +1 -1
  54. package/assets/css/components/rank.component.css.map +1 -1
  55. package/assets/css/components/rankings.component.css +1 -1
  56. package/assets/css/components/rankings.component.css.map +1 -1
  57. package/assets/css/components/rankings.global.css +1 -1
  58. package/assets/css/components/rankings.global.css.map +1 -1
  59. package/assets/css/components/slider.css.map +1 -1
  60. package/assets/css/components/split-button.component.css +1 -0
  61. package/assets/css/components/split-button.component.css.map +1 -0
  62. package/assets/css/components/word-count.component.css +1 -0
  63. package/assets/css/components/word-count.component.css.map +1 -0
  64. package/assets/css/core.min.css +1 -1
  65. package/assets/css/core.min.css.map +1 -1
  66. package/assets/css/mobile-core.min.css +1 -1
  67. package/assets/css/mobile-core.min.css.map +1 -1
  68. package/assets/css/mobile.min.css +1 -1
  69. package/assets/css/mobile.min.css.map +1 -1
  70. package/assets/css/style.min.css +1 -1
  71. package/assets/css/style.min.css.map +1 -1
  72. package/assets/js/components/accordion/accordion.component.js +40 -19
  73. package/assets/js/components/accordion/accordion.component.min.js +15 -15
  74. package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
  75. package/assets/js/components/actionbar/actionbar.component.js +59 -31
  76. package/assets/js/components/actionbar/actionbar.component.min.js +18 -17
  77. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  78. package/assets/js/components/address-lookup/address-lookup.component.js +6 -8
  79. package/assets/js/components/address-lookup/address-lookup.component.min.js +10 -12
  80. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  81. package/assets/js/components/advanced-select/advanced-select.component.js +63 -0
  82. package/assets/js/components/advanced-select/advanced-select.component.min.js +23 -0
  83. package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -0
  84. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  85. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  86. package/assets/js/components/barchart/barchart.component.min.js +2 -2
  87. package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
  88. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  89. package/assets/js/components/bento-grid/bento-grid.component.min.js.map +1 -1
  90. package/assets/js/components/calendar/calendar.component.js +1100 -0
  91. package/assets/js/components/calendar/calendar.component.min.js +170 -0
  92. package/assets/js/components/calendar/calendar.component.min.js.map +1 -0
  93. package/assets/js/components/card/card.component.js +14 -8
  94. package/assets/js/components/card/card.component.min.js +16 -10
  95. package/assets/js/components/card/card.component.min.js.map +1 -1
  96. package/assets/js/components/carousel/carousel.component.js +17 -19
  97. package/assets/js/components/carousel/carousel.component.min.js +17 -19
  98. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  99. package/assets/js/components/collapsible-side/collapsible-side.component.js +47 -12
  100. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +6 -5
  101. package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
  102. package/assets/js/components/content/content.component.js +66 -0
  103. package/assets/js/components/content/content.component.min.js +15 -0
  104. package/assets/js/components/content/content.component.min.js.map +1 -0
  105. package/assets/js/components/darkmode/darkmode.component.js +70 -0
  106. package/assets/js/components/darkmode/darkmode.component.min.js +10 -0
  107. package/assets/js/components/darkmode/darkmode.component.min.js.map +1 -0
  108. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +2 -2
  109. package/assets/js/components/doughnutchart/doughnutchart.component.min.js.map +1 -1
  110. package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
  111. package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
  112. package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
  113. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  114. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  115. package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
  116. package/assets/js/components/header/header.component.min.js +1 -1
  117. package/assets/js/components/header/header.component.min.js.map +1 -1
  118. package/assets/js/components/inline-edit/inline-edit.component.min.js +5 -5
  119. package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
  120. package/assets/js/components/marketing/marketing.component.js +1 -1
  121. package/assets/js/components/marketing/marketing.component.min.js +2 -2
  122. package/assets/js/components/marketing/marketing.component.min.js.map +1 -1
  123. package/assets/js/components/menu/menu.component.js +12 -4
  124. package/assets/js/components/menu/menu.component.min.js +4 -5
  125. package/assets/js/components/menu/menu.component.min.js.map +1 -1
  126. package/assets/js/components/milestone/milestone.component.js +36 -0
  127. package/assets/js/components/milestone/milestone.component.min.js +15 -0
  128. package/assets/js/components/milestone/milestone.component.min.js.map +1 -0
  129. package/assets/js/components/milestone-group/milestone-group.component.js +33 -0
  130. package/assets/js/components/milestone-group/milestone-group.component.min.js +13 -0
  131. package/assets/js/components/milestone-group/milestone-group.component.min.js.map +1 -0
  132. package/assets/js/components/multi-step/multi-step.component.min.js +3 -3
  133. package/assets/js/components/multi-step/multi-step.component.min.js.map +1 -1
  134. package/assets/js/components/multiselect/multiselect.component.js +54 -2
  135. package/assets/js/components/multiselect/multiselect.component.min.js +5 -5
  136. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  137. package/assets/js/components/nav/nav.component.js +18 -0
  138. package/assets/js/components/nav/nav.component.min.js +6 -6
  139. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  140. package/assets/js/components/notification/notification.component.js +15 -11
  141. package/assets/js/components/notification/notification.component.min.js +4 -4
  142. package/assets/js/components/notification/notification.component.min.js.map +1 -1
  143. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  144. package/assets/js/components/pagination/pagination.component.min.js.map +1 -1
  145. package/assets/js/components/rank/rank.component.js +346 -210
  146. package/assets/js/components/rank/rank.component.min.js +346 -211
  147. package/assets/js/components/rank/rank.component.min.js.map +1 -1
  148. package/assets/js/components/rankings/rankings.component.js +17 -8
  149. package/assets/js/components/rankings/rankings.component.min.js +14 -8
  150. package/assets/js/components/rankings/rankings.component.min.js.map +1 -1
  151. package/assets/js/components/record-card/record-card.component.min.js +1 -1
  152. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  153. package/assets/js/components/search/search.component.js +5 -3
  154. package/assets/js/components/search/search.component.min.js +6 -6
  155. package/assets/js/components/search/search.component.min.js.map +1 -1
  156. package/assets/js/components/slider/slider.component.min.js +1 -1
  157. package/assets/js/components/slider/slider.component.min.js.map +1 -1
  158. package/assets/js/components/split-button/split-button.component.js +58 -0
  159. package/assets/js/components/split-button/split-button.component.min.js +31 -0
  160. package/assets/js/components/split-button/split-button.component.min.js.map +1 -0
  161. package/assets/js/components/table/table.component.js +12 -0
  162. package/assets/js/components/table/table.component.min.js +3 -3
  163. package/assets/js/components/table/table.component.min.js.map +1 -1
  164. package/assets/js/components/table-ajax/table-ajax.component.js +12 -0
  165. package/assets/js/components/table-ajax/table-ajax.component.min.js +3 -3
  166. package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -1
  167. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  168. package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -1
  169. package/assets/js/components/table-no-submit/table-no-submit.component.js +12 -0
  170. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +3 -3
  171. package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -1
  172. package/assets/js/components/table-submit/table-submit.component.js +12 -0
  173. package/assets/js/components/table-submit/table-submit.component.min.js +3 -3
  174. package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -1
  175. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  176. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  177. package/assets/js/components/video-card/video-card.component.min.js +1 -1
  178. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  179. package/assets/js/components/word-count/word-count.component.js +81 -0
  180. package/assets/js/components/word-count/word-count.component.min.js +12 -0
  181. package/assets/js/components/word-count/word-count.component.min.js.map +1 -0
  182. package/assets/js/components.js +59 -0
  183. package/assets/js/modules/advanced-select.js +106 -0
  184. package/assets/js/modules/dialogs.js +53 -51
  185. package/assets/js/modules/dynamicEvents.js +7 -0
  186. package/assets/js/modules/inputs.js +0 -18
  187. package/assets/js/modules/milestone-group.js +30 -0
  188. package/assets/js/modules/milestone.js +89 -0
  189. package/assets/js/modules/table.js +11 -1
  190. package/assets/js/modules/videos.js +1 -1
  191. package/assets/js/scripts.bundle.js +3 -3
  192. package/assets/js/scripts.bundle.js.map +1 -1
  193. package/assets/js/scripts.bundle.min.js +2 -2
  194. package/assets/js/scripts.bundle.min.js.map +1 -1
  195. package/assets/js/scripts.js +5 -0
  196. package/assets/sass/_components.scss +15 -4
  197. package/assets/sass/_example.scss +1 -1
  198. package/assets/sass/_functions/utility-mixins.scss +40 -0
  199. package/assets/sass/_functions/variables.scss +11 -5
  200. package/assets/sass/components/actionbar.component.scss +23 -1
  201. package/assets/sass/components/actionbar.global.scss +5 -5
  202. package/assets/sass/components/{address-lookup.scss → address-lookup.component.scss} +10 -0
  203. package/assets/sass/components/calendar.component.scss +1272 -0
  204. package/assets/sass/components/calendar.config.scss +423 -0
  205. package/assets/sass/components/card.component.scss +4 -34
  206. package/assets/sass/components/carousel.component.scss +5 -0
  207. package/assets/sass/components/collapsible-side.scss +91 -95
  208. package/assets/sass/components/content.component.scss +18 -0
  209. package/assets/sass/components/darkmode.component.scss +22 -0
  210. package/assets/sass/components/inline-edit.scss +2 -0
  211. package/assets/sass/components/{marketing.scss → marketing.component.scss} +2 -6
  212. package/assets/sass/components/menu.component.scss +3 -8
  213. package/assets/sass/components/milestone.scss +216 -0
  214. package/assets/sass/components/multi-step.component.scss +1 -1
  215. package/assets/sass/components/multiselect.preload.scss +1 -1
  216. package/assets/sass/components/multiselect.scss +2 -0
  217. package/assets/sass/components/nav.component.scss +17 -6
  218. package/assets/sass/components/nav.global.scss +29 -3
  219. package/assets/sass/components/notification.scss +32 -13
  220. package/assets/sass/components/rank.component.scss +197 -24
  221. package/assets/sass/components/rankings.component.scss +38 -28
  222. package/assets/sass/components/rankings.global.scss +64 -2
  223. package/assets/sass/components/split-button.component.scss +79 -0
  224. package/assets/sass/components/table-basic.global.scss +32 -32
  225. package/assets/sass/components/word-count.component.scss +26 -0
  226. package/assets/sass/elements/admin-panel.scss +1 -1
  227. package/assets/sass/elements/badge-tag.scss +5 -1
  228. package/assets/sass/elements/buttons--compact.scss +4 -0
  229. package/assets/sass/elements/details.scss +33 -7
  230. package/assets/sass/elements/forms.scss +135 -28
  231. package/assets/sass/elements/links.scss +132 -4
  232. package/assets/sass/elements/lists.scss +62 -1
  233. package/assets/sass/elements/popover.scss +64 -10
  234. package/assets/sass/elements/toggle-button.scss +8 -8
  235. package/assets/sass/elements/type.scss +7 -10
  236. package/assets/sass/foundations/colours.scss +0 -0
  237. package/assets/sass/foundations/reboot.scss +8 -1
  238. package/assets/sass/foundations/root.scss +41 -51
  239. package/assets/sass/templates/form.scss +0 -2
  240. package/assets/ts/components/accordion/accordion.component.ts +47 -26
  241. package/assets/ts/components/actionbar/actionbar.component.ts +58 -22
  242. package/assets/ts/components/address-lookup/address-lookup.component.ts +6 -8
  243. package/assets/ts/components/advanced-select/advanced-select.component.ts +74 -0
  244. package/assets/ts/components/calendar/calendar.component.ts +1330 -0
  245. package/assets/ts/components/card/card.component.ts +15 -14
  246. package/assets/ts/components/carousel/carousel.component.ts +17 -19
  247. package/assets/ts/components/collapsible-side/collapsible-side.component.ts +53 -12
  248. package/assets/ts/components/content/content.component.ts +78 -0
  249. package/assets/ts/components/darkmode/darkmode.component.ts +85 -0
  250. package/assets/ts/components/marketing/marketing.component.ts +1 -1
  251. package/assets/ts/components/menu/menu.component.ts +18 -10
  252. package/assets/ts/components/milestone/milestone.component.ts +43 -0
  253. package/assets/ts/components/milestone-group/milestone-group.component.ts +39 -0
  254. package/assets/ts/components/multiselect/multiselect.component.ts +60 -3
  255. package/assets/ts/components/nav/nav.component.ts +18 -0
  256. package/assets/ts/components/notification/notification.component.ts +30 -11
  257. package/assets/ts/components/rank/rank.component.ts +345 -209
  258. package/assets/ts/components/rankings/rankings.component.ts +27 -8
  259. package/assets/ts/components/search/search.component.ts +6 -4
  260. package/assets/ts/components/split-button/split-button.component.ts +67 -0
  261. package/assets/ts/components/table/table.component.ts +14 -0
  262. package/assets/ts/components/table-ajax/table-ajax.component.ts +14 -0
  263. package/assets/ts/components/table-no-submit/table-no-submit.component.ts +14 -0
  264. package/assets/ts/components/table-submit/table-submit.component.ts +14 -0
  265. package/assets/ts/components/video-card/video-card.component.ts +2 -3
  266. package/assets/ts/components/word-count/word-count.component.ts +91 -0
  267. package/assets/ts/components.ts +64 -0
  268. package/assets/ts/modules/advanced-select.ts +120 -0
  269. package/assets/ts/modules/data-layer.md +0 -5
  270. package/assets/ts/modules/dialogs.ts +64 -61
  271. package/assets/ts/modules/dynamicEvents.ts +10 -0
  272. package/assets/ts/modules/inputs.ts +0 -25
  273. package/assets/ts/modules/milestone-group.ts +39 -0
  274. package/assets/ts/modules/milestone.ts +119 -0
  275. package/assets/ts/modules/table.ts +15 -1
  276. package/assets/ts/modules/videos.ts +19 -37
  277. package/assets/ts/scripts.ts +6 -3
  278. package/dist/components.es.js +849 -1079
  279. package/dist/components.umd.js +1052 -220
  280. package/package.json +6 -6
  281. package/src/components/Accordion/Accordion.vue +14 -23
  282. package/src/components/Accordion/AccordionItem.vue +27 -43
  283. package/src/components/Actionbar/Actionbar.vue +17 -19
  284. package/src/components/AddressLookup/AddressLookup.vue +17 -18
  285. package/src/components/AdvancedSelect/AdvancedSelect.vue +22 -0
  286. package/src/components/AppliedFilters/AppliedFilters.vue +16 -18
  287. package/src/components/Banner/Banner.vue +18 -21
  288. package/src/components/BarChart/BarChart.vue +17 -18
  289. package/src/components/Calendar/Calendar.vue +20 -0
  290. package/src/components/Card/Card.vue +17 -17
  291. package/src/components/Carousel/Carousel.vue +17 -20
  292. package/src/components/CollapsibleSideMenu/CollapsibleSideMenu.vue +7 -13
  293. package/src/components/Content/Content.vue +22 -0
  294. package/src/components/DarkMode/DarkMode.vue +19 -0
  295. package/src/components/DoughnutChart/DoughnutChart.vue +17 -18
  296. package/src/components/FileUpload/FileUpload.vue +22 -28
  297. package/src/components/FilterCard/FilterCard.vue +17 -18
  298. package/src/components/Filterlist/Filterlist.vue +17 -0
  299. package/src/components/Header/Header.vue +28 -29
  300. package/src/components/InlineEdit/InlineEdit.vue +11 -19
  301. package/src/components/Menu/Menu.vue +17 -17
  302. package/src/components/Milestones/Milestone.vue +22 -0
  303. package/src/components/Milestones/MilestoneGroup.vue +24 -0
  304. package/src/components/Multiselect/Multiselect.vue +17 -18
  305. package/src/components/Nav/Nav.vue +17 -19
  306. package/src/components/Notification/Notification.vue +17 -15
  307. package/src/components/Pagination/Pagination.vue +16 -16
  308. package/src/components/Rank/Rank.vue +17 -18
  309. package/src/components/Rankings/Rankings.vue +17 -27
  310. package/src/components/RecordCard/RecordCard.vue +17 -18
  311. package/src/components/Search/Search.vue +17 -17
  312. package/src/components/Slider/Slider.vue +17 -17
  313. package/src/components/SplitButton/README.md +19 -0
  314. package/src/components/SplitButton/SplitButton.vue +23 -0
  315. package/src/components/Tabs/Tabs.vue +17 -17
  316. package/src/components/VideoCard/VideoCard.vue +17 -18
  317. package/src/components/WordCount/WordCount.vue +22 -0
  318. package/src/index.js +2 -0
  319. package/assets/css/components/address-lookup.css +0 -1
  320. package/assets/css/components/address-lookup.css.map +0 -1
  321. package/assets/css/components/marketing.css +0 -1
  322. package/assets/css/components/marketing.css.map +0 -1
  323. package/assets/css/components/menu.css.map +0 -1
  324. package/assets/css/components/nav.old.css +0 -1
  325. package/assets/css/components/nav.old.css.map +0 -1
  326. package/assets/sass/components/nav.old.scss +0 -891
  327. /package/assets/sass/components/{menu.scss → menu.global.scss} +0 -0
@@ -0,0 +1,1100 @@
1
+ import { trackComponent, trackComponentRegistered } from '../_global.js';
2
+ import { uniqueID } from '../../modules/helpers.js';
3
+ trackComponentRegistered('iam-calendar');
4
+ class iamCalendar extends HTMLElement {
5
+ constructor() {
6
+ super();
7
+ this.attachShadow({ mode: 'open' });
8
+ const assetLocation = document.body.hasAttribute('data-assets-location')
9
+ ? document.body.getAttribute('data-assets-location')
10
+ : '/assets';
11
+ const loadCSS = `@import "${assetLocation}/css/components/calendar.component.css";`;
12
+ const weekViewOnly = `<table class="table--day" role="presentation"><tbody>
13
+ <tr class="allday"><th>All day</th></tr>
14
+ <tr><th data-hour="0">00</th></tr>
15
+ <tr><th data-hour="1">01</th></tr>
16
+ <tr><th data-hour="2">02</th></tr>
17
+ <tr><th data-hour="3">03</th></tr>
18
+ <tr><th data-hour="4">04</th></tr>
19
+ <tr><th data-hour="5">05</th></tr>
20
+ <tr><th data-hour="6">06</th></tr>
21
+ <tr><th data-hour="7">07</th></tr>
22
+ <tr><th data-hour="8">08</th></tr>
23
+ <tr><th data-hour="9">09</th></tr>
24
+ <tr><th data-hour="10">10</th></tr>
25
+ <tr><th data-hour="11">11</th></tr>
26
+ <tr><th data-hour="12">12</th></tr>
27
+ <tr><th data-hour="13">13</th></tr>
28
+ <tr><th data-hour="14">14</th></tr>
29
+ <tr><th data-hour="15">15</th></tr>
30
+ <tr><th data-hour="16">16</th></tr>
31
+ <tr><th data-hour="17">17</th></tr>
32
+ <tr><th data-hour="18">18</th></tr>
33
+ <tr><th data-hour="19">19</th></tr>
34
+ <tr><th data-hour="20">20</th></tr>
35
+ <tr><th data-hour="21">21</th></tr>
36
+ <tr><th data-hour="22">22</th></tr>
37
+ <tr><th data-hour="23">23</th></tr>
38
+ </tbody></table>`;
39
+ const template = document.createElement('template');
40
+ template.innerHTML = `
41
+ <style>
42
+ ${loadCSS}
43
+ ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
44
+ </style>
45
+ <div class="calendar__container">
46
+
47
+ <div class="calendar__controls">
48
+ <button id="today-button" class="btn btn-action">Today</button>
49
+
50
+
51
+ <button id="prev-button" class="btn btn-action fa-chevron-left border-0"><span class="visually-hidden">previous</span></button>
52
+ <div class="calendar__datepicker">
53
+ <span class="calendar__title"></span>
54
+ <input type="date" id="date" name="date" />
55
+ </div>
56
+ <button id="next-button" class="btn btn-action fa-chevron-right border-0"><span class="visually-hidden">Next</span></button>
57
+
58
+ <hr/>
59
+
60
+
61
+ <select name="view" id="view" class="btn btn-action">
62
+
63
+ <button>
64
+ <selectedcontent></selectedcontent> <i class="fa-regular fa-chevron-down"></i>
65
+ </button>
66
+
67
+ <option value="month"><i class="fa-light fa-calendar-days"></i>Month</option>
68
+ <option value="week"><i class="fa-light fa-calendar-week"></i>Week</option>
69
+ <option value="day"><i class="fa-light fa-calendar-day"></i>Day</option>
70
+ <option value="list"><i class="fa-light fa-list"></i>List</option>
71
+ <option value="year"><i class="fa-light fa-calendars"></i>Year</option>
72
+ </select>
73
+
74
+ <label class="tag tag--toggle"><input type="checkbox" name="split" value="true">Split view</label>
75
+
76
+ <button id="filters-button" class="btn btn-action"><i class="fa-light fa-sliders"></i><span class="visually-hidden">Filters</span></button>
77
+
78
+ <button id="settings-button" class="btn btn-action"><i class="fa-light fa-gear"></i><span class="visually-hidden">Settings</span></button>
79
+
80
+ </div>
81
+
82
+ <dialog id="settings">
83
+ <button class="dialog__close">Close</button>
84
+ <span class="h3">Calendar settings</span>
85
+
86
+ <fieldset id="workday" class="mb-5">
87
+ <label>Start time <span><input type="time" id="start-time" name="start-time" step="3600" value="08:00" /><span class="suffix fa-regular fa-clock" aria-hidden="true"></span></span></label>
88
+ <label>End time <span><input type="time" id="end-time" name="end-time" step="3600" value="18:00" /><span class="suffix fa-regular fa-clock" aria-hidden="true"></span></span></label>
89
+
90
+ </fieldset>
91
+
92
+ <hr/>
93
+ <fieldset>
94
+ <span class="label">Show weekends</span>
95
+ <input type="radio" name="weekends" id="weekends-yes" tabindex="-1">
96
+ <label for="weekends-yes" class="d-inline-block">Yes</label>
97
+ <input type="radio" name="weekends" id="weekends-no" tabindex="-1">
98
+ <label for="weekends-no" class="d-inline-block">No</label>
99
+ </fieldset>
100
+ <hr/>
101
+ <button class="btn btn-primary">Save settings</button>
102
+ <button class="btn btn-secondary">Cancel</button>
103
+
104
+ </dialog>
105
+
106
+
107
+ <div class="calendar__wrapper">
108
+
109
+ <div id="week-view-corner" class="calendar">
110
+ <table>
111
+ <thead>
112
+ <tr>
113
+ <th class="column-header">Empty</th>
114
+ </tr>
115
+ </thead>
116
+ <tbody>
117
+ <tr class="allday">
118
+ <th>All day</th>
119
+ </tr>
120
+ </tbody>
121
+ </table>
122
+ </div>
123
+
124
+ <div id="week-view-header" class="calendar">
125
+ <table>
126
+ <thead>
127
+ </thead>
128
+ <tbody>
129
+ </tbody>
130
+ </table>
131
+ </div>
132
+
133
+ <div id="week-view-side">${weekViewOnly}</div>
134
+
135
+ <div class="calendar month-wrapper" id="calendar" part="calendar">
136
+ <table>
137
+ <thead>
138
+ </thead>
139
+ <tbody>
140
+ </tbody>
141
+ </table>
142
+ </div>
143
+
144
+ <div id="year-view">
145
+ </div>
146
+ </div>
147
+
148
+
149
+ <slot></slot>
150
+
151
+ </div>
152
+ `;
153
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
154
+ this.monthArray = [
155
+ 'January',
156
+ 'February',
157
+ 'March',
158
+ 'April',
159
+ 'May',
160
+ 'June',
161
+ 'July',
162
+ 'August',
163
+ 'September',
164
+ 'October',
165
+ 'November',
166
+ 'December',
167
+ ];
168
+ this.dayArray = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
169
+ this.english_ordinal_rules = new Intl.PluralRules('en', { type: 'ordinal' });
170
+ this.suffixes = {
171
+ one: 'st',
172
+ two: 'nd',
173
+ few: 'rd',
174
+ other: 'th',
175
+ };
176
+ this.calendars = ['Default']; // TO DO allow for these to be set via the component data attributes
177
+ this.eventTypes = []; // TO DO allow for these to be set via the component data attributes
178
+ this.pauseObserver = false;
179
+ }
180
+ createThead(sundayFirst) {
181
+ if (sundayFirst)
182
+ return `<tr>
183
+ <th class="column-header sunday"><span class="long-day-name">Sunday</span><span class="short-day-name" role="presentation">Sun</span></th>
184
+ <th class="column-header monday"><span class="long-day-name">Monday</span><span class="short-day-name" role="presentation">Mon</span></th>
185
+ <th class="column-header tuesday"><span class="long-day-name">Tuesday</span><span class="short-day-name" role="presentation">Tues</span></th>
186
+ <th class="column-header wednesday"><span class="long-day-name">Wednesday</span><span class="short-day-name" role="presentation">Wed</span></th>
187
+ <th class="column-header thursday"><span class="long-day-name">Thursday</span><span class="short-day-name" role="presentation">Thurs</span></th>
188
+ <th class="column-header friday"><span class="long-day-name">Friday</span><span class="short-day-name" role="presentation">Fri</span></th>
189
+ <th class="column-header saturday"><span class="long-day-name">Saturday</span><span class="short-day-name" role="presentation">Sat</span></th>
190
+ </tr>`;
191
+ return `<tr>
192
+ <th class="column-header monday"><span class="long-day-name">Monday</span><span class="short-day-name" role="presentation">Mon</span></th>
193
+ <th class="column-header tuesday"><span class="long-day-name">Tuesday</span><span class="short-day-name" role="presentation">Tues</span></th>
194
+ <th class="column-header wednesday"><span class="long-day-name">Wednesday</span><span class="short-day-name" role="presentation">Wed</span></th>
195
+ <th class="column-header thursday"><span class="long-day-name">Thursday</span><span class="short-day-name" role="presentation">Thurs</span></th>
196
+ <th class="column-header friday"><span class="long-day-name">Friday</span><span class="short-day-name" role="presentation">Fri</span></th>
197
+ <th class="column-header saturday"><span class="long-day-name">Saturday</span><span class="short-day-name" role="presentation">Sat</span></th>
198
+ <th class="column-header sunday"><span class="long-day-name">Sunday</span><span class="short-day-name" role="presentation">Sun</span></th>
199
+ </tr>`;
200
+ }
201
+ numberDaysInMonth(year, month) {
202
+ return new Date(year, month, 0).getDate();
203
+ }
204
+ getOrdinalNumber(number) {
205
+ const category = this.english_ordinal_rules.select(number);
206
+ const suffix = this.suffixes[category];
207
+ return number + suffix;
208
+ }
209
+ setToMonday(date) {
210
+ const day = date.getDay() || 7;
211
+ if (day !== 1)
212
+ date.setHours(-24 * (day - 1));
213
+ return date;
214
+ }
215
+ setToSunday(date) {
216
+ const monday = this.setToMonday(date);
217
+ const sunday = new Date(monday);
218
+ sunday.setDate(sunday.getDate() + 6);
219
+ return sunday;
220
+ }
221
+ getTitle(dateStr, view) {
222
+ const date = new Date(dateStr);
223
+ const month = date.getMonth();
224
+ const year = date.getFullYear();
225
+ const day = date.getDate();
226
+ const dayOfWeek = date.getDay() ? date.getDay() : 7;
227
+ if (view == 'week') {
228
+ const monday = this.setToMonday(new Date(dateStr));
229
+ const sunday = this.setToSunday(new Date(dateStr));
230
+ const mondayMonth = monday.getMonth();
231
+ const mondayYear = monday.getFullYear();
232
+ const mondayDay = monday.getDate();
233
+ const sundayMonth = sunday.getMonth();
234
+ const sundayYear = sunday.getFullYear();
235
+ const sundayDay = sunday.getDate();
236
+ return `${this.getOrdinalNumber(mondayDay)} ${mondayMonth != sundayMonth ? this.monthArray[sundayMonth] : ''} ${mondayYear != sundayYear ? mondayYear : ''} - ${this.getOrdinalNumber(sundayDay)} ${this.monthArray[sundayMonth]} ${sundayYear}`;
237
+ }
238
+ else if (view == 'day') {
239
+ return `${this.dayArray[dayOfWeek]} ${this.getOrdinalNumber(day)} ${this.monthArray[month]} ${year}`;
240
+ }
241
+ else if (view == 'year') {
242
+ return `${year}`;
243
+ }
244
+ return `${this.monthArray[month]} ${year}`;
245
+ }
246
+ createCalendar(selectedDate, today, sundayFirst) {
247
+ const date = new Date(selectedDate);
248
+ const month = date.getMonth();
249
+ const year = date.getFullYear();
250
+ const day = date.getDate();
251
+ const selectedDateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
252
+ const daysThisMonth = this.numberDaysInMonth(year, month + 1);
253
+ const startOfMonth = new Date(`${year}-${String(month + 1).padStart(2, '0')}-01`);
254
+ const endOfMonth = new Date(`${year}-${String(month + 1).padStart(2, '0')}-${daysThisMonth}`);
255
+ const startDay = startOfMonth.getDay() != 0 ? startOfMonth.getDay() : 7;
256
+ const endDay = endOfMonth.getDay() != 0 ? endOfMonth.getDay() : 7;
257
+ const loopDays = daysThisMonth + startDay + (7 - endDay - 1);
258
+ // Get the previous month
259
+ const prevMonthDate = new Date(selectedDate);
260
+ prevMonthDate.setMonth(prevMonthDate.getMonth() - 1);
261
+ const prevMonth = prevMonthDate.getMonth();
262
+ const prevMonthYear = prevMonthDate.getFullYear();
263
+ const daysPrevMonth = this.numberDaysInMonth(year, month);
264
+ // Get the next month
265
+ const nextMonthDate = new Date(selectedDate);
266
+ nextMonthDate.setMonth(nextMonthDate.getMonth() + 1);
267
+ const nextMonth = nextMonthDate.getMonth();
268
+ const nextMonthYear = nextMonthDate.getFullYear();
269
+ // Get calendars
270
+ if (!this.hasAttribute('data-calendars')) {
271
+ Array.from(this.querySelectorAll('button[data-calendar]')).forEach((element) => {
272
+ // Scan through the buttons and look forunique calendar names
273
+ if (!this.calendars.includes(element.getAttribute('data-calendar')))
274
+ this.calendars.push(element.getAttribute('data-calendar'));
275
+ });
276
+ }
277
+ // Create tbody string by looping through the number of days in month plus some days before and after
278
+ let tbodyContent = `<tr>`;
279
+ for (let i = sundayFirst ? 0 : 1; i <= loopDays; i++) {
280
+ const loopDay = i - (startDay - 1);
281
+ const loopDate = `${year}-${String(month + 1).padStart(2, '0')}-${String(loopDay).padStart(2, '0')}`;
282
+ const dayOfWeek = i % 7;
283
+ tbodyContent += `<td class="day--${this.dayArray[dayOfWeek].toLowerCase()} ${loopDate == today ? 'today' : ''} ${loopDate == selectedDateStr ? 'selected' : ''} ${i < startDay ? 'prev-month' : ''} ${loopDay > daysThisMonth ? 'next-month' : ''}">`;
284
+ // prev month days
285
+ if (i < startDay) {
286
+ const adjustedLoopDay = daysPrevMonth - (startDay - 1 - i);
287
+ const adjustedLoopDate = `${prevMonthYear}-${String(prevMonth + 1).padStart(2, '0')}-${String(adjustedLoopDay).padStart(2, '0')}`;
288
+ tbodyContent += `<time class="column-header" datetime="${adjustedLoopDate}" title="${this.dayArray[dayOfWeek]} ${loopDay} ${this.monthArray[prevMonth]} ${year}"><span class="day-of-week">${this.dayArray[dayOfWeek]} </span><span class="day">${adjustedLoopDay}</span> <span class="month">${this.monthArray[prevMonth]}</span></time>`;
289
+ tbodyContent += this.addDay(adjustedLoopDate, this.calendars);
290
+ }
291
+ if (i >= startDay && loopDay <= daysThisMonth) {
292
+ tbodyContent += `<time class="column-header" datetime="${loopDate}" title="${this.dayArray[dayOfWeek]} ${loopDay} ${this.monthArray[month]} ${year}"><span class="day-of-week">${this.dayArray[dayOfWeek]} </span><span class="day">${loopDay}</span> <span class="month">${this.monthArray[month]}</span></time>`;
293
+ tbodyContent += this.addDay(loopDate, this.calendars);
294
+ }
295
+ // next month days
296
+ if (loopDay > daysThisMonth) {
297
+ const adjustedLoopDay = i - (startDay - 1) - daysThisMonth;
298
+ const adjustedLoopDate = `${nextMonthYear}-${String(nextMonth + 1).padStart(2, '0')}-${String(adjustedLoopDay).padStart(2, '0')}`;
299
+ tbodyContent += `<time class="column-header" datetime="${adjustedLoopDate}" title="${this.dayArray[dayOfWeek]} ${loopDay} ${this.monthArray[nextMonth]} ${year}"><span class="day-of-week">${this.dayArray[dayOfWeek]} </span><span class="day">${adjustedLoopDay}</span> <span class="month">${this.monthArray[nextMonth]}</span></time>`;
300
+ tbodyContent += this.addDay(adjustedLoopDate, this.calendars);
301
+ }
302
+ tbodyContent += '</td>';
303
+ // Close row and start a new one
304
+ if ((sundayFirst ? i + 1 : i) % 7 === 0 && i != loopDays) {
305
+ tbodyContent += `</tr><tr>`;
306
+ }
307
+ }
308
+ tbodyContent += '</tr>';
309
+ return tbodyContent;
310
+ }
311
+ addDay(day, calendars) {
312
+ let htmlTable = '<table class="table--day">';
313
+ htmlTable += `<thead><tr><th>time</th>`;
314
+ calendars.forEach((calendarTitle) => {
315
+ htmlTable += `<th class="column-header">${calendarTitle}</th>`;
316
+ });
317
+ htmlTable += `</tr></thead>`;
318
+ htmlTable += `<tbody>`;
319
+ htmlTable += `<tr class="allday"><th>All day</th>`;
320
+ calendars.forEach((calendarTitle) => {
321
+ htmlTable += `<td datetime="${day}" data-calendar="${calendarTitle}"><span datetime="${day}"></span></td>`;
322
+ });
323
+ htmlTable += `</tr>`;
324
+ for (let i = 0; i < 24; i++) {
325
+ htmlTable += `<tr class="hour${i}"><th data-hour="${i}">${i}${i < 12 ? 'am' : 'pm'}</th>`;
326
+ calendars.forEach((calendarTitle) => {
327
+ htmlTable += `<td datetime="${day}T${String(i).padStart(2, '0')}:00" data-calendar="${calendarTitle}"><span datetime="${day}T${String(i).padStart(2, '0')}:00"></span><span datetime="${day}T${String(i).padStart(2, '0')}:15"></span><span datetime="${day}T${String(i).padStart(2, '0')}:30"></span><span datetime="${day}T${String(i).padStart(2, '0')}:45"></span></td>`;
328
+ });
329
+ htmlTable += `</tr>`;
330
+ }
331
+ htmlTable += `</tbody>`;
332
+ htmlTable += '</table>';
333
+ return htmlTable;
334
+ }
335
+ addEvents() {
336
+ function setDefaultEventValues(component, element, index) {
337
+ const datetime = element.getAttribute('datetime');
338
+ const datetimeArr = datetime.split('T');
339
+ let id = element.getAttribute('id');
340
+ // Add ID
341
+ if (!element.hasAttribute('id')) {
342
+ id = `event${uniqueID(index)}`;
343
+ element.setAttribute('id', id);
344
+ }
345
+ // Wrap content in span for formatting in week/day view
346
+ if (!element.querySelector('span:not(.tooltip__content')) {
347
+ element.innerHTML = `<span>${element.innerHTML}</span>`;
348
+ }
349
+ // Add event type enum so we can set the correct colours
350
+ //if(!element.hasAttribute('data-event-type-enum') && element.hasAttribute('data-event-type')){
351
+ const eventType = element.getAttribute('data-event-type');
352
+ if (!component.eventTypes.includes(eventType))
353
+ component.eventTypes.push(eventType);
354
+ element.setAttribute('data-event-type-enum', component.eventTypes.indexOf(eventType) + 1);
355
+ //}
356
+ // Add calendar enum so we can set the correct colours
357
+ if (element.hasAttribute('data-calendar')) {
358
+ const calendar = element.getAttribute('data-calendar');
359
+ if (!component.calendars.includes(calendar))
360
+ component.calendars.push(calendar);
361
+ element.setAttribute('data-calendar-enum', component.calendars.indexOf(calendar) + 1);
362
+ }
363
+ if (!element.hasAttribute('data-calendar-enum')) {
364
+ element.setAttribute('data-calendar-enum', 1);
365
+ }
366
+ if (!element.hasAttribute('data-hours') && !element.hasAttribute('data-days')) {
367
+ if (datetimeArr[1]) {
368
+ element.setAttribute('data-hours', 1);
369
+ }
370
+ else {
371
+ element.setAttribute('data-days', 1);
372
+ }
373
+ }
374
+ const getRoundedDate = (minutes, d = new Date()) => {
375
+ const ms = 1000 * 60 * minutes; // convert minutes to ms
376
+ const roundedDate = new Date(Math.round(d.getTime() / ms) * ms);
377
+ const newMonth = roundedDate.getMonth();
378
+ const newYear = roundedDate.getFullYear();
379
+ const newDay = roundedDate.getDate();
380
+ const newMinutes = roundedDate.getMinutes();
381
+ const newHour = roundedDate.getHours();
382
+ const strRoundedDate = `${newYear}-${String(newMonth + 1).padStart(2, '0')}-${String(newDay).padStart(2, '0')}T${String(newHour).padStart(2, '0')}:${String(newMinutes).padStart(2, '0')}`;
383
+ return strRoundedDate;
384
+ };
385
+ if (datetimeArr[1]) {
386
+ element.setAttribute('data-start', datetimeArr[1]);
387
+ element.querySelector(':scope > span').setAttribute('data-start', datetimeArr[1]);
388
+ const roundedDatetime = getRoundedDate(15, new Date(datetime));
389
+ element.setAttribute('datetime', roundedDatetime);
390
+ }
391
+ if (element.querySelector('.tooltip__content')) {
392
+ const tooltip = element.querySelector('.tooltip__content');
393
+ tooltip.style.positionAnchor = `--${id}`;
394
+ element.style.anchorName = `--${id}`;
395
+ }
396
+ element.classList.add('defaults-added');
397
+ }
398
+ function adjustEvent(component, element, continued) {
399
+ var _a;
400
+ const datetime = element.getAttribute('datetime');
401
+ const date = new Date(datetime);
402
+ const dayOfWeek = date.getDay() ? date.getDay() : 7;
403
+ // Locate where we need to add slots for the buttons to go - We need duplicate slots for the split view and fixed header
404
+ const timeTd = component.shadowRoot.querySelector(`.month-wrapper .table--day td:has(span[datetime="${datetime}"])${element.hasAttribute('data-calendar') ? `[data-calendar="${element.getAttribute('data-calendar').replace('_', '')}"]` : ''}`);
405
+ const timeTdHeader = component.shadowRoot.querySelector(`#week-view-header .table--day td:has(span[datetime="${datetime}"])${element.hasAttribute('data-calendar') ? `[data-calendar="${element.getAttribute('data-calendar').replace('_', '')}"]` : ''}`);
406
+ if (timeTdHeader && timeTdHeader.closest('tr').classList.contains('allday')) {
407
+ // Add the alldays slot for the fixed header
408
+ if (!timeTdHeader.querySelector(`slot[name="${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}-header]"`)) {
409
+ timeTdHeader
410
+ .querySelector(`span[datetime="${datetime}"]`)
411
+ .insertAdjacentHTML('beforeEnd', `<slot name="${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}-header" class="${continued ? 'continued' : ''}"></slot>`);
412
+ }
413
+ }
414
+ const dateTd = (_a = timeTd === null || timeTd === void 0 ? void 0 : timeTd.parentElement) === null || _a === void 0 ? void 0 : _a.closest('td');
415
+ // original event needs a slot name adding
416
+ element.setAttribute('slot', `${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}`);
417
+ // Add matching slot to the event element to have it show in the correct place on the calendar
418
+ if (timeTd) {
419
+ // Add the default slot
420
+ if (!timeTd.querySelector(`slot[name="${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}"]`)) {
421
+ timeTd
422
+ .querySelector(`span[datetime="${datetime}"]`)
423
+ .insertAdjacentHTML('beforeEnd', `<slot name="${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}" class="${continued ? 'continued' : ''}"></slot>`);
424
+ }
425
+ // Set the classes need to create the grey bars in the mobile month view
426
+ const events = dateTd.hasAttribute('data-events') ? parseInt(dateTd.getAttribute('data-events')) : 0;
427
+ let hours = dateTd.hasAttribute('data-hours') ? parseFloat(dateTd.getAttribute('data-hours')) : 0;
428
+ hours += element.hasAttribute('data-hours') ? parseFloat(element.getAttribute('data-hours')) : 0;
429
+ dateTd.setAttribute('data-events', parseInt(events) + 1);
430
+ if (events + 1 > 2)
431
+ dateTd.setAttribute('data-more', parseInt(events) + 1 - 2);
432
+ dateTd.setAttribute('data-hours', hours);
433
+ dateTd.classList.add('has-event');
434
+ if (timeTd.closest('tr').classList.contains('has-event'))
435
+ timeTd.closest('tr').classList.add('multiple-event');
436
+ else
437
+ timeTd.closest('tr').classList.add('has-event');
438
+ if (hours > 2)
439
+ dateTd.classList.add('multi-events');
440
+ if (hours > 4)
441
+ dateTd.classList.add('busy-day');
442
+ if (element.hasAttribute('data-days'))
443
+ dateTd.classList.add('all-day');
444
+ if (element.classList.contains('continued'))
445
+ dateTd.classList.add('continued-day');
446
+ }
447
+ // Add CSS properties so we can control the size of the event elements for day and week view
448
+ if (element.hasAttribute('data-hours'))
449
+ element.style.setProperty('--event-height', `${parseInt(element.getAttribute('data-hours')) * (1.09375 * 4)}rem`);
450
+ if (element.hasAttribute('data-days') && !element.classList.contains('processed')) {
451
+ const eventDayTotal = element.getAttribute('data-days');
452
+ element.style.setProperty('--event-width', `${eventDayTotal * 100}%`);
453
+ element.style.setProperty('--event-max-width', `${(8 - dayOfWeek) * 100}%`);
454
+ element.classList.add('allday-event');
455
+ // Create a duplicate event for each day the orginal
456
+ for (let i = 1; i < eventDayTotal; i++) {
457
+ const cloneElement = element.cloneNode(true);
458
+ cloneElement.removeAttribute('data-days');
459
+ cloneElement.removeAttribute('style');
460
+ cloneElement.classList.add('continued');
461
+ cloneElement.classList.add('allday-event');
462
+ const id = `event${uniqueID(i)}`;
463
+ cloneElement.setAttribute('id', id);
464
+ if (cloneElement.querySelector('.tooltip__content')) {
465
+ const tooltip = cloneElement.querySelector('.tooltip__content');
466
+ tooltip.style.positionAnchor = `--${id}`;
467
+ cloneElement.style.anchorName = `--${id}`;
468
+ }
469
+ const newDate = new Date(datetime);
470
+ newDate.setDate(newDate.getDate() + i);
471
+ const newMonth = newDate.getMonth();
472
+ const newYear = newDate.getFullYear();
473
+ const newDay = newDate.getDate();
474
+ const newDayOfWeek = newDate.getDay() ? newDate.getDay() : 7;
475
+ const strCloneEvent = `${newYear}-${String(newMonth + 1).padStart(2, '0')}-${String(newDay).padStart(2, '0')}`;
476
+ cloneElement.setAttribute('data-original-datetime', element.getAttribute('datetime'));
477
+ cloneElement.setAttribute('datetime', strCloneEvent);
478
+ element.after(cloneElement); // Add after original
479
+ adjustEvent(component, cloneElement, true);
480
+ if (newDayOfWeek == 1) {
481
+ // Monday
482
+ cloneElement.style.setProperty('--event-width', `${(eventDayTotal - i) * 100}%`);
483
+ cloneElement.style.setProperty('--event-max-width', `${(8 - newDayOfWeek) * 100}%`);
484
+ cloneElement.classList.remove('continued');
485
+ }
486
+ }
487
+ }
488
+ // Add flag so we dont have to re-do the above
489
+ element.classList.add('processed');
490
+ }
491
+ this.pauseObserver = true;
492
+ Array.from(this.querySelectorAll('button[datetime]')).forEach((element, index) => {
493
+ setDefaultEventValues(this, element, index);
494
+ adjustEvent(this, element);
495
+ });
496
+ setTimeout(() => {
497
+ this.pauseObserver = false;
498
+ }, '500');
499
+ }
500
+ addJSEvents(component) {
501
+ var _a, _b, _c, _d, _e, _f, _g;
502
+ // Add events to the newly created calendar
503
+ const title = (_a = component.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.calendar__title');
504
+ const datePicker = (_b = component.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector(`#date`);
505
+ const viewPicker = (_c = component.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector(`#view`);
506
+ const yearView = (_d = this.shadowRoot) === null || _d === void 0 ? void 0 : _d.querySelector('#year-view');
507
+ const today = new Date();
508
+ const date = today.getDate();
509
+ const month = today.getMonth();
510
+ const year = today.getFullYear();
511
+ const strToday = `${year}-${String(month + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
512
+ const tbody = (_e = component.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelector('#calendar > table > tbody');
513
+ // clicking on the day istelf
514
+ Array.from(component.shadowRoot.querySelectorAll('.month-wrapper > table > tbody > tr > td:has(slot)')).forEach((element) => {
515
+ element.addEventListener('click', (event) => {
516
+ if (!event.target.matches('button')) {
517
+ const elementDate = element.querySelector('time').getAttribute('datetime');
518
+ datePicker.value = elementDate;
519
+ Array.from(tbody.querySelectorAll(':scope > tr > td')).forEach((innerelement) => {
520
+ innerelement.classList.remove('selected');
521
+ });
522
+ element.classList.add('selected');
523
+ // Go to day if the in month view with out split view enabled
524
+ if (component.shadowRoot.querySelector('[name="split"]:checked') && viewPicker.value == 'month') {
525
+ Array.from(component.querySelectorAll(`[data-slot]`)).forEach((button) => {
526
+ button.setAttribute('slot', button.getAttribute('data-slot'));
527
+ });
528
+ Array.from(component.querySelectorAll(`[slot^="${datePicker.value}"]`)).forEach((button) => {
529
+ button.setAttribute('data-slot', button.getAttribute('slot'));
530
+ button.removeAttribute('slot');
531
+ });
532
+ }
533
+ else if (!component.shadowRoot.querySelector('[name="split"]:checked') && viewPicker.value == 'month') {
534
+ viewPicker.value = 'day';
535
+ title === null || title === void 0 ? void 0 : title.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
536
+ component.scrollIntoPlace();
537
+ }
538
+ if (viewPicker.value == 'year') {
539
+ viewPicker.value = 'month';
540
+ yearView === null || yearView === void 0 ? void 0 : yearView.innerHTML = '';
541
+ tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML = component.createCalendar(datePicker.value, strToday);
542
+ component.addEvents();
543
+ }
544
+ }
545
+ });
546
+ });
547
+ // Drag and drop
548
+ (_f = component.shadowRoot) === null || _f === void 0 ? void 0 : _f.querySelectorAll(`#calendar .table--day td span`).forEach((element) => {
549
+ element.addEventListener('dragover', (ev) => {
550
+ ev.preventDefault();
551
+ return false;
552
+ });
553
+ element.addEventListener('dragenter', (ev) => {
554
+ ev.preventDefault();
555
+ element.classList.add('dragover');
556
+ });
557
+ element.addEventListener('dragleave', (ev) => {
558
+ ev.preventDefault();
559
+ element.classList.remove('dragover');
560
+ });
561
+ element.addEventListener('drop', (ev) => {
562
+ ev.preventDefault();
563
+ const droppedElement = component.querySelector(`#${ev.dataTransfer.getData('text')}`);
564
+ const td = element.closest('td');
565
+ const datetime = element.getAttribute('datetime');
566
+ element.classList.remove('dragover');
567
+ // Add a new slot to te span if needed
568
+ if (!element.querySelector(`slot[name="${datetime}${td.hasAttribute('data-calendar') ? `-${td.getAttribute('data-calendar').replace('_', '')}]` : ''}]"`)) {
569
+ element.insertAdjacentHTML('beforeEnd', `<slot name="${datetime}${td.hasAttribute('data-calendar') ? `-${td.getAttribute('data-calendar').replace('_', '')}` : ''}" class=""></slot>`);
570
+ }
571
+ // Update the slot attribute to match the slot the event has been dropped on
572
+ droppedElement === null || droppedElement === void 0 ? void 0 : droppedElement.setAttribute('slot', `${datetime}${td.hasAttribute('data-calendar') ? `-${td.getAttribute('data-calendar').replace('_', '')}` : ''}`);
573
+ });
574
+ });
575
+ // Watch for the event being resized
576
+ const resizeObserver = new ResizeObserver((entries) => {
577
+ for (const entry of entries) {
578
+ if (entry.target.classList.contains('mousedown'))
579
+ entry.target.classList.add('resizing');
580
+ }
581
+ });
582
+ if (component.hasAttribute('data-drag')) {
583
+ component.querySelectorAll(`button:not([draggable])`).forEach((element) => {
584
+ element.setAttribute('draggable', 'true');
585
+ element.addEventListener('dragstart', (ev) => {
586
+ ev.dataTransfer.setData('text', ev.target.id); // save the id for when dropped
587
+ });
588
+ // set onbserver
589
+ resizeObserver.observe(element);
590
+ element.addEventListener('mousedown', (ev) => {
591
+ element.classList.add('mousedown');
592
+ });
593
+ element.addEventListener('click', (ev) => {
594
+ if (element.classList.contains('resizing')) {
595
+ ev.stopPropagation();
596
+ ev.stopImmediatePropagation();
597
+ element.classList.remove('mousedown');
598
+ element.classList.remove('resizing');
599
+ // Work out the evnt length in hours and set the height
600
+ const span = this.shadowRoot.querySelector(`span[datetime="${element.getAttribute('datetime')}"]`);
601
+ const spanStyles = window.getComputedStyle(span);
602
+ const hours = Math.round(parseInt(element.style.height) / parseInt(spanStyles.getPropertyValue('height'))) / 4;
603
+ element.setAttribute('data-hours', hours);
604
+ element.style.setProperty('--event-height', `${hours * (1.09375 * 4)}rem`);
605
+ element.style.height = '';
606
+ // to do dispatch event
607
+ }
608
+ });
609
+ });
610
+ }
611
+ component.querySelectorAll(`button`).forEach((element) => {
612
+ element.addEventListener('contextmenu', (event) => {
613
+ event.preventDefault();
614
+ event.stopPropagation();
615
+ });
616
+ });
617
+ (_g = component.shadowRoot) === null || _g === void 0 ? void 0 : _g.querySelectorAll(`.month-wrapper > table > tbody > tr > td`).forEach((element) => {
618
+ element.addEventListener('contextmenu', (event) => {
619
+ event.preventDefault();
620
+ const customEvent = new CustomEvent('right-click', {
621
+ detail: {
622
+ clientX: event.clientX,
623
+ clientY: event.clientY,
624
+ element: element,
625
+ datetime: element.querySelector('time').getAttribute('datetime'),
626
+ },
627
+ });
628
+ console.log(element);
629
+ this.dispatchEvent(customEvent);
630
+ });
631
+ });
632
+ }
633
+ paginateDate(direction, view, currentDate) {
634
+ if (view == 'month' || view == 'list') {
635
+ const selectedDate = new Date(currentDate);
636
+ if (direction == 'next')
637
+ selectedDate.setMonth(selectedDate.getMonth() + 1);
638
+ else
639
+ selectedDate.setMonth(selectedDate.getMonth() - 1);
640
+ const month = selectedDate.getMonth() + 1;
641
+ const year = selectedDate.getFullYear();
642
+ const strNextMonth = `${year}-${String(month).padStart(2, '0')}-01`;
643
+ return strNextMonth;
644
+ }
645
+ else if (view == 'week') {
646
+ //const selectedDate = new Date(currentDate);
647
+ const monday = this.setToMonday(new Date(currentDate));
648
+ if (direction == 'next')
649
+ monday.setDate(monday.getDate() + 7);
650
+ else
651
+ monday.setDate(monday.getDate() - 7);
652
+ const date = monday.getDate();
653
+ const month = monday.getMonth() + 1;
654
+ const year = monday.getFullYear();
655
+ const strNextWeek = `${year}-${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
656
+ return strNextWeek;
657
+ }
658
+ else if (view == 'year') {
659
+ const selectedDate = new Date(currentDate);
660
+ if (direction == 'next')
661
+ selectedDate.setYear(selectedDate.getFullYear() + 1);
662
+ else
663
+ selectedDate.setYear(selectedDate.getFullYear() - 1);
664
+ const year = selectedDate.getFullYear();
665
+ const month = selectedDate.getMonth() + 1;
666
+ const strNextMonth = `${year}-${String(month).padStart(2, '0')}-01`;
667
+ return strNextMonth;
668
+ }
669
+ const nextDay = new Date(currentDate);
670
+ if (direction == 'next')
671
+ nextDay.setDate(nextDay.getDate() + 1);
672
+ else
673
+ nextDay.setDate(nextDay.getDate() - 1);
674
+ const date = nextDay.getDate();
675
+ const month = nextDay.getMonth() + 1;
676
+ const year = nextDay.getFullYear();
677
+ const strNextDay = `${year}-${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
678
+ return strNextDay;
679
+ }
680
+ setWeekDay() {
681
+ var _a, _b, _c, _d;
682
+ (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.out-of-hours').forEach((element) => {
683
+ element.classList.remove('out-of-hours');
684
+ });
685
+ const startTime = parseInt((_b = this.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#start-time').value.split(':')[0]);
686
+ const endTime = parseInt((_c = this.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#end-time').value.split(':')[0]);
687
+ (_d = this.shadowRoot) === null || _d === void 0 ? void 0 : _d.querySelectorAll('[data-hour]').forEach((element) => {
688
+ const hour = parseInt(element.getAttribute('data-hour'));
689
+ if (hour < startTime)
690
+ element.classList.add('out-of-hours');
691
+ if (hour >= endTime)
692
+ element.classList.add('out-of-hours');
693
+ });
694
+ }
695
+ scrollIntoPlace() {
696
+ var _a, _b;
697
+ const fs = parseInt(window.getComputedStyle(document.body).getPropertyValue('font-size'));
698
+ const startTime = parseInt((_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#start-time').value.split(':')[0]);
699
+ const scrollPos = startTime * (4.5 * fs);
700
+ const viewPicker = (_b = this.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector(`#view`);
701
+ const wrapper = this.shadowRoot.querySelector('.calendar__wrapper');
702
+ // scroll
703
+ if (viewPicker.value == 'week')
704
+ wrapper.scrollTo(0, scrollPos); // TO DO work out how much to scroll by
705
+ else if (viewPicker.value == 'day') {
706
+ wrapper.scrollTo(0, scrollPos); // TO DO work out how much to scroll by
707
+ }
708
+ }
709
+ setupSettings() {
710
+ var _a, _b;
711
+ const settingsButton = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#settings-button');
712
+ const settingsDialog = (_b = this.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#settings');
713
+ // Setup the pre-defined attributes and display the form elements to match
714
+ if (this.hasAttribute('data-hide-weekends'))
715
+ settingsDialog.querySelector('#weekends-no').checked = true;
716
+ else
717
+ settingsDialog.querySelector('#weekends-yes').checked = true;
718
+ if (this.hasAttribute('data-start-time'))
719
+ settingsDialog.querySelector('#start-time').value = this.getAttribute('data-start-time');
720
+ else
721
+ this.setAttribute('data-start-time', settingsDialog.querySelector('#start-time').value);
722
+ if (this.hasAttribute('data-end-time'))
723
+ settingsDialog.querySelector('#end-time').value = this.getAttribute('data-end-time');
724
+ else
725
+ this.setAttribute('data-end-time', settingsDialog.querySelector('#end-time').value);
726
+ // open dialog
727
+ settingsButton === null || settingsButton === void 0 ? void 0 : settingsButton.addEventListener('click', () => {
728
+ settingsDialog.showModal();
729
+ settingsDialog.focus();
730
+ const customEvent = new CustomEvent('open-settings');
731
+ this.dispatchEvent(customEvent);
732
+ });
733
+ // On clicking the save button, adjust the data attributes
734
+ settingsDialog === null || settingsDialog === void 0 ? void 0 : settingsDialog.addEventListener('click', (event) => {
735
+ if (event && event.target.matches('button')) {
736
+ if (event.target.matches('.btn-primary')) {
737
+ if (settingsDialog.querySelector('#weekends-no:checked'))
738
+ this.setAttribute('data-hide-weekends', 'true');
739
+ else
740
+ this.removeAttribute('data-hide-weekends');
741
+ this.setAttribute('data-start-time', settingsDialog.querySelector('#start-time').value);
742
+ this.setAttribute('data-end-time', settingsDialog.querySelector('#end-time').value);
743
+ this.setWeekDay();
744
+ const customEvent = new CustomEvent('save-settings');
745
+ this.dispatchEvent(customEvent);
746
+ }
747
+ const customEvent = new CustomEvent('close-settings');
748
+ this.dispatchEvent(customEvent);
749
+ settingsDialog.close();
750
+ }
751
+ });
752
+ }
753
+ setTime() {
754
+ var _a;
755
+ if (!this.hasAttribute('data-time')) {
756
+ const today = new Date();
757
+ const hour = today.getHours();
758
+ const minute = today.getMinutes();
759
+ const time = `${hour}:${minute}`;
760
+ this.setAttribute('data-time', time);
761
+ }
762
+ if (this.hasAttribute('data-time')) {
763
+ const time = this.getAttribute('data-time');
764
+ const hour = parseInt(time.split(':')[0]);
765
+ const minute = parseInt(time.split(':')[1]);
766
+ (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll(`[data-hour="${hour}"]`).forEach((element) => {
767
+ var _a;
768
+ element.setAttribute('data-time', time);
769
+ element.classList.add('column-header');
770
+ (_a = element.closest('tr')) === null || _a === void 0 ? void 0 : _a.style.setProperty('--minute-pos', (minute / 60) * 100 + '%');
771
+ });
772
+ }
773
+ }
774
+ getYearView(selectedDate, today, sundayFirst) {
775
+ let yearViewStr = '';
776
+ for (let i = 0; i < 12; i++) {
777
+ console.log(selectedDate);
778
+ const selectedDateObj = new Date(selectedDate);
779
+ const selectedYear = selectedDateObj.getFullYear();
780
+ const selectedFormattedDate = `${selectedYear}-${String(i + 1).padStart(2, '0')}-01`;
781
+ yearViewStr += `<div class='month-wrapper'>
782
+ <time class="column-header">${this.monthArray[i]}</time>
783
+ <table>
784
+ <thead>
785
+ ${this.createThead(sundayFirst)}
786
+ </thead>
787
+ <tbody>
788
+ ${this.createCalendar(selectedFormattedDate, today, sundayFirst)}
789
+ </tbody>
790
+ </table>
791
+ </div>`;
792
+ }
793
+ return yearViewStr;
794
+ }
795
+ connectedCallback() {
796
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
797
+ // To to transform the below into variables of component to make more re-usable
798
+ const title = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.calendar__title');
799
+ const tbody = (_b = this.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#calendar > table > tbody');
800
+ const thead = (_c = this.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#calendar > table > thead');
801
+ //const tbodySplit = this.shadowRoot?.querySelector('#split > table > tbody');
802
+ //const theadSplit = this.shadowRoot?.querySelector('#split > table > thead');
803
+ const weekViewHeader = (_d = this.shadowRoot) === null || _d === void 0 ? void 0 : _d.querySelector('#week-view-header > table > tbody');
804
+ const yearView = (_e = this.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelector('#year-view');
805
+ const datePicker = (_f = this.shadowRoot) === null || _f === void 0 ? void 0 : _f.querySelector(`#date`);
806
+ const viewPicker = (_g = this.shadowRoot) === null || _g === void 0 ? void 0 : _g.querySelector(`#view`);
807
+ const todayButton = (_h = this.shadowRoot) === null || _h === void 0 ? void 0 : _h.querySelector('#today-button');
808
+ const filtersButton = (_j = this.shadowRoot) === null || _j === void 0 ? void 0 : _j.querySelector('#filters-button');
809
+ const prevButton = (_k = this.shadowRoot) === null || _k === void 0 ? void 0 : _k.querySelector('#prev-button');
810
+ const nextButton = (_l = this.shadowRoot) === null || _l === void 0 ? void 0 : _l.querySelector('#next-button');
811
+ const sundayFirst = this.hasAttribute('data-sunday-first');
812
+ const splitButton = (_m = this.shadowRoot) === null || _m === void 0 ? void 0 : _m.querySelector(`[name="split"]`);
813
+ // set the table head - starting by monday by default but can be changed to sunday
814
+ thead === null || thead === void 0 ? void 0 : thead.innerHTML = this.createThead(sundayFirst);
815
+ //theadSplit?.innerHTML = this.createThead(sundayFirst);
816
+ // Get a formatted version of todays date
817
+ const today = new Date();
818
+ const date = today.getDate();
819
+ const month = today.getMonth();
820
+ const year = today.getFullYear();
821
+ const strToday = `${year}-${String(month + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
822
+ datePicker.value = strToday;
823
+ // Setup the view, month being default
824
+ if (this.hasAttribute('data-view'))
825
+ viewPicker.value = this.getAttribute('data-view');
826
+ else {
827
+ this.setAttribute('data-view', 'month');
828
+ viewPicker.value = 'month';
829
+ }
830
+ if (this.hasAttribute('data-views'))
831
+ viewPicker === null || viewPicker === void 0 ? void 0 : viewPicker.setAttribute('data-views', this.getAttribute('data-views'));
832
+ // Create the calendars
833
+ if (this.hasAttribute('data-calendars')) {
834
+ this.calendars = this.getAttribute('data-calendars').split(',');
835
+ this.calendars.forEach((item, index) => {
836
+ this.calendars[index] = item.trim();
837
+ });
838
+ }
839
+ // Setup the settings dialog
840
+ this.setupSettings();
841
+ // Setup the calendar then adjust and add events
842
+ title === null || title === void 0 ? void 0 : title.innerHTML = this.getTitle(strToday, viewPicker.value);
843
+ const calendarHtml = this.createCalendar(strToday, strToday, sundayFirst);
844
+ tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML = calendarHtml;
845
+ //tbodySplit?.innerHTML = calendarHtml;
846
+ weekViewHeader === null || weekViewHeader === void 0 ? void 0 : weekViewHeader.innerHTML = calendarHtml;
847
+ if (viewPicker.value == 'year') {
848
+ yearView === null || yearView === void 0 ? void 0 : yearView.innerHTML = this.getYearView(datePicker.value, strToday, sundayFirst);
849
+ tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML = '';
850
+ }
851
+ this.addEvents();
852
+ this.addJSEvents(this);
853
+ this.setWeekDay(); // Working hours
854
+ this.setTime(); // Month and day view has a current time indicator
855
+ this.scrollIntoPlace(); // Scroll into place - month and day view needs have the weekday hours in place
856
+ // #region Add events for the basic top controls
857
+ // Remove the slot attribute on selected days when in split mode
858
+ splitButton === null || splitButton === void 0 ? void 0 : splitButton.addEventListener('change', () => {
859
+ if (splitButton.checked) {
860
+ Array.from(this.querySelectorAll(`[slot^="${datePicker.value}"]`)).forEach((button) => {
861
+ button.setAttribute('data-slot', button.getAttribute('slot'));
862
+ button.removeAttribute('slot');
863
+ });
864
+ }
865
+ else {
866
+ Array.from(this.querySelectorAll(`[data-slot]`)).forEach((button) => {
867
+ button.setAttribute('slot', button.getAttribute('data-slot'));
868
+ });
869
+ }
870
+ });
871
+ const resizeObserver = new ResizeObserver((entries) => {
872
+ const splitButtonDisplayed = window.getComputedStyle(splitButton === null || splitButton === void 0 ? void 0 : splitButton.parentElement, null).display;
873
+ if (splitButtonDisplayed == 'none') {
874
+ Array.from(this.querySelectorAll(`[data-slot]`)).forEach((button) => {
875
+ button.setAttribute('slot', button.getAttribute('data-slot'));
876
+ });
877
+ splitButton.checked = false;
878
+ }
879
+ });
880
+ resizeObserver.observe(this);
881
+ viewPicker === null || viewPicker === void 0 ? void 0 : viewPicker.addEventListener('change', () => {
882
+ title === null || title === void 0 ? void 0 : title.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
883
+ this.setAttribute('data-view', viewPicker.value);
884
+ if (viewPicker.value == 'week') {
885
+ Array.from(this.querySelectorAll(`.allday-event`)).forEach((button) => {
886
+ button.setAttribute('slot', button.getAttribute('slot') + '-header');
887
+ });
888
+ }
889
+ else {
890
+ Array.from(this.querySelectorAll(`.allday-event`)).forEach((button) => {
891
+ var _a;
892
+ button.setAttribute('slot', (_a = button.getAttribute('slot')) === null || _a === void 0 ? void 0 : _a.replace('-header', ''));
893
+ });
894
+ }
895
+ if (viewPicker.value == 'week' || viewPicker.value == 'day')
896
+ this.scrollIntoPlace();
897
+ if (viewPicker.value != 'month') {
898
+ Array.from(this.querySelectorAll(`[data-slot^="${datePicker.value}"]`)).forEach((button) => {
899
+ button.setAttribute('slot', button.getAttribute('data-slot'));
900
+ });
901
+ }
902
+ if (viewPicker.value == 'year') {
903
+ yearView === null || yearView === void 0 ? void 0 : yearView.innerHTML = this.getYearView(datePicker.value, strToday, sundayFirst);
904
+ tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML = '';
905
+ this.addEvents();
906
+ this.addJSEvents(this);
907
+ this.setWeekDay(); // Working hours
908
+ this.setTime(); // Month and day view has a current time indicator
909
+ this.scrollIntoPlace();
910
+ }
911
+ else if ((tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML) == '') {
912
+ yearView === null || yearView === void 0 ? void 0 : yearView.innerHTML = '';
913
+ tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML = this.createCalendar(datePicker.value, strToday);
914
+ this.addEvents();
915
+ this.addJSEvents(this);
916
+ this.setWeekDay(); // Working hours
917
+ this.setTime(); // Month and day view has a current time indicator
918
+ this.scrollIntoPlace();
919
+ }
920
+ const customEvent = new CustomEvent('change-view', {
921
+ detail: {
922
+ view: viewPicker.value,
923
+ date: datePicker.value,
924
+ },
925
+ });
926
+ this.dispatchEvent(customEvent);
927
+ });
928
+ function resetCalendar(component) {
929
+ if (viewPicker.value == 'year') {
930
+ yearView === null || yearView === void 0 ? void 0 : yearView.innerHTML = component.getYearView(datePicker.value, strToday, sundayFirst);
931
+ tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML = '';
932
+ component.addEvents();
933
+ component.addJSEvents(component);
934
+ component.setWeekDay(); // Working hours
935
+ component.setTime(); // Month and day view has a current time indicator
936
+ }
937
+ else {
938
+ const calendarHtml = component.createCalendar(datePicker.value, strToday);
939
+ tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML = calendarHtml;
940
+ //tbodySplit?.innerHTML = calendarHtml;
941
+ weekViewHeader === null || weekViewHeader === void 0 ? void 0 : weekViewHeader.innerHTML = calendarHtml;
942
+ component.addEvents();
943
+ component.addJSEvents(component);
944
+ component.setWeekDay();
945
+ component.setTime();
946
+ }
947
+ }
948
+ function updateCalendar(component) {
949
+ Array.from(component.shadowRoot.querySelectorAll('.selected')).forEach((element) => {
950
+ element.classList.remove('selected');
951
+ });
952
+ Array.from(component.shadowRoot.querySelectorAll(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`)).forEach((element) => {
953
+ element.classList.add('selected');
954
+ });
955
+ }
956
+ datePicker === null || datePicker === void 0 ? void 0 : datePicker.addEventListener('change', () => {
957
+ title === null || title === void 0 ? void 0 : title.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
958
+ if (this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
959
+ updateCalendar(this);
960
+ else
961
+ resetCalendar(this);
962
+ const customEvent = new CustomEvent('change-date', {
963
+ detail: {
964
+ view: viewPicker.value,
965
+ date: datePicker.value,
966
+ },
967
+ });
968
+ this.dispatchEvent(customEvent);
969
+ });
970
+ filtersButton === null || filtersButton === void 0 ? void 0 : filtersButton.addEventListener('click', () => {
971
+ const customEvent = new CustomEvent('open-filters');
972
+ this.dispatchEvent(customEvent);
973
+ });
974
+ // HTML Observer
975
+ const htmlUpdated = (mutationList, observer) => {
976
+ observer.disconnect();
977
+ console.log(this.pauseObserver);
978
+ if (this.pauseObserver == false) {
979
+ for (const mutation of mutationList) {
980
+ if (mutation.type == 'characterData' ||
981
+ (mutation.type == 'childList' && mutation.addedNodes.length) ||
982
+ mutation.type === 'attributes') {
983
+ //resetCalendar(this);
984
+ this.addEvents();
985
+ }
986
+ }
987
+ }
988
+ observer.observe(this, { childList: true, characterData: true, subtree: true, attributes: true });
989
+ };
990
+ const observer = new MutationObserver(htmlUpdated);
991
+ observer.observe(this, { childList: true, characterData: true, subtree: true, attributes: true });
992
+ todayButton === null || todayButton === void 0 ? void 0 : todayButton.addEventListener('click', () => {
993
+ datePicker.value = strToday;
994
+ title === null || title === void 0 ? void 0 : title.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
995
+ if (this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
996
+ updateCalendar(this);
997
+ else
998
+ resetCalendar(this);
999
+ const customEvent = new CustomEvent('change-date-today', {
1000
+ detail: {
1001
+ view: viewPicker.value,
1002
+ date: datePicker.value,
1003
+ },
1004
+ });
1005
+ this.dispatchEvent(customEvent);
1006
+ });
1007
+ prevButton === null || prevButton === void 0 ? void 0 : prevButton.addEventListener('click', () => {
1008
+ datePicker.value = this.paginateDate('prev', viewPicker.value, datePicker.value);
1009
+ title === null || title === void 0 ? void 0 : title.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
1010
+ if (this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
1011
+ updateCalendar(this);
1012
+ else
1013
+ resetCalendar(this);
1014
+ const customEvent = new CustomEvent('change-date-previous', {
1015
+ detail: {
1016
+ view: viewPicker.value,
1017
+ date: datePicker.value,
1018
+ },
1019
+ });
1020
+ this.dispatchEvent(customEvent);
1021
+ });
1022
+ nextButton === null || nextButton === void 0 ? void 0 : nextButton.addEventListener('click', () => {
1023
+ datePicker.value = this.paginateDate('next', viewPicker.value, datePicker.value);
1024
+ title === null || title === void 0 ? void 0 : title.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
1025
+ console.log(datePicker.value);
1026
+ if (this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
1027
+ updateCalendar(this);
1028
+ else
1029
+ resetCalendar(this);
1030
+ const customEvent = new CustomEvent('change-date-next', {
1031
+ detail: {
1032
+ view: viewPicker.value,
1033
+ date: datePicker.value,
1034
+ },
1035
+ });
1036
+ this.dispatchEvent(customEvent);
1037
+ });
1038
+ // #endregion
1039
+ // TODO
1040
+ trackComponent(this, 'iam-calendar', [
1041
+ 'open-filters',
1042
+ 'change-view',
1043
+ 'change-date',
1044
+ 'change-date-today',
1045
+ 'change-date-previous',
1046
+ 'change-date-next',
1047
+ 'open-settings',
1048
+ 'close-settings',
1049
+ 'save-settings',
1050
+ ]);
1051
+ }
1052
+ static get observedAttributes() {
1053
+ return ['data-calendars', 'data-view'];
1054
+ }
1055
+ attributeChangedCallback(attrName, oldVal, newVal) {
1056
+ var _a, _b, _c, _d;
1057
+ this.pauseObserver = true;
1058
+ switch (attrName) {
1059
+ case 'data-calendars': {
1060
+ if (oldVal != newVal) {
1061
+ const tbody = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#calendar > table > tbody');
1062
+ const weekViewHeader = (_b = this.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#week-view-header > table > tbody');
1063
+ const datePicker = (_c = this.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector(`#date`);
1064
+ // Get a formatted version of todays date
1065
+ const today = new Date();
1066
+ const date = today.getDate();
1067
+ const month = today.getMonth();
1068
+ const year = today.getFullYear();
1069
+ const strToday = `${year}-${String(month + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
1070
+ if (this.hasAttribute('data-calendars')) {
1071
+ this.calendars = this.getAttribute('data-calendars').split(',');
1072
+ this.calendars.forEach((item, index) => {
1073
+ this.calendars[index] = item.trim();
1074
+ });
1075
+ }
1076
+ const calendarHtml = this.createCalendar(datePicker.value, strToday);
1077
+ tbody === null || tbody === void 0 ? void 0 : tbody.innerHTML = calendarHtml;
1078
+ weekViewHeader === null || weekViewHeader === void 0 ? void 0 : weekViewHeader.innerHTML = calendarHtml;
1079
+ this.addEvents();
1080
+ this.addJSEvents(this);
1081
+ this.setWeekDay();
1082
+ this.setTime();
1083
+ }
1084
+ break;
1085
+ }
1086
+ case 'data-view': {
1087
+ if (oldVal != newVal) {
1088
+ const viewPicker = (_d = this.shadowRoot) === null || _d === void 0 ? void 0 : _d.querySelector(`#view`);
1089
+ viewPicker.value = newVal;
1090
+ viewPicker.dispatchEvent(new Event('change'));
1091
+ }
1092
+ break;
1093
+ }
1094
+ }
1095
+ setTimeout(() => {
1096
+ this.pauseObserver = false;
1097
+ }, '500');
1098
+ }
1099
+ }
1100
+ export default iamCalendar;