@iamproperty/components 7.8.2--beta3 → 7.8.2--beta4
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/assets/css/components/actionbar.component.css +1 -1
- package/assets/css/components/actionbar.component.css.map +1 -1
- package/assets/css/components/address-lookup.component.css +1 -1
- package/assets/css/components/address-lookup.component.css.map +1 -1
- package/assets/css/components/advanced-select.component.css +1 -1
- package/assets/css/components/advanced-select.component.css.map +1 -1
- package/assets/css/components/banner.preload.css +1 -0
- package/assets/css/components/banner.preload.css.map +1 -0
- package/assets/css/components/calendar.component.css +1 -1
- package/assets/css/components/calendar.component.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/card.module.css +1 -1
- package/assets/css/components/card.module.css.map +1 -1
- package/assets/css/components/card.preload.css +1 -0
- package/assets/css/components/card.preload.css.map +1 -0
- package/assets/css/components/carousel.component.css +1 -1
- package/assets/css/components/carousel.component.css.map +1 -1
- package/assets/css/components/carousel.config.css +1 -1
- package/assets/css/components/carousel.config.css.map +1 -1
- package/assets/css/components/config.component.css +1 -1
- package/assets/css/components/config.component.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/fileupload.css +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/filter-card.component.css +1 -1
- package/assets/css/components/filter-card.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/nav.component.css +1 -1
- package/assets/css/components/nav.component.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/record-card.component.css +1 -1
- package/assets/css/components/record-card.component.css.map +1 -1
- package/assets/css/components/search.component.css +1 -1
- package/assets/css/components/search.component.css.map +1 -1
- package/assets/css/components/skeleton.global.css +1 -1
- package/assets/css/components/skeleton.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/std-nav-standalone.component.css +1 -1
- package/assets/css/components/std-nav-standalone.component.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/tag.component.css +1 -1
- package/assets/css/components/tag.component.css.map +1 -1
- package/assets/css/components/video-card.component.css +1 -1
- package/assets/css/components/video-card.component.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/elements/dropdown.css +1 -1
- package/assets/css/elements/dropdown.css.map +1 -1
- package/assets/css/elements/forms.css +1 -1
- package/assets/css/elements/forms.css.map +1 -1
- package/assets/css/elements/links--global.css +1 -1
- package/assets/css/elements/links--global.css.map +1 -1
- package/assets/css/elements/links.css +1 -1
- package/assets/css/elements/links.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.min.js +1 -1
- package/assets/js/components/actionbar/actionbar.component.min.js +2 -2
- package/assets/js/components/address-lookup/address-lookup.component.min.js +4 -4
- 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 +2 -2
- package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
- package/assets/js/components/banner/banner.component.min.js +1 -1
- package/assets/js/components/barchart/barchart.component.min.js +1 -1
- package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
- package/assets/js/components/bone/bone.component.min.js +1 -1
- package/assets/js/components/button/button.component.min.js +1 -1
- package/assets/js/components/calendar/calendar.component.min.js +2 -2
- package/assets/js/components/card/card.component.js +114 -125
- package/assets/js/components/card/card.component.min.js +7 -7
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.js +83 -29
- package/assets/js/components/carousel/carousel.component.min.js +16 -11
- package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
- package/assets/js/components/config/config.component.min.js +7 -7
- package/assets/js/components/config/config.component.min.js.map +1 -1
- package/assets/js/components/content/content.component.js +28 -69
- package/assets/js/components/content/content.component.min.js +4 -4
- package/assets/js/components/content/content.component.min.js.map +1 -1
- package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
- package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
- package/assets/js/components/filter-card/filter-card.component.min.js +5 -5
- 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/form/form.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
- package/assets/js/components/input/input.component.min.js +1 -1
- package/assets/js/components/input-range/input-range.component.min.js +1 -1
- package/assets/js/components/marketing/marketing.component.min.js +1 -1
- package/assets/js/components/menu/menu.component.min.js +1 -1
- package/assets/js/components/milestone/milestone.component.min.js +1 -1
- package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
- package/assets/js/components/modal/modal.component.min.js +1 -1
- package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
- package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +1 -1
- package/assets/js/components/multiselect/multiselect.component.min.js +4 -4
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
- package/assets/js/components/nav/nav.component.min.js +2 -2
- package/assets/js/components/notification/notification.component.min.js +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +5 -5
- package/assets/js/components/password/password.component.min.js +1 -1
- package/assets/js/components/popover/popover.component.min.js +1 -1
- package/assets/js/components/rank/rank.component.min.js +1 -1
- package/assets/js/components/rankings/rankings.component.min.js +1 -1
- package/assets/js/components/rating/rating.component.min.js +1 -1
- package/assets/js/components/record-card/record-card.component.min.js +6 -6
- package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
- package/assets/js/components/search/search.component.js +234 -186
- package/assets/js/components/search/search.component.min.js +12 -7
- package/assets/js/components/search/search.component.min.js.map +1 -1
- package/assets/js/components/skeleton/skeleton.component.min.js +1 -1
- package/assets/js/components/slider/slider.component.min.js +2 -2
- package/assets/js/components/split-button/split-button.component.min.js +2 -2
- package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +5 -5
- package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
- package/assets/js/components/std-nav/std-nav.component.js +10 -9
- package/assets/js/components/std-nav/std-nav.component.min.js +9 -12
- package/assets/js/components/std-nav/std-nav.component.min.js.map +1 -1
- package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js +5 -5
- package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js.map +1 -1
- package/assets/js/components/table/table.component.min.js +1 -1
- package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
- package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
- package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
- package/assets/js/components/tabs/tabs.component.min.js +4 -4
- package/assets/js/components/tag/tag.component.min.js +3 -3
- package/assets/js/components/tag/tag.component.min.js.map +1 -1
- package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
- package/assets/js/components/video/video.component.min.js +1 -1
- package/assets/js/components/video-card/video-card.component.min.js +9 -9
- package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
- package/assets/js/components/video-modal/video-modal.component.min.js +1 -1
- package/assets/js/components/word-count/word-count.component.min.js +1 -1
- package/assets/js/modules/card.module.js +12 -11
- package/assets/js/modules/content.js +40 -8
- package/assets/js/modules/content.test.js +62 -12
- package/assets/js/modules/data-layer.js +7 -6
- package/assets/js/modules/dropdown.js +0 -1
- package/assets/js/modules/nav.js +10 -3
- package/assets/js/modules/search.js +153 -0
- package/assets/js/modules/search.test.js +125 -0
- package/assets/js/modules/tabs.test.js +64 -12
- package/assets/js/modules/testimonial.test.js +44 -6
- package/assets/js/modules/videos.test.js +61 -13
- 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/sass/_components.scss +2 -63
- package/assets/sass/components/banner.preload.scss +26 -0
- package/assets/sass/components/card.component.scss +1 -7
- package/assets/sass/components/card.module.scss +6 -6
- package/assets/sass/components/card.preload.scss +80 -0
- package/assets/sass/components/carousel.component.scss +165 -0
- package/assets/sass/components/carousel.config.scss +85 -249
- package/assets/sass/components/content.component.scss +0 -7
- package/assets/sass/components/nav.component.scss +2 -1
- package/assets/sass/components/search.component.scss +89 -7
- package/assets/sass/components/skeleton.global.scss +4 -0
- package/assets/sass/elements/dropdown.css +2 -0
- package/assets/sass/elements/forms.scss +0 -27
- package/assets/sass/elements/links--global.scss +40 -2
- package/assets/sass/foundations/root.scss +0 -1
- package/assets/sass/utilities/js-display.css +2 -3
- package/assets/ts/components/card/card.component.ts +72 -62
- package/assets/ts/components/carousel/carousel.component.ts +84 -19
- package/assets/ts/components/content/content.component.ts +36 -100
- package/assets/ts/components/search/search.component.ts +257 -185
- package/assets/ts/components/std-nav/std-nav.component.ts +17 -16
- package/assets/ts/html.d.ts +6 -0
- package/assets/ts/modules/card.module.ts +20 -12
- package/assets/ts/modules/content.test.ts +84 -12
- package/assets/ts/modules/content.ts +56 -9
- package/assets/ts/modules/data-layer.ts +7 -11
- package/assets/ts/modules/dropdown.ts +0 -2
- package/assets/ts/modules/nav.ts +12 -3
- package/assets/ts/modules/search.test.ts +142 -0
- package/assets/ts/modules/search.ts +206 -0
- package/assets/ts/modules/tabs.test.ts +79 -12
- package/assets/ts/modules/testimonial.test.ts +45 -6
- package/assets/ts/modules/videos.test.ts +74 -14
- package/dist/components.es.js +25 -25
- package/dist/components.umd.js +163 -156
- package/package.json +1 -1
- package/assets/js/modules/carousel.js +0 -214
- package/assets/js/modules/carousel.test.js +0 -18
- package/assets/ts/modules/carousel.test.ts +0 -27
- package/assets/ts/modules/carousel.ts +0 -301
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video-card.component.min.js","sources":["../_global.js","../../modules/card.module.js","../../modules/videos.js","../../modules/modal.js","video-card.component.js"],"sourcesContent":["export const trackComponentRegistered = (componentName) => {\n // Data layer Web component created\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: 'customElementRegistered',\n element: componentName,\n });\n};\nexport const trackComponent = (component, componentName, trackEvents) => {\n // Data layer Web component created\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: 'customElementAdded',\n element: componentName,\n });\n trackEvents.forEach((eventName) => {\n component.addEventListener(eventName, function (event) {\n const eventDetails = {\n event: eventName,\n element: componentName,\n target: event.target,\n };\n Object.keys(event.detail).forEach((eventKey) => {\n const eventDetail = event.detail[eventKey];\n eventDetails[eventKey] = eventDetail;\n });\n window.dataLayer.push(eventDetails);\n });\n });\n return true;\n};\n","export const cardHTML = `<div class=\"wrapper\">\n <div class=\"card__head\" part=\"head\">\n <slot name=\"head\"></slot>\n </div>\n <div class=\"card__badges\"><slot name=\"badges\"></slot></div>\n <slot name=\"checkbox\" class=\"activate-prevent-hover\"></slot>\n <div class=\"card__body\" part=\"body\">\n <slot></slot>\n <slot name=\"secondary\" part=\"secondary\"></slot>\n </div>\n <div class=\"card__details\" part=\"details\">\n <slot name=\"details\"></slot>\n </div>\n <div class=\"card__footer\" part=\"footer\">\n <slot name=\"footer\"></slot>\n </div>\n</div>`;\nexport const setupCard = (cardComponent) => {\n cardComponent.classList.add('card');\n const cardHead = cardComponent.shadowRoot.querySelector('.card__head');\n const cardBody = cardComponent.shadowRoot.querySelector('.card__body');\n if (cardComponent.hasAttribute('data-image')) {\n cardHead.innerHTML += `<img src=\"${cardComponent.getAttribute('data-image')}\" alt=\"\" loading=\"lazy\" part=\"image\" />`;\n }\n // Inset the HTML for the data total or icon fallback\n if (cardComponent.hasAttribute('data-total')) {\n if (!(cardBody === null || cardBody === void 0 ? void 0 : cardBody.querySelector('.card__total')))\n cardBody.insertAdjacentHTML('beforeend', `<div class=\"card__total\">${cardComponent.getAttribute('data-total')}</div>`);\n else {\n const cardTotal = cardBody === null || cardBody === void 0 ? void 0 : cardBody.querySelector('.card__total');\n if (cardTotal)\n cardTotal.innerHTML = cardComponent.getAttribute('data-total');\n }\n }\n else if (cardComponent.querySelector('[slot=\"total-icon\"]')) {\n cardBody.insertAdjacentHTML('beforeend', `<div class=\"card__total\"><slot name=\"total-icon\"></slot></div>`);\n }\n if (!cardComponent.querySelector('[slot=\"badges\"]')) {\n cardComponent.shadowRoot.querySelector('.card__badges').classList.add('empty');\n }\n else {\n cardComponent.shadowRoot.querySelector('.card__badges').classList.remove('empty');\n }\n};\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nconst videoSupport = (body) => __awaiter(void 0, void 0, void 0, function* () {\n if (document.querySelector('.youtube-link[data-youtube]') && !document.body.classList.contains('youtubeLoaded')) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const loaded = yield loadYouTubeScripts();\n }\n setTimeout(() => __awaiter(void 0, void 0, void 0, function* () {\n if (document.querySelector('.youtube-link[data-youtube]') && !document.body.classList.contains('youtubeLoaded')) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const loaded = yield loadYouTubeScripts();\n }\n }), '2000');\n body.addEventListener('click', (event) => __awaiter(void 0, void 0, void 0, function* () {\n let target = event.target.closest('.youtube-link[data-youtube]');\n if (!target) {\n target = event.target.closest('.vimeo-link[data-vimeo]');\n }\n if (target && target.hasAttribute('data-youtube')) {\n event.preventDefault();\n if (!document.body.classList.contains('youtubeLoaded')) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const loaded = yield loadYouTubeScripts();\n }\n const link_id = 'youtube-' + target.getAttribute('data-youtube');\n if (!document.getElementById(`${link_id}-dialog`)) {\n document.body.insertAdjacentHTML('beforeend', `<dialog id=\"${link_id}-dialog\"><div class=\"embed\" id=\"${link_id}\"></div></dialog>`);\n }\n const dialog = document.getElementById(`${link_id}-dialog`);\n const embed = document.getElementById(link_id);\n const customEvent = new CustomEvent('play-video', {\n detail: { 'Video Type': 'YoutTube', ID: target.getAttribute('data-youtube') },\n });\n target.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n createYoutTubeVideo(embed, target.getAttribute('data-youtube'));\n dialog.showModal();\n dialog.addEventListener('close', () => {\n if (window.player[embed.getAttribute('id')] &&\n typeof window.player[embed.getAttribute('id')].pauseVideo == 'function') {\n window.player[embed.getAttribute('id')].pauseVideo();\n }\n const customEvent = new CustomEvent('close-video', {\n detail: { 'Video Type': 'YoutTube', ID: target.getAttribute('data-youtube') },\n });\n target.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n });\n }\n else if (target && target.hasAttribute('data-vimeo')) {\n event.preventDefault();\n const link_id = 'vimeo-' + target.getAttribute('data-youtube');\n if (!document.getElementById(`${link_id}-dialog`)) {\n document.body.insertAdjacentHTML('beforeend', `<dialog id=\"${link_id}-dialog\"><div class=\"embed\" id=\"${link_id}\"></div></dialog>`);\n }\n const dialog = document.getElementById(`${link_id}-dialog`);\n const embed = document.getElementById(link_id);\n const videoId = target.getAttribute('data-vimeo');\n const customEvent = new CustomEvent('play-video', {\n detail: { 'Video Type': 'Vimeo', ID: videoId },\n });\n target.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n if (!embed.querySelector('iframe'))\n embed.innerHTML = `<iframe src=\"https://player.vimeo.com/video/${videoId}?autoplay=1\" width=\"100%\" height=\"100%\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>`;\n dialog.showModal();\n dialog.addEventListener('close', () => {\n embed.innerHTML = ``; // Remove the video since we cant pause it\n const customEvent = new CustomEvent('close-video', {\n detail: { 'Video Type': 'Vimeo', ID: target.getAttribute('data-vimeo') },\n });\n target.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n });\n }\n }));\n});\nexport const videoHTML = `<div class=\"video-wrapper\">\n <slot name=\"video\"></slot>\n <picture>\n <img src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"\" lazy=\"\" />\n </picture>\n <button class=\"btn btn-compact fa-play m-0 colour-success\">Play</button>\n</div>`;\nexport const loadYouTubeScripts = () => __awaiter(void 0, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = function () {\n // This code loads the IFrame Player API code asynchronously.\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n const firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n document.body.classList.add('youtubeLoaded');\n resolve(true);\n };\n image.onerror = function () {\n reject(false);\n };\n image.src = 'https://youtube.com/favicon.ico';\n });\n});\nexport const createYoutTubeVideo = (target, video_id) => __awaiter(void 0, void 0, void 0, function* () {\n if (typeof window.player == 'undefined') {\n window.player = [];\n }\n //const link_id = target.getAttribute('id');\n if (typeof window.player[video_id] != 'undefined' && typeof window.player[video_id].pauseVideo == 'function') {\n window.player[video_id].playVideo();\n return false;\n }\n console.log('hi2');\n // This function creates an <iframe> (and YouTube player) after the API code downloads.\n //function onYouTubeIframeAPIReady() {\n window.player[video_id] = new YT.Player(video_id, {\n height: '100%',\n width: '100%',\n videoId: video_id,\n playerVars: {\n modestbranding: 1,\n playsinline: 1,\n rel: 0,\n showinfo: 0,\n },\n events: {\n onReady: onPlayerReady,\n onStateChange: onPlayerStateChange,\n },\n });\n //}\n //onYouTubeIframeAPIReady();\n // The API will call this function when the video player is ready.\n function onPlayerReady(event) {\n // Play the video straight away\n event.target.playVideo();\n }\n // The API calls this function when the player's state changes.\n // The function indicates that when playing a video (state=1)\n let done = false;\n function onPlayerStateChange(event) {\n if (event.data == YT.PlayerState.PLAYING && !done) {\n const link = document.getElementById(video_id);\n link.classList.add('player-ready');\n done = true;\n }\n }\n});\nexport const openYoutubeVideo = (component) => __awaiter(void 0, void 0, void 0, function* () {\n const embed = component.shadowRoot.querySelector('.embed');\n const youtubeId = component.getAttribute('data-youtube');\n let loaded;\n if (!document.body.classList.contains('youtubeLoaded')) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n loaded = yield loadYouTubeScripts();\n }\n const customEvent = new CustomEvent('play-video', {\n detail: { 'Video Type': 'YoutTube', ID: youtubeId },\n });\n component.dispatchEvent(customEvent);\n const interval = setInterval(() => {\n if (typeof YT != \"undefined\") {\n clearInterval(interval);\n createYoutTubeVideo(embed, youtubeId);\n }\n }, 200);\n // Limit the number of calls\n setTimeout(function () {\n clearInterval(interval);\n }, 2000);\n});\nexport const openVimeoVideo = (component) => __awaiter(void 0, void 0, void 0, function* () {\n const embed = component.querySelector('.embed');\n const vimeoId = component.getAttribute('data-vimeo');\n const customEvent = new CustomEvent('play-video', {\n detail: { 'Video Type': 'Vimeo', ID: vimeoId },\n });\n component.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n if (!embed.querySelector('iframe'))\n embed.innerHTML = `<iframe src=\"https://player.vimeo.com/video/${vimeoId}?autoplay=1\" width=\"100%\" height=\"100%\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>`;\n});\nexport default videoSupport;\n","export const openModal = (modal) => {\n var _a;\n const dialog = modal.closest('dialog') || ((_a = modal.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('dialog'));\n const id = modal.hasAttribute('id') ? modal.getAttribute('id') : 'unknown';\n dialog === null || dialog === void 0 ? void 0 : dialog.showModal();\n dialog === null || dialog === void 0 ? void 0 : dialog.focus();\n const closeEvent = new CustomEvent('modal-opened', {\n bubbles: true,\n cancelable: true,\n detail: { modalId: id },\n });\n modal.dispatchEvent(closeEvent);\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: 'openModal',\n id: id,\n });\n};\nexport const closeModal = (modal) => {\n var _a;\n const dialog = modal.closest('dialog') || ((_a = modal.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('dialog'));\n const id = modal.hasAttribute('id') ? modal.getAttribute('id') : 'unknown';\n dialog === null || dialog === void 0 ? void 0 : dialog.close();\n const closeEvent = new CustomEvent('modal-closed', {\n bubbles: true,\n cancelable: true,\n detail: { modalId: id },\n });\n modal.dispatchEvent(closeEvent);\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: 'closeModal',\n id: id,\n });\n};\nexport const closeButtonHtml = `<button class=\"btn btn-compact btn-secondary fa-xmark-large\" data-close>Close</button>`;\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { trackComponent, trackComponentRegistered } from '../_global';\nimport { cardHTML, setupCard } from '../../modules/card.module';\nimport { videoHTML, openYoutubeVideo, openVimeoVideo } from '../../modules/videos';\nimport { openModal, closeModal, closeButtonHtml } from '../../modules/modal';\ntrackComponentRegistered('iam-video-card');\nclass iamVideoCard extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n const assetLocation = document.body.hasAttribute('data-assets-location')\n ? document.body.getAttribute('data-assets-location')\n : '/assets';\n const loadCSS = `@import \"${assetLocation}/css/components/video-card.component.css\";`;\n const template = document.createElement('template');\n template.innerHTML = `\n <style>\n ${this.hasAttribute('css') ? `@import \"${this.getAttribute('css')}\";` : ``}\n \n ${loadCSS}\n </style>\n <link rel=\"stylesheet\" href=\"https://kit.fontawesome.com/8bd0fca975.css\" crossorigin=\"anonymous\" />\n ${cardHTML}\n <dialog>\n ${closeButtonHtml}\n ${videoHTML}\n </dialog>\n `;\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n connectedCallback() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const cardComponent = this;\n const cardHead = cardComponent.shadowRoot.querySelector('.card__head');\n const closeButton = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('[data-close]');\n this.insertAdjacentHTML('beforeend', `<div class=\"embed\" slot=\"video\"></div>`);\n const embed = this.querySelector('.embed');\n setupCard(cardComponent);\n if (cardComponent.querySelector('[data-youtube]')) {\n cardComponent.setAttribute('data-youtube', cardComponent.querySelector('[data-youtube]').getAttribute('data-youtube'));\n (_b = cardComponent.querySelector('[data-youtube]')) === null || _b === void 0 ? void 0 : _b.remove();\n }\n if (cardComponent.querySelector('[data-vimeo]')) {\n cardComponent.setAttribute('data-vimeo', cardComponent.querySelector('[data-vimeo]').getAttribute('data-vimeo'));\n (_c = cardComponent.querySelector('[data-vimeo]')) === null || _c === void 0 ? void 0 : _c.remove();\n }\n cardHead.insertAdjacentHTML('beforeend', `<button class=\"btn btn-compact fa-play colour-success\">Play</button>`);\n const button = cardHead === null || cardHead === void 0 ? void 0 : cardHead.querySelector('button');\n cardHead.tabIndex = 6;\n button === null || button === void 0 ? void 0 : button.tabIndex = -1;\n cardHead.addEventListener('click', () => {\n if (this.hasAttribute('data-youtube')) {\n const youtubeId = this.getAttribute('data-youtube');\n embed === null || embed === void 0 ? void 0 : embed.setAttribute('id', youtubeId);\n openYoutubeVideo(this);\n openModal(this);\n }\n else if (this.hasAttribute('data-vimeo')) {\n openVimeoVideo(this);\n openModal(this);\n }\n });\n closeButton === null || closeButton === void 0 ? void 0 : closeButton.addEventListener('click', () => {\n closeModal(this);\n if (this.hasAttribute('data-youtube')) {\n const youtubeId = this.getAttribute('data-youtube');\n if (window.player[youtubeId] && typeof window.player[youtubeId].pauseVideo == 'function') {\n window.player[youtubeId].pauseVideo();\n }\n }\n else if (this.hasAttribute('data-vimeo')) {\n embed.innerHTML = ``; // Remove the video since we cant pause it\n const customEvent = new CustomEvent('close-video', {\n detail: { 'Video Type': 'Vimeo', ID: this.getAttribute('data-vimeo') },\n });\n this.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n }\n });\n trackComponent(cardComponent, 'iam-video-card', ['play-video', 'close-video']);\n });\n }\n static get observedAttributes() {\n return ['data-image'];\n }\n attributeChangedCallback(attrName, oldVal, newVal) {\n switch (attrName) {\n case 'data-image': {\n if (oldVal != newVal) {\n const cardHeadImg = this.shadowRoot.querySelector('.card__head img');\n if (cardHeadImg)\n cardHeadImg.setAttribute('src', newVal);\n }\n break;\n }\n }\n }\n}\nexport default iamVideoCard;\n"],"names":["trackComponentRegistered","componentName","trackComponent","component","trackEvents","eventName","event","eventDetails","eventKey","eventDetail","cardHTML","setupCard","cardComponent","cardHead","cardBody","cardTotal","__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","reject","fulfilled","step","e","rejected","result","videoHTML","loadYouTubeScripts","image","tag","firstScriptTag","createYoutTubeVideo","target","video_id","onPlayerReady","onPlayerStateChange","done","openYoutubeVideo","embed","youtubeId","customEvent","interval","openVimeoVideo","vimeoId","openModal","modal","_a","dialog","id","closeEvent","closeModal","closeButtonHtml","iamVideoCard","template","_b","_c","closeButton","button","attrName","oldVal","newVal","cardHeadImg"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"video-card.component.min.js","sources":["../_global.js","../../modules/card.module.js","../../modules/videos.js","../../modules/modal.js","video-card.component.js"],"sourcesContent":["export const trackComponentRegistered = (componentName) => {\n // Data layer Web component created\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: 'customElementRegistered',\n element: componentName,\n });\n};\nexport const trackComponent = (component, componentName, trackEvents) => {\n // Data layer Web component created\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: 'customElementAdded',\n element: componentName,\n });\n trackEvents.forEach((eventName) => {\n component.addEventListener(eventName, function (event) {\n const eventDetails = {\n event: eventName,\n element: componentName,\n target: event.target,\n };\n Object.keys(event.detail).forEach((eventKey) => {\n const eventDetail = event.detail[eventKey];\n eventDetails[eventKey] = eventDetail;\n });\n window.dataLayer.push(eventDetails);\n });\n });\n return true;\n};\n","export const cardHTML = `<div class=\"wrapper\">\n <div class=\"card__head\" part=\"head\">\n <slot name=\"head\"></slot>\n </div>\n <div class=\"card__badges\"><slot name=\"badges\"></slot></div>\n <slot name=\"checkbox\" class=\"activate-prevent-hover\"></slot>\n <div class=\"card__body\" part=\"body\">\n <slot></slot>\n <slot name=\"secondary\" part=\"secondary\"></slot>\n </div>\n <div class=\"card__details\" part=\"details\">\n <slot name=\"details\"></slot>\n </div>\n <div class=\"card__footer\" part=\"footer\">\n <slot name=\"footer\"></slot>\n </div>\n</div>`;\nconst getCardPart = (cardComponent, selector) => { var _a; return ((_a = cardComponent.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(selector)) || null; };\nexport const setupCard = (cardComponent) => {\n cardComponent.classList.add('card');\n const cardHead = getCardPart(cardComponent, '.card__head');\n const cardBody = getCardPart(cardComponent, '.card__body');\n const cardBadges = getCardPart(cardComponent, '.card__badges');\n if (cardComponent.hasAttribute('data-image')) {\n cardHead === null || cardHead === void 0 ? void 0 : cardHead.insertAdjacentHTML('beforeend', `<img src=\"${cardComponent.getAttribute('data-image') || ''}\" alt=\"\" loading=\"lazy\" part=\"image\" />`);\n }\n // Inset the HTML for the data total or icon fallback\n if (cardComponent.hasAttribute('data-total')) {\n const cardTotal = cardBody === null || cardBody === void 0 ? void 0 : cardBody.querySelector('.card__total');\n if (!cardTotal)\n cardBody === null || cardBody === void 0 ? void 0 : cardBody.insertAdjacentHTML('beforeend', `<div class=\"card__total\">${cardComponent.getAttribute('data-total') || ''}</div>`);\n else {\n cardTotal.innerHTML = cardComponent.getAttribute('data-total') || '';\n }\n }\n else if (cardComponent.querySelector('[slot=\"total-icon\"]')) {\n cardBody === null || cardBody === void 0 ? void 0 : cardBody.insertAdjacentHTML('beforeend', `<div class=\"card__total\"><slot name=\"total-icon\"></slot></div>`);\n }\n if (!cardComponent.querySelector('[slot=\"badges\"]')) {\n cardBadges === null || cardBadges === void 0 ? void 0 : cardBadges.classList.add('empty');\n }\n else {\n cardBadges === null || cardBadges === void 0 ? void 0 : cardBadges.classList.remove('empty');\n }\n};\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nconst videoSupport = (body) => __awaiter(void 0, void 0, void 0, function* () {\n if (document.querySelector('.youtube-link[data-youtube]') && !document.body.classList.contains('youtubeLoaded')) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const loaded = yield loadYouTubeScripts();\n }\n setTimeout(() => __awaiter(void 0, void 0, void 0, function* () {\n if (document.querySelector('.youtube-link[data-youtube]') && !document.body.classList.contains('youtubeLoaded')) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const loaded = yield loadYouTubeScripts();\n }\n }), '2000');\n body.addEventListener('click', (event) => __awaiter(void 0, void 0, void 0, function* () {\n let target = event.target.closest('.youtube-link[data-youtube]');\n if (!target) {\n target = event.target.closest('.vimeo-link[data-vimeo]');\n }\n if (target && target.hasAttribute('data-youtube')) {\n event.preventDefault();\n if (!document.body.classList.contains('youtubeLoaded')) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const loaded = yield loadYouTubeScripts();\n }\n const link_id = 'youtube-' + target.getAttribute('data-youtube');\n if (!document.getElementById(`${link_id}-dialog`)) {\n document.body.insertAdjacentHTML('beforeend', `<dialog id=\"${link_id}-dialog\"><div class=\"embed\" id=\"${link_id}\"></div></dialog>`);\n }\n const dialog = document.getElementById(`${link_id}-dialog`);\n const embed = document.getElementById(link_id);\n const customEvent = new CustomEvent('play-video', {\n detail: { 'Video Type': 'YoutTube', ID: target.getAttribute('data-youtube') },\n });\n target.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n createYoutTubeVideo(embed, target.getAttribute('data-youtube'));\n dialog.showModal();\n dialog.addEventListener('close', () => {\n if (window.player[embed.getAttribute('id')] &&\n typeof window.player[embed.getAttribute('id')].pauseVideo == 'function') {\n window.player[embed.getAttribute('id')].pauseVideo();\n }\n const customEvent = new CustomEvent('close-video', {\n detail: { 'Video Type': 'YoutTube', ID: target.getAttribute('data-youtube') },\n });\n target.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n });\n }\n else if (target && target.hasAttribute('data-vimeo')) {\n event.preventDefault();\n const link_id = 'vimeo-' + target.getAttribute('data-youtube');\n if (!document.getElementById(`${link_id}-dialog`)) {\n document.body.insertAdjacentHTML('beforeend', `<dialog id=\"${link_id}-dialog\"><div class=\"embed\" id=\"${link_id}\"></div></dialog>`);\n }\n const dialog = document.getElementById(`${link_id}-dialog`);\n const embed = document.getElementById(link_id);\n const videoId = target.getAttribute('data-vimeo');\n const customEvent = new CustomEvent('play-video', {\n detail: { 'Video Type': 'Vimeo', ID: videoId },\n });\n target.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n if (!embed.querySelector('iframe'))\n embed.innerHTML = `<iframe src=\"https://player.vimeo.com/video/${videoId}?autoplay=1\" width=\"100%\" height=\"100%\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>`;\n dialog.showModal();\n dialog.addEventListener('close', () => {\n embed.innerHTML = ``; // Remove the video since we cant pause it\n const customEvent = new CustomEvent('close-video', {\n detail: { 'Video Type': 'Vimeo', ID: target.getAttribute('data-vimeo') },\n });\n target.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n });\n }\n }));\n});\nexport const videoHTML = `<div class=\"video-wrapper\">\n <slot name=\"video\"></slot>\n <picture>\n <img src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"\" lazy=\"\" />\n </picture>\n <button class=\"btn btn-compact fa-play m-0 colour-success\">Play</button>\n</div>`;\nexport const loadYouTubeScripts = () => __awaiter(void 0, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = function () {\n // This code loads the IFrame Player API code asynchronously.\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n const firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n document.body.classList.add('youtubeLoaded');\n resolve(true);\n };\n image.onerror = function () {\n reject(false);\n };\n image.src = 'https://youtube.com/favicon.ico';\n });\n});\nexport const createYoutTubeVideo = (target, video_id) => __awaiter(void 0, void 0, void 0, function* () {\n if (typeof window.player == 'undefined') {\n window.player = [];\n }\n //const link_id = target.getAttribute('id');\n if (typeof window.player[video_id] != 'undefined' && typeof window.player[video_id].pauseVideo == 'function') {\n window.player[video_id].playVideo();\n return false;\n }\n console.log('hi2');\n // This function creates an <iframe> (and YouTube player) after the API code downloads.\n //function onYouTubeIframeAPIReady() {\n window.player[video_id] = new YT.Player(video_id, {\n height: '100%',\n width: '100%',\n videoId: video_id,\n playerVars: {\n modestbranding: 1,\n playsinline: 1,\n rel: 0,\n showinfo: 0,\n },\n events: {\n onReady: onPlayerReady,\n onStateChange: onPlayerStateChange,\n },\n });\n //}\n //onYouTubeIframeAPIReady();\n // The API will call this function when the video player is ready.\n function onPlayerReady(event) {\n // Play the video straight away\n event.target.playVideo();\n }\n // The API calls this function when the player's state changes.\n // The function indicates that when playing a video (state=1)\n let done = false;\n function onPlayerStateChange(event) {\n if (event.data == YT.PlayerState.PLAYING && !done) {\n const link = document.getElementById(video_id);\n link.classList.add('player-ready');\n done = true;\n }\n }\n});\nexport const openYoutubeVideo = (component) => __awaiter(void 0, void 0, void 0, function* () {\n const embed = component.shadowRoot.querySelector('.embed');\n const youtubeId = component.getAttribute('data-youtube');\n let loaded;\n if (!document.body.classList.contains('youtubeLoaded')) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n loaded = yield loadYouTubeScripts();\n }\n const customEvent = new CustomEvent('play-video', {\n detail: { 'Video Type': 'YoutTube', ID: youtubeId },\n });\n component.dispatchEvent(customEvent);\n const interval = setInterval(() => {\n if (typeof YT != \"undefined\") {\n clearInterval(interval);\n createYoutTubeVideo(embed, youtubeId);\n }\n }, 200);\n // Limit the number of calls\n setTimeout(function () {\n clearInterval(interval);\n }, 2000);\n});\nexport const openVimeoVideo = (component) => __awaiter(void 0, void 0, void 0, function* () {\n const embed = component.querySelector('.embed');\n const vimeoId = component.getAttribute('data-vimeo');\n const customEvent = new CustomEvent('play-video', {\n detail: { 'Video Type': 'Vimeo', ID: vimeoId },\n });\n component.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n if (!embed.querySelector('iframe'))\n embed.innerHTML = `<iframe src=\"https://player.vimeo.com/video/${vimeoId}?autoplay=1\" width=\"100%\" height=\"100%\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>`;\n});\nexport default videoSupport;\n","export const openModal = (modal) => {\n var _a;\n const dialog = modal.closest('dialog') || ((_a = modal.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('dialog'));\n const id = modal.hasAttribute('id') ? modal.getAttribute('id') : 'unknown';\n dialog === null || dialog === void 0 ? void 0 : dialog.showModal();\n dialog === null || dialog === void 0 ? void 0 : dialog.focus();\n const closeEvent = new CustomEvent('modal-opened', {\n bubbles: true,\n cancelable: true,\n detail: { modalId: id },\n });\n modal.dispatchEvent(closeEvent);\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: 'openModal',\n id: id,\n });\n};\nexport const closeModal = (modal) => {\n var _a;\n const dialog = modal.closest('dialog') || ((_a = modal.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('dialog'));\n const id = modal.hasAttribute('id') ? modal.getAttribute('id') : 'unknown';\n dialog === null || dialog === void 0 ? void 0 : dialog.close();\n const closeEvent = new CustomEvent('modal-closed', {\n bubbles: true,\n cancelable: true,\n detail: { modalId: id },\n });\n modal.dispatchEvent(closeEvent);\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: 'closeModal',\n id: id,\n });\n};\nexport const closeButtonHtml = `<button class=\"btn btn-compact btn-secondary fa-xmark-large\" data-close>Close</button>`;\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { trackComponent, trackComponentRegistered } from '../_global';\nimport { cardHTML, setupCard } from '../../modules/card.module';\nimport { videoHTML, openYoutubeVideo, openVimeoVideo } from '../../modules/videos';\nimport { openModal, closeModal, closeButtonHtml } from '../../modules/modal';\ntrackComponentRegistered('iam-video-card');\nclass iamVideoCard extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n const assetLocation = document.body.hasAttribute('data-assets-location')\n ? document.body.getAttribute('data-assets-location')\n : '/assets';\n const loadCSS = `@import \"${assetLocation}/css/components/video-card.component.css\";`;\n const template = document.createElement('template');\n template.innerHTML = `\n <style>\n ${this.hasAttribute('css') ? `@import \"${this.getAttribute('css')}\";` : ``}\n \n ${loadCSS}\n </style>\n <link rel=\"stylesheet\" href=\"https://kit.fontawesome.com/8bd0fca975.css\" crossorigin=\"anonymous\" />\n ${cardHTML}\n <dialog>\n ${closeButtonHtml}\n ${videoHTML}\n </dialog>\n `;\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n connectedCallback() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const cardComponent = this;\n const cardHead = cardComponent.shadowRoot.querySelector('.card__head');\n const closeButton = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('[data-close]');\n this.insertAdjacentHTML('beforeend', `<div class=\"embed\" slot=\"video\"></div>`);\n const embed = this.querySelector('.embed');\n setupCard(cardComponent);\n if (cardComponent.querySelector('[data-youtube]')) {\n cardComponent.setAttribute('data-youtube', cardComponent.querySelector('[data-youtube]').getAttribute('data-youtube'));\n (_b = cardComponent.querySelector('[data-youtube]')) === null || _b === void 0 ? void 0 : _b.remove();\n }\n if (cardComponent.querySelector('[data-vimeo]')) {\n cardComponent.setAttribute('data-vimeo', cardComponent.querySelector('[data-vimeo]').getAttribute('data-vimeo'));\n (_c = cardComponent.querySelector('[data-vimeo]')) === null || _c === void 0 ? void 0 : _c.remove();\n }\n cardHead.insertAdjacentHTML('beforeend', `<button class=\"btn btn-compact fa-play colour-success\">Play</button>`);\n const button = cardHead === null || cardHead === void 0 ? void 0 : cardHead.querySelector('button');\n cardHead.tabIndex = 6;\n button === null || button === void 0 ? void 0 : button.tabIndex = -1;\n cardHead.addEventListener('click', () => {\n if (this.hasAttribute('data-youtube')) {\n const youtubeId = this.getAttribute('data-youtube');\n embed === null || embed === void 0 ? void 0 : embed.setAttribute('id', youtubeId);\n openYoutubeVideo(this);\n openModal(this);\n }\n else if (this.hasAttribute('data-vimeo')) {\n openVimeoVideo(this);\n openModal(this);\n }\n });\n closeButton === null || closeButton === void 0 ? void 0 : closeButton.addEventListener('click', () => {\n closeModal(this);\n if (this.hasAttribute('data-youtube')) {\n const youtubeId = this.getAttribute('data-youtube');\n if (window.player[youtubeId] && typeof window.player[youtubeId].pauseVideo == 'function') {\n window.player[youtubeId].pauseVideo();\n }\n }\n else if (this.hasAttribute('data-vimeo')) {\n embed.innerHTML = ``; // Remove the video since we cant pause it\n const customEvent = new CustomEvent('close-video', {\n detail: { 'Video Type': 'Vimeo', ID: this.getAttribute('data-vimeo') },\n });\n this.dispatchEvent(customEvent);\n window.dataLayer.push(customEvent.detail);\n }\n });\n trackComponent(cardComponent, 'iam-video-card', ['play-video', 'close-video']);\n });\n }\n static get observedAttributes() {\n return ['data-image'];\n }\n attributeChangedCallback(attrName, oldVal, newVal) {\n switch (attrName) {\n case 'data-image': {\n if (oldVal != newVal) {\n const cardHeadImg = this.shadowRoot.querySelector('.card__head img');\n if (cardHeadImg)\n cardHeadImg.setAttribute('src', newVal);\n }\n break;\n }\n }\n }\n}\nexport default iamVideoCard;\n"],"names":["trackComponentRegistered","componentName","trackComponent","component","trackEvents","eventName","event","eventDetails","eventKey","eventDetail","cardHTML","getCardPart","cardComponent","selector","_a","setupCard","cardHead","cardBody","cardBadges","cardTotal","__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","reject","fulfilled","step","e","rejected","result","videoHTML","loadYouTubeScripts","image","tag","firstScriptTag","createYoutTubeVideo","target","video_id","onPlayerReady","onPlayerStateChange","done","openYoutubeVideo","embed","youtubeId","customEvent","interval","openVimeoVideo","vimeoId","openModal","modal","dialog","id","closeEvent","closeModal","closeButtonHtml","iamVideoCard","template","_b","_c","closeButton","button","attrName","oldVal","newVal","cardHeadImg"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* iamKey v7.8.2--
|
|
2
|
+
* iamKey v7.8.2--beta4
|
|
3
3
|
* Copyright 2022-2026 iamproperty
|
|
4
4
|
*/const b=r=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"customElementRegistered",element:r})};var s=function(r,t,o,e){function i(a){return a instanceof o?a:new o(function(c){c(a)})}return new(o||(o=Promise))(function(a,c){function m(n){try{l(e.next(n))}catch(d){c(d)}}function p(n){try{l(e.throw(n))}catch(d){c(d)}}function l(n){n.done?a(n.value):i(n.value).then(m,p)}l((e=e.apply(r,t||[])).next())})};const g=`<div class="video-wrapper">
|
|
5
5
|
<slot name="video"></slot>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* iamKey v7.8.2--
|
|
2
|
+
* iamKey v7.8.2--beta4
|
|
3
3
|
* Copyright 2022-2026 iamproperty
|
|
4
4
|
*/const o=i=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"customElementRegistered",element:i})};o("iam-word-count");class n extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}),document.body.hasAttribute("data-assets-location")&&document.body.getAttribute("data-assets-location");const t=document.createElement("template");t.innerHTML=`
|
|
5
5
|
<style>
|
|
@@ -15,30 +15,31 @@ export const cardHTML = `<div class="wrapper">
|
|
|
15
15
|
<slot name="footer"></slot>
|
|
16
16
|
</div>
|
|
17
17
|
</div>`;
|
|
18
|
+
const getCardPart = (cardComponent, selector) => { var _a; return ((_a = cardComponent.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(selector)) || null; };
|
|
18
19
|
export const setupCard = (cardComponent) => {
|
|
19
20
|
cardComponent.classList.add('card');
|
|
20
|
-
const cardHead = cardComponent
|
|
21
|
-
const cardBody = cardComponent
|
|
21
|
+
const cardHead = getCardPart(cardComponent, '.card__head');
|
|
22
|
+
const cardBody = getCardPart(cardComponent, '.card__body');
|
|
23
|
+
const cardBadges = getCardPart(cardComponent, '.card__badges');
|
|
22
24
|
if (cardComponent.hasAttribute('data-image')) {
|
|
23
|
-
cardHead.
|
|
25
|
+
cardHead === null || cardHead === void 0 ? void 0 : cardHead.insertAdjacentHTML('beforeend', `<img src="${cardComponent.getAttribute('data-image') || ''}" alt="" loading="lazy" part="image" />`);
|
|
24
26
|
}
|
|
25
27
|
// Inset the HTML for the data total or icon fallback
|
|
26
28
|
if (cardComponent.hasAttribute('data-total')) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
const cardTotal = cardBody === null || cardBody === void 0 ? void 0 : cardBody.querySelector('.card__total');
|
|
30
|
+
if (!cardTotal)
|
|
31
|
+
cardBody === null || cardBody === void 0 ? void 0 : cardBody.insertAdjacentHTML('beforeend', `<div class="card__total">${cardComponent.getAttribute('data-total') || ''}</div>`);
|
|
29
32
|
else {
|
|
30
|
-
|
|
31
|
-
if (cardTotal)
|
|
32
|
-
cardTotal.innerHTML = cardComponent.getAttribute('data-total');
|
|
33
|
+
cardTotal.innerHTML = cardComponent.getAttribute('data-total') || '';
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
else if (cardComponent.querySelector('[slot="total-icon"]')) {
|
|
36
|
-
cardBody.insertAdjacentHTML('beforeend', `<div class="card__total"><slot name="total-icon"></slot></div>`);
|
|
37
|
+
cardBody === null || cardBody === void 0 ? void 0 : cardBody.insertAdjacentHTML('beforeend', `<div class="card__total"><slot name="total-icon"></slot></div>`);
|
|
37
38
|
}
|
|
38
39
|
if (!cardComponent.querySelector('[slot="badges"]')) {
|
|
39
|
-
|
|
40
|
+
cardBadges === null || cardBadges === void 0 ? void 0 : cardBadges.classList.add('empty');
|
|
40
41
|
}
|
|
41
42
|
else {
|
|
42
|
-
|
|
43
|
+
cardBadges === null || cardBadges === void 0 ? void 0 : cardBadges.classList.remove('empty');
|
|
43
44
|
}
|
|
44
45
|
};
|
|
@@ -1,11 +1,43 @@
|
|
|
1
|
-
export const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
export const loadComponents = (component) => {
|
|
2
|
+
const components = ['skeleton', 'bone', 'carousel', 'card', 'banner', 'notification'];
|
|
3
|
+
const assetLocation = document.body.hasAttribute('data-assets-location')
|
|
4
|
+
? document.body.getAttribute('data-assets-location')
|
|
5
|
+
: '/assets';
|
|
6
|
+
components.forEach((loadComponent) => {
|
|
7
|
+
if (component.getElementsByTagName(`iam-${loadComponent}`).length === 0)
|
|
8
|
+
return;
|
|
9
|
+
import(/*! @vite-ignore */ `${assetLocation}/js/components/${loadComponent}/${loadComponent}.component.min.js`)
|
|
10
|
+
.then((module) => {
|
|
11
|
+
if (!window.customElements.get(`iam-${loadComponent}`))
|
|
12
|
+
window.customElements.define(`iam-${loadComponent}`, module.default);
|
|
13
|
+
})
|
|
14
|
+
.catch((err) => {
|
|
15
|
+
console.log(err.message);
|
|
8
16
|
});
|
|
9
|
-
buttons.parentNode.replaceChild(fragment, buttons);
|
|
10
17
|
});
|
|
11
18
|
};
|
|
19
|
+
export const replaceShortcode = (content) => {
|
|
20
|
+
return content.replaceAll(/<p>\[([^\]]+)\]<\/p>/g, "<span data-shortcode=\"$1\"><iam-skeleton><iam-bone class=\"search\"></iam-bone></iam-skeleton></span>");
|
|
21
|
+
};
|
|
22
|
+
export const createTitle = (component, title) => {
|
|
23
|
+
if (component.hasAttribute('data-title-tag') && title)
|
|
24
|
+
return `<${component.getAttribute('data-title-tag')} class="${component.getAttribute('data-title-class')} iam-content--title">${title}</${component.getAttribute('data-title-tag')}>`;
|
|
25
|
+
return '';
|
|
26
|
+
};
|
|
27
|
+
export const transformElement = (component, renderedTitle, renderedContent) => {
|
|
28
|
+
const transform = component.getAttribute('data-transform');
|
|
29
|
+
let elementAttributes = '';
|
|
30
|
+
for (const attr of component.attributes) {
|
|
31
|
+
elementAttributes += `${attr.name}="${attr.value}" `;
|
|
32
|
+
}
|
|
33
|
+
return `<${transform} ${elementAttributes}>${renderedTitle + renderedContent}</${transform}>`;
|
|
34
|
+
};
|
|
35
|
+
export const transformButtons = (buttons) => {
|
|
36
|
+
const fragment = document.createDocumentFragment();
|
|
37
|
+
Array.from(buttons.querySelectorAll('.wp-block-button')).forEach((element) => {
|
|
38
|
+
const link = element.querySelector('a');
|
|
39
|
+
link.setAttribute('class', element.getAttribute('class'));
|
|
40
|
+
fragment.appendChild(link);
|
|
41
|
+
});
|
|
42
|
+
return fragment;
|
|
43
|
+
};
|
|
@@ -1,20 +1,70 @@
|
|
|
1
1
|
import { describe, expect, it } from './test.ts';
|
|
2
2
|
import { createElement, installTestDom } from './test-dom.ts';
|
|
3
3
|
import { append } from './test-utils.ts';
|
|
4
|
-
import { transformButtons } from './content.ts';
|
|
5
|
-
|
|
4
|
+
import { createTitle, loadComponents, replaceShortcode, transformButtons, transformElement } from './content.ts';
|
|
5
|
+
installTestDom();
|
|
6
|
+
const createAttributeComponent = (attributes) => ({
|
|
7
|
+
attributes,
|
|
8
|
+
getAttribute(name) {
|
|
9
|
+
const attribute = attributes.find((attr) => attr.name === name);
|
|
10
|
+
return attribute ? attribute.value : null;
|
|
11
|
+
},
|
|
12
|
+
hasAttribute(name) {
|
|
13
|
+
return attributes.some((attr) => attr.name === name);
|
|
14
|
+
},
|
|
15
|
+
});
|
|
6
16
|
describe('Content module', () => {
|
|
17
|
+
it('replaces WordPress shortcode paragraphs with loading placeholders', () => {
|
|
18
|
+
const content = '<p>Intro</p><p>[search-learning-articles]</p><p>[search-contacts]</p>';
|
|
19
|
+
const transformed = replaceShortcode(content);
|
|
20
|
+
expect(transformed.includes('<p>Intro</p>'));
|
|
21
|
+
expect(transformed.includes('data-shortcode="search-learning-articles"'));
|
|
22
|
+
expect(transformed.includes('data-shortcode="search-contacts"'));
|
|
23
|
+
expect(!transformed.includes('<p>[search-learning-articles]</p>'));
|
|
24
|
+
expect(!transformed.includes('<p>[search-contacts]</p>'));
|
|
25
|
+
});
|
|
26
|
+
it('creates configured titles and skips missing titles', () => {
|
|
27
|
+
const component = createElement('iam-content', {
|
|
28
|
+
dataTitleTag: 'h2',
|
|
29
|
+
dataTitleClass: 'bg-light',
|
|
30
|
+
});
|
|
31
|
+
expect(createTitle(component, 'Latest news') === '<h2 class="bg-light iam-content--title">Latest news</h2>');
|
|
32
|
+
expect(createTitle(component, '') === '');
|
|
33
|
+
expect(createTitle(createElement('iam-content'), 'Latest news') === '');
|
|
34
|
+
});
|
|
35
|
+
it('wraps rendered content in the requested transform element', () => {
|
|
36
|
+
const component = createAttributeComponent([
|
|
37
|
+
{ name: 'data-transform', value: 'article' },
|
|
38
|
+
{ name: 'data-url', value: '/wp-json/wp/v2/pages/1' },
|
|
39
|
+
{ name: 'class', value: 'content-panel' },
|
|
40
|
+
]);
|
|
41
|
+
const transformed = transformElement(component, '<h2>Heading</h2>', '<p>Body</p>');
|
|
42
|
+
expect(transformed.startsWith('<article '));
|
|
43
|
+
expect(transformed.includes('data-transform="article"'));
|
|
44
|
+
expect(transformed.includes('data-url="/wp-json/wp/v2/pages/1"'));
|
|
45
|
+
expect(transformed.includes('class="content-panel"'));
|
|
46
|
+
expect(transformed.includes('<h2>Heading</h2><p>Body</p>'));
|
|
47
|
+
expect(transformed.endsWith('</article>'));
|
|
48
|
+
});
|
|
7
49
|
it('transforms WordPress button wrappers into direct links', () => {
|
|
8
|
-
const parent = createElement('div');
|
|
9
50
|
const buttons = createElement('div', { class: 'wp-block-buttons' });
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
append(
|
|
15
|
-
append(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
expect(
|
|
51
|
+
const primaryButton = createElement('div', { class: 'btn btn-primary wp-block-button' });
|
|
52
|
+
const secondaryButton = createElement('div', { class: 'btn btn-secondary wp-block-button' });
|
|
53
|
+
const primaryLink = createElement('a', { href: '/primary' }, 'Primary');
|
|
54
|
+
const secondaryLink = createElement('a', { href: '/secondary' }, 'Secondary');
|
|
55
|
+
append(primaryButton, primaryLink);
|
|
56
|
+
append(secondaryButton, secondaryLink);
|
|
57
|
+
append(buttons, primaryButton, secondaryButton);
|
|
58
|
+
const fragment = transformButtons(buttons);
|
|
59
|
+
expect(fragment.children.length === 2);
|
|
60
|
+
expect(fragment.children[0] === primaryLink);
|
|
61
|
+
expect(fragment.children[1] === secondaryLink);
|
|
62
|
+
expect(primaryLink.getAttribute('class') === 'btn btn-primary wp-block-button');
|
|
63
|
+
expect(secondaryLink.getAttribute('class') === 'btn btn-secondary wp-block-button');
|
|
64
|
+
});
|
|
65
|
+
it('does not load component bundles when content contains no supported custom elements', () => {
|
|
66
|
+
const component = createElement('iam-content');
|
|
67
|
+
loadComponents(component);
|
|
68
|
+
expect(component.getElementsByTagName('iam-card').length === 0);
|
|
19
69
|
});
|
|
20
70
|
});
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
const dataLayerWindow = window;
|
|
1
2
|
function createDataLayer() {
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
dataLayerWindow.dataLayer = dataLayerWindow.dataLayer || [];
|
|
4
|
+
dataLayerWindow.dataLayer.push({
|
|
4
5
|
event: 'Pageview',
|
|
5
6
|
pageTitle: document.title,
|
|
6
7
|
});
|
|
7
8
|
document.addEventListener('click', (event) => {
|
|
8
9
|
const target = event.target.closest('[open] summary');
|
|
9
10
|
if (target) {
|
|
10
|
-
|
|
11
|
+
dataLayerWindow.dataLayer.push({
|
|
11
12
|
event: 'closeDetails',
|
|
12
13
|
detailsTitle: target.textContent || '',
|
|
13
14
|
});
|
|
@@ -17,13 +18,13 @@ function createDataLayer() {
|
|
|
17
18
|
const link = event.target.closest('a');
|
|
18
19
|
const button = event.target.closest('button');
|
|
19
20
|
if (summary) {
|
|
20
|
-
|
|
21
|
+
dataLayerWindow.dataLayer.push({
|
|
21
22
|
event: 'openDetails',
|
|
22
23
|
detailsTitle: summary.textContent || '',
|
|
23
24
|
});
|
|
24
25
|
}
|
|
25
26
|
if (link) {
|
|
26
|
-
|
|
27
|
+
dataLayerWindow.dataLayer.push({
|
|
27
28
|
event: 'linkClicked',
|
|
28
29
|
linkText: link.hasAttribute('title') ? link.getAttribute('title') || '' : link.textContent || '',
|
|
29
30
|
class: link.hasAttribute('class') ? link.getAttribute('class') || '' : '',
|
|
@@ -31,7 +32,7 @@ function createDataLayer() {
|
|
|
31
32
|
});
|
|
32
33
|
}
|
|
33
34
|
if (button) {
|
|
34
|
-
|
|
35
|
+
dataLayerWindow.dataLayer.push({
|
|
35
36
|
event: 'buttonClicked',
|
|
36
37
|
buttonText: button.textContent || '',
|
|
37
38
|
class: button.hasAttribute('class') ? button.getAttribute('class') || '' : '',
|
|
@@ -26,7 +26,6 @@ export const searchAjax = (component, search, callback) => __awaiter(void 0, voi
|
|
|
26
26
|
const searchterm = search.value;
|
|
27
27
|
const ajaxURL = component.getAttribute('data-url');
|
|
28
28
|
const firstInput = component.querySelector('input');
|
|
29
|
-
console.log(firstInput);
|
|
30
29
|
const inputType = firstInput && firstInput.hasAttribute('type') ? firstInput.getAttribute('type') : 'checkbox';
|
|
31
30
|
let inputName = firstInput && firstInput.hasAttribute('name') ? firstInput.getAttribute('name') : 'tags';
|
|
32
31
|
if (component.hasAttribute('data-name'))
|
package/assets/js/modules/nav.js
CHANGED
|
@@ -56,8 +56,8 @@ export const populateLinks = (data) => {
|
|
|
56
56
|
return html;
|
|
57
57
|
};
|
|
58
58
|
export const loadNavData = (Cookies) => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
-
|
|
60
|
-
const ajaxURL = '/nav.json';
|
|
59
|
+
const ajaxURL = 'https://dev.hub.iamproperty.group/data/ecosystem-switcher.json';
|
|
60
|
+
//const ajaxURL = '/nav.json';
|
|
61
61
|
// Setup controller vars if not already set
|
|
62
62
|
if (!window.controller)
|
|
63
63
|
window.controller = [];
|
|
@@ -119,7 +119,14 @@ export const loadUserData = (Cookies) => __awaiter(void 0, void 0, void 0, funct
|
|
|
119
119
|
}
|
|
120
120
|
});
|
|
121
121
|
export const setEnabledLinks = (component, data) => {
|
|
122
|
-
|
|
122
|
+
const selector = `[data-product][data-feature]`;
|
|
123
|
+
const elements = component
|
|
124
|
+
? [
|
|
125
|
+
...component.querySelectorAll(selector),
|
|
126
|
+
...(component.shadowRoot ? component.shadowRoot.querySelectorAll(selector) : []),
|
|
127
|
+
]
|
|
128
|
+
: document.querySelectorAll(`iam-nav ${selector}`);
|
|
129
|
+
elements.forEach((element) => {
|
|
123
130
|
const isEnabled = data.attributes.products[element.getAttribute('data-product')].features[element.getAttribute('data-feature')];
|
|
124
131
|
element.setAttribute('data-is-enabled', isEnabled);
|
|
125
132
|
if (isEnabled && element.getAttribute('data-enabled')) {
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { resolvePath, isTraversable } from './helpers';
|
|
11
|
+
const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
12
|
+
const getResultValue = (item, key) => (isRecord(item) ? item[key] : undefined);
|
|
13
|
+
const toOptionText = (value) => String(value !== null && value !== void 0 ? value : '').replace('\n', ', ');
|
|
14
|
+
const appendDatalistOption = (datalistElement, item, valueSchema, displaySchema, groupLabel = '') => {
|
|
15
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
16
|
+
const resolvedValue = resolvePath(item, valueSchema, undefined);
|
|
17
|
+
const resolvedDisplay = resolvePath(item, displaySchema, undefined);
|
|
18
|
+
const fallbackValue = isTraversable(item) ? '' : item;
|
|
19
|
+
const actualValue = (_e = (_d = (_c = (_b = (_a = resolvedValue !== null && resolvedValue !== void 0 ? resolvedValue : getResultValue(item, 'value')) !== null && _a !== void 0 ? _a : getResultValue(item, 'id')) !== null && _b !== void 0 ? _b : resolvedDisplay) !== null && _c !== void 0 ? _c : getResultValue(item, 'title')) !== null && _d !== void 0 ? _d : getResultValue(item, 'label')) !== null && _e !== void 0 ? _e : fallbackValue;
|
|
20
|
+
const displayValue = toOptionText((_g = (_f = resolvedDisplay !== null && resolvedDisplay !== void 0 ? resolvedDisplay : getResultValue(item, 'title')) !== null && _f !== void 0 ? _f : getResultValue(item, 'label')) !== null && _g !== void 0 ? _g : actualValue);
|
|
21
|
+
if (!displayValue)
|
|
22
|
+
return;
|
|
23
|
+
const optionElement = document.createElement('option');
|
|
24
|
+
optionElement.value = String(actualValue);
|
|
25
|
+
optionElement.textContent = `${groupLabel}${displayValue}`;
|
|
26
|
+
datalistElement.appendChild(optionElement);
|
|
27
|
+
};
|
|
28
|
+
const getFormControls = (component) => Array.from(component.querySelectorAll('input,select'));
|
|
29
|
+
const getSearchSchema = (component, attributeName, fallback) => component.hasAttribute(attributeName) ? component.getAttribute(attributeName) || '' : fallback;
|
|
30
|
+
const search = (component, datalistElement, searchTerm) => __awaiter(void 0, void 0, void 0, function* () {
|
|
31
|
+
let url = component.getAttribute('data-url');
|
|
32
|
+
if (!url)
|
|
33
|
+
return;
|
|
34
|
+
const method = component.getAttribute('data-method') || 'GET';
|
|
35
|
+
const body = {};
|
|
36
|
+
const searchWindow = window;
|
|
37
|
+
// Setup controller vars if not already set
|
|
38
|
+
if (!searchWindow.controller)
|
|
39
|
+
searchWindow.controller = {};
|
|
40
|
+
// Abort if controller already present for this url
|
|
41
|
+
if (searchWindow.controller[url])
|
|
42
|
+
searchWindow.controller[url].abort();
|
|
43
|
+
// Create a new controller so it can be aborted if new fetch made
|
|
44
|
+
searchWindow.controller[url] = new AbortController();
|
|
45
|
+
const { signal } = searchWindow.controller[url];
|
|
46
|
+
const requestOptions = {
|
|
47
|
+
signal,
|
|
48
|
+
method,
|
|
49
|
+
headers: new Headers({
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
Accept: 'application/json',
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
if (method.toUpperCase() === 'GET') {
|
|
55
|
+
getFormControls(component).forEach((input) => {
|
|
56
|
+
const name = input.getAttribute('name');
|
|
57
|
+
const value = input.value;
|
|
58
|
+
if (name && value) {
|
|
59
|
+
url += `${url.includes('?') ? '&' : '?'}${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
getFormControls(component).forEach((input) => {
|
|
65
|
+
const name = input.getAttribute('name');
|
|
66
|
+
const value = input.value;
|
|
67
|
+
if (name && value) {
|
|
68
|
+
body[name] = value;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
requestOptions['body'] = JSON.stringify(body);
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const response = yield fetch(url, requestOptions);
|
|
75
|
+
const responseData = (yield response.json());
|
|
76
|
+
const loopSchema = getSearchSchema(component, 'data-schema', 'data');
|
|
77
|
+
const valueSchema = getSearchSchema(component, 'data-value-schema', 'value');
|
|
78
|
+
const displaySchema = getSearchSchema(component, 'data-display-schema', 'label');
|
|
79
|
+
const loopValues = resolvePath(responseData, loopSchema, []);
|
|
80
|
+
if (Array.isArray(loopValues)) {
|
|
81
|
+
loopValues.forEach((item) => {
|
|
82
|
+
appendDatalistOption(datalistElement, item, valueSchema, displaySchema);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else if (isRecord(loopValues)) {
|
|
86
|
+
Object.entries(loopValues).forEach(([key, value]) => {
|
|
87
|
+
if (Array.isArray(value)) {
|
|
88
|
+
value.forEach((item) => {
|
|
89
|
+
appendDatalistOption(datalistElement, item, valueSchema, displaySchema, `${key}: `);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
filterDatalist(datalistElement, searchTerm);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.log(error);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
export const filterDatalist = (datalistElement, searchTerm) => {
|
|
101
|
+
var _a;
|
|
102
|
+
for (const optionElement of datalistElement.options) {
|
|
103
|
+
const optionText = ((_a = optionElement.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || optionElement.value;
|
|
104
|
+
if (optionText.toLowerCase().includes(searchTerm.toLowerCase())) {
|
|
105
|
+
optionElement.classList.remove('js-hide');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
optionElement.classList.add('js-hide');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
export const datalistSelectOption = (component, inputElement, optionElement) => {
|
|
113
|
+
var _a;
|
|
114
|
+
const datalistElement = optionElement.closest('datalist');
|
|
115
|
+
const optionText = ((_a = optionElement.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || optionElement.value;
|
|
116
|
+
const inputName = inputElement.getAttribute('name') || '';
|
|
117
|
+
const alternateInputName = `${inputName}Alt`;
|
|
118
|
+
inputElement.value = optionText;
|
|
119
|
+
inputElement.setAttribute('data-value', optionText);
|
|
120
|
+
//inputElement.setAttribute('data-placeholder', optionText);
|
|
121
|
+
inputElement.setAttribute('placeholder', optionText);
|
|
122
|
+
// Make sure the value of the option is passed when in a form
|
|
123
|
+
if (optionElement.value && optionElement.value !== optionText) {
|
|
124
|
+
const alternateInput = component.querySelector(`input[name="${alternateInputName}"]`);
|
|
125
|
+
if (!alternateInput)
|
|
126
|
+
component.insertAdjacentHTML('beforeend', `<input type="hidden" name="${alternateInputName}" value="${optionElement.value}">`);
|
|
127
|
+
else
|
|
128
|
+
alternateInput.value = optionElement.value;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
const alternateInput = component.querySelector(`input[name="${alternateInputName}"]`);
|
|
132
|
+
if (alternateInput)
|
|
133
|
+
alternateInput.remove();
|
|
134
|
+
}
|
|
135
|
+
// Set the active value on the datalist option
|
|
136
|
+
if (!datalistElement)
|
|
137
|
+
return;
|
|
138
|
+
for (const optionLoopElement of datalistElement.options) {
|
|
139
|
+
if (optionLoopElement === optionElement)
|
|
140
|
+
optionLoopElement.classList.add('active');
|
|
141
|
+
else
|
|
142
|
+
optionLoopElement.classList.remove('active');
|
|
143
|
+
}
|
|
144
|
+
const customEvent = new CustomEvent('option-selected', {
|
|
145
|
+
detail: {
|
|
146
|
+
title: optionText,
|
|
147
|
+
value: optionElement.value || '',
|
|
148
|
+
url: optionElement.hasAttribute('data-url') ? optionElement.getAttribute('data-url') || '' : '',
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
component.dispatchEvent(customEvent);
|
|
152
|
+
};
|
|
153
|
+
export default search;
|