You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
6.5 KiB
292 lines
6.5 KiB
5 years ago
|
/**
|
||
|
* Nextcloud - Gallery
|
||
|
*
|
||
|
*
|
||
|
* This file is licensed under the Affero General Public License version 3 or
|
||
|
* later. See the COPYING file.
|
||
|
*
|
||
|
* @author Olivier Paroz <galleryapps@oparoz.com>
|
||
|
*
|
||
|
* @copyright Olivier Paroz 2017
|
||
|
*/
|
||
|
/* global Gallery */
|
||
|
(function ($, Gallery) {
|
||
|
"use strict";
|
||
|
/**
|
||
|
* Stores the gallery configuration
|
||
|
*
|
||
|
* @param {{features: string[], mediatypes: string[]}} config
|
||
|
* @constructor
|
||
|
*/
|
||
|
var Config = function (config) {
|
||
|
this.galleryFeatures = this._setGalleryFeatures(config.features);
|
||
|
this.mediaTypes = this._setMediaTypes(config.mediatypes);
|
||
|
};
|
||
|
|
||
|
Config.prototype = {
|
||
|
galleryFeatures: [],
|
||
|
cachedFeaturesString: '',
|
||
|
mediaTypes: [],
|
||
|
cachedMediaTypesString: '',
|
||
|
albumInfo: null,
|
||
|
albumSorting: null,
|
||
|
albumDesign: null,
|
||
|
albumError: false,
|
||
|
infoLoaded: false,
|
||
|
|
||
|
/**
|
||
|
* Returns the list of supported features in a string
|
||
|
*
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
getFeatures: function () {
|
||
|
return this.cachedFeaturesString;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Returns the list of supported media types in a string
|
||
|
*
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
getMediaTypes: function () {
|
||
|
return this.cachedMediaTypesString;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Stores the configuration about the current album
|
||
|
*
|
||
|
* @param {{
|
||
|
* design,
|
||
|
* information,
|
||
|
* sorting,
|
||
|
* error: string
|
||
|
* }} albumConfig
|
||
|
* @param albumPath
|
||
|
*/
|
||
|
setAlbumConfig: function (albumConfig, albumPath) {
|
||
|
this.albumInfo = this._setAlbumInfo(albumConfig, albumPath);
|
||
|
this.albumSorting = this._setAlbumSorting(albumConfig);
|
||
|
this.albumDesign = this._setAlbumDesign(albumConfig);
|
||
|
this.albumError = albumConfig.error;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Updates the sorting order
|
||
|
*/
|
||
|
updateAlbumSorting: function (sortConfig) {
|
||
|
this.albumSorting = {
|
||
|
type: sortConfig.type,
|
||
|
order: sortConfig.order,
|
||
|
albumOrder: sortConfig.albumOrder
|
||
|
};
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Saves the list of features which have been enabled in the app
|
||
|
*
|
||
|
* @param {string[]} configFeatures
|
||
|
*
|
||
|
* @returns {Array}
|
||
|
* @private
|
||
|
*/
|
||
|
_setGalleryFeatures: function (configFeatures) {
|
||
|
var features = [];
|
||
|
var feature = null;
|
||
|
var i, configFeaturesLength = configFeatures.length;
|
||
|
if (configFeaturesLength) {
|
||
|
for (i = 0; i < configFeaturesLength; i++) {
|
||
|
feature = configFeatures[i];
|
||
|
if (this._worksInCurrentBrowser(feature, 'native_svg')) {
|
||
|
features.push(feature);
|
||
|
Gallery.utility.addDomPurifyHooks();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this.cachedFeaturesString = features.join(';');
|
||
|
|
||
|
return features;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Saves the list of supported media types
|
||
|
*
|
||
|
* @param {string[]} mediaTypes
|
||
|
*
|
||
|
* @returns {Array}
|
||
|
* @private
|
||
|
*/
|
||
|
_setMediaTypes: function (mediaTypes) {
|
||
|
var supportedMediaTypes = [];
|
||
|
var mediaType = null;
|
||
|
var i, mediaTypesLength = mediaTypes.length;
|
||
|
if (mediaTypesLength) {
|
||
|
for (i = 0; i < mediaTypesLength; i++) {
|
||
|
mediaType = mediaTypes[i];
|
||
|
if (this._worksInCurrentBrowser(mediaType, 'image/svg+xml')) {
|
||
|
supportedMediaTypes.push(mediaType);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this.cachedMediaTypesString = supportedMediaTypes.join(';');
|
||
|
|
||
|
return supportedMediaTypes;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Determines if we can accept a specific config element in Internet Explorer
|
||
|
*
|
||
|
* @param {string} feature
|
||
|
* @param {string} validationRule
|
||
|
*
|
||
|
* @returns {boolean}
|
||
|
* @private
|
||
|
*/
|
||
|
_worksInCurrentBrowser: function (feature, validationRule) {
|
||
|
var isAcceptable = true;
|
||
|
if (feature === validationRule &&
|
||
|
(Gallery.ieVersion !== false && Gallery.ieVersion !== 'edge')) {
|
||
|
isAcceptable = false;
|
||
|
}
|
||
|
|
||
|
return isAcceptable;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Saves the description and copyright information for the current album
|
||
|
*
|
||
|
* @param {{
|
||
|
* design,
|
||
|
* information,
|
||
|
* sorting,
|
||
|
* error: string
|
||
|
* }} albumConfig
|
||
|
* @param albumPath
|
||
|
*
|
||
|
* @returns {null||{
|
||
|
* description: string,
|
||
|
* descriptionLink: string,
|
||
|
* copyright: string,
|
||
|
* copyrightLink: string,
|
||
|
* filePath: string,
|
||
|
* inherit: bool,
|
||
|
* level: number
|
||
|
* }}
|
||
|
* @private
|
||
|
*/
|
||
|
_setAlbumInfo: function (albumConfig, albumPath) {
|
||
|
/**@type {{
|
||
|
* description: string,
|
||
|
* description_link: string,
|
||
|
* copyright: string,
|
||
|
* copyright_link: string,
|
||
|
* inherit: bool,
|
||
|
* level: number
|
||
|
* }}
|
||
|
*/
|
||
|
var albumInfo = albumConfig.information;
|
||
|
var params = null;
|
||
|
if (!$.isEmptyObject(albumInfo)) {
|
||
|
var docPath = albumPath;
|
||
|
var level = albumInfo.level;
|
||
|
if (level > 0) {
|
||
|
if (docPath.indexOf('/') !== -1) {
|
||
|
var folders = docPath.split('/');
|
||
|
folders = folders.slice(-0, -level);
|
||
|
docPath = folders.join('/') + '/';
|
||
|
} else {
|
||
|
docPath = '';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* jshint camelcase: false */
|
||
|
params = {
|
||
|
description: albumInfo.description,
|
||
|
descriptionLink: albumInfo.description_link,
|
||
|
copyright: albumInfo.copyright,
|
||
|
copyrightLink: albumInfo.copyright_link,
|
||
|
filePath: docPath,
|
||
|
inherit: albumInfo.inherit,
|
||
|
level: level
|
||
|
};
|
||
|
}
|
||
|
|
||
|
return params;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Saves the description and copyright information for the current album
|
||
|
*
|
||
|
* @param {{
|
||
|
* design,
|
||
|
* information,
|
||
|
* sorting,
|
||
|
* error: string
|
||
|
* }} albumConfig
|
||
|
*
|
||
|
* @returns {null||{
|
||
|
* background: string,
|
||
|
* inherit: bool,
|
||
|
* level: number
|
||
|
* }}
|
||
|
* @private
|
||
|
*/
|
||
|
_setAlbumDesign: function (albumConfig) {
|
||
|
/**@type {{
|
||
|
* background: string,
|
||
|
* inherit: bool,
|
||
|
* level: number
|
||
|
* }}
|
||
|
*/
|
||
|
var albumDesign = albumConfig.design;
|
||
|
var params = null;
|
||
|
if (!$.isEmptyObject(albumDesign)) {
|
||
|
params = {
|
||
|
background: albumDesign.background,
|
||
|
inherit: albumDesign.inherit,
|
||
|
level: albumDesign.level
|
||
|
};
|
||
|
}
|
||
|
|
||
|
return params;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Saves the sorting configuration for the current album
|
||
|
*
|
||
|
* @param {{
|
||
|
* design,
|
||
|
* information,
|
||
|
* sorting,
|
||
|
* error: string
|
||
|
* }} albumConfig
|
||
|
*
|
||
|
* @returns {{type: string, order: string, albumOrder: string}}
|
||
|
* @private
|
||
|
*/
|
||
|
_setAlbumSorting: function (albumConfig) {
|
||
|
var sortType = 'name';
|
||
|
var sortOrder = 'asc';
|
||
|
var albumSortOrder = 'asc';
|
||
|
if (!$.isEmptyObject(albumConfig.sorting)) {
|
||
|
if (!$.isEmptyObject(albumConfig.sorting.type)) {
|
||
|
sortType = albumConfig.sorting.type;
|
||
|
}
|
||
|
if (!$.isEmptyObject(albumConfig.sorting.order)) {
|
||
|
sortOrder = albumConfig.sorting.order;
|
||
|
if (sortType === 'name') {
|
||
|
albumSortOrder = sortOrder;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
type: sortType,
|
||
|
order: sortOrder,
|
||
|
albumOrder: albumSortOrder
|
||
|
};
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Gallery.Config = Config;
|
||
|
})(jQuery, Gallery);
|