{"version":3,"sources":["youtube.mjs"],"names":["DateTime","window","luxon","linkRegex","getYoutubeData","wrapper","pageToken","contentId","parseInt","closest","id","slice","res","fetch","method","body","JSON","stringify","json","loading","show","loadingTemplate","document","getElementById","loader","content","cloneNode","append","slotContainer","querySelector","innerHTML","style","minHeight","querySelectorAll","forEach","elem","remove","renderVideoSlots","data","videoSlotTemplate","itm","items","youtubeId","kind","snippet","resourceId","videoId","slot","setAttribute","text","title","placemark","textContent","fromISO","publishedAt","toLocaleString","year","month","day","description","replace","match","attr","consent","thumdnailArray","Object","keys","thumbnails","map","k","sort","a","b","width","backgroundImage","url","split","epander","addEventListener","evt","preventDefault","stopPropagation","epandIcon","classList","contains","add","istAufgeklappt","icon","toggle","initConsent","renderPaging","nextPageToken","prevPageToken","pagingTemplate","pageText","Math","dataset","page","ceil","pageInfo","totalResults","resultsPerPage","pagingContainer","paging","render","err","console","error"],"mappings":"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","file":"youtube.mjs","sourcesContent":["/* global initConsent */\nconst DateTime = window.luxon.DateTime;\n\nconst linkRegex = /((?:href|src)=\")?(\\b(https?|ftp|file):\\/\\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/gi;\n\n/**\n * @param {HTMLDivElement} wrapper -\n * @param {string|null|undefined} pageToken -\n * @returns {Promsise<Record<string, unknown>>} -\n */\nasync function getYoutubeData(wrapper, pageToken) {\n\tconst contentId = parseInt(wrapper.closest('.frame').id.slice(1), 10);\n\tconst res = await fetch('/ajax-json/yt', { method: 'POST', body: JSON.stringify({ contentId, pageToken }) });\n\treturn await res.json();\n}\n\n/**\n * @param {HTMLDivElement} wrapper -\n * @param {bool} show -\n * @returns {void}\n */\nfunction loading(wrapper, show = true) {\n\tif (show) {\n\t\t/** @type {HTMLTemplateElement} */\n\t\tconst loadingTemplate = document.getElementById('youtube-video-loading');\n\t\tconst loader = loadingTemplate.content.cloneNode(true);\n\t\twrapper.append(loader);\n\t\t/** @type {HTMLDivElement} */\n\t\tconst slotContainer = wrapper.querySelector('.youtube-videos');\n\t\tif (slotContainer.innerHTML === '') {\n\t\t\tslotContainer.style.minHeight = '100px';\n\t\t}\n\t} else {\n\t\twrapper.querySelectorAll('.youtube-loading-overlay').forEach(elem => elem.remove());\n\t}\n}\n\n/**\n * @param {HTMLDivElement} wrapper -\n * @param {Record<string, unknown>} data -\n * @returns {void}\n */\nfunction renderVideoSlots(wrapper, data) {\n\tconst slotContainer = wrapper.querySelector('.youtube-videos');\n\t/** @type {HTMLTemplateElement} */\n\tconst videoSlotTemplate = document.getElementById('youtube-video-slot');\n\tslotContainer.innerHTML = '';\n\tfor (const itm of data.items) {\n\t\tconst youtubeId = itm.kind === 'youtube#playlistItem' ? itm.snippet.resourceId.videoId : itm.id.videoId;\n\t\t/** @type {DocumentFragment} */\n\t\tconst slot = videoSlotTemplate.content.cloneNode(true);\n\t\tslot.querySelector('iframe').setAttribute('data-src', `https://www.youtube-nocookie.com/embed/${youtubeId}`);\n\t\tconst text = slot.querySelector('.text');\n\t\ttext.querySelector('h3').innerHTML = itm.snippet.title;\n\t\tconst placemark = text.querySelector('time.article-placemark');\n\t\tplacemark.textContent = DateTime.fromISO(itm.snippet.publishedAt).toLocaleString({ year: 'numeric', month: '2-digit', day: '2-digit' });\n\t\tplacemark.setAttribute('datetime', itm.snippet.publishedAt);\n\t\ttext.querySelector('.contenttext').innerHTML = itm.snippet.description.replace(linkRegex, (match, attr) =>\n\t\t\ttypeof attr != 'undefined' ? match : `<a target=\"_blank\" href=\"${match}\">${match}</a>`\n\t\t);\n\n\t\t/** @type {HTMLDivElement|null|undefined} */\n\t\tconst consent = slot.querySelector('.consent');\n\t\tif (consent) {\n\t\t\tconst thumdnailArray = Object.keys(itm.snippet.thumbnails).map(k => itm.snippet.thumbnails[k]);\n\t\t\tthumdnailArray.sort((a, b) => b.width - a.width);\n\t\t\tconsent.style.backgroundImage = `url('/ajax-json/yt-vorschau/${youtubeId}/${thumdnailArray[0].url.split('/').slice(-1)[0]}')`;\n\t\t}\n\n\t\t/** @type {HTMLElement} */\n\t\tconst epander = slot.querySelector('.expand-col');\n\t\tepander.addEventListener('click', evt => {\n\t\t\tevt.preventDefault();\n\t\t\tevt.stopPropagation();\n\t\t\tconst epandIcon = epander.querySelector('i');\n\t\t\twrapper.querySelectorAll('article').forEach(elem => elem.classList.remove('expanded'));\n\t\t\tif (epandIcon.classList.contains('fa-chevron-down')) {\n\t\t\t\tepandIcon.closest('article').classList.add('expanded');\n\t\t\t}\n\t\t\twrapper.querySelectorAll('article').forEach(elem => {\n\t\t\t\tconst istAufgeklappt = elem.classList.contains('expanded');\n\t\t\t\tconst icon = elem.querySelector('.expand-col > i');\n\t\t\t\ticon.classList.toggle('fa-chevron-down', !istAufgeklappt);\n\t\t\t\ticon.classList.toggle('fa-chevron-up', istAufgeklappt);\n\t\t\t});\n\t\t});\n\t\tslotContainer.append(slot);\n\t}\n\tinitConsent();\n}\n\n/**\n * @param {HTMLDivElement} wrapper -\n * @param {Record<string, unknown>} data -\n * @returns {void}\n */\nfunction renderPaging(wrapper, data) {\n\tif (data.nextPageToken || data.prevPageToken) {\n\t\t/** @type {HTMLTemplateElement} */\n\t\tconst pagingTemplate = document.getElementById('youtube-video-paging');\n\t\tconst pageText = `${wrapper.dataset.page} / ${Math.ceil(data.pageInfo.totalResults / data.pageInfo.resultsPerPage)}`;\n\t\twrapper.querySelectorAll('.youtube-paging').forEach(pagingContainer => {\n\t\t\t/** @type {HTMLElement} */\n\t\t\tconst paging = pagingTemplate.content.cloneNode(true);\n\t\t\tif (data.nextPageToken) {\n\t\t\t\tpaging.querySelector('.page-item.next').addEventListener('click', evt => {\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\twrapper.dataset.page = parseInt(wrapper.dataset.page, 10) + 1;\n\t\t\t\t\treturn render(wrapper, data.nextPageToken);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpaging.querySelector('.page-item.next').classList.add('disabled');\n\t\t\t}\n\t\t\tif (data.prevPageToken) {\n\t\t\t\tpaging.querySelector('.page-item.previous').addEventListener('click', evt => {\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\twrapper.dataset.page = parseInt(wrapper.dataset.page, 10) - 1;\n\t\t\t\t\treturn render(wrapper, data.prevPageToken);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpaging.querySelector('.page-item.previous').classList.add('disabled');\n\t\t\t}\n\t\t\tpaging.querySelector('.page-item > span.page-link').textContent = pageText;\n\n\t\t\tpagingContainer.innerHTML = '';\n\t\t\tpagingContainer.append(paging);\n\t\t});\n\t}\n}\n\n/**\n * @param {HTMLElement} wrapper -\n * @param {string|null|undefined} pageToken -\n * @returns {void}\n */\nasync function render(wrapper, pageToken) {\n\ttry {\n\t\tloading(wrapper);\n\t\tconst data = await getYoutubeData(wrapper, pageToken);\n\t\trenderVideoSlots(wrapper, data);\n\t\trenderPaging(wrapper, data);\n\t\tloading(wrapper, false);\n\t} catch (err) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(err);\n\t\twrapper.querySelector('.youtube-videos').innerHTML = '<div class=\"alert alert-danger\">Fehler beim Holen oder Verarbeiten der Youtube-Daten!</div>';\n\t\twrapper.querySelectorAll('.youtube-paging').forEach(pagingContainer => {\n\t\t\tpagingContainer.innerHTML = '';\n\t\t});\n\t\tloading(wrapper, false);\n\t}\n}\n\ndocument.querySelectorAll('.youtube-wrapper').forEach(elem => render(elem));\n"]}