Implemented file type filters

This commit is contained in:
alekseybobkov 2015-03-16 20:32:51 -07:00
parent e86a463e49
commit a040fa4c68
5 changed files with 128 additions and 43 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -0,0 +1,37 @@
<ul class="nav nav-stacked selector-group">
<li role="presentation" <?php if ($currentFilter == Cms\Widgets\MediaManager::FILTER_EVERYTHING): ?>class="active"<?php endif ?>>
<a href="#" data-command="set-filter" data-filter="<?= Cms\Widgets\MediaManager::FILTER_EVERYTHING ?>">
<i class="icon-recycle"></i>
<?= e(trans('cms::lang.media.filter_everything')) ?>
</a>
</li>
<li role="presentation" <?php if ($currentFilter == Cms\Classes\MediaLibraryItem::FILE_TYPE_IMAGE): ?>class="active"<?php endif ?>>
<a href="#" data-command="set-filter" data-filter="<?= Cms\Classes\MediaLibraryItem::FILE_TYPE_IMAGE ?>">
<i class="icon-picture-o"></i>
<?= e(trans('cms::lang.media.filter_images')) ?>
</a>
</li>
<li role="presentation" <?php if ($currentFilter == Cms\Classes\MediaLibraryItem::FILE_TYPE_VIDEO): ?>class="active"<?php endif ?>>
<a href="#" data-command="set-filter" data-filter="<?= Cms\Classes\MediaLibraryItem::FILE_TYPE_VIDEO ?>">
<i class="icon-video-camera"></i>
<?= e(trans('cms::lang.media.filter_video')) ?>
</a>
</li>
<li role="presentation" <?php if ($currentFilter == Cms\Classes\MediaLibraryItem::FILE_TYPE_AUDIO): ?>class="active"<?php endif ?>>
<a href="#" data-command="set-filter" data-filter="<?= Cms\Classes\MediaLibraryItem::FILE_TYPE_AUDIO ?>">
<i class="icon-volume-up"></i>
<?= e(trans('cms::lang.media.filter_audio')) ?>
</a>
</li>
<li role="presentation" <?php if ($currentFilter == Cms\Classes\MediaLibraryItem::FILE_TYPE_DOCUMENT): ?>class="active"<?php endif ?>>
<a href="#" data-command="set-filter" data-filter="<?= Cms\Classes\MediaLibraryItem::FILE_TYPE_DOCUMENT ?>">
<i class="icon-file"></i>
<?= e(trans('cms::lang.media.filter_documents')) ?>
</a>
</li>
</ul>

View File

@ -1,39 +1,5 @@
<h3 class="section">Display</h3>
<ul class="nav nav-stacked selector-group">
<li role="presentation" class="active">
<a href="#">
<i class="icon-recycle"></i>
<?= e(trans('cms::lang.media.filter_everything')) ?>
</a>
</li>
<li role="presentation">
<a href="#">
<i class="icon-picture-o"></i>
<?= e(trans('cms::lang.media.filter_images')) ?>
</a>
</li>
<li role="presentation">
<a href="#">
<i class="icon-video-camera"></i>
<?= e(trans('cms::lang.media.filter_video')) ?>
</a>
</li>
<li role="presentation">
<a href="#">
<i class="icon-volume-up"></i>
<?= e(trans('cms::lang.media.filter_audio')) ?>
</a>
</li>
<li role="presentation">
<a href="#">
<i class="icon-file"></i>
<?= e(trans('cms::lang.media.filter_documents')) ?>
</a>
</li>
</ul>
<div id="<?= $this->getId('filters') ?>">
<?= $this->makePartial('filters') ?>
</div>