From 59efcb63a334b70b3f392a4eea18c67e79ac4a21 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Mon, 13 Apr 2015 10:35:45 +0200 Subject: [PATCH] fix filepicker * add ability to filter for mimetype * fixes #15526 * fixes #11563 --- apps/files/ajax/list.php | 26 ++++++++++++++++++++++++-- apps/files/lib/helper.php | 5 +++-- core/js/oc-dialogs.js | 2 +- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php index 8daea6ca3f..19129e9de1 100644 --- a/apps/files/ajax/list.php +++ b/apps/files/ajax/list.php @@ -45,10 +45,32 @@ try { $sortAttribute = isset($_GET['sort']) ? (string)$_GET['sort'] : 'name'; $sortDirection = isset($_GET['sortdirection']) ? ($_GET['sortdirection'] === 'desc') : false; + $mimetypeFilters = isset($_GET['mimetypes']) ? json_decode($_GET['mimetypes']) : ''; - // make filelist + $files = []; + // Clean up duplicates from array + if (is_array($mimetypeFilters) && count($mimetypeFilters)) { + $mimetypeFilters = array_unique($mimetypeFilters); + + if (!in_array('httpd/unix-directory', $mimetypeFilters)) { + // append folder filter to be able to browse folders + $mimetypeFilters[] = 'httpd/unix-directory'; + } + + // create filelist with mimetype filter - as getFiles only supports on + // mimetype filter at once we will filter this folder for each + // mimetypeFilter + foreach ($mimetypeFilters as $mimetypeFilter) { + $files = array_merge($files, \OCA\Files\Helper::getFiles($dir, $sortAttribute, $sortDirection, $mimetypeFilter)); + } + + // sort the files accordingly + $files = \OCA\Files\Helper::sortFiles($files, $sortAttribute, $sortDirection); + } else { + // create file list without mimetype filter + $files = \OCA\Files\Helper::getFiles($dir, $sortAttribute, $sortDirection); + } - $files = \OCA\Files\Helper::getFiles($dir, $sortAttribute, $sortDirection); $files = \OCA\Files\Helper::populateTags($files); $data['directory'] = $dir; $data['files'] = \OCA\Files\Helper::formatFileInfos($files); diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php index cc1b2d3cfb..e966e60d00 100644 --- a/apps/files/lib/helper.php +++ b/apps/files/lib/helper.php @@ -196,10 +196,11 @@ class Helper { * @param string $dir path to the directory * @param string $sortAttribute attribute to sort on * @param bool $sortDescending true for descending sort, false otherwise + * @param string $mimetypeFilter limit returned content to this mimetype or mimepart * @return \OCP\Files\FileInfo[] files */ - public static function getFiles($dir, $sortAttribute = 'name', $sortDescending = false) { - $content = \OC\Files\Filesystem::getDirectoryContent($dir); + public static function getFiles($dir, $sortAttribute = 'name', $sortDescending = false, $mimetypeFilter = '') { + $content = \OC\Files\Filesystem::getDirectoryContent($dir, $mimetypeFilter); return self::sortFiles($content, $sortAttribute, $sortDescending); } diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index df139ed979..afd7debb69 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -138,7 +138,7 @@ var OCdialogs = { * @param title dialog title * @param callback which will be triggered when user presses Choose * @param multiselect whether it should be possible to select multiple files - * @param mimetypeFilter mimetype to filter by + * @param mimetypeFilter mimetype to filter by - directories will always be included * @param modal make the dialog modal */ filepicker:function(title, callback, multiselect, mimetypeFilter, modal) {