123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- import $ from 'jquery';
- import { config, uri_params } from 'grav-config';
- import request from '../utils/request';
- export default class Filter {
- constructor() {
- this.URI = `${config.base_url_relative}/media-manager/`;
- }
- filter(name, value) {
- let filtered = [];
- let keys = Object.keys(uri_params);
- if (!~keys.indexOf(name)) { keys.push(name); }
- keys.forEach((key) => {
- let filter = Filter.cleanValue(key === name ? value : uri_params[key]);
- if (filter !== '*') {
- filtered.push(`${key}${config.param_sep}${filter}`);
- }
- });
- global.location = this.URI + filtered.join('/');
- }
- static cleanValue(value) {
- return encodeURIComponent(value.replace('/', '\\'));
- }
- }
- export let Instance = new Filter();
- var isLoading = false;
- var filters = {};
- var global_index = 1;
- var files_ended = false;
- const MEDIA_PAGINATION_INTERVAL = 20;
- /* handle changing file type / date filter */
- $('body').on('change', '.thumbs-list-container select.filter', (event) => {
- let target = $(event.currentTarget);
- let filterName = target.data('name');
- let filterValue = target.val();
- if (filterValue) {
- filters[filterName] = filterValue;
- } else {
- delete filters[filterName];
- }
- filterFiles();
- });
- /* initialize media uploader */
- if ($('.thumbs-list-container .dropzone')[0]) {
- $('.thumbs-list-container .dropzone')[0].dropzone.on('queuecomplete', function() {
- let body = {};
- if (filters.page) { body.page = filters.page; }
- if (filters.date) { body.date = filters.date; }
- if (filters.type) { body.type = filters.type; }
- $('.dropzone')[0].dropzone.files.forEach(function(file) { file.previewElement.remove(); });
- $('.dropzone').first().removeClass('dz-started');
- request(config.base_url_relative + '/media-manager.json/task:clearMediaCache', { method: 'post', body }, () => {
- filterFiles();
- });
- });
- }
- /* handle loading media */
- var loadMedia = function loadMedia(filters, callback) {
- var url = config.base_url_relative + '/media.json/tmpl:media-list-content/index:' + global_index;
- if (filters.page) {
- url += '/page:' + (filters.page).split('/').join('%5C');
- }
- if (filters.type && filters.type !== '*') {
- url += '/type:' + filters.type;
- }
- if (filters.date && filters.date !== '*') {
- url += '/date:' + filters.date;
- }
- if (!isLoading) {
- isLoading = true;
- $('.spinning-wheel').show();
- $.get(url, function(content) {
- $('.js__files').append(content);
- $('.spinning-wheel').hide();
- $('.media-container .media-range').trigger('change');
- isLoading = false;
- global_index++;
- callback(content);
- });
- }
- };
- var cleanFilesList = function cleanFilesList() {
- $('.js__files .card-item').remove();
- };
- var resetActiveStateInSidebar = function resetActiveStateInSidebar() {
- $('.pages-list-container .row').removeClass('active'); // clear active state in sidebar
- };
- var showEmptyState = function showEmptyState() {
- $('.thumbs-list-container').append('<p class="card-item empty-space">No media found</p>');
- };
- var filterFiles = function filterFiles() {
- cleanFilesList();
- global_index = 0;
- files_ended = false;
- $('.empty-space').remove();
- loadMedia(filters, function(content) {
- if (!content.trim().length) {
- showEmptyState();
- } else {
- if (!filters.page && (!filters.date || filters.date === '*') && (!filters.type || filters.type === '*')) {
- $('.js__files').trigger('fillView');
- }
- }
- });
- };
- /* handle changing page */
- $('body').on('click', '.pages-list-container .js__page-link', (event) => {
- var page = $(event.target).data('page');
- filters['page'] = page;
- $('.media-list-title .page-indicator').html(page); // set indication
- $('.js__reset-pages-filter').removeClass('hidden'); // activate reset pages icon
- resetActiveStateInSidebar();
- $(event.target).parents('.row').addClass('active'); // set active state in sidebar
- $('.js__file-uploader').removeClass('hidden');
- // customize processing URL, as the page changes dynamically
- if ($('.dropzone')[0]) {
- $('.dropzone')[0].dropzone.on('processing', function(file) {
- this.options.url = `${config.base_url_relative}/media-manager${page}.json/task${config.param_sep}addmedia`;
- });
- }
- $('.js__button-clear-media-cache').addClass('hidden');
- filterFiles();
- disableInfiniteScrolling(); // only infinite scroll on main list, not inside single pages
- });
- /* handle clearing page filter */
- $('body').on('click', '.js__reset-pages-filter', (event) => {
- $('.media-list-title .page-indicator').html('All Pages'); // set indication
- cleanFilesList();
- resetActiveStateInSidebar();
- $('.js__reset-pages-filter').addClass('hidden'); // remove reset pages icon
- $('.js__file-uploader').addClass('hidden');
- $('.js__button-clear-media-cache').removeClass('hidden');
- delete filters['page'];
- filterFiles();
- });
- /* handle infinite loading */
- var enableInfiniteScrolling = function enableInfiniteScrolling() {
- $('.spinning-wheel').hide();
- var view = $('.mediapicker-scroll').last();
- var gemini = view.data('scrollbar');
- if (gemini) {
- gemini = gemini.getViewElement();
- }
- if (!gemini || !gemini.length && !view.length) { return; }
- $(gemini || view).on('scroll', function() {
- if (($(this).scrollTop() + $(this).innerHeight() + 100) >= $(this)[0].scrollHeight) {
- fillView();
- }
- });
- };
- var loadNextBatch = function loadNextBatch(callback) {
- if (files_ended) {
- return;
- }
- loadMedia({}, function(content) {
- if (!$(content).length || ((content.split('card-item').length - 1) < MEDIA_PAGINATION_INTERVAL)) {
- files_ended = true;
- } else {
- if (callback) {
- callback();
- }
- }
- $('.media-container .media-range').trigger('input');
- });
- };
- var fillView = function fillView() {
- if (!$('.js__files').find('.card-item').last().offset()) {
- setTimeout(function() {
- // retry later
- fillView();
- }, 300);
- return;
- }
- if ($('.js__files').find('.card-item').last().offset().top - 1 <= $('.media-container').height()) {
- loadNextBatch(function() {
- fillView();
- });
- }
- };
- /* disable infinite loading */
- var disableInfiniteScrolling = function disableInfiniteScrolling() {
- $('.spinning-wheel').hide();
- $('.content-wrapper').unbind('scroll');
- };
- $('.js__files').on('fillView', function(event) {
- // the first batch got the max number of media files, try loading more
- if (($('.js__files')[0].innerHTML.split('card-item').length - 1) === MEDIA_PAGINATION_INTERVAL) {
- fillView();
- enableInfiniteScrolling();
- }
- });
|