fix(ui): address PR review feedback (duplicates, types, labels)
This commit is contained in:
parent
54900d6358
commit
802e296246
@ -40,11 +40,7 @@ class Translator {
|
|||||||
setLocale(locale: string) {
|
setLocale(locale: string) {
|
||||||
if (this.locale === locale) return;
|
if (this.locale === locale) return;
|
||||||
this.locale = locale;
|
this.locale = locale;
|
||||||
try {
|
// localStorage persistence is handled by the app's UiSettings to avoid sync issues.
|
||||||
localStorage.setItem('moltbot-locale', locale);
|
|
||||||
} catch (e) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
this.notify();
|
this.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +64,7 @@ class Translator {
|
|||||||
|
|
||||||
private resolve(table: TranslationMap | undefined, key: string): any {
|
private resolve(table: TranslationMap | undefined, key: string): any {
|
||||||
if (!table) return undefined;
|
if (!table) return undefined;
|
||||||
return key.split('.').reduce((obj, i) => (obj ? obj[i] : null), table);
|
return key.split('.').reduce((obj, i) => (obj ? (obj as any)[i] : null), table);
|
||||||
}
|
}
|
||||||
|
|
||||||
private interpolate(text: string, params?: Record<string, string | number>) {
|
private interpolate(text: string, params?: Record<string, string | number>) {
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export type TranslationMap = Record<string, any>; // Relaxed type for nested objects
|
export type TranslationMap = Record<string, unknown>; // Relaxed type for nested objects
|
||||||
|
|||||||
@ -105,7 +105,7 @@ export function renderApp(state: AppViewState) {
|
|||||||
const presenceCount = state.presenceEntries.length;
|
const presenceCount = state.presenceEntries.length;
|
||||||
const sessionsCount = state.sessionsResult?.count ?? null;
|
const sessionsCount = state.sessionsResult?.count ?? null;
|
||||||
const cronNext = state.cronStatus?.nextWakeAtMs ?? null;
|
const cronNext = state.cronStatus?.nextWakeAtMs ?? null;
|
||||||
const chatDisabledReason = state.connected ? null : t("status.disconnected") + " from gateway.";
|
const chatDisabledReason = state.connected ? null : t("status.disconnected_from_gateway");
|
||||||
const isChat = state.tab === "chat";
|
const isChat = state.tab === "chat";
|
||||||
const chatFocus = isChat && (state.settings.chatFocusMode || state.onboarding);
|
const chatFocus = isChat && (state.settings.chatFocusMode || state.onboarding);
|
||||||
const showThinking = state.onboarding ? false : state.settings.chatShowThinking;
|
const showThinking = state.onboarding ? false : state.settings.chatShowThinking;
|
||||||
@ -122,40 +122,28 @@ export function renderApp(state: AppViewState) {
|
|||||||
state.applySettings({
|
state.applySettings({
|
||||||
...state.settings,
|
...state.settings,
|
||||||
navCollapsed: !state.settings.navCollapsed,
|
navCollapsed: !state.settings.navCollapsed,
|
||||||
})}
|
|
||||||
@click=${() =>
|
|
||||||
state.applySettings({
|
|
||||||
...state.settings,
|
|
||||||
navCollapsed: !state.settings.navCollapsed,
|
|
||||||
})}
|
})}
|
||||||
title="${state.settings.navCollapsed ? t("sidebar.expand") : t("sidebar.collapse")}"
|
title="${state.settings.navCollapsed ? t("sidebar.expand") : t("sidebar.collapse")}"
|
||||||
aria-label="${state.settings.navCollapsed ? t("sidebar.expand") : t("sidebar.collapse")}"
|
aria-label="${state.settings.navCollapsed ? t("sidebar.expand") : t("sidebar.collapse")}"
|
||||||
>
|
>
|
||||||
<span class="nav-collapse-toggle__icon">${icons.menu}</span>
|
<span class="nav-collapse-toggle__icon">${icons.menu}</span>
|
||||||
>
|
|
||||||
<span class="nav-collapse-toggle__icon">${icons.menu}</span>
|
|
||||||
</button>
|
</button>
|
||||||
<div class="brand">
|
<div class="brand">
|
||||||
<div class="brand-logo">
|
<div class="brand-logo">
|
||||||
<img src="https://mintcdn.com/clawdhub/4rYvG-uuZrMK_URE/assets/pixel-lobster.svg?fit=max&auto=format&n=4rYvG-uuZrMK_URE&q=85&s=da2032e9eac3b5d9bfe7eb96ca6a8a26" alt="Moltbot" />
|
<img src="https://mintcdn.com/clawdhub/4rYvG-uuZrMK_URE/assets/pixel-lobster.svg?fit=max&auto=format&n=4rYvG-uuZrMK_URE&q=85&s=da2032e9eac3b5d9bfe7eb96ca6a8a26" alt="Moltbot" />
|
||||||
</div>
|
</div>
|
||||||
<div class="brand-text">
|
|
||||||
<div class="brand-text">
|
<div class="brand-text">
|
||||||
<div class="brand-title">${t("brand.title")}</div>
|
<div class="brand-title">${t("brand.title")}</div>
|
||||||
<div class="brand-sub">${t("brand.subtitle")}</div>
|
<div class="brand-sub">${t("brand.subtitle")}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="topbar-status">
|
<div class="topbar-status">
|
||||||
<div class="pill">
|
|
||||||
<span class="statusDot ${state.connected ? "ok" : ""}"></span>
|
|
||||||
<div class="pill">
|
<div class="pill">
|
||||||
<span class="statusDot ${state.connected ? "ok" : ""}"></span>
|
<span class="statusDot ${state.connected ? "ok" : ""}"></span>
|
||||||
<span>${t("status.health")}</span>
|
<span>${t("status.health")}</span>
|
||||||
<span class="mono">${state.connected ? t("status.ok") : t("status.offline")}</span>
|
<span class="mono">${state.connected ? t("status.ok") : t("status.offline")}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
${renderThemeToggle(state)}
|
${renderThemeToggle(state)}
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
@ -177,7 +165,7 @@ export function renderApp(state: AppViewState) {
|
|||||||
}}
|
}}
|
||||||
aria-expanded=${!isGroupCollapsed}
|
aria-expanded=${!isGroupCollapsed}
|
||||||
>
|
>
|
||||||
<span class="nav-label__text">${group.label}</span>
|
<span class="nav-label__text">${t("nav.group." + group.label)}</span>
|
||||||
<span class="nav-label__chevron">${isGroupCollapsed ? "+" : "−"}</span>
|
<span class="nav-label__chevron">${isGroupCollapsed ? "+" : "−"}</span>
|
||||||
</button>
|
</button>
|
||||||
<div class="nav-group__items">
|
<div class="nav-group__items">
|
||||||
@ -186,29 +174,21 @@ export function renderApp(state: AppViewState) {
|
|||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
})}
|
})}
|
||||||
<div class="nav-group nav-group--links">
|
|
||||||
<div class="nav-label nav-label--static">
|
|
||||||
<div class="nav-group nav-group--links">
|
<div class="nav-group nav-group--links">
|
||||||
<div class="nav-label nav-label--static">
|
<div class="nav-label nav-label--static">
|
||||||
<span class="nav-label__text">${t("nav.resources")}</span>
|
<span class="nav-label__text">${t("nav.resources")}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-group__items">
|
|
||||||
</div>
|
|
||||||
<div class="nav-group__items">
|
<div class="nav-group__items">
|
||||||
<a
|
<a
|
||||||
class="nav-item nav-item--external"
|
class="nav-item nav-item--external"
|
||||||
href="https://docs.molt.bot"
|
href="https://docs.molt.bot"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
title="Docs (opens in new tab)"
|
|
||||||
>
|
|
||||||
<span class="nav-item__icon" aria-hidden="true">${icons.book}</span>
|
|
||||||
title="${t("nav.docs")} (opens in new tab)"
|
title="${t("nav.docs")} (opens in new tab)"
|
||||||
>
|
>
|
||||||
<span class="nav-item__icon" aria-hidden="true">${icons.book}</span>
|
<span class="nav-item__icon" aria-hidden="true">${icons.book}</span>
|
||||||
<span class="nav-item__text">${t("nav.docs")}</span>
|
<span class="nav-item__text">${t("nav.docs")}</span>
|
||||||
</a>
|
</a>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
|||||||
@ -157,6 +157,7 @@ export function renderOverview(props: OverviewProps) {
|
|||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
<label class="field">
|
<label class="field">
|
||||||
|
<span>Default Session Key</span>
|
||||||
<input
|
<input
|
||||||
.value=${props.settings.sessionKey}
|
.value=${props.settings.sessionKey}
|
||||||
@input=${(e: Event) => {
|
@input=${(e: Event) => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user