mirror of
https://github.com/hansjone/netxops.git
synced 2026-10-11 05:50:44 +08:00
Fix kbRoot browse ignoring Typert Result from directoryPicker.pick.
Unwrap { ok, value } so the chosen folder path lands in the field and auto-saves.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
f64f1279e7
commit
fcdd11ac59
4 changed files with 165 additions and 57 deletions
|
|
@ -2021,19 +2021,30 @@ class NetxopsCardController {
|
|||
this.kbUiError = null;
|
||||
this.store.set(this.projection());
|
||||
const applyPath = (path) => {
|
||||
if (typeof path !== "string" || path.trim() === "") {
|
||||
return;
|
||||
}
|
||||
this.form.actions().edit("kbRoot", path.trim());
|
||||
this.form.actions().edit("kbRoot", path);
|
||||
this.refreshKbPreview();
|
||||
this.form.save().then(() => {
|
||||
this.refreshKbStatus();
|
||||
this.refreshKbPreview();
|
||||
});
|
||||
};
|
||||
const fail = (error) => {
|
||||
this.kbUiError = error instanceof Error ? error.message : String(error);
|
||||
this.store.set(this.projection());
|
||||
};
|
||||
const acceptPickResult = (result) => {
|
||||
const path = unwrapDirectoryPickResult(result);
|
||||
if (path === null)
|
||||
return;
|
||||
if (path === undefined) {
|
||||
fail(`unexpected directoryPicker result: ${safeJson(result)}`);
|
||||
return;
|
||||
}
|
||||
applyPath(path);
|
||||
};
|
||||
const picker = this.kbDirectoryPicker;
|
||||
if (picker !== undefined) {
|
||||
picker.pick().then(applyPath).catch(fail).finally(() => {
|
||||
picker.pick().then(acceptPickResult).catch(fail).finally(() => {
|
||||
this.kbBrowseInFlight = false;
|
||||
this.store.set(this.projection());
|
||||
});
|
||||
|
|
@ -2046,24 +2057,7 @@ class NetxopsCardController {
|
|||
this.store.set(this.projection());
|
||||
return;
|
||||
}
|
||||
call("/api", "directoryPicker/pick", { args: {} }).then((result) => {
|
||||
if (typeof result === "string" || result === null) {
|
||||
applyPath(result);
|
||||
return;
|
||||
}
|
||||
if (result !== null && typeof result === "object") {
|
||||
const row = result;
|
||||
if (row.ok === false) {
|
||||
fail(row.error?.message || "directoryPicker/pick failed");
|
||||
return;
|
||||
}
|
||||
if ("value" in row) {
|
||||
applyPath(row.value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
applyPath(result);
|
||||
}).catch(fail).finally(() => {
|
||||
call("/api", "directoryPicker/pick", { args: {} }).then(acceptPickResult).catch(fail).finally(() => {
|
||||
this.kbBrowseInFlight = false;
|
||||
this.store.set(this.projection());
|
||||
});
|
||||
|
|
@ -2215,6 +2209,37 @@ function refOf(snapshot) {
|
|||
const declared = snapshot.value?.tokenCredentialRef;
|
||||
return declared !== undefined && declared.length > 0 ? declared : DEFAULT_TOKEN_REF;
|
||||
}
|
||||
function unwrapDirectoryPickResult(result) {
|
||||
if (result === null)
|
||||
return null;
|
||||
if (typeof result === "string") {
|
||||
const trimmed = result.trim();
|
||||
return trimmed === "" ? null : trimmed;
|
||||
}
|
||||
if (result === null || typeof result !== "object" || Array.isArray(result))
|
||||
return;
|
||||
const row = result;
|
||||
if (row.ok === false) {
|
||||
throw new Error(row.error?.message || "directoryPicker/pick failed");
|
||||
}
|
||||
if ("value" in row) {
|
||||
if (row.value === null)
|
||||
return null;
|
||||
if (typeof row.value === "string") {
|
||||
const trimmed = row.value.trim();
|
||||
return trimmed === "" ? null : trimmed;
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
function safeJson(value) {
|
||||
try {
|
||||
return JSON.stringify(value);
|
||||
} catch {
|
||||
return String(value);
|
||||
}
|
||||
}
|
||||
|
||||
// src/client/locales.ts
|
||||
var en = {
|
||||
|
|
@ -2237,11 +2262,11 @@ var en = {
|
|||
groupInPreset: "In Netx Ops preset",
|
||||
groupPublic: "Publish to other presets",
|
||||
kbRoot: "Package root",
|
||||
kbRootHint: "Folder with MANIFEST.json (operator-subset v1.0). Empty = pure netx.",
|
||||
kbRootHint: "Folder with MANIFEST.json (operator-subset v1.0). Browse auto-saves.",
|
||||
kbBrowse: "Browse…",
|
||||
kbBrowseUnavailable: "Directory picker unavailable — paste an absolute folder path, then Save.",
|
||||
kbBrowseFailed: "Browse failed: {detail}",
|
||||
kbSaveHint: "Click Save after choosing a path to apply the knowledge base.",
|
||||
kbSaveHint: "Browse writes and saves automatically. Manual paste still needs Save.",
|
||||
kbStatusConfigured: "Knowledge base: {operator} ({country}) v{version}",
|
||||
kbStatusUnconfigured: "Knowledge base: not configured (pure netx)",
|
||||
kbStatusError: "Knowledge base: error — {detail}",
|
||||
|
|
@ -2309,11 +2334,11 @@ var zh = {
|
|||
groupInPreset: "在 Netx Ops 预设中启用",
|
||||
groupPublic: "对其他预设公开",
|
||||
kbRoot: "知识包根目录",
|
||||
kbRootHint: "含 MANIFEST.json 的运营商子集包(v1.0)。留空=纯 netx。",
|
||||
kbRootHint: "含 MANIFEST.json 的运营商子集包(v1.0)。浏览选目录后会自动保存。",
|
||||
kbBrowse: "浏览…",
|
||||
kbBrowseUnavailable: "目录选择器不可用 — 请粘贴绝对目录路径后点保存。",
|
||||
kbBrowseFailed: "浏览失败:{detail}",
|
||||
kbSaveHint: "选好路径后请点「保存」,知识库才会生效。",
|
||||
kbSaveHint: "点「浏览」选目录后会自动写入并保存;若是手粘路径仍需点保存。",
|
||||
kbStatusConfigured: "知识库: {operator}({country}) v{version}",
|
||||
kbStatusUnconfigured: "知识库: 未配置(纯 netx)",
|
||||
kbStatusError: "知识库: 错误 — {detail}",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue