Implemented file type filters
This commit is contained in:
parent
e86a463e49
commit
a040fa4c68
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
Loading…
Reference in New Issue