// Imports import { RandomString } from "/services/common/common.js"; import * as Messages from "/services/messages/messages.js"; import * as Auth from "/services/auth/auth.js"; import * as Users from "/components/users/users.js"; // DOM elements let id_field; let idOAuth_field; let login_field; let password_field; let name_field; let role_field; // local variables let current_user; let update_user; export async function mount(where, parent) { const handleUser = new HandleUser(parent); await handleUser.mount(where); handleUser.handleDom(); return handleUser; } class HandleUser { constructor(parent) { this.parent = parent; } async mount(where) { document.getElementById(where).innerHTML = /* HTML */ ` <div class="modal-background"></div> <div class="modal-card" id="users-modal-card"> <header class="modal-card-head"> <p class="modal-card-title">Ajout/modification d'un utilisateur</p> <button class="delete" aria-label="close" id="users-modal-close" ></button> </header> <section class="modal-card-body"> <div class="field"> <label>Id</label> <div class="control"> <input class="input" type="number" id="users-modal-id" disabled /> </div> </div> <div class="field"> <label>IdOAuth</label> <div class="control"> <input class="input" type="text" id="users-modal-idoauth" /> </div> </div> <div class="field"> <label>Identifiant</label> <div class="control"> <input class="input" type="text" id="users-modal-login" /> </div> </div> <div class="field" id="users-modal-password-container"> <label>Mot de passe</label> <div class="control"> <input class="input" type="text" id="users-modal-password" /> </div> </div> <div class="field" id="users-modal-name-container"> <label>Nom</label> <div class="control"> <input class="input" type="text" id="users-modal-name" /> </div> </div> <div class="field" id="users-modal-role-container"> <label>Rôle</label><br /> <div class="control select"> <select name="role" id="users-modal-role"> <option value="VISUALIZER">Visualiseur</option> <option value="CAPTURER">Saisisseur</option> <option value="ADMIN">Administrateur</option> </select> </div> </div> </section> <footer class="modal-card-foot"> <button id="users-modal-save" class="button is-success"> Sauvegarder </button> <button id="users-modal-cancel" class="button">Annuler</button> </footer> </div> `; current_user = await Auth.GetUser(); } handleDom() { id_field = document.getElementById("users-modal-id"); idOAuth_field = document.getElementById("users-modal-idoauth"); login_field = document.getElementById("users-modal-login"); password_field = document.getElementById("users-modal-password"); name_field = document.getElementById("users-modal-name"); role_field = document.getElementById("users-modal-role"); document .getElementById(`users-modal-close`) .addEventListener("click", function () { Users.toggleModal("users-modal", "users-modal-card"); }); document .getElementById(`users-modal-cancel`) .addEventListener("click", function () { Users.toggleModal("users-modal", "users-modal-card"); }); let userHandler = this; document .getElementById(`users-modal-save`) .addEventListener("click", function () { userHandler.postUser(); }); document.getElementById(`users-new`).addEventListener("click", function () { userHandler.newUser(); }); } async newUser() { update_user = false; id_field.value = ""; login_field.value = ""; password_field.value = RandomString(48); name_field.value = ""; role_field.value = ""; Users.toggleModal("users-modal", "users-modal-card"); } async deleteUser(user) { try { const response = await fetch("/api/admin/users/" + user.id, { method: "delete", headers: new Headers({ "XSRF-Token": current_user.xsrftoken, }), }); if (response.status !== 200) { throw new Error( `User could not be deleted (status ${response.status})` ); } document.getElementById(`users-user-${user.id}`).remove(); } catch (e) { Messages.Show("is-warning", e.message); console.error(e); } if (user.role == "CAPTURER") { let capturer = await Auth.getCapturerByUserID(user.id, current_user); if (capturer != undefined) await this.deleteCapturer(capturer); } } editUser(user) { this.parent.cleanUser(user); update_user = true; id_field.value = user.id; idOAuth_field.value = user.idOAuth; login_field.value = user.login; password_field.value = ""; name_field.value = user.name; role_field.value = user.role; Users.toggleModal("users-modal", "users-modal-card"); } async updateUsers() { try { const response = await fetch("/api/admin/users/", { method: "GET", headers: new Headers({ "XSRF-Token": current_user.xsrftoken, }), }); if (response.status !== 200) { throw new Error( `Users could not be fetched (status ${response.status})` ); } return await response.json(); } catch (e) { Messages.Show("is-warning", e.message); console.error(e); } } async postUser() { let method; if (update_user) method = "PUT"; else method = "POST"; try { if (role_field.value == "") { Messages.Show( "is-warning", "Veuillez choisir un rôle pour l'utilisateur" ); return; } const response = await fetch("/api/admin/users/" + id_field.value, { method: method, headers: new Headers({ "XSRF-Token": current_user.xsrftoken, }), body: JSON.stringify({ id: id_field.value, login: login_field.value, password: password_field.value, name: name_field.value, role: role_field.value, }), }); if (response.status !== 200) { throw new Error( `User could not be updated or created (status ${response.status})` ); } let user = await response.json(); if (user != undefined && user.role == "CAPTURER") await this.postCapturer(user, method); this.parent.displayUsers(); } catch (e) { Messages.Show("is-warning", e.message); console.error(e); } Users.toggleModal("users-modal", "users-modal-card"); } async postCapturer(user, method) { let capturer; if (method === "PUT") capturer = await Auth.getCapturerByUserID(user.id, current_user); else capturer = {}; console.log(capturer) try { const response = await fetch("/api/Capturer/" + capturer.ID, { method: method, headers: new Headers({ "XSRF-Token": current_user.xsrftoken, }), body: JSON.stringify({ ID: capturer.ID, UserID: user.id, Name: user.name, }), }); if (response.status !== 200) { throw new Error( `Capturer could not be deleted (status ${response.status})` ); } } catch (e) { Messages.Show("is-warning", e.message); console.error(e); } } async deleteCapturer(capturer) { try { const response = await fetch("/api/Capturer/" + capturer.ID, { method: "delete", headers: new Headers({ "XSRF-Token": current_user.xsrftoken, }), }); if (response.status !== 200) { throw new Error( `Capturer could not be deleted (status ${response.status})` ); } } catch (e) { Messages.Show("is-warning", e.message); console.error(e); } } }