From 43e0ff9270e674acaa7d35a8fe65233a1133c400 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Sat, 18 Feb 2023 22:38:26 +0100 Subject: [PATCH] Fix CI/CD and update binary assets --- data/edit.htm | 666 +-------------------------------- data/main.js | 2 +- data/script.js | 134 +------ data/static/edit.htm.gz | Bin 6707 -> 1132 bytes data/static/en.json.gz | Bin 1777 -> 1777 bytes data/static/main.js.gz | Bin 4004 -> 4136 bytes data/static/script.js.gz | Bin 2268 -> 4484 bytes data/static/style.css.gz | Bin 5329 -> 5866 bytes data/style.css | 57 ++- src/sys/svc/hasp_http.cpp | 47 ++- tools/auto_firmware_version.py | 18 + tools/esp_merge_bin.py | 12 +- tools/minifiy.py | 69 ++++ user_setups/esp32/_esp32.ini | 4 +- 14 files changed, 177 insertions(+), 832 deletions(-) create mode 100644 tools/minifiy.py diff --git a/data/edit.htm b/data/edit.htm index cd185e2c..f25ffeff 100644 --- a/data/edit.htm +++ b/data/edit.htm @@ -1,665 +1 @@ - - - - - - - - - - - - - openHASP - - - - - - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - -
- - - -
- - config.jsonl - - -
-
-
- -
-
-
    -
  • New File
  • -
  • Edit
  • -
  • Preview
  • -
  • Download
  • -
  • Delete
  • -
-
-
- - - - - +openHASP File Editor
L:
  • New File
  • Upload Files
  • Edit
  • Preview
  • Download
  • Delete
\ No newline at end of file diff --git a/data/main.js b/data/main.js index faad72b7..a74ef0c9 100644 --- a/data/main.js +++ b/data/main.js @@ -1 +1 @@ -import{createApp,reactive,createI18n}from"/static/petite-vue.hasp.js?COMMIT_HASH";const languages=[{code:"en",name:"English"},{code:"nl",name:"Nederlands"},{code:"fr",name:"Français"}];var locations={af:["Abidjan","Algiers","Bissau","Cairo","Casablanca","El_Aaiun","Johannesburg","Juba","Khartoum","Lagos","Maputo","Monrovia","Nairobi","Ndjamena","Sao_Tome","Tripoli","Tunis","Windhoek","Cape_Verde","Mauritius"],eu:["Ceuta","Danmarkshavn","Nuuk","Scoresbysund","Thule","Anadyr","Barnaul","Chita","Irkutsk","Kamchatka","Khandyga","Krasnoyarsk","Magadan","Novokuznetsk","Novosibirsk","Omsk","Sakhalin","Srednekolymsk","Tomsk","Ust-Nera","Vladivostok","Yakutsk","Yekaterinburg","Azores","Canary","Faroe","Madeira","Andorra","Astrakhan","Athens","Belgrade","Berlin","Brussels","Bucharest","Budapest","Chisinau","Dublin","Gibraltar","Helsinki","Istanbul","Kaliningrad","Kirov","Kyiv","Lisbon","London","Madrid","Malta","Minsk","Moscow","Paris","Prague","Riga","Rome","Samara","Saratov","Sofia","Tallinn","Tirane","Ulyanovsk","Vienna","Vilnius","Volgograd","Warsaw","Zurich"],as:["Almaty","Amman","Aqtau","Aqtobe","Ashgabat","Atyrau","Baghdad","Baku","Bangkok","Beirut","Bishkek","Choibalsan","Colombo","Damascus","Dhaka","Dili","Dubai","Dushanbe","Famagusta","Gaza","Hebron","Ho_Chi_Minh","Hong_Kong","Hovd","Jakarta","Jayapura","Jerusalem","Kabul","Karachi","Kathmandu","Kolkata","Kuching","Macau","Makassar","Manila","Nicosia","Oral","Pontianak","Pyongyang","Qatar","Qostanay","Qyzylorda","Riyadh","Samarkand","Seoul","Shanghai","Singapore","Taipei","Tashkent","Tbilisi","Tehran","Thimphu","Tokyo","Ulaanbaatar","Urumqi","Yangon","Yerevan","Chagos","Maldives"],au:["Perth","Eucla","Adelaide","Broken_Hill","Darwin","Brisbane","Hobart","Lindeman","Melbourne","Sydney","Lord_Howe"],na:["Adak","Anchorage","Bahia_Banderas","Barbados","Belize","Boise","Cambridge_Bay","Cancun","Chicago","Chihuahua","Ciudad_Juarez","Costa_Rica","Dawson","Dawson_Creek","Denver","Detroit","Edmonton","El_Salvador","Fort_Nelson","Glace_Bay","Goose_Bay","Grand_Turk","Guatemala","Halifax","Havana","Hermosillo","Indiana/Indianapolis","Indiana/Knox","Indiana/Marengo","Indiana/Petersburg","Indiana/Tell_City","Indiana/Vevay","Indiana/Vincennes","Indiana/Winamac","Inuvik","Iqaluit","Jamaica","Juneau","Kentucky/Louisville","Kentucky/Monticello","Los_Angeles","Managua","Martinique","Matamoros","Mazatlan","Menominee","Merida","Metlakatla","Mexico_City","Miquelon","Moncton","Monterrey","New_York","Nome","North_Dakota/Beulah","North_Dakota/Center","North_Dakota/New_Salem","Ojinaga","Panama","Phoenix","Port-au-Prince","Puerto_Rico","Rankin_Inlet","Regina","Resolute","Santo_Domingo","Sitka","St_Johns","Swift_Current","Tegucigalpa","Tijuana","Toronto","Vancouver","Whitehorse","Winnipeg","Yakutat","Yellowknife","Bermuda","Honolulu"],sa:["Araguaina","Argentina/Buenos_Aires","Argentina/Catamarca","Argentina/Cordoba","Argentina/Jujuy","Argentina/La_Rioja","Argentina/Mendoza","Argentina/Rio_Gallegos","Argentina/Salta","Argentina/San_Juan","Argentina/San_Luis","Argentina/Tucuman","Argentina/Ushuaia","Asuncion","Bahia","Belem","Boa_Vista","Bogota","Campo_Grande","Caracas","Cayenne","Cuiaba","Eirunepe","Fortaleza","Guayaquil","Guyana","La_Paz","Lima","Maceio","Manaus","Montevideo","Noronha","Paramaribo","Porto_Velho","Punta_Arenas","Recife","Rio_Branco","Santarem","Santiago","Sao_Paulo","Palmer","South_Georgia","Stanley","Easter","Galapagos"],at:["Cape_Verde","Canary","Faroe","Madeira","Azores","Bermuda","South_Georgia","Stanley"],in:["Mauritius","Maldives","Chagos"],pa:["Palau","Guam","Port_Moresby","Bougainville","Efate","Guadalcanal","Kosrae","Norfolk","Noumea","Auckland","Fiji","Kwajalein","Nauru","Tarawa","Chatham","Apia","Fakaofo","Kanton","Tongatapu","Kiritimati","Pitcairn","Gambier","Marquesas","Rarotonga","Tahiti","Niue","Pago_Pago","Honolulu","Easter","Galapagos"],aq:["Troll","Mawson","Davis","Casey","Rothera","Macquarie","Palmer"],etc:["Greenwich","Universal","Zulu","GMT-14","GMT-13","GMT-12","GMT-11","GMT-10","GMT-9","GMT-8","GMT-7","GMT-6","GMT-5","GMT-4","GMT-3","GMT-2","GMT-1","GMT","GMT+1","GMT+2","GMT+3","GMT+4","GMT+5","GMT+6","GMT+7","GMT+8","GMT+9","GMT+10","GMT+11","GMT+12","UCT","UTC"]};const regions={etc:"Etc",af:"Africa",as:"Asia",au:"Australia",aq:"Antarctica",eu:"Europe",na:"America",sa:"America",at:"Atlantic",in:"Indian",pa:"Pacific"},licenseData=[],licenseApp=[{t:"Petite Vue",y:2021,a:"Yuxi (Evan) You",l:"mit"},{t:"Petite Vue I18n Lite",y:2021,a:"Front Labs",l:"mit"},{t:"Ace Editor",y:2010,a:"Ajax.org B.V.",r:1,l:"bsd"},{t:"MaterialDesign Icons",y:2022,a:"Google",l:"apache2"}];function Credits(a){return{$template:"#credit-template",model:a}}function RegionItem(a,e,t){return{$template:"#region-template",model:a,region:e,i18n:t,list(t){if(a[t]&&e[t]){for(var n="etc"===t?a[t]:a[t].sort(),o=[],i=0;it.t(a).toString().replace(/_/g," ")}}fetch("/static/en.json?COMMIT_HASH").then((a=>a.json())).then((a=>{const e=reactive(createI18n({locale:"en",fallbackLocale:"en",messages:{en:a.en}}));createApp({i18n:e,languages:languages,RegionItem:RegionItem,regions:regions,locations:locations,licenseData:licenseData,licenseApp:licenseApp,Credits:Credits,hostname:null,title:null,config:{hasp:null,wifi:null,mqtt:null,http:null,gui:null,gpio:null,debug:null,time:null,ota:null},info:null,files:null,show:null,t(a){return this.i18n.t(a)},fetchConfig(a){fetch("/api/config/"+a+"/").then((a=>a.json())).then((e=>{this.config[a]=e,this.show=a,document.title=a}))},submitConfig(){let a=this.show;fetch("/api/config/"+a+"/",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(this.config[a])}).then((a=>a.json())).then((e=>{this.config[a]=e,window.history.pushState({},"","/config/"),window.dispatchEvent(new Event("popstate"))}))},submitOldConfig(a){fetch("/api/config/"+a+"/",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(this.config[a])}).then((a=>a.json())).then((a=>{window.location.href="/config"}))},fetchLang(a){fetch("/static/"+a+".json?COMMIT_HASH").then((a=>a.json())).then((e=>{let t=e[a]?e[a]:{};this.i18n.setLocaleMessage(a,t),this.i18n.changeLocale(a)}))},fetchInfo(){fetch("/api/info/").then((a=>a.json())).then((a=>{this.info=a,this.show="info",document.title="Info"}))},fetchAbout(){fetch("/api/credits/").then((a=>a.json())).then((a=>{this.licenseData=a,this.show="about",document.title="About"}))},showPage(a){this.show=a,document.title=a,""!=a&&(a+="/")},showInfo(){this.fetchInfo(),document.title="Info"},showConfig(a){this.fetchConfig(a),document.title=a},showEditor(){fetch("/api/files/").then((a=>a.json())).then((a=>{this.files=a,this.show="edit";var e=document.getElementsByClassName("container__editor")[0];e&&(e.style.display="flex"),document.title="Editor"}))},handleLocation(a,e){const t={"/":()=>{this.showPage("")},"/hasp.htm":()=>{this.showPage("")},"/config/":()=>{this.showPage("config")},"/config/hasp/":()=>{this.showConfig("hasp")},"/config/wifi/":()=>{this.showConfig("wifi")},"/config/http/":()=>{this.showConfig("http")},"/config/mqtt/":()=>{this.showConfig("mqtt")},"/config/gui/":()=>{this.showConfig("gui")},"/config/ftp/":()=>{this.showConfig("ftp")},"/config/time/":()=>{this.showConfig("time")},"/config/debug/":()=>{this.showConfig("debug")},"/config/reset/":()=>{this.showPage("reset")},"/firmware/":()=>{this.showConfig("ota")},"/info/":()=>{this.showInfo()},"/screenshot/":()=>{this.showPage("screenshot")},"/about/":()=>{this.fetchAbout()},"/edit/":()=>{this.showEditor()},"/edit":()=>{},"/static/editor.htm":()=>{},"/reboot/":()=>{this.showPage("reboot")}};"function"==typeof t[a]?t[a]():"/"!==a.slice(-1)&&"function"==typeof t[a+"/"]?t[a+"/"]():t["/"];const n=document.getElementsByClassName("container__editor")[0];n&&(n.style.display=a.includes("/edit")?"flex":"none"),window.scrollTo({top:e})},mounted(){let a=decodeURIComponent(document.cookie).split(";");for(let e=0;e{const e=window.location.pathname;var t=a.state,n=0;t&&(n=t.scrollTop),this.handleLocation(e,n)};const e=window.location.pathname;this.handleLocation(e,0)},route(a){(a=a||window.event).preventDefault();const e=a.currentTarget.href||a.target.parentNode.href,t=new URL(e).pathname;if(window.location.pathname!=t){var n={path:window.location.href||a.target.href,scrollTop:document.body.scrollTop};window.history.replaceState(n,"",document.location.pathname),n={path:window.location.href,scrollTop:0},window.history.pushState(n,"",t),window.dispatchEvent(new Event("popstate"))}},goto(a){if(window.location.pathname!=a){var e={path:window.location.href,scrollTop:document.body.scrollTop};window.history.replaceState(e,"",document.location.pathname),e={path:window.location.href,scrollTop:0},window.history.pushState(e,"",a),window.dispatchEvent(new Event("popstate"))}},ref(a){},aref(a){setTimeout((function(){}),1e3*a)},upd(a){var e=(new Date).getTime();document.getElementById("bmp").src="/screenshot?a="+a+"&q="+e}}).directive("t",(({el:a,get:t,effect:n})=>n((()=>a.textContent=e.t(t()))))).directive("ts",(({el:a,get:t,effect:n})=>n((()=>a.textContent=e.t(t()).replace(/_/g," "))))).mount()})); \ No newline at end of file +import{createApp,reactive,createI18n}from"/static/petite-vue.hasp.js?COMMIT_HASH";const languages=[{code:"en",name:"English"},{code:"nl",name:"Nederlands"},{code:"fr",name:"Français"}];var locations={af:["Abidjan","Algiers","Bissau","Cairo","Casablanca","El_Aaiun","Johannesburg","Juba","Khartoum","Lagos","Maputo","Monrovia","Nairobi","Ndjamena","Sao_Tome","Tripoli","Tunis","Windhoek","Cape_Verde","Mauritius"],eu:["Ceuta","Danmarkshavn","Nuuk","Scoresbysund","Thule","Anadyr","Barnaul","Chita","Irkutsk","Kamchatka","Khandyga","Krasnoyarsk","Magadan","Novokuznetsk","Novosibirsk","Omsk","Sakhalin","Srednekolymsk","Tomsk","Ust-Nera","Vladivostok","Yakutsk","Yekaterinburg","Azores","Canary","Faroe","Madeira","Andorra","Astrakhan","Athens","Belgrade","Berlin","Brussels","Bucharest","Budapest","Chisinau","Dublin","Gibraltar","Helsinki","Istanbul","Kaliningrad","Kirov","Kyiv","Lisbon","London","Madrid","Malta","Minsk","Moscow","Paris","Prague","Riga","Rome","Samara","Saratov","Sofia","Tallinn","Tirane","Ulyanovsk","Vienna","Vilnius","Volgograd","Warsaw","Zurich"],as:["Almaty","Amman","Aqtau","Aqtobe","Ashgabat","Atyrau","Baghdad","Baku","Bangkok","Beirut","Bishkek","Choibalsan","Colombo","Damascus","Dhaka","Dili","Dubai","Dushanbe","Famagusta","Gaza","Hebron","Ho_Chi_Minh","Hong_Kong","Hovd","Jakarta","Jayapura","Jerusalem","Kabul","Karachi","Kathmandu","Kolkata","Kuching","Macau","Makassar","Manila","Nicosia","Oral","Pontianak","Pyongyang","Qatar","Qostanay","Qyzylorda","Riyadh","Samarkand","Seoul","Shanghai","Singapore","Taipei","Tashkent","Tbilisi","Tehran","Thimphu","Tokyo","Ulaanbaatar","Urumqi","Yangon","Yerevan","Chagos","Maldives"],au:["Perth","Eucla","Adelaide","Broken_Hill","Darwin","Brisbane","Hobart","Lindeman","Melbourne","Sydney","Lord_Howe"],na:["Adak","Anchorage","Bahia_Banderas","Barbados","Belize","Boise","Cambridge_Bay","Cancun","Chicago","Chihuahua","Ciudad_Juarez","Costa_Rica","Dawson","Dawson_Creek","Denver","Detroit","Edmonton","El_Salvador","Fort_Nelson","Glace_Bay","Goose_Bay","Grand_Turk","Guatemala","Halifax","Havana","Hermosillo","Indiana/Indianapolis","Indiana/Knox","Indiana/Marengo","Indiana/Petersburg","Indiana/Tell_City","Indiana/Vevay","Indiana/Vincennes","Indiana/Winamac","Inuvik","Iqaluit","Jamaica","Juneau","Kentucky/Louisville","Kentucky/Monticello","Los_Angeles","Managua","Martinique","Matamoros","Mazatlan","Menominee","Merida","Metlakatla","Mexico_City","Miquelon","Moncton","Monterrey","New_York","Nome","North_Dakota/Beulah","North_Dakota/Center","North_Dakota/New_Salem","Ojinaga","Panama","Phoenix","Port-au-Prince","Puerto_Rico","Rankin_Inlet","Regina","Resolute","Santo_Domingo","Sitka","St_Johns","Swift_Current","Tegucigalpa","Tijuana","Toronto","Vancouver","Whitehorse","Winnipeg","Yakutat","Yellowknife","Bermuda","Honolulu"],sa:["Araguaina","Argentina/Buenos_Aires","Argentina/Catamarca","Argentina/Cordoba","Argentina/Jujuy","Argentina/La_Rioja","Argentina/Mendoza","Argentina/Rio_Gallegos","Argentina/Salta","Argentina/San_Juan","Argentina/San_Luis","Argentina/Tucuman","Argentina/Ushuaia","Asuncion","Bahia","Belem","Boa_Vista","Bogota","Campo_Grande","Caracas","Cayenne","Cuiaba","Eirunepe","Fortaleza","Guayaquil","Guyana","La_Paz","Lima","Maceio","Manaus","Montevideo","Noronha","Paramaribo","Porto_Velho","Punta_Arenas","Recife","Rio_Branco","Santarem","Santiago","Sao_Paulo","Palmer","South_Georgia","Stanley","Easter","Galapagos"],at:["Cape_Verde","Canary","Faroe","Madeira","Azores","Bermuda","South_Georgia","Stanley"],in:["Mauritius","Maldives","Chagos"],pa:["Palau","Guam","Port_Moresby","Bougainville","Efate","Guadalcanal","Kosrae","Norfolk","Noumea","Auckland","Fiji","Kwajalein","Nauru","Tarawa","Chatham","Apia","Fakaofo","Kanton","Tongatapu","Kiritimati","Pitcairn","Gambier","Marquesas","Rarotonga","Tahiti","Niue","Pago_Pago","Honolulu","Easter","Galapagos"],aq:["Troll","Mawson","Davis","Casey","Rothera","Macquarie","Palmer"],etc:["Greenwich","Universal","Zulu","GMT-14","GMT-13","GMT-12","GMT-11","GMT-10","GMT-9","GMT-8","GMT-7","GMT-6","GMT-5","GMT-4","GMT-3","GMT-2","GMT-1","GMT","GMT+1","GMT+2","GMT+3","GMT+4","GMT+5","GMT+6","GMT+7","GMT+8","GMT+9","GMT+10","GMT+11","GMT+12","UCT","UTC"]};const regions={etc:"Etc",af:"Africa",as:"Asia",au:"Australia",aq:"Antarctica",eu:"Europe",na:"America",sa:"America",at:"Atlantic",in:"Indian",pa:"Pacific"},licenseData=[],licenseApp=[{t:"Petite Vue",y:2021,a:"Yuxi (Evan) You",l:"mit"},{t:"Petite Vue I18n Lite",y:2021,a:"Front Labs",l:"mit"},{t:"Ace Editor",y:2010,a:"Ajax.org B.V.",r:1,l:"bsd"},{t:"MaterialDesign Icons",y:2022,a:"Google",l:"apache2"}];function Credits(a){return{$template:"#credit-template",model:a}}function RegionItem(a,o,e){return{$template:"#region-template",model:a,region:o,i18n:e,list(e){if(a[e]&&o[e]){for(var n="etc"===e?a[e]:a[e].sort(),t=[],i=0;ie.t(a).toString().replace(/_/g," ")}}fetch("/static/en.json?COMMIT_HASH").then((a=>a.json())).then((a=>{const o=reactive(createI18n({locale:"en",fallbackLocale:"en",messages:{en:a.en}}));createApp({i18n:o,languages:languages,RegionItem:RegionItem,regions:regions,locations:locations,licenseData:licenseData,licenseApp:licenseApp,Credits:Credits,hostname:null,title:null,config:{hasp:null,wifi:null,mqtt:null,http:null,gui:null,gpio:null,debug:null,time:null,ota:null},info:null,files:null,show:null,t(a){return this.i18n.t(a)},fetchConfig(a){fetch("/api/config/"+a+"/").then((a=>a.json())).then((o=>{this.config[a]=o,this.show=a,document.title=a}))},submitConfig(){let a=this.show;fetch("/api/config/"+a+"/",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(this.config[a])}).then((a=>a.json())).then((o=>{this.config[a]=o,window.history.pushState({},"","/config/"),window.dispatchEvent(new Event("popstate"))}))},submitOldConfig(a){fetch("/api/config/"+a+"/",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(this.config[a])}).then((a=>a.json())).then((a=>{window.location.href="/config"}))},fetchLang(a){fetch("/static/"+a+".json?COMMIT_HASH").then((a=>a.json())).then((o=>{let e=o[a]?o[a]:{};this.i18n.setLocaleMessage(a,e),this.i18n.changeLocale(a),console.log(a)}))},fetchInfo(){fetch("/api/info/").then((a=>a.json())).then((a=>{this.info=a,this.show="info",document.title="Info"}))},fetchAbout(){fetch("/api/credits/").then((a=>a.json())).then((a=>{this.licenseData=a,this.show="about",document.title="About"}))},showPage(a){console.log("showPage "+a),this.show=a,document.title=a,""!=a&&(a+="/")},showInfo(){console.log("showInfo"),this.fetchInfo(),document.title="Info"},showConfig(a){console.log("showConfig "+a),this.fetchConfig(a),document.title=a},showEditor(){console.log("showEditor"),fetch("/api/files/").then((a=>a.json())).then((a=>{this.files=a,this.show="edit";var o=document.getElementsByClassName("container__editor")[0];o&&(o.style.display="flex"),document.title="Editor"}))},handleLocation(a,o){const e={"/":()=>{this.showPage("")},"/hasp.htm":()=>{this.showPage("")},"/config/":()=>{this.showPage("config")},"/config/hasp/":()=>{this.showConfig("hasp")},"/config/wifi/":()=>{this.showConfig("wifi")},"/config/http/":()=>{this.showConfig("http")},"/config/mqtt/":()=>{this.showConfig("mqtt")},"/config/gui/":()=>{this.showConfig("gui")},"/config/ftp/":()=>{this.showConfig("ftp")},"/config/time/":()=>{this.showConfig("time")},"/config/debug/":()=>{this.showConfig("debug")},"/config/reset/":()=>{this.showPage("reset")},"/firmware/":()=>{this.showConfig("ota")},"/info/":()=>{this.showInfo()},"/screenshot/":()=>{this.showPage("screenshot")},"/about/":()=>{this.fetchAbout()},"/edit/":()=>{this.showEditor()},"/edit":()=>{},"/static/editor.htm":()=>{},"/reboot/":()=>{this.showPage("reboot")}};"function"==typeof e[a]?(console.log("Location: "+a),e[a]()):"/"!==a.slice(-1)&&"function"==typeof e[a+"/"]?(console.log("Location: "+a),e[a+"/"]()):(console.log("Not found: "+a),e["/"]);const n=document.getElementsByClassName("container__editor")[0];n&&(n.style.display=a.includes("/edit")?"flex":"none"),window.scrollTo({top:o})},mounted(){let a=decodeURIComponent(document.cookie).split(";");for(let o=0;o{const o=window.location.pathname;console.log("Popstate: "+o),console.log(a);var e=a.state,n=0;e&&(n=e.scrollTop),this.handleLocation(o,n)};const o=window.location.pathname;this.handleLocation(o,0),console.log("App Mounted")},route(a){console.log("Routing..."),a=a||window.event,console.log(a.target),a.preventDefault();const o=a.currentTarget.href||a.target.parentNode.href,e=new URL(o).pathname;if(window.location.pathname!=e){console.log("Push Route: "+e);var n={path:window.location.href||a.target.href,scrollTop:document.body.scrollTop};window.history.replaceState(n,"",document.location.pathname),n={path:window.location.href,scrollTop:0},window.history.pushState(n,"",e),window.dispatchEvent(new Event("popstate"))}},goto(a){if(console.log("Goto..."),window.location.pathname!=a){console.log("Push Route: "+a);var o={path:window.location.href,scrollTop:document.body.scrollTop};window.history.replaceState(o,"",document.location.pathname),o={path:window.location.href,scrollTop:0},window.history.pushState(o,"",a),window.dispatchEvent(new Event("popstate"))}},ref(a){},aref(a){setTimeout((function(){}),1e3*a)},upd(a){var o=(new Date).getTime();document.getElementById("bmp").src="/screenshot?a="+a+"&q="+o}}).directive("t",(({el:a,get:e,effect:n})=>n((()=>a.textContent=o.t(e()))))).directive("ts",(({el:a,get:e,effect:n})=>n((()=>a.textContent=o.t(e()).replace(/_/g," "))))).mount(),console.log("JS Loaded...")})); \ No newline at end of file diff --git a/data/script.js b/data/script.js index 9a9fcc6f..541761af 100644 --- a/data/script.js +++ b/data/script.js @@ -1,133 +1 @@ -function aref(e) { - setTimeout(function () { - ref(""); - }, 1e3 * e); -} -function upd(e) { - var t = new Date().getTime(); - return (document.getElementById("bmp").src = "?a=" + e + "&q=" + t), !1; -} -async function ref(e) { - var t = new Date().getTime(); - (await fetch("/screenshot?d=" + t + "&a=" + e)).ok ? upd(e) : aref(2); -} -function ihtm(id, html) { - if (obj = document.getElementById(id)) - obj.innerHTML = html; -} -function about() { - ihtm("lic",'

openHASP

Copyright© 2019-2022 Francis Van Roie
MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

'); - ihtm("pkg","

Based on the previous work of the following open source developers:

HASwitchPlate

Copyright© 2019 Allen Derusha allen @derusha.org
MIT License

LVGL

Copyright© 2021 LVGL Kft
MIT License

LovyanGFX

Copyright© 2020 lovyan03 (https://github.com/lovyan03) All rights reserved.
FreeBSD License

TFT_eSPI

Copyright© 2020 Bodmer (https://github.com/Bodmer) All rights reserved.
FreeBSD License

Adafruit_GFX

Copyright© 2012 Adafruit Industries. All rights reserved
BSD License

ArduinoJson

Copyright© 2014-2021 Benoit BLANCHON
MIT License

PubSubClient

Copyright© 2008-2015 Nicholas O'Leary
MIT License

ArduinoLog

Copyright© 2017,2018 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, dhylands, Josha blemasle, mfalkvidd
MIT License

QR Code generator

Copyright© Project Nayuki
MIT License

SimpleFTPServer

Copyright© 2017 Renzo Mischianti www.mischianti.org All right reserved.
MIT License

AceButton

Copyright© 2018 Brian T. Park
MIT License

"); -} -function handleSubmit(e) { - e.preventDefault(); - const t = new FormData(e.target), - o = Object.fromEntries(t.entries()); - console.log({ value: o }); -} -function info2() { - try { - data = JSON.parse(this.response); - var e = ""; - for (let t in data) { - e += ``; - for (let o in data[t]) - e += ``; - } - (e += "
${t}
${o}: ${data[t][o]}
"), (document.getElementById("info").innerHTML = e); - } catch (e) { - console.log('invalid json'); - } -} -function loader(e, t, o) { - window.addEventListener("load", function () { - var n = new XMLHttpRequest(); - n.addEventListener("load", o), n.open(e, t), n.send(); - }); -} -function info() { - if (obj = document.getElementById("info")) { - var n = new XMLHttpRequest(); - n.addEventListener("load", info2), n.open("GET", "/api/info/"), n.send(); - } -} -function fill() { - try { - data = JSON.parse(this.response); - for (const form of document.forms) populate(form, data); - } catch (e) { - console.log('invalid json'); - } -} -function filler(e, t) { - window.addEventListener("load", function () { - var o = new XMLHttpRequest(); - o.addEventListener("load", fill), o.open(e, t), o.send(); - }); -} -function filler2(e, t) { - var o = new XMLHttpRequest(); - o.addEventListener("load", fill), o.open(e, t), o.send(); -} -function forms() { - document.querySelectorAll("form").forEach(function(f) { - console.log(f.id); - filler2("GET", "/api/config/" + f.id + "/"); - }); -} -function populate(e, t, o) { - for (var n in t) - if (t.hasOwnProperty(n)) { - var r = n, - i = t[n]; - if ( - (void 0 === i && (i = ""), - null === i && (i = ""), - void 0 !== o && (r = o + "[" + n + "]"), - i.constructor === Array) - ) - r += "[]"; - else if ("object" == typeof i) { - populate(e, i, r); - continue; - } - var a = e.elements.namedItem(r); - if (a) - switch (a.type || a[0].type) { - default: - a.value = i; - break; - case "radio": - for ( - var s = i.constructor === Array ? i : [i], c = 0; - c < a.length; - c++ - ) - a[c].checked = s.indexOf(Number(a[c].value)) > -1; - break; - case "checkbox": - (s = i.constructor === Array ? i : [i]), - (a.checked = s.indexOf(Number(a.value)) > -1); - break; - case "select-multiple": - s = i.constructor === Array ? i : [i]; - for (var p = 0; p < a.options.length; p++) - a.options[p].selected = s.indexOf(a.options[p].value) > -1; - break; - case "select": - case "select-one": - a.value = i.toString() || i; - break; - case "date": - a.value = new Date(i).toISOString().split("T")[0]; - } - } -} - - -window.addEventListener('load', (event) => { - // console.log('The page has fully loaded'); - forms(); - info(); - about(); -}); \ No newline at end of file +var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.15.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`

\n ${e}\n

`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))})); \ No newline at end of file diff --git a/data/static/edit.htm.gz b/data/static/edit.htm.gz index cbea9b3c1de02007dee1907d53edf91de06a210e..8ddca4a7d672f2b213bc2594cf0e803ee0e2fa0a 100644 GIT binary patch literal 1132 zcmV-y1e5z8iwFqxL-At*|7B!pbS`LgZ2+xS+iv4F5d9TZeb@wDNlDNEU9Y8H(iV%N zTNu08=YS?h7GsJO$dPO}$iH_;NsjN>qJ5D>&YYRyTn;t;Mi`Ep2BHdURZRUeQcN%M z7<5c)V4|4TfGpw_vkowiTP%|w;$c^_8uGZ4uxgCOIO0YlXwq6qfmJS`lN^$;cq_F; z$yDMvQ;^@13CFE$FmjgXafR5pNtSV;pIpk7X+^1+g_N5*V^3_IDLHo;w6g+u=M z?q1yAl;ydQM)iL03;-o6C`<$T!_S{*(eF}0^qY`q>@@3TQzi8>vY_(V;YNY00I0B) zh4R%$N4=18x9j3-U_o*gC#iW35y~t~>bk`iFeFOWYylYwzFXI7w9-Sz(v;MS6r|9@ z2Ni}qXHS50OBr>c%JEUi|HhUxt)=$nzO;=!X)G*?Ry`}}FbS)~A7P@6hW8B=q7(x3{%MCa&09pHgT2bs z6y*ncPP2Y{D>j-d$(Q+?-pkeFRiD@Ex0IplH^rB*eFXDX9qT9pAsw45U-j`TE3jhGh;6R)J literal 6707 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 JddFm1004d_^f~|l diff --git a/data/static/en.json.gz b/data/static/en.json.gz index 4c8f258b830a7625a075a340fef126a30feae784..69abbe80c1c975174cdf4ec2baab633b6cbf3bee 100644 GIT binary patch delta 16 Xcmey!`;nJjzMF&Ni}S~g?624WHva~W delta 16 Xcmey!`;nJjzMF%?@Z+nE?624WHJb)< diff --git a/data/static/main.js.gz b/data/static/main.js.gz index d5feb9cfe45258c859f13399ab4baf95ef2395b2..1db00d055cc202de49bf4131c7a2092c0fd625e2 100644 GIT binary patch literal 4136 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 KxEF}RBme-uKi;tb diff --git a/data/static/script.js.gz b/data/static/script.js.gz index 3fc28f3e34a95069787f59cebe072c725411a548..0bbc6fe8b30ec3a0a89a047a11f384b8e3c763c2 100644 GIT binary patch literal 4484 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 Wnv~`NVUFw<;QtR1fumt$F#rJR6T!y- literal 2268 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'); --trash: url('data:image/svg+xml,'); --download: url('data:image/svg+xml,'); + --upload: url('data:image/svg+xml,'); + --flash: url('data:image/svg+xml,'); --file: url('data:image/svg+xml,'); --dir: url('data:image/svg+xml,'); --diropen: url('data:image/svg+xml,'); @@ -17,8 +19,10 @@ --zip: url('data:image/svg+xml,'); --cmd: url('data:image/svg+xml,'); --css: url('data:image/svg+xml,'); + --ttf: url('data:image/svg+xml,'); --eye: url('data:image/svg+xml,'); --json: url('data:image/svg+xml,'); + --audio: url('data:image/svg+xml,'); } .fn:hover { @@ -57,12 +61,14 @@ .fa-browse { mask-image: var(--browse); -webkit-mask-image: var(--browse)} .fa-cog { mask-image: var(--cog); -webkit-mask-image: var(--cog)} .fa-download{ mask-image: var(--download); -webkit-mask-image: var(--download)} +.fa-upload { mask-image: var(--upload); -webkit-mask-image: var(--upload)} .fa-home { mask-image: var(--home); -webkit-mask-image: var(--home)} .fa-info { mask-image: var(--info); -webkit-mask-image: var(--info)} .fa-ota { mask-image: var(--ota); -webkit-mask-image: var(--ota)} .fa-shot { mask-image: var(--shot); -webkit-mask-image: var(--shot)} .fa-star { mask-image: var(--star); -webkit-mask-image: var(--star)} .fa-trash { mask-image: var(--trash); -webkit-mask-image: var(--trask)} +.fa-flash { mask-image: var(--flash); -webkit-mask-image: var(--flash)} .fa-file { mask-image: var(--file); -webkit-mask-image: var(--file)} .fa-dir { mask-image: var(--dir); -webkit-mask-image: var(--dir)} .fa-diropen { mask-image: var(--diropen); -webkit-mask-image: var(--diropen)} @@ -73,7 +79,9 @@ .fa-json { mask-image: var(--json); -webkit-mask-image: var(--json)} .fa-jsonl { mask-image: var(--json); -webkit-mask-image: var(--json)} .fa-image { mask-image: var(--image); -webkit-mask-image: var(--image)} +.fa-audio { mask-image: var(--audio); -webkit-mask-image: var(--audio)} .fa-html { mask-image: var(--html); -webkit-mask-image: var(--html)} +.fa-ttf { mask-image: var(--ttf); -webkit-mask-image: var(--ttf)} .nav-list { font-size: var(--fs-nav); @@ -455,6 +463,7 @@ a.foot:visited { justify-content: left; overflow-x: clip; overflow-y: scroll; + background-color: var(--treebg); /* Popout */ top: 0; @@ -479,8 +488,7 @@ a.foot:visited { /* Misc */ align-items: center; display: flex; - justify-content: center; - background-color: var(--grpbg) + background-color: #888; } .toolbar { text-align: center; @@ -519,9 +527,7 @@ a.foot:visited { #ctx > ul { padding-left: 0px; } -#ctx > ul > li, -.sub_div > ul > li { - cursor: pointer; +#ctx > ul > li { white-space: nowrap } #ctx > ul > li:hover { @@ -531,8 +537,7 @@ a.foot:visited { width: 3rem } #preview { - background-color: #888; - padding: 5px; + padding: 0.3rem; overflow: scroll; } #preview > img { @@ -550,10 +555,11 @@ a.foot:visited { width: 100%; line-height: 1.3rem; font-size: 0.95rem; - background-color: var(--treebg) } .download{background-image: var(--download)} +.upload{background-image: var(--upload)} .eye{background-image: var(--eye)} +.flash{background-image: var(--flash)} .file{background-image: var(--file)} .zip{background-image: var(--zip)} .css{background-image: var(--css)} @@ -561,6 +567,41 @@ a.foot:visited { .json{background-image: var(--json)} .jsonl{background-image: var(--json)} .image{background-image: var(--image)} +.audio{background-image: var(--audio)} .html{background-image: var(--html)} .dir{background-image: var(--dir)} .diropen{background-image: var(--diropen)} + + +#toast { + position: fixed; + bottom: 1rem; + right: 1.5rem; + display: grid; + align-items: end; + align-content: end; + gap: 1rem; +} + +.toast { + font-size: 1rem; + margin: 0; + font-weight: bold; + line-height: 1; + padding: 0.5em 1em; + background-color: lightblue; + animation: toastIt 3000ms cubic-bezier(0.785, 0.135, 0.15, 0.86) forwards; +} + +@keyframes toastIt { + 0%, + 100% { + transform: translateY(150%); + opacity: 0; + } + 10%, + 90% { + transform: translateY(0); + opacity: 1; + } +} diff --git a/src/sys/svc/hasp_http.cpp b/src/sys/svc/hasp_http.cpp index 75ccecf2..a72d94aa 100644 --- a/src/sys/svc/hasp_http.cpp +++ b/src/sys/svc/hasp_http.cpp @@ -80,16 +80,16 @@ extern const uint8_t SCRIPT_JS_GZ_START[] asm("_binary_data_static_script_js_gz_ extern const uint8_t SCRIPT_JS_GZ_END[] asm("_binary_data_static_script_js_gz_end"); extern const uint8_t LOGO_SVG_GZ_START[] asm("_binary_data_static_logo_svg_gz_start"); extern const uint8_t LOGO_SVG_GZ_END[] asm("_binary_data_static_logo_svg_gz_end"); -extern const uint8_t ACE_JS_GZ_START[] asm("_binary_data_static_ace_1_9_6_min_js_gz_start"); -extern const uint8_t ACE_JS_GZ_END[] asm("_binary_data_static_ace_1_9_6_min_js_gz_end"); extern const uint8_t PETITE_VUE_HASP_JS_GZ_START[] asm("_binary_data_static_petite_vue_hasp_js_gz_start"); extern const uint8_t PETITE_VUE_HASP_JS_GZ_END[] asm("_binary_data_static_petite_vue_hasp_js_gz_end"); extern const uint8_t MAIN_JS_GZ_START[] asm("_binary_data_static_main_js_gz_start"); extern const uint8_t MAIN_JS_GZ_END[] asm("_binary_data_static_main_js_gz_end"); extern const uint8_t EN_JSON_GZ_START[] asm("_binary_data_static_en_json_gz_start"); extern const uint8_t EN_JSON_GZ_END[] asm("_binary_data_static_en_json_gz_end"); -extern const uint8_t HASP_HTM_GZ_START[] asm("_binary_data_static_hasp_htm_gz_start"); -extern const uint8_t HASP_HTM_GZ_END[] asm("_binary_data_static_hasp_htm_gz_end"); +// extern const uint8_t HASP_HTM_GZ_START[] asm("_binary_data_static_hasp_htm_gz_start"); +// extern const uint8_t HASP_HTM_GZ_END[] asm("_binary_data_static_hasp_htm_gz_end"); +// extern const uint8_t ACE_JS_GZ_START[] asm("_binary_data_static_ace_1_9_6_min_js_gz_start"); +// extern const uint8_t ACE_JS_GZ_END[] asm("_binary_data_static_ace_1_9_6_min_js_gz_end"); #endif // CONFIG_IDF_TARGET_ESP32 @@ -1218,22 +1218,31 @@ static void handleFileDelete() { if(!http_is_authenticated(F("filedelete"))) return; - char mimetype[16]; - snprintf_P(mimetype, sizeof(mimetype), PSTR("text/plain")); + const char mimetype[] = "text/plain"; - if(webServer.args() == 0) { - return webServer.send_P(500, mimetype, PSTR("BAD ARGS")); + if(!webServer.hasArg("path")) { + return webServer.send(500, mimetype, "BAD ARGS"); } - String path = webServer.arg(0); + String path = webServer.arg("path"); LOG_TRACE(TAG_HTTP, F("handleFileDelete: %s"), path.c_str()); if(path == "/") { - return webServer.send_P(500, mimetype, PSTR("BAD PATH")); + return webServer.send(500, mimetype, "BAD PATH"); } if(!HASP_FS.exists(path)) { - return webServer.send_P(404, mimetype, PSTR("FileNotFound")); + return webServer.send(404, mimetype, "FileNotFound"); + } + bool result; + if(path.endsWith("/")) { + path.remove(path.length() - 1); + result = HASP_FS.rmdir(path); + } else { + result = HASP_FS.remove(path); + } + if(result) { + webServer.send(200, mimetype, String("")); + } else { + webServer.send(405, mimetype, "RemoveFailed"); } - HASP_FS.remove(path); - webServer.send(200, mimetype, String("")); } static void handleFileCreate() @@ -2275,16 +2284,16 @@ static inline int handleFirmwareFile(String path) #if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) if(path == F("/edit.htm")) { return http_send_static_gzip_file(EDIT_HTM_GZ_START, EDIT_HTM_GZ_END, contentType); - } else if(path == F("/hasp.htm")) { // 39 kB - return http_send_static_gzip_file(HASP_HTM_GZ_START, HASP_HTM_GZ_END, contentType); + // } else if(path == F("/hasp.htm")) { // 39 kB + // return http_send_static_gzip_file(HASP_HTM_GZ_START, HASP_HTM_GZ_END, contentType); } else if(path == F("/logo.svg")) { // 300 bytes return http_send_static_gzip_file(LOGO_SVG_GZ_START, LOGO_SVG_GZ_END, contentType); } else if(path == F("/style.css")) { // 11 kB return http_send_static_gzip_file(STYLE_CSS_GZ_START, STYLE_CSS_GZ_END, contentType); } else if(path == F("/vars.css")) { return http_send_static_file(HTTP_VARS_CSS, HTTP_VARS_CSS + sizeof(HTTP_VARS_CSS) - 1, contentType); - // } else if(path == F("/script.js")) { // 3 kB - // return http_send_static_gzip_file(SCRIPT_JS_GZ_START, SCRIPT_JS_GZ_END, contentType); + } else if(path == F("/script.js")) { // 3 kB + return http_send_static_gzip_file(SCRIPT_JS_GZ_START, SCRIPT_JS_GZ_END, contentType); } else if(path == F("/en.json")) { // 2 kB return http_send_static_gzip_file(EN_JSON_GZ_START, EN_JSON_GZ_END, contentType); } else if(path == F("/main.js")) { // 9 kB @@ -2292,8 +2301,8 @@ static inline int handleFirmwareFile(String path) } else if(path == F("/petite-vue.hasp.js")) { // 9 kB return http_send_static_gzip_file(PETITE_VUE_HASP_JS_GZ_START, PETITE_VUE_HASP_JS_GZ_END, contentType); #if ESP_FLASH_SIZE > 4 - } else if(path == F("/ace.js")) { // 96 kB - return http_send_static_gzip_file(ACE_JS_GZ_START, ACE_JS_GZ_END, contentType); + // } else if(path == F("/ace.js")) { // 96 kB + // return http_send_static_gzip_file(ACE_JS_GZ_START, ACE_JS_GZ_END, contentType); #endif } #endif // ARDUINO_ARCH_ESP32 diff --git a/tools/auto_firmware_version.py b/tools/auto_firmware_version.py index f0a3d901..d4fd4f2e 100644 --- a/tools/auto_firmware_version.py +++ b/tools/auto_firmware_version.py @@ -48,3 +48,21 @@ with open("data/main.js", "r", encoding="utf-8") as f: html = html.replace("COMMIT_HASH", commit_hash) with gzip.open('data/static/main.js.gz', 'wb') as f: f.write(html.encode('utf-8')) + +with open("data/script.js", "r", encoding="utf-8") as f: + html=f.read() +html = html.replace("COMMIT_HASH", commit_hash) +with gzip.open('data/static/script.js.gz', 'wb') as f: + f.write(html.encode('utf-8')) + +with open("data/en.json", "r", encoding="utf-8") as f: + html=f.read() +html = html.replace("COMMIT_HASH", commit_hash) +with gzip.open('data/static/en.json.gz', 'wb') as f: + f.write(html.encode('utf-8')) + +with open("data/style.css", "r", encoding="utf-8") as f: + html=f.read() +html = html.replace("COMMIT_HASH", commit_hash) +with gzip.open('data/static/style.css.gz', 'wb') as f: + f.write(html.encode('utf-8')) diff --git a/tools/esp_merge_bin.py b/tools/esp_merge_bin.py index 6cada46c..4c484f78 100644 --- a/tools/esp_merge_bin.py +++ b/tools/esp_merge_bin.py @@ -58,10 +58,11 @@ def copy_merge_bins(source, target, env): mcu = board.get("build.mcu", "esp32") bootloader = "{}tools{}sdk{}{}{}bin{}bootloader_{}_{}.bin".format(FRAMEWORK_DIR, os.path.sep, os.path.sep, mcu, os.path.sep, os.path.sep, flash_mode, flash_freq) + # # if not os.path.isfile(bootloader): + # # bootloader = "{}tools{}sdk{}bin{}bootloader_dio_40m.bin".format(FRAMEWORK_DIR, os.path.sep, os.path.sep, os.path.sep, os.path.sep, os.path.sep) # if not os.path.isfile(bootloader): - # bootloader = "{}tools{}sdk{}bin{}bootloader_dio_40m.bin".format(FRAMEWORK_DIR, os.path.sep, os.path.sep, os.path.sep, os.path.sep, os.path.sep) - if not os.path.isfile(bootloader): - bootloader = "{}tools{}sdk{}{}{}bin{}bootloader_{}_{}.bin".format(FRAMEWORK_DIR, os.path.sep, os.path.sep, mcu, os.path.sep, os.path.sep, flash_mode, flash_freq) + # bootloader = "{}tools{}sdk{}{}{}bin{}bootloader_{}_{}.bin".format(FRAMEWORK_DIR, os.path.sep, os.path.sep, mcu, os.path.sep, os.path.sep, flash_mode, flash_freq) + bootloader = str(target[0]).replace('firmware.bin','bootloader.bin') bootloader_location = '0x1000' if (mcu == 'esp32s3'): bootloader_location = '0x0000' @@ -94,7 +95,10 @@ def copy_merge_bins(source, target, env): print(f_flash) print(flash_mode) - process = subprocess.Popen(['python', 'tools/esptool_with_merge_bin.py', '--chip', mcu, 'merge_bin', '--output', firmware_dst, '--flash_mode', 'dio', '--flash_size', flash_size, '--flash_freq', flash_freq, bootloader_location, bootloader, '0x8000', partitions, '0xe000', boot_app0, '0x10000', firmware_src], + # esptool = 'tools/esptool_with_merge_bin.py' + esptool = '{}{}esptool.py'.format(platform.get_package_dir("tool-esptoolpy"),os.path.sep) + print(esptool) + process = subprocess.Popen(['python', esptool, '--chip', mcu, 'merge_bin', '--output', firmware_dst, '--flash_mode', 'dio', '--flash_size', flash_size, '--flash_freq', flash_freq, bootloader_location, bootloader, '0x8000', partitions, '0xe000', boot_app0, '0x10000', firmware_src], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() diff --git a/tools/minifiy.py b/tools/minifiy.py new file mode 100644 index 00000000..1c83e7b2 --- /dev/null +++ b/tools/minifiy.py @@ -0,0 +1,69 @@ +import gzip, minify_html + +# options = { +# "do_not_minify_doctype": True, +# "ensure_spec_compliant_unquoted_attribute_values": False, +# "keep_closing_tags": True, +# "keep_html_and_head_opening_tags": True, +# "keep_spaces_between_attributes": True, +# "keep_comments": True, +# "minify_css": True, +# "minify_js": True, +# "remove_bangs": False, +# "remove_processing_instructions": False +# } + +# with open("data/script.js", "r") as f: +# html=f.read() +# minified = minify_html.minify(html, options) +# with gzip.open('data/static/script.js.gz', 'wb') as f: +# f.write(minified.encode('utf-8')) + +# with open("data/editor.htm", "r") as f: +# html=f.read() +# # minified = minify_html.minify(html, options) +# with gzip.open('data/static/edit.htm.gz', 'wb') as f: +# f.write(html.encode('utf-8')) +# with open('data/edit.htm', 'wb') as f: +# f.write(html.encode('utf-8')) + + +# with open("data/style.css", "r") as f: +# html=f.read() +# with gzip.open('data/static/style.css.gz', 'wb') as f: +# f.write(html.encode('utf-8')) +# minified = minify_html.minify(html, options).replace('"id=mdi-','" id=mdi-') +# with open('data/style.min.css', 'wb') as f: +# f.write(minified.encode('utf-8')) + + +# with open("data/hasp.htm", "r") as f: +# html=f.read() +# minified = minify_html.minify(html, options) +# with gzip.open('data/static/hasp.htm.gz', 'wb') as f: +# f.write(minified.encode('utf-8')) + + + +# with open("data/en.json", "r") as f: +# html=f.read() +# minified = minify_html.minify(html, options) +# with gzip.open('data/static/en.json.gz', 'wb') as f: +# f.write(minified.encode('utf-8')) + +# with open("data/nl.json", "r") as f: +# html=f.read() +# minified = minify_html.minify(html, options) +# with gzip.open('data/static/nl.json.gz', 'wb') as f: +# f.write(minified.encode('utf-8')) + +# with open("data/fr.json", "r") as f: +# html=f.read() +# minified = minify_html.minify(html, options) +# with gzip.open('data/static/fr.json.gz', 'wb') as f: +# f.write(minified.encode('utf-8')) + +# with open("data/main.js", "r") as f: +# html=f.read() +# with gzip.open('data/static/main.js.gz', 'wb') as f: +# f.write(html.encode('utf-8')) diff --git a/user_setups/esp32/_esp32.ini b/user_setups/esp32/_esp32.ini index 727dce69..5b969c98 100644 --- a/user_setups/esp32/_esp32.ini +++ b/user_setups/esp32/_esp32.ini @@ -23,11 +23,11 @@ board_build.embed_files = data/cert/x509_crt_bundle.bin ; -- new dynamic website files ------------------- data/static/logo.svg.gz - data/static/ace.1.9.6.min.js.gz + ; data/static/ace.1.9.6.min.js.gz data/static/petite-vue.hasp.js.gz data/static/main.js.gz data/static/en.json.gz - data/static/hasp.htm.gz + ; data/static/hasp.htm.gz build_flags = ${env.build_flags}