diff --git a/apps/common/main/lib/controller/Plugins.js b/apps/common/main/lib/controller/Plugins.js index 3af8ce85c..bc439ffc2 100644 --- a/apps/common/main/lib/controller/Plugins.js +++ b/apps/common/main/lib/controller/Plugins.js @@ -205,7 +205,7 @@ define([ plugin.set_Name(item.get('name')); plugin.set_Guid(item.get('guid')); plugin.set_BaseUrl(item.get('baseUrl')); - plugin.set_MinVersion(item.get('minVersion')); + plugin.set_MinVersion && plugin.set_MinVersion(item.get('minVersion')); var variations = item.get('variations'), variationsArr = []; @@ -513,7 +513,7 @@ define([ var pluginStore = this.getApplication().getCollection('Common.Collections.Plugins'), isEdit = me.appOptions.isEdit, editor = me.editor, - apiVersion = me.api.GetVersion(); + apiVersion = me.api.GetVersion ? me.api.GetVersion() : null; if ( pluginsdata instanceof Array ) { var arr = [], arrUI = [], lang = me.appOptions.lang.split(/[\-_]/)[0]; diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index c64ec0b3b..f55c19cdd 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -60,7 +60,8 @@ define([ 'documenteditor/main/app/view/WatermarkSettingsDialog', 'documenteditor/main/app/view/ListSettingsDialog', 'documenteditor/main/app/view/DateTimeDialog', - 'documenteditor/main/app/view/LineNumbersDialog' + 'documenteditor/main/app/view/LineNumbersDialog', + 'documenteditor/main/app/view/TextToTableDialog' ], function () { 'use strict'; @@ -1511,9 +1512,8 @@ define([ }, onInsertTableClick: function(menu, item, e) { + var me = this; if (item.value === 'custom') { - var me = this; - (new Common.Views.InsertTableDialog({ handler: function(result, value) { if (result == 'ok') { @@ -1534,6 +1534,16 @@ define([ } else if (item.value == 'erase') { item.isChecked() && menu.items[2].setChecked(false, true); this.api.SetTableEraseMode(item.isChecked()); + } else if (item.value == 'convert') { + (new DE.Views.TextToTableDialog({ + props: this.api.asc_PreConvertTextToTable(), + handler: function(result, value) { + if (result == 'ok' && me.api) { + me.api.asc_ConvertTextToTable(value); + } + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + })).show(); } }, diff --git a/apps/documenteditor/main/app/view/TextToTableDialog.js b/apps/documenteditor/main/app/view/TextToTableDialog.js new file mode 100644 index 000000000..7d5cdebbb --- /dev/null +++ b/apps/documenteditor/main/app/view/TextToTableDialog.js @@ -0,0 +1,406 @@ +/* + * + * (c) Copyright Ascensio System SIA 2010-2021 + * + * 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 + * + */ +/** + * TextToTableDialog.js + * + * Created by Julia Radzhabova on 15/04/21 + * Copyright (c) 2021 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/view/AdvancedSettingsWindow', + 'common/main/lib/component/CheckBox', + 'common/main/lib/component/MetricSpinner' +], function () { 'use strict'; + + DE.Views.TextToTableDialog = Common.Views.AdvancedSettingsWindow.extend(_.extend({ + options: { + contentWidth: 300, + height: 405, + buttons: ['ok', 'cancel'] + }, + + initialize : function(options) { + var me = this; + + _.extend(this.options, { + title: this.textTitle, + template: [ + '
', + '
', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '
', + '', + '
', + '', + '', + '
', + '
', + '', + '', + '
', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '
', + '', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
' + ].join('') + }, options); + + this.handler = options.handler; + this.props = options.props; + this.spinners = []; + + Common.Views.AdvancedSettingsWindow.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.Views.AdvancedSettingsWindow.prototype.render.call(this); + + var $window = this.getChild(), + me = this; + + this.spnColumns = new Common.UI.MetricSpinner({ + el : $window.find('#id-text-table-spn-columns'), + step : 1, + width : 80, + value : 2, + defaultUnit : '', + maxValue : 63, + minValue : 1, + allowDecimal: false + }).on('change', function(field, newValue, oldValue, eOpts){ + if (me.props) { + var size = me.props.put_ColsCount(field.getNumberValue(), true); + size && me.spnRows.setValue(size.rows, true); + } + }); + + this.spnRows = new Common.UI.MetricSpinner({ + el : $window.find('#id-text-table-spn-rows'), + step : 1, + width : 80, + value : 2, + defaultUnit : '', + maxValue : 100, + minValue : 1, + allowDecimal: false, + disabled: true + }); + + this.spnWidth = new Common.UI.MetricSpinner({ + el: $window.find('#id-text-table-spn-fixed'), + step: 0.1, + width: 64, + defaultUnit : 'cm', + value: 'Auto', + autoText : this.txtAutoText, + maxValue: 55.87, + minValue: 0.42, + allowAuto: true + }); + this.spinners.push(this.spnWidth); + + this.rbFixed = new Common.UI.RadioBox({ + el: $window.find('#id-text-table-radio-fixed'), + labelText: this.textFixed, + name: 'asc-radio-text-table-autofit', + value: 1, + checked: true + }).on('change', _.bind(this.onRadioAutofitChange, this)); + this.rbContents = new Common.UI.RadioBox({ + el: $window.find('#id-text-table-radio-contents'), + labelText: this.textContents, + name: 'asc-radio-text-table-autofit', + value: 2 + }).on('change', _.bind(this.onRadioAutofitChange, this)); + this.rbWindow = new Common.UI.RadioBox({ + el: $window.find('#id-text-table-radio-window'), + labelText: this.textWindow, + name: 'asc-radio-text-table-autofit', + value: 3 + }).on('change', _.bind(this.onRadioAutofitChange, this)); + + this.rbPara = new Common.UI.RadioBox({ + el: $window.find('#id-text-table-radio-para'), + labelText: this.textPara, + name: 'asc-radio-text-table-separator', + value: 1, + checked: true + }).on('change', _.bind(this.onRadioSeparatorChange, this)); + + this.rbTabs = new Common.UI.RadioBox({ + el: $window.find('#id-text-table-radio-tabs'), + labelText: this.textTab, + name: 'asc-radio-text-table-separator', + value: 2 + }).on('change', _.bind(this.onRadioSeparatorChange, this)); + + this.rbSemi = new Common.UI.RadioBox({ + el: $window.find('#id-text-table-radio-semi'), + labelText: this.textSemicolon, + name: 'asc-radio-text-table-separator', + value: ',' + }).on('change', _.bind(this.onRadioSeparatorChange, this)); + + this.rbOther = new Common.UI.RadioBox({ + el: $window.find('#id-text-table-radio-other'), + labelText: this.textOther, + name: 'asc-radio-text-table-separator', + value: 3 + }).on('change', _.bind(this.onRadioSeparatorChange, this)); + + this.inputOther = new Common.UI.InputField({ + el : $window.find('#id-text-table-txt-other'), + style : 'width: 30px;', + maxLength: 1, + validateOnChange: true, + validateOnBlur: false, + value: '-' + }).on ('changing', function(input, newValue) { + if (me.props && newValue) { + me.props.put_SeparatorType(3, true); + var size = me.props.put_Separator(newValue.charCodeAt(0), true); + if (size) { + me.spnColumns.setValue(size.cols, true); + me.spnRows.setValue(size.rows, true); + } + } + }); + + this.afterRender(); + }, + + getFocusedComponents: function() { + return [this.spnColumns, this.spnStartAt, this.spnWidth, this.rbFixed, this.rbContents, this.rbWindow, this.rbPara, this.rbTabs, this.rbSemi, this.rbOther, this.inputOther]; + }, + + getDefaultFocusableComponent: function () { + return this.spnColumns; + }, + + afterRender: function() { + this.updateMetricUnit(); + this._setDefaults(this.props); + }, + + _setDefaults: function (props) { + if (props) { + var val = props.get_Size(); + this.spnColumns.setValue(val.cols, true); + this.spnRows.setValue(val.rows, true); + + val = props.get_AutoFitType(); + (val===1) ? this.rbFixed.setValue(true, true) : (val===2 ? this.rbContents.setValue(true, true) : this.rbWindow.setValue(true, true)); + (val===1) && this.spnWidth.setValue(props.get_Fit()>-1 ? Common.Utils.Metric.fnRecalcFromMM(props.get_Fit()) : -1, true); + + val = props.get_SeparatorType(); + switch (val) { + case 1: + this.rbPara.setValue(true, true); + break; + case 2: + this.rbTabs.setValue(true, true); + break; + case 3: + val = String.fromCharCode(props.get_Separator()); + if (val == ',') + this.rbSemi.setValue(true, true); + else { + this.rbOther.setValue(true, true); + this.inputOther.setValue(val); + } + break; + } + } + }, + + getSettings: function () { + if (this.props) { + this.props.put_AutoFitType(this.rbFixed.getValue() ? 1 : (this.rbContents.getValue() ? 2 : 3)); + this.rbFixed.getValue() && this.props.put_Fit(Common.Utils.Metric.fnRecalcToMM(this.spnWidth.getNumberValue())); + } + + return {props: this.props}; + }, + + onDlgBtnClick: function(event) { + var state = (typeof(event) == 'object') ? event.currentTarget.attributes['result'].value : event; + if (state == 'ok') { + if (!this.isRangeValid()) return; + this.handler && this.handler.call(this, state, (state == 'ok') ? this.getSettings() : undefined); + } + + this.close(); + }, + + onPrimary: function() { + this.onDlgBtnClick('ok'); + return false; + }, + + isRangeValid: function() { + if (this.rbOther.getValue() && this.inputOther.getValue()=='') { + var me = this; + Common.UI.warning({ + msg: this.textEmpty, + maxwidth: 600, + callback: function(btn){ + me.inputOther.focus(); + }}); + return false; + } + return true; + }, + + onRadioAutofitChange: function(field, newValue, eOpts) { + var value = field.options.value, + me = this; + if (newValue && this.props) { + me.spnWidth.setDisabled(value!==1); + (value==1) && setTimeout(function(){me.spnWidth.focus(); }, 1); + } + }, + + onRadioSeparatorChange: function(field, newValue, eOpts) { + var value = field.options.value, + me = this, + size; + if (newValue && this.props) { + this.inputOther.setDisabled(value!==3); + if (typeof value === 'string') { + this.props.put_SeparatorType(3, true); + size = this.props.put_Separator(value.charCodeAt(0), true); + } else { + size = this.props.put_SeparatorType(value, true); + if (value==3) { + if (this.inputOther.getValue()) + size = this.props.put_Separator(this.inputOther.getValue().charCodeAt(0), true); + setTimeout(function(){ me.inputOther.focus(); }, 1); + } + } + if (size) { + this.spnColumns.setValue(size.cols, true); + this.spnRows.setValue(size.rows, true); + } + } + }, + + updateMetricUnit: function() { + if (this.spinners) { + for (var i=0; i')}, {caption: this.mniCustomTable, value: 'custom'}, {caption: this.mniDrawTable, value: 'draw', checkable: true}, - {caption: this.mniEraseTable, value: 'erase', checkable: true} + {caption: this.mniEraseTable, value: 'erase', checkable: true}, + {caption: this.mniTextToTable, value: 'convert'} ] }) }); @@ -2451,7 +2452,8 @@ define([ mniUpperCase: 'UPPERCASE', mniCapitalizeWords: 'Capitalize Each Word', mniToggleCase: 'tOGGLE cASE', - textChangeLevel: 'Change List Level' + textChangeLevel: 'Change List Level', + mniTextToTable: 'Convert Text to Table' } })(), DE.Views.Toolbar || {})); }); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index e365f5f3c..4f61bc190 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -2489,6 +2489,21 @@ "DE.Views.TextArtSettings.tipAddGradientPoint": "Add gradient point", "DE.Views.TextArtSettings.tipRemoveGradientPoint": "Remove gradient point", "DE.Views.TextArtSettings.txtNoBorders": "No Line", + "DE.Views.TextToTableDialog.textTitle": "Convert Text to Table", + "DE.Views.TextToTableDialog.textTableSize": "Table Size", + "DE.Views.TextToTableDialog.textColumns": "Columns", + "DE.Views.TextToTableDialog.textRows": "Rows", + "DE.Views.TextToTableDialog.textAutofit": "Autofit Behavior", + "DE.Views.TextToTableDialog.textFixed": "Fixed column width", + "DE.Views.TextToTableDialog.textContents": "Autofit to contents", + "DE.Views.TextToTableDialog.textWindow": "Autofit to window", + "DE.Views.TextToTableDialog.textSeparator": "Separate Text at", + "DE.Views.TextToTableDialog.textPara": "Paragraphs", + "DE.Views.TextToTableDialog.textTab": "Tabs", + "DE.Views.TextToTableDialog.textSemicolon": "Semicolons", + "DE.Views.TextToTableDialog.textOther": "Other", + "DE.Views.TextToTableDialog.txtAutoText": "Auto", + "DE.Views.TextToTableDialog.textEmpty": "You must type a character for the custom separator.", "DE.Views.Toolbar.capBtnAddComment": "Add Comment", "DE.Views.Toolbar.capBtnBlankPage": "Blank Page", "DE.Views.Toolbar.capBtnColumns": "Columns", @@ -2695,6 +2710,7 @@ "DE.Views.Toolbar.txtScheme7": "Equity", "DE.Views.Toolbar.txtScheme8": "Flow", "DE.Views.Toolbar.txtScheme9": "Foundry", + "DE.Views.Toolbar.mniTextToTable": "Convert Text to Table", "DE.Views.WatermarkSettingsDialog.textAuto": "Auto", "DE.Views.WatermarkSettingsDialog.textBold": "Bold", "DE.Views.WatermarkSettingsDialog.textColor": "Text color",