{"version":3,"file":"194.038217bcbcf075c1c9d0.js","mappings":"4JAEA,MAAMA,EAAMC,SAASC,KAAKC,QAAQ,MAAO,IACnCC,EAAUJ,EAAIK,MAAM,KAAK,GACzBC,EAAYC,SAASC,MAC3B,IAAIC,EAAY,KAChB,GAAGR,SAASS,KAAM,CACd,IAAIC,EAAIX,EAAIK,MAAM,KAAK,GACpBM,EAAEC,OAAS,IAAGH,EAAYE,GAGjC,MAAME,EAEFC,YAAYC,GACRC,KAAKD,GAAKA,EACVC,KAAKC,KAAOF,EAAGG,iBAAiB,aAChCF,KAAKG,YAAcf,EACnBY,KAAKI,eAAiB,KACtB,IAAIC,EAAQL,KACI,MAAbA,KAAKC,MACJD,KAAKC,KAAKK,SAAQC,IACd,IAAIC,EAAWD,EAAEE,UACbC,EAAgB,GAAEpB,OAAekB,IACjCG,EAAcJ,EAAEK,aAAa,QAAUL,EAAEM,aAAa,QAAUN,EAAEO,QAAQC,SAE9ER,EAAES,iBAAiB,gBAAgBC,IAC/B,IAAIjC,EAAM,KACPiC,EAAMC,OAAOL,aAAa,QACzB7B,EAAMI,EAAU6B,EAAMC,OAAOL,aAAa,QACpCI,EAAMC,OAAOJ,QAAQC,WAC3B/B,EAAMI,EAAU6B,EAAMC,OAAOJ,QAAQC,UAEtC/B,GAAKqB,EAAMc,cAAcnC,EAAK0B,MAGrCnB,SAASW,iBAAkB,2BAA0BS,OAAiBL,SAAQc,IAC1EA,EAAEJ,iBAAiB,SAAS,KACxBhB,KAAKqB,QAAQd,GACbe,YAAW,KAAOf,EAAEgB,UAAU,WAGtChC,SAASiC,cAAcb,GAAaT,iBAAkB,QAAOI,SAAQc,IACjE7B,SAASW,iBAAkB,aAAYkB,EAAEK,QAAQnB,SAAQoB,IACrDA,EAAEV,iBAAiB,SAAS,KACxBhB,KAAKqB,QAAQd,GACb,IAAIvB,EAAO,GAAEI,KAAWgC,EAAEK,KAC1BzB,KAAKmB,cAAcnC,EAAK0B,YAKjCjB,GAAWO,KAAK2B,eAAelC,MAI1CmC,OAAOZ,iBAAiB,YAAYC,IACd,MAAfA,EAAMY,OACiB,MAAnBZ,EAAMY,MAAM7C,KACXqB,EAAMsB,eAAeV,EAAMY,MAAM7C,IAAIK,MAAM,KAAK,OAMhEsC,eAAeG,GACX9B,KAAKC,KAAKK,SAAQC,IACd,IAAIC,EAAWD,EAAEE,UACbC,EAAgB,GAAEpB,OAAekB,IACjCG,EAAcJ,EAAEK,aAAa,QAAUL,EAAEM,aAAa,QAAUN,EAAEO,QAAQC,SAE1EgB,EAAQpB,GAAgB,IAAGmB,IAI/B,GAFIC,IAAOA,EAAQxC,SAASiC,cAAe,GAAEb,MAAgBmB,MAE1DC,EAAO,CACN/B,KAAKqB,QAAQd,GACb,IAAIvB,EAAO,GAAEI,KAAW0C,IACxB9B,KAAKmB,cAAcnC,EAAK0B,OAKpCW,QAAQW,GACJ,IAAIA,EAAIC,UAAUC,SAAS,UAAW,CAClBC,EAAAA,GAAAA,oBAAiCH,GACvCI,QAIlBjB,cAAckB,EAAQC,GAClBC,aAAavC,KAAKI,gBAClBJ,KAAKI,eAAiBkB,YAAW,KAC1BtB,KAAKG,aAAekC,IACnBrC,KAAKG,YAAckC,EACnBG,QAAQC,UAAU,CAACjD,MAAO8C,EAAUtD,IAAKqD,GAASC,EAAUD,GAC5D9C,SAASC,MAAQ8C,KAEtB,MAMJ,SAASI,EAAWC,GAEvBA,EAASrC,SAASsC,IAEQ,IAAlBA,EAAKC,UACL,IAAIhD,EAAU+C","sources":["webpack://iflyworld.web/./wwwroot/app/src/js/smart-bootstrap-tabs.js"],"sourcesContent":["import { Tab as bootstrapTab } from 'bootstrap';\r\n\r\nconst url = location.href.replace(/\\/$/, \"\");\r\nconst pageUrl = url.split(\"#\")[0];\r\nconst pageTitle = document.title;\r\nlet hashFound = null;\r\nif(location.hash) {\r\n let h = url.split(\"#\")[1];\r\n if(h.length > 0) hashFound = h;\r\n}\r\n\r\nclass SmartTabs {\r\n\r\n constructor(el) {\r\n this.el = el;\r\n this.tabs = el.querySelectorAll('.nav-link');\r\n this.prevPageURL = pageUrl;\r\n this.updaterTimeout = null;\r\n let _this = this;\r\n if(this.tabs != null) {\r\n this.tabs.forEach(t => {\r\n let tabTitle = t.innerText,\r\n tabPageTitle = `${pageTitle} - ${tabTitle}`,\r\n tabTargetId = t.hasAttribute('href') ? t.getAttribute('href') : t.dataset.bsTarget;\r\n // update page url anchor when tabs changed\r\n t.addEventListener('shown.bs.tab', event => {\r\n let url = null;\r\n if(event.target.getAttribute('href')) {\r\n url = pageUrl + event.target.getAttribute('href');\r\n } else if(event.target.dataset.bsTarget) {\r\n url = pageUrl + event.target.dataset.bsTarget;\r\n }\r\n if(url) _this.updatePageURL(url, tabPageTitle);\r\n })\r\n // activate tab if external link to it, or a contained element, is clicked\r\n document.querySelectorAll(`a:not(.nav-link)[href$=\"${tabTargetId}\"]`).forEach(a => {\r\n a.addEventListener('click', () => {\r\n this.showTab(t);\r\n setTimeout(() => {t.focus()}, 100);\r\n });\r\n });\r\n document.querySelector(tabTargetId).querySelectorAll(`[id]`).forEach(a => {\r\n document.querySelectorAll(`a[href$=\"#${a.id}\"]`).forEach(b => {\r\n b.addEventListener('click', () => {\r\n this.showTab(t);\r\n let url = `${pageUrl}#${a.id}`; \r\n this.updatePageURL(url, tabPageTitle);\r\n });\r\n });\r\n });\r\n // set active tab on page load?\r\n if(hashFound) this.findHashInTabs(hashFound);\r\n });\r\n }\r\n // listen for popstate\r\n window.addEventListener('popstate', event => {\r\n if(event.state != null) {\r\n if(event.state.url != null) {\r\n _this.findHashInTabs(event.state.url.split('#')[1]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n findHashInTabs(getHash) {\r\n this.tabs.forEach(t => {\r\n let tabTitle = t.innerText,\r\n tabPageTitle = `${pageTitle} - ${tabTitle}`,\r\n tabTargetId = t.hasAttribute('href') ? t.getAttribute('href') : t.dataset.bsTarget;\r\n // is it this tab?\r\n let found = tabTargetId == `#${getHash}`;\r\n // is it in this tab content\r\n if(!found) found = document.querySelector(`${tabTargetId} #${getHash}`);\r\n // if found, turn on this tab\r\n if(found) {\r\n this.showTab(t);\r\n let url = `${pageUrl}#${getHash}`; \r\n this.updatePageURL(url, tabPageTitle);\r\n }\r\n });\r\n }\r\n\r\n showTab(tab) {\r\n if(!tab.classList.contains('active')) {\r\n let tabToShow = bootstrapTab.getOrCreateInstance(tab);\r\n tabToShow.show();\r\n }\r\n }\r\n\r\n updatePageURL(newURL, newTitle) {\r\n clearTimeout(this.updaterTimeout);\r\n this.updaterTimeout = setTimeout(() => {\r\n if(this.prevPageURL != newURL) {\r\n this.prevPageURL = newURL;\r\n history.pushState({title: newTitle, url: newURL}, newTitle, newURL);\r\n document.title = newTitle;\r\n }\r\n }, 300);\r\n }\r\n\r\n}\r\n\r\n// export the default function to create\r\nexport function createFrom(wrappers) {\r\n\r\n wrappers.forEach((node) => {\r\n // if node is an element\r\n if (node.nodeType === 1) {\r\n new SmartTabs(node);\r\n }\r\n });\r\n\r\n}"],"names":["url","location","href","replace","pageUrl","split","pageTitle","document","title","hashFound","hash","h","length","SmartTabs","constructor","el","this","tabs","querySelectorAll","prevPageURL","updaterTimeout","_this","forEach","t","tabTitle","innerText","tabPageTitle","tabTargetId","hasAttribute","getAttribute","dataset","bsTarget","addEventListener","event","target","updatePageURL","a","showTab","setTimeout","focus","querySelector","id","b","findHashInTabs","window","state","getHash","found","tab","classList","contains","bootstrapTab","show","newURL","newTitle","clearTimeout","history","pushState","createFrom","wrappers","node","nodeType"],"sourceRoot":""}