diff --git a/docs/releases/2.5.rst b/docs/releases/2.5.rst
index a408cd9cf9..1ae949b1a9 100644
--- a/docs/releases/2.5.rst
+++ b/docs/releases/2.5.rst
@@ -79,6 +79,12 @@ Other Changes
- The trashed document deletion action is now a background task. This
feature results is much faster trashed document deletion and trash
can emptying.
+- Remove animated spinners to lower browser memory usage and increase
+ responsiveness.
+- Render a document page place holder while the real document page
+ loads. This change avoids "jumping" effect when loading many thumbnails.
+- Increase lazy load thresholds. More thumbnails and document pages
+ will be loaded and visible by default when a view loads.
Removals
--------
diff --git a/mayan/apps/appearance/static/appearance/js/base.js b/mayan/apps/appearance/static/appearance/js/base.js
index 52e5079c21..83ac822c96 100644
--- a/mayan/apps/appearance/static/appearance/js/base.js
+++ b/mayan/apps/appearance/static/appearance/js/base.js
@@ -58,10 +58,12 @@ App.prototype.setupSelect2 = function () {
}
App.prototype.setupFullHeightResizing = function () {
+ var self = this;
+
this.resizeFullHeight();
this.window.resize(function() {
- app.resizeFullHeight();
+ self.resizeFullHeight();
});
}
@@ -69,45 +71,6 @@ App.prototype.resizeFullHeight = function () {
$('.full-height').height(this.window.height() - $('.full-height').data('height-difference'));
}
-App.prototype.doMayanImages = function () {
- $('a.fancybox').fancybox({
- beforeShow : function(){
- this.title = $(this.element).data('caption');
- },
- openEffect : 'elastic',
- closeEffect : 'elastic',
- prevEffect : 'none',
- nextEffect : 'none',
- titleShow : true,
- type : 'image',
- autoResize : true,
- });
-
- $('img.lazy-load').lazyload({
- appear: function(elements_left, settings) {
- new MayanImage({element: $(this)});
- },
- });
-
- $('img.lazy-load-carousel').lazyload({
- appear: function(elements_left, settings) {
- new MayanImage({element: $(this)});
- },
- container: $('#carousel-container'),
- threshold: 400
- });
-
- $('.lazy-load').on('load', function() {
- $(this).siblings('.spinner').remove();
- $(this).removeClass('lazy-load');
- });
-
- $('.lazy-load-carousel').on('load', function() {
- $(this).siblings('.spinner').remove();
- $(this).removeClass('lazy-load-carousel');
- });
-}
-
App.prototype.doToastrMessages = function () {
toastr.options = {
'closeButton': true,
@@ -165,11 +128,53 @@ App.prototype.doToastrMessages = function () {
});
}
+/* MayanImage class */
+
var MayanImage = function (options) {
this.element = options.element;
this.load();
}
+MayanImage.intialize = function () {
+ $('a.fancybox').fancybox({
+ beforeShow : function(){
+ this.title = $(this.element).data('caption');
+ },
+ openEffect : 'elastic',
+ closeEffect : 'elastic',
+ prevEffect : 'none',
+ nextEffect : 'none',
+ titleShow : true,
+ type : 'image',
+ autoResize : true,
+ });
+
+ $('img.lazy-load').lazyload({
+ appear: function(elements_left, settings) {
+ new MayanImage({element: $(this)});
+ },
+ threshold: 400
+ });
+
+ $('img.lazy-load-carousel').lazyload({
+ appear: function(elements_left, settings) {
+ new MayanImage({element: $(this)});
+ },
+ container: $('#carousel-container'),
+ threshold: 2000
+ });
+
+ $('.lazy-load').on('load', function() {
+ $(this).siblings('.spinner-container').remove();
+ $(this).removeClass('lazy-load pull-left');
+ });
+
+ $('.lazy-load-carousel').on('load', function() {
+ $(this).siblings('.spinner-container').remove();
+ $(this).removeClass('lazy-load-carousel pull-left');
+ });
+}
+
MayanImage.prototype.onImageError = function () {
this.element.parent().parent().html('');
// Remove border to indicate non interactive image
@@ -199,7 +204,7 @@ jQuery(document).ready(function() {
app.setupFullHeightResizing();
- app.doMayanImages();
+ MayanImage.intialize();
app.doToastrMessages();
diff --git a/mayan/apps/common/utils.py b/mayan/apps/common/utils.py
index e24404368c..bcea9cb1dd 100644
--- a/mayan/apps/common/utils.py
+++ b/mayan/apps/common/utils.py
@@ -96,6 +96,13 @@ def get_descriptor(file_input, read=True):
return file_input
+def index_or_default(instance, index, default):
+ try:
+ return instance[index]
+ except IndexError:
+ return default
+
+
def TemporaryFile(*args, **kwargs):
kwargs.update({'dir': setting_temporary_directory.value})
return tempfile.TemporaryFile(*args, **kwargs)
diff --git a/mayan/apps/documents/widgets.py b/mayan/apps/documents/widgets.py
index 90e1695563..f4382dd695 100644
--- a/mayan/apps/documents/widgets.py
+++ b/mayan/apps/documents/widgets.py
@@ -8,6 +8,8 @@ from django.utils.http import urlencode
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext, ugettext_lazy as _
+from common.utils import index_or_default
+
from .settings import (
setting_display_size, setting_preview_size, setting_thumbnail_size
)
@@ -99,6 +101,8 @@ class InstanceImageWidget(object):
preview_query_dict = {}
image_class = 'lazy-load'
title = None
+ width = None
+ height = None
# Click view
def get_click_view_kwargs(self, instance):
@@ -221,10 +225,16 @@ class InstanceImageWidget(object):
)
result.append(
- ' '
- '
'
+ ''
+ ''
+ ''
+ ''
+ ''
+ '
'.format(
+ '/> '.format(
+ width=self.width or '32', height=self.height or '32',
image_class=self.image_class,
preview_full_url=self.get_preview_view_url(instance=instance),
alt_text=self.alt_text
@@ -253,6 +263,11 @@ class BaseDocumentThumbnailWidget(InstanceImageWidget):
preview_view_query_dict = {
'size': setting_thumbnail_size.value
}
+ width = setting_thumbnail_size.value.split('x')[0]
+ height = index_or_default(
+ instance=setting_thumbnail_size.value.split('x'),
+ index=1, default=setting_thumbnail_size.value.split('x')[0]
+ )
def get_destination_url(self, instance):
return instance.get_absolute_url()
@@ -265,6 +280,11 @@ class CarouselDocumentPageThumbnailWidget(BaseDocumentThumbnailWidget):
preview_view_query_dict = {
'size': setting_display_size.value
}
+ width = setting_preview_size.value.split('x')[0]
+ height = index_or_default(
+ instance=setting_preview_size.value.split('x'),
+ index=1, default=setting_preview_size.value.split('x')[0]
+ )
class DocumentThumbnailWidget(BaseDocumentThumbnailWidget):