diff --git a/interface/src/app/status/Version.tsx b/interface/src/app/status/Version.tsx index 67b322be2..967647be8 100644 --- a/interface/src/app/status/Version.tsx +++ b/interface/src/app/status/Version.tsx @@ -44,7 +44,9 @@ const Version = () => { const [restarting, setRestarting] = useState(false); const [openInstallDialog, setOpenInstallDialog] = useState(false); const [usingDevVersion, setUsingDevVersion] = useState(false); - const [upgradeAvailable, setUpgradeAvailable] = useState(false); + const [devUpgradeAvailable, setDevUpgradeAvailable] = useState(false); + const [stableUpgradeAvailable, setStableUpgradeAvailable] = + useState(false); const [internetLive, setInternetLive] = useState(false); const [downloadOnly, setDownloadOnly] = useState(false); @@ -62,8 +64,13 @@ const Version = () => { immediate: false } ).onSuccess((event) => { - const data = event.data as { emsesp_version: string; upgradeable: boolean }; - setUpgradeAvailable(data.upgradeable); + const data = event.data as { + emsesp_version: string; + dev_upgradeable: boolean; + stable_upgradeable: boolean; + }; + setDevUpgradeAvailable(data.dev_upgradeable); + setStableUpgradeAvailable(data.stable_upgradeable); }); const { @@ -236,8 +243,12 @@ const Version = () => { setUsingDevVersion(data.emsesp_version.includes('dev')); }; - const showButtons = (showDev?: boolean) => { - if (!me.admin) { + const showButtons = (showDev: boolean) => { + if ( + !me.admin || + (showDev && !devUpgradeAvailable) || + (!showDev && !stableUpgradeAvailable) + ) { return; } @@ -266,10 +277,11 @@ const Version = () => { size="small" onClick={() => showFirmwareDialog(showDev)} > - {upgradeAvailable || (!usingDevVersion && showDev) - ? LL.UPGRADE() - : LL.REINSTALL()} - … + {(devUpgradeAvailable && showDev) || (stableUpgradeAvailable && !showDev) + ? showDev && !usingDevVersion + ? LL.SWITCH_RELEASE_TYPE() + : LL.UPGRADE() + : LL.INSTALL()} ); }; @@ -421,8 +433,8 @@ const Version = () => { - - {upgradeAvailable ? ( + {(devUpgradeAvailable && usingDevVersion) || + (stableUpgradeAvailable && !usingDevVersion) ? ( { color="success" sx={{ verticalAlign: 'middle', mr: 2 }} /> - {LL.LATEST_VERSION()} + {LL.LATEST_VERSION( + usingDevVersion ? LL.DEVELOPMENT() : LL.STABLE() + )} )} diff --git a/interface/src/i18n/cz/index.ts b/interface/src/i18n/cz/index.ts index 396a13b62..1e5eec981 100644 --- a/interface/src/i18n/cz/index.ts +++ b/interface/src/i18n/cz/index.ts @@ -333,7 +333,7 @@ const cz: Translation = { WAIT_FIRMWARE: 'Firmware se nahrává a instaluje', INSTALL_VERSION: 'Tímto se instalovat verze {0}. Jste si jistí?', UPGRADE_AVAILABLE: 'Je k dispozici aktualizace firmwaru!', - LATEST_VERSION: 'Používáte nejnovější verzi firmwaru', + LATEST_VERSION: 'Používáte nejnovější verzi {0}firmwaru', PLEASE_WAIT: 'Prosím čekejte', RESTARTING_PRE: 'Inicializace', RESTARTING_POST: 'Příprava', @@ -351,8 +351,8 @@ const cz: Translation = { THIS_VERSION: 'Tato verze', PLATFORM: 'Platforma', RELEASE_TYPE: 'Typ sestavení', - REINSTALL: 'Přeinstalovat', INTERNET_CONNECTION_REQUIRED: 'Pro automatickou kontrolu a instalaci aktualizací je třeba internetové připojení', + SWITCH_RELEASE_TYPE: 'Přepnout na vývojovou verzi' }; export default cz; diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index 2df6cd86f..c87deede2 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -333,7 +333,7 @@ const de: Translation = { WAIT_FIRMWARE: 'Die Firmware wird hochgeladen und installiert.', INSTALL_VERSION: 'Dadurch wird die Version {0} heruntergeladen. Sind Sie sicher?', UPGRADE_AVAILABLE: 'Es ist ein Firmware-Upgrade verfügbar.', - LATEST_VERSION: 'Sie verwenden die neueste Firmware-Version', + LATEST_VERSION: 'Sie verwenden die neueste {0} Firmware-Version', PLEASE_WAIT: 'Bitte warten', RESTARTING_PRE: 'Initialisierung', RESTARTING_POST: 'Vorbereitung', @@ -351,8 +351,8 @@ const de: Translation = { THIS_VERSION: 'Diese Version', PLATFORM: 'Plattform', RELEASE_TYPE: 'Release Typ', - REINSTALL: 'Neu installieren', INTERNET_CONNECTION_REQUIRED: 'Internetverbindung erforderlich für automatische Version-Überprüfung und -Aktualisierung', + SWITCH_RELEASE_TYPE: 'Zum Entwickler-Release wechseln' }; export default de; diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index f14092f29..f4b9a7c9c 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -333,7 +333,7 @@ const en: Translation = { WAIT_FIRMWARE: 'Firmware is uploading and installing', INSTALL_VERSION: 'This will install version {0}. Are you sure?', UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', - LATEST_VERSION: 'You are using the latest firmware version', + LATEST_VERSION: 'You are using the latest {0} firmware version', PLEASE_WAIT: 'Please wait', RESTARTING_PRE: 'Initializing', RESTARTING_POST: 'Preparing', @@ -351,8 +351,8 @@ const en: Translation = { THIS_VERSION: 'This Version', PLATFORM: 'Platform', RELEASE_TYPE: 'Release Type', - REINSTALL: 'Re-install', INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', + SWITCH_RELEASE_TYPE: 'Switch to Development release' }; export default en; diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 973fd1230..1cce8fa6c 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -333,7 +333,7 @@ const fr: Translation = { WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version', // TODO translate + LATEST_VERSION: 'You are using the latest {0} firmware version', // TODO translate PLEASE_WAIT: 'Please wait', // TODO translate RESTARTING_PRE: 'Initializing', // TODO translate RESTARTING_POST: 'Preparing', // TODO translate @@ -351,8 +351,8 @@ const fr: Translation = { THIS_VERSION: 'This Version', // TODO translate PLATFORM: 'Platform', // TODO translate RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', + INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', // TODO translate + SWITCH_RELEASE_TYPE: 'Switch to Development release' // TODO translate }; export default fr; diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts index d2ac2cb1a..cbb3125fa 100644 --- a/interface/src/i18n/it/index.ts +++ b/interface/src/i18n/it/index.ts @@ -333,7 +333,7 @@ const it: Translation = { WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version', // TODO translate + LATEST_VERSION: 'You are using the latest {0}firmware version', // TODO translate PLEASE_WAIT: 'Please wait', // TODO translate RESTARTING_PRE: 'Initializing', // TODO translate RESTARTING_POST: 'Preparing', // TODO translate @@ -351,8 +351,8 @@ const it: Translation = { THIS_VERSION: 'This Version', // TODO translate PLATFORM: 'Platform', // TODO translate RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', + INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', // TODO translate + SWITCH_RELEASE_TYPE: 'Switch to Development release' // TODO translate }; export default it; diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index c7f76ce89..375ec74f9 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -333,15 +333,15 @@ const nl: Translation = { WAIT_FIRMWARE: 'Firmware wordt geüpload en geïnstalleerd', INSTALL_VERSION: 'Hiermee wordt versie {0} geïnstalleerd. Weet je het zeker?', UPGRADE_AVAILABLE: 'Er is een firmware-upgrade beschikbaar!', - LATEST_VERSION: 'U gebruikt de nieuwste firmwareversie', + LATEST_VERSION: 'U gebruikt de nieuwste {0} firmwareversie', PLEASE_WAIT: 'Een ogenblik geduld', RESTARTING_PRE: 'Initialiseren', RESTARTING_POST: 'Voorbereiding', AUTO_SCROLL: 'Automatisch Scrollen', DASHBOARD: 'Dashboard', DEVELOPER_MODE: 'Ontwikkelaarsmodus', - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate + BYTES: 'Bytes', + BITMASK: 'Bit Mask', DUPLICATE: 'Duplicaat', UPGRADE: 'Upgraden', DASHBOARD_1: 'Alle EMS-entiteiten die actief zijn en als favoriet zijn gemarkeerd, plus alle aangepaste entiteiten en externe sensorgegevens worden hieronder weergegeven.', @@ -351,8 +351,8 @@ const nl: Translation = { THIS_VERSION: 'Deze Versie', PLATFORM: 'Platform', RELEASE_TYPE: 'Release Typ', - REINSTALL: 'Opnieuw Installeren', INTERNET_CONNECTION_REQUIRED: 'Internetverbinding vereist voor automatische versiecontrole en -upgrade', + SWITCH_RELEASE_TYPE: 'Switch naar Development release' }; export default nl; \ No newline at end of file diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index 14ce06f46..6da2d4d2f 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -333,7 +333,7 @@ const no: Translation = { WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version', // TODO translate + LATEST_VERSION: 'You are using the latest {0}firmware version', // TODO translate PLEASE_WAIT: 'Please wait', // TODO translate RESTARTING_PRE: 'Initializing', // TODO translate RESTARTING_POST: 'Preparing', // TODO translate @@ -351,8 +351,8 @@ const no: Translation = { THIS_VERSION: 'This Version', // TODO translate PLATFORM: 'Platform', // TODO translate RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', + INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', // TODO translate + SWITCH_RELEASE_TYPE: 'Switch to Development release' // TODO translate }; export default no; diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index 1a678e045..6cbff9380 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -333,7 +333,7 @@ const pl: BaseTranslation = { WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version', // TODO translate + LATEST_VERSION: 'You are using the latest {0} firmware version', // TODO translate PLEASE_WAIT: 'Please wait', // TODO translate RESTARTING_PRE: 'Initializing', // TODO translate RESTARTING_POST: 'Preparing', // TODO translate @@ -351,8 +351,8 @@ const pl: BaseTranslation = { THIS_VERSION: 'This Version', // TODO translate PLATFORM: 'Platform', // TODO translate RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', // TODO translate + SWITCH_RELEASE_TYPE: 'Switch to Development release' // TODO translate }; export default pl; diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts index 30e957ed3..66b4ecc62 100644 --- a/interface/src/i18n/sk/index.ts +++ b/interface/src/i18n/sk/index.ts @@ -333,7 +333,7 @@ const sk: Translation = { WAIT_FIRMWARE: 'Firmvér sa nahráva a inštaluje', INSTALL_VERSION: 'Týmto sa inštalovať verzia {0}. Si si istý?', UPGRADE_AVAILABLE: 'K dispozícii je aktualizácia firmvéru!', - LATEST_VERSION: 'Používate poslednú verziu firmvéru', + LATEST_VERSION: 'Používate poslednú {0} verziu firmvéru', PLEASE_WAIT: 'Čakajte prosím', RESTARTING_PRE: 'Prebieha inicializácia', RESTARTING_POST: 'Príprava', @@ -351,8 +351,8 @@ const sk: Translation = { THIS_VERSION: 'Táto verzia', PLATFORM: 'Platforma', RELEASE_TYPE: 'Typ vydania', - REINSTALL: 'Preinštalovať', INTERNET_CONNECTION_REQUIRED: 'Internetové pripojenie je potrebné pre automatickú kontrolu a aktualizáciu', + SWITCH_RELEASE_TYPE: 'Prepnúť na vývojovú verziu' }; export default sk; diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index f2527b3b7..943f91409 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -333,7 +333,7 @@ const sv: Translation = { WAIT_FIRMWARE: 'Firmware laddas upp och installeras', INSTALL_VERSION: 'Det här kommer installera version {0}. Är du säker?', UPGRADE_AVAILABLE: 'Det finns en tillgänglig firmwareupgradering!', - LATEST_VERSION: 'Du använder den senaste firmwareversionen.', + LATEST_VERSION: 'Du använder den senaste {0} firmwareversionen.', PLEASE_WAIT: 'Var god vänta', RESTARTING_PRE: 'Initialiserar', RESTARTING_POST: 'Förbereder', @@ -351,8 +351,8 @@ const sv: Translation = { THIS_VERSION: 'This Version', // TODO translate PLATFORM: 'Platform', // TODO translate RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate INTERNET_CONNECTION_REQUIRED: 'Internetanslutning krävs för automatisk version kontroll och uppdatering', + SWITCH_RELEASE_TYPE: 'Byt till utvecklingsversion' }; export default sv; diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index cab051bfb..fe2934337 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -333,7 +333,7 @@ const tr: Translation = { WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version.', // TODO translate + LATEST_VERSION: 'You are using the latest {0}firmware version.', // TODO translate PLEASE_WAIT: 'Please wait', // TODO translate RESTARTING_PRE: 'Initializing', // TODO translate RESTARTING_POST: 'Preparing', // TODO translate @@ -351,8 +351,8 @@ const tr: Translation = { THIS_VERSION: 'This Version', // TODO translate PLATFORM: 'Platform', // TODO translate RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', // TODO translate + SWITCH_RELEASE_TYPE: 'Switch to Development release' // TODO translate }; export default tr; diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 1ec43395a..baee2e182 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -219,37 +219,40 @@ void WebStatusService::action(AsyncWebServerRequest * request, JsonVariant json) // action = checkUpgrade // versions holds the latest development version and stable version in one string, comma separated bool WebStatusService::checkUpgrade(JsonObject root, std::string & versions) { - std::string current_version_s; -#ifndef EMSESP_STANDALONE - current_version_s = EMSESP_APP_VERSION; -#else - // for testing only - see api3 test in test.cpp - // current_version_s = "3.6.5"; - current_version_s = "3.7.2-dev.1"; -#endif if (!versions.empty()) { version::Semver200_version current_version(current_version_s); - bool using_dev_version = !current_version.prerelease().find("dev"); // look for dev in the name to determine if we're using dev version - version::Semver200_version latest_version(using_dev_version ? versions.substr(0, versions.find(',')) : versions.substr(versions.find(',') + 1)); - bool upgradeable = (latest_version > current_version); + version::Semver200_version latest_dev_version(versions.substr(0, versions.find(','))); + version::Semver200_version latest_stable_version(versions.substr(versions.find(',') + 1)); + + // look for dev in the name to determine if we're using a dev release + bool using_dev_version = !current_version.prerelease().find("dev"); + + bool dev_upgradeable = latest_dev_version > current_version; + bool stable_upgradeable = latest_stable_version > current_version; #if defined(EMSESP_DEBUG) emsesp::EMSESP::logger() - .debug("Checking Version upgrade. Using %s release branch. current version=%d.%d.%d-%s, latest version=%d.%d.%d-%s (%s upgradeable)", - (using_dev_version ? "dev" : "stable"), + .debug("Checking version upgrade. This version=%d.%d.%d-%s (%s),latest dev=%d.%d.%d-%s (%s upgradeable),latest stable=%d.%d.%d-%s (%s upgradeable)", current_version.major(), current_version.minor(), current_version.patch(), current_version.prerelease().c_str(), - latest_version.major(), - latest_version.minor(), - latest_version.patch(), - latest_version.prerelease().c_str(), - upgradeable ? "IS" : "NOT"); + using_dev_version ? "Dev" : "Stable", + latest_dev_version.major(), + latest_dev_version.minor(), + latest_dev_version.patch(), + latest_dev_version.prerelease().c_str(), + dev_upgradeable ? "is" : "is not", + latest_stable_version.major(), + latest_stable_version.minor(), + latest_stable_version.patch(), + latest_stable_version.prerelease().c_str(), + stable_upgradeable ? "is" : "is not"); #endif - root["upgradeable"] = upgradeable; + root["dev_upgradeable"] = dev_upgradeable; + root["stable_upgradeable"] = stable_upgradeable; } root["emsesp_version"] = current_version_s; // always send back current version diff --git a/src/web/WebStatusService.h b/src/web/WebStatusService.h index beefd2611..0d38a5b73 100644 --- a/src/web/WebStatusService.h +++ b/src/web/WebStatusService.h @@ -5,12 +5,19 @@ #define EMSESP_ACTION_SERVICE_PATH "/rest/action" #include // for version checking +#include "../emsesp_version.h" namespace emsesp { class WebStatusService { public: WebStatusService(AsyncWebServer * server, SecurityManager * securityManager); + void set_current_version(const std::string & version) { + current_version_s = version; + } + std::string get_current_version() { + return current_version_s; + } // make action function public so we can test in the debug and standalone mode #ifndef EMSESP_STANDALONE @@ -29,6 +36,8 @@ class WebStatusService { bool uploadURL(const char * url); bool setSystemStatus(const char * status); void allvalues(JsonObject output); + + std::string current_version_s = EMSESP_APP_VERSION; }; } // namespace emsesp