From 3b0093cd9b29864320f09ddeba783ee390107cbb Mon Sep 17 00:00:00 2001 From: Julien Veyssier Date: Mon, 27 Mar 2017 14:46:04 -0300 Subject: [PATCH] refs #3 add button to load all compatible files in a folder --- appinfo/routes.php | 1 + controller/pagecontroller.php | 46 +++++++++++++++++++- css/gpxedit.css | 4 +- js/gpxedit.js | 82 +++++++++++++++++++++++++++++++++++ l10n/fr.json | 3 +- templates/gpxcontent.php | 3 +- 6 files changed, 134 insertions(+), 5 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index 6dbd853..c07e340 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -21,6 +21,7 @@ return [ 'routes' => [ ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'], ['name' => 'page#getgpx', 'url' => '/getgpx', 'verb' => 'POST'], + ['name' => 'page#getfoldergpxs', 'url' => '/getfoldergpxs', 'verb' => 'POST'], ['name' => 'page#savegpx', 'url' => '/savegpx', 'verb' => 'POST'], ['name' => 'utils#addTileServer', 'url' => '/addTileServer', 'verb' => 'POST'], ['name' => 'utils#deleteTileServer', 'url' => '/deleteTileServer', 'verb' => 'POST'], diff --git a/controller/pagecontroller.php b/controller/pagecontroller.php index dac3e2a..168e2ed 100644 --- a/controller/pagecontroller.php +++ b/controller/pagecontroller.php @@ -176,7 +176,7 @@ class PageController extends Controller { /** * convert the given file (csv or kml) to gpx and return its content */ - public function toGpx($file){ + private function toGpx($file){ $gpsbabel_path = getProgramPath('gpsbabel'); $data_folder = $this->userAbsoluteDataPath; $tempdir = $data_folder.'/../cache/'.rand(); @@ -263,6 +263,50 @@ class PageController extends Controller { return $response; } + /** + * + * @NoAdminRequired + * @NoCSRFRequired + */ + public function getfoldergpxs($path) { + $userFolder = \OC::$server->getUserFolder(); + $cleanpath = str_replace(array('../', '..\\'), '', $path); + $gpxs = Array(); + if ($userFolder->nodeExists($cleanpath)){ + $folder = $userFolder->get($cleanpath); + if ($folder->getType() === \OCP\Files\FileInfo::TYPE_FOLDER){ + foreach ($folder->getDirectoryListing() as $file) { + if ($file->getType() === \OCP\Files\FileInfo::TYPE_FILE) { + if (endswith($file->getName(), '.GPX') or endswith($file->getName(), '.gpx')){ + $gpxContent = $file->getContent(); + array_push($gpxs, $gpxContent); + } + else if (getProgramPath('gpsbabel') !== null and + (endswith($file->getName(), '.KML') or endswith($file->getName(), '.kml') or + endswith($file->getName(), '.JPG') or endswith($file->getName(), '.jpg') or + endswith($file->getName(), '.CSV') or endswith($file->getName(), '.csv')) + ){ + $gpxContent = $this->toGpx($file); + array_push($gpxs, $gpxContent); + } + } + } + } + } + + $response = new DataResponse( + [ + 'gpxs'=>$gpxs + ] + ); + $csp = new ContentSecurityPolicy(); + $csp->addAllowedImageDomain('*') + ->addAllowedMediaDomain('*') + ->addAllowedConnectDomain('*'); + $response->setContentSecurityPolicy($csp); + return $response; + } + /** * * @NoAdminRequired diff --git a/css/gpxedit.css b/css/gpxedit.css index 75eefda..8ca99b5 100644 --- a/css/gpxedit.css +++ b/css/gpxedit.css @@ -798,12 +798,12 @@ h2.popupTitle{ #clearButton i{ color: red; } -#saveButton, #loadButton{ +#saveButton, #loadButton, #loadFolderButton{ display:block; margin-left: auto; margin-right: auto; } -#loadButton i{ +#loadButton i, #loadFolderButton i{ color: blue; } #saveNameLabel, #savePathLabel{ diff --git a/js/gpxedit.js b/js/gpxedit.js index e557f66..76bd9ef 100644 --- a/js/gpxedit.js +++ b/js/gpxedit.js @@ -953,6 +953,74 @@ $('#saving').hide(); } + function loadFolderAction(folder) { + loadFolder(folder); + // set save name + var spl = folder.split('/'); + var basename = spl[spl.length - 1]; + $('input#saveName').val(basename); + } + + function loadFolder(folder) { + var req = { + path: folder + }; + var url = OC.generateUrl('/apps/gpxedit/getfoldergpxs'); + $('#loadingpc').text('0'); + showLoadingAnimation(); + gpxedit.currentAjax = $.ajax({ + type: 'POST', + async: true, + url: url, + data: req, + xhr: function() { + var xhr = new window.XMLHttpRequest(); + xhr.addEventListener('progress', function(evt) { + if (evt.lengthComputable) { + var percentComplete = evt.loaded / evt.total * 100; + $('#loadingpc').text(parseInt(percentComplete)); + } + }, false); + + return xhr; + } + }).done(function (response) { + var i; + if ($('#clearbeforeload').is(':checked')) { + clear(); + } + console.log(Object.keys(response)); + console.log('len : '+response.gpxs.length); + if (response.gpxs.length === 0) { + OC.dialogs.alert('The folder does not exist or does not contain any compatible file', + 'Load folder error'); + } + else { + for (i = 0; i < response.gpxs.length; i++) { + parseGpx(response.gpxs[i]); + } + try { + var bounds = gpxedit.editableLayers.getBounds(); + gpxedit.map.fitBounds( + bounds, + { + animate: true, + paddingTopLeft: [parseInt($('#sidebar').css('width')), 0] + } + ); + } + catch (err) { + console.log('Impossible to fit to bounds \n'+err); + } + } + hideLoadingAnimation(); + }).fail(function (){ + OC.dialogs.alert('Failed to communicate with the server', + 'Load folder error'); + hideLoadingAnimation(); + }); + } + function loadAction(file) { if ( !endsWith(file, '.gpx') && !endsWith(file, '.kml') @@ -1441,6 +1509,20 @@ ); }); + $('button#loadFolderButton').click(function(e) { + if (gpxedit.currentAjax !== null) { + gpxedit.currentAjax.abort(); + hideLoadingAnimation(); + } + OC.dialogs.filepicker( + t('gpxedit', 'Load folder (all compatible file inside)'), + function(targetPath) { + loadFolderAction(targetPath); + }, + false, "httpd/unix-directory", true + ); + }); + $('button#saveButton').click(function(e) { if (gpxedit.editableLayers.getLayers().length === 0) { showFailAnimation(t('gpxedit', 'There is nothing to save')); diff --git a/l10n/fr.json b/l10n/fr.json index f565333..a11546f 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -3,7 +3,8 @@ "loading file" : "chargement du fichier", "Choose directory and save" : "Choisir un dossier et sauver", "About GpxEdit" : "À propos de GpxEdit", - "Load" : "Charger", + "Load file" : "Charger un fichier", + "Load directory" : "Charger un dossier", "Save" : "Enregistrer", "Select a file to load it on the map" : "Sélectionner un fichier pour le charger sur la carte", "Select a folder, set a name and click \"Save\" button" : "Sélectionner un dossier, entrer un nom et cliquer sur le bouton \"Enregistrer\"", diff --git a/templates/gpxcontent.php b/templates/gpxcontent.php index 1972d24..4fddd00 100644 --- a/templates/gpxcontent.php +++ b/templates/gpxcontent.php @@ -24,7 +24,8 @@ p($_['gpxedit_version']);

- + +

t('Save'));?>