custom_components/bahmcloud_store/panel/app.js aktualisiert
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user