document.addEventListener('DOMContentLoaded', function () { const copyButtons = document.querySelectorAll('.copy-button'); copyButtons.forEach(copyButton => { copyButton.addEventListener("click", () => { const fileContainer = copyButton.closest('tr'); const fileLink = fileContainer.querySelector('.file-link'); fileLink.style.display = "block"; fileLink.select(); document.execCommand("copy"); fileLink.style.display = "none"; copyButton.textContent = "Lien copié !"; setTimeout(() => { copyButton.textContent = "Copier le lien"; }, 2000); }); }); const filterForm = document.getElementById('filterForm'); const extensionFilter = document.getElementById('extensionFilter'); const fileSearchInput = document.getElementById('fileSearch'); const styleSwitcherButton = document.getElementById('styleSwitcher'); const icon = document.getElementById('themeIcon'); const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); let isDarkMode = darkModeMediaQuery.matches; function toggleDarkMode() { isDarkMode = !isDarkMode; document.body.classList.toggle('dark-mode', isDarkMode); if (isDarkMode) { icon.classList.remove('bi-brightness-high-fill'); icon.classList.add('bi-moon-fill'); icon.innerHTML = ''; } else { icon.classList.remove('bi-moon-fill'); icon.classList.add('bi-brightness-high-fill'); icon.innerHTML = ''; } } function applyStyleMode() { document.body.classList.toggle('dark-mode', isDarkMode); if (isDarkMode) { icon.classList.remove('bi-brightness-high-fill'); icon.classList.add('bi-moon-fill'); icon.innerHTML = ''; } else { icon.classList.remove('bi-moon-fill'); icon.classList.add('bi-brightness-high-fill'); icon.innerHTML = ''; } } darkModeMediaQuery.addListener(applyStyleMode); applyStyleMode(); styleSwitcherButton.addEventListener('click', toggleDarkMode); filterForm.addEventListener('submit', function (event) { event.preventDefault(); const selectedExtension = extensionFilter.value.toLowerCase(); const searchQuery = fileSearchInput.value.toLowerCase(); const fileList = document.querySelectorAll('tr[data-extension]'); fileList.forEach(file => { const fileExtension = file.getAttribute('data-extension').toLowerCase(); const fileName = file.querySelector('td:first-child').textContent.toLowerCase(); const extensionMatch = selectedExtension === '' || selectedExtension === fileExtension; const searchMatch = fileName.includes(searchQuery); if (extensionMatch && searchMatch) { file.style.display = ''; } else { file.style.display = 'none'; } }); }); }); document.addEventListener('DOMContentLoaded', function () { const deleteFolderButtons = document.querySelectorAll('.delete-folder-button'); deleteFolderButtons.forEach(deleteButton => { deleteButton.addEventListener('click', async () => { const fileContainer = deleteButton.closest('tr'); const folderName = fileContainer.querySelector('td:first-child').textContent; Swal.fire({ title: 'Êtes-vous sûr?', text: `La suppression du dossier "${folderName}" est irréversible!`, icon: 'warning', showCancelButton: true, confirmButtonColor: '#d33', cancelButtonColor: '#3085d6', confirmButtonText: 'Supprimer', cancelButtonText: 'Annuler', }).then(async (result) => { if (result.isConfirmed) { try { const response = await fetch(`/api/dpanel/dashboard/deletefolder/${folderName}`, { method: 'DELETE', }); if (response.ok) { fileContainer.remove(); Swal.fire({ position: 'top', icon: 'success', title: 'Le dossier a été supprimé avec succès.', showConfirmButton: false, timer: 1800, toast: true }); } else { Swal.fire({ position: 'top', icon: 'error', title: 'La suppression du dossier a échoué', showConfirmButton: false, timer: 1800, toast: true }); } } catch (error) { console.error('Erreur lors de la suppression du dossier:', error); Swal.fire('Erreur!', 'Une erreur s\'est produite lors de la suppression du dossier.', 'error'); } } }); }); }); }); window.onload = function() { var newFolderModalBtn = document.getElementById('newFolderModalBtn'); if(newFolderModalBtn) { newFolderModalBtn.addEventListener('click', function (e) { e.preventDefault(); Swal.fire({ title: 'Nouveau dossier', input: 'text', inputPlaceholder: 'Entrer le nom du nouveau dossier', confirmButtonText: 'Créer', showCancelButton: true, cancelButtonText: 'Annuler', preConfirm: (folderName) => { if (!folderName) { Swal.showValidationMessage('Le nom du dossier ne peut pas être vide.'); } return folderName; } }).then(result => { if (result.isConfirmed) { const folderName = result.value.trim(); fetch('/api/dpanel/dashboard/newfolder', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ folderName }), }) .then(response => { if (response.ok) { return response.json(); } else { return response.json().then(error => Promise.reject(error)); } }) .then(result => { Swal.fire({ position: 'top', icon: 'success', title: 'Le dossier a été créé avec succès.', showConfirmButton: false, timer: 2000, toast: true }) .then(() => { location.reload(); }); }) .catch(error => { Swal.fire({ position: 'top', icon: 'error', title: 'Erreur lors de la création du dossier.', text: error.message, showConfirmButton: false, timer: 2350, toast: true }) }); } }); }); } }; function performUpdate() { fetch('/applyupdate') .then(response => response.json()) .then(result => { if (result.success) { Swal.fire({ title: 'Mise à jour réussie', text: 'Votre application a été mise à jour avec succès.', icon: 'success', toast: true, position: 'bottom-right', showConfirmButton: false, timer: 5000 }); } else { Swal.fire({ title: 'Mise à jour échouée', text: 'Une erreur s\'est produite lors de la mise à jour de votre application.', icon: 'error', toast: true, position: 'bottom-right', showConfirmButton: false, timer: 5000 }); } }) .catch(error => { console.error('Erreur lors de la mise à jour :', error); Swal.fire({ text: 'Erreur lors de la mise à jour.', icon: 'error', toast: true, position: 'bottom-right', showConfirmButton: false, timer: 5000 }); }); } function checkUpdates() { fetch('/checkupdate') .then(response => response.json()) .then(result => { if (result.updateAvailable) { Swal.fire({ title: 'Nouvelle mise à jour disponible', text: 'Voulez-vous mettre à jour votre application?', icon: 'info', showCancelButton: true, confirmButtonText: 'Oui', cancelButtonText: 'Non', position: 'bottom-right', toast: true, }).then((result) => { if (result.isConfirmed) { performUpdate(); } }); } else { Swal.fire({ title: 'Application à jour', text: 'Votre application est à jour.', icon: 'success', toast: true, position: 'bottom-right', showConfirmButton: false, timer: 5000 }); } }) .catch(error => { console.error('Erreur lors de la vérification des mises à jour :', error); Swal.fire({ text: 'Erreur lors de la vérification des mises à jour.', icon: 'error', toast: true, position: 'bottom-right', showConfirmButton: false, timer: 5000 }); }); } document.getElementById('checkUpdateButton').addEventListener('click', async function() { const userName = await getLoggedInUserName(); fs.readFile('user.json', (err, data) => { if (err) throw err; let users = JSON.parse(data); const user = users.find(user => user.name === userName); if (user && user.role === 'admin') { checkUpdates(); } else { Swal.fire({ position: 'top', icon: 'warning', title: 'Vous n\'avez pas les droits pour effectuer cette action.', showConfirmButton: false, timer: 2600, toast: true }); } }); }); var modal = document.getElementById('patchNoteModal'); if (isDarkMode()) { modal.classList.add('dark-mode'); } else { modal.classList.add('light-mode'); } $(document).ready(function () { $('#accountDropdownBtn').on('click', function () { $('#accountDropdownMenu').toggleClass('show'); }); $(document).on('click', function (e) { if (!$('#accountDropdownBtnGroup').is(e.target) && $('#accountDropdownBtnGroup').has(e.target).length === 0) { $('#accountDropdownMenu').removeClass('show'); } }); }); function confirmDelete(filename) { Swal.fire({ title: 'Êtes-vous sûr de vouloir supprimer ce fichier?', text: 'Cette action est irréversible!', icon: 'warning', showCancelButton: true, confirmButtonColor: '#d33', cancelButtonColor: '#3085d6', confirmButtonText: 'Supprimer' }).then(async (result) => { if (result.isConfirmed) { try { const response = await fetch('/api/dpanel/dashboard/delete', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ filename: filename, }), }); if (response.ok) { Swal.fire({ position: 'top', icon: 'success', title: 'Le fichier a été supprimé avec succès.', showConfirmButton: false, timer: 1800, toast: true }) .then(() => { location.reload(); }); } else { Swal.fire({ position: 'top', icon: 'error', title: 'La suppression du fichier a échoué.', showConfirmButton: false, timer: 1800, toast: true }); } } catch (error) { console.error('Erreur lors de la suppression du fichier:', error); Swal.fire('Erreur!', 'Une erreur s\'est produite lors de la suppression du fichier.', 'error'); } } }); } function renameFile(folderName, currentName) { const fileExtensionIndex = currentName.lastIndexOf('.'); const fileExtension = currentName.substring(fileExtensionIndex); Swal.fire({ title: 'Entrez le nouveau nom', input: 'text', inputValue: currentName, inputPlaceholder: 'Nouveau nom', showCancelButton: true, confirmButtonText: 'Renommer', cancelButtonText: 'Annuler', onOpen: (el) => { setTimeout(() => { const input = Swal.getInput(); const pos = input.value.lastIndexOf('.'); input.setSelectionRange(0, pos); }, 0); } }).then((result) => { if (result.isConfirmed) { const newName = result.value; fetch(`/api/dpanel/dashboard/rename/${folderName}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ currentName: currentName, newName: newName }), }) .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.text(); }) .then(data => { Swal.fire({ position: 'top', icon: 'success', title: 'Le fichier a été renommé avec succès.', showConfirmButton: false, timer: 1800, toast: true, }).then(() => { location.reload(); }); }) .catch((error) => { Swal.fire({ position: 'top', icon: 'error', title: 'Erreur lors du renommage du fichier.', showConfirmButton: false, timer: 1800, toast: true, }); }); } }); } async function getUserIdFromFolder(username) { if (!username) { console.error('Username is not defined'); return null; } let users; try { let response = await fetch(`/user.json`); if (!response.ok) { throw new Error('Network response was not ok'); } users = await response.json(); } catch (error) { console.error('Error:', error); return null; } let user = users.find(user => user.name.toLowerCase() === username.toLowerCase()); return user ? user.id : null; } window.onload = async function() { console.log("Page loaded, fetching file info..."); let data; try { let response = await fetch('/api/dpanel/dashboard/getmetadatafile/file_info', { method: 'GET', headers: { 'Content-Type': 'application/json' } }); console.log("Response from fetch:", response); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } data = await response.json(); console.log("Data from response:", data); } catch (error) { console.log("Error in fetch:", error); Swal.fire({ position: 'top', icon: 'error', title: 'Les informations sur le fichier ne sont pas disponibles pour le moment. Veuillez réessayer plus tard.', text: `Error: ${error.message}`, showConfirmButton: false, timer: 1800, toast: true, }); return; } let table = document.getElementById("fileTable"); for (let file of data) { let row = table.insertRow(); let cell = row.insertCell(); cell.innerHTML = `${file.fileName}`; } } async function showFileInfo(fileLink) { console.log("showFileInfo called with fileLink:", fileLink); let data; try { let response = await fetch('/api/dpanel/dashboard/getmetadatafile/file_info', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ fileLink: fileLink, }) }); console.log("Response from fetch:", response); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } data = await response.json(); console.log("Data from response:", data); } catch (error) { console.log("Error in fetch:", error); Swal.fire({ position: 'top', icon: 'error', title: 'Les informations sur le fichier ne sont pas disponibles pour le moment. Veuillez réessayer plus tard.', text: `Error: ${error.message}`, showConfirmButton: false, timer: 1800, toast: true, }); return; } let pathParts = fileLink.split('/'); console.log("pathParts:", pathParts); if (pathParts.length < 4) { Swal.fire({ position: 'top', icon: 'error', title: `The file link ${fileLink} is not valid.`, showConfirmButton: false, timer: 1800, toast: true, }); return; } let fileName = pathParts.pop(); let userId = pathParts.pop(); let fileInfo = data.find(file => file.fileName === fileName && file.Id === userId); console.log('Found fileInfo:', fileInfo); if (!fileInfo) { Swal.fire({ position: 'top', icon: 'error', title: `No information found for the file ${fileName} for the user with ID ${userId}.`, showConfirmButton: false, timer: 1800, toast: true, }); return; } console.log('Found fileInfo:', fileInfo); let html = `

File name: ${fileInfo.fileName}

`; if (fileInfo.expiryDate) { html += `

Expiry date: ${fileInfo.expiryDate}

`; } if (fileInfo.password) { html += `

Password: Yes

`; } if (fileInfo.userId) { html += `

User: ${fileInfo.userId}

`; } Swal.fire({ title: 'File Information', html: html, confirmButtonText: 'Close' }); } async function displayMetadata() { const response = await fetch('/build-metadata'); if (!response.ok) { console.error('Failed to fetch metadata'); return; } const metadata = await response.json(); if (!metadata) { console.error('No metadata provided'); return; } document.getElementById('buildVersion').textContent = metadata.build_version; document.getElementById('nodeVersion').textContent = metadata.node_version; document.getElementById('expressVersion').textContent = metadata.express_version; document.getElementById('buildSha').textContent = metadata.build_sha; document.getElementById('osType').textContent = metadata.os_type; document.getElementById('osRelease').textContent = metadata.os_release; const modal = document.getElementById('metadataModal'); modal.style.display = 'block'; } function closeModal() { const modal = document.getElementById('metadataModal'); modal.style.display = 'none'; }