Skip to content

Commit 6457bc8

Browse files
committed
UploadManagement: Handle data copy via Ajax
1 parent fa59988 commit 6457bc8

File tree

10 files changed

+186
-101
lines changed

10 files changed

+186
-101
lines changed

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2019 Volmarg Reiso
3+
Copyright (c) 2019-2020 Volmarg Reiso
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

public/assets/app.js

+5-5
Large diffs are not rendered by default.

public/assets/manifest.json

+17-17
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
"assets/app.css": "/assets/app.css",
33
"assets/app.js": "/assets/app.js",
44
"assets/css/tinymce-editor.css": "/assets/css/tinymce-editor.css",
5-
"assets/fonts/fontawesome-webfont.ttf": "/assets/fonts/fontawesome-webfont.1e59d233.ttf",
6-
"assets/fonts/fontawesome-webfont.woff2": "/assets/fonts/fontawesome-webfont.20fd1704.woff2",
7-
"assets/fonts/fontawesome-webfont.eot": "/assets/fonts/fontawesome-webfont.8b43027f.eot",
8-
"assets/fonts/fontawesome-webfont.woff": "/assets/fonts/fontawesome-webfont.f691f37e.woff",
5+
"assets/fonts/fontawesome-webfont.1e59d233.ttf": "/assets/fonts/fontawesome-webfont.1e59d233.ttf",
6+
"assets/fonts/fontawesome-webfont.20fd1704.woff2": "/assets/fonts/fontawesome-webfont.20fd1704.woff2",
7+
"assets/fonts/fontawesome-webfont.8b43027f.eot": "/assets/fonts/fontawesome-webfont.8b43027f.eot",
8+
"assets/fonts/fontawesome-webfont.f691f37e.woff": "/assets/fonts/fontawesome-webfont.f691f37e.woff",
99
"assets/fonts/lg.woff?22t19m": "/assets/fonts/lg.0add5958.woff",
1010
"assets/fonts/lg.ttf?22t19m": "/assets/fonts/lg.a53dcc5e.ttf",
11-
"assets/fonts/themify.woff": "/assets/fonts/themify.29b39089.woff",
12-
"assets/fonts/themify.eot": "/assets/fonts/themify.9bad9444.eot",
13-
"assets/fonts/themify.ttf": "/assets/fonts/themify.eda8b943.ttf",
11+
"assets/fonts/themify.29b39089.woff": "/assets/fonts/themify.29b39089.woff",
12+
"assets/fonts/themify.9bad9444.eot": "/assets/fonts/themify.9bad9444.eot",
13+
"assets/fonts/themify.eda8b943.ttf": "/assets/fonts/themify.eda8b943.ttf",
1414
"assets/fonts/wEO_EBrAnc9BLjLQAUk1VvoK.woff2": "/assets/fonts/wEO_EBrAnc9BLjLQAUk1VvoK.64a5a4af.woff2",
1515
"assets/fonts/wEO_EBrAnc9BLjLQAUk1WPoK7Es.woff2": "/assets/fonts/wEO_EBrAnc9BLjLQAUk1WPoK7Es.43ae8fe5.woff2",
1616
"assets/images/01.png": "/assets/images/01.f9d01435.png",
@@ -22,13 +22,13 @@
2222
"assets/images/07.png": "/assets/images/07.535b98d8.png",
2323
"assets/images/08.png": "/assets/images/08.83eb2c7e.png",
2424
"assets/images/09.png": "/assets/images/09.2012ae60.png",
25-
"assets/images/404.png": "/assets/images/404.a8049b5e.png",
26-
"assets/images/500.png": "/assets/images/500.afdb57e5.png",
25+
"assets/images/404.a8049b5e.png": "/assets/images/404.a8049b5e.png",
26+
"assets/images/500.afdb57e5.png": "/assets/images/500.afdb57e5.png",
2727
"assets/images/arrow_left.svg": "/assets/images/arrow_left.2b063d13.svg",
2828
"assets/images/arrow_right.svg": "/assets/images/arrow_right.0897f985.svg",
2929
"assets/images/avatar_placeholder.jpg": "/assets/images/avatar_placeholder.jpg",
3030
"assets/images/bcgk.jpg": "/assets/images/bcgk.jpg",
31-
"assets/images/fontawesome-webfont.svg": "/assets/images/fontawesome-webfont.c1e38fd9.svg",
31+
"assets/images/fontawesome-webfont.c1e38fd9.svg": "/assets/images/fontawesome-webfont.c1e38fd9.svg",
3232
"assets/images/lg.svg?22t19m": "/assets/images/lg.adb7aeef.svg",
3333
"assets/images/loading.gif": "/assets/images/loading.fcba57cd.gif",
3434
"assets/images/logo/facebook_cover_photo_1.png": "/assets/images/logo/facebook_cover_photo_1.png",
@@ -49,13 +49,13 @@
4949
"assets/images/logo/twitter_header_photo_2.png": "/assets/images/logo/twitter_header_photo_2.png",
5050
"assets/images/logo/twitter_profile_image.png": "/assets/images/logo/twitter_profile_image.png",
5151
"assets/images/logo/youtube_profile_image.png": "/assets/images/logo/youtube_profile_image.png",
52-
"assets/images/sf.png": "/assets/images/sf.990219d7.png",
53-
"assets/images/sort_asc.png": "/assets/images/sort_asc.4bba5919.png",
54-
"assets/images/sort_asc_disabled.png": "/assets/images/sort_asc_disabled.27ac5d1b.png",
55-
"assets/images/sort_both.png": "/assets/images/sort_both.8b117faa.png",
56-
"assets/images/sort_desc.png": "/assets/images/sort_desc.c4196d32.png",
57-
"assets/images/sort_desc_disabled.png": "/assets/images/sort_desc_disabled.07c018ae.png",
58-
"assets/images/themify.svg": "/assets/images/themify.f0fc8c79.svg",
52+
"assets/images/sf.990219d7.png": "/assets/images/sf.990219d7.png",
53+
"assets/images/sort_asc.4bba5919.png": "/assets/images/sort_asc.4bba5919.png",
54+
"assets/images/sort_asc_disabled.27ac5d1b.png": "/assets/images/sort_asc_disabled.27ac5d1b.png",
55+
"assets/images/sort_both.8b117faa.png": "/assets/images/sort_both.8b117faa.png",
56+
"assets/images/sort_desc.c4196d32.png": "/assets/images/sort_desc.c4196d32.png",
57+
"assets/images/sort_desc_disabled.07c018ae.png": "/assets/images/sort_desc_disabled.07c018ae.png",
58+
"assets/images/themify.f0fc8c79.svg": "/assets/images/themify.f0fc8c79.svg",
5959
"assets/images/video-play.png": "/assets/images/video-play.539c47b6.png",
6060
"assets/images/vimeo-play.png": "/assets/images/vimeo-play.6b92efbd.png",
6161
"assets/images/volmarg_avatar.jpg": "/assets/images/volmarg_avatar.jpg",

src/Action/Files/FilesAction.php

+79
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
use App\Controller\Core\AjaxResponse;
66
use App\Controller\Core\Application;
77
use App\Controller\Core\Controllers;
8+
use App\Controller\Core\Env;
89
use App\Controller\Files\FileUploadController;
10+
use App\Controller\Utils\Utils;
11+
use App\Form\Files\UploadSubdirectoryCopyDataType;
912
use App\Form\Files\UploadSubdirectoryCreateType;
1013
use App\Services\Files\DirectoriesHandler;
1114
use App\Services\Files\FilesHandler;
@@ -16,6 +19,7 @@
1619
use Symfony\Component\HttpFoundation\Request;
1720
use Symfony\Component\HttpFoundation\Response;
1821
use Symfony\Component\Routing\Annotation\Route;
22+
use TypeError;
1923

2024
class FilesAction extends AbstractController {
2125

@@ -384,4 +388,79 @@ public function renameFolderByPostRequest(Request $request)
384388
return AjaxResponse::initializeFromResponse($response)->buildJsonResponse();
385389
}
386390

391+
/**
392+
* @Route("/files/actions/move-or-copy-data-between-folders", name="actions_move_or_copy_data_between_folders", methods="POST")
393+
* @param Request $request
394+
* @return JsonResponse
395+
* @throws \Exception
396+
*/
397+
public function moveOrCopyDataBetweenFoldersViaPostRequest(Request $request): JsonResponse
398+
{
399+
if ( !$request->request->has(FilesHandler::KEY_CURRENT_UPLOAD_MODULE_DIR) ) {
400+
$message = $this->app->translator->translate('responses.general.missingRequiredParameter') . FilesHandler::KEY_CURRENT_UPLOAD_MODULE_DIR;
401+
return AjaxResponse::buildJsonResponseForAjaxCall($message, Response::HTTP_BAD_REQUEST);
402+
}
403+
404+
if ( !$request->request->has(FilesHandler::KEY_TARGET_MODULE_UPLOAD_DIR) ) {
405+
$message = $this->app->translator->translate('responses.general.missingRequiredParameter') . FilesHandler::KEY_TARGET_MODULE_UPLOAD_DIR;
406+
return AjaxResponse::buildJsonResponseForAjaxCall($message, Response::HTTP_BAD_REQUEST);
407+
}
408+
409+
if ( !$request->request->has(FileUploadController::KEY_SUBDIRECTORY_CURRENT_PATH_IN_MODULE_UPLOAD_DIR) ) {
410+
$message = $this->app->translator->translate('responses.general.missingRequiredParameter') . FileUploadController::KEY_SUBDIRECTORY_CURRENT_PATH_IN_MODULE_UPLOAD_DIR;
411+
return AjaxResponse::buildJsonResponseForAjaxCall($message, Response::HTTP_BAD_REQUEST);
412+
}
413+
414+
if ( !$request->request->has(FileUploadController::KEY_SUBDIRECTORY_TARGET_PATH_IN_MODULE_UPLOAD_DIR) ) {
415+
$message = $this->app->translator->translate('responses.general.missingRequiredParameter') . FileUploadController::KEY_SUBDIRECTORY_TARGET_PATH_IN_MODULE_UPLOAD_DIR;
416+
return AjaxResponse::buildJsonResponseForAjaxCall($message, Response::HTTP_BAD_REQUEST);
417+
}
418+
419+
$current_upload_module_dir = $request->request->get(FilesHandler::KEY_CURRENT_UPLOAD_MODULE_DIR);
420+
$target_upload_module_dir = $request->request->get(FilesHandler::KEY_TARGET_MODULE_UPLOAD_DIR);
421+
422+
$current_directory_path_in_module_upload_dir = $request->request->get(FileUploadController::KEY_SUBDIRECTORY_CURRENT_PATH_IN_MODULE_UPLOAD_DIR);
423+
$target_directory_path_in_module_upload_dir = $request->request->get(FileUploadController::KEY_SUBDIRECTORY_TARGET_PATH_IN_MODULE_UPLOAD_DIR);
424+
425+
$do_move_entire_folder = Utils::getBoolRepresentationOfBoolString($request->request->get(UploadSubdirectoryCopyDataType::KEY_MOVE_FOLDER, false));
426+
427+
try{
428+
if( $do_move_entire_folder ){
429+
430+
$upload_dirs = Env::getUploadDirs();
431+
$current_folder_path = $current_directory_path_in_module_upload_dir;
432+
$target_folder_path = $target_directory_path_in_module_upload_dir;
433+
434+
//if not main folder then add upload dir
435+
if( !in_array($current_directory_path_in_module_upload_dir, $upload_dirs) ){
436+
$current_folder_path = Env::getUploadDir() . DIRECTORY_SEPARATOR . $current_upload_module_dir . DIRECTORY_SEPARATOR . $current_directory_path_in_module_upload_dir;
437+
}
438+
439+
//if not main folder then add upload dir
440+
if( !in_array($target_directory_path_in_module_upload_dir, $upload_dirs) ){
441+
$target_folder_path = Env::getUploadDir() . DIRECTORY_SEPARATOR . $target_upload_module_dir . DIRECTORY_SEPARATOR . $target_directory_path_in_module_upload_dir;
442+
}
443+
444+
$response = $this->directories_handler->moveDirectory($current_folder_path, $target_folder_path);
445+
}else{
446+
$response = $this->files_handler->copyData(
447+
$current_upload_module_dir, $target_upload_module_dir, $current_directory_path_in_module_upload_dir, $target_directory_path_in_module_upload_dir
448+
);
449+
}
450+
451+
}catch(\Exception | TypeError $e ){
452+
453+
$this->app->logger->critical("Exception was thrown while calling folders data transfer logic", [
454+
"exceptionMessage" => $e->getMessage(),
455+
"exceptionCode" => $e->getCode(),
456+
"exceptionTrace" => $e->getTraceAsString(),
457+
]);
458+
459+
$message = $this->app->translator->translate('messages.general.internalServerError');
460+
return AjaxResponse::buildJsonResponseForAjaxCall(Response::HTTP_INTERNAL_SERVER_ERROR, $message);
461+
}
462+
463+
return AjaxResponse::initializeFromResponse($response)->buildJsonResponse();
464+
}
465+
387466
}

src/Action/Files/FilesUploadSettingsAction.php

+3-67
Original file line numberDiff line numberDiff line change
@@ -74,21 +74,15 @@ public function displaySettings(Request $request) {
7474

7575
/**
7676
* @param bool $ajax_render
77-
* @param Request $request
7877
* @return Response
7978
* @throws Exception
8079
*/
81-
private function renderSettingsPage(bool $ajax_render, Request $request){
82-
83-
$rename_form = $this->app->forms->renameSubdirectoryForm();
84-
$rename_form->handleRequest($request);
85-
86-
$copy_data_form = $this->app->forms->copyUploadSubdirectoryDataForm();
87-
$copy_data_form->handleRequest($request);
80+
private function renderSettingsPage(bool $ajax_render){
8881

82+
$rename_form = $this->app->forms->renameSubdirectoryForm();
8983
$create_subdir_form = $this->app->forms->createSubdirectoryForm();
9084

91-
$this->handleForms($rename_form, $copy_data_form);
85+
$copy_data_form = $this->app->forms->copyUploadSubdirectoryDataForm();
9286

9387
$menu_node_modules_names_to_reload = [
9488
ModulesController::MODULE_NAME_IMAGES,
@@ -107,62 +101,4 @@ private function renderSettingsPage(bool $ajax_render, Request $request){
107101
return $this->render(static::TWIG_TEMPLATE_FILE_UPLOAD_SETTINGS, $data);
108102
}
109103

110-
/**
111-
* @param FormInterface $rename_form
112-
* @param FormInterface $copy_data_form
113-
* @throws Exception
114-
*/
115-
private function handleForms(FormInterface $rename_form, FormInterface $copy_data_form){
116-
117-
if($rename_form->isSubmitted() && $rename_form->isValid()) {
118-
$form_data = $rename_form->getData();
119-
$new_name = $form_data[FileUploadController::KEY_SUBDIRECTORY_NEW_NAME];
120-
$upload_module_dir = $form_data[FileUploadController::KEY_UPLOAD_MODULE_DIR];
121-
$current_directory_path_in_module_upload_dir = $form_data[FileUploadController::KEY_SUBDIRECTORY_CURRENT_PATH_IN_MODULE_UPLOAD_DIR];
122-
123-
$response = $this->controllers->getFilesUploadSettingsController()->renameSubdirectory($upload_module_dir, $current_directory_path_in_module_upload_dir, $new_name);
124-
}
125-
126-
if($copy_data_form->isSubmitted() && $copy_data_form->isValid()) {
127-
$form_data = $copy_data_form->getData();
128-
$current_upload_module_dir = $form_data[FilesHandler::KEY_CURRENT_UPLOAD_MODULE_DIR];
129-
$target_upload_module_dir = $form_data[FilesHandler::KEY_TARGET_MODULE_UPLOAD_DIR];
130-
131-
$current_directory_path_in_module_upload_dir = $form_data[FileUploadController::KEY_SUBDIRECTORY_CURRENT_PATH_IN_MODULE_UPLOAD_DIR];
132-
$target_directory_path_in_module_upload_dir = $form_data[FileUploadController::KEY_SUBDIRECTORY_TARGET_PATH_IN_MODULE_UPLOAD_DIR];
133-
134-
if( $form_data[UploadSubdirectoryCopyDataType::KEY_MOVE_FOLDER] ){
135-
136-
$upload_dirs = Env::getUploadDirs();
137-
$current_folder_path = $current_directory_path_in_module_upload_dir;
138-
$target_folder_path = $target_directory_path_in_module_upload_dir;
139-
140-
//if not main folder then add upload dir
141-
if( !in_array($current_directory_path_in_module_upload_dir, $upload_dirs) ){
142-
$current_folder_path = Env::getUploadDir() . DIRECTORY_SEPARATOR . $current_upload_module_dir . DIRECTORY_SEPARATOR . $current_directory_path_in_module_upload_dir;
143-
}
144-
145-
//if not main folder then add upload dir
146-
if( !in_array($target_directory_path_in_module_upload_dir, $upload_dirs) ){
147-
$target_folder_path = Env::getUploadDir() . DIRECTORY_SEPARATOR . $target_upload_module_dir . DIRECTORY_SEPARATOR . $target_directory_path_in_module_upload_dir;
148-
}
149-
150-
$response = $this->directories_handler->moveDirectory($current_folder_path, $target_folder_path);
151-
}else{
152-
$response = $this->files_handler->copyData(
153-
$current_upload_module_dir, $target_upload_module_dir, $current_directory_path_in_module_upload_dir, $target_directory_path_in_module_upload_dir
154-
);
155-
}
156-
157-
}
158-
159-
if( isset($response) ){
160-
$flashType = Utils::getFlashTypeForRequest($response);
161-
$message = $response->getContent();
162-
163-
$this->addFlash($flashType, $message);
164-
}
165-
166-
}
167-
168104
}

src/assets/scripts/core/ui/DataProcessor/SpecialAction.ts

+64
Original file line numberDiff line numberDiff line change
@@ -465,4 +465,68 @@ export default class SpecialAction extends AbstractDataProcessor {
465465
processorName: "Tags"
466466
};
467467

468+
public static CopyDataBetweenFolders: DataProcessorInterface = {
469+
makeCopyData($baseElement?: JQuery<HTMLElement>): DataProcessorDto | null {
470+
return null;
471+
}, makeRemoveData($baseElement?: JQuery<HTMLElement>): DataProcessorDto | null {
472+
return null;
473+
}, makeUpdateData($baseElement?: JQuery<HTMLElement>): DataProcessorDto | null {
474+
let url = '/files/actions/move-or-copy-data-between-folders';
475+
let successMessage = AbstractDataProcessor.messages.entityCreatedRecordSuccess(SpecialAction.RenameFolder.processorName);
476+
let failMessage = AbstractDataProcessor.messages.entityCreatedRecordFail(SpecialAction.RenameFolder.processorName);
477+
478+
let currentUploadModuleDir = $baseElement.find('.current-upload-module-dir select').val();
479+
let targetUploadModuleDir = $baseElement.find('.target-upload-module-dir select').val();
480+
let subdirectoryCurrentPathInModuleUploadDir = $baseElement.find('.subdirectory-current-path-in-module-upload-dir select').val();
481+
let subdirectoryTargetPathInModuleUploadDir = $baseElement.find('.subdirectory-target-path-in-module-upload-dir select').val();
482+
let moveFolder = $baseElement.find('.move-folder-checkbox-wrapper input').prop('checked');
483+
484+
let ajaxData = {
485+
current_upload_module_dir : currentUploadModuleDir,
486+
target_upload_module_dir : targetUploadModuleDir,
487+
subdirectory_current_path_in_module_upload_dir : subdirectoryCurrentPathInModuleUploadDir,
488+
subdirectory_target_path_in_module_upload_dir : subdirectoryTargetPathInModuleUploadDir,
489+
move_folder : moveFolder
490+
};
491+
492+
let callback = (dataCallbackParams) => {
493+
let ajax = new Ajax();
494+
let ajaxEvents = new AjaxEvents();
495+
496+
if(
497+
null !== dataCallbackParams
498+
&& "undefined" !== typeof dataCallbackParams
499+
){
500+
let menuNodeModuleName = dataCallbackParams.menuNodeModuleName;
501+
let menuNodeModulesNamesToReload = dataCallbackParams.menuNodeModulesNamesToReload;
502+
503+
if( !StringUtils.isEmptyString(menuNodeModuleName)){
504+
ajax.singleMenuNodeReload(menuNodeModuleName);
505+
}else if( !StringUtils.isEmptyString(menuNodeModulesNamesToReload) ){
506+
let arrayOfMenuNodeModuleNames = JSON.parse(menuNodeModulesNamesToReload);
507+
$.each(arrayOfMenuNodeModuleNames, function(index, menuNodeModuleName){
508+
ajax.singleMenuNodeReload(menuNodeModuleName);
509+
})
510+
}
511+
}
512+
513+
BootboxWrapper.hideAll();
514+
ajaxEvents.loadModuleContentByUrl(Navigation.getCurrentUri());
515+
};
516+
517+
let dataProcessorsDto = new DataProcessorDto();
518+
dataProcessorsDto.url = url;
519+
dataProcessorsDto.successMessage = successMessage;
520+
dataProcessorsDto.failMessage = failMessage;
521+
dataProcessorsDto.callback = callback;
522+
dataProcessorsDto.ajaxData = ajaxData;
523+
524+
return dataProcessorsDto;
525+
},
526+
makeCreateData: function (): DataProcessorDto | null {
527+
return null
528+
},
529+
processorName: "Rename folder"
530+
};
531+
468532
}

src/assets/translations/en/forms.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ forms:
203203
currentSubdirectoryInModuleUploadDir: Target folder
204204
targetUploadModuleDir: Upload module
205205
targetSubdirectoryInModuleUploadDir: Target folder
206-
moveInsteadOfCopying: Move instead of copying
206+
moveInsteadOfCopying: Move entire folder instead of copying files
207207
UploadSubdirectoryCreateType:
208208
labels:
209209
uploadModuleDir: Upload module
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
page:
22
title: Personal Management System (PMS)
3-
footerCopyright: Copyright © 2019 Built by
3+
footerCopyright: Copyright © 2019-2020 Built by

0 commit comments

Comments
 (0)