diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 46e02398..6ef6c961 --- a/README.md +++ b/README.md @@ -1,60 +1,90 @@ -`#html` `#css` `#js` `#php` `#master-in-software-development` +# PHP Local FileSystem explorer :technologist: -# PHP Local FileSystem explorer +In this project we have created a system file explorer that allows the user to navigate, create directories and upload files in the same way as he would in his usual operating system. -

- Version -

+The file explorer is a tool that allows you to directly view and manipulate the files and directories associated with a path, so we must take into account from which path the user starts and which path they can access. ->In this project you will have to create a system file explorer that allows the user to navigate, create directories and upload files in the same way as he would in his usual operating system. +## Technologies used ->The file explorer is a tool that allows you to directly view and manipulate the files and directories associated with a path, so you must take into account from which path the user starts and which path they can access. +**For development** +- HTML +- CSS +- JS +- PHP -## Index +**For design and planning** +- [Figma](https://www.figma.com/); -- [Requirements](#requirements) -- [Repository](#repository) -- [Technologies used](#technologies-used) -- [Project delivery](#project-delivery) -- [Resources](#resources) +## Before start -## Requirements +Before start this project we have created: -- You cannot use file third-party libraries -- You will not be able to use global variables in PHP. -- You must use GIT -- You must use the PHP > v8 -- Create a clear and orderly directory structure -- Both the code and the comments must be written in English -- Use the camelCase code style to define variables and functions -- In the case of using HTML, never use inline styles -- In the case of using different programming languages ​​always define the implementation in separate terms -- Remember that it is important to divide the tasks into several sub-tasks so that in this way you can associate each particular step of the construction with a specific commit -- You should try as much as possible that the commits and the planned tasks are the same -Delete files that are not used or are not necessary to evaluate the project +### **Wireframes of our files explorer** -## Repository +_Wireframe_ -First of all you must fork this project into your GitHub account. +Captura de pantalla 2023-01-17 a las 16 24 28 -To create a fork on GitHub is as easy as clicking the “fork” button on the repository page. +_Final Page_ -Fork on GitHub +Captura de pantalla 2023-01-17 a las 23 12 05 -## Technologies used +_Final Page with opened folder_ + +Captura de pantalla 2023-01-17 a las 23 30 34 + + +> **Comparison of the original design (Wireframe) with the final result of the project** + +As you can see, during the work we have modificated the page for better UX and UI design: + +- Added buton "Sing out" if the user want close the session, +- Added folder "Trash" if the user want to restore deleted file in the future, +- The content of the file now we can see in pop-up after "click" at the file(in the wireframe if was situated at rhe right part of display), +- We will be relocated to editor-page if we want to edit file in text format (.txt), +- We will be relocated to search-page if we want to find any file r folder (enter the "first enter" in "search) + + +### **Use case diagram** + +Captura de pantalla 2023-01-17 a las 22 39 33 + +> **Comparison of the use case diagram with the actions that the user can finally perform**: + +- Log in - yes, Sign up - no; +- If you want Upload file, first you need to choose folder and just then a file; +- Added options: edit text file, relocate files between folders, create subfolders + + + +## Organization and distribution of the tasks + +Sush as [**Valentino Traverso**](https://github.com/valentraverso) has more expirience in PHP, he has taken the leading role in this project. + +_The biggest part_ of the time we have used **peer coding** to see together how work diferent PHP methods and share experience: +- Interfaces for Log in/Sign out, General Files Explorer page, Edit .txt document; + +Then, we shared tasks: +[**Valentino Traverso**](https://github.com/valentraverso): created functions to search files and folders in subfolders; +[**Iuliia Shikhanova**](https://github.com/IuliiaNova): created functions to move files between folders + + +## Sources of information :bulb: + +PHP official [website](https://www.php.net/) -\* HTML -\* CSS +## Goals of the project -\* JS +- Understand how works PHP in the real project, +- Using of fetch to pass dates from PHP to JS, +- Improve our knowledges in logic and programming, +- Understand what is a file system and how it works, -\* PHP -## Resources +## Authors :pencil2: -- [File system](https://es.wikipedia.org/wiki/Administrador_de_archivos) -- [PHP FileSystem W3C](https://www.w3schools.com/php/php_ref_filesystem.asp) -- [PHP FileSystem Oficial](https://www.php.net/manual/es/book.filesystem.php) -- [README Guidelines Example](https://gist.github.com/PurpleBooth/109311bb0361f32d87a2) +This project was made for [Assembler Institute of Technology](https://assemblerinstitute.com/) by: +[**Valentino Traverso**](https://github.com/valentraverso) and +[**Iuliia Shikhanova**](https://github.com/IuliiaNova) diff --git a/assets/add-trash.php b/assets/add-trash.php new file mode 100755 index 00000000..978a19d8 --- /dev/null +++ b/assets/add-trash.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/assets/close-session.php b/assets/close-session.php new file mode 100755 index 00000000..5ce04519 --- /dev/null +++ b/assets/close-session.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/assets/delete-file.php b/assets/delete-file.php new file mode 100755 index 00000000..519fe6c3 --- /dev/null +++ b/assets/delete-file.php @@ -0,0 +1,7 @@ + diff --git a/assets/delete-folder.php b/assets/delete-folder.php new file mode 100755 index 00000000..142279f8 --- /dev/null +++ b/assets/delete-folder.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/assets/display-content.php b/assets/display-content.php new file mode 100755 index 00000000..1e1880c4 --- /dev/null +++ b/assets/display-content.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/assets/display-folders.php b/assets/display-folders.php new file mode 100755 index 00000000..f21316bd --- /dev/null +++ b/assets/display-folders.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/assets/display-metadata-file.php b/assets/display-metadata-file.php new file mode 100755 index 00000000..8f74daa5 --- /dev/null +++ b/assets/display-metadata-file.php @@ -0,0 +1,16 @@ + $creationDate, "modify"=> $lastModification, "size"=> $size); + + + +echo json_encode($information); + + +?> \ No newline at end of file diff --git a/assets/documentation/Diagram - Diagram copia.pdf b/assets/documentation/Diagram - Diagram copia.pdf new file mode 100644 index 00000000..64bc3f6a Binary files /dev/null and b/assets/documentation/Diagram - Diagram copia.pdf differ diff --git a/assets/documentation/Diagram - Diagram.pdf b/assets/documentation/Diagram - Diagram.pdf new file mode 100644 index 00000000..64bc3f6a Binary files /dev/null and b/assets/documentation/Diagram - Diagram.pdf differ diff --git a/assets/documentation/Resords problems && Lessons.pdf b/assets/documentation/Resords problems && Lessons.pdf new file mode 100644 index 00000000..6424c8c7 Binary files /dev/null and b/assets/documentation/Resords problems && Lessons.pdf differ diff --git a/assets/edit-text.php b/assets/edit-text.php new file mode 100755 index 00000000..848e491b --- /dev/null +++ b/assets/edit-text.php @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/assets/js/app.js b/assets/js/app.js new file mode 100755 index 00000000..46178b40 --- /dev/null +++ b/assets/js/app.js @@ -0,0 +1,777 @@ +const divFolders = document.getElementById('folder'); +const btnCreateFolder = document.querySelector("#create-new-folder"); +const divFiles = document.getElementById('files'); +const btnDeleteFile = document.querySelector("#delete-file"); +let btnRelocateFile = document.querySelector("#relocate-file"); +let btnOpenTrash = document.querySelector("#trash-folder"); +const btnClosePopUp = document.getElementById("close-popup"); + +// Display Folders Left Side +function getInfoFolders() { + while (divFolders.firstChild) { + divFolders.removeChild(divFolders.lastChild); + } + + while (divFiles.firstChild) { + divFiles.removeChild(divFiles.lastChild); + } + + fetch('../assets/display-folders.php') + .then(response => response.json()) + .then(data => displayFolderIndex(data)); + + let h1Files = document.createElement('h1'); + h1Files.textContent = 'Welcome! Please choose a folder😁🖼️'; + h1Files.id = 'choose-folder-h1'; + + divFiles.prepend(h1Files); +} + +function resetMainFolderTab(){ + while (divFolders.firstChild) { + divFolders.removeChild(divFolders.lastChild); + } + + fetch('../assets/display-folders.php') + .then(response => response.json()) + .then(data => displayFolderIndex(data)); +} +function displayFolderIndex(data) { + foldersArray = data; + + foldersArray.forEach(folder => { + let elLi = document.createElement('li'); + + let elDiv = document.createElement('div'); + let elImgFolder = document.createElement('img'); + + let divBtns = document.createElement('div'); + + let spanEdit = document.createElement('span'); + let iEdit = document.createElement('i'); + + let spanDelete = document.createElement('span'); + let iDelete = document.createElement('i'); + + elDiv.className = 'select-folder'; + elDiv.setAttribute('name-folder', folder); + elDiv.textContent = folder; + elImgFolder.src = '../image/folder.ico'; + elImgFolder.className = 'imageFolder'; + elImgFolder.alt = 'image Folder'; + + spanEdit.className = 'modify-name-folder'; + spanEdit.setAttribute('actual-folder', folder); + iEdit.className = 'fa-solid fa-pen'; + + spanDelete.className = 'delete-folder'; + iDelete.className = 'fa-solid fa-trash'; + iDelete.id = 'delete-folder'; + spanDelete.setAttribute('filePath', folder); + + divFolders.prepend(elLi); + + elLi.appendChild(elDiv); + elDiv.prepend(elImgFolder); + + elLi.appendChild(divBtns); + + divBtns.appendChild(spanEdit); + spanEdit.appendChild(iEdit); + + divBtns.appendChild(spanDelete); + spanDelete.appendChild(iDelete); + }) + + const modifyNameFolder = document.querySelectorAll(".modify-name-folder"); + const selectFolder = document.querySelectorAll(".select-folder"); + const deleteFolder = document.querySelectorAll(".delete-folder"); + + modifyNameFolder.forEach((item) => { + item.addEventListener("click", modifyNameFolders) + }); + + + deleteFolder.forEach((item) => { + item.addEventListener("click", deleteFolders) + }); + + selectFolder.forEach((item) => { + item.addEventListener("click", selectFolders) + }); +} + +// Option Folders + +function createNewFolder(pathNewFolder) { + let newName = prompt(`Assign a name to the new folder.`); + + if (newName !== 'null' && typeof newName !== 'object') { + if (typeof pathNewFolder !== 'object') { + newName = pathNewFolder + "/" + newName; + } + + fetch("../assets/create-folder.php?nameFolder=" + newName) + .then(response => response.json(), + reject => alert('There was an error, we couldnt create the folder!')) + .then(info => { + if (info.exists) { + alert(info.msg); + } else { + if (typeof pathNewFolder !== 'object') { + createFilesTab(pathNewFolder); + } else { + getInfoFolders(); + } + } + }); + } +} + +function modifyNameFolders(event) { + let actualFolderName = event.currentTarget.getAttribute('actual-folder'); + let newName = prompt(`Put new folder name for "${actualFolderName}", please/`); + + if (newName) { + fetch("../assets/modify-folder.php?nameFolder=" + newName + "&actualFolderName=" + actualFolderName) + .then(response => { + if (response.status === 200) { + getInfoFolders(); + } else { + alert('There was an error, we couldnt change the name of the folder!'); + } + }) + } +} + +function deleteFolders(event) { + let actualFolderName = event.currentTarget.getAttribute('filePath'); + + let popUpDeleteConfirm; + if (actualFolderName.includes('Trash/') === true) { + popUpDeleteConfirm = confirm("This folder will delete permanently, are you sure to delete it?"); + } else { + popUpDeleteConfirm = confirm(`Do you want delete "${actualFolderName}" folder?`); + } + + if (popUpDeleteConfirm) { + if (actualFolderName.includes('Trash/') === true) { + deleteFolderTrash(actualFolderName); + createFilesTab('Trash'); + }else if(actualFolderName.includes('/') === true){ + atrBasura = '../root/' + actualFolderName; + addTrash(atrBasura); + }else{ + atrBasura = '../root/' + actualFolderName; + addTrash(atrBasura); + resetMainFolderTab(); + } + } +} + +function moveFolders(folderPath) { + fetch('../assets/display-content.php?actualFolderName=') + .then(response => response.json()) + .then(data => listFoldersPopUp(data)); +} + +function listFoldersPopUp(data) { + hideOptionPopUp('both'); + + const divViewContent = document.querySelector('#view-content'); + const filePopUp = document.querySelector('#file-show-popup'); + + filePopUp.style.display = 'none'; + + let divPopUpMove = document.createElement('div'); + divPopUpMove.className = 'move-btwn-folders'; + + let spanMoveTo = document.createElement('h2'); + spanMoveTo.textContent = 'Move To'; + + divViewContent.prepend(divPopUpMove); + divPopUpMove.prepend(spanMoveTo); + + data.forEach(folder => { + let indexSlashPath = folder.lastIndexOf('/'); + let pathFolderNoSlash = folder.slice(indexSlashPath + 1); + + if (!pathFolderNoSlash.includes('.')) { + let divFolder = document.createElement('div'); + divFolder.className = 'inside-btwn'; + + let spanFolder = document.createElement('span'); + spanFolder.textContent = pathFolderNoSlash; + spanFolder.id = 'span-folder-move'; + spanFolder.setAttribute('file-path', pathFolderNoSlash) + + divPopUpMove.appendChild(divFolder); + divFolder.prepend(spanFolder); + + showFolderInsideMove(pathFolderNoSlash, divFolder); + + spanFolder.addEventListener('click', relocateFileTo); + } + }) +} + +function showFolderInsideMove(folderPath, divFolder, i) { + fetch('../assets/display-content.php?actualFolderName=' + folderPath) + .then(response => response.json()) + .then(data => { + data.forEach(folder => { + let folderNoRoot = folder.slice(8); + + let folderNameSlash = folder.lastIndexOf('/'); + let folderName = folder.slice(folderNameSlash + 1); + + if (!folderNoRoot.includes('.')) { + let insideDiv = document.createElement('div'); + insideDiv.className = 'inside-div-move'; + + let spanInside = document.createElement('span'); + spanInside.textContent = folderName; + spanInside.setAttribute('file-path', folderNoRoot); + + divFolder.appendChild(insideDiv); + insideDiv.appendChild(spanInside); + + showFolderInsideMove(folderNoRoot, insideDiv); + + spanInside.addEventListener('click', relocateFileTo); + } + }); + }); +} + +// Display Files of the folder | middle + +function selectFolders(event) { + let openFolder = event.srcElement.getAttribute('name-folder'); + + createFilesTab(openFolder); +} + +function createFilesTab(folderName) { + while (divFiles.firstChild) { + divFiles.removeChild(divFiles.lastChild); + } + + let bodyTable = document.createElement("table"); + let tableRow = document.createElement("tr"); + + divFiles.appendChild(bodyTable); + bodyTable.appendChild(tableRow); + bodyTable.id = "tableFolder"; + + for (let i = 0; i < 4; i++) { + let nameHead = ""; + switch (i) { + case 0: + nameHead = "File name:"; + break + case 1: + nameHead = "Created date:"; + break + case 2: + nameHead = "Modified date:"; + break + case 3: + nameHead = "Size:"; + break + } + tableRow.appendChild(document.createElement("th")).textContent = nameHead; + } + + createButtonsFile(folderName); + + if(!folderName.includes('Trash')){ + let btnCreateInsideFolder = document.querySelector('#create-folder-inside') + let pathCreateNewFolder = btnCreateInsideFolder.getAttribute('folder-path'); + btnCreateInsideFolder.addEventListener('click', () => { + createNewFolder(pathCreateNewFolder); + }); + +} + + + fetch("../assets/display-content.php?actualFolderName=" + folderName) + .then(response => response.json()) + .then(data => showelementosOfFolder(data)) +} + +function showelementosOfFolder(data) { + data.forEach(file => { + const containerOpenFolder = document.querySelector("#tableFolder"); + let trFile = document.createElement("tr"); + let cutPath = file.lastIndexOf("/"); + let pathFile = file.slice(cutPath + 1); + containerOpenFolder.appendChild(trFile); + trFile.className += "elemtoOfFolder"; + trFile.setAttribute("filePath", file); + + fetch("../assets/display-metadata-file.php?filePath=" + file) + .then(response => response.json()) + .then(data => constructorTable(data, pathFile, trFile)) + + }) + + let folderElement = document.querySelectorAll(".elemtoOfFolder"); + folderElement.forEach((item) => { + item.addEventListener("click", showInfoElement) + }); +} + +function constructorTable(data, pathFile, trFile) { + for (let i = 0; i < 4; i++) { + let size = ""; + if (data.size <= 1024000) { + let sizeKb = Math.round(data.size / 1024 * 10) / 10; + size = sizeKb + "Kb"; + } else { + let sizeMb = Math.round(data.size / 1024000 * 10) / 10; + size = sizeMb + "MB"; + } + + let infoTd = ""; + switch (i) { + case 0: + infoTd = pathFile; + + break + + case 1: + infoTd = data.modify; + break + case 2: + infoTd = data.creation; + break + case 3: + infoTd = size; + break; + } + let tdRow = document.createElement("td"); + tdRow.textContent = infoTd; + + + if (i === 0) { + let extension = getPathExtension(pathFile); + let img = document.createElement("img"); + + switch (extension) { + case "mp3": + img.src = "../image/mp3.png"; + break + case "mp4": + img.src = "../image/mp4.png"; + break + case "txt": + img.src = "../image/txt.png"; + break + case "img": + img.src = "../image/img2.jpeg"; + break + } + tdRow.prepend(img); + } + trFile.appendChild(tdRow); + } +} + +// Get into folder inside a folder + +function displayInsideFolder(folderName) { + let pathFile = folderName; + + if (folderName.includes("../root/")) { + pathFile = folderName.slice(8); + } + + createFilesTab(pathFile); + + let indexPreviousFolder = pathFile.lastIndexOf("/"); + let backPath = pathFile.slice(0, indexPreviousFolder); + + const btnFiles = document.querySelector('.buttons-files'); + const btnAddFolder = document.querySelector('#create-folder-inside'); + + const backSpan = document.createElement('span'); + backSpan.textContent = '< Go back'; + backSpan.setAttribute('back-path', backPath); + backSpan.id = 'btn-backpath'; + + let btnDeleteInsideFolder = document.createElement('span'); + let iDeleteFolder = document.createElement('i'); + iDeleteFolder.className = 'fa-solid fa-trash'; + btnDeleteInsideFolder.id = 'delete-folder-inside'; + btnDeleteInsideFolder.textContent = 'Delete Folder'; + btnDeleteInsideFolder.setAttribute('filePath', pathFile); + + btnFiles.prepend(backSpan); + + if(!pathFile.includes('Trash')){ + btnAddFolder.insertAdjacentElement('afterend', btnDeleteInsideFolder); + }else{ + backSpan.insertAdjacentElement('afterend', btnDeleteInsideFolder); + } + btnDeleteInsideFolder.prepend(iDeleteFolder); + + backSpan.addEventListener('click', () => { + if (backPath.lastIndexOf("/") === -1) { + while (backSpan.firstChild) { + backSpan.removeChild(backSpan.lastChild); + } + while (btnDeleteInsideFolder.firstChild) { + btnDeleteInsideFolder.removeChild(btnDeleteInsideFolder.lastChild); + } + createFilesTab(backPath); + } else { + displayInsideFolder(backPath); + } + }); + + btnDeleteInsideFolder.addEventListener('click', deleteFolders); +} + +// Options files + +function createButtonsFile(folderPath) { + const h1Files = document.querySelector('#choose-folder-h1'); + if (h1Files !== null) { + h1Files.remove(); + } + + let divOptionsFolder = document.createElement('div'); + divOptionsFolder.className = 'buttons-files'; + + divFiles.prepend(divOptionsFolder); + + if(!folderPath.includes('Trash')){ + + let btnCreateFile = document.createElement('span'); + let iCreateFile = document.createElement('i'); + iCreateFile.className = 'fa-solid fa-file'; + btnCreateFile.textContent = 'New File'; + btnCreateFile.setAttribute('folder-path', folderPath) + + let btnCreateFolder = document.createElement('span'); + let iCreateFolder = document.createElement('i'); + iCreateFolder.className = 'fa-solid fa-plus'; + btnCreateFolder.id = 'create-folder-inside'; + btnCreateFolder.textContent = 'New Folder'; + btnCreateFolder.setAttribute('folder-path', folderPath); + + let spanNameFolder = document.createElement('span'); + spanNameFolder.id = 'name-folder'; + spanNameFolder.textContent = folderPath; + + divOptionsFolder.appendChild(btnCreateFile); + btnCreateFile.prepend(iCreateFile); + + divOptionsFolder.appendChild(btnCreateFolder); + btnCreateFolder.prepend(iCreateFolder); + + divOptionsFolder.appendChild(spanNameFolder); + + btnCreateFile.addEventListener('click', createPopUpUpload); + } +} + +// Get info of the files + +function getPathExtension(path) { + let cutExtension = path.lastIndexOf("."); + let pathExtension = path.slice(cutExtension + 1); + let formatImg = ["jpg", "png", "webp"]; + + if (formatImg.includes(pathExtension)) { + pathExtension = "img"; + } + + return pathExtension; +} + +function showInfoElement(event) { + let atrituboFile = event.currentTarget.getAttribute("filePath") + let pathExtension = getPathExtension(atrituboFile); + + switch (pathExtension) { + case "txt": + let cutPath = atrituboFile.indexOf("/"); + let pathFile = atrituboFile.slice(cutPath + 1); + window.location.replace("../text-editor.php?pathFile=" + pathFile); + break; + case "img": + createFileContent("img", atrituboFile); + break; + case "mp4": + createFileContent("mp4", atrituboFile); + break; + case "mp3": + createFileContent("mp3", atrituboFile); + break; + default: + displayInsideFolder(atrituboFile); + break; + } + + btnDeleteFile.setAttribute("filePath", atrituboFile) + btnDeleteFile.addEventListener("click", deleteFile); + + btnRelocateFile.setAttribute("filePath", atrituboFile); +} + +// Relocate documento + +function relocateFileTo(path) { + let filePath = btnRelocateFile.getAttribute("filePath"); + let newFilePath = path.currentTarget.getAttribute('file-path'); + let confirmMove = confirm(`Where do you want to move this file to ${newFilePath}?`); + + if (confirmMove) { + fetch("../assets/relocate-file.php?filepath=" + filePath + "&folderName=" + newFilePath) + .then(response => response.json()) + .then(data => { + if (data.code === 200) { + document.querySelector('.move-btwn-folders').remove(); + closePopUp(); + if (data.redir.match("/")) { + displayInsideFolder(data.redir); + } else { + createFilesTab(data.redir); + } + } else if (data.code === 500) { + alert(code.msg); + } + }); + } + +} + +// Move to trash / delete + +function deleteFile() { + let basura = document.querySelector("#delete-file"); + let atrBasura = basura.getAttribute("filePath"); + + let popUpDeleteConfirm; + if (atrBasura.includes('/Trash/') === true) { + popUpDeleteConfirm = confirm("This file will delete permanently, are you sure to delete it?"); + } else { + popUpDeleteConfirm = confirm("Do you want delete this file?"); + } + + if (popUpDeleteConfirm) { + addTrash(atrBasura); + } +} + +function addTrash(atrBasura) { + if (atrBasura.includes('/Trash/') === true) { + fetch("../assets/delete-file.php?filePath=" + atrBasura) + .then(response => { + if (atrBasura.split('.').length > 3) { + closePopUp(); + } + createFilesTab('Trash'); + }); + } else { + fetch("../assets/add-trash.php?filePath=" + atrBasura) + .then(response => { + if (atrBasura.split('.').length > 3) { + closePopUp(); + } + if(atrBasura.split('/').length === 2){ + getInfoFolders(); + }else{ + createFilesTab('Trash'); + } + }); + } +} + +function deleteFolderTrash(atrBasura){ + fetch("../assets/delete-folder.php?filePath=" + atrBasura) + .then(response => response.json()) +} + +function openTrashFolder() { + createFilesTab("Trash"); +} + +// Pop Up Options + +function hideOptionPopUp(option) { + switch (option) { + case 'delete': + btnDeleteFile.style.display = 'none'; + break; + case 'move': + btnRelocateFile.style.display = 'none'; + break; + case 'both': + btnRelocateFile.style.display = 'none'; + btnDeleteFile.style.display = 'none'; + break; + } +} + +function showOptionPopUp(option) { + switch (option) { + case 'delete': + btnDeleteFile.style.display = 'initial'; + break; + case 'move': + btnRelocateFile.style.display = 'initial'; + break; + case 'both': + btnRelocateFile.style.display = 'initial'; + btnDeleteFile.style.display = 'initial'; + break; + } +} + +// Create Pop up Files + +function createPopUpUpload(event) { + const pathFile = event.currentTarget.getAttribute('folder-path'); + + const divViewContent = document.querySelector('#view-content'); + const trashBtn = document.querySelector('#delete-file'); + + hideOptionPopUp('both'); + + let elForm = document.createElement('form'); + elForm.setAttribute('enctype', 'multipart/form-data'); + elForm.method = 'post'; + + let divBackgroundUpload = document.createElement('div'); + divBackgroundUpload.className = 'upload-file-pop-up'; + + let inputFile = document.createElement('input'); + inputFile.type = 'file'; + inputFile.name = 'uploadFile'; + + let inputPath = document.createElement('input'); + inputPath.type = 'hidden'; + inputPath.name = 'uploadFolder'; + inputPath.value = pathFile; + + let btnUpload = document.createElement('button'); + btnUpload.textContent = 'Upload File'; + btnUpload.id = 'btn-upload-file'; + + divViewContent.prepend(elForm); + elForm.appendChild(divBackgroundUpload) + divBackgroundUpload.appendChild(inputFile); + divBackgroundUpload.appendChild(inputPath); + divBackgroundUpload.appendChild(btnUpload); + + elForm.addEventListener('submit', (e) => { + e.preventDefault(); + + let formData = new FormData(elForm); + + fetch('../assets/upload-file.php', { + method: "POST", + body: formData + }) + .then(response => response.json()) + .then(info => { + if (info.status) { + trashBtn.style.display = 'initial'; + + closePopUp(); + + if (pathFile.includes("/")) { + console.log('subido') + displayInsideFolder(pathFile); + } else { + console.log('subido carpeta') + createFilesTab(pathFile); + } + + alert(info.msg); + } else { + alert(info.msg); + } + }); + }); + + displayPopUp(); + + let btnClosePopUp = document.getElementById('close-popup'); + btnClosePopUp.addEventListener('click', () => { + trashBtn.style.display = 'initial'; + }) +} + +function createFileContent(typeFile, data) { + const containerContent = document.querySelector("#view-content"); + + while (containerContent.firstChild) { + containerContent.removeChild(containerContent.lastChild); + } + + if (typeFile === "txt") { + let elementTxt = document.createElement("div"); + elementTxt.textContent = data; + containerContent.appendChild(elementTxt); + } else if (typeFile === "img") { + let elementImg = document.createElement("img"); + elementImg.src = data; + elementImg.id = 'file-show-popup'; + containerContent.appendChild(elementImg); + } else if (typeFile === "mp4") { + let elementVideo = document.createElement("video"); + elementVideo.controls = true; + elementVideo.id = 'file-show-popup'; + let elementSource = document.createElement("source"); + elementSource.src = data; + elementSource.setAttribute("type", "video/mp4"); + containerContent.appendChild(elementVideo); + elementVideo.appendChild(elementSource); + } else if (typeFile === "mp3") { + let elementAudio = document.createElement("audio"); + elementAudio.controls = true; + elementAudio.id = 'file-show-popup'; + let elementAudioSource = document.createElement("source"); + elementAudioSource.src = data; + elementAudioSource.setAttribute("type", "audio/mpeg"); + containerContent.appendChild(elementAudio); + elementAudio.appendChild(elementAudioSource); + } + + displayPopUp(); +} + + +// PopUp open and PopUp Close + +function displayPopUp() { + const viewContent = document.querySelector('.pop-up-file'); + viewContent.classList.toggle('hidden'); + +} + +function closePopUp() { + const viewContent = document.querySelector('.pop-up-file'); + viewContent.classList.toggle('hidden'); + const containerContent = document.querySelector("#view-content"); + showOptionPopUp('both'); + while (containerContent.firstChild) { + containerContent.removeChild(containerContent.lastChild); + } +} + +// AddEventListeners + +window.addEventListener('load', getInfoFolders); + +btnRelocateFile.addEventListener("click", moveFolders); + +btnCreateFolder.addEventListener("click", createNewFolder); + +btnClosePopUp.addEventListener('click', closePopUp); + +btnOpenTrash.addEventListener("click", openTrashFolder); \ No newline at end of file diff --git a/assets/js/results.js b/assets/js/results.js new file mode 100755 index 00000000..612b0807 --- /dev/null +++ b/assets/js/results.js @@ -0,0 +1,93 @@ +const contentFile = document.querySelectorAll(".file-search"); +const file = document.querySelectorAll('.file-search'); +const btnClosePopUp = document.getElementById("close-popup"); + +function showInfoElement(event) { + let atrituboFile = event.srcElement.getAttribute("filePath") + let cutExtension = atrituboFile.lastIndexOf("."); + let pathExtension = atrituboFile.slice(cutExtension + 1); + + let formatImg = ["jpg", "png", "webp"]; + + if (formatImg.includes(pathExtension)) { + pathExtension = "img"; + } + switch (pathExtension) { + case "txt": + let pathTxt = "../" + atrituboFile; + fetch("assets/display-info-file.php?filePath=" + pathTxt) + .then(response => response.json()) + .then(data => createFileContent("txt", data, atrituboFile)) + + break + case "img": + createFileContent("img", atrituboFile); + break + case "mp4": + createFileContent("mp4", atrituboFile); + break + case "mp3": + createFileContent("mp3", atrituboFile); + break + default: + console.log("no podemos descargar este archivo") + break + } +} + +function createFileContent(typeFile, data, pathTxt) { + const containerContent = document.querySelector("#view-content"); + + while (containerContent.firstChild) { + containerContent.removeChild(containerContent.lastChild); + } + if (typeFile === "txt") { + let elementTxt = document.createElement("div"); + elementTxt.textContent = data; + containerContent.appendChild(elementTxt); + + + } else if (typeFile === "img") { + let elementImg = document.createElement("img"); + elementImg.src = data; + containerContent.appendChild(elementImg); + + } else if (typeFile === "mp4") { + let elementVideo = document.createElement("video"); + elementVideo.controls = true; + let elementSource = document.createElement("source"); + elementSource.src = data; + elementSource.setAttribute("type", "video/mp4"); + containerContent.appendChild(elementVideo); + elementVideo.appendChild(elementSource); + + } else if (typeFile === "mp3") { + let elementAudio = document.createElement("audio"); + elementAudio.controls = true; + let elementAudioSource = document.createElement("source"); + elementAudioSource.src = data; + elementAudioSource.setAttribute("type", "audio/mpeg"); + containerContent.appendChild(elementAudio); + elementAudio.appendChild(elementAudioSource); + } +} + +function displayPopUp() { + const viewContent = document.querySelector('.pop-up-file'); + viewContent.classList.toggle('hidden'); +} + +function closePopUp() { + const viewContent = document.querySelector('.pop-up-file'); + viewContent.classList.toggle('hidden'); +} + +contentFile.forEach((item) => { + item.addEventListener("click", showInfoElement) +}); + +file.forEach(item => { + item.addEventListener('click', displayPopUp); +}) + +btnClosePopUp.addEventListener('click', closePopUp); \ No newline at end of file diff --git a/assets/js/txt-editor.js b/assets/js/txt-editor.js new file mode 100755 index 00000000..1c232286 --- /dev/null +++ b/assets/js/txt-editor.js @@ -0,0 +1,33 @@ +const btnDeleteFileTxt = document.querySelector("#delete-txt"); +btnDeleteFileTxt.addEventListener("click", deleteFileTxt); + + +function deleteFileTxt(event){ + event.preventDefault(); + const popUpDeleteConfirm = confirm("Do you want delete this file?"); + let filePath; + + if (popUpDeleteConfirm) { + filePath = event.srcElement.getAttribute("filePath"); + console.log(filePath) + + fetch("assets/add-trash.php?filePath="+filePath); + window.location.replace("root"); +} +} + +const btnSaveChangedFileTxt = document.querySelector("#modify-file"); +btnSaveChangedFileTxt.addEventListener("click", saveModifiedFile); + +function saveModifiedFile(){ + const confirmModify = confirm("Do you want save changes?"); + if(confirmModify){ + alert("Your changes were saved successful!"); + } +} + + + + + + diff --git a/assets/login.php b/assets/login.php new file mode 100755 index 00000000..8955cd24 --- /dev/null +++ b/assets/login.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/assets/modify-folder.php b/assets/modify-folder.php new file mode 100755 index 00000000..63e7c884 --- /dev/null +++ b/assets/modify-folder.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/assets/relocate-file.php b/assets/relocate-file.php new file mode 100755 index 00000000..bdd17050 --- /dev/null +++ b/assets/relocate-file.php @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/assets/upload-file.php b/assets/upload-file.php new file mode 100755 index 00000000..d8c18460 --- /dev/null +++ b/assets/upload-file.php @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/image/csv.png b/image/csv.png new file mode 100755 index 00000000..41b84e16 Binary files /dev/null and b/image/csv.png differ diff --git a/image/doc.png b/image/doc.png new file mode 100755 index 00000000..42fe1140 Binary files /dev/null and b/image/doc.png differ diff --git a/image/folder.ico b/image/folder.ico new file mode 100755 index 00000000..fc05bd1b Binary files /dev/null and b/image/folder.ico differ diff --git a/image/img2.jpeg b/image/img2.jpeg new file mode 100755 index 00000000..2e6bba84 Binary files /dev/null and b/image/img2.jpeg differ diff --git a/image/logo.webp b/image/logo.webp new file mode 100755 index 00000000..6c7957bb Binary files /dev/null and b/image/logo.webp differ diff --git a/image/logoNew.png b/image/logoNew.png new file mode 100755 index 00000000..a415c3c7 Binary files /dev/null and b/image/logoNew.png differ diff --git a/image/mp3.png b/image/mp3.png new file mode 100755 index 00000000..071b2a59 Binary files /dev/null and b/image/mp3.png differ diff --git a/image/mp4.png b/image/mp4.png new file mode 100755 index 00000000..46b29fe3 Binary files /dev/null and b/image/mp4.png differ diff --git a/image/txt.png b/image/txt.png new file mode 100755 index 00000000..51d43a1f Binary files /dev/null and b/image/txt.png differ diff --git a/index.php b/index.php new file mode 100755 index 00000000..0c9b1100 --- /dev/null +++ b/index.php @@ -0,0 +1,52 @@ + + + + + + + + File system explorer + + + + + + +
+ Logo +
+
+
+ +
+
+
+ +
+ + Username or password is wrong!

'; + break; + case 'emptyFields': + echo '

All fields must be filled!

'; + break; + } + } + ?> +
+ + +
+
+
+ + \ No newline at end of file diff --git a/root/Carpeta nueva/car.webp b/root/Carpeta nueva/car.webp new file mode 100644 index 00000000..40291274 Binary files /dev/null and b/root/Carpeta nueva/car.webp differ diff --git a/root/Carpeta nueva/ping.png b/root/Carpeta nueva/ping.png new file mode 100644 index 00000000..df25ec4e Binary files /dev/null and b/root/Carpeta nueva/ping.png differ diff --git a/root/Folder four/Nombre.png b/root/Folder four/Nombre.png new file mode 100755 index 00000000..d3d08cd2 Binary files /dev/null and b/root/Folder four/Nombre.png differ diff --git a/root/Folder four/Nueva carpeta/dog.jpeg b/root/Folder four/Nueva carpeta/dog.jpeg new file mode 100644 index 00000000..ce06a147 Binary files /dev/null and b/root/Folder four/Nueva carpeta/dog.jpeg differ diff --git a/root/Folder four/Nueva carpeta/file.txt b/root/Folder four/Nueva carpeta/file.txt new file mode 100755 index 00000000..3df6ec8b --- /dev/null +++ b/root/Folder four/Nueva carpeta/file.txt @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/root/Folder four/Nueva carpeta/gato2.jpg b/root/Folder four/Nueva carpeta/gato2.jpg new file mode 100644 index 00000000..b5d9932f Binary files /dev/null and b/root/Folder four/Nueva carpeta/gato2.jpg differ diff --git a/root/Folder four/cato1.jpg b/root/Folder four/cato1.jpg new file mode 100644 index 00000000..4d16eb19 Binary files /dev/null and b/root/Folder four/cato1.jpg differ diff --git a/root/Folder one/Folder inside/New folder/New folder/car.webp b/root/Folder one/Folder inside/New folder/New folder/car.webp new file mode 100644 index 00000000..40291274 Binary files /dev/null and b/root/Folder one/Folder inside/New folder/New folder/car.webp differ diff --git a/root/Folder one/Folder inside/ping.png b/root/Folder one/Folder inside/ping.png new file mode 100644 index 00000000..df25ec4e Binary files /dev/null and b/root/Folder one/Folder inside/ping.png differ diff --git a/root/Folder one/prueba-delete.txt b/root/Folder one/prueba-delete.txt new file mode 100755 index 00000000..ab9268e7 --- /dev/null +++ b/root/Folder one/prueba-delete.txt @@ -0,0 +1,3 @@ +bamos relocate to trash - funciona + + \ No newline at end of file diff --git a/root/Folder one/prueba.txt b/root/Folder one/prueba.txt new file mode 100755 index 00000000..4f0ae2b8 --- /dev/null +++ b/root/Folder one/prueba.txt @@ -0,0 +1,39 @@ +What is Lorem Ipsum? +Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. + +Why do we use it? +It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like). + + +Where does it come from? +Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/root/Folder two/0db82053adec40a35e9105890651eb64_4de23537179ce716cb5f76bb1bf8af65.png b/root/Folder two/0db82053adec40a35e9105890651eb64_4de23537179ce716cb5f76bb1bf8af65.png new file mode 100644 index 00000000..a8bd2acb Binary files /dev/null and b/root/Folder two/0db82053adec40a35e9105890651eb64_4de23537179ce716cb5f76bb1bf8af65.png differ diff --git a/root/Folder two/Musica-Spectacular-Sound-Productions-Breathing.mp3 b/root/Folder two/Musica-Spectacular-Sound-Productions-Breathing.mp3 new file mode 100755 index 00000000..00357ff0 Binary files /dev/null and b/root/Folder two/Musica-Spectacular-Sound-Productions-Breathing.mp3 differ diff --git a/root/Folder two/people-gbf9225798_1920.jpg b/root/Folder two/people-gbf9225798_1920.jpg new file mode 100644 index 00000000..89ed5cff Binary files /dev/null and b/root/Folder two/people-gbf9225798_1920.jpg differ diff --git "a/root/Folder/Marvel\342\200\231s Spider-Man \342\200\223 Be Greater Extended Trailer _ PS4.mp4" "b/root/Folder/Marvel\342\200\231s Spider-Man \342\200\223 Be Greater Extended Trailer _ PS4.mp4" new file mode 100644 index 00000000..634a3f75 Binary files /dev/null and "b/root/Folder/Marvel\342\200\231s Spider-Man \342\200\223 Be Greater Extended Trailer _ PS4.mp4" differ diff --git a/root/Trash/Nuevo Nombre/doc.png b/root/Trash/Nuevo Nombre/doc.png new file mode 100755 index 00000000..42fe1140 Binary files /dev/null and b/root/Trash/Nuevo Nombre/doc.png differ diff --git a/root/Trash/csv.png b/root/Trash/csv.png new file mode 100755 index 00000000..41b84e16 Binary files /dev/null and b/root/Trash/csv.png differ diff --git a/root/Trash/doc.png b/root/Trash/doc.png new file mode 100644 index 00000000..42fe1140 Binary files /dev/null and b/root/Trash/doc.png differ diff --git a/root/Trash/mp3.png b/root/Trash/mp3.png new file mode 100755 index 00000000..071b2a59 Binary files /dev/null and b/root/Trash/mp3.png differ diff --git a/root/Trash/mp4.png b/root/Trash/mp4.png new file mode 100755 index 00000000..46b29fe3 Binary files /dev/null and b/root/Trash/mp4.png differ diff --git a/root/Trash/people-gbf9225798_1920.jpg b/root/Trash/people-gbf9225798_1920.jpg new file mode 100644 index 00000000..89ed5cff Binary files /dev/null and b/root/Trash/people-gbf9225798_1920.jpg differ diff --git a/root/index.php b/root/index.php new file mode 100755 index 00000000..10bd18ca --- /dev/null +++ b/root/index.php @@ -0,0 +1,83 @@ + + + + + + + + + + + + Welcome + + +
+ +
+ +
+ +
+

My folders

+
+
+ +

+ +
+
  • + + +

    Trash

    + +
  • +
    + + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    + + + + + + \ No newline at end of file diff --git a/search.php b/search.php new file mode 100755 index 00000000..de34410a --- /dev/null +++ b/search.php @@ -0,0 +1,159 @@ + $files ) { + if ( $files !== 'root/Trash' ) { + array_push( $actualFiles, $files ); + if ( count( glob( "$files/*" ) ) > 0 ) { + $keepsearching = getFiles( $files ); + if ( count( $keepsearching ) !== 0 ) { + array_push( $actualFiles, $keepsearching ); + } + } + } + } + return $actualFiles; +} + + $arrayFiles = getFiles( 'root' ); + + + function array_flatten($array) { + $result = array(); + + if (!is_array($array)) { + $array = func_get_args(); + } + + foreach ($array as $key => $value) { + if (is_array($value)) { + $result = array_merge($result, array_flatten($value)); + } else { + $result = array_merge($result, array($key => $value)); + } + } + + return $result; + } + + $arrayFile = array_flatten($arrayFiles); + + function array_search_partial( $arr, $keyword ) { + $arrayResultSearch = array(); + foreach ( $arr as $index => $string ) { + if ( stripos($string, $keyword) !== false) { + array_push( $arrayResultSearch, $index ); + } + } + return $arrayResultSearch; + } + ?> + + + + + + + + + + + Welcome + + +
    + +
    + +
    +
    + + 0){ + echo '

    Search Results

    '; + + foreach ( $indexFile as $indexResult ) { + if(strpos($arrayFile[$indexResult], '.')){ + $positionSlashFile = strpos( $arrayFile[ $indexResult ], '/', 5 ); + $fileWithoutSlash = substr( $arrayFile[ $indexResult ], $positionSlashFile ); + echo ''; + }else{ + $positionSlashFolder = strpos( $arrayFile[$indexResult], '/' ); + $folderWithoutSlash = substr( $arrayFile[$indexResult], $positionSlashFolder ); + + echo '
    +
    + + \ No newline at end of file diff --git a/style.css b/style.css new file mode 100755 index 00000000..063eca22 --- /dev/null +++ b/style.css @@ -0,0 +1,386 @@ +*{ + font-family: 'Roboto', sans-serif; +} +body{ + margin: 0; +} + +/* Login */ + +#form{ + width:30%; +} + +#form input{ + width:100%; + border: 0; + border-bottom:1px solid #000; +} + +#form input:focus{ + outline:none; + border: 0; + border-bottom:1px solid rgb(1, 1, 211); +} + +#loginBody { +display: flex; +flex-direction: column; +justify-content: center; +align-items: center; +gap: 10px; +} + +#logoLogin{ + border-radius: 50%; +} + +#errorMessageLogin{ + color:red; + font-weight: 800; +} + +.marginLogin{ + margin:20px 0; +} + +/* Panel */ + +header{ +padding: 10px; +background-color: #F9DCC4; +} + +#navigation{ + display: grid; + grid-template-columns: 20% 60% 20%; + justify-content:space-between; + +} + +main{ + display: grid; + grid-template-columns: 20% 80%; + padding: 10px; + height: 90vh; +} + +#folders{ + border-right: 1px solid black; + padding: 10px; +} + +#show-files{ + border-left: 1px solid black; + padding: 10px; +} + +#files{ + padding: 10px; +} + +table{ + border-spacing: 0; +} + +.elemtoOfFolder{ + padding:0 2px; +} + +.elemtoOfFolder:hover{ + background: #e1e1e1; +} + +#logo-panel{ + width: 4rem; +} + +#folder{ + width: 100%; + cursor: pointer; +} +img.imageFolder{ + height: 1rem; + margin-right: 5px; +} + +#folder li{ +list-style: none; +display: flex; +margin-bottom: 10px; +justify-content: space-between; +} + +.select-folder{ + width: 60%; +} + +.modify-name-folder{ + margin-right: 10px; +} + +.fa-solid{ +font-size: 0.8rem; +cursor:pointer; +} + +#tableFolder{ + width:100%; +} + +#tableFolder{ + margin-bottom:10px; + font-size:14px; + text-align: left; +} + +#tableFolder img{ + height:18px; +} + +#create-new-folder{ + position: relative; +} + +#create-new-folder i{ + position: absolute; + right: 0; + font-size: 20px; + background: #FCD5CE; + color: #fff; + border-radius: 20px; + padding: 5px; + cursor:pointer; +} +.buttons-files{ + margin-bottom: 20px; +} + +.buttons-files span{ + border-radius: 10px; + padding: 5px; + background: #FEC89A; + color: #fff; + box-shadow: 2px 2px 2px #b5b5b5; + margin-right: 10px; + cursor:pointer; +} + +.buttons-files span i{ + margin-right:5px; +} + +#name-folder{ + background: #fff; + box-shadow: 0px 0px; + color: #a5a5a5; + float: right; +} + +/* Upload File */ +.upload-file-pop-up{ +background: #fff; + width: 500px; + height: 500px; + z-index: 100; + position: relative; +} + +/* Move Files */ + +.move-btwn-folders{ + background: #fff; + z-index: 200; + position: relative; + padding: 20px; +} + +#span-folder-move{ + font-weight: 800; +} + +#span-folder-move, .inside-btwn div{ + cursor:pointer; +} + +.inside-btwn{ + padding-bottom: 10px; +} + +.inside-btwn div{ + padding: 0 10px; +} + +.inside-btwn div:before{ + content: ""; + display: list-item; + list-style: '- '; + background: #ccc; + position: absolute; +} + +/* Search */ + +#search{ + height: 100%; + display: flex; + align-items: center; + width: 100%; + justify-content: center; +} + +#search form{ + margin:0; + width: 80%; +} + +#search input{ + height: 80%; + width: 80%; + margin: 0; + padding: 0 20px; + font-size: 20px; + border-radius: 20px; + border-color: rgb(234, 220, 220); +} + +#user{ + display: flex; + align-items: center; + margin-left: 70px; +} + +#sing-out{ + width: 75px; + border: 1px solid rgb(167, 158, 158); + border-radius: 20px; + padding: 3px; + text-align: center; + background-color: #ecdfdf; + color: rgb(136, 130, 130); + cursor: pointer; + vertical-align: middle; + +} + +main.search-main{ +position: relative; +display: inline-block; +width: calc(100% - 20px); +} + +.pop-up-file{ + width: 80%; + margin: 0 10%; + height: 80%; + position: absolute; +} + +.hidden{ + display:none; +} + +.close-popup-file i.fa-solid{ + font-weight: 900; + color: #fff; + font-size: 30px; + z-index: 100; + position: relative; + padding: 5px; +} + +.close-popup-file i.fa-solid.fa-trash{ + font-size: 22px; + cursor:pointer; +} + +.cover{ + position: fixed; + top: 0; + left: 0; + background: rgba(0,0,0,0.6); + z-index: 50; + width: 100%; + height: 100%; +} + +#view-content{ + width: 100%; + position: relative; +} + +#view-content video, #view-content audio, #view-content img{ + position:absolute; + max-width:80%; + z-index:100; +} + +.folder-search{ + padding: 5px; + background: #f3f3f3; + font-weight: 800; +} + +.file-search{ + padding: 10px 15px; +} + +.file-search.no-folder { + padding: 10px 0px; +} + + +/* editor de texto */ + +.text-editor{ + width: 100%; +} + +.text-editor textarea{ + width: 80%; + height: 45vh; + margin: 5% 10%; +} + +#trash-folder{ + color: red; +} + +#trash-folder li{ + list-style: none; +} + +#trash-folder img{ + width: 10px; +} + +#trash-visual-folder{ + display: flex; + flex-direction: row; +} + +#trash-folder p{ + width: 60px; + border: 1px solid #ecdfdf; + border-radius: 20px; + padding: 3px; + text-align: center; + background-color: #ecdfdf; + color: rgb(136, 130, 130); +} + +.button-edit-text{ + border-radius: 10px; + border-color: #FEC89A; + padding: 5px; + background: #FEC89A; + color: #fff; + box-shadow: 2px 2px 2px #b5b5b5; + cursor:pointer; +} + + +#relocate-file{ + font-size: 25px; +} + diff --git a/text-editor.php b/text-editor.php new file mode 100755 index 00000000..0a47c190 --- /dev/null +++ b/text-editor.php @@ -0,0 +1,55 @@ + + + + + + + + + + + + Text editor + + +
    + +
    + +
    +

    Text editor

    + +
    + + " > + + +
    +
    + + + + + + \ No newline at end of file