1/** 2 * fuegt eine ausgewaehltes Element aus einem Dropdown der Tabelle hinzu. Danach 3 * im Dropdown verborgen, um Duplikate zu vermeiden. Das Dropdown Feld wird 4 * wieder zum Standard geaendert. Zu der Auswahl wird Richtwert und ein 5 * Loesch-Feld mitgegeben. Nach Erfolg wird eine Nachricht temporaer angezeigt. 6 * @see hws_deleteElement 7 * 8 * @param selectId Select des ausgewaehlten Elements 9 */ 10 11window.hws_addElement = function (select) { 12 const selectedOption = select.options[select.selectedIndex]; 13 14 const elementKey = selectedOption.getAttribute('data-key'); 15 const elementName = selectedOption.getAttribute('data-name'); 16 const elementSize = selectedOption.getAttribute('data-size'); 17 18 $.ajax({ 19 url: '/hws_bulk_waste_add_element', 20 type: 'POST', 21 dataType: 'json', 22 data: { 23 elementKey: elementKey, 24 elementName: elementName, 25 elementSize: elementSize, 26 }, 27 async: true, 28 success: function (data) { 29 document.getElementById('element-rows').insertAdjacentHTML("beforeend", data); 30 selectedOption.disabled = true; 31 32 hws_updateBulkWasteCounter('add', elementSize); 33 }, 34 }); 35} 36 37/** 38 * Loescht ein Element aus der Tabelle. Dabei wird die komplette Zeile entfernt. 39 * Weiterhin wird der entfernte Gegenstand im Dropdown wieder eingeblendet. Nach 40 * Erfolg wird eine Nachricht temporaer angezeigt. 41 * 42 * @param button Loesch-Button in der Tabellenzeile 43 * @param key Index der Option, die hinzugefuegt wird 44 */ 45window.hws_deleteElement = function (button, key) { 46 hws_updateBulkWasteCounter('substract', document.getElementById('vals-' + key).getAttribute('data-total-amount')); 47 48 document.getElementById(key + '-input-row').remove(); 49 document.getElementById(`${key}-option`).disabled = false; 50} 51 52/** 53 * Aktualisierung des ausgewählten Gegenstandes und der Gesamtmänge im Sperrmüllformular 54 * 55 * @param element 56 * @param singleItemValue 57 */ 58window.hws_updateBulkWasteElement = function (element, singleItemValue){ 59 let oldAmount = element.getAttribute('data-total-amount'); 60 let newAmount = Number(Number(element.value) * Number(singleItemValue)).toFixed(1); 61 62 element.setAttribute('data-total-amount', newAmount); 63 hws_updateBulkWasteCounter('substract', oldAmount); 64 hws_updateBulkWasteCounter('add', newAmount); 65} 66 67/** 68 * Aktualisiert die Gesamtmemge im Sperrmüllforlular 69 * 70 * @param method add oder substract zum Addieren oder Subtrahieren des übergebenen Wertes 71 * @param amount wert um den die Anzeige angehoben oder abgesenkt werden soll 72 */ 73window.hws_updateBulkWasteCounter = function (method, amount){ 74 let totalAmountCounter = document.getElementById('total-amount-counter') 75 let totalAmount = totalAmountCounter.getAttribute('data-value'); 76 77 switch (method){ 78 case 'add': 79 totalAmount = Number(totalAmount) + Number(amount); 80 break; 81 case 'substract': 82 totalAmount = Number(totalAmount) - Number(amount); 83 break; 84 default: 85 break; 86 } 87 88 totalAmount = Number(totalAmount).toFixed(1); 89 90 totalAmountCounter.setAttribute('data-value', totalAmount); 91 totalAmountCounter.innerText = Number(totalAmount).toLocaleString(); 92} 93/** 94 * Löscht die Hausnummern bei einer Ãnderung der StraÃe 95 * 96 * @param {string} streetInputId - ID des Eingabefeldes der StraÃe 97 * @param {string} houseNumberInputId - ID des Eingabefeldes der Hausnummer 98 * @param {string} datalistId - ID der Datalist 99 */ 100window.clearHouseNumberOnStreetChange = function(streetInputId, houseNumberInputId, datalistId) { 101 document.getElementById(streetInputId)?.addEventListener("input", function() { 102 let houseNumberField = document.getElementById(houseNumberInputId); 103 let houseNumberDatalist = document.getElementById(datalistId); 104 105 if (houseNumberField) { 106 houseNumberField.value = ''; 107 houseNumberField.classList.remove("is-valid", "is-invalid"); 108 } 109 110 if (houseNumberDatalist) {
111 houseNumberDatalist.innerHTML = ''; 112 } 113 }); 114}; 115 116/** 117 * Leert das Hausnummer-Feld bei einer Ãnderung der StraÃe (Alternative manuelle Methode) 118 */ 119window.clearHouseNumberOnStreetChangeManual = function(houseNumberId, datalistID) { 120 const houseNumberField = document.getElementById(houseNumberId); 121 const datalist = document.getElementById(datalistID); 122 123 if (houseNumberField) { 124 houseNumberField.value = ''; 125 houseNumberField.classList.remove("is-valid", "is-invalid"); 126 } 127 128 if (datalist) { 129 datalist.innerHTML = ''; 130 } 131}; 132 133/** 134 * Füllt das angegebene Feld mit den Hausnummern Vorschlägen zur StraÃe 135 * aus dem Entsorgungskalender 136 * 137 * Verwendet in Waschmobil und Entsorgungskalender 138 * 139 * @param {HTMLInputElement} houseNumberField 140 * @param {HTMLInputElement} streetField 141 * @param {HTMLDataListElement} outputDatalist 142 */ 143window.entsorgungskalenderAutocompleteHouseNumberToStreet = function (houseNumberField, streetField, outputDatalist) { 144 if (streetField.value.length > 0 && !valueInDatalist(houseNumberField.value, outputDatalist)) { 145 $.ajax({ 146 url: '/hws_entsorgungskalender_autocomplete_housenumber', 147 type: 'POST', 148 dataType: 'json', 149 data: { street: streetField.value }, 150 async: true, 151 success: function (data) { 152 outputDatalist.innerHTML = ''; 153 data.forEach(function (number) { 154 let option = document.createElement('option'); 155 option.value = number; 156 outputDatalist.appendChild(option); 157 }); 158 }, 159 error: function (xhr, status, error) { 160 console.log("Fehler bei der AJAX-Anfrage für Hausnummern: ", error); 161 } 162 }); 163 } 164}; 165 166/** 167 * Füllt das angegebene Feld mit der Liste für Privat/Gewerbe zur StraÃe mit HNr 168 * aus dem Entsorgungskalender 169 * 170 * Verwendet in Waschmobil und Entsorgungskalender 171 * 172 * @param {HTMLInputElement} houseNumberField 173 * @param {HTMLInputElement} streetField 174 * @param outputSelect 175 * @param selectedItem 176 */ 177window.entsorgungskalenderAutocompleteCustomerToStreet = function (houseNumberField, streetField, outputSelect, selectedItem = '') { 178 if (streetField.value.length > 0 && houseNumberField.value.length > 0) { 179 $.ajax({ 180 url: '/hws_entsorgungskalender_autocomplete_customer', 181 type: 'POST', 182 dataType: 'json', 183 data: { street: streetField.value, number: houseNumberField.value }, 184 async: true, 185 success: function (data) { 186 outputSelect.innerHTML = ''; 187 data.forEach(function (kunde2){ 188 let option = document.createElement('option'); 189 option.text = kunde2; 190 if (kunde2 === 'kein Gewerbe') { 191 option.value = ''; 192 } else { 193 option.value = kunde2; 194 } 195 if (kunde2 === selectedItem) { 196 option.selected = true; 197 } 198 199 outputSelect.appendChild(option); 200 }); 201 if(data.length > 0){ 202 outputSelect.removeAttribute('disabled'); 203 } else { 204 outputSelect.setAttribute('disabled', 'disabled') 205 } 206 }, 207 error: function (xhr, status, error) { 208 console.log("Fehler bei der AJAX-Anfrage für PrÃvat/Gewerbe: ", error); 209 } 210 }); 211 } 212}; 213 214/** 215 * Waschmobil 216 * Einzel-Validierung per AJAX im Erinnerung- und Terminsuche-Formular 217 * 218 * @param element HTMLInputElement 219 * @param stackElements Object 220 */ 221window.hwsWaschmobilValidate = function (element, stackElements = {}) { 222 const formType = element.form?.querySelector('input[name="formEmailMemory"]')?.value === 'send' 223 ? 'erinnerung' 224 : 'terminsuche'; 225 226 $.ajax({ 227 url: '/hws_waschmobil_validate', 228 type: 'POST', 229 dataType: 'json', 230 data: { 231 field: element.name, 232 value: element.value, 233 stack: JSON.stringify(stackElements), 234 formType: formType 235 }, 236 success: function (data) { 237 const feedbackElement = document.getElementById(element.name + 'Feedback') 238 || document.getElementById(element.name + '-feedback'); 239 240 const inputElements = document.getElementsByName(element.name); 241
242 inputElements.forEach(function (input) { 243 if (data !== '') { 244 input.classList.add('is-invalid'); 245 input.classList.remove('is-valid'); 246 } else { 247 input.classList.remove('is-invalid'); 248 input.classList.add('is-valid'); 249 } 250 }); 251 252 if (feedbackElement) { 253 feedbackElement.innerText = data; 254 if (data !== '') { 255 feedbackElement.classList.add('d-block'); 256 } else { 257 feedbackElement.classList.remove('d-block'); 258 } 259 } 260 } 261 }); 262}; 263 264window.showDisposalYearPlan = function (openyear, closeyear) { 265 if (document.getElementById('disposal-plan-'+openyear).style.display === 'block') { 266 document.getElementById('disposal-plan-'+openyear).style.display = 'none'; 267 } else { 268 document.getElementById('disposal-plan-'+openyear).style.display = 'block'; 269 } 270 document.getElementById('disposal-plan-'+closeyear).style.display = 'none'; 271 272} 273 274/** 275 * Anpassen des Charts der Besucheranzeige 276 * 277 * @param chartID 278 * @param datasetIndex 279 * @param labels 280 */ 281window.hwsBesucheranzeigeChangeChart = function (chartID = '', datasetIndex = 0, labels = []){ 282 chartHideAllDatasets(chartID); 283 chartShowDataset(chartID, datasetIndex); 284 chartSetLabels(chartID, labels); 285} 286 287/** 288 * Anpassen der Active Klasse der Buttons um den ausgewählten Tag zu highlighten 289 * und übergabe des Textes und der Frabe für die Auslastung des Wertstoffmarktes 290 * 291 * @param buttonParentID 292 * @param selectedButton 293 * @param visitorTextID 294 * @param visitorText 295 * @param visitorColor 296 */ 297window.hwsBesucheranzeigeChangeView = function (buttonParentID = '', selectedButton, visitorTextID = '', visitorText = '', visitorColor = ''){ 298 let buttonParent = document.getElementById(buttonParentID); 299 300 Array.from(buttonParent.getElementsByTagName('button')).forEach(function (element){ 301 element.classList.remove('active'); 302 }); 303 304 selectedButton.classList.add('active'); 305 306 let visitorElement = document.getElementById(visitorTextID); 307 308 visitorElement.innerText = visitorText; 309 visitorElement.className = visitorColor; 310}
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.