Files
CDN-APP-INSIDER/public/js/dashboard.js
Dinawo d627bf5b6c
All checks were successful
continuous-integration/drone/push Build is passing
Update French error message in showFileInfo function
2024-04-17 17:04:01 +02:00

565 lines
24 KiB
JavaScript

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 = '</svg><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-brightness-high-fill" viewBox="0 0 16 16"><path d="M12 8a4 4 0 1 1-8 0 4 4 0 0 1 8 0M8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0m0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13m8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5M3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8m10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0m-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0m9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707M4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708"/></svg>';
} else {
icon.classList.remove('bi-moon-fill');
icon.classList.add('bi-brightness-high-fill');
icon.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-moon-fill" viewBox="0 0 16 16"><path d="M6 .278a.77.77 0 0 1 .08.858 7.2 7.2 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277q.792-.001 1.533-.16a.79.79 0 0 1 .81.316.73.73 0 0 1-.031.893A8.35 8.35 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.75.75 0 0 1 6 .278"/>';
}
}
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 = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-brightness-high-fill" viewBox="0 0 16 16"><path d="M12 8a4 4 0 1 1-8 0 4 4 0 0 1 8 0M8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0m0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13m8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5M3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8m10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0m-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0m9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707M4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708"/></svg>';
} else {
icon.classList.remove('bi-moon-fill');
icon.classList.add('bi-brightness-high-fill');
icon.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-moon-fill" viewBox="0 0 16 16"><path d="M6 .278a.77.77 0 0 1 .08.858 7.2 7.2 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277q.792-.001 1.533-.16a.79.79 0 0 1 .81.316.73.73 0 0 1-.031.893A8.35 8.35 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.75.75 0 0 1 6 .278"/></svg>';
}
}
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;
}
async function showFileInfo(fileLink) {
let data;
try {
let response = await fetch('/data/file_info.json');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
let fileContent = await response.text();
data = JSON.parse(fileContent);
} catch (error) {
console.log(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.',
showConfirmButton: false,
timer: 1800,
toast: true,
});
return;
}
let pathParts = fileLink.split('/');
if (pathParts.length < 4) {
Swal.fire({
position: 'top',
icon: 'error',
title: `Le lien du fichier ${fileLink} n'est pas valide.`,
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: `Aucune information trouvée pour le fichier ${fileName} pour l'utilisateur avec l'ID ${userId}.`,
showConfirmButton: false,
timer: 1800,
toast: true,
});
return;
}
console.log('Found fileInfo:', fileInfo);
let html = `<p>Nom du fichier : ${fileInfo.fileName}</p>`;
if (fileInfo.expiryDate) {
html += `<p>Date de fin de disponibilité : ${fileInfo.expiryDate}</p>`;
}
if (fileInfo.password) {
html += `<p>Mot de passe : Oui</p>`;
}
Swal.fire({
title: 'Informations sur le fichier',
html: html,
confirmButtonText: 'Fermer'
});
}
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';
}