1/** 2 * @file 3 * JS file to manage modals. 4 */ 5 6(function ($, Drupal, drupalSettings, once) { 7 Drupal.behaviors.sbForms = { 8 attach: function attach(context, settings) { 9 10 // Change pattern. 11 let storagePatternPhone = localStorage.getItem('pattern-phone-default'); 12 const ESPattern = '^[6789]{1}\\d{2}(?!.*(.)\\1{4})\\d{6}$'; 13 14 if (storagePatternPhone == "undefined" || storagePatternPhone == null) { 15 let fieldPhoneNumber = context.querySelector('[name$="_phonenumber"]'); 16 let field = fieldPhoneNumber; 17 if (fieldPhoneNumber != null && fieldPhoneNumber.length > 1) { 18 field = fieldPhoneNumber.first(); 19 } 20 storagePatternPhone = field.getAttribute('pattern'); 21 localStorage.setItem('pattern-phone-default', storagePatternPhone); 22 } 23 24 // Initialize country field form as slimselect. 25 26 let residenceCountryFields = context.querySelectorAll('[name$="_residencecountry"]'); 27 28 if (residenceCountryFields.length < 1) { 29 return; 30 } 31 32 const setPhonePattern = (c, p) => p.setAttribute('pattern', c === 'ES' ? ESPattern : storagePatternPhone); 33 const noAccents = s => s.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase(); 34 35 // Búsqueda sin acentos 36 const fixSearch = () => setTimeout(() => document.querySelectorAll('.ss-search input').forEach(i => { 37 const orig = i.oninput; 38 i.oninput = function (e) { 39 if (!this.value.trim()) { 40 return orig && orig.call(this, e); 41 } 42 43 const list = this.closest('.ss-content').querySelector('.ss-list'); 44 const term = noAccents(this.value.trim()); 45 let found = false; 46 47 list.querySelectorAll('.ss-option').forEach(o => { 48 const match = noAccents(o.textContent).includes(term); 49 o.classList[match ? 'remove' : 'add']('ss-hide'); 50 if (match) { 51 found = true; 52 } 53 }); 54 55 const msg = list.querySelector('.ss-search-not-found'); 56 if (!found && !msg) { 57 list.appendChild( 58 Object.assign(document.createElement('div'), { 59 className: 'ss-search-not-found', 60 textContent: Drupal.t("Resultado no encontrado") 61 }) 62 ); 63 } else if (found && msg) { 64 msg.remove(); 65 } 66 }; 67 }), 100); 68 69 residenceCountryFields.forEach( select => { 70 71 const data_id = select.getAttribute('data-id'); 72 const id = select.getAttribute('id'); 73 const selectWrapper = select.closest('.form-type-select'); 74 const parentForm = select.closest('form'); 75 const phoneNumber = parentForm.querySelector('[name$="_phonenumber"]'); 76 77 let country = select.value; 78 79 if (!data_id || (data_id && data_id.indexOf('ss-') != 0)) { 80 new SlimSelect({ 81 select: `#${id}`, 82 settings: { 83 contentLocation: selectWrapper, 84 contentPosition: 'relative', 85 showSearch: true, 86 selectByGroup: false, 87 searchPlaceholder: ' ', 88 searchText: Drupal.t("Resultado no encontrado"), 89 searchFilter: (o, s) => noAccents(o.text).includes(noAccents(s)) 90 }, 91 events: { 92 afterChange: () => { 93 select.dispatchEvent(new Event('change', { bubbles: true })); 94 } 95 } 96 }); 97 fixSearch(); 98 } 99 100 if (!select.classList.contains('sb_form')) { 101 102 setPhonePattern(country, phoneNumber); 103 104 select.addEventListener('change', () => { 105 country = select.value; 106 setPhonePattern(country, phoneNumber); 107 }); 108 109 select.classList.add('sb_form'); 110 } 111 112 }); 113 114 }// End attach 115 }; 116 117})(jQuery, Drupal, drupalSettings, once);
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.