// import { // apiCreateProject, // apiGetProject, // apiGetProjects // } from './endpoint.js'; /** * @typedef {object} Project * @property {number} id * @property {number} name * @property {number} user * @property {boolean} fileExists */ class UserInterface { constructor(){ this.page = null; this.userInfo = {id: null}; this.parseCurrentPageFromUrl(); } parseCurrentPageFromUrl(){ const urlSearchParams = new URLSearchParams(window.location.search); const urlParams = Object.fromEntries(urlSearchParams.entries()); this.page = urlParams.pg ?? null; this.projectId = urlParams.projectId ?? null; this.userId = urlParams.userId ?? null; } async loadCurrentUser(){ this.userInfo = await apiGetCurrentUser(); this.updateStateForRequest(); } urlClick(params){ const newUrl = `/UI/?${params}`; const newState = { }; const newTitle = ``; window.history.replaceState(newState, newTitle, newUrl); this.clearPageContent(); this.updateState(); window.history.replaceState( null, null, window.location.href ); } // Actions async login(){ const login_email = document.getElementById('login_email').value; const login_password = document.getElementById('login_password').value; const responseElem = document.getElementById('loginResponseMessage'); responseElem.innerHTML = ''; try { const data = await apiLogin(login_email, login_password); this.updateState(); } catch (error) { console.log(error); if (error.response && error.response.data && error.response.data.detail) { responseElem.innerHTML = error.response.data.detail; } else if (error) { responseElem.innerHTML = error; } else { responseElem.innerHTML = "An error occurred during login."; } responseElem.style.color = 'red'; } } async logout(){ const data = await apiLogout(); this.updateState(); } async createNewProject(){ const data = await apiCreateProject(); this.updateState(); } async updateUserPassword(userId, password1, password2){ const responseElem = document.getElementById('updateUserPasswordMessage'); responseElem.innerHTML = ''; if (password1 !== password2) { responseElem.innerHTML = "Passwords do not match."; return; } if (password1.length < 6) { console.log(password1.length); responseElem.innerHTML = "Password must be at least 6 characters long."; return; } await this.updateUser(userId, {password: password1}); } async updateUser(userId, updateData){ const data = await apiUpdateUser(userId, updateData); this.updateState(); } async updateProject(projectId, updateData){ const data = await apiUpdateProject(projectId, updateData); this.updateState(); } async deleteIfcFile(projectId){ const data = await apiDeleteIfcFile(projectId); this.updateState(); } async uploadIfcFile(projectId) { const data = await apiUploadIfcFile(projectId); // this.updateState(); } async registerNewUser(name, surname, email, password1, password2, securityCode){ name = name.trim(); surname = surname.trim(); email = email.trim(); securityCode = securityCode.trim(); const responseElem = document.getElementById('registrationResponseMessage'); responseElem.innerHTML = ''; if (name === '' || surname === '' || email === '' || password1 === '' || password2 === '' || securityCode === '') { responseElem.innerHTML = "All fields are required."; responseElem.style.color = 'red'; return; } if (password1 !== password2) { responseElem.innerHTML = "Passwords do not match."; responseElem.style.color = 'red'; return; } if (password1.length < 6) { responseElem.innerHTML = "Password must be at least 6 characters long."; responseElem.style.color = 'red'; return; } responseElem.style.color = 'black'; try { const data = await apiCreateUser(name, surname, email, password1, securityCode); responseElem.innerHTML = "Registration successful. You can now log in."; responseElem.style.color = 'green'; for (const key of ['name', 'surname', 'email', 'password_1', 'password_2', 'security_code']) { const inputElem = document.getElementById(`new_user_${key}`); if (inputElem) { inputElem.value = ''; } } } catch (error) { console.log(error); if (error.response && error.response.data && error.response.data.detail) { responseElem.innerHTML = error.response.data.detail; } else if (error) { responseElem.innerHTML = error; } else { responseElem.innerHTML = "An error occurred during registration."; } responseElem.style.color = 'red'; } // this.updateState(); } // Content updateHeaderLogin(){ var elem = document.getElementById('contentHeaderLogin'); if(this.userInfo.id === null){ var content = ''; content += ''; elem.innerHTML = content; } else { var content = ''; content += '' + this.userInfo.mail + ''; content += ''; elem.innerHTML = content; } } updateMenuContent(){ var elem = document.getElementById('contentMenu'); if(this.userInfo.id === null){ var content = ''; // content += ''; content += ''; content += ''; // content += ''; elem.innerHTML = content; } else { var content = ''; // content += ''; content += ''; content += ''; if (this.userInfo.rights_admin) { content += ''; } elem.innerHTML = content; } } clearPageContent(){ var elem = document.getElementById('contentMain'); elem.innerHTML = ''; } updatePageContent(){ const authenticated = this.userInfo.id !== null; var elem = document.getElementById('contentMain'); if(this.page === 'about'){ var content = ''; content += '

about

'; content += '
'; elem.innerHTML = content; } else if(this.page === 'settings' && authenticated){ var content = ''; content += '
'; elem.innerHTML = content; this.updateHtmlSettings(); } else if(this.page === 'projects' && authenticated){ var content = ''; content += '
'; elem.innerHTML = content; this.updateHtmlProjects(); } else if(this.page === 'users' && authenticated){ var content = ''; content += '
'; elem.innerHTML = content; this.updateHtmlUsers(); } else if(this.page === 'login' && !authenticated){ var content = ''; content += '
'; elem.innerHTML = content; this.updateHtmlLogin(); } else if(this.page === 'registration' && !authenticated){ var content = ''; content += '
'; elem.innerHTML = content; this.updateHtmlRegistration(); } else { elem.innerHTML = ''; } } async updateHtmlRegistration(){ var elem = document.getElementById('contentPageRegistration'); var content = ''; content += '
'; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ``; content += ``; content += ''; content += ''; content += ``; content += ``; content += ''; content += ''; content += ``; content += ``; content += ''; content += ''; content += ``; content += ``; content += ''; content += ''; content += ``; content += ``; content += ''; content += ''; content += ``; content += ``; content += ''; content += ''; content += ``; content += ''; content += ''; content += ''; content += ''; content += '
Registration
Name:
Surname:
E-mail:
Password:
Repeat password:
Security code:
'; content += '
'; elem.innerHTML = content; } async updateHtmlUsers(){ var elem = document.getElementById('contentPageUsers'); if(this.userId === null){ const data = await apiGetUsers(); var content = ''; content += '
'; content += ''; data.forEach((d, i) => { /** @var {User} d */ content += ``; content += ``; content += ``; content += ``; content += ``; content += ``; }); content += '
${(i+1)}${d.surname} ${d.name}${d.mail}
'; content += '
'; elem.innerHTML = content; }else{ /** @var {User} S_user */ const S_user = await apiGetUser(this.userId); // var content = ''; // content += '
'; // content += ''; // content += ''; // content += ''; // content += ``; // content += ''; // content += ''; // content += ''; // content += ''; // if (S_project.numAttributes === 0) { // if(S_project.fileExists === true){ // content += ``; // }else{ // content += ``; // } // } // content += ''; // if(S_project.fileExists === true){ // content += ''; // content += ''; // content += ``; // content += ''; // } // content += ''; // content += ''; // content += ''; // content += ''; // content += ''; // content += ``; // content += ''; // content += '
Name:
IFC file:'; // if(S_project.fileExists === true){ // content += `Download`; // }else{ // } // content += '
Open project
Owner:${S_project.userEntity.name} ${S_project.userEntity.surname} (${S_project.userEntity.mail})
'; // content += '
'; // content += '
'; // content += '
'; // content += ''; // content += ''; // content += ''; // content += ''; // S_project.userEntitiesWithAccess.forEach((user, user_i) => { // content += ''; // content += ``; // content += ``; // content += ``; // content += ``; // content += ''; // }); // content += ''; // content += ''; // content += ''; // content += '
Cooperating users:
${(user_i+1)})${user.name} ${user.surname}${user.mail}
'; // content += 'Add new user:'; // content += ``; // content += ``; // content += '
'; // content += '
'; // elem.innerHTML = content; } } async updateHtmlSettings(){ var elem = document.getElementById('contentPageSettings'); var content = ''; content += '
'; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ``; content += ``; content += ''; content += ''; content += ``; content += ``; content += ''; content += ''; content += ``; content += ''; content += ''; content += ''; content += ''; content += '
Change password:
New password:
New password:
(repeat)
'; content += '
'; elem.innerHTML = content; } async updateHtmlProjects(){ var elem = document.getElementById('contentPageProjects'); if(this.projectId === null){ const data = await apiGetProjects(); var content = ''; content += '
'; content += ''; data.forEach((d, i) => { /** @var {Project} d */ content += ``; content += ``; content += ``; content += ``; content += ``; }); content += '
${(i+1)}${d.name}
'; content += '
'; content += ''; elem.innerHTML = content; }else{ /** @var {Project} S_project */ const S_project = await apiGetProject(this.projectId); var content = ''; content += '
'; content += ''; content += ''; content += ''; content += ``; content += ''; content += ''; content += ''; content += ''; if (S_project.numAttributes === 0) { if(S_project.fileExists === true){ content += ``; }else{ content += ``; } } content += ''; if(S_project.fileExists === true){ content += ''; content += ''; content += ``; content += ''; } content += ''; content += ''; content += ''; content += ''; content += ''; content += ``; content += ''; content += '
Name:
IFC file:'; if(S_project.fileExists === true){ content += `Download`; }else{ } content += '
Open in 3D viewer
Owner:${S_project.userEntity.name} ${S_project.userEntity.surname} (${S_project.userEntity.mail})
'; content += '
'; content += '
'; content += '
'; content += ''; content += ''; content += ''; content += ''; S_project.userEntitiesWithAccess.forEach((user, user_i) => { content += ''; content += ``; content += ``; content += ``; content += ``; content += ''; }); content += ''; content += ''; content += ''; content += '
Cooperating users:
${(user_i+1)})${user.name} ${user.surname}${user.mail}
'; content += 'Add new user:'; content += ``; content += ``; content += '
'; content += '
'; elem.innerHTML = content; } } async updateHtmlLogin(){ var elem = document.getElementById('contentPageLogin'); var content = ''; content += '
'; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += ''; content += '
E-mail:
Password:
'; content += '
'; elem.innerHTML = content; } updateState(){ this.parseCurrentPageFromUrl(); this.loadCurrentUser(); } updateStateForRequest(){ this.updateHeaderLogin(); this.updateMenuContent(); this.updatePageContent(); } }