bootstrap5-tags
Version:
Replace select[multiple] with nices badges for Bootstrap 5
8 lines (7 loc) • 26 kB
JavaScript
var $={items:[],allowNew:!1,showAllSuggestions:!1,badgeStyle:"primary",allowClear:!1,clearEnd:!1,selected:[],regex:"",separator:[],max:0,clearLabel:"Clear",searchLabel:"Type a value",showDropIcon:!0,keepOpen:!1,allowSame:!1,baseClass:"",placeholder:"",addOnBlur:!1,showDisabled:!1,hideNativeValidation:!1,suggestionsThreshold:-1,maximumItems:0,autoselectFirst:!0,updateOnSelect:!1,highlightTyped:!1,highlightClass:"",fullWidth:!0,fixed:!1,fuzzy:!1,startsWith:!1,singleBadge:!1,activeClasses:["bg-primary","text-white"],labelField:"label",valueField:"value",searchFields:["label"],queryParam:"query",server:"",serverMethod:"GET",serverParams:{},serverDataKey:"data",fetchOptions:{},liveServer:!1,noCache:!0,allowHtml:!1,debounceTime:300,notFoundMessage:"",displayValueInBadge:!1,inputFilter:a=>a,sanitizer:a=>W(a),onRenderItem:(a,t,e)=>e.config("allowHtml")?t:e.config("sanitizer")(t),onSelectItem:(a,t)=>{},onClearItem:(a,t)=>{},onCreateItem:(a,t)=>{},onBlur:(a,t)=>{},onDataLoaded:(a,t)=>{},onFocus:(a,t)=>{},onCanAdd:(a,t,e)=>{},confirmClear:(a,t)=>Promise.resolve(),confirmAdd:(a,t)=>Promise.resolve(),onServerResponse:(a,t)=>a.json(),onServerError:(a,t,e)=>{a.name==="AbortError"||t.aborted||console.error(a)}},g="tags-",H="is-loading",N="is-active",b="is-invalid",R="is-max-reached",A="show",v="data-value",I="next",D="prev",T="form-control-focus",q="form-placeholder-shown",z="form-control-disabled",E=new WeakMap,P=0,L=window.bootstrap&&window.bootstrap.Tooltip;function _(a,t=300){let e;return(...i)=>{clearTimeout(e),e=setTimeout(()=>{a.apply(this,i)},t)}}function j(a,t=document.body){let e=p("span");t.appendChild(e),e.style.fontSize="inherit",e.style.height="auto",e.style.width="auto",e.style.position="absolute",e.style.whiteSpace="no-wrap",e.innerHTML=W(`${a}`);let i=Math.ceil(e.clientWidth);return t.removeChild(e),i<=20&&t!==document.body?j(a,document.body):i}function J(a){if(!a.includes("#"))return!0;let t=+("0x"+a.slice(1).replace(a.length<5&&/./g,"$&$&")),e=t>>16,i=t>>8&255,s=t&255;return Math.sqrt(.299*(e*e)+.587*(i*i)+.114*(s*s))>127.5}function W(a){return a.replace(/[\x26\x0A\<>'"]/g,function(t){return"&#"+t.charCodeAt(0)+";"})}function U(a){return a.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}function k(a){return a?U(a.toString()).toLowerCase():""}function G(a,t){if(a.indexOf(t)>=0)return!0;let e=0;for(let i=0;i<t.length;i++){let s=t[i];if(s!==" "&&(e=a.indexOf(s,e)+1,e<=0))return!1}return!0}function O(a){a.style.display="none",x(a,{"aria-hidden":"true"})}function B(a){a.style.display="list-item",x(a,{"aria-hidden":"false"})}function x(a,t){for(let[e,i]of Object.entries(t))a.setAttribute(e,i)}function y(a,t){a.hasAttribute(t)&&a.removeAttribute(t)}function V(a){return["true","false","1","0",!0,!1].includes(a)&&!!JSON.parse(a)}function p(a){return document.createElement(a)}function X(a,t){let e=t[0],i=a;for(let s=1;s<t.length;s++)i=i.split(t[s]).join(e);return i.split(e)}function Y(a,t="window"){return a.split(".").reduce((e,i)=>e[i],t)}var S=class{constructor(t,e={}){if(!(t instanceof HTMLElement)){console.error("Invalid element",t);return}E.set(t,this),P++,this.i=t,this.M(e),this.p=!1,this.d=!1,this.$=_(()=>{this.w(!0)},this.e.debounceTime),this.a=!0,this.H(),this.l=p("div"),this.o=p("div"),this.n=p("ul"),this.s=p("input"),this.l.appendChild(this.o),this.i.parentElement.insertBefore(this.l,this.i),this.N(),this.R(),this.q(),this.z(),this.P(),this.resetState(),this.handleEvent=i=>{this.A(i)},this.e.fixed&&(document.addEventListener("scroll",this,!0),window.addEventListener("resize",this)),Array.isArray(this.e.separator)&&(this.e.separator=this.e.separator.filter(i=>i)),this.e.labelField!=="label"&&this.e.searchFields.includes("label")&&this.e.searchFields.length===1&&(this.e.searchFields=[this.e.labelField]);for(let i of["focus","blur","input","keydown","paste"])this.s.addEventListener(i,this);for(let i of["mousemove","mouseleave"])this.n.addEventListener(i,this);this.loadData(!0)}static init(t="select[multiple]",e={},i=!1){let s=document.querySelectorAll(t);for(let l=0;l<s.length;l++){let n=S.getInstance(s[l]);n&&!i||(n&&n.dispose(),new S(s[l],e))}}static getInstance(t){if(E.has(t))return E.get(t)}dispose(){for(let t of["focus","blur","input","keydown","paste"])this.s.removeEventListener(t,this);for(let t of["mousemove","mouseleave"])this.n.removeEventListener(t,this);this.e.fixed&&(document.removeEventListener("scroll",this,!0),window.removeEventListener("resize",this)),this.i.style.display="block",this.l.parentElement.removeChild(this.l),this.parentForm&&this.parentForm.removeEventListener("reset",this),E.delete(this.i)}handleEvent(t){this.A(t)}A(t){["scroll","resize"].includes(t.type)?(this.L&&window.cancelAnimationFrame(this.L),this.L=window.requestAnimationFrame(()=>{this[`on${t.type}`](t)})):this[`on${t.type}`](t)}M(t={}){this.e=Object.assign({},$,{showDropIcon:!!this.c()});let e=this.i.dataset.config?JSON.parse(this.i.dataset.config):{},i={...t,...e,...this.i.dataset};for(let[s,l]of Object.entries($)){if(s==="config"||i[s]===void 0)continue;let n=i[s];switch(typeof l){case"number":this.e[s]=parseInt(n);break;case"boolean":this.e[s]=V(n);break;case"string":this.e[s]=n.toString();break;case"object":this.e[s]=n,typeof n=="string"&&(["{","["].includes(n[0])?this.e[s]=JSON.parse(n):this.e[s]=n.split(n.includes("|")?"|":","));break;case"function":this.e[s]=typeof n=="string"?n.split(".").reduce((r,o)=>r[o],window):n,this.e[s]||console.error("Invalid function",n);break;default:this.e[s]=n;break}}this.e.placeholder||(this.e.placeholder=this.B()),this.e.suggestionsThreshold==-1&&(this.e.suggestionsThreshold=this.e.liveServer?1:0)}config(t=null){return t?this.e[t]:this.e}setConfig(t,e){this.e[t]=e}H(){for(this.overflowParent=null,this.parentForm=this.i.parentElement;this.parentForm&&(this.parentForm.style.overflow==="hidden"&&(this.overflowParent=this.parentForm),this.parentForm=this.parentForm.parentElement,!(this.parentForm&&this.parentForm.nodeName=="FORM")););this.parentForm&&this.parentForm.addEventListener("reset",this)}B(){if(this.i.hasAttribute("placeholder"))return this.i.getAttribute("placeholder");if(this.i.dataset.placeholder)return this.i.dataset.placeholder;let t=this.i.querySelector("option");return!t||t.value!=""?"":(y(t,"selected"),t.selected=!1,t.textContent)}q(){let t=this.i;this.e.hideNativeValidation?(t.style.position="absolute",t.style.left="-9999px"):t.style.cssText="height:1px;width:1px;opacity:0;padding:0;margin:0;border:0;float:left;flex-basis:100%;min-height:unset;",t.tabIndex=-1,t.addEventListener("focus",e=>{this.onclick(e)}),t.addEventListener("invalid",e=>{this.l.classList.add(b)})}P(){let t=this.n;t.classList.add("dropdown-menu",`${g}menu`),t.id=`${g}menu-${P}`,t.setAttribute("role","menu");let e=t.style;e.padding="0",e.maxHeight="280px",this.e.fullWidth||(e.maxWidth="360px"),this.e.fixed&&(e.position="fixed"),e.overflowY="auto",e.overscrollBehavior="contain",e.textAlign="unset",t.addEventListener("mouseenter",i=>{this.d=!1}),this.l.appendChild(t),this.s.setAttribute("aria-controls",t.id)}N(){let t=this.l;t.classList.add("form-control","dropdown"),["form-select-lg","form-select-sm","is-invalid","is-valid"].forEach(e=>{this.i.classList.contains(e)&&t.classList.add(e)}),this.e.suggestionsThreshold==0&&this.e.showDropIcon&&t.classList.add("form-select"),this.overflowParent&&(t.style.position="inherit"),t.style.height="auto",t.addEventListener("click",this)}R(){this.o.addEventListener("click",e=>{this.isDisabled()||this.s.style.visibility!=="hidden"&&this.s.focus()});let t=this.o.style;t.display="flex",t.alignItems="center",t.flexWrap="wrap"}z(){let t=this.s;t.type="text",t.autocomplete="off",t.spellcheck=!1,x(t,{"aria-autocomplete":"list","aria-haspopup":"menu","aria-expanded":"false","aria-label":this.e.searchLabel,role:"combobox"}),t.style.cssText="background-color:transparent;color:currentColor;border:0;padding:0;outline:0;max-width:100%",this.resetSearchInput(!0),this.o.appendChild(t),this.V=t.dir===""&&document.dir==="rtl"||t.dir==="rtl"}onfocus(t){this.l.classList.contains(T)||(this.l.classList.add(T),this.showOrSearch(),this.e.onFocus(t,this))}onblur(t){let e=t.relatedTarget;if(this.p&&e&&(e.classList.contains("modal")||e.classList.contains(`${g}menu`))){this.s.focus();return}this.afteronblur(t)}afteronblur(t){this.h&&this.h.abort();let e=!0;if(this.e.addOnBlur&&this.s.value&&(e=this.C()),this.l.classList.remove(T),this.hideSuggestions(e),this.a){let i=this.getSelection(),s={selection:i?i.dataset.value:null,input:this.s.value};this.e.onBlur(t,this),this.i.dispatchEvent(new CustomEvent("tags.blur",{bubbles:!0,detail:s}))}}onpaste(t){let i=(t.clipboardData||window.clipboardData).getData("text/plain").replace(/\r\n|\n/g," ");if(i.length>2&&this.e.separator.length){let s=X(i,this.e.separator).filter(l=>l);if(s.length>1){t.preventDefault();for(let l of s)this.I(l)}}}I(t){let e=t,i={};if(this.e.allowNew)i.new=1;else{let s=this.getSelection();if(!s)return;t=s.getAttribute(v),e=s.dataset.label}this.e.confirmAdd(t,this).then(()=>{this.m(e,t,i)}).catch(()=>{})}oninput(t){let e=this.e.inputFilter(this.s.value);if(e!=this.s.value&&(this.s.value=e),e){let i=e.slice(-1);if(this.e.separator.length&&this.e.separator.includes(i)){this.s.value=this.s.value.slice(0,-1),this.I(this.s.value);return}}setTimeout(()=>{this.r()}),this.showOrSearch()}onkeydown(t){let e=t.keyCode||t.key,i=t.target;switch(t.keyCode==229&&(e=i.value.charAt(i.selectionStart-1).charCodeAt(0)),e){case 13:case"Enter":t.preventDefault(),this.C();break;case 38:case"ArrowUp":t.preventDefault(),this.d=!0,this.g(D);break;case 40:case"ArrowDown":t.preventDefault(),this.d=!0,this.isDropdownVisible()?this.g(I):this.showOrSearch(!1);break;case 8:case"Backspace":let s=this.getLastItem();this.s.value.length===0&&s&&this.e.confirmClear(s,this).then(()=>{this.removeLastItem(),this.r(),this.showOrSearch()}).catch(()=>{});break;case 27:case"Escape":this.s.focus(),this.hideSuggestions();break}}onmousemove(t){this.p=!0,this.d=!1}onmouseleave(t){this.p=!1,this.removeSelection()}onscroll(t){this.b()}onresize(t){this.b()}onclick(t=null){!this.isSingle()&&this.isMaxReached()||this.s.focus()}onreset(t){this.reset()}loadData(t=!1){Object.keys(this.e.items).length>0?this.setData(this.e.items,!0):this.resetSuggestions(!0),this.e.server&&(this.e.liveServer||this.w(!t))}j(){let t=this.i.selectedOptions||[];for(let e=0;e<t.length;e++)t[e].value&&!t[e].hasAttribute("selected")&&t[e].setAttribute("selected","selected")}resetState(){this.isDisabled()?(this.l.setAttribute("readonly",""),this.s.setAttribute("disabled",""),this.l.classList.add(z)):(y(this.l,"readonly"),y(this.s,"disabled"),this.l.classList.remove(z))}resetSuggestions(t=!1){this.j();let e=s=>{let l={value:s.getAttribute("value"),label:s.textContent,disabled:s.disabled,selected:s.selected,title:s.title,data:Object.assign({disabled:s.disabled},s.dataset)};return this.e.valueField!=="value"&&(l[this.e.valueField]=l.value),this.e.labelField!=="label"&&(l[this.e.labelField]=l.label),l},i=Array.from(this.i.children).filter(s=>s.hasAttribute("label")||!s.disabled||this.e.showDisabled).map(s=>s.hasAttribute("label")?{group:s.getAttribute("label"),items:Array.from(s.children).map(l=>e(l))}:e(s));this.setData(i,t)}C(){let t=this.getSelection();if(t)return t.click(),!0;if(this.e.allowNew&&this.s.value){let e=this.s.value;return this.e.confirmAdd(e,this).then(()=>{this.m(e,e,{new:1})}).catch(()=>{}),!0}return!1}w(t=!1){this.h&&this.h.abort(),this.h=new AbortController;let e=this.i.dataset.serverParams||{};typeof e=="string"&&(e=JSON.parse(e));let i=Object.assign({},this.e.serverParams,e);if(i[this.e.queryParam]=this.s.value,this.e.noCache&&(i.t=Date.now()),i.related){let r=document.getElementById(i.related);if(r){i.related=r.value;let o=r.getAttribute("name");o&&(i[o]=r.value)}}let s=new URLSearchParams(i),l=this.e.server,n=Object.assign(this.e.fetchOptions,{method:this.e.serverMethod||"GET",signal:this.h.signal});n.method==="POST"?n.body=s:l+=`?${s.toString()}`,this.l.classList.add(H),fetch(l,n).then(r=>this.e.onServerResponse(r,this)).then(r=>{let o=Y(this.e.serverDataKey,r)||r;this.setData(o,!t),this.h=null,t&&this.v()}).catch(r=>{this.e.onServerError(r,this.h.signal,this)}).finally(r=>{this.l.classList.remove(H)})}m(t,e=null,i={}){if(!i.value&&e&&(i.value=e),!this.canAdd(t,i))return null;let s=this.addItem(t,e,i);return this.S(),this.e.keepOpen?this.v():this.resetSearchInput(),s}f(t){if(t.style.display==="none")return!1;let e=t.firstElementChild;return e.tagName==="A"&&!e.classList.contains("disabled")}g(t=I,e=null){let i=this.getSelection(),s=e;if(i){let l=t===I?"nextSibling":"previousSibling";s=i.parentNode;do s=s[l];while(s&&!this.f(s));s?i.classList.remove(...this.u()):i&&(s=i.parentElement)}else{if(t===D)return s;if(!s)for(s=this.n.firstChild;s&&!this.f(s);)s=s.nextSibling}if(s){let l=s.offsetHeight,n=s.offsetTop,r=s.parentNode,o=r.offsetHeight,h=r.scrollHeight,c=r.offsetTop;if(l===0&&setTimeout(()=>{r.scrollTop=0}),t===D){let d=n-c>10?n-c:0;r.scrollTop=d}else n+l-(o+r.scrollTop)>0&&l>0&&(r.scrollTop=n+l-o+1,r.scrollTop+o>=h-10&&(r.scrollTop=n-c));let f=s.querySelector("a");f.classList.add(...this.u()),this.s.setAttribute("aria-activedescendant",f.id),this.e.updateOnSelect&&(this.s.value=f.dataset.label,this.r())}else this.s.setAttribute("aria-activedescendant","");return s}r(){this.l.classList.remove(q),this.s.value?this.s.size=this.s.value.length:this.getSelectedValues().length?(this.s.placeholder="",this.s.size=1):(this.s.size=this.e.placeholder.length>0?this.e.placeholder.length:1,this.s.placeholder=this.e.placeholder,this.l.classList.add(q));let t=this.s.value||this.s.placeholder;if(t.length>0){let e=j(t,this.l)+20;this.s.style.width=`${e}px`}}W(t){for(;this.n.lastChild;)this.n.removeChild(this.n.lastChild);let e=0,i=1;for(let s=0;s<t.length;s++){let l=t[s];if(l){if(l.group&&l.items){let n=p("li");n.setAttribute("role","presentation"),n.dataset.id=""+i;let r=p("span");if(n.append(r),r.classList.add("dropdown-header","text-truncate"),r.innerHTML=this.e.sanitizer(l.group),this.n.appendChild(n),l.items)for(let o=0;o<l.items.length;o++){let h=l.items[o];h.group_id=i,this.E(l.items[o],e),e++}i++}this.E(l,e),e++}}if(this.e.notFoundMessage){let s=p("li");s.setAttribute("role","presentation"),s.classList.add(`${g}not-found`),s.innerHTML='<span class="dropdown-item"></span>',this.n.appendChild(s)}}E(t,e){if(!t[this.e.valueField])return;let i=t[this.e.valueField],s=t[this.e.labelField],l=this.e.onRenderItem(t,s,this),n=p("li");n.setAttribute("role","menuitem"),t.group_id&&n.setAttribute("data-group-id",`${t.group_id}`),t.title&&(n.setAttribute("title",t.title),n.setAttribute("data-bs-placement","left"));let r=p("a");n.append(r),r.id=`${this.n.id}-${e}`,r.classList.add("dropdown-item","text-truncate"),t.disabled&&r.classList.add("disabled"),r.setAttribute(v,i),r.dataset.label=s;let o={};this.e.searchFields.forEach(c=>{o[c]=t[c]}),r.dataset.searchData=JSON.stringify(o),r.setAttribute("href","#"),r.innerHTML=l,this.n.appendChild(n);let h=this.O()===5;t.title&&L&&h&&L.getOrCreateInstance(n),r.addEventListener("mouseenter",c=>{this.d||(this.removeSelection(),n.querySelector("a").classList.add(...this.u()))}),r.addEventListener("mousedown",c=>{c.preventDefault()}),r.addEventListener("click",c=>{c.preventDefault(),c.stopPropagation(),this.e.confirmAdd(i,this).then(()=>{this.m(s,i,t.data),this.e.onSelectItem(t,this)}).catch(()=>{})})}initialOptions(){return this.i.querySelectorAll("option[data-init]")}F(){this.i.querySelectorAll("option").forEach(t=>{y(t,"selected")})}reset(){this.removeAll(),this.a=!1;let t=this.initialOptions();this.F();for(let e=0;e<t.length;e++){let i=t[e],s=Object.assign({},{disabled:i.hasAttribute("disabled")},i.dataset);this.addItem(i.textContent,i.value,s)}this.S(),this.a=!0}resetSearchInput(t=!1){if(this.s.value="",t||this.r(),this.D(),this.isSingle()&&!t){document.activeElement.blur(),this.hideSuggestions();return}t||(this.T()||this.hideSuggestions(),this.s===document.activeElement&&this.s.dispatchEvent(new Event("input")))}D(){this.isMaxReached()?(this.l.classList.add(R),this.s.style.visibility="hidden"):this.s.style.visibility=="hidden"&&(this.s.style.visibility="visible")}getSelectedValues(){let t=this.i.querySelectorAll("option[selected]");return Array.from(t).map(e=>e.value)}getAvailableValues(){let t=this.i.querySelectorAll("option");return Array.from(t).map(e=>e.value)}showOrSearch(t=!0){if(t&&!this.T()){this.hideSuggestions(!1);return}this.e.liveServer?this.$():this.v()}hideSuggestions(t=!0){this.n.classList.remove(A),x(this.s,{"aria-expanded":"false"}),this.removeSelection(),t&&this.l.classList.remove(b)}toggleSuggestions(t=!0,e=!0){this.n.classList.contains(A)?this.hideSuggestions(e):this.showOrSearch(t)}T(){return this.isDisabled()||this.isMaxReached()?!1:this.s.value.length>=this.e.suggestionsThreshold}v(){if(this.s.style.visibility=="hidden")return;let t=k(this.s.value),e={},i=this.n.querySelectorAll("li"),s=0,l=null,n=!1,r={};for(let o=0;o<i.length;o++){let h=i[o],c=h.firstElementChild;if(c instanceof HTMLSpanElement){h.dataset.id&&(r[h.dataset.id]=!1),O(h);continue}if(c.classList.remove(...this.u()),!this.e.allowSame){let u=c.getAttribute(v);if(e[u]=e[u]||0,this.c(c.getAttribute(v),"[selected]",e[u]++)){O(h);continue}}let f=this.e.showAllSuggestions||t.length===0,d=t.length==0&&this.e.suggestionsThreshold===0;if(!f&&t.length>0){let u=JSON.parse(c.dataset.searchData);this.e.searchFields.forEach(m=>{let C=k(u[m]),F=!1;if(this.e.fuzzy)F=G(C,t);else{let M=C.indexOf(t);F=this.e.startsWith?M===0:M>=0}F&&(d=!0)})}let w=d||t.length===0;if(f||d?(s++,B(h),h.dataset.groupId&&(r[h.dataset.groupId]=!0),!l&&this.f(h)&&w&&(l=h),this.e.maximumItems>0&&s>this.e.maximumItems&&O(h)):O(h),this.e.highlightTyped){let u=c.textContent,m=k(u).indexOf(t),C=u.substring(0,m)+`<mark class="${this.e.highlightClass}">${u.substring(m,m+t.length)}</mark>`+u.substring(m+t.length,u.length);c.innerHTML=C}this.f(h)&&(n=!0)}if(!this.e.allowNew&&!(t.length===0&&!n)&&this.l.classList.add(b),this.e.allowNew&&this.e.regex&&this.isInvalid()&&this.l.classList.remove(b),Array.from(i).filter(o=>o.dataset.id).forEach(o=>{r[o.dataset.id]===!0&&B(o)}),n&&(this.l.classList.remove(b),l&&this.e.autoselectFirst&&(this.removeSelection(),this.g(I,l))),s===0)if(this.e.notFoundMessage){let o=this.n.querySelector(`.${g}not-found`);o.style.display="block";let h=this.e.notFoundMessage.replace("{{tag}}",this.s.value);o.innerHTML=`<span class="dropdown-item">${h}</span>`,this.k()}else this.hideSuggestions(!1);else this.k()}k(){let t=this.n.classList.contains(A);t||(this.n.classList.add(A),x(this.s,{"aria-expanded":"true"})),this.b(t)}b(t=!1){let e=this.V,i=this.e.fixed,s=this.e.fullWidth,l=this.s.getBoundingClientRect(),n=this.l.getBoundingClientRect(),r=0,o=0;if(i?s?(r=n.x,o=n.y+n.height+2):(r=l.x,o=l.y+l.height):s?(r=0,o=n.height+2):(r=this.s.offsetLeft,o=this.s.offsetHeight+this.s.offsetTop),e&&!s&&(r-=this.n.offsetWidth-l.width),!s){let f=Math.min(window.innerWidth,document.body.offsetWidth),d=e?l.x+l.width-this.n.offsetWidth-1:f-1-(l.x+this.n.offsetWidth);d<0&&(r=e?r-d:r+d)}s&&(this.n.style.width=`${this.l.offsetWidth}px`),t||(this.n.style.transform="unset"),Object.assign(this.n.style,{left:`${r}px`,top:`${o}px`});let h=this.n.getBoundingClientRect(),c=window.innerHeight;if(h.y+h.height>c||this.n.style.transform.includes("translateY")){let f=s?n.height+4:l.height;this.n.style.transform=`translateY(calc(-100.1% - ${f}px))`}}O(){let t=5,e=window.jQuery;return e&&e.fn.tooltip&&e.fn.tooltip.Constructor&&(t=parseInt(e.fn.tooltip.Constructor.VERSION.charAt(0))),t}_(t){return!!Array.from(this.i.querySelectorAll("option")).find(s=>s.textContent==t&&s.getAttribute("selected"))}J(t,e){let i=Array.from(this.i.querySelectorAll("option")),s=e.value?i.filter(l=>l.value==e.value):i.filter(l=>l.textContent==t);return!(s.length>0&&!s.find(n=>!n.getAttribute("selected")))}hasItem(t){for(let e of this.e.items){let i=e.items||[e];for(let s of i)if(s[this.e.labelField]==t)return!0}return!1}getItem(t){for(let e of this.e.items){let i=e.items||[e];for(let s of i)if(s[this.e.valueField]==t)return s}return null}U(t){return new RegExp(this.e.regex.trim()).test(t)}getSelection(){return this.n.querySelector(`a.${N}`)}removeSelection(){let t=this.getSelection();t&&t.classList.remove(...this.u())}u(){return[...this.e.activeClasses,N]}getActiveSelection(){return this.getSelection()}removeActiveSelection(){return this.removeSelection()}removeAll(){this.getSelectedValues().forEach(e=>{let i=this.removeItem(e,!0)}),this.r()}removeLastItem(t=!1){let e=this.getLastItem();e&&this.removeItem(e,t)}getLastItem(){let t=this.o.querySelectorAll(`span.${g}badge`);return t.length?t[t.length-1].getAttribute(v):void 0}disable(){this.i.setAttribute("disabled",""),this.resetState()}enable(){y(this.i,"disabled"),this.resetState()}isDisabled(){return this.i.hasAttribute("disabled")||this.i.disabled||this.i.hasAttribute("readonly")}isDropdownVisible(){return this.n.classList.contains(A)}isInvalid(){return this.l.classList.contains(b)}isSingle(){return!this.i.hasAttribute("multiple")}isMaxReached(){return this.e.max&&this.getSelectedValues().length>=this.e.max}canAdd(t,e={}){let i=this.cannotAddReason(t,e);return i==="ok"?!0:(i.includes("invalid-")&&this.l.classList.add(b),!1)}cannotAddReason(t,e={}){if(!t)return"no-text";if(e.new&&!this.e.allowNew)return"not-allow-new";if(!e.new&&!this.e.liveServer&&!this.hasItem(t))return"no-item";if(this.isDisabled())return"is-disabled";if(!this.isSingle()&&!this.e.allowSame){if(e.new){if(this._(t))return"already-selected"}else if(!this.J(t,e))return"not-selectable"}return this.isMaxReached()?"max-reached":this.e.regex&&e.new&&!this.U(t)?"invalid-regex":this.e.onCanAdd&&this.e.onCanAdd(t,e,this)===!1?"invalid-can-add":"ok"}getData(){return this.e.items}setData(t,e=!1){this.a=!1,Array.isArray(t)||(t=Object.entries(t).map(([i,s])=>({value:i,label:s}))),this.e.items!=t&&(this.e.items=t),e&&(this.F(),t.reduce((s,l)=>s.concat(l.group?l.items:[l]),[]).forEach(s=>{let l=s[this.e.valueField],n=s[this.e.labelField];if(l&&(s.selected||this.e.selected.includes(l))){let r=this.addItem(n,l,s.data);r&&r.setAttribute("data-init","true")}})),this.W(t),this.S(),this.a=!0,this.e.onDataLoaded(t,this),this.i.dispatchEvent(new CustomEvent("tags.loaded",{bubbles:!0,detail:t}))}c(t=null,e="",i=0){let l=`option${t===null?"":`[value="${CSS.escape(t)}"]`}${e}`;return this.i.querySelectorAll(l)[i]||null}setItem(t,e={}){let i=null;if(!this.e.allowSame&&this.c(t,"[selected]"))return;let s=this.c(t,":not([selected])");if(s)i=this.addItem(s.textContent,s.value,e);else{let l=this.getItem(t);if(l){let n=l[this.e.valueField],r=l[this.e.labelField];i=this.addItem(r,n,e)}}return this.r(),this.D(),i}addItem(t,e=null,i={}){e||(e=t),this.isSingle()&&this.getSelectedValues().length&&this.removeLastItem(!0);let s=this.c(e,":not([selected])");if(!s){s=p("option"),s.value=e,s.innerText=t;for(let[l,n]of Object.entries(i))s.dataset[l]=n;this.i.appendChild(s),this.e.onCreateItem(s,this)}return s&&(i=Object.assign({title:s.getAttribute("title")},s.dataset,i)),s.setAttribute("selected","selected"),s.selected=!0,this.G(t,e,i),this.a&&this.i.dispatchEvent(new Event("change",{bubbles:!0})),s}S(){let t=this.i.innerHTML;this.i.innerHTML="",this.i.innerHTML=t,this.r()}G(t,e=null,i={}){let s=this.O()===5,l=i.disabled&&V(i.disabled),n=this.e.allowClear&&!l;this.e.displayValueInBadge&&(i.title||(i.title=t),t=e);let r=this.e.allowHtml?t:this.e.sanitizer(t),o=p("span"),h=[`${g}badge`],c=this.isSingle()&&!this.e.singleBadge;if(!c){h.push("badge");let d=this.e.badgeStyle;i.badgeStyle&&(d=i.badgeStyle),i.badgeClass&&h.push(...i.badgeClass.split(" ")),this.e.baseClass?h.push(...this.e.baseClass.split(" ")):s?h=[...h,`bg-${d}`,"text-truncate"]:h=[...h,`badge-${d}`],o.style.maxWidth="100%"}l&&h.push("disabled","opacity-50");let f=c?0:2;if(o.style.margin=`${f}px 6px ${f}px 0px`,o.style.marginBlock=`${f}px`,o.style.marginInline="0px 6px",o.style.display="flex",o.style.alignItems="center",i.backgroundColor&&o.style.setProperty("background-color",i.backgroundColor,"important"),i.color&&o.style.setProperty("color",i.color,"important"),o.classList.add(...h),o.setAttribute(v,e),i.title&&o.setAttribute("title",i.title),n){let d=h.includes("text-dark")||i.color&&!J(i.color)||c?"btn-close":"btn-close btn-close-white",w="margin-inline: 0px 6px;",u="left";this.e.clearEnd&&(u="right"),u=="right"&&(w="margin-inline: 6px 0px;");let m=s?'<button type="button" style="font-size:0.65em;'+w+'" class="'+d+'" aria-label="'+this.e.clearLabel+'"></button>':'<button type="button" style="font-size:1em;'+w+'text-shadow:none;color:currentColor;transform:scale(1.2);float:none" class="close" aria-label="'+this.e.clearLabel+'"><span aria-hidden="true">×</span></button>';r=u=="left"?m+r:r+m}o.innerHTML=r,this.o.insertBefore(o,this.s),i.title&&L&&s&&L.getOrCreateInstance(o),n&&o.querySelector("button").addEventListener("click",d=>{d.preventDefault(),d.stopPropagation(),this.isDisabled()||this.e.confirmClear(e,this).then(()=>{this.removeItem(e),document.activeElement.blur(),this.r()}).catch(()=>{})})}getHolder(){return this.l}clear(){this.hideSuggestions(),this.reset()}updateData(t){this.setData(t,!1),this.reset()}removeItem(t,e=!1){let i=CSS.escape(t),s=this.o.querySelectorAll("span["+v+'="'+i+'"]');if(!s.length)return!1;let l=s.length-1,n=s[l];n&&(n.dataset.bsOriginalTitle&&L.getOrCreateInstance(n).dispose(),n.remove());let r=this.c(t,"[selected]",l);return r&&(y(r,"selected"),r.selected=!1,this.a&&!e&&this.i.dispatchEvent(new Event("change",{bubbles:!0}))),this.s.style.visibility=="hidden"&&!this.isMaxReached()&&(this.s.style.visibility="visible",this.l.classList.remove(R)),e||this.e.onClearItem(t,this),!0}},K=S;export{K as default};
/**
* Bootstrap 5 (and 4!) tags
* https://github.com/lekoala/bootstrap5-tags
* @license MIT
*/
//# sourceMappingURL=tags.min.js.map