diff --git a/apps/common/forms/resources/less/common.less b/apps/common/forms/resources/less/common.less
index 1e61888f3..c1a0ccd51 100644
--- a/apps/common/forms/resources/less/common.less
+++ b/apps/common/forms/resources/less/common.less
@@ -80,6 +80,7 @@
@import "../../../../common/main/resources/less/spinner.less";
@import "../../../../common/main/resources/less/checkbox.less";
@import "../../../../common/main/resources/less/opendialog.less";
+@import "../../../../common/main/resources/less/advanced-settings-window.less";
@toolbarBorderColor: @border-toolbar-ie;
@toolbarBorderColor: @border-toolbar;
diff --git a/apps/common/main/lib/controller/Plugins.js b/apps/common/main/lib/controller/Plugins.js
index ae74097bc..98d3f0c56 100644
--- a/apps/common/main/lib/controller/Plugins.js
+++ b/apps/common/main/lib/controller/Plugins.js
@@ -39,7 +39,8 @@
define([
'core',
'common/main/lib/collection/Plugins',
- 'common/main/lib/view/Plugins'
+ 'common/main/lib/view/Plugins',
+ 'common/main/lib/view/PluginDlg'
], function () {
'use strict';
diff --git a/apps/common/main/lib/view/PluginDlg.js b/apps/common/main/lib/view/PluginDlg.js
new file mode 100644
index 000000000..81a5e0ce5
--- /dev/null
+++ b/apps/common/main/lib/view/PluginDlg.js
@@ -0,0 +1,185 @@
+/*
+ *
+ * (c) Copyright Ascensio System SIA 2010-2022
+ *
+ * This program is a free software product. You can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License (AGPL)
+ * version 3 as published by the Free Software Foundation. In accordance with
+ * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
+ * that Ascensio System SIA expressly excludes the warranty of non-infringement
+ * of any third-party rights.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
+ * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+ *
+ * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
+ * street, Riga, Latvia, EU, LV-1050.
+ *
+ * The interactive user interfaces in modified source and object code versions
+ * of the Program must display Appropriate Legal Notices, as required under
+ * Section 5 of the GNU AGPL version 3.
+ *
+ * Pursuant to Section 7(b) of the License you must retain the original Product
+ * logo when distributing the program. Pursuant to Section 7(e) we decline to
+ * grant you any rights under trademark law for use of our trademarks.
+ *
+ * All the Product's GUI elements, including illustrations and icon sets, as
+ * well as technical writing content are licensed under the terms of the
+ * Creative Commons Attribution-ShareAlike 4.0 International. See the License
+ * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+ *
+*/
+/**
+ * User: Julia.Radzhabova
+ * Date: 17.05.16
+ * Time: 15:38
+ */
+
+if (Common === undefined)
+ var Common = {};
+
+Common.Views = Common.Views || {};
+
+define([
+ 'common/main/lib/util/utils',
+ 'common/main/lib/component/BaseView',
+ 'common/main/lib/component/Layout',
+ 'common/main/lib/component/Window'
+], function (template) {
+ 'use strict';
+
+ Common.Views.PluginDlg = Common.UI.Window.extend(_.extend({
+ initialize : function(options) {
+ var _options = {};
+ _.extend(_options, {
+ header: true,
+ enableKeyEvents: false
+ }, options);
+
+ var header_footer = (_options.buttons && _.size(_options.buttons)>0) ? 85 : 34;
+ if (!_options.header) header_footer -= 34;
+ this.bordersOffset = 40;
+ _options.width = (Common.Utils.innerWidth()-this.bordersOffset*2-_options.width)<0 ? Common.Utils.innerWidth()-this.bordersOffset*2: _options.width;
+ _options.height += header_footer;
+ _options.height = (Common.Utils.innerHeight()-this.bordersOffset*2-_options.height)<0 ? Common.Utils.innerHeight()-this.bordersOffset*2: _options.height;
+ _options.cls += ' advanced-settings-dlg';
+
+ this.template = [
+ '
',
+ '<% if ((typeof buttons !== "undefined") && _.size(buttons) > 0) { %>',
+ '',
+ '<% } %>'
+ ].join('');
+
+ _options.tpl = _.template(this.template)(_options);
+
+ this.url = options.url || '';
+ this.frameId = options.frameId || 'plugin_iframe';
+ Common.UI.Window.prototype.initialize.call(this, _options);
+ },
+
+ render: function() {
+ Common.UI.Window.prototype.render.call(this);
+ this.$window.find('> .body').css({height: 'auto', overflow: 'hidden'});
+
+ this.boxEl = this.$window.find('.body > .box');
+ this._headerFooterHeight = (this.options.buttons && _.size(this.options.buttons)>0) ? 85 : 34;
+ if (!this.options.header) this._headerFooterHeight -= 34;
+ this._headerFooterHeight += ((parseInt(this.$window.css('border-top-width')) + parseInt(this.$window.css('border-bottom-width'))));
+
+ var iframe = document.createElement("iframe");
+ iframe.id = this.frameId;
+ iframe.name = 'pluginFrameEditor';
+ iframe.width = '100%';
+ iframe.height = '100%';
+ iframe.align = "top";
+ iframe.frameBorder = 0;
+ iframe.scrolling = "no";
+ iframe.allow = "camera; microphone; display-capture";
+ iframe.onload = _.bind(this._onLoad,this);
+
+ var me = this;
+ setTimeout(function(){
+ if (me.isLoaded) return;
+ me.loadMask = new Common.UI.LoadMask({owner: $('#id-plugin-placeholder')});
+ me.loadMask.setTitle(me.textLoading);
+ me.loadMask.show();
+ if (me.isLoaded) me.loadMask.hide();
+ }, 500);
+
+ iframe.src = this.url;
+ $('#id-plugin-placeholder').append(iframe);
+
+ this.on('resizing', function(args){
+ me.boxEl.css('height', parseInt(me.$window.css('height')) - me._headerFooterHeight);
+ });
+
+ var onMainWindowResize = function(){
+ me.onWindowResize();
+ };
+ $(window).on('resize', onMainWindowResize);
+ this.on('close', function() {
+ $(window).off('resize', onMainWindowResize);
+ });
+ },
+
+ _onLoad: function() {
+ this.isLoaded = true;
+ if (this.loadMask)
+ this.loadMask.hide();
+ },
+
+ setInnerSize: function(width, height) {
+ var maxHeight = Common.Utils.innerHeight(),
+ maxWidth = Common.Utils.innerWidth(),
+ borders_width = (parseInt(this.$window.css('border-left-width')) + parseInt(this.$window.css('border-right-width'))),
+ bordersOffset = this.bordersOffset*2;
+ if (maxHeight - bordersOffsetmain_height-bordersOffset)
+ this.$window.css('top', main_height-bordersOffset - win_height);
+ if (leftmain_width-bordersOffset)
+ this.$window.css('left', main_width-bordersOffset-win_width);
+ } else {
+ if (win_height>main_height-bordersOffset*2) {
+ this.setHeight(Math.max(main_height-bordersOffset*2, this.initConfig.minheight));
+ this.boxEl.css('height', Math.max(main_height-bordersOffset*2, this.initConfig.minheight) - this._headerFooterHeight);
+ this.$window.css('top', bordersOffset);
+ }
+ if (win_width>main_width-bordersOffset*2) {
+ this.setWidth(Math.max(main_width-bordersOffset*2, this.initConfig.minwidth));
+ this.$window.css('left', bordersOffset);
+ }
+ }
+ },
+
+ textLoading : 'Loading'
+ }, Common.Views.PluginDlg || {}));
+});
\ No newline at end of file
diff --git a/apps/common/main/lib/view/Plugins.js b/apps/common/main/lib/view/Plugins.js
index 449bf4be3..75ed76e8b 100644
--- a/apps/common/main/lib/view/Plugins.js
+++ b/apps/common/main/lib/view/Plugins.js
@@ -429,138 +429,4 @@ define([
groupCaption: 'Plugins'
}, Common.Views.Plugins || {}));
-
- Common.Views.PluginDlg = Common.UI.Window.extend(_.extend({
- initialize : function(options) {
- var _options = {};
- _.extend(_options, {
- header: true,
- enableKeyEvents: false
- }, options);
-
- var header_footer = (_options.buttons && _.size(_options.buttons)>0) ? 85 : 34;
- if (!_options.header) header_footer -= 34;
- this.bordersOffset = 40;
- _options.width = (Common.Utils.innerWidth()-this.bordersOffset*2-_options.width)<0 ? Common.Utils.innerWidth()-this.bordersOffset*2: _options.width;
- _options.height += header_footer;
- _options.height = (Common.Utils.innerHeight()-this.bordersOffset*2-_options.height)<0 ? Common.Utils.innerHeight()-this.bordersOffset*2: _options.height;
- _options.cls += ' advanced-settings-dlg';
-
- this.template = [
- '',
- '<% if ((typeof buttons !== "undefined") && _.size(buttons) > 0) { %>',
- '',
- '<% } %>'
- ].join('');
-
- _options.tpl = _.template(this.template)(_options);
-
- this.url = options.url || '';
- this.frameId = options.frameId || 'plugin_iframe';
- Common.UI.Window.prototype.initialize.call(this, _options);
- },
-
- render: function() {
- Common.UI.Window.prototype.render.call(this);
- this.$window.find('> .body').css({height: 'auto', overflow: 'hidden'});
-
- this.boxEl = this.$window.find('.body > .box');
- this._headerFooterHeight = (this.options.buttons && _.size(this.options.buttons)>0) ? 85 : 34;
- if (!this.options.header) this._headerFooterHeight -= 34;
- this._headerFooterHeight += ((parseInt(this.$window.css('border-top-width')) + parseInt(this.$window.css('border-bottom-width'))));
-
- var iframe = document.createElement("iframe");
- iframe.id = this.frameId;
- iframe.name = 'pluginFrameEditor';
- iframe.width = '100%';
- iframe.height = '100%';
- iframe.align = "top";
- iframe.frameBorder = 0;
- iframe.scrolling = "no";
- iframe.allow = "camera; microphone; display-capture";
- iframe.onload = _.bind(this._onLoad,this);
-
- var me = this;
- setTimeout(function(){
- if (me.isLoaded) return;
- me.loadMask = new Common.UI.LoadMask({owner: $('#id-plugin-placeholder')});
- me.loadMask.setTitle(me.textLoading);
- me.loadMask.show();
- if (me.isLoaded) me.loadMask.hide();
- }, 500);
-
- iframe.src = this.url;
- $('#id-plugin-placeholder').append(iframe);
-
- this.on('resizing', function(args){
- me.boxEl.css('height', parseInt(me.$window.css('height')) - me._headerFooterHeight);
- });
-
- var onMainWindowResize = function(){
- me.onWindowResize();
- };
- $(window).on('resize', onMainWindowResize);
- this.on('close', function() {
- $(window).off('resize', onMainWindowResize);
- });
- },
-
- _onLoad: function() {
- this.isLoaded = true;
- if (this.loadMask)
- this.loadMask.hide();
- },
-
- setInnerSize: function(width, height) {
- var maxHeight = Common.Utils.innerHeight(),
- maxWidth = Common.Utils.innerWidth(),
- borders_width = (parseInt(this.$window.css('border-left-width')) + parseInt(this.$window.css('border-right-width'))),
- bordersOffset = this.bordersOffset*2;
- if (maxHeight - bordersOffsetmain_height-bordersOffset)
- this.$window.css('top', main_height-bordersOffset - win_height);
- if (leftmain_width-bordersOffset)
- this.$window.css('left', main_width-bordersOffset-win_width);
- } else {
- if (win_height>main_height-bordersOffset*2) {
- this.setHeight(Math.max(main_height-bordersOffset*2, this.initConfig.minheight));
- this.boxEl.css('height', Math.max(main_height-bordersOffset*2, this.initConfig.minheight) - this._headerFooterHeight);
- this.$window.css('top', bordersOffset);
- }
- if (win_width>main_width-bordersOffset*2) {
- this.setWidth(Math.max(main_width-bordersOffset*2, this.initConfig.minwidth));
- this.$window.css('left', bordersOffset);
- }
- }
- },
-
- textLoading : 'Loading'
- }, Common.Views.PluginDlg || {}));
});
\ No newline at end of file
diff --git a/apps/documenteditor/forms/app.js b/apps/documenteditor/forms/app.js
index 6ac4557d2..5535a30bf 100644
--- a/apps/documenteditor/forms/app.js
+++ b/apps/documenteditor/forms/app.js
@@ -139,7 +139,8 @@ require([
nameSpace: 'DE',
autoCreate: false,
controllers : [
- 'ApplicationController'
+ 'ApplicationController',
+ 'Plugins'
]
});
@@ -147,10 +148,12 @@ require([
function() {
require([
'documenteditor/forms/app/controller/ApplicationController',
+ 'documenteditor/forms/app/controller/Plugins',
'documenteditor/forms/app/view/ApplicationView',
'common/main/lib/util/utils',
'common/main/lib/util/LocalStorage',
'common/main/lib/controller/Themes',
+ 'common/main/lib/view/PluginDlg',
'common/forms/lib/view/modals'
], function() {
app.start();
diff --git a/apps/documenteditor/forms/app/controller/ApplicationController.js b/apps/documenteditor/forms/app/controller/ApplicationController.js
index 0a4788bd0..a898d25be 100644
--- a/apps/documenteditor/forms/app/controller/ApplicationController.js
+++ b/apps/documenteditor/forms/app/controller/ApplicationController.js
@@ -414,6 +414,8 @@ define([
this.appOptions.saveAsUrl = this.editorConfig.saveAsUrl;
this.appOptions.canRequestSaveAs = this.editorConfig.canRequestSaveAs;
this.appOptions.isDesktopApp = this.editorConfig.targetApp == 'desktop';
+ this.appOptions.lang = this.editorConfig.lang;
+ this.appOptions.canPlugins = false;
},
onExternalMessage: function(msg) {
@@ -564,6 +566,8 @@ define([
AscCommon.UserInfoParser.setParser(true);
AscCommon.UserInfoParser.setCurrentName(this.appOptions.user.fullname);
+ DE.getController('Plugins').setMode(this.appOptions, this.api);
+
var me = this;
me.view.btnSubmit.setVisible(this.appOptions.canFillForms && this.appOptions.canSubmitForms);
me.view.btnDownload.setVisible(this.appOptions.canDownload && this.appOptions.canFillForms && !this.appOptions.canSubmitForms);
@@ -1339,6 +1343,7 @@ define([
Common.NotificationCenter.on('storage:image-load', _.bind(this.openImageFromStorage, this)); // try to load image from storage
Common.NotificationCenter.on('storage:image-insert', _.bind(this.insertImageFromStorage, this)); // set loaded image to control
}
+ DE.getController('Plugins').setApi(this.api);
this.updateWindowTitle(true);
diff --git a/apps/documenteditor/forms/app/controller/Plugins.js b/apps/documenteditor/forms/app/controller/Plugins.js
new file mode 100644
index 000000000..4e3fbdbe9
--- /dev/null
+++ b/apps/documenteditor/forms/app/controller/Plugins.js
@@ -0,0 +1,457 @@
+/*
+ *
+ * (c) Copyright Ascensio System SIA 2010-2022
+ *
+ * This program is a free software product. You can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License (AGPL)
+ * version 3 as published by the Free Software Foundation. In accordance with
+ * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
+ * that Ascensio System SIA expressly excludes the warranty of non-infringement
+ * of any third-party rights.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
+ * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+ *
+ * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
+ * street, Riga, Latvia, EU, LV-1050.
+ *
+ * The interactive user interfaces in modified source and object code versions
+ * of the Program must display Appropriate Legal Notices, as required under
+ * Section 5 of the GNU AGPL version 3.
+ *
+ * Pursuant to Section 7(b) of the License you must retain the original Product
+ * logo when distributing the program. Pursuant to Section 7(e) we decline to
+ * grant you any rights under trademark law for use of our trademarks.
+ *
+ * All the Product's GUI elements, including illustrations and icon sets, as
+ * well as technical writing content are licensed under the terms of the
+ * Creative Commons Attribution-ShareAlike 4.0 International. See the License
+ * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+ *
+*/
+/**
+ * User: Julia.Radzhabova
+ * Date: 22.02.2022
+ */
+
+define([
+ 'core',
+ 'common/main/lib/collection/Plugins',
+ 'common/main/lib/view/PluginDlg'
+], function () {
+ 'use strict';
+
+ DE.Controllers.Plugins = Backbone.Controller.extend(_.extend({
+ models: [],
+ appOptions: {},
+ configPlugins: {autostart:[]},// {config: 'from editor config', plugins: 'loaded plugins', autostart: 'autostart guids'}
+ serverPlugins: {autostart:[]},// {config: 'from editor config', plugins: 'loaded plugins', autostart: 'autostart guids'}
+ collections: [
+ 'Common.Collections.Plugins'
+ ],
+ initialize: function() {
+ },
+
+ events: function() {
+ },
+
+ onLaunch: function() {
+ this._moveOffset = {x:0, y:0};
+ this.autostart = [];
+
+ Common.Gateway.on('init', this.loadConfig.bind(this));
+ },
+
+ loadConfig: function(data) {
+ var me = this;
+ me.configPlugins.config = data.config.plugins;
+ me.editor = 'word';
+ },
+
+ loadPlugins: function() {
+ if (this.configPlugins.config) {
+ this.getPlugins(this.configPlugins.config.pluginsData)
+ .then(function(loaded)
+ {
+ me.configPlugins.plugins = loaded;
+ me.mergePlugins();
+ })
+ .catch(function(err)
+ {
+ me.configPlugins.plugins = false;
+ });
+ } else
+ this.configPlugins.plugins = false;
+
+ var server_plugins_url = '../../../../plugins.json',
+ me = this;
+ Common.Utils.loadConfig(server_plugins_url, function (obj) {
+ if ( obj != 'error' ) {
+ me.serverPlugins.config = obj;
+ me.getPlugins(me.serverPlugins.config.pluginsData)
+ .then(function(loaded)
+ {
+ me.serverPlugins.plugins = loaded;
+ me.mergePlugins();
+ })
+ .catch(function(err)
+ {
+ me.serverPlugins.plugins = false;
+ });
+ } else
+ me.serverPlugins.plugins = false;
+ });
+ },
+
+ setApi: function(api) {
+ this.api = api;
+
+ if (!this.appOptions.customization || (this.appOptions.customization.plugins!==false)) {
+ this.api.asc_registerCallback("asc_onPluginShow", _.bind(this.onPluginShow, this));
+ this.api.asc_registerCallback("asc_onPluginClose", _.bind(this.onPluginClose, this));
+ this.api.asc_registerCallback("asc_onPluginResize", _.bind(this.onPluginResize, this));
+ this.api.asc_registerCallback("asc_onPluginMouseUp", _.bind(this.onPluginMouseUp, this));
+ this.api.asc_registerCallback("asc_onPluginMouseMove", _.bind(this.onPluginMouseMove, this));
+ this.api.asc_registerCallback('asc_onPluginsReset', _.bind(this.resetPluginsList, this));
+ this.api.asc_registerCallback('asc_onPluginsInit', _.bind(this.onPluginsInit, this));
+
+ this.loadPlugins();
+ }
+ return this;
+ },
+
+ setMode: function(mode, api) {
+ this.appOptions = mode;
+ this.api = api;
+ return this;
+ },
+
+ refreshPluginsList: function() {
+ var me = this;
+ var storePlugins = this.getApplication().getCollection('Common.Collections.Plugins'),
+ arr = [];
+ storePlugins.each(function(item){
+ var plugin = new Asc.CPlugin();
+ plugin.deserialize(item.attributes);
+
+ var variations = item.get('variations'),
+ variationsArr = [];
+ variations.forEach(function(itemVar){
+ var variation = new Asc.CPluginVariation();
+ variation.deserialize(itemVar.attributes);
+ variationsArr.push(variation);
+ });
+
+ plugin.set_Variations(variationsArr);
+ item.set('pluginObj', plugin);
+ arr.push(plugin);
+ });
+ this.api.asc_pluginsRegister('', arr);
+ Common.Gateway.pluginsReady();
+ },
+
+ onPluginShow: function(plugin, variationIndex, frameId, urlAddition) {
+ var variation = plugin.get_Variations()[variationIndex];
+ if (variation.get_Visual()) {
+ var url = variation.get_Url();
+ url = ((plugin.get_BaseUrl().length == 0) ? url : plugin.get_BaseUrl()) + url;
+ if (urlAddition)
+ url += urlAddition;
+ var me = this,
+ isCustomWindow = variation.get_CustomWindow(),
+ arrBtns = variation.get_Buttons(),
+ newBtns = [],
+ size = variation.get_Size(),
+ isModal = variation.get_Modal();
+ if (!size || size.length<2) size = [800, 600];
+
+ if (_.isArray(arrBtns)) {
+ _.each(arrBtns, function(b, index){
+ if (b.visible)
+ newBtns[index] = {caption: b.text, value: index, primary: b.primary};
+ });
+ }
+
+ var help = variation.get_Help();
+ me.pluginDlg = new Common.Views.PluginDlg({
+ cls: isCustomWindow ? 'plain' : '',
+ header: !isCustomWindow,
+ title: plugin.get_Name(),
+ width: size[0], // inner width
+ height: size[1], // inner height
+ url: url,
+ frameId : frameId,
+ buttons: isCustomWindow ? undefined : newBtns,
+ toolcallback: _.bind(this.onToolClose, this),
+ help: !!help,
+ modal: isModal!==undefined ? isModal : true
+ });
+ me.pluginDlg.on({
+ 'render:after': function(obj){
+ obj.getChild('.footer .dlg-btn').on('click', _.bind(me.onDlgBtnClick, me));
+ me.pluginContainer = me.pluginDlg.$window.find('#id-plugin-container');
+ },
+ 'close': function(obj){
+ me.pluginDlg = undefined;
+ },
+ 'drag': function(args){
+ me.api.asc_pluginEnableMouseEvents(args[1]=='start');
+ },
+ 'resize': function(args){
+ me.api.asc_pluginEnableMouseEvents(args[1]=='start');
+ },
+ 'help': function(){
+ help && window.open(help, '_blank');
+ }
+ });
+
+ me.pluginDlg.show();
+ }
+ },
+
+ onPluginClose: function(plugin) {
+ if (this.pluginDlg)
+ this.pluginDlg.close();
+ this.runAutoStartPlugins();
+ },
+
+ onPluginResize: function(size, minSize, maxSize, callback ) {
+ if (this.pluginDlg) {
+ var resizable = (minSize && minSize.length>1 && maxSize && maxSize.length>1 && (maxSize[0] > minSize[0] || maxSize[1] > minSize[1] || maxSize[0]==0 || maxSize[1] == 0));
+ this.pluginDlg.setResizable(resizable, minSize, maxSize);
+ this.pluginDlg.setInnerSize(size[0], size[1]);
+ if (callback)
+ callback.call();
+ }
+ },
+
+ onDlgBtnClick: function(event) {
+ var state = event.currentTarget.attributes['result'].value;
+ this.api.asc_pluginButtonClick(parseInt(state));
+ },
+
+ onToolClose: function() {
+ this.api.asc_pluginButtonClick(-1);
+ },
+
+ onPluginMouseUp: function(x, y) {
+ if (this.pluginDlg) {
+ if (this.pluginDlg.binding.dragStop) this.pluginDlg.binding.dragStop();
+ if (this.pluginDlg.binding.resizeStop) this.pluginDlg.binding.resizeStop();
+ }
+ },
+
+ onPluginMouseMove: function(x, y) {
+ if (this.pluginDlg) {
+ var offset = this.pluginContainer.offset();
+ if (this.pluginDlg.binding.drag) this.pluginDlg.binding.drag({ pageX: x*Common.Utils.zoom()+offset.left, pageY: y*Common.Utils.zoom()+offset.top });
+ if (this.pluginDlg.binding.resize) this.pluginDlg.binding.resize({ pageX: x*Common.Utils.zoom()+offset.left, pageY: y*Common.Utils.zoom()+offset.top });
+ }
+ },
+
+ onPluginsInit: function(pluginsdata) {
+ !(pluginsdata instanceof Array) && (pluginsdata = pluginsdata["pluginsData"]);
+ this.parsePlugins(pluginsdata)
+ },
+
+ runAutoStartPlugins: function() {
+ if (this.autostart && this.autostart.length > 0) {
+ this.api.asc_pluginRun(this.autostart.shift(), 0, '');
+ }
+ },
+
+ resetPluginsList: function() {
+ this.getApplication().getCollection('Common.Collections.Plugins').reset();
+ },
+
+ parsePlugins: function(pluginsdata) {
+ var me = this;
+ var pluginStore = this.getApplication().getCollection('Common.Collections.Plugins'),
+ isEdit = false,
+ editor = me.editor,
+ apiVersion = me.api ? me.api.GetVersion() : undefined;
+ if ( pluginsdata instanceof Array ) {
+ var arr = [],
+ lang = me.appOptions.lang.split(/[\-_]/)[0];
+ pluginsdata.forEach(function(item){
+ if ( arr.some(function(i) {
+ return (i.get('baseUrl') == item.baseUrl || i.get('guid') == item.guid);
+ }
+ ) || pluginStore.findWhere({baseUrl: item.baseUrl}) || pluginStore.findWhere({guid: item.guid}))
+ {
+ return;
+ }
+
+ var variationsArr = [],
+ pluginVisible = false;
+ item.variations.forEach(function(itemVar){
+ var visible = (isEdit || itemVar.isViewer && (itemVar.isDisplayedInViewer!==false)) && _.contains(itemVar.EditorsSupport, editor) && !itemVar.isSystem;
+ if ( visible ) pluginVisible = true;
+
+ if (!item.isUICustomizer ) {
+ var model = new Common.Models.PluginVariation(itemVar);
+ var description = itemVar.description;
+ if (typeof itemVar.descriptionLocale == 'object')
+ description = itemVar.descriptionLocale[lang] || itemVar.descriptionLocale['en'] || description || '';
+
+ _.each(itemVar.buttons, function(b, index){
+ if (typeof b.textLocale == 'object')
+ b.text = b.textLocale[lang] || b.textLocale['en'] || b.text || '';
+ b.visible = (isEdit || b.isViewer !== false);
+ });
+
+ model.set({
+ description: description,
+ index: variationsArr.length,
+ url: itemVar.url,
+ icons: itemVar.icons2 || itemVar.icons,
+ buttons: itemVar.buttons,
+ visible: visible,
+ help: itemVar.help
+ });
+
+ variationsArr.push(model);
+ }
+ });
+
+ if (variationsArr.length > 0 && !item.isUICustomizer) {
+ var name = item.name;
+ if (typeof item.nameLocale == 'object')
+ name = item.nameLocale[lang] || item.nameLocale['en'] || name || '';
+
+ if (pluginVisible)
+ pluginVisible = me.checkPluginVersion(apiVersion, item.minVersion);
+
+ arr.push(new Common.Models.Plugin({
+ name : name,
+ guid: item.guid,
+ baseUrl : item.baseUrl,
+ variations: variationsArr,
+ currentVariation: 0,
+ visible: pluginVisible,
+ groupName: (item.group) ? item.group.name : '',
+ groupRank: (item.group) ? item.group.rank : 0,
+ minVersion: item.minVersion
+ }));
+ }
+ });
+
+ if (pluginStore)
+ {
+ arr = pluginStore.models.concat(arr);
+ arr.sort(function(a, b){
+ var rank_a = a.get('groupRank'),
+ rank_b = b.get('groupRank');
+ if (rank_a < rank_b)
+ return (rank_a==0) ? 1 : -1;
+ if (rank_a > rank_b)
+ return (rank_b==0) ? -1 : 1;
+ return 0;
+ });
+ pluginStore.reset(arr);
+ this.appOptions.canPlugins = !pluginStore.isEmpty();
+ }
+ }
+ else {
+ this.appOptions.canPlugins = false;
+ }
+
+ if (this.appOptions.canPlugins) {
+ this.refreshPluginsList();
+ this.runAutoStartPlugins();
+ }
+ },
+
+ checkPluginVersion: function(apiVersion, pluginVersion) {
+ if (apiVersion && apiVersion!=='develop' && pluginVersion && typeof pluginVersion == 'string') {
+ var res = pluginVersion.match(/^([0-9]+)(?:.([0-9]+))?(?:.([0-9]+))?$/),
+ apires = apiVersion.match(/^([0-9]+)(?:.([0-9]+))?(?:.([0-9]+))?$/);
+ if (res && res.length>1 && apires && apires.length>1) {
+ for (var i=0; i<3; i++) {
+ var pluginVer = res[i+1] ? parseInt(res[i+1]) : 0,
+ apiVer = apires[i+1] ? parseInt(apires[i+1]) : 0;
+ if (pluginVer>apiVer)
+ return false;
+ if (pluginVer0)
+ arr = plugins.plugins;
+ if (plugins && plugins.config) {
+ var val = plugins.config.autostart || plugins.config.autoStartGuid;
+ if (typeof (val) == 'string')
+ val = [val];
+ warn = !!plugins.config.autoStartGuid;
+ autostart = val || [];
+ }
+
+ plugins = this.serverPlugins;
+ if (plugins.plugins && plugins.plugins.length>0)
+ arr = arr.concat(plugins.plugins);
+ if (plugins && plugins.config) {
+ val = plugins.config.autostart || plugins.config.autoStartGuid;
+ if (typeof (val) == 'string')
+ val = [val];
+ (warn || plugins.config.autoStartGuid) && console.warn("Obsolete: The autoStartGuid parameter is deprecated. Please check the documentation for new plugin connection configuration.");
+ autostart = autostart.concat(val || []);
+ }
+
+ this.autostart = autostart;
+ this.parsePlugins(arr);
+ }
+ }
+
+ }, DE.Controllers.Plugins || {}));
+});
diff --git a/apps/documenteditor/forms/app_dev.js b/apps/documenteditor/forms/app_dev.js
index 33aa736fc..d9800d9c6 100644
--- a/apps/documenteditor/forms/app_dev.js
+++ b/apps/documenteditor/forms/app_dev.js
@@ -129,7 +129,8 @@ require([
nameSpace: 'DE',
autoCreate: false,
controllers : [
- 'ApplicationController'
+ 'ApplicationController',
+ 'Plugins'
]
});
@@ -137,10 +138,12 @@ require([
function() {
require([
'documenteditor/forms/app/controller/ApplicationController',
+ 'documenteditor/forms/app/controller/Plugins',
'documenteditor/forms/app/view/ApplicationView',
'common/main/lib/util/utils',
'common/main/lib/util/LocalStorage',
'common/main/lib/controller/Themes',
+ 'common/main/lib/view/PluginDlg',
'common/forms/lib/view/modals'
], function() {
window.compareVersions = true;