From 38aac577b4ea1d76218e91d9b8c19a8fc662d439 Mon Sep 17 00:00:00 2001 From: Alois Klingler Date: Thu, 1 Aug 2024 20:53:52 +0200 Subject: [PATCH] v24.8.1-0.2.2 based on v24.8.1 --- docs/DeviceProfiles/wt32-eth01.json | 30 +- include/MqttHandleHass.h | 2 +- .../commands/ActivePowerControlCommand.cpp | 2 +- lib/Hoymiles/src/inverters/HMS_2CH.cpp | 2 +- lib/Hoymiles/src/inverters/README.md | 2 +- lib/Hoymiles/src/parser/AlarmLogParser.cpp | 12 +- lib/Hoymiles/src/parser/DevInfoParser.cpp | 1 + platformio.ini | 9 +- src/MqttHandleHass.cpp | 7 +- src/MqttHandleInverter.cpp | 16 +- src/NetworkSettings.cpp | 3 + src/WebApi_limit.cpp | 4 +- src/WebApi_webapp.cpp | 2 +- webapp/.prettierrc.json | 8 + webapp/env.d.ts | 8 + webapp/package.json | 24 +- webapp/src/App.vue | 4 +- webapp/src/components/BasePage.vue | 40 +- webapp/src/components/BootstrapAlert.vue | 51 ++- webapp/src/components/CardElement.vue | 10 +- webapp/src/components/DevInfo.vue | 27 +- webapp/src/components/EventLog.vue | 2 +- webapp/src/components/FirmwareInfo.vue | 46 +- webapp/src/components/FormFooter.vue | 6 +- webapp/src/components/FsInfo.vue | 10 +- webapp/src/components/GridProfile.vue | 94 ++-- webapp/src/components/HeapDetails.vue | 12 +- webapp/src/components/HintView.vue | 16 +- webapp/src/components/InputElement.vue | 61 ++- webapp/src/components/InputSerial.vue | 45 +- .../src/components/InterfaceNetworkInfo.vue | 3 +- webapp/src/components/InverterChannelInfo.vue | 23 +- webapp/src/components/InverterTotalInfo.vue | 30 +- webapp/src/components/LocaleSwitcher.vue | 16 +- webapp/src/components/MemoryInfo.vue | 30 +- webapp/src/components/ModalDialog.vue | 32 +- webapp/src/components/NavBar.vue | 119 +++-- webapp/src/components/PinInfo.vue | 21 +- webapp/src/components/RadioInfo.vue | 89 ++-- webapp/src/components/StatusBadge.vue | 22 +- webapp/src/components/ThemeSwitcher.vue | 65 +-- webapp/src/components/WifiApInfo.vue | 6 +- webapp/src/components/WifiStationInfo.vue | 8 +- webapp/src/emitter.d.ts | 2 +- webapp/src/locales/index.ts | 45 +- webapp/src/main.ts | 34 +- webapp/src/plugins/bootstrap.ts | 4 +- webapp/src/router/index.ts | 196 ++++---- webapp/src/scss/styles.scss | 4 +- webapp/src/types/Config.ts | 2 +- webapp/src/types/DeviceConfig.ts | 2 +- webapp/src/types/EventlogStatus.ts | 2 +- webapp/src/types/GridProfileRawdata.ts | 2 +- webapp/src/types/GridProfileStatus.ts | 2 +- webapp/src/types/LimitStatus.ts | 2 +- webapp/src/types/LiveDataStatus.ts | 4 +- webapp/src/types/NetworkStatus.ts | 2 +- webapp/src/types/NtpConfig.ts | 2 +- webapp/src/types/NtpStatus.ts | 4 +- webapp/src/types/PinMapping.ts | 6 +- webapp/src/types/SecurityConfig.ts | 2 +- webapp/src/utils/authentication.ts | 45 +- webapp/src/utils/index.ts | 9 +- webapp/src/utils/time.ts | 13 +- webapp/src/views/AboutView.vue | 131 ++++-- webapp/src/views/ConfigAdminView.vue | 92 ++-- webapp/src/views/ConsoleInfoView.vue | 59 ++- webapp/src/views/DeviceAdminView.vue | 288 ++++++++---- webapp/src/views/DtuAdminView.vue | 132 +++--- webapp/src/views/FirmwareUpgradeView.vue | 93 ++-- webapp/src/views/HomeView.vue | 423 +++++++++++------- webapp/src/views/InverterAdminView.vue | 299 +++++++++---- webapp/src/views/LoginView.vue | 68 +-- webapp/src/views/MaintenanceRebootView.vue | 32 +- webapp/src/views/MqttAdminView.vue | 315 ++++++++----- webapp/src/views/MqttInfoView.vue | 79 +++- webapp/src/views/NetworkAdminView.vue | 146 +++--- webapp/src/views/NetworkInfoView.vue | 21 +- webapp/src/views/NtpAdminView.vue | 147 +++--- webapp/src/views/NtpInfoView.vue | 30 +- webapp/src/views/SecurityAdminView.vue | 75 ++-- webapp/src/views/SystemInfoView.vue | 54 +-- webapp/yarn.lock | 361 ++++++++------- webapp_dist/js/app.js.gz | Bin 183175 -> 183236 bytes 84 files changed, 2596 insertions(+), 1653 deletions(-) create mode 100644 webapp/.prettierrc.json diff --git a/docs/DeviceProfiles/wt32-eth01.json b/docs/DeviceProfiles/wt32-eth01.json index 8af112832..b7f5cbdd4 100644 --- a/docs/DeviceProfiles/wt32-eth01.json +++ b/docs/DeviceProfiles/wt32-eth01.json @@ -22,6 +22,34 @@ "clk_mode": 0 } }, + { + "name": "WT32-ETH01 with SH1106", + "links": [ + {"name": "Datasheet", "url": "http://www.wireless-tag.com/portfolio/wt32-eth01/"} + ], + "nrf24": { + "miso": 4, + "mosi": 2, + "clk": 32, + "irq": 33, + "en": 14, + "cs": 15 + }, + "eth": { + "enabled": true, + "phy_addr": 1, + "power": 16, + "mdc": 23, + "mdio": 18, + "type": 0, + "clk_mode": 0 + }, + "display": { + "type": 3, + "data": 5, + "clk": 17 + } + }, { "name": "WT32-ETH01 with SSD1306", "links": [ @@ -78,4 +106,4 @@ "clk": 17 } } -] \ No newline at end of file +] diff --git a/include/MqttHandleHass.h b/include/MqttHandleHass.h index a76cb0c7b..9ab746a30 100644 --- a/include/MqttHandleHass.h +++ b/include/MqttHandleHass.h @@ -63,7 +63,7 @@ class MqttHandleHassClass { void publishDtuBinarySensor(const char* name, const char* device_class, const char* category, const char* payload_on, const char* payload_off, const char* subTopic = ""); void publishInverterField(std::shared_ptr inv, const ChannelType_t type, const ChannelNum_t channel, const byteAssign_fieldDeviceClass_t fieldType, const bool clear = false); void publishInverterButton(std::shared_ptr inv, const char* caption, const char* icon, const char* category, const char* deviceClass, const char* subTopic, const char* payload); - void publishInverterNumber(std::shared_ptr inv, const char* caption, const char* icon, const char* category, const char* commandTopic, const char* stateTopic, const char* unitOfMeasure, const int16_t min = 1, const int16_t max = 100); + void publishInverterNumber(std::shared_ptr inv, const char* caption, const char* icon, const char* category, const char* commandTopic, const char* stateTopic, const char* unitOfMeasure, const int16_t min = 1, const int16_t max = 100, float step = 1.0); void publishInverterBinarySensor(std::shared_ptr inv, const char* caption, const char* subTopic, const char* payload_on, const char* payload_off); static void createInverterInfo(JsonDocument& doc, std::shared_ptr inv); diff --git a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp index b9e8eea26..dcd2370c1 100644 --- a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp +++ b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp @@ -85,7 +85,7 @@ bool ActivePowerControlCommand::handleResponse(const fragment_t fragment[], cons float ActivePowerControlCommand::getLimit() const { - const uint16_t l = (((uint16_t)_payload[12] << 8) | _payload[13]); + const float l = (((uint16_t)_payload[12] << 8) | _payload[13]); return l / 10; } diff --git a/lib/Hoymiles/src/inverters/HMS_2CH.cpp b/lib/Hoymiles/src/inverters/HMS_2CH.cpp index 4a700a9a9..4ad0157f5 100644 --- a/lib/Hoymiles/src/inverters/HMS_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_2CH.cpp @@ -42,7 +42,7 @@ bool HMS_2CH::isValidSerial(const uint64_t serial) { // serial >= 0x114400000000 && serial <= 0x1144ffffffff uint16_t preSerial = (serial >> 32) & 0xffff; - return preSerial == 0x1144; + return preSerial == 0x1144 || preSerial == 0x1143; } String HMS_2CH::typeName() const diff --git a/lib/Hoymiles/src/inverters/README.md b/lib/Hoymiles/src/inverters/README.md index 6d6104a20..8d913deb5 100644 --- a/lib/Hoymiles/src/inverters/README.md +++ b/lib/Hoymiles/src/inverters/README.md @@ -7,7 +7,7 @@ | HM_4CH | HM-1000/1200/1500-4T | 1161 | | HMS_1CH | HMS-300/350/400/450/500-1T | 1124 | | HMS_1CHv2 | HMS-500-1T v2 | 1125 | -| HMS_2CH | HMS-600/700/800/900/1000-2T | 1144 | +| HMS_2CH | HMS-600/700/800/900/1000-2T | 1143, 1144 | | HMS_4CH | HMS-1600/1800/2000-4T | 1164 | | HMT_4CH | HMT-1600/1800/2000-4T | 1361 | | HMT_6CH | HMT-1800/2250-6T | 1382 | diff --git a/lib/Hoymiles/src/parser/AlarmLogParser.cpp b/lib/Hoymiles/src/parser/AlarmLogParser.cpp index e08baf052..30b813647 100644 --- a/lib/Hoymiles/src/parser/AlarmLogParser.cpp +++ b/lib/Hoymiles/src/parser/AlarmLogParser.cpp @@ -28,15 +28,15 @@ ID Source Addr Target Addr Idx ? wcode ? Start End ? const std::array AlarmLogParser::_alarmMessages = { { { AlarmMessageType_t::ALL, 1, "Inverter start", "Wechselrichter gestartet", "L'onduleur a démarré" }, - { AlarmMessageType_t::ALL, 2, "Time calibration", "", "" }, + { AlarmMessageType_t::ALL, 2, "Time calibration", "Zeitabgleich", "" }, { AlarmMessageType_t::ALL, 3, "EEPROM reading and writing error during operation", "", "" }, { AlarmMessageType_t::ALL, 4, "Offline", "Offline", "Non connecté" }, - { AlarmMessageType_t::ALL, 11, "Grid voltage surge", "", "" }, - { AlarmMessageType_t::ALL, 12, "Grid voltage sharp drop", "", "" }, - { AlarmMessageType_t::ALL, 13, "Grid frequency mutation", "", "" }, - { AlarmMessageType_t::ALL, 14, "Grid phase mutation", "", "" }, - { AlarmMessageType_t::ALL, 15, "Grid transient fluctuation", "", "" }, + { AlarmMessageType_t::ALL, 11, "Grid voltage surge", "Netz: Überspannungsimpuls", "" }, + { AlarmMessageType_t::ALL, 12, "Grid voltage sharp drop", "Netz: Spannungseinbruch", "" }, + { AlarmMessageType_t::ALL, 13, "Grid frequency mutation", "Netz: Frequenzänderung", "" }, + { AlarmMessageType_t::ALL, 14, "Grid phase mutation", "Netz: Phasenänderung", "" }, + { AlarmMessageType_t::ALL, 15, "Grid transient fluctuation", "Netz: vorübergehende Schwankung", "" }, { AlarmMessageType_t::ALL, 36, "INV overvoltage or overcurrent", "", "" }, diff --git a/lib/Hoymiles/src/parser/DevInfoParser.cpp b/lib/Hoymiles/src/parser/DevInfoParser.cpp index c34ecb3f0..0c2e15e8d 100644 --- a/lib/Hoymiles/src/parser/DevInfoParser.cpp +++ b/lib/Hoymiles/src/parser/DevInfoParser.cpp @@ -62,6 +62,7 @@ const devInfo_t devInfo[] = { { { 0x10, 0x20, 0x71, ALL }, 500, "HMS-500-1T v2" }, // 02 { { 0x10, 0x21, 0x11, ALL }, 600, "HMS-600-2T" }, // 01 { { 0x10, 0x21, 0x41, ALL }, 800, "HMS-800-2T" }, // 00 + { { 0x10, 0x11, 0x41, ALL }, 800, "HMS-800-2T-LV" }, // 00 { { 0x10, 0x11, 0x51, ALL }, 900, "HMS-900-2T" }, // 01 { { 0x10, 0x21, 0x51, ALL }, 900, "HMS-900-2T" }, // 03 { { 0x10, 0x21, 0x71, ALL }, 1000, "HMS-1000-2T" }, // 05 diff --git a/platformio.ini b/platformio.ini index bce8c371f..f9e867dce 100644 --- a/platformio.ini +++ b/platformio.ini @@ -19,7 +19,7 @@ extra_configs = custom_ci_action = generic,generic_esp32,generic_esp32s3,generic_esp32s3_usb framework = arduino -platform = espressif32@6.7.0 +platform = espressif32@6.8.1 build_flags = -DPIOENV=\"$PIOENV\" @@ -27,6 +27,7 @@ build_flags = -D_TASK_THREAD_SAFE=1 -DCONFIG_ASYNC_TCP_EVENT_QUEUE_SIZE=128 -DCONFIG_ASYNC_TCP_QUEUE_SIZE=128 + -DEMC_TASK_STACK_SIZE=6400 -Wall -Wextra -Wunused -Wmisleading-indentation -Wduplicated-cond -Wlogical-op -Wnull-dereference ; Have to remove -Werror because of ; https://github.com/espressif/arduino-esp32/issues/9044 and @@ -38,10 +39,10 @@ build_unflags = -std=gnu++11 lib_deps = - mathieucarbou/ESP Async WebServer @ 2.10.8 - bblanchon/ArduinoJson @ 7.0.4 + mathieucarbou/ESPAsyncWebServer @ 3.1.2 + bblanchon/ArduinoJson @ 7.1.0 https://github.com/bertmelis/espMqttClient.git#v1.7.0 - nrf24/RF24 @ 1.4.8 + nrf24/RF24 @ 1.4.9 olikraus/U8g2 @ 2.35.19 buelowp/sunset @ 1.1.7 https://github.com/emelianov/modbus-esp8266#master diff --git a/src/MqttHandleHass.cpp b/src/MqttHandleHass.cpp index b286eaa23..67d264b26 100644 --- a/src/MqttHandleHass.cpp +++ b/src/MqttHandleHass.cpp @@ -73,8 +73,8 @@ void MqttHandleHassClass::publishConfig() publishInverterButton(inv, "Turn Inverter On", "mdi:power-plug", "config", "", "cmd/power", "1"); publishInverterButton(inv, "Restart Inverter", "", "config", "restart", "cmd/restart", "1"); - publishInverterNumber(inv, "Limit NonPersistent Relative", "mdi:speedometer", "config", "cmd/limit_nonpersistent_relative", "status/limit_relative", "%", 0, 100); - publishInverterNumber(inv, "Limit Persistent Relative", "mdi:speedometer", "config", "cmd/limit_persistent_relative", "status/limit_relative", "%", 0, 100); + publishInverterNumber(inv, "Limit NonPersistent Relative", "mdi:speedometer", "config", "cmd/limit_nonpersistent_relative", "status/limit_relative", "%", 0, 100, 0.1); + publishInverterNumber(inv, "Limit Persistent Relative", "mdi:speedometer", "config", "cmd/limit_persistent_relative", "status/limit_relative", "%", 0, 100, 0.1); publishInverterNumber(inv, "Limit NonPersistent Absolute", "mdi:speedometer", "config", "cmd/limit_nonpersistent_absolute", "status/limit_absolute", "W", 0, MAX_INVERTER_LIMIT); publishInverterNumber(inv, "Limit Persistent Absolute", "mdi:speedometer", "config", "cmd/limit_persistent_absolute", "status/limit_absolute", "W", 0, MAX_INVERTER_LIMIT); @@ -215,7 +215,7 @@ void MqttHandleHassClass::publishInverterButton(std::shared_ptr inv, const char* caption, const char* icon, const char* category, const char* commandTopic, const char* stateTopic, const char* unitOfMeasure, - const int16_t min, const int16_t max) + const int16_t min, const int16_t max, float step) { const String serial = inv->serialString(); @@ -243,6 +243,7 @@ void MqttHandleHassClass::publishInverterNumber( root["unit_of_meas"] = unitOfMeasure; root["min"] = min; root["max"] = max; + root["step"] = step; createInverterInfo(root, inv); diff --git a/src/MqttHandleInverter.cpp b/src/MqttHandleInverter.cpp index 624033e1c..d099b4443 100644 --- a/src/MqttHandleInverter.cpp +++ b/src/MqttHandleInverter.cpp @@ -183,7 +183,7 @@ void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessagePro char* strlimit = new char[len + 1]; memcpy(strlimit, payload, len); strlimit[len] = '\0'; - const int32_t payload_val = strtol(strlimit, NULL, 10); + const float payload_val = strtof(strlimit, NULL); delete[] strlimit; if (payload_val < 0) { @@ -193,17 +193,17 @@ void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessagePro if (!strcmp(setting, TOPIC_SUB_LIMIT_PERSISTENT_RELATIVE)) { // Set inverter limit relative persistent - MessageOutput.printf("Limit Persistent: %d %%\r\n", payload_val); + MessageOutput.printf("Limit Persistent: %.1f %%\r\n", payload_val); inv->sendActivePowerControlRequest(payload_val, PowerLimitControlType::RelativPersistent); } else if (!strcmp(setting, TOPIC_SUB_LIMIT_PERSISTENT_ABSOLUTE)) { // Set inverter limit absolute persistent - MessageOutput.printf("Limit Persistent: %d W\r\n", payload_val); + MessageOutput.printf("Limit Persistent: %.1f W\r\n", payload_val); inv->sendActivePowerControlRequest(payload_val, PowerLimitControlType::AbsolutPersistent); } else if (!strcmp(setting, TOPIC_SUB_LIMIT_NONPERSISTENT_RELATIVE)) { // Set inverter limit relative non persistent - MessageOutput.printf("Limit Non-Persistent: %d %%\r\n", payload_val); + MessageOutput.printf("Limit Non-Persistent: %.1f %%\r\n", payload_val); if (!properties.retain) { inv->sendActivePowerControlRequest(payload_val, PowerLimitControlType::RelativNonPersistent); } else { @@ -212,7 +212,7 @@ void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessagePro } else if (!strcmp(setting, TOPIC_SUB_LIMIT_NONPERSISTENT_ABSOLUTE)) { // Set inverter limit absolute non persistent - MessageOutput.printf("Limit Non-Persistent: %d W\r\n", payload_val); + MessageOutput.printf("Limit Non-Persistent: %.1f W\r\n", payload_val); if (!properties.retain) { inv->sendActivePowerControlRequest(payload_val, PowerLimitControlType::AbsolutNonPersistent); } else { @@ -221,8 +221,8 @@ void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessagePro } else if (!strcmp(setting, TOPIC_SUB_POWER)) { // Turn inverter on or off - MessageOutput.printf("Set inverter power to: %d\r\n", payload_val); - inv->sendPowerControlRequest(payload_val > 0); + MessageOutput.printf("Set inverter power to: %d\r\n", static_cast(payload_val)); + inv->sendPowerControlRequest(static_cast(payload_val) > 0); } else if (!strcmp(setting, TOPIC_SUB_RESTART)) { // Restart inverter @@ -230,7 +230,7 @@ void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessagePro if (!properties.retain && payload_val == 1) { inv->sendRestartControlRequest(); } else { - MessageOutput.println("Ignored because retained"); + MessageOutput.println("Ignored because retained or numeric value not '1'"); } } } diff --git a/src/NetworkSettings.cpp b/src/NetworkSettings.cpp index dac3ecb0a..8ae1c909d 100644 --- a/src/NetworkSettings.cpp +++ b/src/NetworkSettings.cpp @@ -27,6 +27,8 @@ void NetworkSettingsClass::init(Scheduler& scheduler) WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); + WiFi.disconnect(true, true); + WiFi.onEvent(std::bind(&NetworkSettingsClass::NetworkEvent, this, _1)); setupMode(); @@ -77,6 +79,7 @@ void NetworkSettingsClass::NetworkEvent(const WiFiEvent_t event) MessageOutput.println("WiFi disconnected"); if (_networkMode == network_mode::WiFi) { MessageOutput.println("Try reconnecting"); + WiFi.disconnect(true, true); WiFi.reconnect(); raiseEvent(network_event::NETWORK_DISCONNECTED); } diff --git a/src/WebApi_limit.cpp b/src/WebApi_limit.cpp index 9a622deae..6a6c90ca4 100644 --- a/src/WebApi_limit.cpp +++ b/src/WebApi_limit.cpp @@ -83,7 +83,7 @@ void WebApiLimitClass::onLimitPost(AsyncWebServerRequest* request) return; } - if (root["limit_value"].as() > MAX_INVERTER_LIMIT) { + if (root["limit_value"].as() > MAX_INVERTER_LIMIT) { retMsg["message"] = "Limit must between 0 and " STR(MAX_INVERTER_LIMIT) "!"; retMsg["code"] = WebApiError::LimitInvalidLimit; retMsg["param"]["max"] = MAX_INVERTER_LIMIT; @@ -102,7 +102,7 @@ void WebApiLimitClass::onLimitPost(AsyncWebServerRequest* request) return; } - uint16_t limit = root["limit_value"].as(); + float limit = root["limit_value"].as(); PowerLimitControlType type = root["limit_type"].as(); auto inv = Hoymiles.getInverterBySerial(serial); diff --git a/src/WebApi_webapp.cpp b/src/WebApi_webapp.cpp index b8b813853..b5335b02d 100644 --- a/src/WebApi_webapp.cpp +++ b/src/WebApi_webapp.cpp @@ -42,7 +42,7 @@ void WebApiWebappClass::responseBinaryDataWithETagCache(AsyncWebServerRequest *r if (eTagMatch) { response = request->beginResponse(304); } else { - response = request->beginResponse_P(200, contentType, content, len); + response = request->beginResponse(200, contentType, content, len); if (contentEncoding.length() > 0) { response->addHeader("Content-Encoding", contentEncoding); } diff --git a/webapp/.prettierrc.json b/webapp/.prettierrc.json new file mode 100644 index 000000000..678c251b9 --- /dev/null +++ b/webapp/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": true, + "tabWidth": 4, + "singleQuote": true, + "printWidth": 120, + "trailingComma": "es5" +} diff --git a/webapp/env.d.ts b/webapp/env.d.ts index 11f02fe2a..038f29277 100644 --- a/webapp/env.d.ts +++ b/webapp/env.d.ts @@ -1 +1,9 @@ /// + +import { Router, Route } from 'vue-router' +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + $router: Router + $route: Route + } +} diff --git a/webapp/package.json b/webapp/package.json index cadcee66d..19608f390 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -9,7 +9,8 @@ "preview": "vite preview --port 4173", "build-only": "vite build", "type-check": "vue-tsc --noEmit", - "lint": "eslint ." + "lint": "eslint .", + "format": "prettier --write src/" }, "dependencies": { "@popperjs/core": "^2.11.8", @@ -18,31 +19,32 @@ "mitt": "^3.0.1", "sortablejs": "^1.15.2", "spark-md5": "^3.0.2", - "vue": "^3.4.31", + "vue": "^3.4.35", "vue-i18n": "^9.13.1", - "vue-router": "^4.4.0" + "vue-router": "^4.4.2" }, "devDependencies": { "@intlify/unplugin-vue-i18n": "^4.0.0", "@tsconfig/node18": "^18.2.4", "@types/bootstrap": "^5.2.10", - "@types/node": "^20.14.9", + "@types/node": "^22.0.2", "@types/pulltorefreshjs": "^0.1.7", "@types/sortablejs": "^1.15.8", "@types/spark-md5": "^3.0.4", - "@vitejs/plugin-vue": "^5.0.5", + "@vitejs/plugin-vue": "^5.1.2", "@vue/eslint-config-typescript": "^13.0.0", "@vue/tsconfig": "^0.5.1", - "eslint": "^9.6.0", - "eslint-plugin-vue": "^9.26.0", + "eslint": "^9.8.0", + "eslint-plugin-vue": "^9.27.0", "npm-run-all": "^4.1.5", + "prettier": "^3.3.3", "pulltorefreshjs": "^0.1.22", "sass": "^1.77.6", - "terser": "^5.31.1", - "typescript": "^5.5.2", - "vite": "^5.3.2", + "terser": "^5.31.3", + "typescript": "^5.5.4", + "vite": "^5.3.5", "vite-plugin-compression": "^0.5.1", "vite-plugin-css-injected-by-js": "^3.5.1", - "vue-tsc": "^2.0.22" + "vue-tsc": "^2.0.29" } } diff --git a/webapp/src/App.vue b/webapp/src/App.vue index 6fa6eeaa5..200ce6695 100644 --- a/webapp/src/App.vue +++ b/webapp/src/App.vue @@ -5,10 +5,10 @@ diff --git a/webapp/src/components/DevInfo.vue b/webapp/src/components/DevInfo.vue index 024566ad3..7a998e1c0 100644 --- a/webapp/src/components/DevInfo.vue +++ b/webapp/src/components/DevInfo.vue @@ -1,8 +1,7 @@