diff --git a/modules/cms/classes/MediaLibrary.php b/modules/cms/classes/MediaLibrary.php index 3dec257ff..624d20d9a 100644 --- a/modules/cms/classes/MediaLibrary.php +++ b/modules/cms/classes/MediaLibrary.php @@ -69,8 +69,11 @@ class MediaLibrary * @param string $folder Specifies the folder path relative the the Library root. * @param string $sortBy Determines the sorting preference. * Supported values are 'title', 'size', 'lastModified' (see SORT_BY_XXX class constants). + * @param string $filter Determines the document type filtering preference. + * Supported values are 'image', 'video', 'audio', 'document' (see FILE_TYPE_XXX constants of MediaLibraryItem class). + * @return array Returns an array of MediaLibraryItem objects. */ - public function listFolderContents($folder = '/', $sortBy = 'title') + public function listFolderContents($folder = '/', $sortBy = 'title', $filter = null) { $folder = self::validatePath($folder); $fullFolderPath = $this->getMediaPath($folder); @@ -100,6 +103,7 @@ class MediaLibrary $this->sortItemList($folderContents['files'], $sortBy); $this->sortItemList($folderContents['folders'], $sortBy); + $this->filterItemList($folderContents['files'], $filter); $folderContents = array_merge($folderContents['folders'], $folderContents['files']); @@ -320,6 +324,26 @@ class MediaLibrary }); } + /** + * Filters item list by file type. + * @param array $itemList Specifies the item list to sort. + * @param string $filter Determines the document type filtering preference. + * Supported values are 'image', 'video', 'audio', 'document' (see FILE_TYPE_XXX constants of MediaLibraryItem class). + */ + protected function filterItemList(&$itemList, $filter) + { + if (!$filter) + return; + + $result = []; + foreach ($itemList as $item) { + if ($item->getFileType() == $filter) + $result[] = $item; + } + + $itemList = $result; + } + /** * Initializes and returns the Media Library disk. * This method should always be used instead of trying to access the diff --git a/modules/cms/widgets/MediaManager.php b/modules/cms/widgets/MediaManager.php index b0a4a8201..89e6dcdfd 100644 --- a/modules/cms/widgets/MediaManager.php +++ b/modules/cms/widgets/MediaManager.php @@ -28,6 +28,8 @@ class MediaManager extends WidgetBase const VIEW_MODE_LIST = 'list'; const VIEW_MODE_TILES = 'tiles'; + const FILTER_EVERYTHING = 'everything'; + protected $brokenImageHash = null; public function __construct($controller, $alias) @@ -142,6 +144,23 @@ class MediaManager extends WidgetBase ]; } + public function onSetFilter() + { + $filter = Input::get('filter'); + $path = Input::get('path'); + + $this->setFilter($filter); + $this->setCurrentFolder($path); + + $this->prepareVars(); + + return [ + '#'.$this->getId('item-list') => $this->makePartial('item-list'), + '#'.$this->getId('folder-path') => $this->makePartial('folder-path'), + '#'.$this->getId('filters') => $this->makePartial('filters') + ]; + } + // // Methods for th internal use // @@ -152,19 +171,22 @@ class MediaManager extends WidgetBase $folder = $this->getCurrentFolder(); $viewMode = $this->getViewMode(); + $filter = $this->getFilter(); - $this->vars['items'] = $this->listFolderItems($folder); + $this->vars['items'] = $this->listFolderItems($folder, $filter); $this->vars['currentFolder'] = $folder; $this->vars['isRootFolder'] = $folder == self::FOLDER_ROOT; $this->vars['pathSegments'] = $this->splitPathToSegments($folder); $this->vars['viewMode'] = $viewMode; - $this->vars['thumbnailParams'] = $this->getThumbnailParams($viewMode); + $this->vars['currentFilter'] = $filter; } - protected function listFolderItems($folder) + protected function listFolderItems($folder, $filter) { - return MediaLibrary::instance()->listFolderContents($folder); + $filter = $filter !== self::FILTER_EVERYTHING ? $filter : null; + + return MediaLibrary::instance()->listFolderContents($folder, null, $filter); } protected function getCurrentFolder() @@ -174,6 +196,24 @@ class MediaManager extends WidgetBase return $folder; } + protected function getFilter() + { + return $this->getSession('media_filter', self::FILTER_EVERYTHING); + } + + protected function setFilter($filter) + { + if (!in_array($filter, [ + self::FILTER_EVERYTHING, + MediaLibraryItem::FILE_TYPE_IMAGE, + MediaLibraryItem::FILE_TYPE_AUDIO, + MediaLibraryItem::FILE_TYPE_DOCUMENT, + MediaLibraryItem::FILE_TYPE_VIDEO])) + throw new SystemException('Invalid input data'); + + return $this->putSession('media_filter', $filter); + } + protected function setCurrentFolder($path) { $path = MediaLibrary::validatePath($path); diff --git a/modules/cms/widgets/mediamanager/assets/js/mediamanager.js b/modules/cms/widgets/mediamanager/assets/js/mediamanager.js index db746ca8e..011d9a869 100644 --- a/modules/cms/widgets/mediamanager/assets/js/mediamanager.js +++ b/modules/cms/widgets/mediamanager/assets/js/mediamanager.js @@ -136,6 +136,21 @@ }).done(this.afterNavigateBound) } + MediaManager.prototype.setFilter = function(filter) { + $.oc.stripeLoadIndicator.show() + + var data = { + filter: filter, + path: this.$el.find('[data-type="current-folder"]').val() + } + + this.$form.request(this.options.alias+'::onSetFilter', { + data: data + }).always(function() { + $.oc.stripeLoadIndicator.hide() + }).done(this.afterNavigateBound) + } + // // Selecting // @@ -614,7 +629,7 @@ this.refresh() break; case 'change-view' : - this.changeView($(ev.target).data('view')) + this.changeView($(ev.currentTarget).data('view')) break; case 'cancel-uploading' : this.uploadCancelAll() @@ -622,6 +637,9 @@ case 'close-uploader': this.hideUploadUi() break; + case 'set-filter': + this.setFilter($(ev.currentTarget).data('filter')) + break; } return false diff --git a/modules/cms/widgets/mediamanager/partials/_filters.htm b/modules/cms/widgets/mediamanager/partials/_filters.htm new file mode 100644 index 000000000..34a7fd1d2 --- /dev/null +++ b/modules/cms/widgets/mediamanager/partials/_filters.htm @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/modules/cms/widgets/mediamanager/partials/_left-sidebar.htm b/modules/cms/widgets/mediamanager/partials/_left-sidebar.htm index 3d24174f1..770a27a77 100644 --- a/modules/cms/widgets/mediamanager/partials/_left-sidebar.htm +++ b/modules/cms/widgets/mediamanager/partials/_left-sidebar.htm @@ -1,39 +1,5 @@

Display

- \ No newline at end of file +
+ makePartial('filters') ?> +
\ No newline at end of file