{"version":3,"file":"loadMore.js","sources":["../../../../s/BiNo.ReactApps/apps/scripts/src/load-more.ts"],"sourcesContent":["import { onReady } from './util/onReady';\r\nimport { createI18n, common } from '@bino/utils/i18next';\r\n\r\nconst i18n = createI18n(common);\r\n\r\ntype Article = {\r\n title: string;\r\n label: string;\r\n leadText: string;\r\n link: string;\r\n imageUrl: string;\r\n imageAlternateText: string;\r\n published: string;\r\n authors: string[];\r\n};\r\n\r\ntype Publication = Article;\r\n\r\nasync function loadMore(loadMoreButton: HTMLElement): Promise<{\r\n results: (Article | Publication)[];\r\n numberToLoad: number;\r\n}> {\r\n const numberToLoad = 12;\r\n const offset = Number(loadMoreButton.dataset.offset || 0);\r\n\r\n const urlParams = new URLSearchParams({\r\n size: String(numberToLoad),\r\n type: loadMoreButton.dataset.type || '',\r\n id: loadMoreButton.dataset.id || '',\r\n offset: String(offset),\r\n });\r\n const url = `/api/articles/topic?${urlParams.toString()}`;\r\n\r\n loadMoreButton.dataset.offset = String(offset + numberToLoad);\r\n\r\n try {\r\n const response = await fetch(url);\r\n const results = (await response.json()) as (Article | Publication)[];\r\n return { results, numberToLoad };\r\n } catch (e) {\r\n console.error('parsing failed', e);\r\n return { results: [], numberToLoad };\r\n }\r\n}\r\n\r\nfunction toggleSpinner(loadMoreButton: HTMLElement, spinnerElement: HTMLElement | null) {\r\n spinnerElement?.classList.toggle('show');\r\n loadMoreButton.classList.toggle('disabled');\r\n}\r\n\r\nfunction renderArticle({ link, imageUrl, imageAlternateText, label, title, leadText }: Article) {\r\n return `\r\n`;\r\n}\r\n\r\nfunction renderPublication({ link, imageUrl, imageAlternateText, title, authors }: Publication) {\r\n return `\r\n`;\r\n}\r\n\r\nfunction renderArticles(articles: T[], templateFn: (article: T) => string) {\r\n return articles.map((article) => templateFn(article)).join('');\r\n}\r\n\r\nfunction noMoreArticles(container: HTMLElement) {\r\n container.insertAdjacentHTML('afterend', `

${i18n.t('articles.noMore')}

`);\r\n}\r\n\r\nfunction hideLoadMore(loadMoreButton: HTMLElement) {\r\n if (loadMoreButton.parentElement) {\r\n loadMoreButton.parentElement.style.display = 'none';\r\n }\r\n}\r\n\r\nonReady(() => {\r\n const loadMoreButton = document.getElementById('js-load-more');\r\n if (loadMoreButton !== null) {\r\n loadMoreButton.addEventListener('click', async (ev) => {\r\n ev.preventDefault();\r\n const spinnerElement = document.querySelector('.spinner-block');\r\n\r\n toggleSpinner(loadMoreButton, spinnerElement);\r\n const template = loadMoreButton.dataset.template;\r\n const containerSelector = loadMoreButton.dataset.container;\r\n if (!containerSelector) return;\r\n const container = document.querySelector(containerSelector);\r\n if (!container) return;\r\n\r\n const { results, numberToLoad } = await loadMore(loadMoreButton);\r\n\r\n toggleSpinner(loadMoreButton, spinnerElement);\r\n\r\n let html = '';\r\n if (template === undefined || template === 'businessreview' || template === 'person') {\r\n html = renderArticles(results, renderArticle);\r\n } else if (template === 'publication') {\r\n html = renderArticles(results, renderPublication);\r\n }\r\n\r\n container.insertAdjacentHTML('beforeend', html);\r\n\r\n if (results.length < numberToLoad) {\r\n hideLoadMore(loadMoreButton);\r\n }\r\n if (results.length === 0) {\r\n noMoreArticles(container);\r\n }\r\n });\r\n }\r\n});\r\n"],"names":["i18n","createI18n","common","loadMore","loadMoreButton","offset","url","e","toggleSpinner","spinnerElement","renderArticle","link","imageUrl","imageAlternateText","label","title","leadText","renderPublication","authors","renderArticles","articles","templateFn","article","noMoreArticles","container","hideLoadMore","onReady","ev","template","containerSelector","results","numberToLoad","html"],"mappings":"yFAGA,MAAMA,EAAOC,EAAWC,CAAM,EAe9B,eAAeC,EAASC,EAGrB,CAEC,MAAMC,EAAS,OAAOD,EAAe,QAAQ,QAAU,CAAC,EAQlDE,EAAM,uBANM,IAAI,gBAAgB,CAClC,KAAM,OAAO,EAAY,EACzB,KAAMF,EAAe,QAAQ,MAAQ,GACrC,GAAIA,EAAe,QAAQ,IAAM,GACjC,OAAQ,OAAOC,CAAM,CAAA,CACxB,EAC4C,SAAU,CAAA,GAEvDD,EAAe,QAAQ,OAAS,OAAOC,EAAS,EAAY,EAExD,GAAA,CAGO,MAAA,CAAE,QADQ,MADA,MAAM,MAAMC,CAAG,GACA,KAAK,EACnB,eAAa,QAC1BC,EAAG,CACA,eAAA,MAAM,iBAAkBA,CAAC,EAC1B,CAAE,QAAS,CAAC,EAAG,eAAa,CAAA,CAE3C,CAEA,SAASC,EAAcJ,EAA6BK,EAAoC,CACpEA,GAAA,MAAAA,EAAA,UAAU,OAAO,QAClBL,EAAA,UAAU,OAAO,UAAU,CAC9C,CAEA,SAASM,EAAc,CAAE,KAAAC,EAAM,SAAAC,EAAU,mBAAAC,EAAoB,MAAAC,EAAO,MAAAC,EAAO,SAAAC,GAAqB,CACrF,MAAA;AAAA,cACGD,CAAK;AAAA,WACRJ,CAAI;AAAA,gBACCG,CAAK;AAAA,YACTE,CAAQ;AAAA,iBACHJ,CAAQ;AAAA,sBACHC,CAAkB;AAAA,cAExC,CAEA,SAASI,EAAkB,CAAE,KAAAN,EAAM,SAAAC,EAAU,mBAAAC,EAAoB,MAAAE,EAAO,QAAAG,GAAwB,CACrF,MAAA;AAAA,cACGH,CAAK;AAAA,WACRJ,CAAI;AAAA,iBACEO,GAAW,CAAA,GAAI,KAAK,IAAI,CAAC;AAAA;AAAA,iBAEzBN,CAAQ;AAAA,sBACHC,CAAkB;AAAA,cAExC,CAEA,SAASM,EAAgDC,EAAeC,EAAoC,CACjG,OAAAD,EAAS,IAAKE,GAAYD,EAAWC,CAAO,CAAC,EAAE,KAAK,EAAE,CACjE,CAEA,SAASC,EAAeC,EAAwB,CAC5CA,EAAU,mBAAmB,WAAY,sBAAsBxB,EAAK,EAAE,iBAAiB,CAAC,MAAM,CAClG,CAEA,SAASyB,EAAarB,EAA6B,CAC3CA,EAAe,gBACAA,EAAA,cAAc,MAAM,QAAU,OAErD,CAEAsB,EAAQ,IAAM,CACJ,MAAAtB,EAAiB,SAAS,eAAe,cAAc,EACzDA,IAAmB,MACJA,EAAA,iBAAiB,QAAS,MAAOuB,GAAO,CACnDA,EAAG,eAAe,EACZ,MAAAlB,EAAiB,SAAS,cAA2B,gBAAgB,EAE3ED,EAAcJ,EAAgBK,CAAc,EACtC,MAAAmB,EAAWxB,EAAe,QAAQ,SAClCyB,EAAoBzB,EAAe,QAAQ,UACjD,GAAI,CAACyB,EAAmB,OAClB,MAAAL,EAAY,SAAS,cAA2BK,CAAiB,EACvE,GAAI,CAACL,EAAW,OAEhB,KAAM,CAAE,QAAAM,EAAS,aAAAC,CAAiB,EAAA,MAAM5B,EAASC,CAAc,EAE/DI,EAAcJ,EAAgBK,CAAc,EAE5C,IAAIuB,EAAO,GACPJ,IAAa,QAAaA,IAAa,kBAAoBA,IAAa,SACjEI,EAAAb,EAAeW,EAASpB,CAAa,EACrCkB,IAAa,gBACbI,EAAAb,EAAeW,EAASb,CAAiB,GAG1CO,EAAA,mBAAmB,YAAaQ,CAAI,EAE1CF,EAAQ,OAASC,GACjBN,EAAarB,CAAc,EAE3B0B,EAAQ,SAAW,GACnBP,EAAeC,CAAS,CAC5B,CACH,CAET,CAAC"}