1var style = document.createElement('style'); 2style.setAttribute("id","multiselect_dropdown_styles"); 3style.innerHTML = ` 4.multiselect-dropdown{ 5 display: inline-block; 6 padding: 2px 5px 0px 5px; 7 border-radius: 4px; 8 border: solid 1px #ced4da; 9 background-color: white; 10 position: relative; 11 background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); 12 background-repeat: no-repeat; 13 background-position: right .75rem center; 14 background-size: 16px 12px; 15} 16.multiselect-dropdown span.optext, .multiselect-dropdown span.placeholder{ 17 margin-right:0.5em; 18 margin-bottom:2px; 19 padding:1px 0; 20 border-radius: 4px; 21 display:inline-block; 22} 23.multiselect-dropdown span.optext{ 24 background-color:lightgray; 25 padding:1px 0.75em; 26} 27.multiselect-dropdown span.optext .optdel { 28 float: right; 29 margin: 0 -6px 1px 5px; 30 font-size: 0.7em; 31 margin-top: 2px; 32 cursor: pointer; 33 color: #666; 34} 35.multiselect-dropdown span.optext .optdel:hover { color: #c66;} 36.multiselect-dropdown span.placeholder{ 37 color:#ced4da; 38} 39.multiselect-dropdown-list-wrapper{ 40 box-shadow: gray 0 3px 8px; 41 z-index: 100; 42 padding:2px; 43 border-radius: 4px; 44 border: solid 1px #ced4da; 45 display: none; 46 margin: -1px; 47 position: absolute; 48 top:0; 49 left: 0; 50 right: 0; 51 background: white; 52} 53.multiselect-dropdown-list-wrapper .multiselect-dropdown-search{ 54 margin-bottom:5px; 55} 56.multiselect-dropdown-list{ 57 padding:2px; 58 height: 15rem; 59 overflow-y:auto; 60 overflow-x: hidden; 61} 62.multiselect-dropdown-list::-webkit-scrollbar {
63 width: 6px; 64} 65.multiselect-dropdown-list::-webkit-scrollbar-thumb { 66 background-color: #bec4ca; 67 border-radius:3px; 68} 69 70.multiselect-dropdown-list div{ 71 padding: 5px; 72} 73.multiselect-dropdown-list input{ 74 height: 1.15em; 75 width: 1.15em; 76 margin-right: 0.35em; 77} 78.multiselect-dropdown-list div.checked{ 79} 80.multiselect-dropdown-list div:hover{ 81 background-color: #ced4da; 82} 83.multiselect-dropdown span.maxselected {width:100%;} 84.multiselect-dropdown-all-selector {border-bottom:solid 1px #999;} 85`; 86document.head.appendChild(style); 87 88function MultiselectDropdown(options){ 89 var config={ 90 search:true, 91 height:'15rem', 92 placeholder:'Sélectionner un mot clé', 93 txtSelected:'Mot clé sélectionné', 94 txtAll:'Tout', 95 txtRemove: 'Supprimer', 96 txtSearch:'Rechercher', 97 ...options 98 }; 99 function newEl(tag,attrs){ 100 var e=document.createElement(tag); 101 if(attrs!==undefined) Object.keys(attrs).forEach(k=>{ 102 if(k==='class') { Array.isArray(attrs[k]) ? attrs[k].forEach(o=>o!==''?e.classList.add(o):0) : (attrs[k]!==''?e.classList.add(attrs[k]):0)} 103 else if(k==='style'){ 104 Object.keys(attrs[k]).forEach(ks=>{ 105 e.style[ks]=attrs[k][ks]; 106 }); 107 } 108 else if(k==='text'){attrs[k]===''?e.innerHTML=' ':e.innerText=attrs[k]} 109 else e[k]=attrs[k]; 110 }); 111 return e; 112 } 113 114 115 document.querySelectorAll("select[multiple]").forEach((el,k)=>{ 116 117 var div=newEl('div',{class:'multiselect-dropdown',style:{width:config.style?.width??el.clientWidth+'px',padding:config.style?.padding??''}}); 118 el.style.display='none'; 119 el.parentNode.insertBefore(div,el.nextSibling); 120 var listWrap=newEl('div',{class:'multiselect-dropdown-list-wrapper'}); 121 var list=newEl('div',{class:'multiselect-dropdown-list',style:{height:config.height}}); 122 var search=newEl('input',{class:['multiselect-dropdown-search'].concat([config.searchInput?.class??'form-control']),style:{width:'100%',display:el.attributes['multiselect-search']?.value==='true'?'block':'none'},placeholder:config.txtSearch}); 123 listWrap.appendChild(search); 124 div.appendChild(listWrap); 125 listWrap.appendChild(list); 126 127 el.loadOptions=()=>{ 128 list.innerHTML=''; 129 130 if(el.attributes['multiselect-select-all']?.value=='true'){ 131 var op=newEl('div',{class:'multiselect-dropdown-all-selector'}) 132 var ic=newEl('input',{type:'checkbox'}); 133 op.appendChild(ic); 134 op.appendChild(newEl('label',{text:config.txtAll})); 135 136 op.addEventListener('click',()=>{ 137 op.classList.toggle('checked'); 138 op.querySelector("input").checked=!op.querySelector("input").checked; 139 140 var ch=op.querySelector("input").checked; 141 list.querySelectorAll(":scope > div:not(.multiselect-dropdown-all-selector)") 142 .forEach(i=>{if(i.style.display!=='none'){i.querySelector("input").checked=ch; i.optEl.selected=ch}}); 143 144 el.dispatchEvent(new Event('change')); 145 }); 146 ic.addEventListener('click',(ev)=>{ 147 ic.checked=!ic.checked; 148 }); 149 150 list.appendChild(op); 151 } 152 153 Array.from(el.options).map(o=>{ 154 var op=newEl('div',{class:o.selected?'checked':'',optEl:o}) 155 var ic=newEl('input',{type:'checkbox',checked:o.selected}); 156 op.appendChild(ic); 157 op.appendChild(newEl('label',{text:o.text})); 158 159 op.addEventListener('click',()=>{ 160 op.classList.toggle('checked'); 161 op.querySelector("input").checked=!op.querySelector("input").checked; 162 op.optEl.selected=!!!op.optEl.selected; 163 el.dispatchEvent(new Event('change')); 164 }); 165 ic.addEventListener('click',(ev)=>{ 166 ic.checked=!ic.checked; 167 }); 168 o.listitemEl=op; 169 list.appendChild(op); 170 }); 171 div.listEl=listWrap; 172 173 div.refresh=()=>{ 174 div.querySelectorAll('span.optext, span.placeholder').forEach(t=>div.removeChild(t)); 175 var sels=Array.from(el.selectedOptions); 176 if(sels.length>(el.attributes['multiselect-max-items']?.value??5)){ 177 div.appendChild(newEl('span',{class:['optext','maxselected'],text:sels.length+' '+config.txtSelected})); 178 } 179 else{ 180 sels.map(x=>{ 181 var c=newEl('span',{class:'optext',text:x.text, srcOption: x}); 182 if((el.attributes['multiselect-hide-x']?.value !== 'true')) 183 c.appendChild(newEl('span',{class:'optdel',text:'ð',title:config.txtRemove, onclick:(ev)=>{c.srcOption.listitemEl.dispatchEvent(new Event('click'));div.refresh();ev.stopPropagation();}})); 184 185 div.appendChild(c); 186 }); 187 } 188 if(0==el.selectedOptions.length) div.appendChild(newEl('span',{class:'placeholder',text:el.attributes['placeholder']?.value??config.placeholder})); 189 }; 190 div.refresh(); 191 } 192 el.loadOptions(); 193 194 search.addEventListener('input',()=>{ 195 list.querySelectorAll(":scope div:not(.multiselect-dropdown-all-selector)").forEach(d=>{ 196 var txt=d.querySelector("label").innerText.toUpperCase(); 197 d.style.display=txt.includes(search.value.toUpperCase())?'block':'none'; 198 }); 199 }); 200 201 div.addEventListener('click',()=>{ 202 div.listEl.style.display='block'; 203 search.focus(); 204 search.select(); 205 }); 206 207 document.addEventListener('click', function(event) { 208 if (!div.contains(event.target)) { 209 listWrap.style.display='none'; 210 div.refresh(); 211 } 212 }); 213 }); 214} 215 216window.addEventListener('load',()=>{ 217 MultiselectDropdown(window.MultiselectDropdownOptions); 218});
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.