document.addEventListener("contextmenu", (e) => { e.preventDefault() }) explorer.createWindow(() => { var inCopyOrCut = null; const View = new ViewWindow({ title: ` Gestionnaire de fichiers`, width: "1000px", height: "600px" }) console.log("") goHomePath() function goHomePath() { const rFiles = post("FX_GET", "homepath") rFiles.then((result) => { loadFiles(result) }) } function goSharePath() { const rFiles = post("FX_GET", "sharepath") rFiles.then((result) => { loadFiles(result) }) } View.setContent(`
`) 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') View.ViewWindowDiv.addEventListener("contextmenu", () => { if(inCopyOrCut != null) { const dMenu = new DroppableMenu() dMenu.add("paste", " Coller") dMenu.show() dMenu.get("paste").addEventListener("click", () => { console.log({newPath: rootInput.value, action: inCopyOrCut.action, file: inCopyOrCut.file, name: inCopyOrCut.file.name, orginalPath: inCopyOrCut.orginalPath}) dMenu.hide() const reqFiles = post("FX_PASTE", {newPath: rootInput.value, action: inCopyOrCut.action, file: inCopyOrCut.file, name: inCopyOrCut.file.name, orginalPath: inCopyOrCut.orginalPath}) reqFiles.then((result) => { if(result == "OK") { const reqFiles = post("FX_GET", rootInput.value) reqFiles.then((result) => { loadFiles(result) }) } else if(result == "NOT_PERMITTED") { const reqFiles = post("FX_GET", rootInput.value) reqFiles.then((result) => { loadFiles(result) }) View.createPopup({ title: ` Erreur`, content: `

Vous n'avez pas les permissions pour coller ce fichier.

` }) } else { const reqFiles = post("FX_GET", rootInput.value) reqFiles.then((result) => { loadFiles(result) }) View.createPopup({ title: ` Erreur`, content: `

Une erreur est survenue.

` }) } }) inCopyOrCut = null }) } else { console.log("LISTENER : " + rootInput.value) } }) home.addEventListener("click", () => { goHomePath() }) sharebtn.addEventListener("click", () => { goSharePath() }) newFolder.addEventListener("click", () => { View.createPopup({ title: ` Nouveau dossier`, content: `
`}) const foldername = getID(View.getViewTitle() + "_foldername") const foldercreate = getID(View.getViewTitle() + "_foldercreate") const folderInfo = new TextResponse(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(` 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: ` Nouveau fichier`, content: `
`}) const filename = getID(View.getViewTitle() + "_filename") const filecreate = getID(View.getViewTitle() + "_filecreate") const fileupload = getID(View.getViewTitle() + "_fileupload") const fileInfo = new TextResponse(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(` 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(` Nouveau fichier`) View.createPopup({ title: ` Upload`, content: `
`}) const fileuploadInput = getID(View.getViewTitle() + "_fileuploadInput") const fileuploadBtn = getID(View.getViewTitle() + "_fileuploadBtn") const fileuploadInfo = new TextResponse(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(` 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", () => { const reqFiles = post("FX_GET", rootInput.value) reqFiles.then((result) => { loadFiles(result) }) }) function loadFiles(files) { rootInput.value = files.root var fileElements = new Array() if(files.content == "NOT_PERMITTED") { fileElements.unshift(`

Revenir au dossier parent

`) fileElements.push("

Vous n'avez pas les permissions pour accéder à ce dossier.

") } else if(files.content == "NOT_EXIST") { fileElements.unshift(`

Revenir au dossier parent

`) explorer.innerHTML = "

Ce dossier n'existe pas.

" } else { for(const file of files.content) { 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(`
${getIcon(file)}

${file.name}

Taille : ${file.size}

Date de modification : ${getFormattedDate(file.lastedition)}

`) } // 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(`

Revenir au dossier parent

`) } explorer.innerHTML = fileElements.join("") const parent = document.getElementById("fx-parent") parent.addEventListener("click", () => { const reqFiles = post("FX_GET", files.parent) reqFiles.then((result) => { loadFiles(result) }) }) if(files.content != "NOT_PERMITTED" && files.content != "NOT_EXIST") { // 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 element = document.getElementById(file.id) if(file.directory) { element.addEventListener("click", () => { const reqFiles = post("FX_GET", file.fileDirectory) reqFiles.then((result) => { loadFiles(result) }) }) } else { element.addEventListener("dblclick", () => { editFile() }) } getID(file.id).addEventListener("contextmenu", () => { const dropMenu = new DroppableMenu() dropMenu.add("copy", " Copier") dropMenu.add("cut", " Couper") dropMenu.add("rename", " Renommer") dropMenu.add("delete", " Supprimer") if(!file.directory) { dropMenu.add("edit", " Editer") dropMenu.add("share", " Partager") dropMenu.add("download", " Télécharger") } dropMenu.show() dropMenu.get("copy").addEventListener("click", () => { dropMenu.hide() inCopyOrCut = {"action": "copy", "file": file, "orginalPath": files.root} }) dropMenu.get("cut").addEventListener("click", () => { dropMenu.hide() inCopyOrCut = {"action": "cut", "file": file, "orginalPath": files.root} }) 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: ` Erreur`, content: `

Vous n'avez pas les permissions pour supprimer ce fichier.

` }) } else { const reqFiles = post("FX_GET", files.root) reqFiles.then((result) => { loadFiles(result) }) View.createPopup({ title: ` Erreur`, content: `

Une erreur est survenue.

` }) } }) }) dropMenu.get("rename").addEventListener("click", () => { dropMenu.hide() View.createPopup({ title: ` Renommer`, content: `
`}) const rename = getID(View.getViewTitle() + "_rename") const renameBtn = getID(View.getViewTitle() + "_renameBtn") const renameInfo = new TextResponse(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(` 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: ` Erreur`, content: `

Vous n'avez pas les permissions pour partager ce fichier.

` }) } else { View.createPopup({ title: ` Partager`, content: `
`}) const sharelink = getID(View.getViewTitle() + "_sharelink") const shareBtn = getID(View.getViewTitle() + "_shareBtn") const shareInfo = new TextResponse(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: ` Erreur`, content: `

Vous n'avez pas les permissions pour télécharger ce fichier.

` }) } 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: ` Erreur`, content: `

Vous n'avez pas les permissions pour éditer ce fichier.

` }) } else { const editor = new ViewWindow({ title: ` Editeur - ${file.fileDirectory}`, width: "1000px", height: "600px" }) editor.setContent(`
`) 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") { editor.createPopup({ title: ` Erreur`, content: `

Vous n'avez pas les permissions pour éditer ce fichier.

` }) } else { editor.createPopup({ title: ` Erreur`, content: `

Une erreur est survenue.

` }) } }) }) //forbid textarea resize editorContent.style.resize = "none" } }) } } } } }) function getIcon(file) { if(file.type == "application/json") { return '' } if(file.type == "application/msword" | file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document") { return '' } if(file.type == "application/vnd.ms-powerpoint") { return '' } if(file.type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | file.type == "application/vnd.ms-excel") { return '' } if(file.type == "application/java-archive") { return '' } if(file.type == "application/x-sh") { return '' } if(file.type == "application/x-msdos-program" | file.type == "application/x-msdownload") { return'' } if(file.type == "application/javascript") { return '' } if(file.type == "image/png" | file.type == "image/jpeg") { return '' } if(file.type == "text/html") { return '' } if(file.type == "text/css") { return '' } if(file.type == "application/zip") { return '' } if(file.type == "audio/mpeg") { return '' } if(file.type == "application/pdf") { return '' } if(file.directory) { return '' } else { return '' } } function bytesToSize(bytes) { var sizes = ['o', 'Ko', 'Mo', 'Go', 'To']; if (bytes == 0) return '0 o'; var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]; }