// 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 += '
';
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 += `| ${(i+1)} | `;
content += `${d.surname} ${d.name} | `;
content += `${d.mail} | `;
content += ` | `;
content += `
`;
});
content += '
';
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 += '
';
// elem.innerHTML = content;
}
}
async updateHtmlSettings(){
var elem = document.getElementById('contentPageSettings');
var content = '';
content += '';
content += '
';
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 += `| ${(i+1)} | `;
content += `${d.name} | `;
content += ` | `;
content += `
`;
});
content += '
';
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 += '
';
elem.innerHTML = content;
}
}
async updateHtmlLogin(){
var elem = document.getElementById('contentPageLogin');
var content = '';
content += '';
content += '
';
content += '';
content += '
';
content += '
';
elem.innerHTML = content;
}
updateState(){
this.parseCurrentPageFromUrl();
this.loadCurrentUser();
}
updateStateForRequest(){
this.updateHeaderLogin();
this.updateMenuContent();
this.updatePageContent();
}
}