From 370f04dbaf3ebc12cf91f766afcefb597b124590 Mon Sep 17 00:00:00 2001 From: christianbeeznst Date: Wed, 13 Mar 2024 23:11:42 -0500 Subject: [PATCH] Editor: Integrate image upload with backend controller and fileManager option - refs #3795 --- assets/vue/App.vue | 6 + .../basecomponents/BaseTinyEditor.vue | 161 ++++++ assets/vue/components/filemanager/Layout.vue | 21 + assets/vue/router/filemanager.js | 19 + assets/vue/router/index.js | 2 + assets/vue/router/page.js | 7 +- assets/vue/views/filemanager/List.vue | 496 ++++++++++++++++++ assets/vue/views/filemanager/Upload.vue | 129 +++++ assets/vue/views/page/EditorDemo.vue | 24 + .../Controller/Api/BaseResourceFileAction.php | 2 +- .../Controller/FileManagerController.php | 113 ++++ 11 files changed, 978 insertions(+), 2 deletions(-) create mode 100644 assets/vue/components/basecomponents/BaseTinyEditor.vue create mode 100644 assets/vue/components/filemanager/Layout.vue create mode 100644 assets/vue/router/filemanager.js create mode 100644 assets/vue/views/filemanager/List.vue create mode 100644 assets/vue/views/filemanager/Upload.vue create mode 100644 assets/vue/views/page/EditorDemo.vue create mode 100644 src/CoreBundle/Controller/FileManagerController.php diff --git a/assets/vue/App.vue b/assets/vue/App.vue index a9be8622c9..2c1a08fbcb 100644 --- a/assets/vue/App.vue +++ b/assets/vue/App.vue @@ -54,6 +54,7 @@ import { useLocale } from "./composables/locale" import { useI18n } from "vue-i18n" import { customVueTemplateEnabled } from "./config/env" import CustomDashboardLayout from "../../var/vue_templates/components/layout/DashboardLayout.vue" +import EmptyLayout from "./components/layout/EmptyLayout.vue" const apolloClient = new ApolloClient({ link: createHttpLink({ @@ -69,6 +70,11 @@ const router = useRouter() const i18n = useI18n() const layout = computed(() => { + + if (route.meta.emptyLayout) { + return EmptyLayout; + } + const queryParams = new URLSearchParams(window.location.search) if (queryParams.has("lp") || (queryParams.has("origin") && "learnpath" === queryParams.get("origin"))) { diff --git a/assets/vue/components/basecomponents/BaseTinyEditor.vue b/assets/vue/components/basecomponents/BaseTinyEditor.vue new file mode 100644 index 0000000000..1a4f99dd08 --- /dev/null +++ b/assets/vue/components/basecomponents/BaseTinyEditor.vue @@ -0,0 +1,161 @@ + + + diff --git a/assets/vue/components/filemanager/Layout.vue b/assets/vue/components/filemanager/Layout.vue new file mode 100644 index 0000000000..3ddc47bed5 --- /dev/null +++ b/assets/vue/components/filemanager/Layout.vue @@ -0,0 +1,21 @@ + + diff --git a/assets/vue/router/filemanager.js b/assets/vue/router/filemanager.js new file mode 100644 index 0000000000..c2049c265a --- /dev/null +++ b/assets/vue/router/filemanager.js @@ -0,0 +1,19 @@ +export default { + path: '/resources/filemanager', + meta: { requiresAuth: true }, + component: () => import('../components/filemanager/Layout.vue'), + children: [ + { + path: 'personal_list/:node?', + name: 'FileManagerList', + component: () => import('../views/filemanager/List.vue'), + meta: { emptyLayout: true }, + }, + { + name: 'FileManagerUploadFile', + path: 'upload', + component: () => import('../views/filemanager/Upload.vue'), + meta: { emptyLayout: true }, + }, + ], +}; diff --git a/assets/vue/router/index.js b/assets/vue/router/index.js index a64fe418ab..112398715a 100644 --- a/assets/vue/router/index.js +++ b/assets/vue/router/index.js @@ -12,6 +12,7 @@ import toolIntroRoutes from "./ctoolintro" import pageRoutes from "./page" import socialNetworkRoutes from "./social" import termsRoutes from "./terms" +import fileManagerRoutes from "./filemanager" //import courseCategoryRoutes from './coursecategory'; import documents from "./documents" @@ -140,6 +141,7 @@ const router = createRouter({ component: MySessionListUpcoming, meta: { requiresAuth: true }, }, + fileManagerRoutes, termsRoutes, socialNetworkRoutes, catalogueCourses, diff --git a/assets/vue/router/page.js b/assets/vue/router/page.js index fd9452be7e..b2347d307c 100644 --- a/assets/vue/router/page.js +++ b/assets/vue/router/page.js @@ -26,6 +26,11 @@ export default { //path: ':id', path: 'show', component: () => import('../views/page/Show.vue') - } + }, + { + name: 'PageEditorDemo', + path: 'editor-demo', + component: () => import('../views/page/EditorDemo.vue') + }, ] }; diff --git a/assets/vue/views/filemanager/List.vue b/assets/vue/views/filemanager/List.vue new file mode 100644 index 0000000000..2b463b53b7 --- /dev/null +++ b/assets/vue/views/filemanager/List.vue @@ -0,0 +1,496 @@ + + + diff --git a/assets/vue/views/filemanager/Upload.vue b/assets/vue/views/filemanager/Upload.vue new file mode 100644 index 0000000000..fe7db0cf7f --- /dev/null +++ b/assets/vue/views/filemanager/Upload.vue @@ -0,0 +1,129 @@ + + + diff --git a/assets/vue/views/page/EditorDemo.vue b/assets/vue/views/page/EditorDemo.vue new file mode 100644 index 0000000000..2a186fe603 --- /dev/null +++ b/assets/vue/views/page/EditorDemo.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/CoreBundle/Controller/Api/BaseResourceFileAction.php b/src/CoreBundle/Controller/Api/BaseResourceFileAction.php index f236098c53..7ff0e556a9 100644 --- a/src/CoreBundle/Controller/Api/BaseResourceFileAction.php +++ b/src/CoreBundle/Controller/Api/BaseResourceFileAction.php @@ -185,7 +185,7 @@ class BaseResourceFileAction /** * Function loaded when creating a resource using the api, then the ResourceListener is executed. */ - protected function handleCreateFileRequest( + public function handleCreateFileRequest( AbstractResource $resource, ResourceRepository $resourceRepository, Request $request, diff --git a/src/CoreBundle/Controller/FileManagerController.php b/src/CoreBundle/Controller/FileManagerController.php new file mode 100644 index 0000000000..285c263b3c --- /dev/null +++ b/src/CoreBundle/Controller/FileManagerController.php @@ -0,0 +1,113 @@ +baseResourceFileAction = $baseResourceFileAction; + $this->personalFileRepository = $personalFileRepository; + $this->entityManager = $entityManager; + } + + #[Route('/list', name: 'file_manager_list', methods: ['GET'])] + public function list(): JsonResponse + { + // Implement logic to list files and folders + // This could be a call to your service or logic to retrieve files/folders + return $this->json(['files' => []]); + } + + #[Route('/upload', name: 'file_manager_upload', methods: ['POST'])] + public function upload(Request $request): JsonResponse + { + // Implement logic to upload files + // This part will handle receiving and storing uploaded files + return $this->json(['message' => 'File(s) uploaded successfully']); + } + + /** + * @throws Exception + */ + #[Route('/upload-image', name: 'file_manager_upload_image', methods: ['POST'])] + public function uploadImage(Request $request): JsonResponse + { + $resource = new PersonalFile(); + + $result = $this->baseResourceFileAction->handleCreateFileRequest( + $resource, + $this->personalFileRepository, + $request, + $this->entityManager, + 'overwrite' + ); + + $this->entityManager->persist($resource); + $this->entityManager->flush(); + + if (!$result) { + return $this->json(['error' => 'File upload failed'], Response::HTTP_BAD_REQUEST); + } + + return $this->json([ + 'message' => 'File uploaded successfully', + 'data' => $result, + 'location' => $this->personalFileRepository->getResourceFileUrl($resource), + ]); + } + + #[Route('/create-folder', name: 'file_manager_create_folder', methods: ['POST'])] + public function createFolder(Request $request): JsonResponse + { + // Implement logic to create new folders + return $this->json(['message' => 'Folder created successfully']); + } + + #[Route('/rename', name: 'file_manager_rename', methods: ['POST'])] + public function rename(Request $request): JsonResponse + { + // Implement logic to rename files/folders + return $this->json(['message' => 'File/folder renamed successfully']); + } + + #[Route('/delete', name: 'file_manager_delete', methods: ['DELETE'])] + public function delete(Request $request): JsonResponse + { + // Implement logic to delete files/folders + return $this->json(['message' => 'File/folder deleted successfully']); + } + + #[Route('/download/{filename}', name: 'file_manager_download', methods: ['GET'])] + public function download(string $filename): Response + { + // Implement logic to download files + // Replace 'path/to/your/files' with the actual path where the files are stored + $filePath = 'path/to/your/files/' . $filename; + + return new BinaryFileResponse($filePath); + } +}