Files
Self-Service-Dashboard/src/pages/profile_page.html

220 lines
6.7 KiB
HTML

<!doctype html>
<title>Astral Tech - Profile</title>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap"
rel="stylesheet"
/>
<link rel="stylesheet" href="static/style.css" />
<link rel="stylesheet" href="static/card.css" />
<link rel="stylesheet" href="static/error/error.css" />
<link rel="stylesheet" href="static/profile_page.css" />
<div id="popup_background" class="blocked hidden"></div>
<div id="change_password_dialouge" class="hidden card">
<div id="password_error" class="error hidden">
<div id="password_text"></div>
<button id="password_error_close_button" class="close_error_button">
X
</button>
</div>
<input
type="password"
id="current_password"
placeholder="Current Password"
/>
<br />
<input type="password" id="new_password" placeholder="New Password" />
<br />
<input
type="password"
id="new_password_repeat"
placeholder="New Password(repeat)"
/>
<br />
<button id="final_change_password_button">Change Password</button>
</div>
<img id="logo_image" alt="logo" src="/logo" />
<div id="main_content">
<div class="cards">
<div id="user-card" class="card">
<div id="picture_holder">
<img
src="/avatar?user={{.Username}}"
class="profile-pic"
alt="User Image"
/>
<input
type="file"
id="file_input"
accept=".jpg,.jpeg"
style="display: none"
/>
<button id="edit_picture_button">
<img
src="/static/crayon_icon.png"
id="edit_picture_image"
/>
</button>
</div>
<h1>{{.DisplayName}}</h1>
<hr
style="
border: 0;
border-top: 1px solid var(--border-subtle);
margin: 20px 0;
"
/>
<div style="text-align: left">
<span class="data-label">Username</span>
<div class="data-value">{{.Username}}</div>
<span class="data-label">Primary Email</span>
<div class="data-value">{{.Email}}</div>
</div>
<button class="bottom_button" id="change_password_button">
<input
id="csrf_token_storage"
type="hidden"
name="csrf_token"
value="{{.CSRFToken}}"
/>
Change Password
</button>
<form action="/logout" method="POST" style="display: inline-block">
<button class="bottom_button" id="signout_button">
<input
id="csrf_token_storage"
type="hidden"
name="csrf_token"
value="{{.CSRFToken}}"
/>
Sign Out
</button>
</form>
</div>
</div>
</div>
<script type="text/javascript">
const button = document.getElementById("edit_picture_button");
const fileInput = document.getElementById("file_input");
button.addEventListener("click", () => {
fileInput.click(); // opens file picker
});
</script>
<script type="text/javascript">
const popup_botton = document.getElementById("change_password_button");
popup_botton.addEventListener("click", () => {
document.getElementById("popup_background").classList.remove("hidden");
document
.getElementById("change_password_dialouge")
.classList.remove("hidden");
});
</script>
<script type="text/javascript">
const changePasswordButton = document.getElementById(
"final_change_password_button",
);
function displayError(errorText) {
document.getElementById("password_error").classList.remove("hidden");
document.getElementById("password_text").innerText =
"⚠️ " + errorText + ".";
return;
}
changePasswordButton.addEventListener("click", () => {
if (document.getElementById("current_password").value == "") {
displayError("Please enter current password");
return;
}
if (
document.getElementById("new_password").value !=
document.getElementById("new_password_repeat").value
) {
displayError("New password and new password repeat do not match");
return;
}
if (document.getElementById("new_password").value == "") {
document
.getElementById("password_error")
.classList.remove("hidden");
displayError("No value for new password");
return;
}
if (document.getElementById("new_password_repeat").value == "") {
displayError("Please repeat new password");
return;
}
const formData = new FormData();
formData.append(
"csrf_token",
document.getElementById("csrf_token_storage").value,
);
formData.append("old", file);
document
.getElementById("change_password_dialouge")
.classList.add("hidden");
document.getElementById("popup_background").classList.add("hidden");
});
</script>
<script type="text/javascript">
var currentPreviewURL = null;
fileInput.addEventListener("change", async () => {
document.getElementById("popup_background").classList.remove("hidden");
const file = fileInput.files[0];
if (!file) return;
if (file.type !== "image/jpeg") {
alert("Only JPEG images are allowed.");
fileInput.value = "";
return;
}
const formData = new FormData();
formData.append("photo", file);
formData.append(
"csrf_token",
document.getElementById("csrf_token_storage").value,
);
const res = await fetch("/change-photo", {
method: "POST",
body: formData,
credentials: "include",
});
const text = await res.text();
document.getElementById("popup_background").classList.add("hidden");
const img = document.querySelector(".profile-pic");
if (currentPreviewURL != null) {
URL.revokeObjectURL(currentPreviewURL);
}
img.src = URL.createObjectURL(file);
currentPreviewURL = img.src;
});
</script>
<script src="/static/error/error.js" type="text/javascript"></script>