custom_components/bahmcloud_store/panel/app.js aktualisiert

This commit is contained in:
2026-01-15 16:08:48 +00:00
parent bcfbf7151c
commit 1794d579d2

View File

@@ -1,14 +1,12 @@
async function apiGet() { async function apiGet() {
const r = await fetch("/api/bahmcloud_store", { credentials: "same-origin" }); const r = await fetch("/api/bcs", { credentials: "same-origin" });
return await r.json(); return await r.json();
} }
async function apiPost(payload) { async function apiRefresh() {
const r = await fetch("/api/bahmcloud_store", { const r = await fetch("/api/bcs?action=refresh", {
method: "POST", method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "same-origin", credentials: "same-origin",
body: JSON.stringify(payload),
}); });
return await r.json(); return await r.json();
} }
@@ -26,45 +24,30 @@ function el(tag, attrs = {}, children = []) {
return n; return n;
} }
function card(pkg) { function card(repo) {
const installedBadge = el("span", { class: "badge" }, [pkg.installed ? "Installed" : "Not installed"]);
const title = el("div", {}, [ const title = el("div", {}, [
el("strong", {}, [pkg.name]), el("strong", {}, [repo.name]),
el("div", { class: "muted" }, [pkg.repo]), el("div", { class: "muted" }, [repo.url]),
]); ]);
const ver = el("div", { class: "muted" }, [ const provider = el("div", { class: "muted" }, [
`Installed: ${pkg.installed_version || "-"} | Latest: ${pkg.latest_version || "-"}` `Provider: ${repo.provider || "-"}`
]); ]);
const btnInstall = el("button", { const version = el("div", { class: "muted" }, [
onclick: async () => { `Latest: ${repo.latest_version || "-"}`
btnInstall.disabled = true; ]);
btnInstall.textContent = "Working...";
await apiPost({ op: "install", package_id: pkg.id });
await load();
}
}, [pkg.installed ? "Reinstall" : "Install"]);
const btnUpdate = el("button", { const sourceBadge = el(
onclick: async () => { "span",
btnUpdate.disabled = true; { class: "badge" },
btnUpdate.textContent = "Working..."; [repo.source === "custom" ? "Custom" : "Index"]
await apiPost({ op: "update", package_id: pkg.id }); );
await load();
}
}, ["Update"]);
// Update-Button nur wenn installiert
btnUpdate.disabled = !pkg.installed;
const actions = el("div", { class: "actions" }, [btnInstall, btnUpdate]);
return el("div", { class: "card" }, [ return el("div", { class: "card" }, [
el("div", { class: "row" }, [title, installedBadge]), el("div", { class: "row" }, [title, sourceBadge]),
ver, provider,
actions version
]); ]);
} }
@@ -75,13 +58,44 @@ async function load() {
status.textContent = "Loading..."; status.textContent = "Loading...";
list.innerHTML = ""; list.innerHTML = "";
const data = await apiGet(); try {
status.textContent = `Store: ${data.store_url}`; const data = await apiGet();
for (const pkg of data.packages) { if (!data.ok) {
list.appendChild(card(pkg)); status.textContent = "Failed to load store data";
return;
}
status.textContent = `BCS ${data.version} ${data.repos.length} repositories`;
for (const repo of data.repos) {
list.appendChild(card(repo));
}
} catch (e) {
console.error("BCS load failed:", e);
status.textContent = "Error loading store data";
} }
} }
document.getElementById("refresh").onclick = load; const refreshBtn = document.getElementById("refresh");
refreshBtn.onclick = async () => {
refreshBtn.disabled = true;
const oldText = refreshBtn.textContent;
refreshBtn.textContent = "Refreshing...";
try {
const r = await apiRefresh();
if (!r.ok) {
console.error("BCS refresh failed:", r);
}
await load();
} catch (e) {
console.error("BCS refresh error:", e);
} finally {
refreshBtn.disabled = false;
refreshBtn.textContent = oldText;
}
};
load(); load();