ResMan update

This commit is contained in:
ecki
2026-03-10 18:54:22 +01:00
parent d748c19242
commit 227c2a4c36
9 changed files with 133 additions and 46 deletions
+19
View File
@@ -283,6 +283,25 @@ Domains jährlich: <span id="costDomain">0</span> €<br>
<button onclick="closeDomainModal()">Cancel</button>
</div>
<div id="serverDetailModal" class="modal">
<div class="modal-content">
<h3>Server Details</h3>
<div id="serverDetailContent"></div>
<br>
<button onclick="closeServerDetail()">Schließen</button>
</div>
</div>
<script src="js/api.js"></script>
<script src="js/ui.js"></script>
<script src="js/main.js"></script>
-1
View File
@@ -1 +0,0 @@
loadCosts
-7
View File
@@ -1,7 +0,0 @@
loadDomains
openDomainCreate
openDomainEdit
saveDomain
deleteDomain
closeDomainModal
loadMapping
-3
View File
@@ -1,3 +0,0 @@
loadInfrastructure
openServerDetail
closeServerDetail
-5
View File
@@ -1,5 +0,0 @@
openIPManager
closeIPModal
loadIPs
saveIP
deleteIP
-21
View File
@@ -1,21 +0,0 @@
const API="/resman/api";
async function api(url, options={}){
const res = await fetch(url, options);
if(!res.ok){
let msg="API error";
try{
const err=await res.json();
msg=err.error || msg;
}catch(e){}
alert("Fehler: "+msg);
throw new Error(msg);
}
return res.json();
}
+17
View File
@@ -4,5 +4,22 @@ document.addEventListener("DOMContentLoaded",()=>{
loadDomains();
loadCosts();
setInterval(()=>{
document.querySelectorAll("[id^='status-']").forEach(el=>{
const id = el.id.replace("status-","")
const resource = window.resources.find(r=>r.id==id)
if(resource){
checkServerStatus(resource)
}
})
},30000)
});
-8
View File
@@ -1,8 +0,0 @@
loadResources
loadCancelled
openCreate
openEdit
saveResource
deleteResource
closeModal
checkServerStatus
+97 -1
View File
@@ -25,7 +25,12 @@ async function loadResources(){
const tr = document.createElement("tr");
tr.innerHTML = `
<td>${r.name}</td>
<td>
<span style="cursor:pointer;color:#1e3a8a;font-weight:bold"
onclick='openServerDetail(${JSON.stringify(r)})'>
${r.name}
</span>
</td>
<td>${r.produkt || ""}</td>
<td><span class="provider">${r.provider || ""}</span></td>
<td id="status-${r.id}">...</td>
@@ -594,6 +599,97 @@ async function deleteIP(id, resourceId){
}
async function openServerDetail(resource){
const mappings = await api(API+"/domainmap")
let html = `
<b>Name:</b> ${resource.name}<br>
<b>Produkt:</b> ${resource.produkt || ""}<br>
<b>Provider:</b> ${resource.provider || ""}<br>
<b>Provider Name:</b> ${resource.providername || ""}
<br><br>
<b>System</b><br>
CPU: ${resource.cpu || ""}<br>
RAM: ${resource.ram || ""}<br>
Disk: ${resource.disk || ""}<br>
OS: ${resource.os || ""}
<br><br>
<b>IPs</b><br>
`
if(Array.isArray(resource.ips)){
resource.ips.forEach(ip=>{
html += `<div class="ip">${ip.type || ""} ${ip.ip}</div>`
})
}
html += `<br><b>Domains</b><br>`
const domains = mappings.filter(m => m.resource_id == resource.id)
domains.forEach(d=>{
html += `<div class="ip">🌐 ${d.domain_name}</div>`
})
html += `
<br>
<b>Bestelldatum:</b> ${resource.bestelldatum || ""}<br>
<b>Kündbar ab:</b> ${resource.kuendbar_ab || ""}
<br><br>
<b>Bemerkung</b><br>
${resource.bemerkung || ""}
`
document.getElementById("serverDetailContent").innerHTML = html
document.getElementById("serverDetailModal").style.display="block"
}
function closeServerDetail(){
document.getElementById("serverDetailModal").style.display="none"
}
document.addEventListener("click", function(event){
const modal = document.getElementById("serverDetailModal");
if(!modal) return;
if(event.target === modal){
modal.style.display = "none";
}
});
document.addEventListener("keydown", function(e){
if(e.key === "Escape"){
const modal = document.getElementById("serverDetailModal");
if(modal) modal.style.display="none";
}
});
loadResources();
loadDomains();
loadMapping();