@iamproperty/components 7.4.0 → 7.5.1--beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/assets/css/components/actionbar.component.css +1 -1
- package/assets/css/components/actionbar.component.css.map +1 -1
- package/assets/css/components/actionbar.global.css +1 -1
- package/assets/css/components/actionbar.global.css.map +1 -1
- package/assets/css/components/address-lookup.component.css +1 -0
- package/assets/css/components/address-lookup.component.css.map +1 -0
- package/assets/css/components/applied-filters.css +1 -1
- package/assets/css/components/applied-filters.css.map +1 -1
- package/assets/css/components/barchart.component.css +1 -1
- package/assets/css/components/barchart.component.css.map +1 -1
- package/assets/css/components/calendar.component.css +1 -1
- package/assets/css/components/calendar.component.css.map +1 -1
- package/assets/css/components/calendar.config.css.map +1 -1
- package/assets/css/components/card.component.css +1 -1
- package/assets/css/components/card.component.css.map +1 -1
- package/assets/css/components/carousel.component.css +1 -1
- package/assets/css/components/carousel.component.css.map +1 -1
- package/assets/css/components/charts.css +1 -1
- package/assets/css/components/charts.css.map +1 -1
- package/assets/css/components/collapsible-side.css +1 -1
- package/assets/css/components/collapsible-side.css.map +1 -1
- package/assets/css/components/content.component.css +1 -1
- package/assets/css/components/content.component.css.map +1 -1
- package/assets/css/components/darkmode.component.css +1 -0
- package/assets/css/components/darkmode.component.css.map +1 -0
- package/assets/css/components/doughnutchart.component.css +1 -1
- package/assets/css/components/doughnutchart.component.css.map +1 -1
- package/assets/css/components/fileupload.css +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/header.css +1 -1
- package/assets/css/components/header.css.map +1 -1
- package/assets/css/components/inline-edit.css +1 -1
- package/assets/css/components/inline-edit.css.map +1 -1
- package/assets/css/components/inline-edit.preload.css +1 -1
- package/assets/css/components/inline-edit.preload.css.map +1 -1
- package/assets/css/components/{menu.css → menu.global.css} +1 -1
- package/assets/css/components/menu.global.css.map +1 -0
- package/assets/css/components/milestone.css +1 -1
- package/assets/css/components/milestone.css.map +1 -1
- package/assets/css/components/multi-step.component.css +1 -1
- package/assets/css/components/multi-step.component.css.map +1 -1
- package/assets/css/components/multiselect.css +1 -1
- package/assets/css/components/multiselect.css.map +1 -1
- package/assets/css/components/multiselect.preload.css +1 -1
- package/assets/css/components/multiselect.preload.css.map +1 -1
- package/assets/css/components/nav.component.css +1 -1
- package/assets/css/components/nav.component.css.map +1 -1
- package/assets/css/components/nav.global.css +1 -1
- package/assets/css/components/nav.global.css.map +1 -1
- package/assets/css/components/notification.css +1 -1
- package/assets/css/components/notification.css.map +1 -1
- package/assets/css/components/pagination.css +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/property-searchbar.css +1 -1
- package/assets/css/components/property-searchbar.css.map +1 -1
- package/assets/css/components/rank.component.css +1 -1
- package/assets/css/components/rank.component.css.map +1 -1
- package/assets/css/components/rankings.component.css +1 -1
- package/assets/css/components/rankings.component.css.map +1 -1
- package/assets/css/components/rankings.global.css +1 -1
- package/assets/css/components/rankings.global.css.map +1 -1
- package/assets/css/components/slider.css +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/components/split-button.component.css +1 -1
- package/assets/css/components/split-button.component.css.map +1 -1
- package/assets/css/components/table-basic.global.css +1 -1
- package/assets/css/components/table-basic.global.css.map +1 -1
- package/assets/css/components/table.global.css +1 -1
- package/assets/css/components/table.global.css.map +1 -1
- package/assets/css/components/tabs.component.css +1 -1
- package/assets/css/components/tabs.component.css.map +1 -1
- package/assets/css/components/tabs.config.css +1 -1
- package/assets/css/components/tabs.config.css.map +1 -1
- package/assets/css/components/word-count.component.css +1 -0
- package/assets/css/components/word-count.component.css.map +1 -0
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/mobile-core.min.css +1 -1
- package/assets/css/mobile-core.min.css.map +1 -1
- package/assets/css/mobile.min.css +1 -1
- package/assets/css/mobile.min.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/components/accordion/accordion.component.js +39 -25
- package/assets/js/components/accordion/accordion.component.min.js +14 -15
- package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
- package/assets/js/components/actionbar/actionbar.component.js +16 -9
- package/assets/js/components/actionbar/actionbar.component.min.js +13 -5
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.js +6 -11
- package/assets/js/components/address-lookup/address-lookup.component.min.js +10 -12
- package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
- package/assets/js/components/advanced-select/advanced-select.component.min.js +1 -1
- package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.js +2 -5
- package/assets/js/components/applied-filters/applied-filters.component.min.js +7 -7
- package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
- package/assets/js/components/barchart/barchart.component.min.js +2 -2
- package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
- package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
- package/assets/js/components/bento-grid/bento-grid.component.min.js.map +1 -1
- package/assets/js/components/calendar/calendar.component.js +153 -136
- package/assets/js/components/calendar/calendar.component.min.js +3 -3
- package/assets/js/components/calendar/calendar.component.min.js.map +1 -1
- package/assets/js/components/card/card.component.js +3 -9
- package/assets/js/components/card/card.component.min.js +13 -7
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.js +17 -19
- package/assets/js/components/carousel/carousel.component.min.js +17 -19
- package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.js +0 -5
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +4 -6
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
- package/assets/js/components/content/content.component.min.js +2 -2
- package/assets/js/components/content/content.component.min.js.map +1 -1
- package/assets/js/components/darkmode/darkmode.component.js +70 -0
- package/assets/js/components/darkmode/darkmode.component.min.js +10 -0
- package/assets/js/components/darkmode/darkmode.component.min.js.map +1 -0
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js +2 -2
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js.map +1 -1
- package/assets/js/components/fileupload/fileupload.component.js +1 -5
- package/assets/js/components/fileupload/fileupload.component.min.js +5 -6
- package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
- package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
- package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
- package/assets/js/components/header/header.component.js +0 -5
- package/assets/js/components/header/header.component.min.js +4 -6
- package/assets/js/components/header/header.component.min.js.map +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.js +61 -60
- package/assets/js/components/inline-edit/inline-edit.component.min.js +5 -5
- package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
- package/assets/js/components/marketing/marketing.component.js +0 -4
- package/assets/js/components/marketing/marketing.component.min.js +3 -4
- package/assets/js/components/marketing/marketing.component.min.js.map +1 -1
- package/assets/js/components/menu/menu.component.js +2 -2
- package/assets/js/components/menu/menu.component.min.js +4 -5
- package/assets/js/components/menu/menu.component.min.js.map +1 -1
- package/assets/js/components/milestone/milestone.component.js +12 -14
- package/assets/js/components/milestone/milestone.component.min.js +1 -1
- package/assets/js/components/milestone/milestone.component.min.js.map +1 -1
- package/assets/js/components/milestone-group/milestone-group.component.js +10 -12
- package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
- package/assets/js/components/milestone-group/milestone-group.component.min.js.map +1 -1
- package/assets/js/components/multi-step/multi-step.component.min.js +3 -3
- package/assets/js/components/multi-step/multi-step.component.min.js.map +1 -1
- package/assets/js/components/multiselect/multiselect.component.js +90 -13
- package/assets/js/components/multiselect/multiselect.component.min.js +5 -5
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
- package/assets/js/components/nav/nav.component.js +4 -7
- package/assets/js/components/nav/nav.component.min.js +8 -7
- package/assets/js/components/nav/nav.component.min.js.map +1 -1
- package/assets/js/components/notification/notification.component.js +2 -7
- package/assets/js/components/notification/notification.component.min.js +6 -6
- package/assets/js/components/notification/notification.component.min.js.map +1 -1
- package/assets/js/components/pagination/pagination.component.js +3 -8
- package/assets/js/components/pagination/pagination.component.min.js +7 -8
- package/assets/js/components/pagination/pagination.component.min.js.map +1 -1
- package/assets/js/components/password-indicator/password-indicator.component.js +19 -0
- package/assets/js/components/password-indicator/password-indicator.component.min.js +7 -0
- package/assets/js/components/password-indicator/password-indicator.component.min.js.map +1 -0
- package/assets/js/components/rank/rank.component.js +2 -2
- package/assets/js/components/rank/rank.component.min.js +4 -5
- package/assets/js/components/rank/rank.component.min.js.map +1 -1
- package/assets/js/components/rankings/rankings.component.js +3 -0
- package/assets/js/components/rankings/rankings.component.min.js +364 -5
- package/assets/js/components/rankings/rankings.component.min.js.map +1 -1
- package/assets/js/components/record-card/record-card.component.min.js +1 -1
- package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
- package/assets/js/components/search/search.component.js +0 -4
- package/assets/js/components/search/search.component.min.js +5 -6
- package/assets/js/components/search/search.component.min.js.map +1 -1
- package/assets/js/components/slider/slider.component.js +0 -4
- package/assets/js/components/slider/slider.component.min.js +4 -5
- package/assets/js/components/slider/slider.component.min.js.map +1 -1
- package/assets/js/components/split-button/split-button.component.js +1 -3
- package/assets/js/components/split-button/split-button.component.min.js +8 -11
- package/assets/js/components/split-button/split-button.component.min.js.map +1 -1
- package/assets/js/components/table/table.component.min.js +4 -4
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/table-ajax/table-ajax.component.js +11 -9
- package/assets/js/components/table-ajax/table-ajax.component.min.js +4 -4
- package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -1
- package/assets/js/components/table-basic/table-basic.component.min.js +4 -4
- package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -1
- package/assets/js/components/table-no-submit/table-no-submit.component.js +15 -30
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js +4 -4
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -1
- package/assets/js/components/table-submit/table-submit.component.min.js +4 -4
- package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -1
- package/assets/js/components/tabs/tabs.component.js +1 -4
- package/assets/js/components/tabs/tabs.component.min.js +5 -5
- package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
- package/assets/js/components/video-card/video-card.component.min.js +1 -1
- package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
- package/assets/js/components/word-count/word-count.component.js +81 -0
- package/assets/js/components/word-count/word-count.component.min.js +12 -0
- package/assets/js/components/word-count/word-count.component.min.js.map +1 -0
- package/assets/js/components.js +1 -0
- package/assets/js/modules/advanced-select.js +1 -1
- package/assets/js/modules/dynamicEvents.js +3 -3
- package/assets/js/modules/inputs.js +0 -26
- package/assets/js/modules/milestone.js +2 -2
- package/assets/js/modules/password-indicator.js +21 -0
- package/assets/js/modules/table.js +28 -2
- package/assets/js/scripts.bundle.js +3 -3
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +2 -2
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/js/scripts.js +3 -1
- package/assets/sass/_components.scss +6 -5
- package/assets/sass/_elements.scss +5 -0
- package/assets/sass/_example.scss +1 -1
- package/assets/sass/_functions/utility-mixins.scss +21 -1
- package/assets/sass/_functions/variables.scss +14 -0
- package/assets/sass/components/actionbar.component.scss +38 -1
- package/assets/sass/components/actionbar.global.scss +1 -1
- package/assets/sass/components/{address-lookup.scss → address-lookup.component.scss} +10 -0
- package/assets/sass/components/applied-filters.scss +1 -0
- package/assets/sass/components/calendar.component.scss +163 -271
- package/assets/sass/components/calendar.config.scss +69 -122
- package/assets/sass/components/collapsible-side.scss +2 -0
- package/assets/sass/components/darkmode.component.scss +22 -0
- package/assets/sass/components/fileupload.scss +18 -0
- package/assets/sass/components/header.scss +9 -0
- package/assets/sass/components/inline-edit.preload.scss +68 -2
- package/assets/sass/components/inline-edit.scss +7 -0
- package/assets/sass/components/milestone.scss +69 -60
- package/assets/sass/components/multi-step.component.scss +1 -1
- package/assets/sass/components/multiselect.preload.scss +11 -1
- package/assets/sass/components/multiselect.scss +62 -5
- package/assets/sass/components/nav.component.scss +31 -6
- package/assets/sass/components/nav.global.scss +8 -12
- package/assets/sass/components/notification.scss +38 -17
- package/assets/sass/components/pagination.scss +6 -0
- package/assets/sass/components/slider.scss +1 -0
- package/assets/sass/components/split-button.component.scss +3 -1
- package/assets/sass/components/table-basic.global.scss +33 -33
- package/assets/sass/components/table.global.scss +9 -4
- package/assets/sass/components/tabs.component.scss +4 -0
- package/assets/sass/components/tabs.config.scss +231 -4
- package/assets/sass/components/word-count.component.scss +26 -0
- package/assets/sass/elements/admin-panel.scss +38 -10
- package/assets/sass/elements/buttons--compact.scss +1 -1
- package/assets/sass/elements/buttons--global.scss +3 -3
- package/assets/sass/elements/details.scss +33 -6
- package/assets/sass/elements/forms.scss +23 -31
- package/assets/sass/elements/hr.scss +50 -0
- package/assets/sass/elements/icons.scss +5 -0
- package/assets/sass/elements/links.scss +2 -2
- package/assets/sass/elements/lists.scss +1 -1
- package/assets/sass/elements/modal.scss +1 -5
- package/assets/sass/elements/toggle-button.scss +1 -0
- package/assets/sass/elements/type.scss +6 -9
- package/assets/sass/foundations/colours.scss +0 -0
- package/assets/sass/foundations/reboot.scss +14 -18
- package/assets/sass/foundations/root.scss +43 -51
- package/assets/sass/templates/form.scss +5 -0
- package/assets/ts/components/accordion/accordion.component.ts +46 -33
- package/assets/ts/components/actionbar/actionbar.component.ts +29 -10
- package/assets/ts/components/address-lookup/address-lookup.component.ts +7 -11
- package/assets/ts/components/applied-filters/applied-filters.component.ts +2 -5
- package/assets/ts/components/calendar/calendar.component.ts +368 -498
- package/assets/ts/components/card/card.component.ts +2 -9
- package/assets/ts/components/carousel/carousel.component.ts +17 -19
- package/assets/ts/components/collapsible-side/collapsible-side.component.ts +1 -5
- package/assets/ts/components/darkmode/darkmode.component.ts +85 -0
- package/assets/ts/components/fileupload/fileupload.component.ts +2 -5
- package/assets/ts/components/header/header.component.ts +1 -5
- package/assets/ts/components/inline-edit/inline-edit.component.ts +74 -75
- package/assets/ts/components/marketing/marketing.component.ts +0 -4
- package/assets/ts/components/menu/menu.component.ts +2 -2
- package/assets/ts/components/milestone/milestone.component.ts +43 -45
- package/assets/ts/components/milestone-group/milestone-group.component.ts +39 -41
- package/assets/ts/components/multiselect/multiselect.component.ts +103 -27
- package/assets/ts/components/nav/nav.component.ts +10 -19
- package/assets/ts/components/notification/notification.component.ts +3 -9
- package/assets/ts/components/pagination/pagination.component.ts +6 -8
- package/assets/ts/components/password-indicator/password-indicator.component.ts +24 -0
- package/assets/ts/components/rank/rank.component.ts +2 -2
- package/assets/ts/components/rankings/rankings.component.ts +4 -0
- package/assets/ts/components/search/search.component.ts +0 -4
- package/assets/ts/components/slider/slider.component.ts +1 -4
- package/assets/ts/components/split-button/split-button.component.ts +1 -3
- package/assets/ts/components/table-ajax/table-ajax.component.ts +5 -5
- package/assets/ts/components/table-no-submit/table-no-submit.component.ts +10 -21
- package/assets/ts/components/tabs/tabs.component.ts +2 -4
- package/assets/ts/components/word-count/word-count.component.ts +91 -0
- package/assets/ts/components.ts +1 -0
- package/assets/ts/modules/advanced-select.ts +11 -16
- package/assets/ts/modules/data-layer.md +0 -5
- package/assets/ts/modules/dynamicEvents.ts +6 -7
- package/assets/ts/modules/inputs.ts +0 -31
- package/assets/ts/modules/milestone-group.ts +39 -42
- package/assets/ts/modules/milestone.ts +119 -122
- package/assets/ts/modules/password-indicator.ts +29 -0
- package/assets/ts/modules/table.ts +41 -3
- package/assets/ts/scripts.ts +4 -1
- package/dist/components.es.js +1691 -41
- package/dist/components.umd.js +1398 -231
- package/package.json +6 -6
- package/src/components/Accordion/Accordion.vue +14 -23
- package/src/components/Accordion/AccordionItem.vue +27 -43
- package/src/components/Actionbar/Actionbar.vue +17 -19
- package/src/components/AddressLookup/AddressLookup.vue +17 -18
- package/src/components/AdvancedSelect/AdvancedSelect.vue +17 -18
- package/src/components/AppliedFilters/AppliedFilters.vue +16 -18
- package/src/components/Banner/Banner.vue +18 -21
- package/src/components/BarChart/BarChart.vue +17 -18
- package/src/components/Calendar/Calendar.vue +14 -20
- package/src/components/Card/Card.vue +17 -17
- package/src/components/Carousel/Carousel.vue +17 -20
- package/src/components/Content/Content.vue +17 -18
- package/src/components/DarkMode/DarkMode.vue +19 -0
- package/src/components/DoughnutChart/DoughnutChart.vue +17 -18
- package/src/components/FileUpload/FileUpload.vue +22 -28
- package/src/components/FilterCard/FilterCard.vue +17 -18
- package/src/components/Filterlist/Filterlist.vue +17 -0
- package/src/components/Header/Header.vue +28 -29
- package/src/components/InlineEdit/InlineEdit.vue +11 -19
- package/src/components/Menu/Menu.vue +17 -17
- package/src/components/Milestones/Milestone.vue +22 -27
- package/src/components/Milestones/MilestoneGroup.vue +24 -27
- package/src/components/Multiselect/Multiselect.vue +17 -18
- package/src/components/Nav/Nav.vue +17 -19
- package/src/components/Notification/Notification.vue +17 -15
- package/src/components/Pagination/Pagination.vue +16 -16
- package/src/components/PasswordIndicator/PasswordIndicator.vue +23 -0
- package/src/components/Rank/Rank.vue +17 -18
- package/src/components/Rankings/Rankings.vue +17 -27
- package/src/components/RecordCard/RecordCard.vue +17 -18
- package/src/components/Search/Search.vue +17 -17
- package/src/components/Slider/Slider.vue +17 -17
- package/src/components/SplitButton/SplitButton.vue +17 -20
- package/src/components/Tabs/Tabs.vue +17 -17
- package/src/components/VideoCard/VideoCard.vue +17 -18
- package/src/components/WordCount/WordCount.vue +22 -0
- package/src/index.js +43 -44
- package/assets/css/components/address-lookup.css +0 -1
- package/assets/css/components/address-lookup.css.map +0 -1
- package/assets/css/components/menu.css.map +0 -1
- package/assets/css/components/tabs.css +0 -1
- package/assets/css/components/tabs.css.map +0 -1
- package/assets/sass/components/tabs.scss +0 -254
- package/assets/ts/components/accordion/README.md +0 -31
- package/assets/ts/components/fileupload/README.md +0 -28
- /package/assets/sass/components/{menu.scss → menu.global.scss} +0 -0
|
@@ -14,7 +14,6 @@ class iamCalendar extends HTMLElement {
|
|
|
14
14
|
|
|
15
15
|
const loadCSS = `@import "${assetLocation}/css/components/calendar.component.css";`;
|
|
16
16
|
|
|
17
|
-
|
|
18
17
|
const weekViewOnly = `<table class="table--day" role="presentation"><tbody>
|
|
19
18
|
<tr class="allday"><th>All day</th></tr>
|
|
20
19
|
<tr><th data-hour="0">00</th></tr>
|
|
@@ -45,7 +44,6 @@ class iamCalendar extends HTMLElement {
|
|
|
45
44
|
|
|
46
45
|
const template = document.createElement('template');
|
|
47
46
|
|
|
48
|
-
|
|
49
47
|
template.innerHTML = `
|
|
50
48
|
<style>
|
|
51
49
|
${loadCSS}
|
|
@@ -161,16 +159,28 @@ class iamCalendar extends HTMLElement {
|
|
|
161
159
|
`;
|
|
162
160
|
this.shadowRoot.appendChild(template.content.cloneNode(true));
|
|
163
161
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
162
|
+
this.monthArray = [
|
|
163
|
+
'January',
|
|
164
|
+
'February',
|
|
165
|
+
'March',
|
|
166
|
+
'April',
|
|
167
|
+
'May',
|
|
168
|
+
'June',
|
|
169
|
+
'July',
|
|
170
|
+
'August',
|
|
171
|
+
'September',
|
|
172
|
+
'October',
|
|
173
|
+
'November',
|
|
174
|
+
'December',
|
|
175
|
+
];
|
|
176
|
+
this.dayArray = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
177
|
+
|
|
178
|
+
this.english_ordinal_rules = new Intl.PluralRules('en', { type: 'ordinal' });
|
|
169
179
|
this.suffixes = {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
180
|
+
one: 'st',
|
|
181
|
+
two: 'nd',
|
|
182
|
+
few: 'rd',
|
|
183
|
+
other: 'th',
|
|
174
184
|
};
|
|
175
185
|
|
|
176
186
|
this.calendars = ['Default']; // TO DO allow for these to be set via the component data attributes
|
|
@@ -180,8 +190,7 @@ class iamCalendar extends HTMLElement {
|
|
|
180
190
|
}
|
|
181
191
|
|
|
182
192
|
createThead(sundayFirst: false): string {
|
|
183
|
-
|
|
184
|
-
if(sundayFirst)
|
|
193
|
+
if (sundayFirst)
|
|
185
194
|
return `<tr>
|
|
186
195
|
<th class="column-header sunday"><span class="long-day-name">Sunday</span><span class="short-day-name" role="presentation">Sun</span></th>
|
|
187
196
|
<th class="column-header monday"><span class="long-day-name">Monday</span><span class="short-day-name" role="presentation">Mon</span></th>
|
|
@@ -191,7 +200,7 @@ class iamCalendar extends HTMLElement {
|
|
|
191
200
|
<th class="column-header friday"><span class="long-day-name">Friday</span><span class="short-day-name" role="presentation">Fri</span></th>
|
|
192
201
|
<th class="column-header saturday"><span class="long-day-name">Saturday</span><span class="short-day-name" role="presentation">Sat</span></th>
|
|
193
202
|
</tr>`;
|
|
194
|
-
|
|
203
|
+
|
|
195
204
|
return `<tr>
|
|
196
205
|
<th class="column-header monday"><span class="long-day-name">Monday</span><span class="short-day-name" role="presentation">Mon</span></th>
|
|
197
206
|
<th class="column-header tuesday"><span class="long-day-name">Tuesday</span><span class="short-day-name" role="presentation">Tues</span></th>
|
|
@@ -203,25 +212,23 @@ class iamCalendar extends HTMLElement {
|
|
|
203
212
|
</tr>`;
|
|
204
213
|
}
|
|
205
214
|
|
|
206
|
-
numberDaysInMonth(year, month): Date {
|
|
207
|
-
return new Date(year, month, 0).getDate();
|
|
215
|
+
numberDaysInMonth(year, month): Date {
|
|
216
|
+
return new Date(year, month, 0).getDate();
|
|
208
217
|
}
|
|
209
218
|
|
|
210
|
-
getOrdinalNumber(number): string
|
|
219
|
+
getOrdinalNumber(number): string {
|
|
211
220
|
const category = this.english_ordinal_rules.select(number);
|
|
212
221
|
const suffix = this.suffixes[category];
|
|
213
|
-
return
|
|
222
|
+
return number + suffix;
|
|
214
223
|
}
|
|
215
224
|
|
|
216
|
-
setToMonday(
|
|
217
|
-
const day = date.getDay() || 7;
|
|
218
|
-
if(
|
|
219
|
-
date.setHours(-24 * (day - 1));
|
|
225
|
+
setToMonday(date): Date {
|
|
226
|
+
const day = date.getDay() || 7;
|
|
227
|
+
if (day !== 1) date.setHours(-24 * (day - 1));
|
|
220
228
|
return date;
|
|
221
229
|
}
|
|
222
230
|
|
|
223
|
-
setToSunday(
|
|
224
|
-
|
|
231
|
+
setToSunday(date): Date {
|
|
225
232
|
const monday = this.setToMonday(date);
|
|
226
233
|
const sunday = new Date(monday);
|
|
227
234
|
|
|
@@ -229,16 +236,14 @@ class iamCalendar extends HTMLElement {
|
|
|
229
236
|
return sunday;
|
|
230
237
|
}
|
|
231
238
|
|
|
232
|
-
getTitle(dateStr,view): string {
|
|
233
|
-
|
|
239
|
+
getTitle(dateStr, view): string {
|
|
234
240
|
const date = new Date(dateStr);
|
|
235
241
|
const month = date.getMonth();
|
|
236
242
|
const year = date.getFullYear();
|
|
237
243
|
const day = date.getDate();
|
|
238
|
-
const dayOfWeek = date.getDay() ? date.getDay(): 7;
|
|
239
|
-
|
|
240
|
-
if(view == "week"){
|
|
244
|
+
const dayOfWeek = date.getDay() ? date.getDay() : 7;
|
|
241
245
|
|
|
246
|
+
if (view == 'week') {
|
|
242
247
|
const monday = this.setToMonday(new Date(dateStr));
|
|
243
248
|
const sunday = this.setToSunday(new Date(dateStr));
|
|
244
249
|
|
|
@@ -251,13 +256,9 @@ class iamCalendar extends HTMLElement {
|
|
|
251
256
|
const sundayDay = sunday.getDate();
|
|
252
257
|
|
|
253
258
|
return `${this.getOrdinalNumber(mondayDay)} ${mondayMonth != sundayMonth ? this.monthArray[sundayMonth] : ''} ${mondayYear != sundayYear ? mondayYear : ''} - ${this.getOrdinalNumber(sundayDay)} ${this.monthArray[sundayMonth]} ${sundayYear}`;
|
|
254
|
-
}
|
|
255
|
-
else if(view == "day"){
|
|
256
|
-
|
|
259
|
+
} else if (view == 'day') {
|
|
257
260
|
return `${this.dayArray[dayOfWeek]} ${this.getOrdinalNumber(day)} ${this.monthArray[month]} ${year}`;
|
|
258
|
-
}
|
|
259
|
-
else if(view == "year"){
|
|
260
|
-
|
|
261
|
+
} else if (view == 'year') {
|
|
261
262
|
return `${year}`;
|
|
262
263
|
}
|
|
263
264
|
|
|
@@ -265,22 +266,21 @@ class iamCalendar extends HTMLElement {
|
|
|
265
266
|
}
|
|
266
267
|
|
|
267
268
|
createCalendar(selectedDate, today, sundayFirst: false): string {
|
|
268
|
-
|
|
269
269
|
const date = new Date(selectedDate);
|
|
270
270
|
const month = date.getMonth();
|
|
271
271
|
const year = date.getFullYear();
|
|
272
272
|
const day = date.getDate();
|
|
273
|
-
const selectedDateStr = `${year}-${String(month+1).padStart(2,
|
|
274
|
-
const daysThisMonth = this.numberDaysInMonth(year, month+1);
|
|
275
|
-
const startOfMonth = new Date(`${year}-${String(month+1).padStart(2,
|
|
276
|
-
const endOfMonth = new Date(`${year}-${String(month+1).padStart(2,
|
|
273
|
+
const selectedDateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
|
|
274
|
+
const daysThisMonth = this.numberDaysInMonth(year, month + 1);
|
|
275
|
+
const startOfMonth = new Date(`${year}-${String(month + 1).padStart(2, '0')}-01`);
|
|
276
|
+
const endOfMonth = new Date(`${year}-${String(month + 1).padStart(2, '0')}-${daysThisMonth}`);
|
|
277
277
|
const startDay = startOfMonth.getDay() != 0 ? startOfMonth.getDay() : 7;
|
|
278
278
|
const endDay = endOfMonth.getDay() != 0 ? endOfMonth.getDay() : 7;
|
|
279
279
|
const loopDays = daysThisMonth + startDay + (7 - endDay - 1);
|
|
280
280
|
|
|
281
281
|
// Get the previous month
|
|
282
282
|
const prevMonthDate = new Date(selectedDate);
|
|
283
|
-
prevMonthDate.setMonth(prevMonthDate.getMonth() -1);
|
|
283
|
+
prevMonthDate.setMonth(prevMonthDate.getMonth() - 1);
|
|
284
284
|
const prevMonth = prevMonthDate.getMonth();
|
|
285
285
|
const prevMonthYear = prevMonthDate.getFullYear();
|
|
286
286
|
const daysPrevMonth = this.numberDaysInMonth(year, month);
|
|
@@ -292,49 +292,44 @@ class iamCalendar extends HTMLElement {
|
|
|
292
292
|
const nextMonthYear = nextMonthDate.getFullYear();
|
|
293
293
|
|
|
294
294
|
// Get calendars
|
|
295
|
-
|
|
296
|
-
if(!this.hasAttribute('data-calendars')){
|
|
297
|
-
Array.from(this.querySelectorAll('button[data-calendar]')).forEach((element) => {
|
|
298
295
|
|
|
296
|
+
if (!this.hasAttribute('data-calendars')) {
|
|
297
|
+
Array.from(this.querySelectorAll('button[data-calendar]')).forEach((element) => {
|
|
299
298
|
// Scan through the buttons and look forunique calendar names
|
|
300
|
-
if(!
|
|
299
|
+
if (!this.calendars.includes(element.getAttribute('data-calendar')))
|
|
301
300
|
this.calendars.push(element.getAttribute('data-calendar'));
|
|
302
|
-
})
|
|
301
|
+
});
|
|
303
302
|
}
|
|
304
303
|
|
|
305
304
|
// Create tbody string by looping through the number of days in month plus some days before and after
|
|
306
305
|
let tbodyContent = `<tr>`;
|
|
307
306
|
|
|
308
|
-
for (let i =
|
|
309
|
-
|
|
307
|
+
for (let i = sundayFirst ? 0 : 1; i <= loopDays; i++) {
|
|
310
308
|
const loopDay = i - (startDay - 1);
|
|
311
|
-
const loopDate = `${year}-${String(month+1).padStart(2,
|
|
312
|
-
const dayOfWeek = i%7;
|
|
309
|
+
const loopDate = `${year}-${String(month + 1).padStart(2, '0')}-${String(loopDay).padStart(2, '0')}`;
|
|
310
|
+
const dayOfWeek = i % 7;
|
|
313
311
|
|
|
314
312
|
tbodyContent += `<td class="day--${this.dayArray[dayOfWeek].toLowerCase()} ${loopDate == today ? 'today' : ''} ${loopDate == selectedDateStr ? 'selected' : ''} ${i < startDay ? 'prev-month' : ''} ${loopDay > daysThisMonth ? 'next-month' : ''}">`;
|
|
315
313
|
|
|
316
314
|
// prev month days
|
|
317
|
-
if(i < startDay){
|
|
318
|
-
|
|
315
|
+
if (i < startDay) {
|
|
319
316
|
const adjustedLoopDay = daysPrevMonth - (startDay - 1 - i);
|
|
320
|
-
const adjustedLoopDate = `${prevMonthYear}-${String(prevMonth+1).padStart(2,
|
|
321
|
-
|
|
317
|
+
const adjustedLoopDate = `${prevMonthYear}-${String(prevMonth + 1).padStart(2, '0')}-${String(adjustedLoopDay).padStart(2, '0')}`;
|
|
318
|
+
|
|
322
319
|
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>`;
|
|
323
320
|
tbodyContent += this.addDay(adjustedLoopDate, this.calendars);
|
|
324
321
|
}
|
|
325
322
|
|
|
326
|
-
if(i >= startDay && loopDay <= daysThisMonth){
|
|
327
|
-
|
|
323
|
+
if (i >= startDay && loopDay <= daysThisMonth) {
|
|
328
324
|
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>`;
|
|
329
325
|
tbodyContent += this.addDay(loopDate, this.calendars);
|
|
330
326
|
}
|
|
331
327
|
|
|
332
328
|
// next month days
|
|
333
|
-
if(loopDay > daysThisMonth){
|
|
334
|
-
|
|
329
|
+
if (loopDay > daysThisMonth) {
|
|
335
330
|
const adjustedLoopDay = i - (startDay - 1) - daysThisMonth;
|
|
336
|
-
const adjustedLoopDate = `${nextMonthYear}-${String(nextMonth+1).padStart(2,
|
|
337
|
-
|
|
331
|
+
const adjustedLoopDate = `${nextMonthYear}-${String(nextMonth + 1).padStart(2, '0')}-${String(adjustedLoopDay).padStart(2, '0')}`;
|
|
332
|
+
|
|
338
333
|
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>`;
|
|
339
334
|
tbodyContent += this.addDay(adjustedLoopDate, this.calendars);
|
|
340
335
|
}
|
|
@@ -342,10 +337,9 @@ class iamCalendar extends HTMLElement {
|
|
|
342
337
|
tbodyContent += '</td>';
|
|
343
338
|
|
|
344
339
|
// Close row and start a new one
|
|
345
|
-
if((
|
|
340
|
+
if ((sundayFirst ? i + 1 : i) % 7 === 0 && i != loopDays) {
|
|
346
341
|
tbodyContent += `</tr><tr>`;
|
|
347
342
|
}
|
|
348
|
-
|
|
349
343
|
}
|
|
350
344
|
tbodyContent += '</tr>';
|
|
351
345
|
|
|
@@ -353,29 +347,24 @@ class iamCalendar extends HTMLElement {
|
|
|
353
347
|
}
|
|
354
348
|
|
|
355
349
|
addDay(day, calendars: []): string {
|
|
356
|
-
|
|
357
350
|
let htmlTable = '<table class="table--day">';
|
|
358
351
|
htmlTable += `<thead><tr><th>time</th>`;
|
|
359
|
-
calendars.forEach(calendarTitle => {
|
|
360
|
-
|
|
352
|
+
calendars.forEach((calendarTitle) => {
|
|
361
353
|
htmlTable += `<th class="column-header">${calendarTitle}</th>`;
|
|
362
354
|
});
|
|
363
355
|
htmlTable += `</tr></thead>`;
|
|
364
356
|
|
|
365
357
|
htmlTable += `<tbody>`;
|
|
366
358
|
htmlTable += `<tr class="allday"><th>All day</th>`;
|
|
367
|
-
calendars.forEach(calendarTitle => {
|
|
368
|
-
|
|
359
|
+
calendars.forEach((calendarTitle) => {
|
|
369
360
|
htmlTable += `<td datetime="${day}" data-calendar="${calendarTitle}"><span datetime="${day}"></span></td>`;
|
|
370
361
|
});
|
|
371
362
|
htmlTable += `</tr>`;
|
|
372
363
|
|
|
373
364
|
for (let i = 0; i < 24; i++) {
|
|
374
|
-
|
|
375
365
|
htmlTable += `<tr class="hour${i}"><th data-hour="${i}">${i}${i < 12 ? 'am' : 'pm'}</th>`;
|
|
376
|
-
calendars.forEach(calendarTitle => {
|
|
377
|
-
|
|
378
|
-
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>`;
|
|
366
|
+
calendars.forEach((calendarTitle) => {
|
|
367
|
+
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>`;
|
|
379
368
|
});
|
|
380
369
|
htmlTable += `</tr>`;
|
|
381
370
|
}
|
|
@@ -386,68 +375,56 @@ class iamCalendar extends HTMLElement {
|
|
|
386
375
|
}
|
|
387
376
|
|
|
388
377
|
addEvents(): void {
|
|
389
|
-
|
|
390
378
|
function setDefaultEventValues(component, element, index): void {
|
|
391
|
-
|
|
392
|
-
const datetime = element.getAttribute('datetime')
|
|
379
|
+
const datetime = element.getAttribute('datetime');
|
|
393
380
|
const datetimeArr = datetime.split('T');
|
|
394
381
|
let id = element.getAttribute('id');
|
|
395
382
|
|
|
396
383
|
// Add ID
|
|
397
|
-
if(!element.hasAttribute('id')){
|
|
384
|
+
if (!element.hasAttribute('id')) {
|
|
398
385
|
id = `event${uniqueID(index)}`;
|
|
399
|
-
element.setAttribute('id',id);
|
|
386
|
+
element.setAttribute('id', id);
|
|
400
387
|
}
|
|
401
388
|
|
|
402
389
|
// Wrap content in span for formatting in week/day view
|
|
403
|
-
if(!element.querySelector('span:not(.tooltip__content')){
|
|
390
|
+
if (!element.querySelector('span:not(.tooltip__content')) {
|
|
404
391
|
element.innerHTML = `<span>${element.innerHTML}</span>`;
|
|
405
392
|
}
|
|
406
393
|
|
|
407
394
|
// Add event type enum so we can set the correct colours
|
|
408
395
|
//if(!element.hasAttribute('data-event-type-enum') && element.hasAttribute('data-event-type')){
|
|
409
396
|
|
|
410
|
-
|
|
397
|
+
const eventType = element.getAttribute('data-event-type');
|
|
411
398
|
|
|
412
|
-
|
|
413
|
-
component.eventTypes.push(eventType);
|
|
399
|
+
if (!component.eventTypes.includes(eventType)) component.eventTypes.push(eventType);
|
|
414
400
|
|
|
415
|
-
|
|
401
|
+
element.setAttribute('data-event-type-enum', component.eventTypes.indexOf(eventType) + 1);
|
|
416
402
|
//}
|
|
417
403
|
|
|
418
404
|
// Add calendar enum so we can set the correct colours
|
|
419
|
-
if(element.hasAttribute('data-calendar')){
|
|
420
|
-
|
|
405
|
+
if (element.hasAttribute('data-calendar')) {
|
|
421
406
|
const calendar = element.getAttribute('data-calendar');
|
|
422
407
|
|
|
423
|
-
if(!component.calendars.includes(calendar))
|
|
424
|
-
component.calendars.push(calendar);
|
|
408
|
+
if (!component.calendars.includes(calendar)) component.calendars.push(calendar);
|
|
425
409
|
|
|
426
410
|
element.setAttribute('data-calendar-enum', component.calendars.indexOf(calendar) + 1);
|
|
427
411
|
}
|
|
428
|
-
|
|
429
|
-
if(!element.hasAttribute('data-calendar-enum')){
|
|
412
|
+
|
|
413
|
+
if (!element.hasAttribute('data-calendar-enum')) {
|
|
430
414
|
element.setAttribute('data-calendar-enum', 1);
|
|
431
415
|
}
|
|
432
416
|
|
|
433
|
-
if(!element.hasAttribute('data-hours') && !element.hasAttribute('data-days')){
|
|
434
|
-
|
|
435
|
-
if(datetimeArr[1]){
|
|
417
|
+
if (!element.hasAttribute('data-hours') && !element.hasAttribute('data-days')) {
|
|
418
|
+
if (datetimeArr[1]) {
|
|
436
419
|
element.setAttribute('data-hours', 1);
|
|
437
|
-
}
|
|
438
|
-
else {
|
|
439
|
-
|
|
420
|
+
} else {
|
|
440
421
|
element.setAttribute('data-days', 1);
|
|
441
422
|
}
|
|
442
423
|
}
|
|
443
424
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
let ms = 1000 * 60 * minutes; // convert minutes to ms
|
|
449
|
-
let roundedDate = new Date(Math.round(d.getTime() / ms) * ms);
|
|
450
|
-
|
|
425
|
+
const getRoundedDate = (minutes, d = new Date()): void => {
|
|
426
|
+
const ms = 1000 * 60 * minutes; // convert minutes to ms
|
|
427
|
+
const roundedDate = new Date(Math.round(d.getTime() / ms) * ms);
|
|
451
428
|
|
|
452
429
|
const newMonth = roundedDate.getMonth();
|
|
453
430
|
const newYear = roundedDate.getFullYear();
|
|
@@ -455,69 +432,82 @@ class iamCalendar extends HTMLElement {
|
|
|
455
432
|
const newMinutes = roundedDate.getMinutes();
|
|
456
433
|
const newHour = roundedDate.getHours();
|
|
457
434
|
|
|
458
|
-
const strRoundedDate = `${newYear}-${String(newMonth+1).padStart(2,
|
|
459
|
-
|
|
435
|
+
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')}`;
|
|
460
436
|
|
|
461
437
|
return strRoundedDate;
|
|
462
|
-
}
|
|
463
|
-
|
|
438
|
+
};
|
|
464
439
|
|
|
465
|
-
if(datetimeArr[1]){
|
|
440
|
+
if (datetimeArr[1]) {
|
|
466
441
|
element.setAttribute('data-start', datetimeArr[1]);
|
|
467
442
|
element.querySelector(':scope > span').setAttribute('data-start', datetimeArr[1]);
|
|
468
443
|
|
|
469
444
|
const roundedDatetime = getRoundedDate(15, new Date(datetime));
|
|
470
|
-
element.setAttribute('datetime',roundedDatetime);
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
console.log(roundedDatetime);
|
|
445
|
+
element.setAttribute('datetime', roundedDatetime);
|
|
474
446
|
}
|
|
475
447
|
|
|
476
|
-
|
|
477
|
-
if(element.querySelector('.tooltip__content')){
|
|
478
|
-
|
|
448
|
+
if (element.querySelector('.tooltip__content')) {
|
|
479
449
|
const tooltip = element.querySelector('.tooltip__content');
|
|
480
450
|
|
|
481
451
|
tooltip.style.positionAnchor = `--${id}`;
|
|
482
452
|
|
|
483
|
-
element.style.anchorName = `--${id}
|
|
453
|
+
element.style.anchorName = `--${id}`;
|
|
484
454
|
}
|
|
485
455
|
|
|
486
|
-
|
|
487
456
|
element.classList.add('defaults-added');
|
|
488
457
|
}
|
|
489
458
|
|
|
490
459
|
function adjustEvent(component, element, continued: false): void {
|
|
491
|
-
|
|
492
460
|
const datetime = element.getAttribute('datetime');
|
|
493
461
|
|
|
494
462
|
const date = new Date(datetime);
|
|
495
|
-
const dayOfWeek = date.getDay() ? date.getDay(): 7;
|
|
463
|
+
const dayOfWeek = date.getDay() ? date.getDay() : 7;
|
|
496
464
|
|
|
497
465
|
// Locate where we need to add slots for the buttons to go - We need duplicate slots for the split view and fixed header
|
|
498
|
-
const timeTd = component.shadowRoot.querySelector(
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
466
|
+
const timeTd = component.shadowRoot.querySelector(
|
|
467
|
+
`.month-wrapper .table--day td:has(span[datetime="${datetime}"])${element.hasAttribute('data-calendar') ? `[data-calendar="${element.getAttribute('data-calendar').replace('_', '')}"]` : ''}`
|
|
468
|
+
);
|
|
469
|
+
const timeTdHeader = component.shadowRoot.querySelector(
|
|
470
|
+
`#week-view-header .table--day td:has(span[datetime="${datetime}"])${element.hasAttribute('data-calendar') ? `[data-calendar="${element.getAttribute('data-calendar').replace('_', '')}"]` : ''}`
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
if (timeTdHeader && timeTdHeader.closest('tr').classList.contains('allday')) {
|
|
474
|
+
// Add the alldays slot for the fixed header
|
|
475
|
+
if (
|
|
476
|
+
!timeTdHeader.querySelector(
|
|
477
|
+
`slot[name="${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}-header]"`
|
|
478
|
+
)
|
|
479
|
+
) {
|
|
480
|
+
timeTdHeader
|
|
481
|
+
.querySelector(`span[datetime="${datetime}"]`)
|
|
482
|
+
.insertAdjacentHTML(
|
|
483
|
+
'beforeEnd',
|
|
484
|
+
`<slot name="${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}-header" class="${continued ? 'continued' : ''}"></slot>`
|
|
485
|
+
);
|
|
506
486
|
}
|
|
507
487
|
}
|
|
508
|
-
|
|
509
|
-
|
|
488
|
+
|
|
510
489
|
const dateTd = timeTd?.parentElement?.closest('td');
|
|
511
490
|
|
|
512
491
|
// original event needs a slot name adding
|
|
513
|
-
element.setAttribute(
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
492
|
+
element.setAttribute(
|
|
493
|
+
'slot',
|
|
494
|
+
`${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}`
|
|
495
|
+
);
|
|
517
496
|
|
|
497
|
+
// Add matching slot to the event element to have it show in the correct place on the calendar
|
|
498
|
+
if (timeTd) {
|
|
518
499
|
// Add the default slot
|
|
519
|
-
if
|
|
520
|
-
timeTd.querySelector(
|
|
500
|
+
if (
|
|
501
|
+
!timeTd.querySelector(
|
|
502
|
+
`slot[name="${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}"]`
|
|
503
|
+
)
|
|
504
|
+
) {
|
|
505
|
+
timeTd
|
|
506
|
+
.querySelector(`span[datetime="${datetime}"]`)
|
|
507
|
+
.insertAdjacentHTML(
|
|
508
|
+
'beforeEnd',
|
|
509
|
+
`<slot name="${datetime}${element.hasAttribute('data-calendar') ? `-${element.getAttribute('data-calendar').replace('_', '')}` : ''}" class="${continued ? 'continued' : ''}"></slot>`
|
|
510
|
+
);
|
|
521
511
|
}
|
|
522
512
|
|
|
523
513
|
// Set the classes need to create the grey bars in the mobile month view
|
|
@@ -527,86 +517,76 @@ class iamCalendar extends HTMLElement {
|
|
|
527
517
|
|
|
528
518
|
dateTd.setAttribute('data-events', parseInt(events) + 1);
|
|
529
519
|
|
|
530
|
-
if(
|
|
531
|
-
dateTd.setAttribute('data-more', (parseInt(events) + 1) - 2);
|
|
520
|
+
if (events + 1 > 2) dateTd.setAttribute('data-more', parseInt(events) + 1 - 2);
|
|
532
521
|
|
|
533
522
|
dateTd.setAttribute('data-hours', hours);
|
|
534
|
-
|
|
523
|
+
|
|
535
524
|
dateTd.classList.add('has-event');
|
|
536
525
|
|
|
537
|
-
if(timeTd.closest('tr').classList.contains('has-event'))
|
|
538
|
-
|
|
539
|
-
else
|
|
540
|
-
timeTd.closest('tr').classList.add('has-event');
|
|
526
|
+
if (timeTd.closest('tr').classList.contains('has-event')) timeTd.closest('tr').classList.add('multiple-event');
|
|
527
|
+
else timeTd.closest('tr').classList.add('has-event');
|
|
541
528
|
|
|
542
|
-
if(hours > 2)
|
|
543
|
-
dateTd.classList.add('multi-events');
|
|
529
|
+
if (hours > 2) dateTd.classList.add('multi-events');
|
|
544
530
|
|
|
545
|
-
if(hours > 4)
|
|
546
|
-
dateTd.classList.add('busy-day');
|
|
531
|
+
if (hours > 4) dateTd.classList.add('busy-day');
|
|
547
532
|
|
|
548
|
-
if(element.hasAttribute('data-days'))
|
|
549
|
-
dateTd.classList.add('all-day');
|
|
533
|
+
if (element.hasAttribute('data-days')) dateTd.classList.add('all-day');
|
|
550
534
|
|
|
551
|
-
if(element.classList.contains('continued'))
|
|
552
|
-
dateTd.classList.add('continued-day');
|
|
535
|
+
if (element.classList.contains('continued')) dateTd.classList.add('continued-day');
|
|
553
536
|
}
|
|
554
537
|
|
|
555
538
|
// Add CSS properties so we can control the size of the event elements for day and week view
|
|
556
|
-
if(element.hasAttribute('data-hours'))
|
|
557
|
-
element.style.setProperty(
|
|
558
|
-
|
|
559
|
-
|
|
539
|
+
if (element.hasAttribute('data-hours'))
|
|
540
|
+
element.style.setProperty(
|
|
541
|
+
'--event-height',
|
|
542
|
+
`${parseInt(element.getAttribute('data-hours')) * (1.09375 * 4)}rem`
|
|
543
|
+
);
|
|
560
544
|
|
|
561
|
-
|
|
545
|
+
if (element.hasAttribute('data-days') && !element.classList.contains('processed')) {
|
|
546
|
+
const eventDayTotal = element.getAttribute('data-days');
|
|
562
547
|
|
|
563
|
-
element.style.setProperty('--event-width'
|
|
564
|
-
element.style.setProperty('--event-max-width'
|
|
548
|
+
element.style.setProperty('--event-width', `${eventDayTotal * 100}%`);
|
|
549
|
+
element.style.setProperty('--event-max-width', `${(8 - dayOfWeek) * 100}%`);
|
|
565
550
|
element.classList.add('allday-event');
|
|
566
551
|
|
|
567
|
-
|
|
568
|
-
// Create a duplicate event for each day the orginal
|
|
552
|
+
// Create a duplicate event for each day the orginal
|
|
569
553
|
for (let i = 1; i < eventDayTotal; i++) {
|
|
570
|
-
|
|
571
554
|
const cloneElement = element.cloneNode(true);
|
|
572
555
|
cloneElement.removeAttribute('data-days');
|
|
573
556
|
cloneElement.removeAttribute('style');
|
|
574
557
|
cloneElement.classList.add('continued');
|
|
575
558
|
cloneElement.classList.add('allday-event');
|
|
576
559
|
|
|
577
|
-
|
|
578
560
|
const id = `event${uniqueID(i)}`;
|
|
579
|
-
cloneElement.setAttribute('id',id);
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
if(cloneElement.querySelector('.tooltip__content')){
|
|
561
|
+
cloneElement.setAttribute('id', id);
|
|
583
562
|
|
|
563
|
+
if (cloneElement.querySelector('.tooltip__content')) {
|
|
584
564
|
const tooltip = cloneElement.querySelector('.tooltip__content');
|
|
585
565
|
tooltip.style.positionAnchor = `--${id}`;
|
|
586
|
-
cloneElement.style.anchorName = `--${id}
|
|
566
|
+
cloneElement.style.anchorName = `--${id}`;
|
|
587
567
|
}
|
|
588
568
|
|
|
589
|
-
|
|
590
569
|
const newDate = new Date(datetime);
|
|
591
570
|
newDate.setDate(newDate.getDate() + i);
|
|
592
571
|
|
|
593
572
|
const newMonth = newDate.getMonth();
|
|
594
573
|
const newYear = newDate.getFullYear();
|
|
595
574
|
const newDay = newDate.getDate();
|
|
596
|
-
const newDayOfWeek = newDate.getDay() ? newDate.getDay(): 7;
|
|
575
|
+
const newDayOfWeek = newDate.getDay() ? newDate.getDay() : 7;
|
|
597
576
|
|
|
598
|
-
const strCloneEvent = `${newYear}-${String(newMonth+1).padStart(2,
|
|
577
|
+
const strCloneEvent = `${newYear}-${String(newMonth + 1).padStart(2, '0')}-${String(newDay).padStart(2, '0')}`;
|
|
599
578
|
|
|
600
|
-
cloneElement.setAttribute('data-original-datetime',element.getAttribute('datetime'));
|
|
601
|
-
cloneElement.setAttribute('datetime',strCloneEvent);
|
|
579
|
+
cloneElement.setAttribute('data-original-datetime', element.getAttribute('datetime'));
|
|
580
|
+
cloneElement.setAttribute('datetime', strCloneEvent);
|
|
602
581
|
|
|
603
582
|
element.after(cloneElement); // Add after original
|
|
604
583
|
adjustEvent(component, cloneElement, true);
|
|
605
584
|
|
|
606
|
-
if(newDayOfWeek == 1){
|
|
585
|
+
if (newDayOfWeek == 1) {
|
|
586
|
+
// Monday
|
|
607
587
|
|
|
608
|
-
cloneElement.style.setProperty('--event-width'
|
|
609
|
-
cloneElement.style.setProperty('--event-max-width'
|
|
588
|
+
cloneElement.style.setProperty('--event-width', `${(eventDayTotal - i) * 100}%`);
|
|
589
|
+
cloneElement.style.setProperty('--event-max-width', `${(8 - newDayOfWeek) * 100}%`);
|
|
610
590
|
|
|
611
591
|
cloneElement.classList.remove('continued');
|
|
612
592
|
}
|
|
@@ -620,21 +600,17 @@ class iamCalendar extends HTMLElement {
|
|
|
620
600
|
this.pauseObserver = true;
|
|
621
601
|
|
|
622
602
|
Array.from(this.querySelectorAll('button[datetime]')).forEach((element, index) => {
|
|
623
|
-
|
|
624
|
-
setDefaultEventValues(this,element,index);
|
|
603
|
+
setDefaultEventValues(this, element, index);
|
|
625
604
|
adjustEvent(this, element);
|
|
605
|
+
});
|
|
626
606
|
|
|
627
|
-
});
|
|
628
|
-
|
|
629
607
|
setTimeout(() => {
|
|
630
608
|
this.pauseObserver = false;
|
|
631
|
-
},
|
|
632
|
-
|
|
609
|
+
}, '500');
|
|
633
610
|
}
|
|
634
611
|
|
|
635
612
|
addJSEvents(component): void {
|
|
636
|
-
|
|
637
|
-
// Add events to the newly created calendar
|
|
613
|
+
// Add events to the newly created calendar
|
|
638
614
|
const title = component.shadowRoot?.querySelector('.calendar__title');
|
|
639
615
|
const datePicker = component.shadowRoot?.querySelector(`#date`);
|
|
640
616
|
const viewPicker = component.shadowRoot?.querySelector(`#view`);
|
|
@@ -644,274 +620,240 @@ class iamCalendar extends HTMLElement {
|
|
|
644
620
|
const date = today.getDate();
|
|
645
621
|
const month = today.getMonth();
|
|
646
622
|
const year = today.getFullYear();
|
|
647
|
-
const strToday = `${year}-${String(month+1).padStart(2,
|
|
623
|
+
const strToday = `${year}-${String(month + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
|
|
648
624
|
|
|
649
625
|
const tbody = component.shadowRoot?.querySelector('#calendar > table > tbody');
|
|
650
626
|
|
|
651
627
|
// clicking on the day istelf
|
|
652
|
-
Array.from(component.shadowRoot.querySelectorAll('.month-wrapper > table > tbody > tr > td:has(slot)')).forEach(
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
Array.from(tbody.querySelectorAll(':scope > tr > td')).forEach((innerelement) => {
|
|
662
|
-
innerelement.classList.remove('selected');
|
|
663
|
-
});
|
|
664
|
-
|
|
665
|
-
element.classList.add('selected');
|
|
666
|
-
|
|
667
|
-
// Go to day if the in month view with out split view enabled
|
|
668
|
-
|
|
669
|
-
if(component.shadowRoot.querySelector('[name="split"]:checked') && viewPicker.value == "month"){
|
|
670
|
-
|
|
671
|
-
Array.from(component.querySelectorAll(`[data-slot]`)).forEach((button) => {
|
|
672
|
-
button.setAttribute('slot',button.getAttribute('data-slot'));
|
|
628
|
+
Array.from(component.shadowRoot.querySelectorAll('.month-wrapper > table > tbody > tr > td:has(slot)')).forEach(
|
|
629
|
+
(element) => {
|
|
630
|
+
element.addEventListener('click', (event) => {
|
|
631
|
+
if (!event.target.matches('button')) {
|
|
632
|
+
const elementDate = element.querySelector('time').getAttribute('datetime');
|
|
633
|
+
datePicker.value = elementDate;
|
|
634
|
+
|
|
635
|
+
Array.from(tbody.querySelectorAll(':scope > tr > td')).forEach((innerelement) => {
|
|
636
|
+
innerelement.classList.remove('selected');
|
|
673
637
|
});
|
|
674
638
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
639
|
+
element.classList.add('selected');
|
|
640
|
+
|
|
641
|
+
// Go to day if the in month view with out split view enabled
|
|
642
|
+
|
|
643
|
+
if (component.shadowRoot.querySelector('[name="split"]:checked') && viewPicker.value == 'month') {
|
|
644
|
+
Array.from(component.querySelectorAll(`[data-slot]`)).forEach((button) => {
|
|
645
|
+
button.setAttribute('slot', button.getAttribute('data-slot'));
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
Array.from(component.querySelectorAll(`[slot^="${datePicker.value}"]`)).forEach((button) => {
|
|
649
|
+
button.setAttribute('data-slot', button.getAttribute('slot'));
|
|
650
|
+
button.removeAttribute('slot');
|
|
651
|
+
});
|
|
652
|
+
} else if (!component.shadowRoot.querySelector('[name="split"]:checked') && viewPicker.value == 'month') {
|
|
653
|
+
viewPicker.value = 'day';
|
|
654
|
+
title?.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
|
|
655
|
+
component.scrollIntoPlace();
|
|
656
|
+
}
|
|
657
|
+
if (viewPicker.value == 'year') {
|
|
658
|
+
viewPicker.value = 'month';
|
|
659
|
+
yearView?.innerHTML = '';
|
|
660
|
+
tbody?.innerHTML = component.createCalendar(datePicker.value, strToday);
|
|
661
|
+
component.addEvents();
|
|
662
|
+
}
|
|
687
663
|
}
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
yearView?.innerHTML = '';
|
|
692
|
-
tbody?.innerHTML = component.createCalendar(datePicker.value, strToday);
|
|
693
|
-
component.addEvents();
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
});
|
|
697
|
-
});
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
);
|
|
698
667
|
|
|
699
668
|
// Drag and drop
|
|
700
669
|
component.shadowRoot?.querySelectorAll(`#calendar .table--day td span`).forEach((element) => {
|
|
701
|
-
|
|
702
|
-
element.addEventListener("dragover", (ev) => {
|
|
670
|
+
element.addEventListener('dragover', (ev) => {
|
|
703
671
|
ev.preventDefault();
|
|
704
672
|
return false;
|
|
705
673
|
});
|
|
706
674
|
|
|
707
|
-
element.addEventListener(
|
|
675
|
+
element.addEventListener('dragenter', (ev) => {
|
|
708
676
|
ev.preventDefault();
|
|
709
677
|
element.classList.add('dragover');
|
|
710
678
|
});
|
|
711
679
|
|
|
712
|
-
element.addEventListener(
|
|
680
|
+
element.addEventListener('dragleave', (ev) => {
|
|
713
681
|
ev.preventDefault();
|
|
714
682
|
element.classList.remove('dragover');
|
|
715
683
|
});
|
|
716
684
|
|
|
717
|
-
element.addEventListener(
|
|
685
|
+
element.addEventListener('drop', (ev) => {
|
|
718
686
|
ev.preventDefault();
|
|
719
|
-
|
|
720
|
-
const droppedElement = component.querySelector(`#${ev.dataTransfer.getData(
|
|
687
|
+
|
|
688
|
+
const droppedElement = component.querySelector(`#${ev.dataTransfer.getData('text')}`);
|
|
721
689
|
const td = element.closest('td');
|
|
722
690
|
const datetime = element.getAttribute('datetime');
|
|
723
691
|
|
|
724
692
|
element.classList.remove('dragover');
|
|
725
693
|
|
|
726
694
|
// Add a new slot to te span if needed
|
|
727
|
-
if
|
|
728
|
-
element.
|
|
695
|
+
if (
|
|
696
|
+
!element.querySelector(
|
|
697
|
+
`slot[name="${datetime}${td.hasAttribute('data-calendar') ? `-${td.getAttribute('data-calendar').replace('_', '')}]` : ''}]"`
|
|
698
|
+
)
|
|
699
|
+
) {
|
|
700
|
+
element.insertAdjacentHTML(
|
|
701
|
+
'beforeEnd',
|
|
702
|
+
`<slot name="${datetime}${td.hasAttribute('data-calendar') ? `-${td.getAttribute('data-calendar').replace('_', '')}` : ''}" class=""></slot>`
|
|
703
|
+
);
|
|
729
704
|
}
|
|
730
705
|
|
|
731
706
|
// Update the slot attribute to match the slot the event has been dropped on
|
|
732
|
-
droppedElement?.setAttribute(
|
|
707
|
+
droppedElement?.setAttribute(
|
|
708
|
+
'slot',
|
|
709
|
+
`${datetime}${td.hasAttribute('data-calendar') ? `-${td.getAttribute('data-calendar').replace('_', '')}` : ''}`
|
|
710
|
+
);
|
|
733
711
|
});
|
|
734
|
-
|
|
735
712
|
});
|
|
736
713
|
|
|
737
|
-
// Watch for the event being resized
|
|
714
|
+
// Watch for the event being resized
|
|
738
715
|
const resizeObserver = new ResizeObserver((entries) => {
|
|
739
716
|
for (const entry of entries) {
|
|
740
|
-
|
|
741
|
-
if(entry.target.classList.contains('mousedown'))
|
|
742
|
-
entry.target.classList.add('resizing');
|
|
717
|
+
if (entry.target.classList.contains('mousedown')) entry.target.classList.add('resizing');
|
|
743
718
|
}
|
|
744
719
|
});
|
|
745
720
|
|
|
746
|
-
if(component.hasAttribute('data-drag')) {
|
|
747
|
-
|
|
721
|
+
if (component.hasAttribute('data-drag')) {
|
|
748
722
|
component.querySelectorAll(`button:not([draggable])`).forEach((element) => {
|
|
749
|
-
|
|
750
|
-
element.
|
|
751
|
-
|
|
752
|
-
ev.dataTransfer.setData("text", ev.target.id); // save the id for when dropped
|
|
723
|
+
element.setAttribute('draggable', 'true');
|
|
724
|
+
element.addEventListener('dragstart', (ev) => {
|
|
725
|
+
ev.dataTransfer.setData('text', ev.target.id); // save the id for when dropped
|
|
753
726
|
});
|
|
754
727
|
|
|
755
728
|
// set onbserver
|
|
756
729
|
resizeObserver.observe(element);
|
|
757
730
|
|
|
758
|
-
element.addEventListener(
|
|
731
|
+
element.addEventListener('mousedown', (ev) => {
|
|
759
732
|
element.classList.add('mousedown');
|
|
760
733
|
});
|
|
761
734
|
|
|
762
|
-
element.addEventListener(
|
|
763
|
-
|
|
764
|
-
if(element.classList.contains('resizing')){
|
|
765
|
-
|
|
735
|
+
element.addEventListener('click', (ev) => {
|
|
736
|
+
if (element.classList.contains('resizing')) {
|
|
766
737
|
ev.stopPropagation();
|
|
767
738
|
ev.stopImmediatePropagation();
|
|
768
739
|
|
|
769
740
|
element.classList.remove('mousedown');
|
|
770
741
|
element.classList.remove('resizing');
|
|
771
|
-
|
|
742
|
+
|
|
772
743
|
// Work out the evnt length in hours and set the height
|
|
773
744
|
const span = this.shadowRoot.querySelector(`span[datetime="${element.getAttribute('datetime')}"]`);
|
|
774
745
|
const spanStyles = window.getComputedStyle(span);
|
|
775
|
-
const hours =
|
|
746
|
+
const hours =
|
|
747
|
+
Math.round(parseInt(element.style.height) / parseInt(spanStyles.getPropertyValue('height'))) / 4;
|
|
776
748
|
|
|
777
|
-
element.setAttribute('data-hours',hours);
|
|
778
|
-
element.style.setProperty('--event-height'
|
|
749
|
+
element.setAttribute('data-hours', hours);
|
|
750
|
+
element.style.setProperty('--event-height', `${hours * (1.09375 * 4)}rem`);
|
|
779
751
|
|
|
780
|
-
element.style.height =
|
|
752
|
+
element.style.height = '';
|
|
781
753
|
|
|
782
754
|
// to do dispatch event
|
|
783
755
|
}
|
|
784
756
|
});
|
|
785
|
-
|
|
786
757
|
});
|
|
787
758
|
}
|
|
788
759
|
|
|
789
760
|
component.querySelectorAll(`button`).forEach((element) => {
|
|
790
|
-
|
|
791
|
-
element.addEventListener("contextmenu", (event) => {
|
|
792
|
-
|
|
761
|
+
element.addEventListener('contextmenu', (event) => {
|
|
793
762
|
event.preventDefault();
|
|
794
763
|
event.stopPropagation();
|
|
795
|
-
|
|
796
764
|
});
|
|
797
765
|
});
|
|
798
766
|
|
|
799
767
|
component.shadowRoot?.querySelectorAll(`.month-wrapper > table > tbody > tr > td`).forEach((element) => {
|
|
800
|
-
|
|
801
|
-
element.addEventListener("contextmenu", (event) => {
|
|
802
|
-
|
|
768
|
+
element.addEventListener('contextmenu', (event) => {
|
|
803
769
|
event.preventDefault();
|
|
804
770
|
|
|
805
771
|
const customEvent = new CustomEvent('right-click', {
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
772
|
+
detail: {
|
|
773
|
+
clientX: event.clientX,
|
|
774
|
+
clientY: event.clientY,
|
|
775
|
+
element: element,
|
|
776
|
+
datetime: element.querySelector('time').getAttribute('datetime'),
|
|
811
777
|
},
|
|
812
778
|
});
|
|
813
779
|
|
|
814
780
|
console.log(element);
|
|
815
781
|
this.dispatchEvent(customEvent);
|
|
816
|
-
|
|
817
782
|
});
|
|
818
783
|
});
|
|
819
784
|
}
|
|
820
785
|
|
|
821
786
|
paginateDate(direction, view, currentDate): string {
|
|
822
|
-
|
|
823
|
-
if(view == "month" || view == "list") {
|
|
824
|
-
|
|
787
|
+
if (view == 'month' || view == 'list') {
|
|
825
788
|
const selectedDate = new Date(currentDate);
|
|
826
789
|
|
|
827
|
-
if(direction ==
|
|
828
|
-
|
|
829
|
-
else
|
|
830
|
-
selectedDate.setMonth(selectedDate.getMonth() - 1);
|
|
790
|
+
if (direction == 'next') selectedDate.setMonth(selectedDate.getMonth() + 1);
|
|
791
|
+
else selectedDate.setMonth(selectedDate.getMonth() - 1);
|
|
831
792
|
|
|
832
793
|
const month = selectedDate.getMonth() + 1;
|
|
833
794
|
const year = selectedDate.getFullYear();
|
|
834
795
|
|
|
835
|
-
const strNextMonth = `${year}-${String(month).padStart(2,
|
|
836
|
-
|
|
837
|
-
return strNextMonth;
|
|
838
|
-
}
|
|
839
|
-
else if(view == "week") {
|
|
796
|
+
const strNextMonth = `${year}-${String(month).padStart(2, '0')}-01`;
|
|
840
797
|
|
|
798
|
+
return strNextMonth;
|
|
799
|
+
} else if (view == 'week') {
|
|
841
800
|
//const selectedDate = new Date(currentDate);
|
|
842
801
|
const monday = this.setToMonday(new Date(currentDate));
|
|
843
802
|
|
|
844
|
-
if(direction ==
|
|
845
|
-
|
|
846
|
-
else
|
|
847
|
-
monday.setDate(monday.getDate() - 7);
|
|
848
|
-
|
|
803
|
+
if (direction == 'next') monday.setDate(monday.getDate() + 7);
|
|
804
|
+
else monday.setDate(monday.getDate() - 7);
|
|
849
805
|
|
|
850
806
|
const date = monday.getDate();
|
|
851
807
|
const month = monday.getMonth() + 1;
|
|
852
808
|
const year = monday.getFullYear();
|
|
853
|
-
const strNextWeek = `${year}-${String(month).padStart(2,
|
|
809
|
+
const strNextWeek = `${year}-${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
|
|
854
810
|
|
|
855
811
|
return strNextWeek;
|
|
856
|
-
}
|
|
857
|
-
else if(view == "year"){
|
|
858
|
-
|
|
812
|
+
} else if (view == 'year') {
|
|
859
813
|
const selectedDate = new Date(currentDate);
|
|
860
814
|
|
|
861
|
-
if(direction ==
|
|
862
|
-
|
|
863
|
-
else
|
|
864
|
-
selectedDate.setYear(selectedDate.getFullYear() - 1);
|
|
815
|
+
if (direction == 'next') selectedDate.setYear(selectedDate.getFullYear() + 1);
|
|
816
|
+
else selectedDate.setYear(selectedDate.getFullYear() - 1);
|
|
865
817
|
|
|
866
818
|
const year = selectedDate.getFullYear();
|
|
867
819
|
const month = selectedDate.getMonth() + 1;
|
|
868
820
|
|
|
869
|
-
const strNextMonth = `${year}-${String(month).padStart(2,
|
|
870
|
-
|
|
821
|
+
const strNextMonth = `${year}-${String(month).padStart(2, '0')}-01`;
|
|
822
|
+
|
|
871
823
|
return strNextMonth;
|
|
872
824
|
}
|
|
873
825
|
|
|
874
826
|
const nextDay = new Date(currentDate);
|
|
875
827
|
|
|
876
|
-
if(direction ==
|
|
877
|
-
|
|
878
|
-
else
|
|
879
|
-
nextDay.setDate(nextDay.getDate() - 1);
|
|
828
|
+
if (direction == 'next') nextDay.setDate(nextDay.getDate() + 1);
|
|
829
|
+
else nextDay.setDate(nextDay.getDate() - 1);
|
|
880
830
|
|
|
881
831
|
const date = nextDay.getDate();
|
|
882
832
|
const month = nextDay.getMonth() + 1;
|
|
883
833
|
const year = nextDay.getFullYear();
|
|
884
|
-
const strNextDay = `${year}-${String(month).padStart(2,
|
|
885
|
-
|
|
834
|
+
const strNextDay = `${year}-${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
|
|
835
|
+
|
|
886
836
|
return strNextDay;
|
|
887
837
|
}
|
|
888
838
|
|
|
889
|
-
|
|
890
839
|
setWeekDay(): void {
|
|
891
|
-
|
|
892
|
-
this.shadowRoot?.querySelectorAll('.out-of-hours').forEach(element => {
|
|
840
|
+
this.shadowRoot?.querySelectorAll('.out-of-hours').forEach((element) => {
|
|
893
841
|
element.classList.remove('out-of-hours');
|
|
894
842
|
});
|
|
895
843
|
|
|
896
|
-
|
|
897
844
|
const startTime = parseInt(this.shadowRoot?.querySelector('#start-time').value.split(':')[0]);
|
|
898
845
|
const endTime = parseInt(this.shadowRoot?.querySelector('#end-time').value.split(':')[0]);
|
|
899
846
|
|
|
900
|
-
this.shadowRoot?.querySelectorAll('[data-hour]').forEach(element => {
|
|
901
|
-
|
|
847
|
+
this.shadowRoot?.querySelectorAll('[data-hour]').forEach((element) => {
|
|
902
848
|
const hour = parseInt(element.getAttribute('data-hour'));
|
|
903
849
|
|
|
904
|
-
if(hour < startTime)
|
|
905
|
-
element.classList.add('out-of-hours');
|
|
850
|
+
if (hour < startTime) element.classList.add('out-of-hours');
|
|
906
851
|
|
|
907
|
-
if(hour >= endTime)
|
|
908
|
-
element.classList.add('out-of-hours');
|
|
852
|
+
if (hour >= endTime) element.classList.add('out-of-hours');
|
|
909
853
|
});
|
|
910
|
-
|
|
911
854
|
}
|
|
912
855
|
|
|
913
856
|
scrollIntoPlace(): void {
|
|
914
|
-
|
|
915
857
|
const fs = parseInt(window.getComputedStyle(document.body).getPropertyValue('font-size'));
|
|
916
858
|
const startTime = parseInt(this.shadowRoot?.querySelector('#start-time').value.split(':')[0]);
|
|
917
859
|
const scrollPos = startTime * (4.5 * fs);
|
|
@@ -919,38 +861,31 @@ class iamCalendar extends HTMLElement {
|
|
|
919
861
|
const wrapper = this.shadowRoot.querySelector('.calendar__wrapper');
|
|
920
862
|
|
|
921
863
|
// scroll
|
|
922
|
-
if(viewPicker.value ==
|
|
923
|
-
wrapper.scrollTo(0,scrollPos); // TO DO work out how much to scroll by
|
|
924
|
-
else if(viewPicker.value ==
|
|
925
|
-
wrapper.scrollTo(0,scrollPos); // TO DO work out how much to scroll by
|
|
864
|
+
if (viewPicker.value == 'week')
|
|
865
|
+
wrapper.scrollTo(0, scrollPos); // TO DO work out how much to scroll by
|
|
866
|
+
else if (viewPicker.value == 'day') {
|
|
867
|
+
wrapper.scrollTo(0, scrollPos); // TO DO work out how much to scroll by
|
|
926
868
|
}
|
|
927
869
|
}
|
|
928
870
|
|
|
929
871
|
setupSettings(): void {
|
|
930
|
-
|
|
931
872
|
const settingsButton = this.shadowRoot?.querySelector('#settings-button');
|
|
932
873
|
const settingsDialog = this.shadowRoot?.querySelector('#settings');
|
|
933
874
|
|
|
934
875
|
// Setup the pre-defined attributes and display the form elements to match
|
|
935
|
-
if(this.hasAttribute('data-hide-weekends'))
|
|
936
|
-
|
|
937
|
-
else
|
|
938
|
-
settingsDialog.querySelector('#weekends-yes').checked = true;
|
|
876
|
+
if (this.hasAttribute('data-hide-weekends')) settingsDialog.querySelector('#weekends-no').checked = true;
|
|
877
|
+
else settingsDialog.querySelector('#weekends-yes').checked = true;
|
|
939
878
|
|
|
940
|
-
if(this.hasAttribute('data-start-time'))
|
|
879
|
+
if (this.hasAttribute('data-start-time'))
|
|
941
880
|
settingsDialog.querySelector('#start-time').value = this.getAttribute('data-start-time');
|
|
942
|
-
else
|
|
943
|
-
this.setAttribute('data-start-time', settingsDialog.querySelector('#start-time').value);
|
|
881
|
+
else this.setAttribute('data-start-time', settingsDialog.querySelector('#start-time').value);
|
|
944
882
|
|
|
945
|
-
if(this.hasAttribute('data-end-time'))
|
|
883
|
+
if (this.hasAttribute('data-end-time'))
|
|
946
884
|
settingsDialog.querySelector('#end-time').value = this.getAttribute('data-end-time');
|
|
947
|
-
else
|
|
948
|
-
this.setAttribute('data-end-time', settingsDialog.querySelector('#end-time').value);
|
|
949
|
-
|
|
885
|
+
else this.setAttribute('data-end-time', settingsDialog.querySelector('#end-time').value);
|
|
950
886
|
|
|
951
887
|
// open dialog
|
|
952
|
-
settingsButton?.addEventListener('click', ()=> {
|
|
953
|
-
|
|
888
|
+
settingsButton?.addEventListener('click', () => {
|
|
954
889
|
settingsDialog.showModal();
|
|
955
890
|
settingsDialog.focus();
|
|
956
891
|
|
|
@@ -960,18 +895,12 @@ class iamCalendar extends HTMLElement {
|
|
|
960
895
|
});
|
|
961
896
|
|
|
962
897
|
// On clicking the save button, adjust the data attributes
|
|
963
|
-
settingsDialog?.addEventListener('click', (event)=> {
|
|
964
|
-
|
|
898
|
+
settingsDialog?.addEventListener('click', (event) => {
|
|
965
899
|
if (event && event.target.matches('button')) {
|
|
900
|
+
if (event.target.matches('.btn-primary')) {
|
|
901
|
+
if (settingsDialog.querySelector('#weekends-no:checked')) this.setAttribute('data-hide-weekends', 'true');
|
|
902
|
+
else this.removeAttribute('data-hide-weekends');
|
|
966
903
|
|
|
967
|
-
if(event.target.matches('.btn-primary')){
|
|
968
|
-
|
|
969
|
-
if(settingsDialog.querySelector('#weekends-no:checked'))
|
|
970
|
-
this.setAttribute('data-hide-weekends','true');
|
|
971
|
-
else
|
|
972
|
-
this.removeAttribute('data-hide-weekends');
|
|
973
|
-
|
|
974
|
-
|
|
975
904
|
this.setAttribute('data-start-time', settingsDialog.querySelector('#start-time').value);
|
|
976
905
|
this.setAttribute('data-end-time', settingsDialog.querySelector('#end-time').value);
|
|
977
906
|
|
|
@@ -979,7 +908,6 @@ class iamCalendar extends HTMLElement {
|
|
|
979
908
|
|
|
980
909
|
const customEvent = new CustomEvent('save-settings');
|
|
981
910
|
this.dispatchEvent(customEvent);
|
|
982
|
-
|
|
983
911
|
}
|
|
984
912
|
|
|
985
913
|
const customEvent = new CustomEvent('close-settings');
|
|
@@ -991,43 +919,37 @@ class iamCalendar extends HTMLElement {
|
|
|
991
919
|
}
|
|
992
920
|
|
|
993
921
|
setTime(): void {
|
|
994
|
-
|
|
995
|
-
if(!this.hasAttribute('data-time')){
|
|
996
|
-
|
|
922
|
+
if (!this.hasAttribute('data-time')) {
|
|
997
923
|
const today = new Date();
|
|
998
|
-
|
|
924
|
+
|
|
999
925
|
const hour = today.getHours();
|
|
1000
926
|
const minute = today.getMinutes();
|
|
1001
927
|
const time = `${hour}:${minute}`;
|
|
1002
928
|
|
|
1003
|
-
this.setAttribute('data-time',time);
|
|
929
|
+
this.setAttribute('data-time', time);
|
|
1004
930
|
}
|
|
1005
931
|
|
|
1006
|
-
if(this.hasAttribute('data-time')){
|
|
1007
|
-
|
|
932
|
+
if (this.hasAttribute('data-time')) {
|
|
1008
933
|
const time = this.getAttribute('data-time');
|
|
1009
934
|
const hour = parseInt(time.split(':')[0]);
|
|
1010
935
|
const minute = parseInt(time.split(':')[1]);
|
|
1011
936
|
|
|
1012
937
|
this.shadowRoot?.querySelectorAll(`[data-hour="${hour}"]`).forEach((element) => {
|
|
1013
|
-
|
|
1014
|
-
element.setAttribute('data-time',time);
|
|
938
|
+
element.setAttribute('data-time', time);
|
|
1015
939
|
element.classList.add('column-header');
|
|
1016
|
-
element.closest('tr')?.style.setProperty('--minute-pos',(
|
|
940
|
+
element.closest('tr')?.style.setProperty('--minute-pos', (minute / 60) * 100 + '%');
|
|
1017
941
|
});
|
|
1018
942
|
}
|
|
1019
943
|
}
|
|
1020
944
|
|
|
1021
945
|
getYearView(selectedDate, today, sundayFirst: false): string {
|
|
1022
|
-
|
|
1023
|
-
let yearViewStr = "";
|
|
946
|
+
let yearViewStr = '';
|
|
1024
947
|
|
|
1025
|
-
for(let i = 0; i < 12; i++){
|
|
1026
|
-
|
|
948
|
+
for (let i = 0; i < 12; i++) {
|
|
1027
949
|
console.log(selectedDate);
|
|
1028
950
|
const selectedDateObj = new Date(selectedDate);
|
|
1029
951
|
const selectedYear = selectedDateObj.getFullYear();
|
|
1030
|
-
const selectedFormattedDate = `${selectedYear}-${String(i+1).padStart(2,
|
|
952
|
+
const selectedFormattedDate = `${selectedYear}-${String(i + 1).padStart(2, '0')}-01`;
|
|
1031
953
|
|
|
1032
954
|
yearViewStr += `<div class='month-wrapper'>
|
|
1033
955
|
<time class="column-header">${this.monthArray[i]}</time>
|
|
@@ -1045,10 +967,7 @@ class iamCalendar extends HTMLElement {
|
|
|
1045
967
|
return yearViewStr;
|
|
1046
968
|
}
|
|
1047
969
|
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
970
|
connectedCallback(): void {
|
|
1051
|
-
|
|
1052
971
|
// To to transform the below into variables of component to make more re-usable
|
|
1053
972
|
const title = this.shadowRoot?.querySelector('.calendar__title');
|
|
1054
973
|
const tbody = this.shadowRoot?.querySelector('#calendar > table > tbody');
|
|
@@ -1066,8 +985,6 @@ class iamCalendar extends HTMLElement {
|
|
|
1066
985
|
const sundayFirst = this.hasAttribute('data-sunday-first');
|
|
1067
986
|
|
|
1068
987
|
const splitButton = this.shadowRoot?.querySelector(`[name="split"]`);
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
988
|
|
|
1072
989
|
// set the table head - starting by monday by default but can be changed to sunday
|
|
1073
990
|
thead?.innerHTML = this.createThead(sundayFirst);
|
|
@@ -1078,85 +995,71 @@ class iamCalendar extends HTMLElement {
|
|
|
1078
995
|
const date = today.getDate();
|
|
1079
996
|
const month = today.getMonth();
|
|
1080
997
|
const year = today.getFullYear();
|
|
1081
|
-
const strToday = `${year}-${String(month+1).padStart(2,
|
|
998
|
+
const strToday = `${year}-${String(month + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
|
|
1082
999
|
|
|
1083
1000
|
datePicker.value = strToday;
|
|
1084
1001
|
|
|
1085
1002
|
// Setup the view, month being default
|
|
1086
|
-
if(this.hasAttribute('data-view'))
|
|
1087
|
-
viewPicker.value = this.getAttribute('data-view');
|
|
1003
|
+
if (this.hasAttribute('data-view')) viewPicker.value = this.getAttribute('data-view');
|
|
1088
1004
|
else {
|
|
1089
|
-
this.setAttribute('data-view',
|
|
1090
|
-
viewPicker.value =
|
|
1005
|
+
this.setAttribute('data-view', 'month');
|
|
1006
|
+
viewPicker.value = 'month';
|
|
1091
1007
|
}
|
|
1092
1008
|
|
|
1093
|
-
if(this.hasAttribute('data-views'))
|
|
1094
|
-
viewPicker?.setAttribute('data-views', this.getAttribute('data-views'));
|
|
1009
|
+
if (this.hasAttribute('data-views')) viewPicker?.setAttribute('data-views', this.getAttribute('data-views'));
|
|
1095
1010
|
|
|
1096
1011
|
// Create the calendars
|
|
1097
|
-
if(this.hasAttribute('data-calendars')){
|
|
1098
|
-
|
|
1012
|
+
if (this.hasAttribute('data-calendars')) {
|
|
1099
1013
|
this.calendars = this.getAttribute('data-calendars').split(',');
|
|
1100
1014
|
|
|
1101
|
-
this.calendars.forEach((item,index) => {
|
|
1015
|
+
this.calendars.forEach((item, index) => {
|
|
1102
1016
|
this.calendars[index] = item.trim();
|
|
1103
1017
|
});
|
|
1104
1018
|
}
|
|
1105
1019
|
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
1020
|
// Setup the settings dialog
|
|
1109
1021
|
this.setupSettings();
|
|
1110
1022
|
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
// Setup the calendar then adjust and add events
|
|
1114
|
-
title?.innerHTML = this.getTitle(strToday,viewPicker.value);
|
|
1023
|
+
// Setup the calendar then adjust and add events
|
|
1024
|
+
title?.innerHTML = this.getTitle(strToday, viewPicker.value);
|
|
1115
1025
|
|
|
1116
1026
|
const calendarHtml = this.createCalendar(strToday, strToday, sundayFirst);
|
|
1117
1027
|
tbody?.innerHTML = calendarHtml;
|
|
1118
1028
|
//tbodySplit?.innerHTML = calendarHtml;
|
|
1119
1029
|
weekViewHeader?.innerHTML = calendarHtml;
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
if(viewPicker.value == "year"){
|
|
1123
1030
|
|
|
1031
|
+
if (viewPicker.value == 'year') {
|
|
1124
1032
|
yearView?.innerHTML = this.getYearView(datePicker.value, strToday, sundayFirst);
|
|
1125
1033
|
tbody?.innerHTML = '';
|
|
1126
1034
|
}
|
|
1127
|
-
|
|
1035
|
+
|
|
1128
1036
|
this.addEvents();
|
|
1129
1037
|
this.addJSEvents(this);
|
|
1130
1038
|
this.setWeekDay(); // Working hours
|
|
1131
1039
|
this.setTime(); // Month and day view has a current time indicator
|
|
1132
1040
|
this.scrollIntoPlace(); // Scroll into place - month and day view needs have the weekday hours in place
|
|
1133
|
-
|
|
1041
|
+
|
|
1134
1042
|
// #region Add events for the basic top controls
|
|
1135
1043
|
|
|
1136
1044
|
// Remove the slot attribute on selected days when in split mode
|
|
1137
|
-
splitButton?.addEventListener('change', ()=> {
|
|
1138
|
-
|
|
1139
|
-
if(splitButton.checked){
|
|
1045
|
+
splitButton?.addEventListener('change', () => {
|
|
1046
|
+
if (splitButton.checked) {
|
|
1140
1047
|
Array.from(this.querySelectorAll(`[slot^="${datePicker.value}"]`)).forEach((button) => {
|
|
1141
|
-
|
|
1142
|
-
button.setAttribute('data-slot',button.getAttribute('slot'));
|
|
1048
|
+
button.setAttribute('data-slot', button.getAttribute('slot'));
|
|
1143
1049
|
button.removeAttribute('slot');
|
|
1144
1050
|
});
|
|
1145
|
-
}
|
|
1146
|
-
else {
|
|
1051
|
+
} else {
|
|
1147
1052
|
Array.from(this.querySelectorAll(`[data-slot]`)).forEach((button) => {
|
|
1148
|
-
button.setAttribute('slot',button.getAttribute('data-slot'));
|
|
1053
|
+
button.setAttribute('slot', button.getAttribute('data-slot'));
|
|
1149
1054
|
});
|
|
1150
1055
|
}
|
|
1151
1056
|
});
|
|
1152
1057
|
|
|
1153
1058
|
const resizeObserver = new ResizeObserver((entries) => {
|
|
1154
|
-
|
|
1155
1059
|
const splitButtonDisplayed = window.getComputedStyle(splitButton?.parentElement, null).display;
|
|
1156
|
-
if(splitButtonDisplayed ==
|
|
1157
|
-
|
|
1060
|
+
if (splitButtonDisplayed == 'none') {
|
|
1158
1061
|
Array.from(this.querySelectorAll(`[data-slot]`)).forEach((button) => {
|
|
1159
|
-
button.setAttribute('slot',button.getAttribute('data-slot'));
|
|
1062
|
+
button.setAttribute('slot', button.getAttribute('data-slot'));
|
|
1160
1063
|
});
|
|
1161
1064
|
splitButton.checked = false;
|
|
1162
1065
|
}
|
|
@@ -1164,38 +1067,29 @@ class iamCalendar extends HTMLElement {
|
|
|
1164
1067
|
|
|
1165
1068
|
resizeObserver.observe(this);
|
|
1166
1069
|
|
|
1167
|
-
viewPicker?.addEventListener('change', ()=> {
|
|
1168
|
-
|
|
1169
|
-
title?.innerHTML = this.getTitle(datePicker.value,viewPicker.value);
|
|
1070
|
+
viewPicker?.addEventListener('change', () => {
|
|
1071
|
+
title?.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
|
|
1170
1072
|
this.setAttribute('data-view', viewPicker.value);
|
|
1171
1073
|
|
|
1172
|
-
if(viewPicker.value ==
|
|
1173
|
-
|
|
1074
|
+
if (viewPicker.value == 'week') {
|
|
1174
1075
|
Array.from(this.querySelectorAll(`.allday-event`)).forEach((button) => {
|
|
1175
|
-
|
|
1176
|
-
button.setAttribute('slot',button.getAttribute('slot')+'-header');
|
|
1076
|
+
button.setAttribute('slot', button.getAttribute('slot') + '-header');
|
|
1177
1077
|
});
|
|
1178
|
-
}
|
|
1179
|
-
else {
|
|
1078
|
+
} else {
|
|
1180
1079
|
Array.from(this.querySelectorAll(`.allday-event`)).forEach((button) => {
|
|
1181
|
-
|
|
1182
|
-
button.setAttribute('slot',button.getAttribute('slot')?.replace('-header',''));
|
|
1080
|
+
button.setAttribute('slot', button.getAttribute('slot')?.replace('-header', ''));
|
|
1183
1081
|
});
|
|
1184
1082
|
}
|
|
1185
1083
|
|
|
1084
|
+
if (viewPicker.value == 'week' || viewPicker.value == 'day') this.scrollIntoPlace();
|
|
1186
1085
|
|
|
1187
|
-
if(viewPicker.value
|
|
1188
|
-
this.scrollIntoPlace();
|
|
1189
|
-
|
|
1190
|
-
if(viewPicker.value != "month"){
|
|
1191
|
-
|
|
1086
|
+
if (viewPicker.value != 'month') {
|
|
1192
1087
|
Array.from(this.querySelectorAll(`[data-slot^="${datePicker.value}"]`)).forEach((button) => {
|
|
1193
|
-
button.setAttribute('slot',button.getAttribute('data-slot'));
|
|
1088
|
+
button.setAttribute('slot', button.getAttribute('data-slot'));
|
|
1194
1089
|
});
|
|
1195
1090
|
}
|
|
1196
1091
|
|
|
1197
|
-
if(viewPicker.value ==
|
|
1198
|
-
|
|
1092
|
+
if (viewPicker.value == 'year') {
|
|
1199
1093
|
yearView?.innerHTML = this.getYearView(datePicker.value, strToday, sundayFirst);
|
|
1200
1094
|
tbody?.innerHTML = '';
|
|
1201
1095
|
this.addEvents();
|
|
@@ -1203,8 +1097,7 @@ class iamCalendar extends HTMLElement {
|
|
|
1203
1097
|
this.setWeekDay(); // Working hours
|
|
1204
1098
|
this.setTime(); // Month and day view has a current time indicator
|
|
1205
1099
|
this.scrollIntoPlace();
|
|
1206
|
-
}
|
|
1207
|
-
else if(tbody?.innerHTML == "") {
|
|
1100
|
+
} else if (tbody?.innerHTML == '') {
|
|
1208
1101
|
yearView?.innerHTML = '';
|
|
1209
1102
|
tbody?.innerHTML = this.createCalendar(datePicker.value, strToday);
|
|
1210
1103
|
this.addEvents();
|
|
@@ -1215,29 +1108,24 @@ class iamCalendar extends HTMLElement {
|
|
|
1215
1108
|
}
|
|
1216
1109
|
|
|
1217
1110
|
const customEvent = new CustomEvent('change-view', {
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1111
|
+
detail: {
|
|
1112
|
+
view: viewPicker.value,
|
|
1113
|
+
date: datePicker.value,
|
|
1221
1114
|
},
|
|
1222
1115
|
});
|
|
1223
1116
|
|
|
1224
1117
|
this.dispatchEvent(customEvent);
|
|
1225
1118
|
});
|
|
1226
1119
|
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
if(viewPicker.value == "year"){
|
|
1231
|
-
|
|
1120
|
+
function resetCalendar(component): void {
|
|
1121
|
+
if (viewPicker.value == 'year') {
|
|
1232
1122
|
yearView?.innerHTML = component.getYearView(datePicker.value, strToday, sundayFirst);
|
|
1233
1123
|
tbody?.innerHTML = '';
|
|
1234
1124
|
component.addEvents();
|
|
1235
1125
|
component.addJSEvents(component);
|
|
1236
1126
|
component.setWeekDay(); // Working hours
|
|
1237
1127
|
component.setTime(); // Month and day view has a current time indicator
|
|
1238
|
-
}
|
|
1239
|
-
else {
|
|
1240
|
-
|
|
1128
|
+
} else {
|
|
1241
1129
|
const calendarHtml = component.createCalendar(datePicker.value, strToday);
|
|
1242
1130
|
tbody?.innerHTML = calendarHtml;
|
|
1243
1131
|
//tbodySplit?.innerHTML = calendarHtml;
|
|
@@ -1250,58 +1138,55 @@ class iamCalendar extends HTMLElement {
|
|
|
1250
1138
|
}
|
|
1251
1139
|
}
|
|
1252
1140
|
|
|
1253
|
-
function updateCalendar(component): void{
|
|
1254
|
-
|
|
1141
|
+
function updateCalendar(component): void {
|
|
1255
1142
|
Array.from(component.shadowRoot.querySelectorAll('.selected')).forEach((element) => {
|
|
1256
1143
|
element.classList.remove('selected');
|
|
1257
1144
|
});
|
|
1258
1145
|
|
|
1259
|
-
Array.from(
|
|
1146
|
+
Array.from(
|
|
1147
|
+
component.shadowRoot.querySelectorAll(
|
|
1148
|
+
`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`
|
|
1149
|
+
)
|
|
1150
|
+
).forEach((element) => {
|
|
1260
1151
|
element.classList.add('selected');
|
|
1261
1152
|
});
|
|
1262
1153
|
}
|
|
1263
1154
|
|
|
1264
|
-
datePicker?.addEventListener('change', ()=> {
|
|
1265
|
-
|
|
1266
|
-
title?.innerHTML = this.getTitle(datePicker.value,viewPicker.value);
|
|
1155
|
+
datePicker?.addEventListener('change', () => {
|
|
1156
|
+
title?.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
|
|
1267
1157
|
|
|
1268
|
-
if(this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
|
|
1158
|
+
if (this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
|
|
1269
1159
|
updateCalendar(this);
|
|
1270
|
-
else
|
|
1271
|
-
resetCalendar(this);
|
|
1160
|
+
else resetCalendar(this);
|
|
1272
1161
|
|
|
1273
1162
|
const customEvent = new CustomEvent('change-date', {
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1163
|
+
detail: {
|
|
1164
|
+
view: viewPicker.value,
|
|
1165
|
+
date: datePicker.value,
|
|
1277
1166
|
},
|
|
1278
1167
|
});
|
|
1279
1168
|
|
|
1280
1169
|
this.dispatchEvent(customEvent);
|
|
1281
1170
|
});
|
|
1282
1171
|
|
|
1283
|
-
filtersButton?.addEventListener('click', ()=> {
|
|
1284
|
-
|
|
1285
|
-
const customEvent = new CustomEvent('open-filters',);
|
|
1172
|
+
filtersButton?.addEventListener('click', () => {
|
|
1173
|
+
const customEvent = new CustomEvent('open-filters');
|
|
1286
1174
|
this.dispatchEvent(customEvent);
|
|
1287
1175
|
});
|
|
1288
1176
|
|
|
1289
1177
|
// HTML Observer
|
|
1290
1178
|
const htmlUpdated = (mutationList: any, observer: any): void => {
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
1179
|
observer.disconnect();
|
|
1296
1180
|
|
|
1297
1181
|
console.log(this.pauseObserver);
|
|
1298
1182
|
|
|
1299
|
-
if(this.pauseObserver == false){
|
|
1300
|
-
|
|
1183
|
+
if (this.pauseObserver == false) {
|
|
1301
1184
|
for (const mutation of mutationList) {
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1185
|
+
if (
|
|
1186
|
+
mutation.type == 'characterData' ||
|
|
1187
|
+
(mutation.type == 'childList' && mutation.addedNodes.length) ||
|
|
1188
|
+
mutation.type === 'attributes'
|
|
1189
|
+
) {
|
|
1305
1190
|
//resetCalendar(this);
|
|
1306
1191
|
this.addEvents();
|
|
1307
1192
|
}
|
|
@@ -1314,62 +1199,56 @@ class iamCalendar extends HTMLElement {
|
|
|
1314
1199
|
const observer = new MutationObserver(htmlUpdated);
|
|
1315
1200
|
observer.observe(this, { childList: true, characterData: true, subtree: true, attributes: true });
|
|
1316
1201
|
|
|
1317
|
-
todayButton?.addEventListener('click', ()=> {
|
|
1318
|
-
|
|
1202
|
+
todayButton?.addEventListener('click', () => {
|
|
1319
1203
|
datePicker.value = strToday;
|
|
1320
|
-
title?.innerHTML = this.getTitle(datePicker.value,viewPicker.value);
|
|
1204
|
+
title?.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
|
|
1321
1205
|
|
|
1322
|
-
if(this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
|
|
1206
|
+
if (this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
|
|
1323
1207
|
updateCalendar(this);
|
|
1324
|
-
else
|
|
1325
|
-
resetCalendar(this);
|
|
1208
|
+
else resetCalendar(this);
|
|
1326
1209
|
|
|
1327
1210
|
const customEvent = new CustomEvent('change-date-today', {
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1211
|
+
detail: {
|
|
1212
|
+
view: viewPicker.value,
|
|
1213
|
+
date: datePicker.value,
|
|
1331
1214
|
},
|
|
1332
1215
|
});
|
|
1333
1216
|
|
|
1334
1217
|
this.dispatchEvent(customEvent);
|
|
1335
1218
|
});
|
|
1336
1219
|
|
|
1337
|
-
prevButton?.addEventListener('click', ()=> {
|
|
1220
|
+
prevButton?.addEventListener('click', () => {
|
|
1221
|
+
datePicker.value = this.paginateDate('prev', viewPicker.value, datePicker.value);
|
|
1222
|
+
title?.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
|
|
1338
1223
|
|
|
1339
|
-
|
|
1340
|
-
title?.innerHTML = this.getTitle(datePicker.value,viewPicker.value);
|
|
1341
|
-
|
|
1342
|
-
if(this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
|
|
1224
|
+
if (this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
|
|
1343
1225
|
updateCalendar(this);
|
|
1344
|
-
else
|
|
1345
|
-
resetCalendar(this);
|
|
1226
|
+
else resetCalendar(this);
|
|
1346
1227
|
|
|
1347
1228
|
const customEvent = new CustomEvent('change-date-previous', {
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1229
|
+
detail: {
|
|
1230
|
+
view: viewPicker.value,
|
|
1231
|
+
date: datePicker.value,
|
|
1351
1232
|
},
|
|
1352
1233
|
});
|
|
1353
1234
|
|
|
1354
1235
|
this.dispatchEvent(customEvent);
|
|
1355
1236
|
});
|
|
1356
1237
|
|
|
1357
|
-
nextButton?.addEventListener('click', ()=> {
|
|
1238
|
+
nextButton?.addEventListener('click', () => {
|
|
1239
|
+
datePicker.value = this.paginateDate('next', viewPicker.value, datePicker.value);
|
|
1240
|
+
title?.innerHTML = this.getTitle(datePicker.value, viewPicker.value);
|
|
1358
1241
|
|
|
1359
|
-
|
|
1360
|
-
title?.innerHTML = this.getTitle(datePicker.value,viewPicker.value);
|
|
1361
|
-
|
|
1362
|
-
console.log(datePicker.value)
|
|
1242
|
+
console.log(datePicker.value);
|
|
1363
1243
|
|
|
1364
|
-
if(this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
|
|
1244
|
+
if (this.shadowRoot.querySelector(`td:has(time[datetime="${datePicker.value}"]):not(.prev-month, .next-month)`))
|
|
1365
1245
|
updateCalendar(this);
|
|
1366
|
-
else
|
|
1367
|
-
resetCalendar(this);
|
|
1246
|
+
else resetCalendar(this);
|
|
1368
1247
|
|
|
1369
1248
|
const customEvent = new CustomEvent('change-date-next', {
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1249
|
+
detail: {
|
|
1250
|
+
view: viewPicker.value,
|
|
1251
|
+
date: datePicker.value,
|
|
1373
1252
|
},
|
|
1374
1253
|
});
|
|
1375
1254
|
|
|
@@ -1387,23 +1266,20 @@ class iamCalendar extends HTMLElement {
|
|
|
1387
1266
|
'change-date-next',
|
|
1388
1267
|
'open-settings',
|
|
1389
1268
|
'close-settings',
|
|
1390
|
-
'save-settings'
|
|
1269
|
+
'save-settings',
|
|
1391
1270
|
]);
|
|
1392
1271
|
}
|
|
1393
1272
|
|
|
1394
1273
|
static get observedAttributes(): any {
|
|
1395
|
-
return ['data-calendars','data-view'];
|
|
1274
|
+
return ['data-calendars', 'data-view'];
|
|
1396
1275
|
}
|
|
1397
1276
|
|
|
1398
1277
|
attributeChangedCallback(attrName, oldVal, newVal): void {
|
|
1399
|
-
|
|
1400
1278
|
this.pauseObserver = true;
|
|
1401
1279
|
|
|
1402
1280
|
switch (attrName) {
|
|
1403
1281
|
case 'data-calendars': {
|
|
1404
1282
|
if (oldVal != newVal) {
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
1283
|
const tbody = this.shadowRoot?.querySelector('#calendar > table > tbody');
|
|
1408
1284
|
const weekViewHeader = this.shadowRoot?.querySelector('#week-view-header > table > tbody');
|
|
1409
1285
|
const datePicker = this.shadowRoot?.querySelector(`#date`);
|
|
@@ -1413,14 +1289,12 @@ class iamCalendar extends HTMLElement {
|
|
|
1413
1289
|
const date = today.getDate();
|
|
1414
1290
|
const month = today.getMonth();
|
|
1415
1291
|
const year = today.getFullYear();
|
|
1416
|
-
const strToday = `${year}-${String(month+1).padStart(2,
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
if(this.hasAttribute('data-calendars')){
|
|
1292
|
+
const strToday = `${year}-${String(month + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`;
|
|
1420
1293
|
|
|
1294
|
+
if (this.hasAttribute('data-calendars')) {
|
|
1421
1295
|
this.calendars = this.getAttribute('data-calendars').split(',');
|
|
1422
1296
|
|
|
1423
|
-
this.calendars.forEach((item,index) => {
|
|
1297
|
+
this.calendars.forEach((item, index) => {
|
|
1424
1298
|
this.calendars[index] = item.trim();
|
|
1425
1299
|
});
|
|
1426
1300
|
}
|
|
@@ -1433,15 +1307,13 @@ class iamCalendar extends HTMLElement {
|
|
|
1433
1307
|
this.addJSEvents(this);
|
|
1434
1308
|
this.setWeekDay();
|
|
1435
1309
|
this.setTime();
|
|
1436
|
-
|
|
1437
1310
|
}
|
|
1438
1311
|
break;
|
|
1439
|
-
}
|
|
1312
|
+
}
|
|
1440
1313
|
case 'data-view': {
|
|
1441
1314
|
if (oldVal != newVal) {
|
|
1442
|
-
|
|
1443
1315
|
const viewPicker = this.shadowRoot?.querySelector(`#view`);
|
|
1444
|
-
|
|
1316
|
+
|
|
1445
1317
|
viewPicker.value = newVal;
|
|
1446
1318
|
viewPicker.dispatchEvent(new Event('change'));
|
|
1447
1319
|
}
|
|
@@ -1451,9 +1323,7 @@ class iamCalendar extends HTMLElement {
|
|
|
1451
1323
|
|
|
1452
1324
|
setTimeout(() => {
|
|
1453
1325
|
this.pauseObserver = false;
|
|
1454
|
-
},
|
|
1455
|
-
|
|
1456
|
-
|
|
1326
|
+
}, '500');
|
|
1457
1327
|
}
|
|
1458
1328
|
}
|
|
1459
1329
|
|