From 6b84eb0290410f8e38369db0788509adbfb38866 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Tue, 3 Jan 2023 08:05:28 +0100 Subject: [PATCH] Replace alert boxes with overlay info boxes (#1742) * consolidate test-ip definition, added missing Access-Control-Allow-Origin * replace alert boxes with overlay info boxes * . * . * . * . * . * . * . * . * . * . * . Co-authored-by: CaCO3 --- .../jomjol_fileserver_ota/server_ota.cpp | 38 +++++++++- code/include/defines.h | 2 +- images/close.png | Bin 0 -> 95831 bytes sd-card/html/backup.html | 6 +- sd-card/html/close.png | Bin 0 -> 9761 bytes sd-card/html/common.js | 4 +- sd-card/html/edit_alignment.html | 6 +- sd-card/html/edit_analog.html | 22 +++--- sd-card/html/edit_config.html | 6 +- sd-card/html/edit_config_param.html | 18 ++--- sd-card/html/edit_digits.html | 22 +++--- sd-card/html/edit_explain_6.html | 7 +- sd-card/html/edit_reference.html | 6 +- sd-card/html/firework.css | 38 ++++++++++ sd-card/html/firework.js | 68 ++++++++++++++++++ sd-card/html/graph.html | 9 +-- sd-card/html/index.html | 1 - sd-card/html/ota_page.html | 43 ++++++----- sd-card/html/overview.html | 2 +- sd-card/html/prevalue_set.html | 9 ++- sd-card/html/readconfigcommon.js | 22 +++--- sd-card/html/readconfigparam.js | 2 +- sd-card/html/upload_script.html | 32 ++++++--- sd-card/html/wlan_config.html | 25 ++++--- 24 files changed, 287 insertions(+), 101 deletions(-) create mode 100644 images/close.png create mode 100644 sd-card/html/close.png create mode 100644 sd-card/html/firework.css create mode 100644 sd-card/html/firework.js diff --git a/code/components/jomjol_fileserver_ota/server_ota.cpp b/code/components/jomjol_fileserver_ota/server_ota.cpp index 728d800b..6bc3d172 100644 --- a/code/components/jomjol_fileserver_ota/server_ota.cpp +++ b/code/components/jomjol_fileserver_ota/server_ota.cpp @@ -666,8 +666,42 @@ esp_err_t handler_reboot(httpd_req_t *req) LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "handler_reboot"); ESP_LOGI(TAG, "!!! System will restart within 5 sec!!!"); - const char* resp_str = "

"; - httpd_resp_send(req, resp_str, strlen(resp_str)); + + char _query[200]; + char _valuechar[30]; + std::string _task; + std::string response = + "

"; + + if (httpd_req_get_url_query_str(req, _query, 200) == ESP_OK) + { + ESP_LOGD(TAG, "Query: %s", _query); + + if (httpd_query_key_value(_query, "task", _valuechar, 30) == ESP_OK) + { + ESP_LOGD(TAG, "task is found: %s", _valuechar); + _task = std::string(_valuechar); + } + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + + if (_task.compare("OTA") == 0) { // Reboot after OTA upload + response.append(""); + } + else { // Normal reboot + response.append(""); + } + + response.append(""); + httpd_resp_send(req, response.c_str(), strlen(response.c_str())); doReboot(); diff --git a/code/include/defines.h b/code/include/defines.h index d284539e..e8f86ec2 100644 --- a/code/include/defines.h +++ b/code/include/defines.h @@ -42,7 +42,7 @@ #define FILE_PATH_MAX (255) //Max length a file path can have on storage //server_file +(ota_page.html + upload_script.html) - #define MAX_FILE_SIZE (8000*1024) // 8 MB Max size of an individual file. Make sure this value is same as that set in upload_script.html + #define MAX_FILE_SIZE (8000*1024) // 8 MB Max size of an individual file. Make sure this value is same as that set in upload_script.html and ota_page.html! #define MAX_FILE_SIZE_STR "8MB" #define LOGFILE_LAST_PART_BYTES SERVER_FILER_SCRATCH_BUFSIZE * 20 // 80 kBytes // Size of partial log file to return diff --git a/images/close.png b/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..12fbe67ebfb95ccfaeb899c2ebe0f30b24bff2b7 GIT binary patch literal 95831 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 nKM4E>f&U=ze+vP>)yF{ - - - + + + + @@ -129,7 +131,7 @@ function SaveToConfig(){ WriteConfigININew(); UpdateConfigReference(domainname) SaveConfigToServer(domainname); - alert("Config.ini is updated!"); + firework.launch('Configuration got updated. Please reboot to activate changes!', 'success', 5000); } function EnhanceContrast(){ diff --git a/sd-card/html/edit_analog.html b/sd-card/html/edit_analog.html index ca1c6775..2aed5251 100644 --- a/sd-card/html/edit_analog.html +++ b/sd-card/html/edit_analog.html @@ -60,7 +60,9 @@ th, td { opacity: 0.4; } - + + + @@ -227,7 +229,7 @@ function newROI(){ erg = CreateROI(_number, "analog", sel.selectedIndex, _roinew, 1, 1, 30, 30, false); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); else UpdateROIs(_roinew); } @@ -281,7 +283,7 @@ function SaveToConfig(){ _zwcat["Analog"]["enabled"] = document.getElementById("Category_Analog_enabled").checked; WriteConfigININew(); SaveConfigToServer(domainname); - alert("Config.ini is updated!"); + firework.launch('Configuration got updated. Please reboot to activate changes!', 'success', 5000); } @@ -296,13 +298,13 @@ function UpdateROIs(_sel){ if (_catzw["Analog"]["enabled"] == false) { document.getElementById("Category_Analog_enabled").checked = false; - EnDisableDigits(); - alert("Analog ROIs are disabled - please enable (Check box top left).\n"); + EnDisableAnalog(); + firework.launch('Analog ROIs are disabled - please enable first (Check box top left)', 'warning', 10000); return; } if (ROIInfo.length == 0){ - alert("There are no ROIs defined.\nPlease first create a new ROI (\"New ROIs ...\").\n"); + firework.launch('There are no ROIs defined. Please first create a new ROI ("New ROIs ...")', 'danger', 10000); document.getElementById("newROI").disabled = false; document.getElementById("deleteROI").disabled = true; document.getElementById("index").disabled = true; @@ -454,7 +456,7 @@ function renameNumber(){ erg = RenameNUMBER(_delte, _numbernew); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); else UpdateNUMBERS(_numbernew); } @@ -464,7 +466,7 @@ function newNumber(){ erg = CreateNUMBER(_numbernew); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); else UpdateNUMBERS(_numbernew); } @@ -476,7 +478,7 @@ function removeNumber(){ var _delte= sel.options[sel.selectedIndex].text; erg = DeleteNUMBER(_delte); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); UpdateNUMBERS(); } } @@ -683,7 +685,7 @@ function drawTextBG(context, txt, x, y, padding) { erg = RenameROI(_number, "analog", _roialt, _roinew); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); else UpdateROIs(_roinew); } diff --git a/sd-card/html/edit_config.html b/sd-card/html/edit_config.html index 06db66b5..da180442 100644 --- a/sd-card/html/edit_config.html +++ b/sd-card/html/edit_config.html @@ -21,7 +21,9 @@ textarea { font-size: 14px; } - + + + @@ -61,7 +63,7 @@ function saveTextAsFile() FileDeleteOnServer("/config/config.ini", domainname); var textToSave = document.getElementById("inputTextToSave").value; FileSendContent(textToSave, "/config/config.ini", domainname); - alert("Config.ini is updated!") + firework.launch('Configuration got updated. Please reboot to activate changes!', 'success', 5000); } } diff --git a/sd-card/html/edit_config_param.html b/sd-card/html/edit_config_param.html index 7cea9546..db80ea5b 100644 --- a/sd-card/html/edit_config_param.html +++ b/sd-card/html/edit_config_param.html @@ -72,7 +72,9 @@ textarea { } - + + + @@ -1450,7 +1452,7 @@ function LoadConfigNeu() { domainname = getDomainname(); if (!loadConfig(domainname)) { - alert("Config.ini could not be loaded!\nPlease reload the page."); + firework.launch('Configuration could not be loaded! Please reload the page!', 'danger', 30000); return; } ParseConfig(); @@ -1528,8 +1530,8 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1) if (!_isFound) { _zw_txt = "In the selected field the value '" + textToFind + "' in the parameter '"; - _zw_txt = _zw_txt + _cat + "' in the field '" + _name + "' is invalid.\nPLEASE CHECK BEFORE SAVING!"; - alert(_zw_txt); + _zw_txt = _zw_txt + _cat + "' in the field '" + _name + "' is invalid. PLEASE CHECK BEFORE SAVING!"; + firework.launch(_zw_txt, 'warning', 10000); } } else if ((element.getAttribute("type") != null) && (element.getAttribute("type").toLowerCase() == "checkbox")) { @@ -1569,8 +1571,8 @@ function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1) if (!_isFound) { _zw_txt = "In the selected field the value '" + textToFind + "' in the section '"; - _zw_txt = _zw_txt + _cat + "' in the field '" + _name + "' is invalid.\nPLEASE CHECK BEFORE SAVING!"; - alert(_zw_txt); + _zw_txt = _zw_txt + _cat + "' in the field '" + _name + "' is invalid. PLEASE CHECK BEFORE SAVING!"; + firework.launch(_zw_txt, 'warning', 10000); } } @@ -2057,7 +2059,7 @@ function saveTextAsFile() { ReadParameterAll(); if (document.getElementsByClassName("invalid-input").length > 0) { - alert("Settings cannot be saved. Please check your entries."); + firework.launch("Settings cannot be saved. Please check your entries!", 'danger', 30000); return; } @@ -2065,7 +2067,7 @@ function saveTextAsFile() ReadParameterAll(); WriteConfigININew(); SaveConfigToServer(domainname); - alert("Config.ini is updated!") + firework.launch('Configuration got updated. Please reboot to activate changes!', 'success', 5000); } } diff --git a/sd-card/html/edit_digits.html b/sd-card/html/edit_digits.html index 81347d3f..ed20b57c 100644 --- a/sd-card/html/edit_digits.html +++ b/sd-card/html/edit_digits.html @@ -51,7 +51,9 @@ th, td { padding: 5px 5px 5px 0px; } - + + + @@ -228,7 +230,7 @@ function newROI() { erg = CreateROI(_number, "digit", sel.selectedIndex, _roinew, 1, 1, 30, 51, 0); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); else { UpdateROIs(_roinew); // Shift all ROIs on right side to the right @@ -265,7 +267,7 @@ function changelockSizes(){ lockSizes = document.getElementById("lockSizes").checked; if (!lockSizes) { - alert("For best results it is (in most cases) advised to keep the y, Δx and Δy identical!"); + firework.launch("For best results it is in most cases advised to keep the y, Δx and Δy identical!", 'warning', 10000); } } @@ -284,7 +286,7 @@ function SaveToConfig(){ _zwcat["Digits"]["enabled"] = document.getElementById("Category_Digits_enabled").checked; WriteConfigININew(); SaveConfigToServer(domainname); - alert("Config.ini is updated!"); + firework.launch('Configuration got updated. Please reboot to activate changes!', 'success', 5000); } @@ -300,12 +302,12 @@ function UpdateROIs(_sel){ { document.getElementById("Category_Digits_enabled").checked = false; EnDisableDigits(); - alert("Digital ROIs are disabled - please enable (Check box top left).\n"); + firework.launch('Digital ROIs are disabled - please enable first (Check box top left)', 'warning', 10000); return; } if (ROIInfo.length == 0){ - alert("There are no ROIs defined.\nPlease first create a new ROI (\"New ROIs ...\").\n"); + firework.launch('There are no ROIs defined. Please first create a new ROI ("New ROIs ...")', 'danger', 10000); document.getElementById("newROI").disabled = false; document.getElementById("deleteROI").disabled = true; document.getElementById("index").disabled = true; @@ -460,7 +462,7 @@ function renameNumber(){ erg = RenameNUMBER(_delte, _numbernew); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); else UpdateNUMBERS(_numbernew); } @@ -470,7 +472,7 @@ function newNumber(){ erg = CreateNUMBER(_numbernew); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); else UpdateNUMBERS(_numbernew); } @@ -482,7 +484,7 @@ function removeNumber(){ var _delte= sel.options[sel.selectedIndex].text; erg = DeleteNUMBER(_delte); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); UpdateNUMBERS(); } } @@ -747,7 +749,7 @@ function draw() { erg = RenameROI(_number, "digit", _roialt, _roinew); if (erg != "") - alert(erg); + firework.launch(erg, 'danger', 30000); else UpdateROIs(_roinew); } diff --git a/sd-card/html/edit_explain_6.html b/sd-card/html/edit_explain_6.html index d861f418..e50eb5c8 100644 --- a/sd-card/html/edit_explain_6.html +++ b/sd-card/html/edit_explain_6.html @@ -21,6 +21,9 @@ p {font-size: 1em;} + + + @@ -51,10 +54,10 @@ p {font-size: 1em;} aktstatu = 0; function reboot() { - if (confirm("Do you want to leave the configuration mode and restart the ESP32?\n\nPlease reload the page in about 30s.")) { + if (confirm("Do you want to leave the configuration mode and restart the ESP32?")) { domainname = getDomainname(); if (!loadConfig(domainname)) { - alert("Setup Modus could not be deactivated!\Please retry."); + firework.launch('Setup Modus could not be deactivated! Please try again!', 'danger', 30000); return; } ParseConfig(); diff --git a/sd-card/html/edit_reference.html b/sd-card/html/edit_reference.html index ac83281b..c66f8972 100644 --- a/sd-card/html/edit_reference.html +++ b/sd-card/html/edit_reference.html @@ -30,7 +30,9 @@ table { padding: 5px; } - + + + @@ -268,7 +270,7 @@ table { SaveCanvasToImage(canvas, "/config/reference.jpg", true, getDomainname()); showReference(param); UpdatePage(); - alert("Reference is updated!"); + firework.launch('Reference got updated. Please reboot to activate changes!', 'success', 5000); } } diff --git a/sd-card/html/firework.css b/sd-card/html/firework.css new file mode 100644 index 00000000..e905579e --- /dev/null +++ b/sd-card/html/firework.css @@ -0,0 +1,38 @@ +/* Firework JS */ +.firework { + background-color: #888; + border-color: #888; + border-radius: 6px; + color: #fff; + left: 200px; + padding: 5px; + position: fixed; + opacity: 0; + text-align: center; + top: 0px; + width: 600px; + z-index: 99; + font-size:120%; +} +.firework a { + color: rgba(255, 255, 255, 0.9); + cursor: pointer; + float: right; + margin: 0 -5px 0 0; + padding: 0 5px; +} +.firework.success { + background-color: #669936f0; + border-color: #669936; + color: #fff +} +.firework.danger { + background-color: #E65A27f0; + border-color: #E65A27; + color: #fff +} +.firework.warning { + color: #5F612C; + background-color: #dbd567f0; + border-color: #DBD667; +} diff --git a/sd-card/html/firework.js b/sd-card/html/firework.js new file mode 100644 index 00000000..19bbfc56 --- /dev/null +++ b/sd-card/html/firework.js @@ -0,0 +1,68 @@ +/** + * Firework displays short notifications at top of page, + * then fades out a few seconds later (no user interaction) + * Source: https://www.jqueryscript.net/other/Simple-Top-Notification-Plugin-with-jQuery-firework-js.html + * https://github.com/smalldogs/fireworkjs + * @param m string message + * @param t string (optional) message type ('success', 'danger') + * @param l number (optional) length of time to display message in milliseconds + */ + ;(function ($, window) { + "use strict"; + + window.firework = { + launch: function(m, t, l) { + if (typeof m != 'string') { + console.error('Error: Call to firework() without a message'); + return false + } + + var c = 'firework' // css class(es) + , p = 10 // pixels from top or page to display + , d = new Date() + , s = d.getTime() // used to create unique element ids + , fid = "firework-"+ s; // firework id + + if (typeof t !== 'undefined') c += ' '+ t; // add any user defined classes + + $('.firework').each(function(){ // account for existing fireworks and move new one below + p += parseInt($(this).height()) + 30 + }); + + $('

'+ m +'
') + .appendTo('body') + .animate({ + opacity: 1, + top: p +'px' + }); + + setTimeout(function(){ firework.remove("#"+ fid) }, typeof l == "number" ? l : 1500); + }, + + remove : function(t) { + $(t) + .animate({ + opacity: 0 + }) + .promise() + .done(function(){ + $(t).remove() + }) + }, + + sticky : function(m, t, l) { + $.cookie("firework", '{ "message" : "'+ m +'", "type" : "'+ t +'", "display" : "'+ l +'" }', { path: '/' }) + } + }; + + // checks for firework cookie on dom ready + $(function() { + if (typeof $.cookie == "function") { + if ($.cookie("firework")) { + var ex = $.parseJSON($.cookie("firework")) + setTimeout(function(){ firework.launch(ex.message, ex.type, parseInt(ex.display) > 0 ? parseInt(ex.display) : null) }, 1000) + $.cookie("firework", null, { path: '/'}) + } + } + }); +})(jQuery, window); diff --git a/sd-card/html/graph.html b/sd-card/html/graph.html index 9dedef86..acf02355 100644 --- a/sd-card/html/graph.html +++ b/sd-card/html/graph.html @@ -1,6 +1,6 @@ - + @@ -18,7 +18,9 @@ el && eval(el.value); } - + + +
@@ -46,7 +48,7 @@ fetch(_domainname + '/fileserver/log/data/' + datefile) .then(response => { // handle the response if (response.status == 404) { - alert("no log data available for "+dateString); + firework.launch('No log data available for " + dateString, 'warning', 10000); } response.text() .then( result => { @@ -79,7 +81,6 @@ fetch(_domainname + '/fileserver/log/data/' + datefile) }).catch((error) => { // handle the error console.log(error); -alert("test"); });
diff --git a/sd-card/html/index.html b/sd-card/html/index.html index e7ab164e..be096379 100644 --- a/sd-card/html/index.html +++ b/sd-card/html/index.html @@ -7,7 +7,6 @@ - diff --git a/sd-card/html/ota_page.html b/sd-card/html/ota_page.html index 805e584d..4dbf077e 100644 --- a/sd-card/html/ota_page.html +++ b/sd-card/html/ota_page.html @@ -26,7 +26,9 @@ input[type=number] { font-size: 16px; } - + + + @@ -89,13 +91,13 @@ function init(){ function doRebootAfterUpdate() { - if (confirm("Upload completed!\nThe device will reboot now and complete the update.\nThis will take up to 180s!")) { - var stringota = "/reboot"; +/* if (confirm("Upload completed!\nThe device will reboot now and complete the update.\nThis will take up to 180s!")) {*/ + var stringota = "/reboot?task=OTA"; window.location = stringota; window.location.href = stringota; window.location.assign(stringota); window.location.replace(stringota); - } +/* }*/ } @@ -112,23 +114,28 @@ function prepareOnServer() { var nameneu = document.getElementById("newfile").value; filePath = nameneu.split(/[\\\/]/).pop(); + /* Max size of an individual file. Make sure this + * value is same as that set in file_server.c */ + var MAX_FILE_SIZE = 8000*1024; + var MAX_FILE_SIZE_STR = "8000KB"; + if (fileInput.length == 0) { - alert("No file selected!"); + firework.launch('No file selected!', 'danger', 30000); return; } else if (filePath.length == 0) { - alert("File path on server is not set!"); + firework.launch('File path on server is not set!', 'danger', 30000); return; } else if (filePath.length > 100) { - alert("Filename is to long! Max 100 characters."); + firework.launch('Filename is to long! Max 100 characters.', 'danger', 30000); return; } else if (filePath.indexOf(' ') >= 0) { - alert("File path on server cannot have spaces!"); + firework.launch('File path on server cannot have spaces!', 'danger', 30000); return; } else if (filePath[filePath.length-1] == '/') { - alert("File name not specified after path!"); + firework.launch('File name not specified after path!', 'danger', 30000); return; } else if (fileInput[0].size > MAX_FILE_SIZE) { - alert("File size must be less than " + MAX_FILE_SIZE_STR + "!"); + firework.launch("File size must be less than " + MAX_FILE_SIZE_STR + "!", 'danger', 30000); return; } @@ -148,10 +155,10 @@ function prepareOnServer() { /* keine Reaktion, damit sich das Dokument nicht ändert */ upload(); } else if (xhttp.status == 0) { - alert("Server closed the connection abruptly!"); + firework.launch('Server closed the connection abruptly!', 'danger', 30000); document.getElementById("doUpdate").disabled = false; } else { - alert(xhttp.status + " Error!\n" + xhttp.responseText); + firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000); document.getElementById("doUpdate").disabled = false; } } @@ -173,14 +180,12 @@ function upload() { if (xhttp.readyState == 4) { stopProgressTimer(); if (xhttp.status == 200) { -// alert("Upload successfull!") -// document.reload(); extract(); } else if (xhttp.status == 0) { - alert("Server closed the connection abruptly!"); + firework.launch('Server closed the connection abruptly!', 'danger', 30000); document.getElementById("doUpdate").disabled = false; } else { - alert(xhttp.status + " Error!\n" + xhttp.responseText); + firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000); document.getElementById("doUpdate").disabled = false; } } @@ -218,13 +223,13 @@ function extract() { } else { - alert("Processing done!\n\n" + xhttp.responseText); + firework.launch('Processing done', 'success', 5000); } } else if (xhttp.status == 0) { - alert("Server closed the connection abruptly!"); + firework.launch('Server closed the connection abruptly!', 'danger', 30000); UpdatePage(); } else { - alert(xhttp.status + " Error!\n" + xhttp.responseText); + firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000); UpdatePage(); } } diff --git a/sd-card/html/overview.html b/sd-card/html/overview.html index a940bd55..cf949350 100644 --- a/sd-card/html/overview.html +++ b/sd-card/html/overview.html @@ -68,7 +68,7 @@ - + + @@ -92,7 +95,7 @@ function setprevalue() { } catch (error) { - alert("Failed to get data from device!"); + firework.launch('Failed to get data from device!', 'danger', 30000); } } @@ -111,7 +114,7 @@ function loadPrevalue(_domainname) { } catch (error) { - alert("Failed to get data from device!"); + firework.launch('Failed to get data from device!', 'danger', 30000); } // Get current RAW Value @@ -138,7 +141,7 @@ function loadPrevalue(_domainname) { } catch (error) { - alert("Failed to get data from device!"); + firework.launch('Failed to get data from device!', 'danger', 30000); } } diff --git a/sd-card/html/readconfigcommon.js b/sd-card/html/readconfigcommon.js index 11a30232..f4cf862a 100644 --- a/sd-card/html/readconfigcommon.js +++ b/sd-card/html/readconfigcommon.js @@ -31,7 +31,7 @@ function createReader(file) { image.onload = function(evt) { var width = this.width; var height = this.height; - alert (width); // will produce something like 198 + //alert (width); // will produce something like 198 }; image.src = evt.target.result; }; @@ -141,7 +141,7 @@ function loadConfig(_domainname) { } catch (error) { - // alert("Deleting Config.ini failed"); +// firework.launch('Deleting Config.ini failed!', 'danger', 30000); } return true; } @@ -166,7 +166,7 @@ function FileCopyOnServer(_source, _target, _domainname = ""){ xhttp.send(); } catch (error) { -// alert("Deleting Config.ini failed"); +// firework.launch('Deleting Config.ini failed!', 'danger', 30000); } } @@ -179,10 +179,10 @@ function FileDeleteOnServer(_filename, _domainname = ""){ if (xhttp.status == 200) { okay = true; } else if (xhttp.status == 0) { -// alert("Server closed the connection on delete abruptly!"); +// firework.launch('Server closed the connection abruptly!', 'danger', 30000); // location.reload() } else { -// alert(xhttp.status + " Error!\n" + xhttp.responseText); +// firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000); // location.reload() } } @@ -194,7 +194,7 @@ function FileDeleteOnServer(_filename, _domainname = ""){ } catch (error) { -// alert("Deleting Config.ini failed"); +// firework.launch('Deleting Config.ini failed!', 'danger', 30000); } return okay; @@ -209,9 +209,9 @@ function FileSendContent(_content, _filename, _domainname = ""){ if (xhttp.status == 200) { okay = true; } else if (xhttp.status == 0) { - alert("Server closed the connection abruptly!"); + firework.launch('Server closed the connection abruptly!', 'danger', 30000); } else { - alert(xhttp.status + " Error!\n" + xhttp.responseText); + firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000); } } }; @@ -223,7 +223,7 @@ function FileSendContent(_content, _filename, _domainname = ""){ } catch (error) { -// alert("Deleting Config.ini failed"); +// firework.launch('Deleting Config.ini failed!', 'danger', 30000); } return okay; } @@ -254,7 +254,7 @@ function MakeContrastImageZW(zw, _enhance, _domainname){ xhttp.send(); } catch (error) { -// alert("Deleting Config.ini failed"); +// firework.launch('Deleting Config.ini failed!', 'danger', 30000); } } @@ -270,7 +270,7 @@ function MakeRefZW(zw, _domainname){ xhttp.send(); } catch (error) { -// alert("Deleting Config.ini failed"); +// firework.launch('Deleting Config.ini failed!', 'danger', 30000); } _filetarget2 = zw["name"].replace("/config/", "/img_tmp/"); // _filetarget2 = _filetarget2.replace(".jpg", "_org.jpg"); diff --git a/sd-card/html/readconfigparam.js b/sd-card/html/readconfigparam.js index 37b524ab..6dd6d412 100644 --- a/sd-card/html/readconfigparam.js +++ b/sd-card/html/readconfigparam.js @@ -28,7 +28,7 @@ function getNUMBERSList() { } catch (error) { - alert("Loading Hostname failed"); +// alert("Loading Hostname failed"); } datalist = datalist.split("\t"); diff --git a/sd-card/html/upload_script.html b/sd-card/html/upload_script.html index d6740322..72ef30c5 100644 --- a/sd-card/html/upload_script.html +++ b/sd-card/html/upload_script.html @@ -1,3 +1,10 @@ + + + + + + +
@@ -63,19 +70,21 @@ function upload() { /* Max size of an individual file. Make sure this * value is same as that set in file_server.c */ - var MAX_FILE_SIZE = 2000*1024; - var MAX_FILE_SIZE_STR = "2000KB"; + var MAX_FILE_SIZE = 8000*1024; + var MAX_FILE_SIZE_STR = "8000KB"; if (fileInput.length == 0) { - alert("No file selected!"); + firework.launch('No file selected!', 'danger', 30000); } else if (filePath.length == 0) { - alert("File path on server is not set!"); + firework.launch('File path on server is not set!', 'danger', 30000); + } else if (filePath.length > 100) { + firework.launch('Filename is to long! Max 100 characters.', 'danger', 30000); } else if (filePath.indexOf(' ') >= 0) { - alert("File path on server cannot have spaces!"); + firework.launch('File path on server cannot have spaces!', 'danger', 30000); } else if (filePath[filePath.length-1] == '/') { - alert("File name not specified after path!"); - } else if (fileInput[0].size > 2000*1024) { - alert("File size must be less than 2000KB!"); + firework.launch('File name not specified after path!', 'danger', 30000); + } else if (fileInput[0].size > MAX_FILE_SIZE) { + firework.launch("File size must be less than " + MAX_FILE_SIZE_STR + "!", 'danger', 30000); } else { document.getElementById("newfile").disabled = true; document.getElementById("filepath").disabled = true; @@ -90,10 +99,10 @@ function upload() { document.write(xhttp.responseText); document.close(); } else if (xhttp.status == 0) { - alert("Server closed the connection abruptly!"); + firework.launch('Server closed the connection abruptly!', 'danger', 30000); UpdatePage(false); } else { - alert(xhttp.status + " Error!\n" + xhttp.responseText); + firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000); UpdatePage(false); } } @@ -103,3 +112,6 @@ function upload() { } } + + + \ No newline at end of file diff --git a/sd-card/html/wlan_config.html b/sd-card/html/wlan_config.html index aaf2d1bf..83acf2c9 100644 --- a/sd-card/html/wlan_config.html +++ b/sd-card/html/wlan_config.html @@ -1,4 +1,11 @@ - + + + + + + + +
@@ -20,10 +27,10 @@ // var xhttp = new XMLHttpRequest(); // xhttp.onreadystatechange = function() {if (xhttp.readyState == 4) {if (xhttp.status == 200) {document.reload();}}}; -if (!file.name.includes("remote-setup")){if (!confirm("The zip file name should contain \"...remote-setup...\". Are you sure that you have downloaded the correct file?"))return;} - -if (!file.name.includes("remote-setup")){if (!confirm("The zip file name should contain \"...remote-setup...\". Are you sure that you have downloaded the correct file?"))return;} - +if (!file.name.includes("remote-setup")){ + if (!confirm("The zip file name should contain \"...remote-setup...\". Are you sure that you have downloaded the correct file?")) + return; +} function upload() { var xhttp = new XMLHttpRequest(); @@ -60,13 +67,13 @@ if (!file.name.includes("remote-setup")){if (!confirm("The zip file name should } else { - alert("Processing done!\n\n" + xhttp.responseText); + firework.launch('Processing done! (' + xhttp.responseText + ')', 'success', 5000); } } else if (xhttp.status == 0) { - alert("Server closed the connection abruptly!"); + firework.launch('Server closed the connection abruptly!', 'danger', 30000); UpdatePage(); } else { - alert(xhttp.status + " Error!\n" + xhttp.responseText); + firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000); UpdatePage(); } } @@ -103,3 +110,5 @@ if (!file.name.includes("remote-setup")){if (!confirm("The zip file name should + +
WLAN-SSIDSSID of the WLAN
WLAN-PasswordATTENTION: the password will not be encrypted during the sending.
Hostname