Version 0.2.0 - Ajout de l'explorateur de fichier, des ViewWindow, Des DroppableMenu
All checks were successful
Neutral/pipeline/head This commit looks good
All checks were successful
Neutral/pipeline/head This commit looks good
This commit is contained in:
@ -23,6 +23,8 @@ class InfoPop {
|
||||
this.element.innerHTML = " "
|
||||
this.element.style.fontSize = "14px"
|
||||
this.element.style.position = "sticky"
|
||||
this.element.style.width = this.element.parentElement.offsetWidth + "px"
|
||||
this.element.style.textAlign = "center"
|
||||
}
|
||||
|
||||
clear() {
|
||||
@ -44,6 +46,11 @@ class InfoPop {
|
||||
this.element.innerHTML = "<i class='fa fa-info-circle'></i> " + text
|
||||
}
|
||||
|
||||
setSize(size) {
|
||||
|
||||
this.element.style.fontSize = size
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -65,11 +72,15 @@ document.oncontextmenu = function(e) {
|
||||
|
||||
}
|
||||
|
||||
var zIndex = 5
|
||||
|
||||
class ViewWindow {
|
||||
ViewHTML = null
|
||||
ViewProperties =null
|
||||
ViewSpanInteger = null
|
||||
ViewPopupSpanInteger = null
|
||||
ViewPopupHTML = null
|
||||
ViewPopupTitle = null
|
||||
constructor(properties) {
|
||||
if(!viewsAccessible.has(properties.title)) {
|
||||
|
||||
@ -78,6 +89,7 @@ class ViewWindow {
|
||||
|
||||
this.ViewHTML = `
|
||||
<div draggable="true" id='${properties.title}_window' style='width: ${properties.width}; height: ${properties.height}' class='view-window'>
|
||||
|
||||
<div id='${properties.title}_header' class='view-window-header'>
|
||||
<span style='width: 40px'></span>
|
||||
<p>${properties.title}</p>
|
||||
@ -85,6 +97,8 @@ class ViewWindow {
|
||||
</div>
|
||||
<div id='${properties.title}_content' class='view-window-content'>
|
||||
</div>
|
||||
<div id='${properties.title}_popupDiv'></div>
|
||||
|
||||
</div>
|
||||
`
|
||||
this.ViewSpanInteger = document.createElement("div")
|
||||
@ -103,10 +117,15 @@ class ViewWindow {
|
||||
|
||||
let isDragging = false;
|
||||
let offsetX, offsetY;
|
||||
|
||||
windowDiv.style.zIndex = zIndex + 1
|
||||
|
||||
header.addEventListener('mousedown', (e) => {
|
||||
isDragging = true;
|
||||
|
||||
|
||||
zIndex+=2
|
||||
windowDiv.style.zIndex = zIndex
|
||||
|
||||
|
||||
// Enregistrez la position de la souris par rapport à la fenêtre
|
||||
offsetX = e.clientX - windowDiv.getBoundingClientRect().left;
|
||||
offsetY = e.clientY - windowDiv.getBoundingClientRect().top;
|
||||
@ -145,7 +164,7 @@ class ViewWindow {
|
||||
|
||||
destroy() {
|
||||
const win = getID(`${this.ViewProperties.title}_window`)
|
||||
win.outerHTML = ""
|
||||
win.outerHTML = " "
|
||||
viewsAccessible.delete(this.ViewProperties.title)
|
||||
}
|
||||
|
||||
@ -159,6 +178,66 @@ class ViewWindow {
|
||||
return this.ViewProperties.title
|
||||
}
|
||||
|
||||
|
||||
|
||||
createPopup(properties) {
|
||||
|
||||
this.ViewPopupHTML = `<div id='${properties.title}_popup' class='view-popup'>
|
||||
<div class='view-popup-bar'>
|
||||
<p>${properties.title}</p>
|
||||
<span id='${properties.title}_popupClose' class='btn-cover'><i class='fa fa-xmark'></i></span>
|
||||
</div>
|
||||
${properties.content}
|
||||
</div>`
|
||||
|
||||
const contentDiv = getID(this.ViewProperties.title + "_content")
|
||||
const popupDiv = getID(this.ViewProperties.title + "_popupDiv")
|
||||
this.ViewPopupSpanInteger = document.createElement("div")
|
||||
popupDiv.appendChild(this.ViewPopupSpanInteger);
|
||||
this.ViewPopupSpanInteger.outerHTML = this.ViewPopupHTML
|
||||
|
||||
this.ViewPopupTitle = properties.title
|
||||
|
||||
const popup = getID(properties.title + "_popup")
|
||||
const popupClose = getID(properties.title + "_popupClose")
|
||||
|
||||
popupClose.addEventListener("click", () => {
|
||||
|
||||
this.destroyPopup()
|
||||
|
||||
})
|
||||
|
||||
// Center the popup to the window div
|
||||
|
||||
popup.style.left = (contentDiv.offsetWidth / 2) - (popup.offsetWidth / 2) + "px"
|
||||
popup.style.top = (contentDiv.offsetHeight / 2) - (popup.offsetHeight / 2) + "px"
|
||||
|
||||
// Render parent element styled blur
|
||||
contentDiv.classList.add("blur")
|
||||
|
||||
// Disable all interractions like click and events with contentDiv children
|
||||
|
||||
for(var child of contentDiv.children) {
|
||||
|
||||
child.style.pointerEvents = "none"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
destroyPopup() {
|
||||
|
||||
const contentDiv = getID(this.ViewProperties.title + "_content")
|
||||
for(var child of contentDiv.children) {
|
||||
|
||||
child.style.pointerEvents = "unset"
|
||||
}
|
||||
contentDiv.classList.remove("blur")
|
||||
|
||||
const popup = getID(this.ViewPopupTitle + "_popup")
|
||||
popup.outerHTML = ""
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
createView("files_explorer")
|
||||
@ -211,6 +290,10 @@ class DroppableMenu {
|
||||
this.DMSpanInteger.outerHTML = this.options.join('')
|
||||
|
||||
const menu = getID(`dm-${this.id}`)
|
||||
|
||||
menu.style.zIndex = zIndex + 2
|
||||
zIndex+=1
|
||||
|
||||
|
||||
menu.style.left = (xMousePos - 40) + "px"
|
||||
menu.style.top = (yMousePos - 40) + "px"
|
||||
@ -229,6 +312,17 @@ class DroppableMenu {
|
||||
|
||||
}
|
||||
|
||||
get(action) {
|
||||
|
||||
return getID(this.id + "_" + action)
|
||||
}
|
||||
|
||||
hide() {
|
||||
|
||||
const menu = getID(`dm-${this.id}`)
|
||||
menu.outerHTML = ""
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -20,16 +20,24 @@ function generateFileExplorer() {
|
||||
})
|
||||
}
|
||||
|
||||
function goSharePath() {
|
||||
const rFiles = post("FX_GET", "sharepath")
|
||||
|
||||
rFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
View.setContent(`
|
||||
<div class="fx-window">
|
||||
<div class='fx-bar'>
|
||||
<span id='fx-home' class='btn-cover'><i class='fa fa-home'></i></span>
|
||||
<span id='${View.getViewTitle()}_home' class='btn-cover'><i class='fa fa-home'></i></span>
|
||||
<span id='${View.getViewTitle()}_sharebtn' class='btn-cover'><i class="fa-solid fa-share-from-square"></i></span>
|
||||
<input class='fx-root-input' type="text" id='${View.getViewTitle()}_rootInput'>
|
||||
<div class='fx-bar-actions'>
|
||||
<button class='btn blue'><span><i class='fa fa-folder'></i> Nouv. dossier</span></button>
|
||||
<button class='btn blue'><span><i class="fa-solid fa-file-arrow-up"></i> Upload</span></button>
|
||||
<button id='${View.getViewTitle()}_newFolder' class='btn blue'><span><i class='fa fa-folder'></i> Nouv. dossier</span></button>
|
||||
<button id='${View.getViewTitle()}_newFile' class='btn green'><span><i class="fa-solid fa-file-arrow-up"></i> Nouveau</span></button>
|
||||
</div>
|
||||
</div>
|
||||
<div id='${View.getViewTitle()}_explorer' class='fx-explorer'>
|
||||
@ -40,6 +48,195 @@ function generateFileExplorer() {
|
||||
|
||||
const rootInput = getID(View.getViewTitle() + '_rootInput')
|
||||
const explorer = getID(View.getViewTitle() + '_explorer')
|
||||
const newFolder = getID(View.getViewTitle() + '_newFolder')
|
||||
const newFile = getID(View.getViewTitle() + '_newFile')
|
||||
const home = getID(View.getViewTitle() + '_home')
|
||||
const sharebtn = getID(View.getViewTitle() + '_sharebtn')
|
||||
|
||||
home.addEventListener("click", () => {
|
||||
|
||||
goHomePath()
|
||||
|
||||
})
|
||||
|
||||
sharebtn.addEventListener("click", () => {
|
||||
|
||||
goSharePath()
|
||||
|
||||
})
|
||||
|
||||
newFolder.addEventListener("click", () => {
|
||||
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-folder"></i> Nouveau dossier`,
|
||||
content: `
|
||||
<input type='text' class='field' id='${View.getViewTitle()}_foldername'>
|
||||
<div id='${View.getViewTitle()}_folderInfo'></div>
|
||||
<button class='btn green' id='${View.getViewTitle()}_foldercreate'><span><i class='fa fa-add'></i> Créer</span></button>
|
||||
`})
|
||||
|
||||
const foldername = getID(View.getViewTitle() + "_foldername")
|
||||
const foldercreate = getID(View.getViewTitle() + "_foldercreate")
|
||||
const folderInfo = new InfoPop(View.getViewTitle() + "_folderInfo")
|
||||
|
||||
folderInfo.setSize("13px")
|
||||
|
||||
|
||||
foldercreate.addEventListener("click", () => {
|
||||
folderInfo.clear()
|
||||
if(foldername.value.length < 1) {
|
||||
folderInfo.err("Le nom du dossier est trop court.")
|
||||
return
|
||||
}
|
||||
|
||||
const regex = new RegExp(/^[a-zA-Z0-9-_]+$/)
|
||||
|
||||
if(!regex.test(foldername.value) | foldername.value.replace(/\s/g, '').length < 1) {
|
||||
folderInfo.err("Le nom du dossier est invalide.")
|
||||
return
|
||||
}
|
||||
|
||||
const reqFiles = post("FX_NEW_FOLDER", rootInput.value + "/" + foldername.value)
|
||||
reqFiles.then((result) => {
|
||||
if(result == "OK") {
|
||||
View.destroyPopup(`<i class="fa fa-folder"></i> Nouveau dossier`)
|
||||
const reqFiles = post("FX_GET", rootInput.value)
|
||||
reqFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
} else if(result == "EXIST") {
|
||||
folderInfo.err("Le dossier existe déjà.")
|
||||
} else if(result == "NOT_PERMITTED") {
|
||||
folderInfo.err("Vous n'avez pas les permissions pour créer un dossier ici.")
|
||||
} else {
|
||||
folderInfo.err("Une erreur est survenue.")
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
// Create a new file with a popup wth 2 options, upload or create, if create give a input name or if upload, upload a file
|
||||
|
||||
newFile.addEventListener("click", () => {
|
||||
|
||||
View.createPopup({
|
||||
title: `<i class="fa-solid fa-file-arrow-up"></i> Nouveau fichier`,
|
||||
content: `
|
||||
<input type='text' class='field' id='${View.getViewTitle()}_filename'>
|
||||
<div id='${View.getViewTitle()}_fileInfo'></div>
|
||||
<button class='btn green' id='${View.getViewTitle()}_filecreate'><span><i class='fa fa-add'></i> Créer</span></button>
|
||||
<button class='btn blue' id='${View.getViewTitle()}_fileupload'><span><i class='fa fa-upload'></i> Upload</span></button>
|
||||
`})
|
||||
|
||||
const filename = getID(View.getViewTitle() + "_filename")
|
||||
const filecreate = getID(View.getViewTitle() + "_filecreate")
|
||||
const fileupload = getID(View.getViewTitle() + "_fileupload")
|
||||
const fileInfo = new InfoPop(View.getViewTitle() + "_fileInfo")
|
||||
|
||||
fileInfo.setSize("13px")
|
||||
|
||||
filecreate.addEventListener("click", () => {
|
||||
|
||||
fileInfo.clear()
|
||||
if(filename.value.length < 1) {
|
||||
fileInfo.err("Le nom du fichier est trop court.")
|
||||
return
|
||||
}
|
||||
|
||||
const regex = new RegExp(/^[a-zA-Z0-9-_.]+$/)
|
||||
|
||||
if(!regex.test(filename.value) | filename.value.replace(/\s/g, '').length < 1) {
|
||||
fileInfo.err("Le nom du fichier est invalide.")
|
||||
return
|
||||
}
|
||||
|
||||
const reqFiles = post("FX_NEW_FILE", rootInput.value + "/" + filename.value)
|
||||
reqFiles.then((result) => {
|
||||
if(result == "OK") {
|
||||
View.destroyPopup(`<i class="fa-solid fa-file-arrow-up"></i> Nouveau fichier`)
|
||||
const reqFiles = post("FX_GET", rootInput.value)
|
||||
reqFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
} else if(result == "EXIST") {
|
||||
fileInfo.err("Le fichier existe déjà.")
|
||||
} else if(result == "NOT_PERMITTED") {
|
||||
fileInfo.err("Vous n'avez pas les permissions pour créer un fichier ici.")
|
||||
} else {
|
||||
fileInfo.err("Une erreur est survenue.")
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
|
||||
fileupload.addEventListener("click", () => {
|
||||
|
||||
fileInfo.clear()
|
||||
View.destroyPopup(`<i class="fa-solid fa-file-arrow-up"></i> Nouveau fichier`)
|
||||
View.createPopup({
|
||||
title: `<i class="fa-solid fa-file-arrow-up"></i> Upload`,
|
||||
content: `
|
||||
<input type='file' class='field' id='${View.getViewTitle()}_fileuploadInput'>
|
||||
<div id='${View.getViewTitle()}_fileuploadInfo'></div>
|
||||
<button class='btn green' id='${View.getViewTitle()}_fileuploadBtn'><span><i class='fa fa-upload'></i> Upload</span></button>
|
||||
`})
|
||||
|
||||
const fileuploadInput = getID(View.getViewTitle() + "_fileuploadInput")
|
||||
const fileuploadBtn = getID(View.getViewTitle() + "_fileuploadBtn")
|
||||
const fileuploadInfo = new InfoPop(View.getViewTitle() + "_fileuploadInfo")
|
||||
|
||||
fileuploadBtn.addEventListener("click", () => {
|
||||
|
||||
fileuploadInfo.clear()
|
||||
if(fileuploadInput.files.length < 1) {
|
||||
fileuploadInfo.err("Aucun fichier sélectionné.")
|
||||
return
|
||||
}
|
||||
|
||||
const file = fileuploadInput.files[0]
|
||||
|
||||
const reqFiles = post("FX_UPLOAD", {name: file.name ,root: rootInput.value, file: file})
|
||||
|
||||
reqFiles.then((result) => {
|
||||
|
||||
if(result == "OK") {
|
||||
View.destroyPopup(`<i class="fa-solid fa-file-arrow-up"></i> Upload`)
|
||||
const reqFiles = post("FX_GET", rootInput.value)
|
||||
reqFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
}
|
||||
if(result == "EXIST") {
|
||||
fileuploadInfo.err("Le fichier existe déjà.")
|
||||
}
|
||||
if(result == "NOT_PERMITTED") {
|
||||
fileuploadInfo.err("Vous n'avez pas les permissions pour uploader un fichier ici.")
|
||||
}
|
||||
if(result == "NOT_FILE") {
|
||||
fileuploadInfo.err("Le fichier n'est pas valide.")
|
||||
}
|
||||
if(result == "NOT_EXIST") {
|
||||
fileuploadInfo.err("Le fichier n'existe pas.")
|
||||
}
|
||||
if(result == "TOO_BIG") {
|
||||
fileuploadInfo.err("Le fichier est trop volumineux.")
|
||||
}
|
||||
if(result == "ERROR") {
|
||||
fileuploadInfo.err("Une erreur est survenue.")
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
|
||||
rootInput.addEventListener("change", () => {
|
||||
|
||||
@ -64,20 +261,21 @@ function generateFileExplorer() {
|
||||
explorer.innerHTML = "<p class='yellow' style='text-align: center;'><i class='fa fa-warning'></i> Ce dossier n'existe pas.</p>"
|
||||
} else {
|
||||
|
||||
fileElements.unshift(`<div id='fx-parent' class='fx-element'><p><i class="fa-solid fa-rotate-left"></i> Revenir au dossier parent </p></div>`)
|
||||
|
||||
for(const file of files.content) {
|
||||
|
||||
// Convert all file.size to a human readable format with units
|
||||
|
||||
file.size = bytesToSize(file.size)
|
||||
|
||||
//Tell if the file is a directory or not
|
||||
|
||||
if(file.directory) {
|
||||
file.size = "Dossier"
|
||||
|
||||
} else {
|
||||
console.log('------------')
|
||||
console.log(file.size)
|
||||
console.log(bytesToSize(file.size))
|
||||
console.log('------------')
|
||||
file.size = bytesToSize(file.size)
|
||||
}
|
||||
|
||||
fileElements.push(`<div id='${file.id}' oncontextmenu='createFileMenu("${file.id}")' class='fx-element'>
|
||||
fileElements.push(`<div id='${file.id}' class='fx-element'>
|
||||
<div>
|
||||
${getIcon(file)}
|
||||
<p>${file.name}</p>
|
||||
@ -85,23 +283,32 @@ function generateFileExplorer() {
|
||||
<p>Taille : ${file.size}</p>
|
||||
<p>Date de modification : ${getFormattedDate(file.lastedition)}</p>
|
||||
</div>`)
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Sort the files by directory and then by name
|
||||
|
||||
fileElements.sort((a, b) => {
|
||||
if(a.includes("Dossier") && !b.includes("Dossier")) {
|
||||
return -1
|
||||
} else if(!a.includes("Dossier") && b.includes("Dossier")) {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
fileElements.unshift(`<div id='fx-parent' class='fx-element'><p><i class="fa-solid fa-rotate-left"></i> Revenir au dossier parent </p></div>`)
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
explorer.innerHTML = fileElements.join("")
|
||||
|
||||
const parent = document.getElementById("fx-parent")
|
||||
const home = document.getElementById("fx-home")
|
||||
|
||||
home.addEventListener("click", () => {
|
||||
|
||||
goHomePath()
|
||||
|
||||
})
|
||||
|
||||
|
||||
parent.addEventListener("click", () => {
|
||||
|
||||
const reqFiles = post("FX_GET", files.parent)
|
||||
@ -116,10 +323,17 @@ function generateFileExplorer() {
|
||||
// If it's a directory, get the file directory and make the request to get the files in it and loadIt
|
||||
|
||||
for(const file of files.content) {
|
||||
|
||||
const dropMenu = new DroppableMenu({
|
||||
"id": file.id
|
||||
})
|
||||
|
||||
|
||||
const element = document.getElementById(file.id)
|
||||
|
||||
if(file.directory) {
|
||||
|
||||
const element = document.getElementById(file.id)
|
||||
|
||||
element.addEventListener("click", () => {
|
||||
|
||||
const reqFiles = post("FX_GET", file.fileDirectory)
|
||||
@ -127,9 +341,260 @@ function generateFileExplorer() {
|
||||
loadFiles(result)
|
||||
})
|
||||
})
|
||||
} else {
|
||||
|
||||
element.addEventListener("dblclick", () => {
|
||||
editFile()
|
||||
})
|
||||
|
||||
dropMenu.add("edit", "<i class='fa-solid fa-pen'></i> Editer")
|
||||
dropMenu.add("share", "<i class='fa fa-share'></i> Partager")
|
||||
dropMenu.add("download", "<i class='fa fa-download'></i> Télécharger")
|
||||
}
|
||||
|
||||
}
|
||||
dropMenu.add("rename", "<i class='fa-solid fa-file-signature'></i> Renommer")
|
||||
|
||||
dropMenu.add("delete", "<i class='fa fa-trash'></i> Supprimer")
|
||||
|
||||
|
||||
getID(file.id).addEventListener("contextmenu", () => {
|
||||
dropMenu.show()
|
||||
dropMenu.get("delete").addEventListener("click", () => {
|
||||
dropMenu.hide()
|
||||
const reqFiles = post("FX_DELETE", file.fileDirectory)
|
||||
reqFiles.then((result) => {
|
||||
if(result == "OK") {
|
||||
const reqFiles = post("FX_GET", files.root)
|
||||
reqFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
} else if(result == "NOT_PERMITTED") {
|
||||
const reqFiles = post("FX_GET", files.root)
|
||||
reqFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-warning"></i> Erreur`,
|
||||
content: `<p class='yellow'>Vous n'avez pas les permissions pour supprimer ce fichier.</p>`
|
||||
})
|
||||
} else {
|
||||
const reqFiles = post("FX_GET", files.root)
|
||||
reqFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-warning"></i> Erreur`,
|
||||
content: `<p class='yellow'>Une erreur est survenue.</p>`
|
||||
})
|
||||
|
||||
}
|
||||
})
|
||||
})
|
||||
dropMenu.get("rename").addEventListener("click", () => {
|
||||
|
||||
dropMenu.hide()
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-file-signature"></i> Renommer`,
|
||||
content: `
|
||||
<input type='text' class='field' id='${View.getViewTitle()}_rename'>
|
||||
<div id='${View.getViewTitle()}_renameInfo'></div>
|
||||
<button class='btn green' id='${View.getViewTitle()}_renameBtn'><span><i class='fa fa-pen'></i> Renommer</span></button>
|
||||
`})
|
||||
|
||||
const rename = getID(View.getViewTitle() + "_rename")
|
||||
const renameBtn = getID(View.getViewTitle() + "_renameBtn")
|
||||
const renameInfo = new InfoPop(View.getViewTitle() + "_renameInfo")
|
||||
renameInfo.setSize("13px")
|
||||
rename.value = file.name
|
||||
rename.focus()
|
||||
rename.select()
|
||||
|
||||
renameBtn.addEventListener("click", () => {
|
||||
renameInfo.clear()
|
||||
if(rename.value.length < 1) {
|
||||
renameInfo.err("Le nom du fichier / dossier est trop court.")
|
||||
return
|
||||
}
|
||||
|
||||
const regex = new RegExp(/^[a-zA-Z0-9-_]+$/)
|
||||
|
||||
if(!regex.test(rename.value) | rename.value.replace(/\s/g, '').length < 1) {
|
||||
renameInfo.err("Le nom du fichier / dossier est invalide.")
|
||||
return
|
||||
}
|
||||
|
||||
const reqFiles = post("FX_RENAME", {root: files.root, oldName: file.name, newName: rename.value})
|
||||
reqFiles.then((result) => {
|
||||
if(result == "OK") {
|
||||
View.destroyPopup(`<i class="fa fa-file-signature"></i> Renommer`)
|
||||
const reqFiles = post("FX_GET", files.root)
|
||||
reqFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
} else if(result == "EXIST") {
|
||||
renameInfo.err("Le fichier / dossier existe déjà.")
|
||||
} else if(result == "NOT_PERMITTED") {
|
||||
renameInfo.err("Vous n'avez pas les permissions pour renommer ce fichier / dossier.")
|
||||
} else {
|
||||
renameInfo.err("Une erreur est survenue.")
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
if(!file.directory) {
|
||||
dropMenu.get("share").addEventListener("click", () => {
|
||||
dropMenu.hide()
|
||||
const reqFiles = post("FX_SHARE", {root: files.root, name: file.name})
|
||||
reqFiles.then((result) => {
|
||||
if(result == "NOT_PERMITTED") {
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-warning"></i> Erreur`,
|
||||
content: `<p class='yellow'>Vous n'avez pas les permissions pour partager ce fichier.</p>`
|
||||
})
|
||||
} else {
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-share"></i> Partager`,
|
||||
content: `
|
||||
<input style='width: 300px' type='text' class='field' id='${View.getViewTitle()}_sharelink'>
|
||||
<div id='${View.getViewTitle()}_shareInfo'></div>
|
||||
<button class='btn green' id='${View.getViewTitle()}_shareBtn'><span><i class='fa fa-share'></i> Copier</span></button>
|
||||
`})
|
||||
|
||||
const sharelink = getID(View.getViewTitle() + "_sharelink")
|
||||
const shareBtn = getID(View.getViewTitle() + "_shareBtn")
|
||||
const shareInfo = new InfoPop(View.getViewTitle() + "_shareInfo")
|
||||
shareInfo.setSize("13px")
|
||||
sharelink.value = result
|
||||
sharelink.focus()
|
||||
sharelink.select()
|
||||
|
||||
shareBtn.addEventListener("click", () => {
|
||||
sharelink.focus()
|
||||
sharelink.select()
|
||||
window.navigator.clipboard.writeText(sharelink.value)
|
||||
shareInfo.ok("Copié !")
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
// Edit file with an ViewWindow with 2 options close & save and the name of the window is like File - Editor
|
||||
|
||||
dropMenu.get("edit").addEventListener("click", () => {
|
||||
dropMenu.hide()
|
||||
|
||||
editFile()
|
||||
|
||||
})
|
||||
|
||||
dropMenu.get("download").addEventListener("click", () => {
|
||||
dropMenu.hide()
|
||||
const reqFiles = post("FX_GETFILE", file.fileDirectory)
|
||||
reqFiles.then((result) => {
|
||||
if(result == "NOT_PERMITTED") {
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-warning"></i> Erreur`,
|
||||
content: `<p class='yellow'>Vous n'avez pas les permissions pour télécharger ce fichier.</p>`
|
||||
})
|
||||
} else {
|
||||
// Make Download using result
|
||||
const element = document.createElement('a');
|
||||
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result));
|
||||
element.setAttribute('download', file.name);
|
||||
element.style.display = 'none';
|
||||
document.body.appendChild(element);
|
||||
element.click();
|
||||
document.body.removeChild(element);
|
||||
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function editFile() {
|
||||
const reqFiles = post("FX_GETFILE", file.fileDirectory)
|
||||
reqFiles.then((result) => {
|
||||
if(result == "NOT_PERMITTED") {
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-warning"></i> Erreur`,
|
||||
content: `<p class='yellow'>Vous n'avez pas les permissions pour éditer ce fichier.</p>`
|
||||
})
|
||||
} else {
|
||||
const editor = new ViewWindow({
|
||||
title: `<i class="fa-solid fa-file-pen"></i> Editeur - ${file.fileDirectory}`,
|
||||
width: "1000px",
|
||||
height: "600px"
|
||||
})
|
||||
|
||||
editor.setContent(`
|
||||
|
||||
<div class='fx-bar'>
|
||||
<span id='${editor.getViewTitle()}_save' class='btn-cover'><i class='fa fa-save'></i></span>
|
||||
</div>
|
||||
<textarea id='${editor.getViewTitle()}_editorContent' class='fx-editor-content'>${result}</textarea>
|
||||
|
||||
|
||||
`)
|
||||
|
||||
|
||||
const editorSave = getID(editor.getViewTitle() + "_save")
|
||||
const editorContent = getID(editor.getViewTitle() + "_editorContent")
|
||||
|
||||
// Sauvegarder le fichier en l'envoyant
|
||||
|
||||
editorSave.addEventListener("click", () => {
|
||||
|
||||
const reqFiles = post("FX_SAVEFILE", {root: files.root, name: file.name, content: editorContent.value})
|
||||
reqFiles.then((result) => {
|
||||
if(result == "OK") {
|
||||
editor.destroy()
|
||||
const reqFiles = post("FX_GET", files.root)
|
||||
reqFiles.then((result) => {
|
||||
loadFiles(result)
|
||||
})
|
||||
} else if(result == "NOT_PERMITTED") {
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-warning"></i> Erreur`,
|
||||
content: `<p class='yellow'>Vous n'avez pas les permissions pour éditer ce fichier.</p>`
|
||||
})
|
||||
} else {
|
||||
View.createPopup({
|
||||
title: `<i class="fa fa-warning"></i> Erreur`,
|
||||
content: `<p class='yellow'>Une erreur est survenue.</p>`
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
|
||||
//forbid textarea resize
|
||||
editorContent.style.resize = "none"
|
||||
|
||||
|
||||
editorClose.addEventListener("click", () => {
|
||||
|
||||
editor.destroy()
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -140,19 +605,6 @@ function generateFileExplorer() {
|
||||
|
||||
}
|
||||
|
||||
function createFileMenu(idCreated) {
|
||||
|
||||
const dropMenu = new DroppableMenu({
|
||||
"id": idCreated
|
||||
})
|
||||
|
||||
dropMenu.add("rename", "<i class='fa-solid fa-file-signature'></i> Renommer")
|
||||
dropMenu.add("share", "<i class='fa fa-share'></i> Partager")
|
||||
dropMenu.add("delete", "<i class='fa fa-trash'></i> Supprimer")
|
||||
|
||||
|
||||
dropMenu.show()
|
||||
}
|
||||
|
||||
function getIcon(file) {
|
||||
if(file.type == "application/json") {
|
||||
@ -188,7 +640,7 @@ function getIcon(file) {
|
||||
}
|
||||
if(file.type == "application/javascript") {
|
||||
|
||||
return '<i style="color:rgb(179, 141, 4);" class="fa-brands fa-js">'
|
||||
return '<i style="color:rgb(179, 141, 4);" class="fa-brands fa-js"></i>'
|
||||
}
|
||||
if(file.type == "image/png" | file.type == "image/jpeg") {
|
||||
|
||||
|
Reference in New Issue
Block a user