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.
254 lines
7.6 KiB
254 lines
7.6 KiB
/**********************************************************************************
|
|
*
|
|
* Copyright (c) 2017-2019 MuK IT GmbH.
|
|
*
|
|
* This file is part of MuK Preview
|
|
* (see https://mukit.at).
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
**********************************************************************************/
|
|
|
|
odoo.define('muk_preview.PreviewManager', function (require) {
|
|
"use strict";
|
|
|
|
var core = require('web.core');
|
|
var ajax = require('web.ajax');
|
|
var session = require('web.session');
|
|
var framework = require('web.framework');
|
|
|
|
var Widget = require('web.Widget');
|
|
|
|
var utils = require('muk_web_utils.utils');
|
|
var registry = require('muk_preview.registry');
|
|
|
|
var QWeb = core.qweb;
|
|
var _t = core._t;
|
|
|
|
var PreviewManager = Widget.extend({
|
|
template: "muk_preview.PreviewManager",
|
|
events: _.extend({}, Widget.prototype.events, {
|
|
'click .mk_preview_previous a': '_onPreviousClick',
|
|
'click .mk_preview_next a': '_onNextClick',
|
|
'click .mk_preview_page a': '_onPageClick',
|
|
'click .mk_preview_print': '_onPrintClick',
|
|
}),
|
|
jsLibs: [
|
|
'/muk_web_preview/static/lib/printThis/printThis.js',
|
|
],
|
|
files: [],
|
|
init: function (parent, files, index) {
|
|
this._super.apply(this, arguments);
|
|
this.files = files;
|
|
this.index = index;
|
|
this.activeFile = files[index];
|
|
this.pagerSize = 9;
|
|
},
|
|
willStart: function() {
|
|
return $.when(
|
|
this._super.apply(this, arguments),
|
|
ajax.loadLibs(this)
|
|
);
|
|
},
|
|
start: function () {
|
|
var res = this._super.apply(this, arguments);
|
|
this.$actions = this.$('.mk_preview_actions');
|
|
this.$wrapper = this.$('.mk_preview_wrapper');
|
|
this.$pager = this.$('.mk_preview_pager');
|
|
this._render();
|
|
return res;
|
|
},
|
|
_render: function () {
|
|
this._renderPreviewWithLoading();
|
|
this._renderIndexPager();
|
|
this._updateActions();
|
|
},
|
|
_renderPreviewWithLoading: function () {
|
|
var $loader = this._renderLoader();
|
|
this._destroyPreview();
|
|
this._renderPreview($loader);
|
|
},
|
|
_renderLoader: function () {
|
|
var $loader = $(QWeb.render('muk_preview.PreviewLoader', {
|
|
loading_text: _t("Loading ..."),
|
|
loading_text_00: _t("Loading"),
|
|
loading_text_25: _t("Loading ."),
|
|
loading_text_50: _t("Loading .."),
|
|
loading_text_75: _t("Loading ..."),
|
|
}));
|
|
this.$wrapper.html($loader);
|
|
return $loader;
|
|
},
|
|
_renderPreview: function (element) {
|
|
var PreviewWidget = undefined;
|
|
var mimetype = this.activeFile.mimetype;
|
|
var filename = this.activeFile.filename;
|
|
if (mimetype && registry.contains(mimetype)) {
|
|
PreviewWidget = registry.get(mimetype);
|
|
}
|
|
if (!PreviewWidget && filename) {
|
|
var extension = filename.split('.').pop();
|
|
if (extension && registry.contains(extension)) {
|
|
PreviewWidget = registry.get(extension);
|
|
}
|
|
}
|
|
if (!PreviewWidget) {
|
|
PreviewWidget = registry.defaultPreview();
|
|
}
|
|
var content = new PreviewWidget(this,
|
|
this.activeFile.url, mimetype, filename
|
|
);
|
|
content.replace(element);
|
|
this.activePreview = content;
|
|
},
|
|
_renderIndexPager: function () {
|
|
this.$pager.find('.pagination').empty();
|
|
if (this.files.length <= 1) {
|
|
this.$pager.hide();
|
|
} else {
|
|
var $previous = $("<li>", {
|
|
'class': "page-item mk_preview_previous",
|
|
'title': _t("Previous"),
|
|
}).append($("<a>", {
|
|
'class': "page-link",
|
|
'href': "#",
|
|
'html': '<i class="fa fa-angle-double-left" />',
|
|
}));
|
|
var $next = $("<li>", {
|
|
'class': "page-item mk_preview_next",
|
|
'title': _t("Next"),
|
|
}).append($("<a>", {
|
|
'class': "page-link",
|
|
'href': "#",
|
|
'html': '<i class="fa fa-angle-double-right" />',
|
|
}));
|
|
this.$pager.find('.pagination').append($previous);
|
|
this.$pager.find('.pagination').append($next);
|
|
var pageList = utils.partitionPageList(
|
|
this.files.length,
|
|
this.index + 1,
|
|
this.pagerSize
|
|
);
|
|
_.each(pageList, function(page) {
|
|
var index = page && page - 1;
|
|
var $item = $("<li>", {
|
|
'class': "page-item",
|
|
});
|
|
if (!page) {
|
|
$item.addClass("disabled");
|
|
} else if (index === this.index) {
|
|
$item.addClass("active");
|
|
} else {
|
|
$item.addClass("mk_preview_page");
|
|
}
|
|
$item.append($("<a>", {
|
|
'class': "page-link",
|
|
'data-index': index,
|
|
'text': page || '...',
|
|
'href': "javascript:void(0)",
|
|
}));
|
|
$item.insertBefore($next);
|
|
}, this);
|
|
if (this.index === 0) {
|
|
$previous.addClass("disabled");
|
|
$next.removeClass("disabled");
|
|
} else if (this.index === this.files.length - 1) {
|
|
$previous.removeClass("disabled");
|
|
$next.addClass("disabled");
|
|
} else {
|
|
$previous.removeClass("disabled");
|
|
$next.removeClass("disabled");
|
|
}
|
|
this.$pager.show();
|
|
}
|
|
},
|
|
_updateActions: function () {
|
|
this.$actions.empty();
|
|
if (this.activePreview) {
|
|
if (this.activePreview.downloadable) {
|
|
this.$actions.append($("<a>", {
|
|
'class': "mk_preview_download",
|
|
'html': '<i class="fa fa-download" />',
|
|
'title': _t("Download"),
|
|
'href': this.activeFile.url,
|
|
}));
|
|
}
|
|
if (this.activePreview.printable) {
|
|
this.$actions.append($("<a>", {
|
|
'class': "mk_preview_print",
|
|
'html': '<i class="fa fa-print" />',
|
|
'title': _t("Print"),
|
|
'href': '#',
|
|
}));
|
|
}
|
|
_.each(this.activePreview.contentActions(), function(action) {
|
|
this.$actions.append(action);
|
|
}, this);
|
|
}
|
|
},
|
|
_destroyPreview: function () {
|
|
if (this.activePreview) {
|
|
this.activePreview.destroy();
|
|
}
|
|
this.activePreview = undefined;
|
|
},
|
|
_onPreviousClick: function(event) {
|
|
if (this.index > 0) {
|
|
this.index = this.index - 1;
|
|
this.activeFile = this.files[this.index];
|
|
this._render();
|
|
}
|
|
event.stopPropagation();
|
|
event.preventDefault();
|
|
},
|
|
_onNextClick: function (event) {
|
|
if (this.index < this.files.length - 1) {
|
|
this.index = this.index + 1;
|
|
this.activeFile = this.files[this.index];
|
|
this._render();
|
|
}
|
|
event.stopPropagation();
|
|
event.preventDefault();
|
|
},
|
|
_onPageClick: function(event) {
|
|
var $target = $(event.currentTarget);
|
|
var index = $target.data('index');
|
|
if (index >= 0 && index < this.files.length) {
|
|
this.index = index;
|
|
this.activeFile = this.files[this.index];
|
|
this._render();
|
|
}
|
|
event.stopPropagation();
|
|
event.preventDefault();
|
|
},
|
|
_onPrintClick: function(event) {
|
|
var preview = this.activePreview;
|
|
var delay = preview.printDelay;
|
|
framework.blockUI();
|
|
setTimeout(function() {
|
|
framework.unblockUI();
|
|
}, delay|| 950);
|
|
this.$wrapper.printThis({
|
|
importCSS: true,
|
|
importStyle: true,
|
|
printDelay: delay|| 950,
|
|
});
|
|
event.stopPropagation();
|
|
event.preventDefault();
|
|
},
|
|
});
|
|
|
|
return PreviewManager;
|
|
|
|
});
|