fix
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
||||||
"productName": "ODIAN Launcher",
|
"productName": "ODIAN Launcher",
|
||||||
"version": "0.1.41",
|
"version": "0.1.42",
|
||||||
"identifier": "fr.odian.launcher",
|
"identifier": "fr.odian.launcher",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../dist",
|
"frontendDist": "../dist",
|
||||||
|
|||||||
@@ -98,6 +98,12 @@
|
|||||||
// like the real one on screen, and mistaking the two is how a bug gets chased in the
|
// like the real one on screen, and mistaking the two is how a bug gets chased in the
|
||||||
// wrong tree - or a demo gets given from an unbuilt branch.
|
// wrong tree - or a demo gets given from an unbuilt branch.
|
||||||
const devOn = $derived(launcher.devOn);
|
const devOn = $derived(launcher.devOn);
|
||||||
|
// Dev mode's controls follow DEV MODE, not whatever the hub is currently offering. They
|
||||||
|
// used to live inside the "launch" branch, so a PC with nothing installed was told to name
|
||||||
|
// its checkout folder and given nowhere on screen to name it - the dead end that made a
|
||||||
|
// fresh dev PC look like it could only install.
|
||||||
|
const TRANSIENT = ["loading", "signing_in", "installing", "restoring", "syncing", "building", "removing", "pulling_tiles", "stack"];
|
||||||
|
const showDev = $derived(devOn && !TRANSIENT.includes(action));
|
||||||
const devRun = $derived(launcher.devReady);
|
const devRun = $derived(launcher.devReady);
|
||||||
const devRoot = $derived(launcher.settings?.dev_root ?? "");
|
const devRoot = $derived(launcher.settings?.dev_root ?? "");
|
||||||
const devTarget = $derived(launcher.settings?.dev_target ?? "client");
|
const devTarget = $derived(launcher.settings?.dev_target ?? "client");
|
||||||
@@ -266,98 +272,6 @@
|
|||||||
<button class="btn-link" disabled={blocked} onclick={() => launcher.openSync()}>Sync</button>
|
<button class="btn-link" disabled={blocked} onclick={() => launcher.openSync()}>Sync</button>
|
||||||
</p>
|
</p>
|
||||||
{/if}
|
{/if}
|
||||||
{#if devOn}
|
|
||||||
<!-- Dev mode's own controls, where the launching happens. Everything that decides
|
|
||||||
what Launch does is here rather than behind Settings: the target, the checkout,
|
|
||||||
and whether it builds first. -->
|
|
||||||
<section class="dev" aria-label="Dev mode">
|
|
||||||
<header class="dev-head">
|
|
||||||
<Icon name="code" size={13} />
|
|
||||||
<span class="dev-title">DEV</span>
|
|
||||||
<!-- What Launch will actually start, in three words. The folder is not repeated
|
|
||||||
here: it is in the field two rows down. -->
|
|
||||||
<span class="dev-from mono">{devRun ? TARGETS.find((o) => o.key === devTarget)?.name ?? "" : "no checkout"}</span>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="dev-targets" role="radiogroup" aria-label="Launch starts">
|
|
||||||
{#each TARGETS as option (option.key)}
|
|
||||||
<label class="dev-target" class:on={devTarget === option.key}>
|
|
||||||
<input
|
|
||||||
type="radio"
|
|
||||||
name="dev-target"
|
|
||||||
value={option.key}
|
|
||||||
checked={devTarget === option.key}
|
|
||||||
disabled={blocked || savingDev}
|
|
||||||
onchange={() => launcher.setDev({ dev_target: option.key })}
|
|
||||||
/>
|
|
||||||
<span class="dev-target-name">{option.name}</span>
|
|
||||||
<span class="dev-target-note mono">{option.note}</span>
|
|
||||||
</label>
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="dev-row">
|
|
||||||
<input
|
|
||||||
class="dev-path"
|
|
||||||
type="text"
|
|
||||||
spellcheck="false"
|
|
||||||
placeholder="Folder holding ODIAN_Engine"
|
|
||||||
value={devRoot}
|
|
||||||
disabled={blocked || savingDev}
|
|
||||||
onchange={(e) => launcher.setDev({ dev_root: e.currentTarget.value.trim() })}
|
|
||||||
/>
|
|
||||||
<button type="button" class="btn" disabled={blocked || savingDev} onclick={browseCheckout}>Browse…</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="dev-row">
|
|
||||||
<label class="dev-label" for="dev-run-as">Run as</label>
|
|
||||||
<input
|
|
||||||
id="dev-run-as"
|
|
||||||
class="dev-path"
|
|
||||||
type="text"
|
|
||||||
spellcheck="false"
|
|
||||||
autocomplete="off"
|
|
||||||
placeholder={s?.operator ?? "the operator who signed in"}
|
|
||||||
value={devUserField}
|
|
||||||
disabled={blocked || savingDev}
|
|
||||||
onchange={(e) => launcher.setDev({ dev_user: e.currentTarget.value.trim() })}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="dev-row">
|
|
||||||
{#if releasing}
|
|
||||||
<button class="btn dev-release" onclick={() => launcher.showConsole()}>Release running…</button>
|
|
||||||
{:else}
|
|
||||||
<button class="btn dev-release" disabled={blocked || !s?.online} onclick={openRelease}>
|
|
||||||
Build & deploy…
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
{#if hasOutput && !releasing}
|
|
||||||
<button class="btn-link" onclick={() => launcher.showConsole()}>last output</button>
|
|
||||||
{:else if !s?.online}
|
|
||||||
<span class="dev-note">needs the DHP</span>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label class="dev-check">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={devBuild}
|
|
||||||
disabled={blocked || savingDev}
|
|
||||||
onchange={(e) => launcher.setDev({ dev_build: e.currentTarget.checked })}
|
|
||||||
/>
|
|
||||||
<span>Build first</span>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
{#if !devRun}
|
|
||||||
<p class="dev-note">Name the folder that holds <code>ODIAN_Engine</code> and Launch runs from it.</p>
|
|
||||||
{:else if devUser}
|
|
||||||
<p class="dev-note attention">
|
|
||||||
Running as <strong>{devUser}</strong> — this PC will not sync with the DHP.
|
|
||||||
</p>
|
|
||||||
{/if}
|
|
||||||
</section>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{#if unfinished}
|
{#if unfinished}
|
||||||
<p class="secondary attention">
|
<p class="secondary attention">
|
||||||
@@ -492,6 +406,99 @@
|
|||||||
</p>
|
</p>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
{#if showDev}
|
||||||
|
<!-- Dev mode's own controls, where the launching happens. Everything that decides
|
||||||
|
what Launch does is here rather than behind Settings: the target, the checkout,
|
||||||
|
and whether it builds first. -->
|
||||||
|
<section class="dev" aria-label="Dev mode">
|
||||||
|
<header class="dev-head">
|
||||||
|
<Icon name="code" size={13} />
|
||||||
|
<span class="dev-title">DEV</span>
|
||||||
|
<!-- What Launch will actually start, in three words. The folder is not repeated
|
||||||
|
here: it is in the field two rows down. -->
|
||||||
|
<span class="dev-from mono">{devRun ? TARGETS.find((o) => o.key === devTarget)?.name ?? "" : "no checkout"}</span>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="dev-targets" role="radiogroup" aria-label="Launch starts">
|
||||||
|
{#each TARGETS as option (option.key)}
|
||||||
|
<label class="dev-target" class:on={devTarget === option.key}>
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
name="dev-target"
|
||||||
|
value={option.key}
|
||||||
|
checked={devTarget === option.key}
|
||||||
|
disabled={blocked || savingDev}
|
||||||
|
onchange={() => launcher.setDev({ dev_target: option.key })}
|
||||||
|
/>
|
||||||
|
<span class="dev-target-name">{option.name}</span>
|
||||||
|
<span class="dev-target-note mono">{option.note}</span>
|
||||||
|
</label>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dev-row">
|
||||||
|
<input
|
||||||
|
class="dev-path"
|
||||||
|
type="text"
|
||||||
|
spellcheck="false"
|
||||||
|
placeholder="Folder holding ODIAN_Engine"
|
||||||
|
value={devRoot}
|
||||||
|
disabled={blocked || savingDev}
|
||||||
|
onchange={(e) => launcher.setDev({ dev_root: e.currentTarget.value.trim() })}
|
||||||
|
/>
|
||||||
|
<button type="button" class="btn" disabled={blocked || savingDev} onclick={browseCheckout}>Browse…</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dev-row">
|
||||||
|
<label class="dev-label" for="dev-run-as">Run as</label>
|
||||||
|
<input
|
||||||
|
id="dev-run-as"
|
||||||
|
class="dev-path"
|
||||||
|
type="text"
|
||||||
|
spellcheck="false"
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={s?.operator ?? "the operator who signed in"}
|
||||||
|
value={devUserField}
|
||||||
|
disabled={blocked || savingDev}
|
||||||
|
onchange={(e) => launcher.setDev({ dev_user: e.currentTarget.value.trim() })}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dev-row">
|
||||||
|
{#if releasing}
|
||||||
|
<button class="btn dev-release" onclick={() => launcher.showConsole()}>Release running…</button>
|
||||||
|
{:else}
|
||||||
|
<button class="btn dev-release" disabled={blocked || !s?.online} onclick={openRelease}>
|
||||||
|
Build & deploy…
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
{#if hasOutput && !releasing}
|
||||||
|
<button class="btn-link" onclick={() => launcher.showConsole()}>last output</button>
|
||||||
|
{:else if !s?.online}
|
||||||
|
<span class="dev-note">needs the DHP</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label class="dev-check">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
checked={devBuild}
|
||||||
|
disabled={blocked || savingDev}
|
||||||
|
onchange={(e) => launcher.setDev({ dev_build: e.currentTarget.checked })}
|
||||||
|
/>
|
||||||
|
<span>Build first</span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
{#if !devRun}
|
||||||
|
<p class="dev-note">Name the folder that holds <code>ODIAN_Engine</code> and Launch runs from it.</p>
|
||||||
|
{:else if devUser}
|
||||||
|
<p class="dev-note attention">
|
||||||
|
Running as <strong>{devUser}</strong> — this PC will not sync with the DHP.
|
||||||
|
</p>
|
||||||
|
{/if}
|
||||||
|
</section>
|
||||||
|
{/if}
|
||||||
|
|
||||||
{#if showNotice}
|
{#if showNotice}
|
||||||
<div class="notice" role="alert">
|
<div class="notice" role="alert">
|
||||||
<Icon name="alert" size={14} />
|
<Icon name="alert" size={14} />
|
||||||
|
|||||||
@@ -311,6 +311,19 @@ function initialStatus(scenario: MockScenario): Status {
|
|||||||
dev: { machine: "ODIAN-DEV-01", install_id: null, expires_at: "2027-01-31", note: "test kit" },
|
dev: { machine: "ODIAN-DEV-01", install_id: null, expires_at: "2027-01-31", note: "test kit" },
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case "dev-no-checkout":
|
||||||
|
// A fresh dev PC: launcher downloaded, licence dropped in, DHP reachable - but no
|
||||||
|
// ODIAN_Engine checkout yet. It used to show Install and no way to point at one.
|
||||||
|
Object.assign(s, {
|
||||||
|
installed: null,
|
||||||
|
operator: OPERATOR,
|
||||||
|
signed_in: true,
|
||||||
|
dev_run: false,
|
||||||
|
dhp_direct: false,
|
||||||
|
dhp_blocked: "dev mode has no checkout folder yet: name the folder that holds ODIAN_Engine.",
|
||||||
|
dev: { machine: "ODIAN-DEV-02", install_id: null, expires_at: "2027-01-31", note: "test kit" },
|
||||||
|
});
|
||||||
|
break;
|
||||||
case "error":
|
case "error":
|
||||||
Object.assign(s, {
|
Object.assign(s, {
|
||||||
operator: OPERATOR,
|
operator: OPERATOR,
|
||||||
@@ -370,6 +383,7 @@ class MockBackend implements Backend {
|
|||||||
// Already pointed at a checkout and switched on, so the dev controls and the dev-run
|
// Already pointed at a checkout and switched on, so the dev controls and the dev-run
|
||||||
// marker show as they do on the real thing.
|
// marker show as they do on the real thing.
|
||||||
if (scenario === "dev" || scenario === "dev-dhp") Object.assign(this.settings, { dev_root: "E:" + String.fromCharCode(92) + "ODIAN_Dev", dev_mode: true });
|
if (scenario === "dev" || scenario === "dev-dhp") Object.assign(this.settings, { dev_root: "E:" + String.fromCharCode(92) + "ODIAN_Dev", dev_mode: true });
|
||||||
|
if (scenario === "dev-no-checkout") Object.assign(this.settings, { dev_root: "", dev_mode: true });
|
||||||
if (this.status.installed) {
|
if (this.status.installed) {
|
||||||
// An installed mock PC has the basemap, Dark V2 and a stopped satellite download.
|
// An installed mock PC has the basemap, Dark V2 and a stopped satellite download.
|
||||||
for (const item of MOCK_MARKET) if (item.required) this.marketPresent.set(item.key, "installed");
|
for (const item of MOCK_MARKET) if (item.required) this.marketPresent.set(item.key, "installed");
|
||||||
|
|||||||
@@ -338,6 +338,7 @@ export const MOCK_SCENARIOS = [
|
|||||||
"error",
|
"error",
|
||||||
"dev",
|
"dev",
|
||||||
"dev-dhp",
|
"dev-dhp",
|
||||||
|
"dev-no-checkout",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type MockScenario = (typeof MOCK_SCENARIOS)[number];
|
export type MockScenario = (typeof MOCK_SCENARIOS)[number];
|
||||||
|
|||||||
Reference in New Issue
Block a user