feat(t215): 每個知識庫顯示是否要更新,落後就給 install 頁連結
leo 08-08:「在每個知識庫會看到其他需要更新的,在每個知識庫上顯示是否要更新, 如果要,加開啓 install 頁的連結」。小幫手以前只提示自己(daemon 本體)要不要 更新,使用者連著多個雲端知識庫時完全看不出哪一個落後。 - collector/cloud_latest.go:EvalCloudUpdate + FetchLatestCloudRelease(30 分鐘節流), 判準與 portal 版本卡 loadVersion() 同一套(bundle_version vs install.arcrun.dev/ api/latest 的 release,semver 逐段整數比較),不是 t103 minCloudRelease 那把相容 底線,避免同一個知識庫在兩處得到相反答案。 - direct.go/sync_status.go:每輪同步順帶算好每個帳號的 CloudUpdateKnown/ CloudUpdateStale/CloudLatest,寫進 status.json。 - app.go:GetState 把這些欄位接進 UIAccount,供前端讀。 - main.js/style.css:首頁新增「知識庫版本」卡(每庫一行,落後才出現「前往安裝頁 更新」按鈕,帶 email 預填);側邊欄庫名旁加警示點;各庫頁也顯示同一行版本狀態。 查不到版本(連不上/latest 暫時查不到)一律誠實說「查不到」,不當成「已最新」。 已用假 window.go 在瀏覽器實測四種情境(落後/已最新/連不上/查得到 mine 但查不到 latest)+零知識庫的 onboarding 頁+深色模式,畫面與按鈕行為皆符合預期。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -37,6 +37,16 @@ $('overlay').addEventListener('click', (e) => { if (e.target.id === 'overlay') c
|
||||
document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeSheet(); });
|
||||
|
||||
// ── 側邊欄:每個知識庫一項(leo:「每個帳號有獨立的一個頁面」)──
|
||||
//
|
||||
// t215(2026-08-08,leo:「在每個知識庫上顯示是否要更新」):落後的庫名旁加一顆
|
||||
// 警示點,逛清單時不用點進每個庫就能一眼看出哪個落後(完整說明+更新按鈕在
|
||||
// 首頁 cardKbVersions 與各庫頁 kbVersionLine)。
|
||||
//
|
||||
// 🔴 頂層 status.md 08-08 深夜記過一個**待 leo confirm、尚未定案**的提案:
|
||||
// 「單一更新入口(版本白癡化)」——把小幫手自我更新與雲端知識庫更新合併成一顆按鈕。
|
||||
// 那個提案沒有否定「每庫獨立列出落後狀態」這件事本身(它本來就要「點進去才看細節」),
|
||||
// 只是問「總覽要不要合併」。這裡先實作 leo 這次明確要的「每庫看得到+連得到」,
|
||||
// 之後若那個提案 confirm,是在這層之上疊總覽 pill,不是重做這裡。
|
||||
function renderNav() {
|
||||
const accs = (state && state.accounts) || [];
|
||||
$('nav').innerHTML = `
|
||||
@@ -45,6 +55,7 @@ function renderNav() {
|
||||
${accs.map((a, i) => `
|
||||
<div class="nav" data-p="lib:${i}">
|
||||
<span class="ic">▤</span><span class="nm">${esc(a.name)}</span>
|
||||
${a.cloudVerStale ? `<span class="dot warn" title="有新版可更新"></span>` : ''}
|
||||
<span class="cnt">${(a.folders || []).length}</span>
|
||||
</div>`).join('')}
|
||||
<div class="sec">設定</div>
|
||||
@@ -75,6 +86,7 @@ function pageHome(s) {
|
||||
${cardTrouble(s)}
|
||||
${cardProgress(s.progress)}
|
||||
${cardSkipped(s.skipped)}
|
||||
${cardKbVersions(s)}
|
||||
<div class="card">
|
||||
<h3>總計</h3>
|
||||
<div class="kv" style="margin-top:10px">
|
||||
@@ -84,6 +96,60 @@ function pageHome(s) {
|
||||
</div>`;
|
||||
}
|
||||
|
||||
// t215(2026-08-08,leo:「在每個知識庫上顯示是否要更新,如果要,加開啓 install 頁的
|
||||
// 連結」)——一個使用者可能連著不只一個知識庫(leo 自己就是),各自雲端版本不同步時,
|
||||
// 以前完全看不出「哪一個」落後、也沒有地方按。這張卡讓使用者不必逐個庫點進去,
|
||||
// 首頁一眼看完全部知識庫的版本狀態。
|
||||
//
|
||||
// 判準**不在這裡重新發明**:後端 collector.EvalCloudUpdate 與 portal 設定頁那張版本卡
|
||||
// (console-ui/public/portal/index.html 的 loadVersion())同一套比法——自己的
|
||||
// bundle_version 比 install.arcrun.dev/api/latest 的 release,兩邊都是 semver 才逐段
|
||||
// 整數比較,非 semver(老格式)一律視為落後。前端只負責把後端已經算好的
|
||||
// cloudVerKnown/cloudVerStale 翻成人話,不做任何版本比較。
|
||||
function cardKbVersions(s) {
|
||||
const accs = s.accounts || [];
|
||||
if (!accs.length) return '';
|
||||
return `
|
||||
<div class="card">
|
||||
<h3>知識庫版本</h3>
|
||||
<div class="kblist">
|
||||
${accs.map((a) => `
|
||||
<div class="kbrow">
|
||||
<span class="nm">${esc(a.name)}</span>
|
||||
<span class="right">${kbVersionLine(a)}</span>
|
||||
</div>`).join('')}
|
||||
</div>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
// kbVersionLine:單一知識庫的版本判定文案,首頁卡與各庫頁共用同一份翻譯,
|
||||
// 不讓兩處各寫各的文字(那樣才真的會出現「兩處講不同的話」)。
|
||||
//
|
||||
// 三種情況都要照實講(cloud_version.go 記過的坑:把「查不到」呈現成「一切正常」):
|
||||
// ① Known 且落後 → 紅字+按鈕,按下去帶 email 開 install 頁(同 portal 版本卡的預填做法)
|
||||
// ② Known 且已最新 → 淡字「已是最新版」
|
||||
// ③ 不 Known → 照原因分兩句:連不上這個知識庫/查得到目前版本但暫時查不到最新版
|
||||
function kbVersionLine(a) {
|
||||
if (!a.cloudVerKnown) {
|
||||
const detail = a.cloudVerMine
|
||||
? `已知版本 ${esc(a.cloudVerMine)},暫時查不到最新版本(稍後會自動再查)`
|
||||
: '目前連不上這個知識庫,查不到版本';
|
||||
return `<span class="d">${detail}</span>`;
|
||||
}
|
||||
if (a.cloudVerStale) {
|
||||
return `<span class="warn">有新版可更新(目前 ${esc(a.cloudVerMine)} → 最新 ${esc(a.cloudVerLatest)})</span>
|
||||
<button class="ghost" data-updatekb="${esc(a.email || '')}">前往安裝頁更新</button>`;
|
||||
}
|
||||
return `<span class="d">已是最新版(${esc(a.cloudVerMine)})</span>`;
|
||||
}
|
||||
|
||||
// installURLFor:與 portal 版本卡同一個做法——落後才需要按,按下去帶 email 讓安裝頁
|
||||
// 預填,既有實例更新免辨識碼(安裝器 t154),不必讓使用者自己去 install.arcrun.dev 找。
|
||||
function installURLFor(email) {
|
||||
const base = 'https://install.arcrun.dev/';
|
||||
return email ? base + '?email=' + encodeURIComponent(email) : base;
|
||||
}
|
||||
|
||||
// 🔴 G-6.2「不准安靜地略過」(2026-08-06)——J-1/S6 考題的後半句:
|
||||
// 「Then 我一樣找得到——**或當場被告知這種檔案還不支援**」
|
||||
// 以前 .doc/.pages 這類檔在 collector 掃描時就被丟掉,畫面上一個字都沒有,
|
||||
@@ -172,6 +238,7 @@ function pageLib(s, idx) {
|
||||
<button data-portal="${esc(portal)}">開啟知識庫網頁</button>
|
||||
<button class="primary" data-addto="${idx}">加入資料夾</button>
|
||||
</div>
|
||||
<div class="kbver">${kbVersionLine(a)}</div>
|
||||
${(a.folders || []).map((f) => `
|
||||
<div class="folder">
|
||||
<span class="path" title="${esc(f.path)}">${esc(f.path)}</span>
|
||||
@@ -291,6 +358,9 @@ function wire() {
|
||||
on('uDiag', exportDiagnostics);
|
||||
document.querySelectorAll('[data-portal]').forEach((b) => { b.onclick = () => go.OpenURL(b.dataset.portal); });
|
||||
document.querySelectorAll('[data-openurl]').forEach((b) => { b.onclick = () => go.OpenURL(b.dataset.openurl); });
|
||||
document.querySelectorAll('[data-updatekb]').forEach((b) => {
|
||||
b.onclick = () => go.OpenURL(installURLFor(b.dataset.updatekb));
|
||||
});
|
||||
document.querySelectorAll('[data-addto]').forEach((b) => { b.onclick = () => addFolder(Number(b.dataset.addto)); });
|
||||
document.querySelectorAll('[data-rm]').forEach((b) => {
|
||||
b.onclick = () => confirmRemove(Number(b.dataset.acc), b.dataset.rm);
|
||||
|
||||
Reference in New Issue
Block a user