diff --git a/scripts/index.js b/scripts/index.js
index ba0fe44..5097ec8 100644
--- a/scripts/index.js
+++ b/scripts/index.js
@@ -60,9 +60,9 @@ async function populateInstances () {
`;
for (let i = 0; i < instances.length; i++) {
- const newInstance = new Instance();
+ const newInstance = document.createElement("instance-card");
newInstance.data = instances[i];
- instanceContainer.append(newInstance.shadowElement);
+ instanceContainer.append(newInstance);
}
}
@@ -198,41 +198,42 @@ async function handleInstanceAdd () {
d.querySelector("#vmid").max = userCluster.vmid.max;
}
-class Instance {
+class InstanceCard extends HTMLElement {
constructor () {
- const shadowRoot = document.createElement("div");
- shadowRoot.classList.add("w3-row");
-
- shadowRoot.innerHTML = `
-
-
-
-
-
+ super();
+ this.attachShadow({ mode: "open" });
+ this.shadowRoot.innerHTML = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
`;
-
- this.shadowElement = shadowRoot;
this.actionLock = false;
}
@@ -259,33 +260,33 @@ class Instance {
}
update () {
- const vmidParagraph = this.shadowElement.querySelector("#instance-id");
+ const vmidParagraph = this.shadowRoot.querySelector("#instance-id");
vmidParagraph.innerText = this.vmid;
- const nameParagraph = this.shadowElement.querySelector("#instance-name");
+ const nameParagraph = this.shadowRoot.querySelector("#instance-name");
nameParagraph.innerText = this.name ? this.name : "";
- const typeParagraph = this.shadowElement.querySelector("#instance-type");
+ const typeParagraph = this.shadowRoot.querySelector("#instance-type");
typeParagraph.innerText = this.type;
- const statusParagraph = this.shadowElement.querySelector("#instance-status");
+ const statusParagraph = this.shadowRoot.querySelector("#instance-status");
statusParagraph.innerText = this.status;
- const statusIcon = this.shadowElement.querySelector("#instance-status-icon");
+ const statusIcon = this.shadowRoot.querySelector("#instance-status-icon");
statusIcon.src = instancesConfig[this.status].status.src;
statusIcon.alt = instancesConfig[this.status].status.alt;
- const nodeNameParagraph = this.shadowElement.querySelector("#node-name");
+ const nodeNameParagraph = this.shadowRoot.querySelector("#node-name");
nodeNameParagraph.innerText = this.node.name;
- const nodeStatusParagraph = this.shadowElement.querySelector("#node-status");
+ const nodeStatusParagraph = this.shadowRoot.querySelector("#node-status");
nodeStatusParagraph.innerText = this.node.status;
- const nodeStatusIcon = this.shadowElement.querySelector("#node-status-icon");
+ const nodeStatusIcon = this.shadowRoot.querySelector("#node-status-icon");
nodeStatusIcon.src = nodesConfig[this.node.status].status.src;
nodeStatusIcon.alt = nodesConfig[this.node.status].status.src;
- const powerButton = this.shadowElement.querySelector("#power-btn");
+ const powerButton = this.shadowRoot.querySelector("#power-btn");
powerButton.src = instancesConfig[this.status].power.src;
powerButton.alt = instancesConfig[this.status].power.alt;
powerButton.title = instancesConfig[this.status].power.alt;
@@ -294,7 +295,7 @@ class Instance {
powerButton.onclick = this.handlePowerButton.bind(this);
}
- const configButton = this.shadowElement.querySelector("#configure-btn");
+ const configButton = this.shadowRoot.querySelector("#configure-btn");
configButton.src = instancesConfig[this.status].config.src;
configButton.alt = instancesConfig[this.status].config.alt;
configButton.title = instancesConfig[this.status].config.alt;
@@ -303,7 +304,7 @@ class Instance {
configButton.onclick = this.handleConfigButton.bind(this);
}
- const consoleButton = this.shadowElement.querySelector("#console-btn");
+ const consoleButton = this.shadowRoot.querySelector("#console-btn");
consoleButton.src = instancesConfig[this.status].console.src;
consoleButton.alt = instancesConfig[this.status].console.alt;
consoleButton.title = instancesConfig[this.status].console.alt;
@@ -312,7 +313,7 @@ class Instance {
consoleButton.onclick = this.handleConsoleButton.bind(this);
}
- const deleteButton = this.shadowElement.querySelector("#delete-btn");
+ const deleteButton = this.shadowRoot.querySelector("#delete-btn");
deleteButton.src = instancesConfig[this.status].delete.src;
deleteButton.alt = instancesConfig[this.status].delete.alt;
deleteButton.title = instancesConfig[this.status].delete.alt;
@@ -403,7 +404,7 @@ class Instance {
const result = await requestAPI(`/cluster/${this.node.name}/${this.type}/${this.vmid}/delete`, "DELETE");
if (result.status === 200) {
- this.shadowElement.parentElement.removeChild(this.shadowElement);
+ this.parentElement.removeChild(this);
}
else {
alert(result.error);
@@ -416,3 +417,5 @@ class Instance {
}
}
}
+
+customElements.define("instance-card", InstanceCard);