program finalizat

This commit is contained in:
andrei-mihnea-cerbu
2024-10-29 15:07:26 +02:00
parent ab1eaec413
commit 979539d3db
138 changed files with 14602 additions and 5068 deletions
+22
View File
@@ -0,0 +1,22 @@
document.addEventListener('DOMContentLoaded', function () {
const submitButton = document.getElementById('submitAnnouncement');
const buttonBack = document.getElementById('backButton');
const announcementTextarea = document.getElementById('announcementMessage');
buttonBack.addEventListener('click', function () {
fadeOut('main_menu');
});
submitButton.addEventListener('click', async function () {
const message = announcementTextarea.value.trim();
if (message === '') {
await window.electronAPI.showAlert('Please enter a message before sending.');
return;
}
// Send the announcement message via the electronAPI
window.electronAPI.startAnnouncementWorker(message);
fadeOut('send_announcement');
});
});
-26
View File
@@ -1,26 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link href="../assets/hard-disk.ico" rel="icon" type="image/x-icon">
<!-- Reuse the same CSS files as UC Not Found -->
<link href="../css/welcome.css" rel="stylesheet">
<link href="../css/transition.css" rel="stylesheet">
<script src="../js/helpers.js"></script>
<title>Welcome</title>
</head>
<body onload="fadeIn()">
<div class="container">
<div class="header">
<h1>BACKUP FETCHER</h1>
</div>
<div class="loading-section">
<div class="spinner"></div>
<p>Backup is not searched, please wait...</p>
</div>
</div>
</body>
</html>
-216
View File
@@ -1,216 +0,0 @@
document.addEventListener('DOMContentLoaded', async () => {
const backButton = document.getElementById('backButton');
const form = document.getElementById('new-department-form');
const modifyModal = document.getElementById('modify-department-modal');
const closeModal = document.getElementById('close-modal');
const confirmModifyButton = document.getElementById('confirm-modify');
let currentDepartmentId = null;
// Retrieve operation codes via IPC
const operationCodes = await window.electronAPI.getOperationsCodes();
if (!operationCodes) {
await window.electronAPI.showAlert('Internal error of the application.');
return;
}
// Open the TCP socket right after fetching the operation codes
if (!await window.electronAPI.openUcSocket()) {
await window.electronAPI.showAlert('Failed to open socket. Internal error of the application.');
return;
}
let codeGetDepartments = operationCodes.GET_DEPARTMENTS;
let codeCreateDepartment = operationCodes.CREATE_DEPARTMENT;
let codeModifyDepartment = operationCodes.MODIFY_DEPARTMENT;
let codeDeleteDepartment = operationCodes.DELETE_DEPARTMENT;
let codeOk = operationCodes.OK;
// Set up the back button - close the socket before going back
backButton.addEventListener('click', async () => {
await window.electronAPI.closeUcSocket(); // Close the socket when going back
fadeOut('main_menu'); // Navigate to the main menu
});
// Set up the form for creating new departments
form.addEventListener('submit', async function (event) {
event.preventDefault(); // Prevent the form from refreshing the page
const departmentName = document.getElementById('departmentName').value;
if (departmentName.trim()) {
await createDepartment(departmentName); // Call createDepartment function when the form is submitted
}
});
// Fetch the departments on page load
await fetchDepartments();
// Fetch departments and render them in the left block
async function fetchDepartments() {
const departmentsContainer = document.getElementById('departments-container');
// Send the request to get the departments
if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) {
await window.electronAPI.showAlert("Failed to send request.");
await redirectToMainMenu();
return;
}
const response = await waitForResponse();
if (!response || response.operationCode !== codeOk) {
await window.electronAPI.showAlert("Unable to fetch departments.");
await redirectToMainMenu();
return;
}
departmentsContainer.innerHTML = ''; // Clear any existing data
const departments = response.metaInfo.departments;
// Filter out CEO department
const filteredDepartments = departments.filter(department => department.name.toLowerCase() !== 'ceo');
// Check if there are no departments after filtering
if (!filteredDepartments.length) {
const noDepartmentsMessage = document.createElement('p');
noDepartmentsMessage.textContent = 'No departments exist.';
noDepartmentsMessage.classList.add('no-departments-message'); // Add a class for styling
departmentsContainer.appendChild(noDepartmentsMessage);
return;
}
// Iterate over the remaining departments and render them
filteredDepartments.forEach(department => {
const departmentDiv = document.createElement('div');
departmentDiv.classList.add('department-card');
// Create department name div
const nameDiv = document.createElement('div');
nameDiv.classList.add('department-name');
nameDiv.textContent = department.name;
// Create modify button
const modifyButton = document.createElement('button');
modifyButton.textContent = 'Modify';
modifyButton.classList.add('modify-button');
modifyButton.dataset.departmentId = department.id;
// Create delete button
const deleteButton = document.createElement('button');
deleteButton.textContent = 'Delete';
deleteButton.classList.add('delete-button');
deleteButton.dataset.departmentId = department.id;
// Append department info and buttons to the department div
departmentDiv.appendChild(nameDiv);
departmentDiv.appendChild(modifyButton);
departmentDiv.appendChild(deleteButton);
// Append department div to the container
departmentsContainer.appendChild(departmentDiv);
});
// Add click event listeners for all dynamically created buttons
addEventListenersToButtons();
}
// Add event listeners to dynamically created buttons
function addEventListenersToButtons() {
const modifyButtons = document.querySelectorAll('.modify-button');
const deleteButtons = document.querySelectorAll('.delete-button');
modifyButtons.forEach(button => {
button.addEventListener('click', () => {
currentDepartmentId = button.dataset.departmentId;
openModifyModal(); // Open the modal when modify button is clicked
});
});
deleteButtons.forEach(button => {
button.addEventListener('click', () => {
const departmentId = button.dataset.departmentId;
deleteDepartment(departmentId);
});
});
}
// Open the modify modal
function openModifyModal() {
modifyModal.style.display = 'block';
}
// Close the modify modal
function closeModifyModal() {
modifyModal.style.display = 'none';
currentDepartmentId = null;
}
// Handle modify modal close event
closeModal.addEventListener('click', closeModifyModal);
// Handle department modification
confirmModifyButton.addEventListener('click', async () => {
const newDepartmentName = document.getElementById('new-department-name').value;
if (newDepartmentName.trim() && currentDepartmentId) {
await modifyDepartment(currentDepartmentId, newDepartmentName);
closeModifyModal(); // Close the modal after modification
}
});
async function modifyDepartment(departmentId, newName) {
if (!await window.electronAPI.sendUcMessage(codeModifyDepartment, {
departmentId: departmentId,
newDepartmentName: newName
})) {
await window.electronAPI.showAlert('Failed to send modification request.');
return;
}
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
await window.electronAPI.showAlert(`Department modified: ${newName}`);
await fetchDepartments(); // Refresh the department list after modification
} else {
await window.electronAPI.showAlert('Failed to modify the department.');
}
}
async function deleteDepartment(departmentId) {
const confirmDelete = confirm("Are you sure you want to delete this department?");
if (confirmDelete) {
if (!await window.electronAPI.sendUcMessage(codeDeleteDepartment, { departmentId })) {
await window.electronAPI.showAlert('Failed to send delete request.');
return;
}
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
await window.electronAPI.showAlert("Department deleted successfully.");
await fetchDepartments(); // Refresh the department list after deletion
} else {
await window.electronAPI.showAlert("Failed to delete the department.");
}
}
}
// Function to create a new department
async function createDepartment(departmentName) {
if (!await window.electronAPI.sendUcMessage(codeCreateDepartment, { departmentName })) {
await window.electronAPI.showAlert('Failed to send create request.');
return;
}
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
await window.electronAPI.showAlert(`New department created: ${departmentName}`);
await fetchDepartments(); // Refresh the department list
} else {
await window.electronAPI.showAlert("Failed to create department.");
}
}
// Redirect to main menu
async function redirectToMainMenu() {
await window.electronAPI.closeUcSocket();
fadeOut('main_menu');
}
});
+16 -4
View File
@@ -24,12 +24,24 @@ function fadeOut(destination) {
async function waitForResponse() {
return new Promise((resolve) => {
const idResponseCheck = setInterval(async () => {
const status = await window.electronAPI.hasResponseArrived();
if (status) {
if (await window.electronAPI.hasResponseArrived()) {
clearInterval(idResponseCheck);
const response = await window.electronAPI.getLastUcResult();
resolve(response || null); // Resolve the response or null if not available
resolve(await window.electronAPI.getLastUcResult()); // Resolve the response or null if not available
}
}, 100); // Check every 100 milliseconds if the response has arrived
});
}
function toggleScroll(idComponent, scrollHeight = 180) {
const element = document.getElementById(idComponent); // Using getElementById
if (!element) {
console.error(`Element with ID '${idComponent}' not found.`);
return;
}
if (element.scrollHeight > scrollHeight) {
element.style.overflowY = 'auto'; // Enable scroll if content overflows
} else {
element.style.overflowY = 'hidden'; // Disable scroll if content fits
}
}
+93 -79
View File
@@ -1,3 +1,8 @@
let codeLogin = '';
let codeFindByEmail = '';
let codeFindKeyByUser = '';
let codeOk = '';
document.addEventListener('DOMContentLoaded', async function () {
const submitButton = document.getElementById('submit');
const resetPasswordButton = document.getElementById('resetPassword');
@@ -9,10 +14,10 @@ document.addEventListener('DOMContentLoaded', async function () {
return;
}
const codeLogin = operationCodes.LOGIN;
const codeFindByEmail = operationCodes.FIND_BY_EMAIL;
const codeFindKeyByUser = operationCodes.FIND_KEY_BY_USER_ID;
const codeOk = operationCodes.OK;
codeLogin = operationCodes.LOGIN;
codeFindByEmail = operationCodes.FIND_BY_EMAIL;
codeFindKeyByUser = operationCodes.FIND_KEY_BY_USER_ID;
codeOk = operationCodes.OK;
resetPasswordButton.addEventListener('click', function (e) {
e.preventDefault();
@@ -66,79 +71,88 @@ document.addEventListener('DOMContentLoaded', async function () {
await window.electronAPI.closeUcSocket();
await window.electronAPI.changeContent('main_menu');
});
async function attemptLogin(email, password) {
const app_type = await window.electronAPI.readUserConfig('app_type');
const messageData = { email, password, app_type };
// Send the login message to the server
if (!await window.electronAPI.sendUcMessage(codeLogin, messageData)) {
await window.electronAPI.showAlert('Failed to send login request.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
await window.electronAPI.resetApplicationInfo();
await window.electronAPI.resetUserConfig();
await window.electronAPI.writeUserConfig('app_type', app_type);
await window.electronAPI.writeUserConfig('user_info', { email, password });
return true;
}else if(response && respone.operationCode !== codeOk){
await window.electronAPI.showAlert(response.metaInfo.message);
return false;
}
await window.electronAPI.showAlert('Invalid login response received.');
return false;
}
async function fetchAndStoreUserInfo(userEmail) {
if (!await window.electronAPI.sendUcMessage(codeFindByEmail, { email: userEmail })) {
await window.electronAPI.showAlert('Failed to send request to fetch user info.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
let userInfo = await window.electronAPI.readUserConfig('user_info');
if (!userInfo) {
userInfo = {};
}
userInfo.id = response.metaInfo.id;
userInfo.departmentId = response.metaInfo.departmentId;
userInfo.name = response.metaInfo.name || 'User';
await window.electronAPI.writeUserConfig('user_info', userInfo);
return true;
}
await window.electronAPI.showAlert('Failed to fetch user info from server.');
return false;
}
async function fetchAndStoreEncryptionKey(userId) {
if (!await window.electronAPI.sendUcMessage(codeFindKeyByUser, { userId })) {
await window.electronAPI.showAlert('Failed to send request to fetch encryption key.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
const encryptionKey = {
key: response.metaInfo.key.key,
iv: response.metaInfo.key.iv,
};
await window.electronAPI.writeUserConfig('encryption_key', encryptionKey);
return true;
}
await window.electronAPI.showAlert('Failed to fetch encryption key from server.');
return false;
}
});
async function attemptLogin(email, password) {
const app_type = await window.electronAPI.readUserConfig('app_type');
const messageData = {email, password, app_type};
// Send the login message to the server
if (!await window.electronAPI.sendUcMessage(codeLogin, messageData)) {
await window.electronAPI.showAlert('Failed to send login request.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if (!response) {
await window.electronAPI.showAlert('No response from server.');
return false;
}
if (response.operationCode !== codeOk) {
await window.electronAPI.showAlert(response.metaInfo.message);
return false;
}
const user_info = await window.electronAPI.readUserConfig('user_info');
if (!user_info || (user_info && user_info.email !== email)) {
await window.electronAPI.resetApplicationInfo();
await window.electronAPI.resetMemory();
await window.electronAPI.resetUserConfig();
await window.electronAPI.writeUserConfig('app_type', app_type);
await window.electronAPI.writeUserConfig('user_info', {email, password});
return true;
}
return true;
}
async function fetchAndStoreUserInfo(userEmail) {
if (!await window.electronAPI.sendUcMessage(codeFindByEmail, {email: userEmail})) {
await window.electronAPI.showAlert('Failed to send request to fetch user info.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
let userInfo = await window.electronAPI.readUserConfig('user_info');
if (!userInfo) {
userInfo = {};
}
userInfo.id = response.metaInfo.id;
userInfo.departmentId = response.metaInfo.departmentId;
userInfo.name = response.metaInfo.name || 'User';
await window.electronAPI.writeUserConfig('user_info', userInfo);
return true;
}
await window.electronAPI.showAlert('Failed to fetch user info from server.');
return false;
}
async function fetchAndStoreEncryptionKey(userId) {
if (!await window.electronAPI.sendUcMessage(codeFindKeyByUser, {userId})) {
await window.electronAPI.showAlert('Failed to send request to fetch encryption key.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
const encryptionKey = {
key: response.metaInfo.key.key,
iv: response.metaInfo.key.iv,
};
await window.electronAPI.writeUserConfig('encryption_key', encryptionKey);
return true;
}
await window.electronAPI.showAlert('Failed to fetch encryption key from server.');
return false;
}
+219 -197
View File
@@ -3,25 +3,15 @@ document.addEventListener('DOMContentLoaded', async function () {
const backupButton = document.getElementById('backup-dir');
const shareButton = document.getElementById('share-dir');
const departmentButton = document.getElementById('department-dir');
const changeInfoButton = document.getElementById('change-info');
const shareFileButton = document.getElementById('share-file');
const manageUsersButton = document.getElementById('manage-users');
const manageDepartmentsButton = document.getElementById('manage-departments');
const resetDatabaseButton = document.getElementById('reset-database');
const restoreBackupButton = document.getElementById('restore-backup');
const logoutButton = document.getElementById('logout');
const disclaimerModal = document.getElementById('disclaimer-modal');
const cancelDisclaimerButton = document.getElementById('disclaimer-cancel');
const submitDisclaimerButton = document.getElementById('disclaimer-submit');
await fetchUserInfo();
await checkAndSetAllDirectories();
const restoreBackupButton = document.getElementById('restore-backup');
const buttonOverviewDepartments = document.getElementById('overview-departments');
const buttonOverviewUsers = document.getElementById('overview-users');
const buttonResetDatabase = document.getElementById('reset-database');
const buttonSendAnnouncement = document.getElementById('send-announcement');
backupButton.addEventListener('click', async function () {
await setPath('backupDirectory');
@@ -31,8 +21,28 @@ document.addEventListener('DOMContentLoaded', async function () {
await setPath('shareDirectory');
});
departmentButton.addEventListener('click', async function () {
await setPath('departmentDirectory');
buttonResetDatabase.addEventListener('click', async function () {
// Show a confirmation dialog
const userConfirmed = await showConfirmationDialog("Are you sure you want to reset the database? This action cannot be undone.");
// If the user confirms, perform the database reset
if (userConfirmed) {
await resetDatabase();
} else {
window.electronAPI.showAlert("Database reset canceled.");
}
});
buttonSendAnnouncement.addEventListener('click', async function () {
fadeOut('announcement');
});
buttonOverviewDepartments.addEventListener('click', async function () {
fadeOut('overview_departments');
});
buttonOverviewUsers.addEventListener('click', async function () {
fadeOut('overview_users');
});
changeInfoButton.addEventListener('click', function () {
@@ -43,191 +53,203 @@ document.addEventListener('DOMContentLoaded', async function () {
fadeOut('share_file');
});
manageUsersButton.addEventListener('click', function () {
fadeOut('users_management');
});
manageDepartmentsButton.addEventListener('click', function () {
fadeOut('departments_management' +
'');
});
resetDatabaseButton.addEventListener('click', function () {
disclaimerModal.style.display = 'block'; // Show disclaimer modal
});
cancelDisclaimerButton.addEventListener('click', function () {
disclaimerModal.style.display = 'none'; // Hide modal if cancel is clicked
});
submitDisclaimerButton.addEventListener('click', async function () {
disclaimerModal.style.display = 'none'; // Hide modal
await resetDatabase(); // Perform database reset
fadeOut('login'); // Fade out and go back to login
});
logoutButton.addEventListener('click', async function () {
fadeOut('login');
});
// Add event listener for the restore backup button
restoreBackupButton.addEventListener('click', async function () {
await restoreBackup();
});
async function restoreBackup() {
const backupDirectory = await window.electronAPI.readApplicationInfo('backupDirectory');
if (backupDirectory && backupDirectory.path) {
await window.electronAPI.showAlert('You have already set a backup directory. You cannot restore again.');
return;
}
const destinationPath = await window.electronAPI.selectDirectory();
if (!destinationPath) return;
await window.electronAPI.startBackupRetrieval(destinationPath);
fadeOut('backup_retrieve');
}
async function checkAndSetAllDirectories() {
await attachNotificationButton('backupDirectory', 'Set your backup directory!', 'backup_alert', 'alert');
await attachNotificationButton('shareDirectory', 'Set your share directory!', 'share_alert', 'alert');
await attachNotificationButton('departmentDirectory', 'Set your department directory!', 'department_alert', 'alert');
}
async function checkPathExistence(pathKey) {
return await window.electronAPI.readApplicationInfo(pathKey);
}
async function setPath(pathKey) {
const path = await window.electronAPI.selectDirectory();
if (path === undefined) return;
const id = await window.electronAPI.createMemoryEntry()
console.log({id, path})
await window.electronAPI.writeApplicationInfo(pathKey, {id, path});
}
async function attachNotificationButton(pathKey, buttonText, buttonId, buttonName) {
const path = await checkPathExistence(pathKey);
if (!path) {
const notificationsDiv = document.getElementById('notifications');
const button = document.createElement('button');
button.id = buttonId;
button.name = buttonName;
button.textContent = buttonText;
button.addEventListener('click', async function () {
await setPath(pathKey);
button.remove();
});
notificationsDiv.appendChild(button);
}
}
async function fetchUserInfo() {
const usernameField = document.getElementById('username-field');
let userInfo = await window.electronAPI.readUserConfig('user_info');
if (userInfo && userInfo.name) {
usernameField.textContent = userInfo.name;
} else {
console.error("Username field is not available in the DOM.");
}
}
async function loadReceivedFiles() {
const shareDirectoryData = await window.electronAPI.readApplicationInfo('shareDirectory');
if (!shareDirectoryData || !shareDirectoryData.id) {
console.log('No received files or directory ID found.');
return;
}
const directoryId = shareDirectoryData.id;
const directoryStructure = await window.electronAPI.readMemoryEntry(directoryId);
if (!directoryStructure || !directoryStructure.structure) {
console.log('No received files found in the directory structure.');
return;
}
const notificationsDiv = document.getElementById('notifications');
const existingButtons = Array.from(notificationsDiv.children).map(button => button.getAttribute('data-filepath'));
Object.keys(directoryStructure.structure).forEach(userName => {
const userFiles = directoryStructure.structure[userName];
Object.keys(userFiles).forEach(fileName => {
const filePath = userFiles[fileName];
if (!existingButtons.includes(filePath)) {
const button = document.createElement('button');
button.setAttribute('data-filepath', filePath);
button.name = 'notification';
button.textContent = `You received a file "${fileName}" from ${userName}`;
button.addEventListener('click', () => handleFileReceivedButtonPressed(filePath, button));
notificationsDiv.appendChild(button);
}
});
});
}
async function removeReceivedFile(filePath) {
const shareDirectoryData = await window.electronAPI.readApplicationInfo('shareDirectory');
if (!shareDirectoryData || !shareDirectoryData.id) {
console.log('No directory ID found to update.');
return;
}
const directoryId = shareDirectoryData.id;
let directoryStructure = await window.electronAPI.readMemoryEntry(directoryId);
if (directoryStructure && directoryStructure.structure) {
for (let userName in directoryStructure.structure) {
let userFiles = directoryStructure.structure[userName];
if (userFiles[filePath]) {
delete userFiles[filePath];
if (Object.keys(userFiles).length === 0) {
delete directoryStructure.structure[userName];
}
await window.electronAPI.updateMemoryEntry(directoryId, directoryStructure);
console.log(`File ${filePath} removed from memory.`);
return;
}
}
} else {
console.log('No directory structure found in memory to update.');
}
}
async function handleFileReceivedButtonPressed(filePath, button) {
await window.electronAPI.showFileInExplorer(filePath)
.then(() => console.log('File explorer opened for: ' + filePath))
.catch(error => console.error('Error opening file explorer:', error));
button.remove();
await removeReceivedFile(filePath);
}
async function resetDatabase() {
const operationCodes = await window.electronAPI.getOperationsCodes();
if (!operationCodes) {
await window.electronAPI.showAlert('Internal error of the application. Failed to retrieve operation codes.');
return;
}
const codeOk = operationCodes.OK;
const codeResetDatabase = operationCodes.RESET_DATABASE;
if(!await window.electronAPI.openUcSocket()){
await window.electronAPI.showAlert('Internal application error.');
return;
}
// Send the request to reset the database
if (!await window.electronAPI.sendUcMessage(codeResetDatabase)) {
await window.electronAPI.showAlert('Failed to send reset database request.');
return;
}
// Wait for the response
await waitForResponse();
await window.electronAPI.changeContent('login');
}
});
async function initialSetup(){
await checkAndSetAllDirectories();
await loadReceivedFiles();
await fetchUserInfo();
}
async function restoreBackup() {
const backupDirectory = await window.electronAPI.readApplicationInfo('backupDirectory');
if (backupDirectory && backupDirectory.path) {
// If backup directory is already set, display an alert
await window.electronAPI.showAlert('You have already set a backup directory. You cannot restore again.');
return;
}
// Prompt the user to choose the destination for the restored backup
const destinationPath = await window.electronAPI.selectDirectory();
if (!destinationPath) {
return; // User canceled the directory selection
}
// Call the IPC method to initiate the backup retrieval process
window.electronAPI.startBackupRetrieval(destinationPath);
// Switch the content to the 'backup_retrieve' page
fadeOut('backup_retrieve');
}
async function checkAndSetAllDirectories() {
await attachNotificationButton('backupDirectory', 'Set your backup directory!', 'backup_alert', 'alert');
await attachNotificationButton('shareDirectory', 'Set your share directory!', 'share_alert', 'alert');
await attachNotificationButton('departmentDirectory', 'Set your department directory!', 'department_alert', 'alert');
}
async function checkPathExistence(pathKey) {
return await window.electronAPI.readApplicationInfo(pathKey);
}
async function setPath(pathKey) {
const path = await window.electronAPI.selectDirectory();
if (path === undefined) return;
const id = await window.electronAPI.createMemoryEntry()
console.log({id, path})
await window.electronAPI.writeApplicationInfo(pathKey, {id, path});
}
async function attachNotificationButton(pathKey, buttonText, buttonId, buttonName) {
const path = await checkPathExistence(pathKey);
if (!path) {
const notificationsDiv = document.getElementById('notifications');
const button = document.createElement('button');
button.className='alert';
button.id = buttonId;
button.name = buttonName;
button.textContent = buttonText;
button.addEventListener('click', async function () {
await setPath(pathKey);
button.remove(); // Remove button after setting the path
});
notificationsDiv.appendChild(button);
}
}
async function fetchUserInfo() {
const usernameField = document.getElementById('username-field');
// Read the user credentials from the userConfig
let userInfo = await window.electronAPI.readUserConfig('user_info');
if (userInfo && userInfo.name) {
usernameField.textContent = userInfo.name;
return;
}
// Update the greeting with the fetched user's name
if (usernameField) {
usernameField.textContent = userInfo.name; // Update the h1 with the user's name
} else {
console.error("Username field is not available in the DOM.");
}
}
async function loadReceivedFiles() {
// Read the shareDirectory from applicationInfo
const shareDirectoryData = await window.electronAPI.readApplicationInfo('shareDirectory');
if (!shareDirectoryData || !shareDirectoryData.id) {
console.log('No received files or directory ID found.');
return;
}
const directoryId = shareDirectoryData.id;
// Fetch the directory structure (JSON objects with user names and file paths)
const directoryStructure = await window.electronAPI.readMemoryEntry(directoryId);
if (!directoryStructure || !directoryStructure.structure) {
console.log('No received files found in the directory structure.');
return;
}
const notificationsDiv = document.getElementById('notifications');
const existingButtons = Array.from(notificationsDiv.children).map(button => button.getAttribute('data-filepath'));
// Iterate over each user and their files in the structure
Object.keys(directoryStructure.structure).forEach(userName => {
const userFiles = directoryStructure.structure[userName];
// Iterate over each file of the user
Object.keys(userFiles).forEach(fileName => {
const filePath = userFiles[fileName];
// Check if a button for this file path already exists
if (!existingButtons.includes(filePath)) {
const button = document.createElement('button');
button.setAttribute('data-filepath', filePath); // Set a custom attribute to track the file path
button.className = 'notification';
button.name = 'notification';
button.textContent = `You received a file "${fileName}" from ${userName}`; // Display the userName and file name
button.addEventListener('click', () => handleFileReceivedButtonPressed(filePath, button));
notificationsDiv.appendChild(button);
}
});
});
}
async function removeReceivedFile(filePath) {
// Read the shareDirectory from applicationInfo
const shareDirectoryData = await window.electronAPI.readApplicationInfo('shareDirectory');
if (!shareDirectoryData || !shareDirectoryData.id) {
console.log('No directory ID found to update.');
return;
}
const directoryId = shareDirectoryData.id;
// Fetch the directory structure
let directoryStructure = await window.electronAPI.readMemoryEntry(directoryId);
if (directoryStructure && directoryStructure.structure) {
// Iterate over each user and their files
for (let userName in directoryStructure.structure) {
let userFiles = directoryStructure.structure[userName];
// Check if the file exists and remove it
if (userFiles[filePath]) {
delete userFiles[filePath];
// Remove the user if no more files are left
if (Object.keys(userFiles).length === 0) {
delete directoryStructure.structure[userName];
}
// Update the directory structure in memory
await window.electronAPI.updateMemoryEntry(directoryId, directoryStructure);
console.log(`File ${filePath} removed from memory.`);
return;
}
}
} else {
console.log('No directory structure found in memory to update.');
}
}
async function handleFileReceivedButtonPressed(filePath, button) {
console.log('Notification button clicked!');
// Open the file in the file explorer
await window.electronAPI.showFileInExplorer(filePath)
.then(() => console.log('File explorer opened for: ' + filePath))
.catch(error => console.error('Error opening file explorer:', error));
// Remove the button after opening the file
button.remove();
// Remove the file from memory
await removeReceivedFile(filePath);
}
async function showConfirmationDialog(message) {
return new Promise((resolve) => {
const userResponse = window.confirm(message); // Show native confirmation dialog
resolve(userResponse); // Resolve with true (OK) or false (Cancel)
});
}
async function resetDatabase(){
fadeOut('reset_database');
}
+209
View File
@@ -0,0 +1,209 @@
let codeOk = '';
let codeGetDepartments = '';
let codeCreateDepartment = '';
let codeModifyDepartment = '';
let codeDeleteDepartment = '';
document.addEventListener('DOMContentLoaded', async () => {
const backButton = document.getElementById('backButton');
const createButton = document.getElementById('createDepartmentButton');
const closeCreateModalButton = document.getElementById('closeCreateModal');
const confirmCreateButton = document.getElementById('confirmCreateButton');
if (!await window.electronAPI.openUcSocket()) {
await window.electronAPI.showAlert('Internal error of the application. Unable to open socket.');
return;
}
backButton.addEventListener('click', async () => {
await window.electronAPI.closeUcSocket();
fadeOut('main_menu');
});
// Show the Create Department Modal
createButton.addEventListener('click', () => {
document.getElementById('createDepartmentModal').style.display = 'block';
});
// Close Modals
closeCreateModalButton.addEventListener('click', () => {
document.getElementById('createDepartmentModal').style.display = 'none';
});
// Confirm Create Department
confirmCreateButton.addEventListener('click', async () => {
const departmentName = document.getElementById('newDepartmentName').value.trim();
if (!departmentName) {
window.electronAPI.showAlert("Please enter a department name.");
return;
}
await createDepartment(departmentName);
document.getElementById('createDepartmentModal').style.display = 'none';
});
});
// Example usage to render these dummy departments
async function fetchDepartments() {
const departmentsContainer = document.getElementById('departments-container');
departmentsContainer.innerHTML = ''; // Clear any existing data
// Retrieve the operation codes via IPC
const operationCodes = await window.electronAPI.getOperationsCodes();
if (!operationCodes) {
await window.electronAPI.showAlert('Internal error of the application. Failed to retrieve operation codes.');
return;
}
codeOk = operationCodes.OK;
codeGetDepartments = operationCodes.GET_DEPARTMENTS;
codeCreateDepartment = operationCodes.CREATE_DEPARTMENT;
codeModifyDepartment = operationCodes.MODIFY_DEPARTMENT;
codeDeleteDepartment = operationCodes.DELETE_DEPARTMENT;
// Send the login message to the server
if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) {
await window.electronAPI.showAlert('Failed to send login request.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if(!response || response.operationCode !== codeOk){
await window.electronAPI.showAlert('Could not fetch departments.');
return false;
}
const departments = response.metaInfo.departments;
const filteredDepartments = departments.filter(department => department.name.toLowerCase() !== 'ceo');
if (!filteredDepartments.length) {
const noDepartmentsMessage = document.createElement('p');
noDepartmentsMessage.textContent = 'No departments exist.';
noDepartmentsMessage.classList.add('no-departments-message');
departmentsContainer.appendChild(noDepartmentsMessage);
return;
}
filteredDepartments.forEach(department => {
const departmentDiv = document.createElement('div');
departmentDiv.classList.add('department-card');
const nameDiv = document.createElement('div');
nameDiv.classList.add('department-name');
nameDiv.textContent = department.name;
// Create and add Modify button
const modifyButton = document.createElement('button');
modifyButton.textContent = 'Modify';
modifyButton.classList.add('modify-button');
modifyButton.dataset.departmentId = department.id;
modifyButton.addEventListener('click', () => {
console.log(`Modify button clicked for department ID: ${department.id}`);
openModifyModal(department.id, department.name); // Call the function to open the modify modal
});
// Create and add Delete button
const deleteButton = document.createElement('button');
deleteButton.textContent = 'Delete';
deleteButton.classList.add('delete-button');
deleteButton.dataset.departmentId = department.id;
deleteButton.addEventListener('click', async () => {
console.log(`Delete button clicked for department ID: ${department.id}`);
await deleteDepartment(department.id); // Call the function to delete the department
});
departmentDiv.appendChild(nameDiv);
departmentDiv.appendChild(modifyButton);
departmentDiv.appendChild(deleteButton);
departmentsContainer.appendChild(departmentDiv);
});
toggleScroll('departments-container', 370);
}
async function createDepartment(departmentName) {
if (!await window.electronAPI.sendUcMessage(codeCreateDepartment, { departmentName: departmentName })) {
await window.electronAPI.showAlert('Failed to send login request.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if(!response || response.operationCode !== codeOk){
await window.electronAPI.showAlert('Could not create new department.');
return false;
}
await fetchDepartments();
}
async function modifyDepartment(departmentId, newDepartmentName) {
if (!await window.electronAPI.sendUcMessage(codeModifyDepartment, { departmentId: departmentId, newDepartmentName: newDepartmentName })) {
await window.electronAPI.showAlert('Failed to send modify request.');
return false;
}
// Wait for the response using waitForResponse
const response = await waitForResponse();
if(!response || response.operationCode !== codeOk){
await window.electronAPI.showAlert('Could not modify department.');
console.log(response.metaInfo.message);
return false;
}
await fetchDepartments();
}
async function deleteDepartment(departmentId) {
const confirmDelete = confirm("Are you sure you want to delete this department?");
if (!confirmDelete) return;
if (!await window.electronAPI.sendUcMessage(codeDeleteDepartment, { departmentId: departmentId })) {
await window.electronAPI.showAlert('Failed to send delete request.');
return false;
}
const response = await waitForResponse();
if(!response || response.operationCode !== codeOk){
await window.electronAPI.showAlert('Could not delete department.');
return false;
}
await fetchDepartments();
}
// Show the Modify Department Modal
function openModifyModal(departmentId, departmentName) {
document.getElementById('confirmModifyButton').value = departmentId;
document.getElementById('modifiedDepartmentName').value = departmentName;
document.getElementById('modifyDepartmentModal').style.display = 'block';
document.getElementById('closeModifyModal').addEventListener('click', () => {
document.getElementById('modifyDepartmentModal').style.display = 'none';
});
document.getElementById('confirmModifyButton').addEventListener('click', async () => {
const newDepartmentName = document.getElementById('modifiedDepartmentName').value.trim();
const departmentId = document.getElementById('confirmModifyButton').value;
console.log(newDepartmentName, departmentId);
if (!newDepartmentName || !departmentId) {
window.electronAPI.showAlert("Please enter a new department name.");
return;
}
await modifyDepartment(departmentId, newDepartmentName);
document.getElementById('modifyDepartmentModal').style.display = 'none';
});
}
+150
View File
@@ -0,0 +1,150 @@
let codeGetDepartments = '';
let codeGetUsers = '';
let codeDeleteUser = '';
let codeOk = '';
document.addEventListener('DOMContentLoaded', async () => {
const backButton = document.getElementById('backButton');
backButton.addEventListener('click', async () => {
await window.electronAPI.closeUcSocket();
fadeOut('main_menu');
});
});
async function fetchData() {
const operationCodes = await window.electronAPI.getOperationsCodes();
if (!operationCodes) {
await window.electronAPI.showAlert('Internal error of the application. Failed to retrieve operation codes.');
return;
}
codeGetDepartments = operationCodes.GET_DEPARTMENTS;
codeGetUsers = operationCodes.GET_USERS;
codeDeleteUser = operationCodes.DELETE_USER;
codeOk = operationCodes.OK;
// Open the TCP socket right after fetching the operation codes
if (!await window.electronAPI.openUcSocket()) {
alert('Failed to open socket. Internal error of the application.');
return;
}
// Fetch departments
const departmentsResponse = await fetchDepartments();
if (!departmentsResponse || departmentsResponse.operationCode !== codeOk) {
alert('Failed to fetch departments. Redirecting to main menu...');
await redirectToMainMenu();
return;
}
const departments = departmentsResponse.metaInfo.departments;
// Fetch users
const usersResponse = await fetchUsers();
if (!usersResponse || usersResponse.operationCode !== codeOk) {
alert('Failed to fetch users. Redirecting to main menu...');
await redirectToMainMenu();
return;
}
const users = usersResponse.metaInfo.users;
const usersContainer = document.getElementById('users-container');
usersContainer.innerHTML = ''; // Clear the container
// Filter out users in the CEO department
const ceoDepartment = departments.find(dept => dept.name.toLowerCase() === 'ceo');
const filteredUsers = users.filter(user => user.departmentId !== ceoDepartment.id);
// Check if there are no users after filtering
if (!filteredUsers.length) {
const noUsersMessage = document.createElement('p');
noUsersMessage.textContent = 'No users exist.';
noUsersMessage.classList.add('no-users-message'); // Add a class for styling
usersContainer.appendChild(noUsersMessage);
fadeIn(); // Fade in the container when the message is loaded
return;
}
// Render users if there are any
filteredUsers.forEach(user => {
const userDiv = document.createElement('div');
userDiv.classList.add('user-card');
// Create user info div
const userInfoDiv = document.createElement('div');
userInfoDiv.classList.add('user-info');
// Create user name paragraph
const nameP = document.createElement('p');
nameP.classList.add('user-name');
nameP.textContent = user.name;
console.log(user)
console.log(departments)
// Find and display user's department name
const department = departments.find(dept => dept.id === user.departmentId);
const departmentName = department ? department.name : 'Unknown';
// Create user department paragraph
const departmentP = document.createElement('p');
departmentP.classList.add('user-department');
departmentP.textContent = `Department: ${departmentName}`;
// Append name and department to user info div
userInfoDiv.appendChild(nameP);
userInfoDiv.appendChild(departmentP);
// Create delete button
const deleteButton = document.createElement('button');
deleteButton.textContent = 'Delete';
deleteButton.classList.add('delete-button');
deleteButton.onclick = () => deleteUser(user.id);
// Append user info div and delete button to user card
userDiv.appendChild(userInfoDiv);
userDiv.appendChild(deleteButton);
// Append user card to the container
usersContainer.appendChild(userDiv);
});
}
async function fetchDepartments() {
// Send the request to get departments
if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) {
return null;
}
return await waitForResponse();
}
async function fetchUsers() {
// Send the request to get users
if (!await window.electronAPI.sendUcMessage(codeGetUsers)) {
return null;
}
return await waitForResponse();
}
async function deleteUser(userId) {
// Send the request to delete the user
if (!await window.electronAPI.sendUcMessage(codeDeleteUser, {id: userId})) {
alert('Failed to send request to delete user.');
return;
}
const response = await waitForResponse();
if (!response || response.operationCode !== codeOk) {
alert('Failed to delete user.');
return;
}
await fetchData();
}
async function redirectToMainMenu() {
await window.electronAPI.closeUcSocket();
fadeOut('main_menu');
}
+4 -3
View File
@@ -10,8 +10,8 @@ document.addEventListener('DOMContentLoaded', async function () {
usernameInput.value = name;
passwordInput.value = password;
const backButton = document.querySelector('button[name="login"]');
const submitButton = document.querySelector('button[name="submit"]');
const backButton = document.getElementById('back');
const submitButton = document.getElementById('submit');
// Get operation codes from the backend
const operationCodes = await window.electronAPI.getOperationsCodes();
@@ -39,7 +39,8 @@ document.addEventListener('DOMContentLoaded', async function () {
const name = usernameInput.value;
const password = passwordInput.value;
const { id, departmentId, app_type } = await window.electronAPI.readUserConfig('user_info'); // Fetch login data
const { id, departmentId } = await window.electronAPI.readUserConfig('user_info'); // Fetch login data
const app_type = await window.electronAPI.readUserConfig('app_type'); // Fetch app type
// Prepare the data to be sent via the UC socket
const messageData = {
+31
View File
@@ -0,0 +1,31 @@
document.addEventListener('DOMContentLoaded', async function () {
const operationCodes = await window.electronAPI.getOperationsCodes();
if (!operationCodes) {
await window.electronAPI.showAlert('Internal error of the application. Failed to retrieve operation codes.');
return;
}
const codeResetDatabase = operationCodes.RESET_DATABASE;
const codeOk = operationCodes.OK;
// Open a TCP socket to the stored IP
if (!await window.electronAPI.openUcSocket()) {
await window.electronAPI.showAlert('Internal error of the application. Unable to open socket.');
return;
}
if (!await window.electronAPI.sendUcMessage(codeResetDatabase)) {
await window.electronAPI.showAlert('Failed to send login request.');
return;
}
const response = await waitForResponse();
if (response && response.operationCode !== codeOk) {
await window.electronAPI.showAlert('Database reset failed.');
return;
}
await window.electronAPI.closeUcSocket();
await new Promise(resolve => setTimeout(resolve, 2000));
fadeOut('login');
});
+20 -17
View File
@@ -1,3 +1,6 @@
let codeResetPassword = '';
let codeOk = '';
document.addEventListener('DOMContentLoaded', async function () {
const backToLoginButton = document.getElementById('backToLogin');
const resetPasswordButton = document.getElementById('resetPassword');
@@ -9,8 +12,8 @@ document.addEventListener('DOMContentLoaded', async function () {
return;
}
const codeResetPassword = operationCodes.RESET_PASSWORD;
const codeOk = operationCodes.OK;
codeResetPassword = operationCodes.RESET_PASSWORD;
codeOk = operationCodes.OK;
// Back to login
backToLoginButton.addEventListener('click', function (e) {
@@ -45,19 +48,19 @@ document.addEventListener('DOMContentLoaded', async function () {
await window.electronAPI.showAlert('Password reset successfully.');
window.electronAPI.changeContent('login');
});
async function attemptResetPassword(email, newPassword) {
const app_type = await window.electronAPI.readUserConfig('app_type');
const messageData = { email, newPassword, app_type };
if (!await window.electronAPI.sendUcMessage(codeResetPassword, messageData)) return false;
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
return true;
} else {
await window.electronAPI.showAlert(response?.metaInfo?.message || 'Error resetting password.');
return false;
}
}
});
async function attemptResetPassword(email, newPassword) {
const app_type = await window.electronAPI.readUserConfig('app_type');
const messageData = { email, newPassword, app_type };
if (!await window.electronAPI.sendUcMessage(codeResetPassword, messageData)) return false;
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
return true;
} else {
await window.electronAPI.showAlert(response?.metaInfo?.message || 'Error resetting password.');
return false;
}
}
+80 -72
View File
@@ -1,62 +1,13 @@
let pathToFile = '';
let fetchUsersInterval = null;
document.addEventListener('DOMContentLoaded', async function () {
let user_info = {};
let pathToFile = '';
const selectFileButton = document.getElementById('selectFile');
const submitButton = document.getElementById('submitButton');
const backButton = document.getElementById('backButton');
user_info = await window.electronAPI.readUserConfig('user_info');
if (!user_info) {
await window.electronAPI.showAlert('No user_info entry found.');
return;
}
// Function to update the file name display
function updateFileName() {
const fileNameElement = document.getElementById('fileName');
if (!fileNameElement) {
return;
}
if (pathToFile.trim() === '') {
fileNameElement.textContent = 'No file chosen';
} else {
fileNameElement.textContent = pathToFile.split('\\').pop().split('/').pop();
}
}
updateFileName();
// Fetch user information from applicationInfo and create checkboxes for selecting users
async function fetchUsersAndCreateCheckboxes() {
const usersInfoId = await window.electronAPI.readApplicationInfo('active_users_info');
if (!usersInfoId) {
await window.electronAPI.showAlert('Internal error.');
return;
}
const usersInfo = await window.electronAPI.readMemoryEntry(usersInfoId);
if (!usersInfo || usersInfo.length === 0) {
await window.electronAPI.showAlert('No active users found.');
await window.electronAPI.changeContent('main_menu');
return;
}
const usersDiv = document.querySelector('.choose_user_form_content');
usersDiv.innerHTML = '';
usersInfo.forEach(user => {
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.name = 'users';
checkbox.value = user.ip; // Store user's IP in the value
const label = document.createElement('label');
label.innerHTML = `${user.user_info.name}`; // Display user's name
label.insertBefore(checkbox, label.firstChild);
usersDiv.appendChild(label);
});
}
// Event listener for selecting the file
document.getElementById('selectFile').addEventListener('click', async function () {
selectFileButton.addEventListener('click', async function (event) {
event.preventDefault();
try {
pathToFile = await window.electronAPI.selectFile();
updateFileName();
@@ -64,14 +15,7 @@ document.addEventListener('DOMContentLoaded', async function () {
console.error('Error opening file dialog:', error);
}
});
// Event listener for back button to navigate to main menu
document.getElementById('backButton').addEventListener('click', function () {
fadeOut('main_menu');
});
// Submit button logic to queue file send tasks and then navigate to main_menu.html
document.getElementById('submitButton').addEventListener('click', async function (event) {
submitButton.addEventListener('click', async function (event) {
event.preventDefault();
// Check if a file was chosen
@@ -80,6 +24,11 @@ document.addEventListener('DOMContentLoaded', async function () {
return;
}
const user_info = await window.electronAPI.readUserConfig('user_info');
if (!user_info) {
return;
}
const form = document.getElementById('userDestForm');
const checkboxes = form.querySelectorAll('input[name="users"]');
const selectedUserIps = Array.from(checkboxes)
@@ -100,19 +49,78 @@ document.addEventListener('DOMContentLoaded', async function () {
userName: user_info.name // Sender's username from userConfig
};
await window.electronAPI.addTaskToSendFileQueue(task);
await window.electronAPI.showAlert('File sent to the queue.');
console.log(`Task added to send file to IP ${selectedUserIp}`);
} catch (error) {
console.error(`Error processing IP ${selectedUserIp}:`, error);
}
}
// Navigate back to the main menu after all tasks are queued
fadeOut('main_menu'); // Navigate to the main menu
});
backButton.addEventListener('click', function (event) {
event.preventDefault();
fadeOut('main_menu');
});
// Fetch users and create checkboxes every 5 seconds (in case of updates)
setInterval(fetchUsersAndCreateCheckboxes, 5000);
fetchUsersAndCreateCheckboxes().then(() => console.log('User checkboxes rendered'));
});
// Function to update the file name display
function updateFileName() {
const fileNameElement = document.getElementById('selectFile');
if (!fileNameElement) {
return;
}
if (pathToFile.trim() === '') {
fileNameElement.textContent = 'No file chosen';
} else {
fileNameElement.textContent = pathToFile.split('\\').pop().split('/').pop();
}
}
async function fetchUsersAndCreateCheckboxes() {
// Step 1: Get the currently checked users before refreshing the list
const selectedUserIps = new Set(
Array.from(document.querySelectorAll('input[name="users"]:checked'))
.map(checkbox => checkbox.value)
);
const usersInfoId = await window.electronAPI.readApplicationInfo('active_users_info');
if (!usersInfoId) {
await window.electronAPI.showAlert('Internal error.');
return;
}
const usersInfo = await window.electronAPI.readMemoryEntry(usersInfoId);
if (!usersInfo || usersInfo.length === 0) {
await window.electronAPI.showAlert('No active users found.');
clearInterval(fetchUsersInterval);
fetchUsersInterval = null;
await window.electronAPI.changeContent('main_menu');
return;
}
const usersDiv = document.getElementById('choose_user_form_content');
usersDiv.innerHTML = ''; // Clear the list before updating
usersInfo.forEach(user => {
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.name = 'users';
checkbox.value = user.ip; // Store user's IP in the value
// Step 2: Check if this user was previously selected
if (selectedUserIps.has(user.ip)) {
checkbox.checked = true; // Restore checked state
}
const label = document.createElement('label');
label.innerHTML = `${user.user_info.name}`; // Display user's name
label.insertBefore(checkbox, label.firstChild);
usersDiv.appendChild(label);
});
toggleScroll('choose_user_form_content');
}
-134
View File
@@ -1,134 +0,0 @@
document.addEventListener('DOMContentLoaded', async function () {
const nextToStep2Button = document.getElementById('nextToStep2');
const backToStep1Button = document.getElementById('backToStep1');
const submitSignupButton = document.getElementById('submitSignup');
const backToLogin = document.getElementById('backToLogin');
const step1 = document.getElementById('step1');
const step2 = document.getElementById('step2');
// This object will hold the user data
let userData = {
email: null,
name: null,
password: null,
app_type: null,
departmentId: null
};
if (!await window.electronAPI.openUcSocket()) {
alert('Internal error of the application.');
return;
}
const operationCodes = await window.electronAPI.getOperationsCodes();
if (!operationCodes) {
await window.electronAPI.showAlert('Internal error of the application.');
return;
}
const codeGetDepartments = operationCodes.GET_DEPARTMENTS;
const codeSignUp = operationCodes.SIGN_UP;
const codeOk = operationCodes.OK;
let departments = await getDepartments();
if (departments === null) {
await window.electronAPI.showAlert('Failed to fetch departments.');
return;
}
console.log(departments);
// Handle form submission for Step 1 (Profile Information)
nextToStep2Button.addEventListener('click', async function (e) {
e.preventDefault(); // Prevent the default form submission
// Collect data from Step 1 inputs
userData.email = document.querySelector('input[name="email"]').value;
userData.name = document.querySelector('input[name="name"]').value;
userData.password = document.querySelector('input[name="password"]').value;
userData.app_type = await window.electronAPI.readUserConfig('app_type');
// Move to Step 2
const departmentList = document.getElementById('departmentList');
departmentList.innerHTML = ''; // Clear existing departments
// Populate department list
departments.forEach(department => {
if (department.name !== 'CEO' && department.name !== 'ADMIN') {
const label = document.createElement('label');
label.innerHTML = `
<input type="radio" name="dept" value="${department.id}">
${department.name}
`;
departmentList.appendChild(label);
}
});
switchStep(step1, step2);
});
// Handle form submission for Step 2 (Department Selection)
submitSignupButton.addEventListener('click', async function (e) {
e.preventDefault(); // Prevent form from being submitted in the usual way
// Get the selected department
userData.departmentId = document.querySelector('input[name="dept"]:checked')?.value;
if (!userData.departmentId) {
await window.electronAPI.showAlert('Please select a department.');
return;
}
if (!await attemptSignUp()) {
switchStep(step2, step1);
return;
}
await window.electronAPI.showAlert('Signup successful!');
await window.electronAPI.changeContent('login');
});
// Back to Step 1 from Step 2
backToStep1Button.addEventListener('click', function () {
switchStep(step2, step1);
});
// Back to login
backToLogin.addEventListener('click', async function (e) {
e.preventDefault();
await window.electronAPI.closeUcSocket();
await window.electronAPI.changeContent('login');
});
async function getDepartments() {
if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) return null;
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
return response.metaInfo.departments;
}
return null;
}
async function attemptSignUp() {
if (!await window.electronAPI.sendUcMessage(codeSignUp, userData)) return false;
const response = await waitForResponse();
if (response && response.operationCode === codeOk) {
return true;
}
await window.electronAPI.showAlert(`Signup failed: ${response?.metaInfo?.message || 'Unknown error'}`);
return false;
}
// Function to switch between steps
function switchStep(fromStep, toStep) {
fromStep.classList.remove('active'); // Fade out the current step
setTimeout(() => {
fromStep.style.display = 'none'; // Hide the current step after transition
toStep.style.display = 'flex'; // Ensure display is flex for the next step
setTimeout(() => {
toStep.classList.add('active'); // Fade in the next step
}, 20); // Small delay to allow display change before applying opacity
}, 500); // Transition duration (0.5s)
}
});
-142
View File
@@ -1,142 +0,0 @@
document.addEventListener('DOMContentLoaded', async () => {
const backButton = document.getElementById('backButton');
backButton.addEventListener('click', async () => {
await window.electronAPI.closeUcSocket();
fadeOut('main_menu');
});
const operationCodes = await window.electronAPI.getOperationsCodes();
if (!operationCodes) {
alert('Internal error of the application.');
return;
}
// Open the TCP socket right after fetching the operation codes
if (!await window.electronAPI.openUcSocket()) {
alert('Failed to open socket. Internal error of the application.');
return;
}
let codeGetDepartments = operationCodes.GET_DEPARTMENTS;
let codeGetUsers = operationCodes.GET_USERS;
let codeDeleteUser = operationCodes.DELETE_USER;
let codeOk = operationCodes.OK;
// Fetch both users and departments, then display the users with their departments
async function fetchData() {
try {
// Fetch departments
const departmentsResponse = await fetchDepartments();
if (!departmentsResponse || departmentsResponse.operationCode !== codeOk) {
alert('Failed to fetch departments. Redirecting to main menu...');
await redirectToMainMenu();
return;
}
const departments = departmentsResponse.metaInfo.departments;
// Fetch users
const usersResponse = await fetchUsers();
if (!usersResponse || usersResponse.operationCode !== codeOk) {
alert('Failed to fetch users. Redirecting to main menu...');
await redirectToMainMenu();
return;
}
const users = usersResponse.metaInfo.users;
const usersContainer = document.getElementById('users-container');
usersContainer.innerHTML = ''; // Clear the container
// Filter out users in the CEO department
const ceoDepartment = departments.find(dept => dept.name.toLowerCase() === 'ceo');
const filteredUsers = users.filter(user => user.departmentId !== ceoDepartment.id);
// Check if there are no users after filtering
if (!filteredUsers.length) {
const noUsersMessage = document.createElement('p');
noUsersMessage.textContent = 'No users exist.';
noUsersMessage.classList.add('no-users-message'); // Add a class for styling
usersContainer.appendChild(noUsersMessage);
fadeIn(); // Fade in the container when the message is loaded
return;
}
// Render users if there are any
filteredUsers.forEach(user => {
const userDiv = document.createElement('div');
userDiv.classList.add('user-card');
// Create user name div
const nameDiv = document.createElement('div');
nameDiv.classList.add('user-name');
nameDiv.textContent = user.name;
// Find the user's department name using departmentId
const department = departments.find(dept => dept.id === user.departmentId);
const departmentName = department ? department.name : 'Unknown';
// Create department div
const departmentDiv = document.createElement('div');
departmentDiv.classList.add('user-department');
departmentDiv.textContent = `Department: ${departmentName}`;
// Create delete button
const deleteButton = document.createElement('button');
deleteButton.textContent = 'Delete';
deleteButton.classList.add('delete-button');
deleteButton.onclick = () => deleteUser(user.id);
// Append user info and delete button to the user div
userDiv.appendChild(nameDiv);
userDiv.appendChild(departmentDiv);
userDiv.appendChild(deleteButton);
// Append user div to the container
usersContainer.appendChild(userDiv);
});
fadeIn(); // Fade in the container when the users are loaded
} catch (error) {
console.error('Error fetching data:', error);
alert('An unexpected error occurred. Redirecting to main menu...');
await redirectToMainMenu();
}
}
async function fetchDepartments() {
// Send the request to get departments
if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) {
return null;
}
return await waitForResponse();
}
async function fetchUsers() {
// Send the request to get users
if (!await window.electronAPI.sendUcMessage(codeGetUsers)) {
return null;
}
return await waitForResponse();
}
async function deleteUser(userId) {
// Find the index of the user in the dummy data
const userIndex = dummyUsers.findIndex(user => user.id === userId);
// If user found, remove it from the array
if (userIndex !== -1) {
dummyUsers.splice(userIndex, 1);
alert(`User with ID ${userId} deleted.`);
await fetchData(); // Refresh the users after deleting
}
}
async function redirectToMainMenu() {
await window.electronAPI.closeUcSocket();
fadeOut('main_menu');
}
// Fetch data on page load
await fetchData();
});