diff --git a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts index f36f02fa8..8d139cc4c 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts @@ -1,6 +1,7 @@ import { Functions, importCSVvariableName, + InstallCase, minsky, } from '@minsky/shared'; import { @@ -78,9 +79,9 @@ export class ApplicationMenuManager { private static async getFileMenu(): Promise { const scope = this; const ravelAvailable=await minsky.ravelAvailable(); - let upgradeLabel='Upgrade'; + let ravelUpgradeLabel='Upgrade Ravel'; if (!ravelAvailable) - upgradeLabel+=' to Ravel'; + ravelUpgradeLabel='Install Ravel'; return { label: 'File', submenu: [ @@ -98,9 +99,23 @@ export class ApplicationMenuManager { }, }, { - label: upgradeLabel, + label: 'Upgrade', click() {CommandsManager.upgrade();}, }, + { + label: ravelUpgradeLabel, + submenu: [ + { + label: 'Latest Ravel', + click() {CommandsManager.upgrade(InstallCase.latestRavel);}, + }, + { + label: 'Previous Ravel', + enabled: ravelAvailable, + click() {CommandsManager.upgrade(InstallCase.previousRavel)}, + }, + ], + }, { label: 'Logout from Patreon', click() { diff --git a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts index 3d2eb2824..acca5a08e 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts @@ -5,6 +5,7 @@ import { Functions, HandleDimensionPayload, InitializePopupWindowPayload, + InstallCase, HandleDescriptionPayload, importCSVvariableName, minsky, GodleyIcon, Group, IntOp, Item, Lock, Ravel, VariableBase, Wire, Utility, DownloadCSVPayload @@ -1290,7 +1291,7 @@ export class CommandsManager { }); } - static async upgrade() { + static async upgrade(installCase: InstallCase=InstallCase.theLot) { const window=this.createDownloadWindow(); // handler for when user has logged in to initiate upgrades. @@ -1306,7 +1307,7 @@ export class CommandsManager { let params=new URLSearchParams(installables); let minskyFile=params.get('minsky-asset'); let ravelFile=params.get('ravel-asset'); - if (minskyFile) { + if (minskyFile && installCase===InstallCase.theLot) { let minskyVersionRE=/(\d+)\.(\d+)\.(\d+)([.-])/; let [,major,minor,patch]=minskyVersionRE.exec(minskyFile); let [,currMajor,currMinor,currPatch,terminator]=minskyVersionRE.exec((await minsky.minskyVersion())+'.'); @@ -1340,11 +1341,16 @@ export class CommandsManager { let clientId='I9sn5lKdemBdh8uTNA7H7YiplxQk3gI-pP0I9_2g1tcbE88T2C3Z9wOvoy51I4-U'; // need to pass what platform we are + let state; switch (process.platform) { - case 'win32': var state={system: 'windows', distro: '', version: '', arch:''}; break; - case 'darwin': var state={system: 'macos', distro: '', version: '', arch: `${process.arch}`}; break; + case 'win32': + state={system: 'windows', distro: '', version: '', arch:'', previous: ''}; + break; + case 'darwin': + state={system: 'macos', distro: '', version: '', arch: `${process.arch}`, previous: ''}; + break; case 'linux': - var state={system: 'linux', distro: '', version: '',arch:''}; + state={system: 'linux', distro: '', version: '',arch:'', previous: ''}; // figure out distro and version from /etc/os-release let aexec=promisify(exec); let distroInfo=await aexec('grep ^ID= /etc/os-release'); @@ -1363,6 +1369,8 @@ export class CommandsManager { return; break; } + if (await minsky.ravelAvailable() && installCase===InstallCase.previousRavel) + state.previous=/[^:]*/.exec(await minsky.ravelVersion())[0]; let encodedState=encodeURI(JSON.stringify(state)); // load patreon's login page window.loadURL(`https://www.patreon.com/oauth2/authorize?response_type=code&client_id=${clientId}&redirect_uri=https://ravelation.hpcoders.com.au/ravel-downloader.cgi&scope=identity%20identity%5Bemail%5D&state=${encodedState}`); diff --git a/gui-js/libs/shared/src/lib/interfaces/Interfaces.ts b/gui-js/libs/shared/src/lib/interfaces/Interfaces.ts index b7bc26d65..a4cc112ff 100644 --- a/gui-js/libs/shared/src/lib/interfaces/Interfaces.ts +++ b/gui-js/libs/shared/src/lib/interfaces/Interfaces.ts @@ -141,3 +141,6 @@ export interface TypeValueName { value? : string | number, name? : string } + +export enum InstallCase {theLot, latestRavel, previousRavel}; +