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${config.param_sep}clearMediaCache`, { method: 'post', body }, () => { filterFiles(); }); }); } /* handle loading media */ var loadMedia = function loadMedia(filters, callback) { var url = `${config.base_url_relative}/media.json/tmpl${config.param_sep}media-list-content/index${config.param_sep}${global_index}`; if (filters.page) { url += `/page${config.param_sep}${(filters.page).split('/').join('%5C')}`; } if (filters.type && filters.type !== '*') { url += `/type${config.param_sep}${filters.type}`; } if (filters.date && filters.date !== '*') { url += `/date${config.param_sep}${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('
No media found
'); }; 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(); } });