1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["course-catalogue-C2jN3zI--chunk.js","_commonjsHelpers-HLVOKCDG-chunk.js","internet-DWDKwcGU.js","css/internet-btmOJIg5.min.css","dispatchCustomEvent-jx6mQCSE-chunk.js","css/course-catalogue-NOXj2-JO.min.css"])))=>i.map(i=>d[i]); 2var t=Object.defineProperty,e=(e,s,o)=>((e,s,o)=>s in e?t(e,s,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[s]=o)(e,"symbol"!=typeof s?s+"":s,o);import{t as s,_ as o}from"./internet-DWDKwcGU.js";import{d as n}from"./dispatchCustomEvent-jx6mQCSE-chunk.js";const r=(t,e)=>{switch(t){case"loading":return`\n <svg class="tw:animate-spin tw:text-current ${e}" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">\n <circle class="tw:opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="tw:opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>\n </svg>\n `;case"checkmark":return`\n <svg class="${e}" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
2\n <path d="M8.8002 15.9008L4.6002 11.7008L3.2002 13.1008L8.8002 18.7008L20.8002 6.70078L19.4002 5.30078L8.8002 15.9008Z" fill="currentColor"/>\n </svg>\n `;case"close":return`\n <svg class="${e}" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">\n <path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>\n <path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>\n </svg>\n `;default:return""}},i=t=>{var e;const s=JSON.parse((null==(e=document.getElementById(t))?void 0:e.textContent)??"{}");for(const n in s){const t=s[n];try{s[n]=decodeURIComponent(t).replace(/+/g," ")}catch(o){}}return s};const a=Object.freeze(Object.defineProperty({__proto__:null,CourseSelector:class{constructor(t){e(this,"tagsEndpoint",""),e(this,"courseCatalogueUrl"),e(this,"dom"),e(this,"tags"),e(this,"tagsDepth",0),e(this,"selectedTags",[]),e(this,"lastStepSelectedTags",[]),e(this,"stepHeadings",[]),e(this,"openDropdownIndex",null),e(this,"translations"),e(this,"outsideClickHandler"),e(this,"isMobileFilterOpen",!1),e(this,"getTags",async()=>{try{const t=await fetch(this.tagsEndpoint);return await t.json()}catch(t){return}}),e(this,"getTagsDepth",()=>{if(!this.tags)return 0;const t=e=>e&&e.Children&&0!==e.Children.length?1+Math.max(...e.Children.map(e=>t(e))):1;return t(this.tags)-1}),e(this,"handleSelectedTagClick",async t=>{var e;const s=t.currentTarget,o=s.dataset.tagId,n="true"===s.dataset.lastStep;if(!o)return;if(n)this.lastStepSelectedTags=this.lastStepSelectedTags.filter(t=>t.Id!==parseInt(o));else{const t=this.selectedTags.findIndex(t=>t.Id===parseInt(o));-1!==t&&(this.selectedTags=this.selectedTags.slice(0,t),this.lastStepSelectedTags=[])}this.closeAllDropdowns(),await this.render();const r=n?this.tagsDepth-1:this.selectedTags.length,i=null==(e=this.dom.dropdownsContainer)?void 0:e.querySelector(`[data-dropdown-trigger="${r}"]`);null==i||i.focus()}),e(this,"sendEventToCludo",()=>{const t=[...this.selectedTags,...this.lastStepSelectedTags];n("cludo-search:tag-selected",{detail:{selectedTags:JSON.stringify(t),tagsDepth:this.tagsDepth}})}),e(this,"getTagsForDropdown",t=>{var e,s;if(0===t)return(null==(e=this.tags)?void 0:e.Children)??[];let o=this.tags;for(let n=0;n<t;n++){if(!this.selectedTags[n])return[];o=null==(s=null==o?void 0:o.Children)?void 0:s.find(t=>t.Id===this.selectedTags[n].Id)}return(null==o?void 0:o.Children)??[]}),e(this,"createDropdownHTML",t=>{const e=0===t||void 0!==this.selectedTags[t-1],s=this.selectedTags[t],o=this.stepHeadings[t]||`Vælg ${t+1}`,n=this.getTagsForDropdown(t),i=t===this.tagsDepth-1,a=s||this.lastStepSelectedTags.length>0;let d;return d=i?this.lastStepSelectedTags.length>0?`${this.lastStepSelectedTags.length} valgt`:o:s?`${o} <strong>(1)</strong>`:o,`\n <div class="tw:relative tw:flex-1 tw:w-full tw:xs:min-w-[200px]" data-dropdown-index="${t}">\n <button\n class="tw:course-wizard-dropdown-trigger tw:group"\n data-dropdown-trigger="${t}"\n ${e?"":"disabled"}\n aria-expanded="false"\n aria-haspopup="listbox"\n aria-label="${o}"\n >\n <span class="${["tw:rounded-full tw:w-[36px] tw:h-[36px] tw:medium:w-[44px] tw:medium:h-[44px] tw:flex tw:items-center tw:justify-center tw:transition",a?"tw:bg-theme-course-selector-btn-bg-selected":e?"tw:bg-current":"tw:border tw:border-current"].join(" ")}">${a?r("checkmark","tw:text-theme-primaryTextColor"):`<span class="${e?"tw:text-theme-primary":""}">${t+1}.</span>`}</span>\n <span class="tw:course-wizard-dropdown-label ">${d}</span>\n <span class="tw:group-aria-expanded:rotate-180 tw:transition-all" aria-hidden="true">\n <i class="tw:block tw:mask-[url(/Resources/Images/Icons/chevron-down.svg)] tw:bg-current tw:w-5 tw:h-3"></i>\n </span>\n </button>\n <div\n class="tw:course-wizard-dropdown-menu"\n data-dropdown-menu="${t}"\n role="listbox"\n hidden\n >\n \n <div class="tw:flex tw:gap-3 tw:justify-between tw:items-center tw:sticky tw:top-0 tw:pt-3 tw:pb-2 tw:bg-theme-primary tw:z-10">\n <p class="tw:text-current tw:font-theme-font-headline tw:font-bold">${i?this.translations["multi-option"]:this.translations["single-option"]}</p>\n <button class="tw:xs:hidden" data-element="course-selector-close-dropdown">${r("close","tw:text-theme-primaryTextColor")}</button>\n </div>\n\n <div class="tw:flex tw:gap-3 ${i?"tw:flex-wrap":"tw:flex-col"}">\n ${n.map(t=>{const e={...t};delete e.Children;const o=encodeURIComponent(JSON.stringify(e)),n=i?this.lastStepSelectedTags.some(e=>e.Id===t.Id):(null==s?void 0:s.Id)===t.Id;return!i||t.Children&&0!==t.Children.length?`\n <button\n class="tw:course-wizard-dropdown-option"\n data-tag="${o}"\n data-tag-id="${t.Id}"\n role="option"\n ${n?'aria-selected="true"':""}\n >
2\n <span class="tw:relative tw:rounded-full tw:w-6 tw:h-6 tw:border-2 tw:border-current ${n?"tw:after:absolute tw:after:left-1/2 tw:after:top-1/2 tw:after:-translate-x-1/2 tw:after:-translate-y-1/2 tw:after:w-3 tw:after:h-3 tw:after:rounded-full tw:after:bg-theme-course-selector-btn-text":""}"></span>\n <span>${t.Name}</span>\n </button>\n `:`\n <button\n class="tw:course-wizard-dropdown-option tw:flex-wrap"\n data-tag="${o}"\n data-tag-id="${t.Id}"\n role="option"\n ${n?'aria-selected="true"':""}\n type="button"\n >\n <span>${t.Name}</span>\n </button>\n `}).join("")}\n </div>\n </div>\n </div>\n `}),e(this,"renderDropdowns",async()=>{if(!this.dom.dropdownsContainer)return;const t=this.openDropdownIndex===this.tagsDepth-1&&null!==this.openDropdownIndex;this.dom.dropdownsContainer.innerHTML="";for(let e=0;e<this.tagsDepth;e++){const t=this.createDropdownHTML(e);this.dom.dropdownsContainer.insertAdjacentHTML("beforeend",t)}if(this.attachDropdownListeners(),t){const t=this.tagsDepth-1;this.openDropdown(t)}}),e(this,"attachDropdownListeners",()=>{this.dom.dropdownsContainer&&(this.removeDropdownListeners(),this.dom.dropdownsContainer.querySelectorAll("[data-dropdown-trigger]").forEach(t=>{t.addEventListener("click",this.handleDropdownTriggerClick),t.addEventListener("keydown",this.handleDropdownKeydown)}),this.dom.dropdownsContainer.querySelectorAll("[data-element='course-selector-close-dropdown']").forEach(t=>{t.addEventListener("click",()=>this.toggleDropdownAtIndex())}),this.dom.dropdownsContainer.querySelectorAll("[data-tag]").forEach(t=>{t.addEventListener("click",this.handleDropdownOptionClick)}),this.outsideClickHandler=t=>{t.target.closest("[data-dropdown-index]")||null===this.openDropdownIndex||this.closeAllDropdowns()},document.addEventListener("click",this.outsideClickHandler))}),e(this,"removeDropdownListeners",()=>{this.dom.dropdownsContainer&&(this.dom.dropdownsContainer.querySelectorAll("[data-dropdown-trigger]").forEach(t=>{t.removeEventListener("click",this.handleDropdownTriggerClick),t.removeEventListener("keydown",this.handleDropdownKeydown)}),this.dom.dropdownsContainer.querySelectorAll("[data-tag]").forEach(t=>{t.removeEventListener("click",this.handleDropdownOptionClick)}),this.outsideClickHandler&&(document.removeEventListener("click",this.outsideClickHandler),this.outsideClickHandler=void 0))}),e(this,"toggleDropdownAtIndex",t=>{this.openDropdownIndex===t||void 0===t?this.closeAllDropdowns():(this.closeAllDropdowns(),this.openDropdown(t))}),e(this,"getDropdownIndexFromTrigger",t=>{if(t.disabled)return null;const e=parseInt(t.dataset.dropdownTrigger??"-1");return-1===e?null:e}),e(this,"handleDropdownTriggerClick",t=>{const e=t,s=e.currentTarget,o=this.getDropdownIndexFromTrigger(s);null!==o&&(e.stopPropagation(),this.toggleDropdownAtIndex(o))}),e(this,"handleDropdownKeydown",t=>{const e=t,s=e.currentTarget,o=this.getDropdownIndexFromTrigger(s);if(null!==o)switch(e.key){case"Enter":case" ":e.preventDefault(),this.toggleDropdownAtIndex(o);break;case"Escape":this.closeAllDropdowns(),s.focus();break;case"ArrowDown":e.preventDefault(),this.openDropdownIndex!==o&&(this.closeAllDropdowns(),this.openDropdown(o)),this.focusFirstOption(o)}}),e(this,"handleDropdownOptionClick",t=>{var e;const s=t.currentTarget,o=s.dataset.tag;if(o)try{const n=JSON.parse(decodeURIComponent(o)),r=parseInt((null==(e=s.closest("[data-dropdown-index]"))?void 0:e.getAttribute("data-dropdown-index"))??"-1");if(-1===r)return;const i=r===this.tagsDepth-1;if(i){const t=this.lastStepSelectedTags.findIndex(t=>t.Id===n.Id);-1!==t?this.lastStepSelectedTags.splice(t,1):this.lastStepSelectedTags.push(n)}else this.selectedTags=this.selectedTags.slice(0,r),this.selectedTags.push(n),this.lastStepSelectedTags=[];i||this.closeAllDropdowns(),this.render(),t.preventDefault(),this.dom.resultsSection&&this.sendEventToCludo()}catch(n){}}),e(this,"openDropdown",t=>{var e,o;const r=getComputedStyle(document.documentElement).getPropertyValue("--breakpoint-xs").trim();window.matchMedia(`(max-width: ${r})`).matches&&n("sticky-header:hide");const i=null==(e=this.dom.dropdownsContainer)?void 0:e.querySelector(`[data-dropdown-menu="${t}"]`),a=null==(o=this.dom.dropdownsContainer)?void 0:o.querySelector(`[data-dropdown-trigger="${t}"]`);i&&a&&(i.hidden=!1,a.setAttribute("aria-expanded","true"),s(a,"tw:xs:rounded-t-sm tw:xs:rounded-b-none tw:xs:border-b-0 tw:bg-theme-primary-btn-interaction"),this.openDropdownIndex=t,document.body.classList.add("tw:max-xs:overflow-hidden"))}),e(this,"closeAllDropdowns",()=>{var t,e;if(null===this.openDropdownIndex)return;const o=null==(t=this.dom.dropdownsContainer)?void 0:t.querySelector(`[data-dropdown-menu="${this.openDropdownIndex}"]`),n=null==(e=this.dom.dropdownsContainer)?void 0:e.querySelector(`[data-dropdown-trigger="${this.openDropdownIndex}"]`);
2o&&n&&(o.hidden=!0,n.setAttribute("aria-expanded","false"),s(n,"tw:xs:rounded-sm tw:xs:border-b tw:bg-transparent")),this.openDropdownIndex=null,document.body.classList.remove("tw:max-xs:overflow-hidden")}),e(this,"focusFirstOption",t=>{var e;const s=null==(e=this.dom.dropdownsContainer)?void 0:e.querySelector(`[data-dropdown-menu="${t}"]`),o=null==s?void 0:s.querySelector('[role="option"]');null==o||o.focus()}),e(this,"generateSearchUrl",()=>{if(!this.courseCatalogueUrl)return"#";if(0===this.selectedTags.length&&0===this.lastStepSelectedTags.length)return this.courseCatalogueUrl;const t=[];if(this.selectedTags.forEach(({Value:e},s)=>{t.push(`course-searchTags${s+1}=${this.formatTagValueForSearchQuery(e)}`)}),this.lastStepSelectedTags.length>0){const e=this.selectedTags.length+1,s=this.lastStepSelectedTags.map(({Value:t})=>this.formatTagValueForSearchQuery(t)).join(",");t.push(`course-searchTags${e}=${s}`)}return`${this.courseCatalogueUrl}#?${t.join("&")}`}),e(this,"updateSearchCta",()=>{s(this.dom.resetButton,this.selectedTags.length>0?"tw:block":"tw:hidden"),this.dom.searchCta&&(0===this.selectedTags.length?this.dom.searchCta.setAttribute("aria-disabled","true"):(this.dom.searchCta.href=this.generateSearchUrl(),this.dom.searchCta.removeAttribute("aria-disabled")))}),e(this,"updateMobileFilterButtonCount",()=>{this.dom.mobileFilterButtonCount&&((this.selectedTags.length>0||this.lastStepSelectedTags.length>0)&&!this.isMobileFilterOpen?(s(this.dom.mobileFilterButtonCount,"tw:block"),this.dom.mobileFilterButtonCount.textContent=`(${this.selectedTags.length+this.lastStepSelectedTags.length})`):s(this.dom.mobileFilterButtonCount,"tw:hidden"))}),e(this,"render",async()=>{await this.renderDropdowns(),this.updateSearchCta(),this.updateMobileFilterButtonCount()}),e(this,"reset",async()=>{var t;this.selectedTags=[],this.lastStepSelectedTags=[],this.closeAllDropdowns(),await this.render(),this.sendEventToCludo();const e=null==(t=this.dom.dropdownsContainer)?void 0:t.querySelector('[data-dropdown-trigger="0"]');null==e||e.focus()}),e(this,"routeToState",()=>{const t=new URLSearchParams(window.location.hash.split("#")[1]),e=Math.max(0,this.tagsDepth-1),s=[];let o=null;for(let i=1;i<=e;i++){const e=t.get(`course-searchTags${i}`);e&&s.push(this.reverseFormatTagValueForSearchQuery(e))}const n=e+1;if(o=t.get(`course-searchTags${n}`),0===s.length&&!o)return;let r=this.tags;if(s.forEach(t=>{var e;if(r=null==(e=null==r?void 0:r.Children)?void 0:e.find(e=>e.Value.toLowerCase()===t.toLowerCase()),r){const t={...r};delete t.Children,this.selectedTags.push(t)}}),o&&r){o.split(",").forEach(t=>{var e;const s=this.reverseFormatTagValueForSearchQuery(t),o=null==(e=null==r?void 0:r.Children)?void 0:e.find(t=>t.Value.toLowerCase()===s.toLowerCase());if(o){const t={...o};delete t.Children,this.lastStepSelectedTags.push(t)}})}}),e(this,"formatTagValueForSearchQuery",t=>decodeURIComponent(t).replace(/\+/g," ").split("|").map(t=>encodeURIComponent(t)).join(",")),e(this,"reverseFormatTagValueForSearchQuery",t=>{const e=t.split(",").map(t=>decodeURIComponent(t)).join("|");return encodeURIComponent(e).replace(/%20/g,"+")}),e(this,"loadCourseCatalogue",async()=>{if(this.dom.resultsSection){const t=[...this.selectedTags,...this.lastStepSelectedTags];new((await o(async()=>{const{CourseCatalogueModule:t}=await import("./course-catalogue-C2jN3zI--chunk.js");return{CourseCatalogueModule:t}},__vite__mapDeps([0,1,2,3,4,5]))).CourseCatalogueModule)(this.dom.resultsSection,t,this.tagsDepth),n("course-catalogue:loaded")}}),e(this,"init",async()=>{var t,e,s;this.dom.resultsSection&&(null==(t=this.dom.mobileFilterButton)||t.addEventListener("click",t=>{this.isMobileFilterOpen=!this.isMobileFilterOpen;t.currentTarget.setAttribute("aria-expanded",this.isMobileFilterOpen.toString()),this.dom.mobileFilterButtonText&&(this.dom.mobileFilterButtonText.textContent=this.isMobileFilterOpen?this.translations.close:this.translations.filter),this.isMobileFilterOpen?window.scrollTo({top:this.dom.container.offsetTop-100,behavior:"smooth"}):window.scrollTo({top:this.dom.resultsSection?this.dom.resultsSection.offsetTop-100:0,behavior:"smooth"}),this.render()})),this.dom.dropdownsContainer&&(this.dom.dropdownsContainer.innerHTML=r("loading","tw:size-6")),this.tags=await this.getTags(),this.tagsDepth=this.getTagsDepth(),this.routeToState(),window.cludo_scriptHasLoaded?await this.loadCourseCatalogue():window.addEventListener("cludo-script:loaded",async()=>{await this.loadCourseCatalogue()}),await this.render(),null==(e=this.dom.resetButton)||e.addEventListener("click",this.reset),null==(s=this.dom.searchCta)||s.addEventListener("click",t=>{this.dom.resultsSection&&(t.preventDefault(),window.scrollTo({top:this.dom.resultsSection.offsetTop-100,behavior:"smooth"}))})}),e(this,"destroy",()=>{var t;this.removeDropdownListeners(),null==(t=this.dom.resetButton)||t.removeEventListener("click",this.reset)}),this.dom={container:t,mobileFilterButton:t.querySelector('[data-element="course-selector-mobile-filter-button"]'),mobileFilterButtonText:t.querySelector('[data-element="course-selector-mobile-filter-button-text"]'),mobileFilterButtonCount:t.querySelector('[data-element="course-selector-mobile-filter-button-count"]'),content:t.querySelector('[data-element="course-selector-content"]'),dropdownsContainer:t.querySelector('[data-element="course-selector-dropdowns"]'),selectedTags:t.querySelector('[data-element="wizard-selected-tags"]'),resetButton:t.querySelector('button[data-element="wizard-reset-button"]'),searchCta:t.querySelector('[data-element="wizard-search-cta"]'),resultsSection:document.getElementById("course-catalogue-container")},this.tagsEndpoint=t.dataset.courseTaggingstructureUrl??"",this.courseCatalogueUrl=t.dataset.courseCatalogueUrl,this.stepHeadings=[t.dataset["stepText-1"]??"",t.dataset["stepText-2"]??"",t.dataset["stepText-3"]??"",t.dataset["stepText-4"]??""],this.translations=i("course-selector-translations"),this.init()}}},Symbol.toStringTag,{value:"Module"}));
2export{a as c,i as g};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.