svgLogo = ''; const svgMenu = ''; const svgLock = ''; const svgUnlock = ''; const svgScan = ''; const svgConnect = ''; const svgSave = ''; const svgRestart = ''; const svgEye = ''; const svgNoEye = ''; const svgCloseModal = ''; var options = {}; // Simple JQuery-like selector var $ = function (el) { return document.getElementById(el); }; function showHidePassword() { var inp = $("password"); openModalMessage('Restart!', '
ESP restarted. Please wait a little and then reload this page.
'); if (inp.type === "password") { inp.type = "text"; $('show-pass').classList.remove("w--current"); $('hide-pass').classList.add("w--current"); } else { inp.type = "password"; $('show-pass').classList.add("w--current"); $('hide-pass').classList.remove("w--current"); } } /** * Read some data from database */ function getWiFiList() { $('loader').classList.remove('hide'); var url = new URL("http://" + `${window.location.hostname}` + "/scan"); fetch(url) .then(response => response.json()) .then(data => { listWifiNetworks(data); $('loader').classList.add('hide'); }); } function selectWifi(row) { try { $('select-' + row.target.parentNode.id).checked = true; } catch (err) { $(row.target.id).checked = true; } $('ssid').value = this.cells[1].innerHTML; $('ssid-name').innerHTML = this.cells[1].innerHTML; $('password').focus(); } function listWifiNetworks(elems) { const list = document.querySelector('#wifi-list'); list.innerHTML = ""; elems.forEach((elem, idx) => { // Create a single row with all columns var row = document.createElement('tr'); var id = 'wifi-' + idx; row.id = id; row.addEventListener('click', selectWifi); row.innerHTML = ``; row.innerHTML += `${elem.ssid}`; row.innerHTML += '' + elem.strength + ' dBm'; if (elem.security) row.innerHTML += '' + svgLock + ''; else row.innerHTML += '' + svgUnlock + ''; // Add row to list list.appendChild(row); }); $("wifi-table").classList.remove("hide"); } function getParameters() { $('loader').classList.remove('hide'); var url = new URL("http://" + `${window.location.hostname}` + "/config.json"); fetch(url) .then(response => response.json()) .then(data => { Object.keys(data).forEach(function (key) { if (key.startsWith('logo-name')) { $('name-logo').innerHTML = data[key]; delete data[key]; } if (key.startsWith('logo-svg')) { $('svg-logo').innerHTML = data[key]; delete data[key]; } $('loader').classList.add('hide'); }); options = data; listParameters(options); // Read logo from file if present, otherwise use inline svg; if (options['logo-file-hidden']) { svgLogo = ''; $('svg-logo').innerHTML = ''; $('svg-logo').setAttribute('title', ''); $('logo-file').setAttribute('type', 'number'); } }); } function createNewBox(cont, lbl) { var el = document.createElement('div'); el.setAttribute('id', 'option-box' + cont); el.classList.add('ctn', 'opt-box', 'hide'); var h = document.createElement('h2'); h.classList.add('heading-2'); h.innerHTML = lbl; el.appendChild(h); var form = document.createElement('form'); form.classList.add('form'); el.appendChild(form); $('main-box').appendChild(el); // Add new voice in menu and relatvie listener var lnk = document.createElement('a'); lnk.setAttribute('id', 'set-opt' + cont); lnk.setAttribute('data-box', 'option-box' + cont); lnk.classList.add('a-link'); lnk.innerHTML = lbl; lnk.addEventListener('click', switchPage); $('nav-link').appendChild(lnk); return form; } function listParameters(params) { var el, pBox; if (!Object.keys(params)[0].startsWith('param-box')) { params = { 'param-box1': 'Options', ...params }; options = params; } Object.entries(params).forEach(([key, value], i) => { if (key.startsWith('name-logo')) { $('name-logo').innerHTML = value; return; } else if (key.startsWith('logo-file')) { return; } else if (key.startsWith('param-box')) { pBox = createNewBox(i, value); return; } else if (key.startsWith('raw-css')) { var css = document.createElement("style"); css.innerHTML = value.trim(); document.body.appendChild(css); return; } else if (key.startsWith('raw-javascript')) { var js = document.createElement("script"); js.innerHTML = value.trim(); document.body.appendChild(js); return; } else if (key.startsWith('raw-html')) { html = value.trim(); el = document.createElement('div'); el.setAttribute('id', 'row' + i) el.style.width = '100%'; el.innerHTML = html; pBox.appendChild(el); } else { let val = value; let lbl = document.createElement('label'); el = document.createElement('input'); el.setAttribute('id', key); el.setAttribute('type', 'text'); // Set input property (id, type and value). Check first if is boolean if (typeof (val) === "boolean") { el.setAttribute('type', 'checkbox'); el.classList.add('t-check', 'opt-input'); el.checked = val; lbl.classList.add('input-label', 'toggle'); let dv = document.createElement('div'); dv.classList.add('toggle-switch'); let sp = document.createElement('span'); sp.classList.add('toggle-label'); sp.textContent = key; lbl.appendChild(el); lbl.appendChild(dv); lbl.appendChild(sp); pBox.appendChild(lbl); addInputListener(el); } else { el.value = val; el.classList.add('opt-input'); lbl.setAttribute('label-for', key); lbl.classList.add('input-label'); lbl.textContent = key; if (typeof (val) === "number") el.setAttribute('type', 'number'); if (typeof (val) === "object") { // This is a select/option if (val.values) { el = document.createElement('select'); el.setAttribute('id', key); val.values.forEach((a) => { var opt = document.createElement('option'); opt.textContent = a; opt.value = a; el.appendChild(opt); }) el.value = val.selected; pBox.appendChild(el); } // This is a float value else { var num = Math.round(val.value * (1 / val.step)) / (1 / val.step); el.setAttribute('type', 'number'); el.setAttribute('step', val.step); el.setAttribute('min', val.min); el.setAttribute('max', val.max); el.value = Number(num).toFixed(3); } } addInputListener(el); var d = document.createElement('div'); d.classList.add('tf-wrapper'); d.appendChild(lbl); d.appendChild(el); pBox.appendChild(d); } } if (key.endsWith('-hidden')) { el.classList.add('hide'); } }); } function addInputListener(item) { // Add event listener to option inputs if (item.type === "number") { item.addEventListener('change', () => { if (item.getAttribute("step")) { var obj = {}; obj.value = Math.round(item.value * (1 / item.step)) / (1 / item.step); obj.step = item.getAttribute("step"); obj.min = item.getAttribute("min"); obj.max = item.getAttribute("max"); options[item.id] = obj; } else options[item.id] = parseInt(item.value); }); return; } if (item.type === "text") { item.addEventListener('change', () => { options[item.id] = item.value; }); return; } if (item.type === "checkbox") { item.addEventListener('change', () => { options[item.id] = item.checked; }); return; } if (item.type === 'select-one') { item.addEventListener('change', (e) => { options[e.target.id].selected = e.target.value; }); return; } } function saveParameters() { var myblob = new Blob([JSON.stringify(options, null, 2)], { type: 'application/json' }); var formData = new FormData(); formData.append("data", myblob, '/config.json'); // POST data using the Fetch API fetch('/edit', { method: 'POST', body: formData }) // Handle the server response .then(response => response.text()) .then(text => { openModalMessage('Save options', 'Settings saved successfully on flash memory!

'); }); fetch('/save') .then(response => response.text()) .then(text => { }) .catch(error => { }); } function doConnection() { var formdata = new FormData(); formdata.append("ssid", $('ssid').value); formdata.append("password", $('password').value); formdata.append("persistent", $('persistent').checked); var requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; $('loader').classList.remove('hide'); fetch('/connect', requestOptions) .then(function (response) { httpCode = response.status; return response.text(); }) .then(function (text) { if (httpCode === 200) { openModalMessage('Connected', 'AWTRTIX will restart now
Your new IP is ' + text); } else { openModalMessage('Error!', '
Error on connection: ' + text + '

'); } $('loader').classList.add('hide'); }); } function switchPage(el) { $('top-nav').classList.remove('responsive'); // Menu items document.querySelectorAll("a").forEach(item => { item.classList.remove('active'); }); el.target.classList.add('active'); // Box items document.querySelectorAll(".opt-box").forEach(e => { e.classList.add('hide'); }); $(el.target.getAttribute("data-box")).classList.remove('hide'); if (el.target.id != 'set-wifi') { var fragment = document.createDocumentFragment(); fragment.appendChild($('btn-box')); $(el.target.getAttribute("data-box")).appendChild(fragment); $('btn-box').classList.remove('hide'); } else $('btn-box').classList.add('hide'); } function showMenu() { $('top-nav').classList.add('responsive'); } var closeCallback = function () { ; }; function openModalMessage(title, msg, fn) { $('message-title').innerHTML = title; $('message-body').innerHTML = msg; $('modal-message').open = true; $('main-box').style.filter = "blur(3px)"; if (typeof fn != 'undefined') { closeCallback = fn; $('ok-modal').classList.remove('hide'); } else $('ok-modal').classList.add('hide'); } function closeModalMessage(do_cb) { $('modal-message').open = false; $('main-box').style.filter = ""; if (typeof closeCallback != 'undefined' && do_cb) closeCallback(); } function restartESP() { var url = new URL("http://" + `${window.location.hostname}` + "/restart"); fetch(url) .then(response => response.text()) .then(data => { closeModalMessage(); openModalMessage('Restart!', '
ESP restarted. Please wait a little and then reload this page.
'); }); } function uploadLogo() { var file = $('logo-file').files[0]; var reader = new FileReader(); reader.onload = async () => { const formData = new FormData(); formData.append('image', file); try { const response = await fetch('/edit', { method: 'POST', body: formData, }); options = { ...options, 'logo-file-hidden': file.name }; saveParameters(); } catch (error) { console.error(error); } }; reader.readAsDataURL(file); } // Initializes the app. $('svg-menu').innerHTML = svgMenu; $('svg-eye').innerHTML = svgEye; $('svg-no-eye').innerHTML = svgNoEye; $('svg-scan').innerHTML = svgScan; $('svg-connect').innerHTML = svgConnect; $('svg-save').innerHTML = svgSave; $('svg-restart').innerHTML = svgRestart; $('close-modal').innerHTML = svgCloseModal; $('svg-logo').innerHTML = svgLogo; $('svg-logo').setAttribute('title', 'Click to upload your logo file'); $('hum-btn').addEventListener('click', showMenu); $('scan-wifi').addEventListener('click', getWiFiList); $('connect-wifi').addEventListener('click', doConnection); $('save-params').addEventListener('click', saveParameters); $('show-hide-password').addEventListener('click', showHidePassword); $('set-wifi').addEventListener('click', switchPage); // $('set-opt1').addEventListener('click', switchPage); $('about').addEventListener('click', switchPage); $('restart').addEventListener('click', restartESP); window.addEventListener('load', getParameters); // Enable wifi-connect btn only if password inserted $('connect-wifi').disabled = true; $('password').addEventListener('input', (event) => { if ($('password').value.length === 0) $('connect-wifi').disabled = true; else $('connect-wifi').disabled = false; });