Pools: löschbar mit Zuordnungs-Auflösung, Neuanmelden über Keychain, Key-Status

- delete_pool löst Projektzuordnungen (Terminal-Config bleibt), Dialog
  zeigt betroffene Projekte
- oauth_login: nur bei ungenutztem Pool, löscht vorher den suffixierten
  Keychain-Eintrag; Warn-Dialog mit keychain_status; oauth_refresh raus
- PoolInfo.hasCredentials: apikey-Dateicheck; Button Key ändern/eintragen,
  einheitliche Button-Breite
- Starten deaktiviert ohne Pool bzw. ohne Key (Tooltip unterscheidet)
- Icon-Pfad im Terminal-Dialog gekürzt mit Hover-Popover
This commit is contained in:
marcus.hinz
2026-07-04 13:27:54 +02:00
parent fc560d4e5f
commit 9b008cbf51
5 changed files with 258 additions and 70 deletions
+23 -4
View File
@@ -13,8 +13,19 @@ interface Project {
interface Pool {
name: string;
credentialFile: string;
credentialType: string;
hasCredentials: boolean;
}
function poolReady(p: Project): boolean {
if (!p.pool) return false;
const pool = pools.value.find((x) => x.name === p.pool);
return pool !== undefined && pool.hasCredentials;
}
function startBlockedReason(p: Project): string | undefined {
if (poolReady(p)) return undefined;
return p.pool ? "projects.needsKey" : "projects.needsPool";
}
const projects = ref<Project[]>([]);
@@ -192,7 +203,13 @@ onUnmounted(() => window.clearInterval(timer));
<button v-if="p.running" class="stop" @click="stop(p)">
{{ $t("projects.stop") }}
</button>
<button v-else class="start" @click="openTerminal(p)">
<button
v-else
class="start"
:disabled="!poolReady(p)"
:title="startBlockedReason(p) && $t(startBlockedReason(p)!)"
@click="openTerminal(p)"
>
{{ $t("projects.start") }}
</button>
</span>
@@ -223,9 +240,11 @@ onUnmounted(() => window.clearInterval(timer));
<button v-if="settings.icon" @click="settings.icon = null">
{{ $t("projects.remove") }}
</button>
<span class="icon-path">
{{ settings.icon ?? $t("projects.defaultIcon") }}
<span v-if="settings.icon" class="icon-path hover-pop">
{{ settings.icon.split("/").pop() }}
<span class="pop pop-path">{{ settings.icon }}</span>
</span>
<span v-else class="icon-path">{{ $t("projects.defaultIcon") }}</span>
</span>
</label>
<p class="hint">{{ $t("projects.appliesNextStart") }}</p>