v4 Schritt 4: News-Board
- routers/news.py: aggregiert kuratierte RSS/Atom-Feeds (HuggingFace, llama.cpp, Ollama, r/LocalLLaMA, Simon Willison) via httpx + stdlib xml.etree, In-memory-Cache 30 min, Hardware-relevante Beitraege (rocm/gfx1151/...) markiert. Degradiert pro Feed sauber. - news.js: Beitragsliste (Quelle, Titel-Link, relatives Datum) + Aktualisieren. - Nav 'News' + View + main.js. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
<a class="nav-item" data-view="server"><span class="ni-ic" data-ic="server"></span><span class="ni-tx">Server</span></a>
|
||||
<a class="nav-item" data-view="cookbook"><span class="ni-ic" data-ic="book"></span><span class="ni-tx">Cookbook</span></a>
|
||||
<a class="nav-item" data-view="connect"><span class="ni-ic" data-ic="swap"></span><span class="ni-tx">Verbinden</span></a>
|
||||
<a class="nav-item" data-view="news"><span class="ni-ic" data-ic="info"></span><span class="ni-tx">News</span></a>
|
||||
<a class="nav-item" data-view="guides"><span class="ni-ic" data-ic="help"></span><span class="ni-tx">Guides</span></a>
|
||||
</nav>
|
||||
<div class="side-foot">
|
||||
@@ -77,6 +78,10 @@
|
||||
<!-- Wird von connect.js gerendert -->
|
||||
</section>
|
||||
|
||||
<section class="view" data-view="news" hidden>
|
||||
<!-- Wird von news.js gerendert -->
|
||||
</section>
|
||||
|
||||
<section class="view" data-view="guides" hidden>
|
||||
<!-- Wird von guides.js gerendert -->
|
||||
</section>
|
||||
|
||||
+2
-1
@@ -11,9 +11,10 @@ import server from "./panels/server.js";
|
||||
import jobs from "./panels/jobs.js";
|
||||
import cookbook from "./panels/cookbook.js";
|
||||
import connect from "./panels/connect.js";
|
||||
import news from "./panels/news.js";
|
||||
import guides from "./panels/guides.js";
|
||||
|
||||
const panels = [overview, models, server, jobs, cookbook, connect, guides];
|
||||
const panels = [overview, models, server, jobs, cookbook, connect, news, guides];
|
||||
|
||||
let lastJobs = [];
|
||||
let lastSystem = null;
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
// news.js — News-Board (v4): kuratierte Neuigkeiten rund um lokale LLMs.
|
||||
|
||||
import { api } from "../core/api.js";
|
||||
import { $, esc, ago } from "../core/ui.js";
|
||||
|
||||
function mount() {
|
||||
$(".view[data-view='news']").innerHTML = `
|
||||
<div class="pagehead">
|
||||
<div><h1>News</h1>
|
||||
<div class="sub">Neuigkeiten rund um lokale LLMs — automatisch aus kuratierten Quellen (HuggingFace, llama.cpp, Ollama, r/LocalLLaMA …).</div></div>
|
||||
<button class="ghost" id="news-refresh">Aktualisieren</button>
|
||||
</div>
|
||||
<div class="card"><div id="news-list">
|
||||
<div class="empty" style="text-align:center;padding:40px">Lade News…</div>
|
||||
</div></div>`;
|
||||
$("#news-refresh").addEventListener("click", load);
|
||||
load();
|
||||
}
|
||||
|
||||
function card(n) {
|
||||
const date = n.ts ? ago(n.ts) : "";
|
||||
const rel = n.relevant ? ' · <span class="text-accent">für deine Hardware</span>' : "";
|
||||
return `<a class="li" href="${esc(n.link)}" target="_blank" rel="noopener" style="text-decoration:none;color:inherit">
|
||||
<div class="li-main">
|
||||
<div style="font-size:14px;line-height:1.4">${esc(n.title)}</div>
|
||||
<div class="li-sub">${esc(n.source)}${rel}</div>
|
||||
</div>
|
||||
<div class="li-right"><div class="li-time">${esc(date)}</div></div>
|
||||
</a>`;
|
||||
}
|
||||
|
||||
async function load() {
|
||||
const el = $("#news-list"); if (!el) return;
|
||||
el.innerHTML = `<div class="empty" style="text-align:center;padding:40px">Lade News… (erstes Laden kann kurz dauern)</div>`;
|
||||
try {
|
||||
const d = await api("/api/news");
|
||||
const items = d.items || [];
|
||||
el.innerHTML = items.length
|
||||
? `<div class="list">${items.map(card).join("")}</div>`
|
||||
: `<div class="empty-c"><div class="e-t">Keine News geladen</div>
|
||||
<div class="e-s">Die Quellen sind gerade nicht erreichbar — später nochmal probieren.</div></div>`;
|
||||
} catch (e) {
|
||||
el.innerHTML = `<div class="alert err" style="margin:0">${esc(e.message)}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
export default { id: "news", mount };
|
||||
Reference in New Issue
Block a user