implement ssr modal dialog for index and account
This commit is contained in:
1
ProxmoxAAS-Fabric
Submodule
1
ProxmoxAAS-Fabric
Submodule
Submodule ProxmoxAAS-Fabric added at 81815bab82
@@ -73,5 +73,30 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
<modal-dialog id="change-password-dialog">
|
||||||
|
<template shadowrootmode="open">
|
||||||
|
<link rel="stylesheet" href="modules/w3.css">
|
||||||
|
<link rel="stylesheet" href="css/style.css">
|
||||||
|
<link rel="stylesheet" href="css/form.css">
|
||||||
|
<dialog class="w3-container w3-card w3-border-0">
|
||||||
|
<p class="w3-large" id="prompt" style="text-align: center;">
|
||||||
|
Change Password
|
||||||
|
</p>
|
||||||
|
<div id="body">
|
||||||
|
<form method="dialog" class="input-grid" style="grid-template-columns: auto 1fr;" id="form">
|
||||||
|
<label for="new-password">New Password</label>
|
||||||
|
<input class="w3-input w3-border" id="new-password" name="new-password" type="password" required>
|
||||||
|
<label for="confirm-password">Confirm Password</label>
|
||||||
|
<input class="w3-input w3-border" id="confirm-password" name="confirm-password" type="password" required>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div id="controls" class="w3-center w3-container">
|
||||||
|
<button id="cancel" type="submit" value="cancel" form="form" class="w3-button w3-margin" style="background-color: var(--negative-color, #f00); color: var(--lightbg-text-color, black);" formnovalidate>CANCEL</button>
|
||||||
|
<button id="confirm" type="submit" value="confirm" form="form" class="w3-button w3-margin" style="background-color: var(--positive-color, #0f0); color: var(--lightbg-text-color, black);">CONFIRM</button>
|
||||||
|
</div>
|
||||||
|
</dialog>
|
||||||
|
</template>
|
||||||
|
</modal-dialog>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@@ -63,56 +63,56 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
</body>
|
|
||||||
|
|
||||||
<modal-dialog id="create-instance-dialog">
|
<modal-dialog id="create-instance-dialog">
|
||||||
<template shadowrootmode="open">
|
<template shadowrootmode="open">
|
||||||
<link rel="stylesheet" href="modules/w3.css">
|
<link rel="stylesheet" href="modules/w3.css">
|
||||||
<link rel="stylesheet" href="css/style.css">
|
<link rel="stylesheet" href="css/style.css">
|
||||||
<link rel="stylesheet" href="css/form.css">
|
<link rel="stylesheet" href="css/form.css">
|
||||||
<dialog class="w3-container w3-card w3-border-0">
|
<dialog class="w3-container w3-card w3-border-0">
|
||||||
<p class="w3-large" id="prompt" style="text-align: center;">
|
<p class="w3-large" id="prompt" style="text-align: center;">
|
||||||
Create New Instance
|
Create New Instance
|
||||||
</p>
|
</p>
|
||||||
<div id="body">
|
<div id="body">
|
||||||
<form method="dialog" class="input-grid" style="grid-template-columns: auto 1fr;" id="form">
|
<form method="dialog" class="input-grid" style="grid-template-columns: auto 1fr;" id="form">
|
||||||
<label for="type">Instance Type</label>
|
<label for="type">Instance Type</label>
|
||||||
<select class="w3-select w3-border" name="type" id="type" selected-index="-1" required>
|
<select class="w3-select w3-border" name="type" id="type" selected-index="-1" required>
|
||||||
<option value="lxc">Container</option>
|
<option value="lxc">Container</option>
|
||||||
<option value="qemu">Virtual Machine</option>
|
<option value="qemu">Virtual Machine</option>
|
||||||
</select>
|
</select>
|
||||||
<label for="node">Node</label>
|
<label for="node">Node</label>
|
||||||
<select class="w3-select w3-border" name="node" id="node" required></select>
|
<select class="w3-select w3-border" name="node" id="node" required></select>
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
<input class="w3-input w3-border" name="name" id="name" type="text" required>
|
<input class="w3-input w3-border" name="name" id="name" type="text" required>
|
||||||
<label for="vmid">ID</label>
|
<label for="vmid">ID</label>
|
||||||
<input class="w3-input w3-border" name="vmid" id="vmid" type="number" required>
|
<input class="w3-input w3-border" name="vmid" id="vmid" type="number" required>
|
||||||
<label for="pool">Pool</label>
|
<label for="pool">Pool</label>
|
||||||
<select class="w3-select w3-border" name="pool" id="pool" required></select>
|
<select class="w3-select w3-border" name="pool" id="pool" required></select>
|
||||||
<label for="cores">Cores (Threads)</label>
|
<label for="cores">Cores (Threads)</label>
|
||||||
<input class="w3-input w3-border" name="cores" id="cores" type="number" min="1" max="8192" required>
|
<input class="w3-input w3-border" name="cores" id="cores" type="number" min="1" max="8192" required>
|
||||||
<label for="memory">Memory (MiB)</label>
|
<label for="memory">Memory (MiB)</label>
|
||||||
<input class="w3-input w3-border" name="memory" id="memory" type="number" min="16" step="1" required>
|
<input class="w3-input w3-border" name="memory" id="memory" type="number" min="16" step="1" required>
|
||||||
<p class="container-specific none" style="grid-column: 1 / span 2; text-align: center;">Container Options</p>
|
<p class="container-specific none" style="grid-column: 1 / span 2; text-align: center;">Container Options</p>
|
||||||
<label class="container-specific none" for="swap">Swap (MiB)</label>
|
<label class="container-specific none" for="swap">Swap (MiB)</label>
|
||||||
<input class="w3-input w3-border container-specific none" name="swap" id="swap" type="number" min="0" step="1" required disabled>
|
<input class="w3-input w3-border container-specific none" name="swap" id="swap" type="number" min="0" step="1" required disabled>
|
||||||
<label class="container-specific none" for="template-image">Template Image</label>
|
<label class="container-specific none" for="template-image">Template Image</label>
|
||||||
<select class="w3-select w3-border container-specific none" name="template-image" id="template-image" required disabled></select>
|
<select class="w3-select w3-border container-specific none" name="template-image" id="template-image" required disabled></select>
|
||||||
<label class="container-specific none" for="rootfs-storage">ROOTFS Storage</label>
|
<label class="container-specific none" for="rootfs-storage">ROOTFS Storage</label>
|
||||||
<select class="w3-select w3-border container-specific none" name="rootfs-storage" id="rootfs-storage" required disabled></select>
|
<select class="w3-select w3-border container-specific none" name="rootfs-storage" id="rootfs-storage" required disabled></select>
|
||||||
<label class="container-specific none" for="rootfs-size">ROOTFS Size (GiB)</label>
|
<label class="container-specific none" for="rootfs-size">ROOTFS Size (GiB)</label>
|
||||||
<input class="w3-input w3-border container-specific none" name="rootfs-size" id="rootfs-size" type="number" min="0" max="131072" required disabled>
|
<input class="w3-input w3-border container-specific none" name="rootfs-size" id="rootfs-size" type="number" min="0" max="131072" required disabled>
|
||||||
<label class="container-specific none" for="password">Password</label>
|
<label class="container-specific none" for="password">Password</label>
|
||||||
<input class="w3-input w3-border container-specific none" name="password" id="password" type="password" required disabled>
|
<input class="w3-input w3-border container-specific none" name="password" id="password" type="password" required disabled>
|
||||||
<label class="container-specific none" for="confirm-password">Confirm Password</label>
|
<label class="container-specific none" for="confirm-password">Confirm Password</label>
|
||||||
<input class="w3-input w3-border container-specific none" name="confirm-password" id="confirm-password" type="password" required disabled>
|
<input class="w3-input w3-border container-specific none" name="confirm-password" id="confirm-password" type="password" required disabled>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div id="controls" class="w3-center w3-container">
|
<div id="controls" class="w3-center w3-container">
|
||||||
<button id="cancel" type="submit" value="cancel" form="form" class="w3-button w3-margin" style="background-color: var(--negative-color, #f00); color: var(--lightbg-text-color, black);" formnovalidate>CANCEL</button>
|
<button id="cancel" type="submit" value="cancel" form="form" class="w3-button w3-margin" style="background-color: var(--negative-color, #f00); color: var(--lightbg-text-color, black);" formnovalidate>CANCEL</button>
|
||||||
<button id="confirm" type="submit" value="confirm" form="form" class="w3-button w3-margin" style="background-color: var(--positive-color, #0f0); color: var(--lightbg-text-color, black);">CONFIRM</button>
|
<button id="confirm" type="submit" value="confirm" form="form" class="w3-button w3-margin" style="background-color: var(--positive-color, #0f0); color: var(--lightbg-text-color, black);">CONFIRM</button>
|
||||||
</div>
|
</div>
|
||||||
</dialog>
|
</dialog>
|
||||||
</template>
|
</template>
|
||||||
</modal-dialog>
|
</modal-dialog>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
@@ -1,24 +1,18 @@
|
|||||||
import { dialog } from "./dialog.js";
|
|
||||||
import { requestAPI, setAppearance } from "./utils.js";
|
import { requestAPI, setAppearance } from "./utils.js";
|
||||||
|
import "./dialog.js";
|
||||||
|
|
||||||
window.addEventListener("DOMContentLoaded", init);
|
window.addEventListener("DOMContentLoaded", init);
|
||||||
|
|
||||||
async function init () {
|
async function init () {
|
||||||
setAppearance();
|
setAppearance();
|
||||||
|
|
||||||
document.querySelector("#change-password").addEventListener("click", handlePasswordChangeForm);
|
initPasswordChangeForm();
|
||||||
|
document.querySelector("#change-password").addEventListener("click", handlePasswordChangeButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
function handlePasswordChangeForm () {
|
function initPasswordChangeForm () {
|
||||||
const body = `
|
const d = document.querySelector("#change-password-dialog");
|
||||||
<form method="dialog" class="input-grid" style="grid-template-columns: auto 1fr;" id="form">
|
d.setOnClose(async (result, form) => {
|
||||||
<label for="new-password">New Password</label>
|
|
||||||
<input class="w3-input w3-border" id="new-password" name="new-password" type="password"required>
|
|
||||||
<label for="confirm-password">Confirm Password</label>
|
|
||||||
<input class="w3-input w3-border" id="confirm-password" name="confirm-password" type="password" required>
|
|
||||||
</form>
|
|
||||||
`;
|
|
||||||
const d = dialog("Change Password", body, async (result, form) => {
|
|
||||||
if (result === "confirm") {
|
if (result === "confirm") {
|
||||||
const result = await requestAPI("/access/password", "POST", { password: form.get("new-password") });
|
const result = await requestAPI("/access/password", "POST", { password: form.get("new-password") });
|
||||||
if (result.status !== 200) {
|
if (result.status !== 200) {
|
||||||
@@ -37,3 +31,8 @@ function handlePasswordChangeForm () {
|
|||||||
password.addEventListener("change", validatePassword);
|
password.addEventListener("change", validatePassword);
|
||||||
confirmPassword.addEventListener("keyup", validatePassword);
|
confirmPassword.addEventListener("keyup", validatePassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handlePasswordChangeButton () {
|
||||||
|
const d = document.querySelector("#change-password-dialog");
|
||||||
|
d.showModal();
|
||||||
|
}
|
||||||
|
@@ -323,6 +323,7 @@ function sortInstances () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function initInstanceAddForm () {
|
async function initInstanceAddForm () {
|
||||||
|
// form submit logic
|
||||||
const d = document.querySelector("#create-instance-dialog");
|
const d = document.querySelector("#create-instance-dialog");
|
||||||
d.setOnClose(async (result, form) => {
|
d.setOnClose(async (result, form) => {
|
||||||
if (result === "confirm") {
|
if (result === "confirm") {
|
||||||
@@ -352,6 +353,15 @@ async function initInstanceAddForm () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// custom password validation checker
|
||||||
|
const password = d.querySelector("#password");
|
||||||
|
const confirmPassword = d.querySelector("#confirm-password");
|
||||||
|
function validatePassword () {
|
||||||
|
confirmPassword.setCustomValidity(password.value !== confirmPassword.value ? "Passwords Don't Match" : "");
|
||||||
|
}
|
||||||
|
password.addEventListener("change", validatePassword);
|
||||||
|
confirmPassword.addEventListener("keyup", validatePassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleInstanceAddButton () {
|
async function handleInstanceAddButton () {
|
||||||
@@ -400,6 +410,7 @@ async function handleInstanceAddButton () {
|
|||||||
nodeSelect.addEventListener("change", async () => { // change rootfs storage based on node
|
nodeSelect.addEventListener("change", async () => { // change rootfs storage based on node
|
||||||
const node = nodeSelect.value;
|
const node = nodeSelect.value;
|
||||||
const storage = await requestPVE(`/nodes/${node}/storage`, "GET");
|
const storage = await requestPVE(`/nodes/${node}/storage`, "GET");
|
||||||
|
rootfsStorage.innerHTML = "";
|
||||||
storage.data.forEach((element) => {
|
storage.data.forEach((element) => {
|
||||||
if (element.content.includes(rootfsContent)) {
|
if (element.content.includes(rootfsContent)) {
|
||||||
rootfsStorage.add(new Option(element.storage));
|
rootfsStorage.add(new Option(element.storage));
|
||||||
@@ -443,15 +454,5 @@ async function handleInstanceAddButton () {
|
|||||||
}
|
}
|
||||||
templateImage.selectedIndex = -1;
|
templateImage.selectedIndex = -1;
|
||||||
|
|
||||||
const password = d.querySelector("#password");
|
|
||||||
const confirmPassword = d.querySelector("#confirm-password");
|
|
||||||
|
|
||||||
function validatePassword () {
|
|
||||||
confirmPassword.setCustomValidity(password.value !== confirmPassword.value ? "Passwords Don't Match" : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
password.addEventListener("change", validatePassword);
|
|
||||||
confirmPassword.addEventListener("keyup", validatePassword);
|
|
||||||
|
|
||||||
d.showModal();
|
d.showModal();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user