From 33ba6a7aa7ba051870ae1497e9dd0cd094b4af22 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Tue, 26 Sep 2023 10:27:57 +0200 Subject: [PATCH] updated web interface design --- ESP32_AP-Flasher/data/www/index.html.gz | Bin 3590 -> 4604 bytes ESP32_AP-Flasher/data/www/main.css.gz | Bin 2735 -> 3191 bytes ESP32_AP-Flasher/data/www/main.js.gz | Bin 9523 -> 10774 bytes ESP32_AP-Flasher/wwwroot/index.html | 662 +++++++++++++++--------- ESP32_AP-Flasher/wwwroot/main.css | 484 ++++++++++++----- ESP32_AP-Flasher/wwwroot/main.js | 232 +++++++-- 6 files changed, 966 insertions(+), 412 deletions(-) diff --git a/ESP32_AP-Flasher/data/www/index.html.gz b/ESP32_AP-Flasher/data/www/index.html.gz index fe1abbdb5a5d229f5f59ebd25bb59fc53bfe68b8..be72d2d9a6444ed3e08a8a9d1fcf85c20f807743 100644 GIT binary patch literal 4604 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 literal 3590 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 M2W%QBIc+ci09e-3kN^Mx diff --git a/ESP32_AP-Flasher/data/www/main.css.gz b/ESP32_AP-Flasher/data/www/main.css.gz index b6c94419a8c307053f50a377986bd854c5bc1002..9f1639be04f3139e32aa4e3bc1426ec3c5726fab 100644 GIT binary patch literal 3191 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 diff --git a/ESP32_AP-Flasher/data/www/main.js.gz b/ESP32_AP-Flasher/data/www/main.js.gz index fba96a157e0e05a32233771ff5aa0c64bd93f21c..cf128d0c9482b9b2dab95696a44b177f05768a86 100644 GIT binary patch literal 10774 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 U1x?$SCplgI58BPV<29!M099)Qp#T5? literal 9523 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 EPaper Link Access Point +
+
-
-
+
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ check_circle + + initialising... +
+ sell + + tags + + 0 +
+ hourglass_empty + + pending data + + 0 +
+ battery_low + + low battery + + 0 +
+ signal_disconnected + + timeout + + 0 +
+
+ +
+
+

Currently active tags

+
+
+
+
+
group by
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
sort by
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
filter
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ↻
+
⚠ +
+
+
+
+
+ +
+
+
+
+
+
    +
+
+ +
+

Active access points

+ +
+
+

194.109.6.66

+

AP kitchen

+
+ + sell + + 13 + + cell_tower + + 25 +
+

+ fetching software version... +

+
+
+
+ +
+ Work in progress... +
+ +
+

Access Point config

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + + and + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+

Manage

+

+ Saves the tagDB and instantly reboots the Access + Point +

+

+ Download tagDB +

+

+ Manage firmware of the ESP32 +

+

+ WiFi config Opens a new window with WiFi + config options +

+

+
+ Github + OpenEPaperLink
+ OpenEPaperLink + Wiki
+

+
+ +
+ + +
+
+ +
+

+   + +

+
+ + + + +

00000000

@@ -50,183 +454,33 @@ - +

- - -
-
-

Access Point config

-

- - -

-

- - -

-

- - -

-

- - -

-

- - -

-

- - -

-

- - - and - -

-

- - -

-

- - -

-

- - -

-

- -

-

- Active access points:
- - - - - - - - -
ipaliastagschAP ver
-

-

- reboot AP - download tagDB - update - WiFi config -

-

- Github OpenEPaperLink -

-
+

Update dashboard

+
- -
download latest version
+ + +
download latest version
+
@@ -235,84 +489,8 @@ to save file system space"> style="display: none; position: absolute; background: white; border: 1px solid gray; padding: 0; list-style: none;"> -
-
- -
- -
-
-
Currently active tags:
-
-
-
loading
-
AP config
- -
-
-
-
group by
-
-
-
-
-
-
-
sort by
-
-
-
-
-
-
-
filter
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- -
- -
-
-
-
-
-
-
-
-
-
- -
-

- logging - - -

-
    -
-
-
- - -
-
- - + \ No newline at end of file diff --git a/ESP32_AP-Flasher/wwwroot/main.css b/ESP32_AP-Flasher/wwwroot/main.css index b32f2ce8..441ca4ee 100644 --- a/ESP32_AP-Flasher/wwwroot/main.css +++ b/ESP32_AP-Flasher/wwwroot/main.css @@ -1,7 +1,7 @@ * { - margin:0; - padding:0; - border:0; + margin: 0; + padding: 0; + border: 0; list-style-type: none; outline: none; font-weight: 400; @@ -12,7 +12,8 @@ -webkit-font-smoothing: antialiased; } -html, body { +html, +body { height: 100%; } @@ -24,60 +25,263 @@ body { } header { - height: 50px; background-color: #646260; + z-index: 999; + position: sticky; + top: 0px; + width: 100%; } -label { - width: 120px; - display: inline-block; - vertical-align: top; - padding: 3px 0px; -} - -.logo { - margin: 0 auto; - height: 50px; - text-indent: 50px; - overflow:hidden; - font-size: 2.5em; - color: white; -} - -.window { - margin: 0 auto; - max-width: 94%; -} - -.actionbox { - margin: 5px; -} - -.actionbox>div:first-child>div:first-child { +nav>div:first-child>div:first-child { flex-grow: 2; } -.actionbox>div { - display:flex; +nav>div { + display: flex; gap: 20px; padding: 10px; background-color: white; } -.actionbox label { +nav label { padding: 0px 5px; vertical-align: text-bottom; width: auto; cursor: pointer; } -#rebootbutton, #updatebutton, #downloadDBbutton, #apconfigbutton, .filebutton { - padding: 2px 5px; - background-color: #cccccc; +footer { + padding: 5px; + position: fixed; + bottom: 0; + width: 100%; + background-color: white; + + #sysinfo { + float: right; + } +} + +.logo { + margin: 0 auto; + height: 50px; + text-indent: 50px; + overflow: hidden; + font-size: 2.5em; + color: white; +} + +h3 { + padding-bottom: 10px; + font-size: 1.5em; +} + +/* tabs */ + +.tab-container { + display: flex; + gap: 1rem; +} + +.tablinks { + background-color: #f2f2f2; + padding: 5px 10px; + border: none; + cursor: pointer; + transition: background-color 0.3s; + transition: all 0.2s ease-in-out; + + &:hover { + background-color: #ddd; + } +} + +.tab-container .active { + background-color: #ccc; + margin-top: 10px; + margin-bottom: -10px; + padding-bottom: 0px; +} + +.tabcontent { + display: none; + border-top: 1px solid #ccc; +} + + +label { + width: 200px; + display: inline-block; + vertical-align: top; + padding: 4px 20px; +} + +.container { + padding-bottom: 20px; + ; +} + +#hometab { + font-size: 24px; + + & table { + margin: 20px; + background: #fff; + padding: 5px 20px; + border-spacing: 0px; + } + + & td { + padding: 10px 12px; + } + + & td:nth-child(3) { + text-align: right; + font-size: 32px; + } + + & tr:hover { + background-color: #ccc; + cursor: pointer; + } + + & .material-symbols-outlined { + font-size: 48px; + } +} + +.tagheader { + width: 100%; + padding: 10px 10px; + display: flex; + gap: 2em; + justify-content: space-between; + + & #toggleFilters { + padding: 0px 10px; + } + + & h3 { + padding-bottom: 0px; + } + + & #activefilter { + flex-grow: 2; + align-self: center; + } +} + +.tabheader { + background-color: white; + padding: 5px 10px; + display: flex; + gap: 2em; +} + +#filterOptions { + background-color: white; + max-height: 0; + padding: 0px 10px; + overflow: hidden; + transition: all 0.3s ease-in-out; + display: flex; + gap: 1rem; + + &.active { + padding: 10px 10px; + max-height: 100px; + margin-bottom: 10px; + } + + & label { + width: inherit; + display: inline-block; + vertical-align: top; + padding: 0px 5px; + } +} + +#aptab, +#configtab { + padding: 10px; + + & p { + padding: 3px; + } +} + +#aplist { + display: flex; + gap: 1em; + flex-flow: wrap; +} + +.apcard { + background-color: #fff; + border: 1px solid #ccc; + padding: 10px; + width: 300px; + + & .apalias { + font-size: 1.5em; + } + + & .space { + padding-left: 20px; + } + + & div { + display: flex; + font-size: 2.0em; + align-items: center; + gap: 0.2em; + } + +} + +#apcard { + display: none; +} + +#apcfgsave { + margin: 20px 205px; +} + +.filebutton { + width: inherit; + padding: 5px 10px; + margin-bottom: 0px; + margin-top: -1px; + background-color: #ccc; text-decoration: none; color: black; cursor: pointer; white-space: nowrap; + text-align: center; + + &:hover { + background-color: #aaa; + } +} + +#rebootbutton, +#updatebutton, +#downloadDBbutton, +.wifibutton { + padding: 4px 5px; + background-color: #ccc; + text-decoration: none; + color: black; + cursor: pointer; + white-space: nowrap; + width: 120px; + margin: 2px 5px 2px 20px; + display: inline-block; + text-align: center; + + &:hover { + background-color: #aaa; + } } .columns div { @@ -100,15 +304,17 @@ input { border-radius: 0px; } -input[type=button], button { +input[type=button], +button { border: 0px; padding: 4px 10px; - cursor:pointer; + cursor: pointer; + background-color: #ccc; } input[type=button]:hover, button:hover { - background-color:#aaaaaa; + background-color: #aaaaaa; } select { @@ -117,7 +323,8 @@ select { border: solid 1px #cccccc; } -#configbox, #apconfigbox, #apupdatebox { +#apconfigbox, +#apupdatebox { display: none; position: fixed; top: 65px; @@ -131,19 +338,35 @@ select { max-height: calc(100vh - 75px); } -#configbox p, #apconfigbox p, #apupdatebox p { +#configbox { + margin: auto; + min-width: 380px; + padding: 15px; + background-color: #f0e6d3; + z-index: 999; + box-shadow: 7px 10px 52px -19px rgba(0, 0, 0, 0.63); + overflow: auto; + max-height: calc(100vh - 75px); +} + +#configbox p, +#apconfigbox p, +#apupdatebox p { padding: 5px; display: flex; gap: 5px; align-items: flex-start; } -#configbox h3, #apconfigbox h3, #apupdatebox h3 { +#configbox h3, +#apconfigbox h3, +#apupdatebox h3 { font-size: 1.5em; font-weight: bold; } -#configbox input, #apconfigbox input { +#configbox input, +#apconfigbox input { border: solid 1px #cccccc; } @@ -191,31 +414,6 @@ select { background-color: #e6f0d3; } -#aptable { - width: 100%; - border-spacing: 0; -} - -#aptable th { - text-align: left; - background-color: #00000020; - padding: 0px 3px; -} - -#aptable th, #aptable td { - border-right: 1px solid #000010; - padding: 0px 3px; -} - -#aptable td:nth-child(1), #aptable th:nth-child(1) { - border-left: 1px solid #000010; -} - -#aptable td:nth-child(3), -#aptable td:nth-child(4) { - text-align: right; -} - #apupdatebox { background-color: #f0d0c8; width: 700px; @@ -228,7 +426,8 @@ select { padding: 2px 10px; } -.closebtn { +.closebtn, +.closebtn2 { border: 1px solid black; float: right; width: 19px; @@ -239,22 +438,21 @@ select { cursor: pointer; } -.logbox { - margin: 5px; -} +#logtab { + & img { + vertical-align: bottom; + cursor: pointer; + } -.logbox p { - background-color: #ffffff; - padding: 5px 10px; -} + & label { + width: inherit; + vertical-align: top; + padding: 4px 10px; + } -.logbox img { - vertical-align: bottom; - cursor:pointer; -} - -.logbox #sysinfo { - float: right; + & input { + vertical-align: text-bottom; + } } .blink-red { @@ -265,10 +463,11 @@ select { .taglist { display: flex; flex-wrap: wrap; + margin: 0px 10px 30px 10px; } #tagtemplate { - display:none; + display: none; } .tagcard { @@ -280,12 +479,12 @@ select { background-color: #ffffff; border: 1px solid #cccccc; transition: box-shadow 0.3s ease; -} -.tagcard:hover { - cursor:pointer; - box-shadow: 7px 10px 52px -19px rgba(0, 0, 0, 0.63); - filter: brightness(1.02); + &:hover { + cursor: pointer; + box-shadow: 7px 10px 52px -19px rgba(0, 0, 0, 0.63); + filter: brightness(1.02); + } } .tagflash { @@ -305,30 +504,19 @@ select { margin: 0px 5px; } -#filterOptions { - max-height: 0; - padding: 0 10px; - overflow: hidden; - transition: max-height 0.3s ease-in-out, padding 0.3s ease-in-out; -} - -#filterOptions.active { - max-height: 100px; - padding: 10px 10px; -} - .currimg { float: right; } -.currimg img, .currimg canvas { +.currimg img, +.currimg canvas { max-width: 50px; border: 1px solid #c0c0c0; } .mac { font-size: 0.9em; - cursor:pointer; + cursor: pointer; } .alias { @@ -344,6 +532,7 @@ select { font-size: .85em; padding-bottom: 5px; } + .received div { display: inline-block; } @@ -354,16 +543,19 @@ select { padding-bottom: 5px; } -.lastseen, .nextcheckin, .nextupdate { +.lastseen, +.nextcheckin, +.nextupdate { font-size: 0.9em; } .lastseen span, .nextcheckin span, .nextupdate span { - width:105px; - display:inline-block; + width: 105px; + display: inline-block; } + .corner { position: absolute; right: 0px; @@ -383,7 +575,7 @@ select { } .warningicon { - display:none; + display: none; font-size: 1.3em; background-color: yellow; color: black; @@ -412,12 +604,24 @@ ul.messages li.new { color: red; } +.mono { + font-family: monospace; + word-break: break-all; + background-color: #666; + color: #ccc; + padding: 2px; +} + +.quote { + color: white; +} + #paintbutton { padding: 1px 3px; border: 1px solid black; font-size: 1.3em; vertical-align: top; - margin-left:12px; + margin-left: 12px; cursor: pointer; } @@ -472,6 +676,7 @@ ul.messages li.new { background-color: #dddddd; width: 40px; } + #buttonbar button { font-size: 1.2em; font-weight: bold; @@ -513,7 +718,7 @@ ul.messages li.new { /* updatescreens */ -#easyupdate{ +#easyupdate { margin-top: 10px; } @@ -578,7 +783,7 @@ ul.messages li.new { .console { width: 100%; background-color: black; - font-family: 'lucida console','ui-monospace'; + font-family: 'lucida console', 'ui-monospace'; color: white; padding: 5px 10px; margin: 20px 0px; @@ -587,6 +792,7 @@ ul.messages li.new { overflow-y: scroll; white-space: break-spaces; } + .console div { word-break: break-all; } @@ -594,36 +800,62 @@ ul.messages li.new { /* media */ @media(max-width: 460px) { - .messages li div, ul.messages li div.date, ul.messages li div.message { - display:block; - position:relative; + + .messages li div, + ul.messages li div.date, + ul.messages li div.message { + display: block; + position: relative; padding: 0; left: auto; } - .messages li div.message, li.pending { + + .messages li div.message, + li.pending { margin-bottom: 8px; } + ul.messages { padding-bottom: 4px; } } @keyframes new { - 0% { background-color: rgba(255, 255, 204, 1); } - 50% { background-color: rgba(255, 255, 204, .5); } - 100% { background-color: rgba(255, 255, 204, 0); } + 0% { + background-color: rgba(255, 255, 204, 1); + } + + 50% { + background-color: rgba(255, 255, 204, .5); + } + + 100% { + background-color: rgba(255, 255, 204, 0); + } } @keyframes tagflash { - 0% { opacity: 1; } - 50% { opacity: 0; } - 100% { opacity: 1; } + 0% { + opacity: 1; + } + + 50% { + opacity: 0; + } + + 100% { + opacity: 1; + } } @keyframes pending { - 0% { } - 50% { background-color: #d4d4f5;} - 100% { } + 0% {} + + 50% { + background-color: #d4d4f5; + } + + 100% {} } @media screen and (max-width: 480px) { @@ -638,7 +870,7 @@ ul.messages li.new { min-height: 200px; } - .logbox #sysinfo { + footer #sysinfo { float: none; display: block; } @@ -682,4 +914,4 @@ ul.messages li.new { padding: 1px 1px; } -} +} \ No newline at end of file diff --git a/ESP32_AP-Flasher/wwwroot/main.js b/ESP32_AP-Flasher/wwwroot/main.js index bb36360e..a4294d93 100644 --- a/ESP32_AP-Flasher/wwwroot/main.js +++ b/ESP32_AP-Flasher/wwwroot/main.js @@ -41,7 +41,7 @@ let finishedInitialLoading = false; let getTagtypeBusy = false; const loadConfig = new Event("loadConfig"); -window.addEventListener("loadConfig", function() { +window.addEventListener("loadConfig", function () { fetch("/get_ap_config") .then(response => response.json()) .then(data => { @@ -55,6 +55,7 @@ window.addEventListener("loadConfig", function() { }); window.addEventListener("load", function () { + initTabs(); fetch('/content_cards.json') .then(response => response.json()) .then(data => { @@ -69,12 +70,36 @@ window.addEventListener("load", function () { }); window.dispatchEvent(loadConfig); - + dropUpload(); populateTimes($('#apcnight1')); populateTimes($('#apcnight2')); }); +/* tabs */ +let activeTab = ''; +function initTabs() { + const tabLinks = document.querySelectorAll(".tablinks"); + const tabContents = document.querySelectorAll(".tabcontent"); + + tabLinks.forEach(tabLink => { + tabLink.addEventListener("click", function () { + const targetId = this.getAttribute("data-target"); + const loadTabEvent = new CustomEvent('loadTab', { detail: targetId }); + document.dispatchEvent(loadTabEvent); + tabContents.forEach(tabContent => { + tabContent.style.display = "none"; + }); + tabLinks.forEach(link => { + link.classList.remove("active"); + }); + document.getElementById(targetId).style.display = "block"; + this.classList.add("active"); + }); + }); + tabLinks[0].click(); +}; + function loadTags(pos) { fetch("/get_db?pos=" + pos) .then(response => response.json()) @@ -94,7 +119,10 @@ function connect() { }); socket.addEventListener("message", (event) => { - console.log(event.data) + if ($('#showdebug').checked) { + showMessage(event.data); + console.log(event.data); + } const msg = JSON.parse(event.data); if (msg.logMsg) { showMessage(msg.logMsg, false); @@ -115,17 +143,12 @@ function connect() { $("#apstatecolor").style.color = apstate[msg.sys.apstate].color; $("#apstate").innerHTML = apstate[msg.sys.apstate].state; $("#runstate").innerHTML = runstate[msg.sys.runstate].state; - if (msg.sys.temp) $("#temp").innerHTML = msg.sys.temp.toFixed(1) + '°C'; + $('#dashboardStatus').innerHTML = apstate[msg.sys.apstate].state; } servertimediff = (Date.now() / 1000) - msg.sys.currtime; } if (msg.apitem) { - let row = $("#aptable").insertRow(); - row.insertCell(0).innerHTML = "" + msg.apitem.ip + ""; - row.insertCell(1).innerHTML = msg.apitem.alias; - row.insertCell(2).innerHTML = msg.apitem.count; - row.insertCell(3).innerHTML = msg.apitem.channel; - row.insertCell(4).innerHTML = msg.apitem.version; + populateAPCard(msg.apitem); } if (msg.console) { if (otamodule && typeof (otamodule.print) === "function") { @@ -301,9 +324,16 @@ function processTags(tagArray) { function updatecards() { if (servertimediff > 1000000000) servertimediff = 0; + let tagcount = 0; + let pendingcount = 0; + let timeoutcount = 0; + let lowbattcount = 0; + $('#taglist').querySelectorAll('[data-mac]').forEach(item => { let tagmac = item.dataset.mac; - + tagcount++; + if (tagDB[tagmac].pending) pendingcount++; + if (tagDB[tagmac].batteryMv < 2400 && tagDB[tagmac].batteryMv != 0 && tagDB[tagmac].batteryMv != 1337) lowbattcount++; if (item.dataset.lastseen && item.dataset.lastseen > (Date.now() / 1000) - servertimediff - 30 * 24 * 3600 * 60) { let idletime = (Date.now() / 1000) - servertimediff - item.dataset.lastseen; $('#tag' + tagmac + ' .lastseen').innerHTML = "last seen" + displayTime(Math.floor(idletime)) + " ago"; @@ -311,6 +341,7 @@ function updatecards() { $('#tag' + tagmac + ' .warningicon').style.display = 'inline-block'; $('#tag' + tagmac).classList.remove("tagpending") $('#tag' + tagmac).style.background = '#e0e0a0'; + timeoutcount++; } if (idletime > 24 * 3600) { $('#tag' + tagmac).style.opacity = '.5'; @@ -331,6 +362,11 @@ function updatecards() { $('#tag' + tagmac + ' .nextcheckin').innerHTML = ""; } }) + + $('#dashboardTagCount').innerHTML = tagcount; + $('#dashboardPending').innerHTML = pendingcount; + $('#dashboardLowBatt').innerHTML = lowbattcount; + $('#dashboardTimeout').innerHTML = timeoutcount; } $('#clearlog').onclick = function () { @@ -344,6 +380,13 @@ document.querySelectorAll('.closebtn').forEach(button => { }); }); +document.querySelectorAll('.closebtn2').forEach(button => { + button.addEventListener('click', (event) => { + event.target.parentNode.close(); + $('#advancedoptions').style.height = '0px'; + }); +}); + //clicking on a tag: load config dialog for tag $('#taglist').addEventListener("click", (event) => { let currentElement = event.target; @@ -382,7 +425,7 @@ function loadContentCard(mac) { $('#cfgrotate').value = tagdata.rotate; $('#cfglut').value = tagdata.lut; $('#cfgmore').innerHTML = '▼'; - $('#configbox').style.display = 'block'; + $('#configbox').showModal(); }) } @@ -444,7 +487,7 @@ $('#cfgsave').onclick = function () { .catch(error => showMessage('Error: ' + error)); $('#advancedoptions').style.height = '0px'; - $('#configbox').style.display = 'none'; + $('#configbox').close(); } function sendCmd(mac, cmd) { @@ -463,7 +506,7 @@ function sendCmd(mac, cmd) { }) .catch(error => showMessage('Error: ' + error)); $('#advancedoptions').style.height = '0px'; - $('#configbox').style.display = 'none'; + $('#configbox').close(); } $('#cfgdelete').onclick = function () { @@ -494,7 +537,8 @@ $('#cfgreset').onclick = function () { sendCmd($('#cfgmac').dataset.mac, "reset"); } -$('#rebootbutton').onclick = function () { +$('#rebootbutton').onclick = function (event) { + event.preventDefault(); showMessage("rebooting AP....", true); fetch("/reboot", { method: "POST" @@ -502,30 +546,37 @@ $('#rebootbutton').onclick = function () { socket.close(); } -$('#apconfigbutton').onclick = function () { - let table = document.getElementById("aptable"); - const rowCount = table.rows.length; - for (let i = rowCount - 1; i > 0; i--) { - table.deleteRow(i); +$('#configbox').addEventListener('click', (event) => { + if (event.target.nodeName === 'DIALOG') { + $('#configbox').close(); } - fetch("/get_ap_config") - .then(response => response.json()) - .then(data => { - apConfig = data; - $('#apcfgalias').value = data.alias; - $('#apcfgchid').value = data.channel; - $("#apcfgledbrightness").value = data.led; - $("#apcfglanguage").value = data.language; - $("#apclatency").value = data.maxsleep; - $("#apcpreventsleep").value = data.stopsleep; - $("#apcpreview").value = data.preview; - $("#apcwifipower").value = data.wifipower; - $("#apctimezone").value = data.timezone; - $("#apcnight1").value = data.sleeptime1; - $("#apcnight2").value = data.sleeptime2; - }) - $('#apconfigbox').style.display = 'block' -} +}); + +document.addEventListener("loadTab", function (event) { + activeTab = event.detail; + switch (event.detail) { + case 'configtab': + case 'aptab': + fetch("/get_ap_config") + .then(response => response.json()) + .then(data => { + apConfig = data; + $('#apcfgalias').value = data.alias; + $('#apcfgchid').value = data.channel; + $("#apcfgledbrightness").value = data.led; + $("#apcfglanguage").value = data.language; + $("#apclatency").value = data.maxsleep; + $("#apcpreventsleep").value = data.stopsleep; + $("#apcpreview").value = data.preview; + $("#apcwifipower").value = data.wifipower; + $("#apctimezone").value = data.timezone; + $("#apcnight1").value = data.sleeptime1; + $("#apcnight2").value = data.sleeptime2; + }) + $('#apcfgmsg').innerHTML = ''; + break; + } +}); $('#apcfgsave').onclick = function () { let formData = new FormData(); @@ -549,14 +600,13 @@ $('#apcfgsave').onclick = function () { .then(data => { showMessage(data); window.dispatchEvent(loadConfig); + $('#apcfgmsg').innerHTML = 'OK, Saved'; }) .catch(error => showMessage('Error: ' + error)); - - $('#apconfigbox').style.display = 'none'; } -$('#updatebutton').onclick = function () { - $('#apconfigbox').style.display = 'none'; +$('#updatebutton').onclick = function (event) { + event.preventDefault(); $('#apupdatebox').style.display = 'block'; loadOTA(); } @@ -720,7 +770,9 @@ function showMessage(message, iserr) { const messages = $('#messages'); const date = new Date(); const time = date.toLocaleTimeString('nl-NL', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' }); - if (iserr) { + if (message.startsWith('{')) { + messages.insertAdjacentHTML("afterbegin", '
  • ' + htmlEncode(time) + ' ' + message.replace(/"([^"]+)"/g, '"$1"') + '
  • '); + } else if (iserr) { messages.insertAdjacentHTML("afterbegin", '
  • ' + htmlEncode(time + ' ' + message) + '
  • '); } else { messages.insertAdjacentHTML("afterbegin", '
  • ' + htmlEncode(time + ' ' + message) + '
  • '); @@ -887,12 +939,18 @@ function GroupSortFilter() { } let show = true; + let batteryMv = tagDB[item.dataset.mac].batteryMv; if ($('input[name="filter"][value="remote"]').checked && item.dataset.isexternal == "false") show = false; if ($('input[name="filter"][value="local"]').checked && item.dataset.isexternal == "true") show = false; if ($('input[name="filter"][value="inactive"]').checked && item.querySelector('.warningicon').style.display != 'inline-block') show = false; if ($('input[name="filter"][value="pending"]').checked && !item.classList.contains("tagpending")) show = false; + if ($('input[name="filter"][value="lowbatt"]').checked && (batteryMv >= 2400 || batteryMv == 0 || batteryMv == 1337)) show = false; if (!show) item.style.display = 'none'; else item.style.display = 'block'; item.style.order = order++; + const checkedValues = Array.from(document.querySelectorAll('input[name="filter"]:checked')) + .map(checkbox => checkbox.value) + .join(', '); + $('#activefilter').innerHTML = (checkedValues ? 'filtered by ' + checkedValues : ''); }); headItems = Array.from($('#taglist').getElementsByClassName('taggroup')); @@ -901,7 +959,7 @@ function GroupSortFilter() { }) } -$('#toggleFilters').addEventListener('click', () => { +$('#toggleFilters').addEventListener('click', (event) => { event.preventDefault(); const filterOptions = $('#filterOptions'); filterOptions.classList.toggle('active'); @@ -912,6 +970,13 @@ $('#toggleFilters').addEventListener('click', () => { } }); +$('#activefilter').addEventListener('click', (event) => { + event.preventDefault(); + const filterOptions = $('#filterOptions'); + filterOptions.classList.add('active'); + filterOptions.style.maxHeight = filterOptions.scrollHeight + 20 + 'px'; +}); + async function getTagtype(hwtype) { if (tagTypes[hwtype]) { return tagTypes[hwtype]; @@ -1156,4 +1221,83 @@ function populateTimes(element) { option.text = i.toString().padStart(2, "0") + ":00"; element.appendChild(option); } +} + +function populateAPCard(msg) { + let apip = msg.ip; + let apid = apip.replace(/\./g, "-"); + if (!$('#ap' + apid)) { + div = $('#apcard').cloneNode(true); + div.setAttribute('id', 'ap' + apid); + $('#aplist').appendChild(div); + } + let alias = msg.alias; + if (!alias) alias = apip; + $('#ap' + apid + ' .apip').innerHTML = "" + apip + ""; + $('#ap' + apid + ' .apalias').innerHTML = alias; + $('#ap' + apid + ' .aptagcount').innerHTML = msg.count; + $('#ap' + apid + ' .apchannel').innerHTML = msg.channel; + + const elements = document.querySelectorAll('.apchannel'); + Array.from(elements).forEach(element => { + if (element.textContent === msg.channel && element.id !== 'ap' + apid) { + $('#ap' + apid + ' .apchannel').style.color = 'red'; + $('#ap' + apid + ' .apchannel').innerHTML += ' conflict'; + } + }); + + // $('#ap' + apid + ' .apversion').innerHTML = msg.version; + if (activeTab == 'aptab') { + populateAPInfo(apip); + } +} + +function populateAPInfo(apip) { + let apid = apip.replace(/\./g, "-"); + fetch('http://' + apip + '/sysinfo') + .then(response => { + if (response.status != 200) { + $('#ap' + apid + ' .apswversion').innerHTML = "Error fetching sysinfo: " + response.status; + return {}; + } else { + return response.json(); + } + }) + .then(data => { + if (data.env) { + let version = ''; + version += `env: ${data.env}
    `; + version += `build date: ${formatEpoch(data.buildtime)}
    `; + version += `esp32 version: ${data.buildversion}
    `; + version += `psram size: ${data.psramsize}
    `; + version += `flash size: ${data.flashsize}
    `; + $('#ap' + apid + ' .apswversion').innerHTML = version; + // if (data.env == 'ESP32_S3_16_8_YELLOW_AP') $("#c6Option").style.display = 'block'; + } + }) + .catch(error => { + $('#ap' + apid + ' .apswversion').innerHTML = "Error fetching sysinfo: " + error; + }); +} + +function formatEpoch(epochTime) { + const date = new Date(epochTime * 1000); // Convert seconds to milliseconds + + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + + return `${year}-${month}-${day} ${hours}:${minutes}`; +} + +function setFilterAndShow(filter) { + $('input[name="filter"][value="remote"]').checked = false; + $('input[name="filter"][value="local"]').checked = false; + $('input[name="filter"][value="inactive"]').checked = (filter == 'inactive'); + $('input[name="filter"][value="pending"]').checked = (filter == 'pending'); + $('input[name="filter"][value="lowbatt"]').checked = (filter == 'lowbatt'); + GroupSortFilter(); + $(`[data-target='tagtab']`).click(); } \ No newline at end of file