aboutsummaryrefslogtreecommitdiffstats
path: root/library/justifiedGallery/jquery.justifiedGallery.js
diff options
context:
space:
mode:
Diffstat (limited to 'library/justifiedGallery/jquery.justifiedGallery.js')
-rw-r--r--library/justifiedGallery/jquery.justifiedGallery.js122
1 files changed, 69 insertions, 53 deletions
diff --git a/library/justifiedGallery/jquery.justifiedGallery.js b/library/justifiedGallery/jquery.justifiedGallery.js
index 76db2112c..846f611dd 100644
--- a/library/justifiedGallery/jquery.justifiedGallery.js
+++ b/library/justifiedGallery/jquery.justifiedGallery.js
@@ -1,7 +1,7 @@
/*!
- * justifiedGallery - v4.0.0-alpha
+ * justifiedGallery - v3.8.1
* http://miromannino.github.io/Justified-Gallery/
- * Copyright (c) 2019 Miro Mannino
+ * Copyright (c) 2020 Miro Mannino
* Licensed under the MIT license.
*/
(function (factory) {
@@ -10,13 +10,13 @@
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
- module.exports = function( root, jQuery ) {
- if ( jQuery === undefined ) {
+ module.exports = function (root, jQuery) {
+ if (jQuery === undefined) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
- if ( typeof window !== 'undefined' ) {
+ if (typeof window !== 'undefined') {
jQuery = require('jquery');
}
else {
@@ -47,16 +47,16 @@
this.imgAnalyzerTimeout = null;
this.entries = null;
this.buildingRow = {
- entriesBuff : [],
- width : 0,
- height : 0,
- aspectRatio : 0
+ entriesBuff: [],
+ width: 0,
+ height: 0,
+ aspectRatio: 0
};
this.lastFetchedEntry = null;
this.lastAnalyzedIndex = -1;
this.yield = {
- every : 2, // do a flush every n flushes (must be greater than 1)
- flushed : 0 // flushed rows without a yield
+ every: 2, // do a flush every n flushes (must be greater than 1)
+ flushed: 0 // flushed rows without a yield
};
this.border = settings.border >= 0 ? settings.border : settings.margins;
this.maxRowHeight = this.retrieveMaxRowHeight();
@@ -64,10 +64,10 @@
this.offY = this.border;
this.rows = 0;
this.spinner = {
- phase : 0,
- timeSlot : 150,
- $el : $('<div class="spinner"><span></span><span></span><span></span></div>'),
- intervalId : null
+ phase: 0,
+ timeSlot: 150,
+ $el: $('<div class="jg-spinner"><span></span><span></span><span></span></div>'),
+ intervalId: null
};
this.scrollBarOn = false;
this.checkWidthIntervalId = null;
@@ -167,7 +167,7 @@
*/
JustifiedGallery.prototype.extractImgSrcFromImage = function ($image) {
var imageSrc = $image.data('safe-src');
- var imageSrcLoc = 'date-safe-src';
+ var imageSrcLoc = 'data-safe-src';
if (typeof imageSrc === 'undefined') {
imageSrc = $image.attr('src');
imageSrcLoc = 'src';
@@ -186,7 +186,7 @@
/** @returns {jQuery} the caption in the given entry */
JustifiedGallery.prototype.captionFromEntry = function ($entry) {
- var $caption = $entry.find('> .caption');
+ var $caption = $entry.find('> .jg-caption');
return $caption.length === 0 ? null : $caption;
};
@@ -228,7 +228,7 @@
// }
};
- if ($entry.data('jg.loaded') === 'skipped') {
+ if ($entry.data('jg.loaded') === 'skipped' && imageSrc) {
this.onImageEvent(imageSrc, (function() {
this.showImg($entry, loadNewImage); //load the new image after the fadeIn
$entry.data('jg.loaded', true);
@@ -262,7 +262,7 @@
var caption = $image.attr('alt');
if (!this.isValidCaption(caption)) caption = $entry.attr('title');
if (this.isValidCaption(caption)) { // Create only we found something
- $imgCaption = $('<div class="caption">' + caption + '</div>');
+ $imgCaption = $('<div class="jg-caption">' + caption + '</div>');
$entry.append($imgCaption);
$entry.data('jg.createdCaption', true);
}
@@ -297,10 +297,10 @@
JustifiedGallery.prototype.onEntryMouseEnterForCaption = function (eventObject) {
var $caption = this.captionFromEntry($(eventObject.currentTarget));
if (this.settings.cssAnimation) {
- $caption.addClass('caption-visible').removeClass('caption-hidden');
+ $caption.addClass('jg-caption-visible').removeClass('jg-caption-hidden');
} else {
$caption.stop().fadeTo(this.settings.captionSettings.animationDuration,
- this.settings.captionSettings.visibleOpacity);
+ this.settings.captionSettings.visibleOpacity);
}
};
@@ -313,10 +313,10 @@
JustifiedGallery.prototype.onEntryMouseLeaveForCaption = function (eventObject) {
var $caption = this.captionFromEntry($(eventObject.currentTarget));
if (this.settings.cssAnimation) {
- $caption.removeClass('caption-visible').removeClass('caption-hidden');
+ $caption.removeClass('jg-caption-visible').removeClass('jg-caption-hidden');
} else {
$caption.stop().fadeTo(this.settings.captionSettings.animationDuration,
- this.settings.captionSettings.nonVisibleOpacity);
+ this.settings.captionSettings.nonVisibleOpacity);
}
};
@@ -365,19 +365,20 @@
* Justify the building row, preparing it to
*
* @param isLastRow
+ * @param hiddenRow undefined or false for normal behavior. hiddenRow = true to hide the row.
* @returns a boolean to know if the row has been justified or not
*/
- JustifiedGallery.prototype.prepareBuildingRow = function (isLastRow) {
+ JustifiedGallery.prototype.prepareBuildingRow = function (isLastRow, hiddenRow) {
var i, $entry, imgAspectRatio, newImgW, newImgH, justify = true;
var minHeight = 0;
var availableWidth = this.galleryWidth - 2 * this.border - (
- (this.buildingRow.entriesBuff.length - 1) * this.settings.margins);
+ (this.buildingRow.entriesBuff.length - 1) * this.settings.margins);
var rowHeight = availableWidth / this.buildingRow.aspectRatio;
var defaultRowHeight = this.settings.rowHeight;
var justifiable = this.buildingRow.width / availableWidth > this.settings.justifyThreshold;
//Skip the last row if we can't justify it and the lastRow == 'hide'
- if (isLastRow && this.settings.lastRow === 'hide' && !justifiable) {
+ if (hiddenRow || (isLastRow && this.settings.lastRow === 'hide' && !justifiable)) {
for (i = 0; i < this.buildingRow.entriesBuff.length; i++) {
$entry = this.buildingRow.entriesBuff[i];
if (this.settings.cssAnimation)
@@ -426,19 +427,20 @@
* Flush a row: justify it, modify the gallery height accordingly to the row height
*
* @param isLastRow
+ * @param hiddenRow undefined or false for normal behavior. hiddenRow = true to hide the row.
*/
- JustifiedGallery.prototype.flushRow = function (isLastRow) {
+ JustifiedGallery.prototype.flushRow = function (isLastRow, hiddenRow) {
var settings = this.settings;
var $entry, buildingRowRes, offX = this.border, i;
- buildingRowRes = this.prepareBuildingRow(isLastRow);
- if (isLastRow && settings.lastRow === 'hide' && buildingRowRes === -1) {
+ buildingRowRes = this.prepareBuildingRow(isLastRow, hiddenRow);
+ if (hiddenRow || (isLastRow && settings.lastRow === 'hide' && buildingRowRes === -1)) {
this.clearBuildingRow();
return;
}
- if(this.maxRowHeight) {
- if(this.maxRowHeight < this.buildingRow.height) this.buildingRow.height = this.maxRowHeight;
+ if (this.maxRowHeight) {
+ if (this.maxRowHeight < this.buildingRow.height) this.buildingRow.height = this.maxRowHeight;
}
//Align last (unjustified) row
@@ -451,14 +453,14 @@
}
if (settings.lastRow === 'center')
- offX += availableWidth / 2;
+ offX += Math.round(availableWidth / 2);
else if (settings.lastRow === 'right')
offX += availableWidth;
}
var lastEntryIdx = this.buildingRow.entriesBuff.length - 1;
for (i = 0; i <= lastEntryIdx; i++) {
- $entry = this.buildingRow.entriesBuff[ this.settings.rtl ? lastEntryIdx - i : i ];
+ $entry = this.buildingRow.entriesBuff[this.settings.rtl ? lastEntryIdx - i : i];
this.displayEntry($entry, offX, this.offY, $entry.data('jg.jwidth'), $entry.data('jg.jheight'), this.buildingRow.height);
offX += $entry.data('jg.jwidth') + settings.margins;
}
@@ -573,10 +575,18 @@
};
/**
+ * @returns {String} `settings.selector` rejecting spinner element
+ */
+ JustifiedGallery.prototype.getSelectorWithoutSpinner = function () {
+ return this.settings.selector + ', div:not(.jg-spinner)';
+ };
+
+ /**
* @returns {Array} all entries matched by `settings.selector`
*/
JustifiedGallery.prototype.getAllEntries = function () {
- return this.$gallery.children(this.settings.selector).toArray();
+ var selector = this.getSelectorWithoutSpinner();
+ return this.$gallery.children(selector).toArray();
};
/**
@@ -589,7 +599,8 @@
var newEntries;
if (norewind && this.lastFetchedEntry != null) {
- newEntries = $(this.lastFetchedEntry).nextAll(this.settings.selector).toArray();
+ var selector = this.getSelectorWithoutSpinner();
+ newEntries = $(this.lastFetchedEntry).nextAll(selector).toArray();
} else {
this.entries = [];
newEntries = this.getAllEntries();
@@ -707,12 +718,12 @@
* Revert the image src to the default value.
*/
JustifiedGallery.prototype.resetImgSrc = function ($img) {
- if ($img.data('jg.originalSrcLoc') == 'src') {
+ if ($img.data('jg.originalSrcLoc') === 'src') {
$img.attr('src', $img.data('jg.originalSrc'));
} else {
$img.attr('src', '');
}
- }
+ };
/**
* Destroy the Justified Gallery instance.
@@ -728,7 +739,7 @@
this.stopImgAnalyzerStarter();
// Get fresh entries list since filtered entries are absent in `this.entries`
- $.each(this.getAllEntries(), $.proxy(function(_, entry) {
+ $.each(this.getAllEntries(), $.proxy(function (_, entry) {
var $entry = $(entry);
// Reset entry style
@@ -781,7 +792,7 @@
var $entry = $(this.entries[i]);
if ($entry.data('jg.loaded') === true || $entry.data('jg.loaded') === 'skipped') {
var availableWidth = this.galleryWidth - 2 * this.border - (
- (this.buildingRow.entriesBuff.length - 1) * this.settings.margins);
+ (this.buildingRow.entriesBuff.length - 1) * this.settings.margins);
var imgAspectRatio = $entry.data('jg.width') / $entry.data('jg.height');
this.buildingRow.entriesBuff.push($entry);
@@ -790,9 +801,9 @@
this.lastAnalyzedIndex = i;
if (availableWidth / (this.buildingRow.aspectRatio + imgAspectRatio) < this.settings.rowHeight) {
- this.flushRow(false);
+ this.flushRow(false, this.settings.maxRowsCount > 0 && this.rows === this.settings.maxRowsCount);
- if(++this.yield.flushed >= this.yield.every) {
+ if (++this.yield.flushed >= this.yield.every) {
this.startImgAnalyzer(isForResize);
return;
}
@@ -803,7 +814,9 @@
}
// Last row flush (the row is not full)
- if (this.buildingRow.entriesBuff.length > 0) this.flushRow(true);
+ if (this.buildingRow.entriesBuff.length > 0) {
+ this.flushRow(true, this.settings.maxRowsCount > 0 && this.rows === this.settings.maxRowsCount);
+ }
if (this.isSpinnerActive()) {
this.stopLoadingSpinnerAnimation();
@@ -815,9 +828,10 @@
*/
this.stopImgAnalyzerStarter();
+ this.setGalleryFinalHeight(this.galleryHeightToSet);
+
//On complete callback
this.settings.triggerEvent.call(this, isForResize ? 'jg.resize' : 'jg.complete');
- this.setGalleryFinalHeight(this.galleryHeightToSet);
};
/**
@@ -864,7 +878,7 @@
});
}
if (onError) {
- $memImage.one('error', function() {
+ $memImage.one('error', function () {
$memImage.off('load error');
onError(memImage);
});
@@ -978,7 +992,7 @@
if (this.settings.sizeRangeSuffixes.hasOwnProperty(rangeIdx)) suffixRanges.push(rangeIdx);
}
- var newSizeRngSuffixes = {0: ''};
+ var newSizeRngSuffixes = { 0: '' };
for (var i = 0; i < suffixRanges.length; i++) {
if ($.type(suffixRanges[i]) === 'string') {
try {
@@ -1037,6 +1051,7 @@
this.checkOrConvertNumber(this.settings, 'rowHeight');
this.checkOrConvertNumber(this.settings, 'margins');
this.checkOrConvertNumber(this.settings, 'border');
+ this.checkOrConvertNumber(this.settings, 'maxRowsCount');
var lastRowModes = [
'justify',
@@ -1063,13 +1078,13 @@
this.checkOrConvertNumber(this.settings.captionSettings, 'visibleOpacity');
if (this.settings.captionSettings.visibleOpacity < 0 ||
- this.settings.captionSettings.visibleOpacity > 1) {
+ this.settings.captionSettings.visibleOpacity > 1) {
throw 'captionSettings.visibleOpacity must be in the interval [0, 1]';
}
this.checkOrConvertNumber(this.settings.captionSettings, 'nonVisibleOpacity');
if (this.settings.captionSettings.nonVisibleOpacity < 0 ||
- this.settings.captionSettings.nonVisibleOpacity > 1) {
+ this.settings.captionSettings.nonVisibleOpacity > 1) {
throw 'captionSettings.nonVisibleOpacity must be in the interval [0, 1]';
}
@@ -1084,7 +1099,7 @@
}
if (this.settings.filter !== false && !$.isFunction(this.settings.filter) &&
- $.type(this.settings.filter) !== 'string') {
+ $.type(this.settings.filter) !== 'string') {
throw 'filter must be false, a string or a filter function';
}
};
@@ -1120,7 +1135,7 @@
};
JustifiedGallery.prototype.defaults = {
- sizeRangeSuffixes: { }, /* e.g. Flickr configuration
+ sizeRangeSuffixes: {}, /* e.g. Flickr configuration
{
100: '_t', // used when longest is less than 100px
240: '_m', // used when longest is between 101px and 240px
@@ -1135,8 +1150,9 @@
current path, width and height */
rowHeight: 120, // required? required to be > 0?
maxRowHeight: false, // false or negative value to deactivate. Positive number to express the value in pixels,
- // A string '[0-9]+%' to express in percentage (e.g. 300% means that the row height
- // can't exceed 3 * rowHeight)
+ // A string '[0-9]+%' to express in percentage (e.g. 300% means that the row height
+ // can't exceed 3 * rowHeight)
+ maxRowsCount: 0, // maximum number of rows to be displayed (0 = disabled)
margins: 1,
border: -1, // negative value = same as margins, 0 = disabled, any other value to set the border
@@ -1171,7 +1187,7 @@
- a function: invoked with arguments (entry, index, array). Return true to keep the entry, false otherwise.
It follows the specifications of the Array.prototype.filter() function of JavaScript.
*/
- selector: 'a, div:not(.spinner)', // The selector that is used to know what are the entries of the gallery
+ selector: 'a', // The selector that is used to know what are the entries of the gallery
imgSelector: '> img, > a > img, > svg, > a > svg', // The selector that is used to know what are the images of each entry
triggerEvent: function (event) { // This is called to trigger events, the default behavior is to call $.trigger
this.$gallery.trigger(event); // Consider that 'this' is this set to the JustifiedGallery object, so it can
@@ -1226,4 +1242,4 @@
});
};
-})); \ No newline at end of file
+}));