diff --git a/apps/documenteditor/main/app/template/TableSettings.template b/apps/documenteditor/main/app/template/TableSettings.template index 689724965..610bbe425 100644 --- a/apps/documenteditor/main/app/template/TableSettings.template +++ b/apps/documenteditor/main/app/template/TableSettings.template @@ -157,6 +157,16 @@
+ + +
+ + + + +
+ + diff --git a/apps/documenteditor/main/app/view/TableSettings.js b/apps/documenteditor/main/app/view/TableSettings.js index 6661e66e3..a93e3aae2 100644 --- a/apps/documenteditor/main/app/view/TableSettings.js +++ b/apps/documenteditor/main/app/view/TableSettings.js @@ -51,7 +51,8 @@ define([ 'common/main/lib/component/ComboDataView', 'common/main/lib/view/InsertTableDialog', 'documenteditor/main/app/view/TableSettingsAdvanced', - 'documenteditor/main/app/view/TableFormulaDialog' + 'documenteditor/main/app/view/TableFormulaDialog', + 'documenteditor/main/app/view/TableToTextDialog' ], function (menuTemplate, $, _, Backbone) { 'use strict'; @@ -421,6 +422,16 @@ define([ this.lockedControls.push(this.btnAddFormula); this.btnAddFormula.on('click', _.bind(this.onAddFormula, this)); + this.btnConvert = new Common.UI.Button({ + parentEl: $('#table-btn-convert-to-text'), + cls : 'btn-toolbar', + iconCls : 'toolbar__icon btn-remove-duplicates', + caption : this.textConvert, + style : 'width: 100%;text-align: left;' + }); + this.btnConvert.on('click', _.bind(this.onConvertTable, this)); + this.lockedControls.push(this.btnConvert); + this.linkAdvanced = $('#table-advanced-link'); $(this.el).on('click', '#table-advanced-link', _.bind(this.openAdvancedSettings, this)); }, @@ -788,6 +799,21 @@ define([ } }, + onConvertTable: function(e) { + var me = this; + if (me.api && !this._locked){ + (new DE.Views.TableToTextDialog({ + handler: function(dlg, result) { + if (result == 'ok') { + var settings = dlg.getSettings(); + me.api.asc_ConvertTableToText(settings.type, settings.separator, settings.nested); + } + me.fireEvent('editcomplete', me); + } + })).show(); + } + }, + setLocked: function (locked) { this._locked = locked; }, @@ -858,7 +884,8 @@ define([ txtTable_Light: 'Light', txtTable_Dark: 'Dark', txtTable_Colorful: 'Colorful', - txtTable_Accent: 'Accent' + txtTable_Accent: 'Accent', + textConvert: 'Convert Table to Text' }, DE.Views.TableSettings || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/TableToTextDialog.js b/apps/documenteditor/main/app/view/TableToTextDialog.js new file mode 100644 index 000000000..9d8aedc8f --- /dev/null +++ b/apps/documenteditor/main/app/view/TableToTextDialog.js @@ -0,0 +1,218 @@ +/* + * + * (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 + * + */ +/** + * TableToTextDialog.js + * + * Created by Julia Radzhabova on 15/04/21 + * Copyright (c) 2021 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/component/Window', + 'common/main/lib/component/CheckBox', + 'common/main/lib/component/RadioBox' +], function () { 'use strict'; + + DE.Views.TableToTextDialog = Common.UI.Window.extend(_.extend({ + options: { + width: 240, + height: 254, + header: true, + style: 'min-width: 240px;', + cls: 'modal-dlg', + buttons: ['ok', 'cancel'] + }, + + initialize : function(options) { + _.extend(this.options, { + title: this.textTitle + }, options || {}); + + this.template = [ + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
' + ].join(''); + + this.options.tpl = _.template(this.template)(this.options); + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + var $window = this.getChild(), + me = this; + + this.rbPara = new Common.UI.RadioBox({ + el: $window.find('#id-table-text-radio-para'), + labelText: this.textPara, + name: 'asc-radio-table-text-separator', + value: 1 + }).on('change', _.bind(this.onRadioSeparatorChange, this)); + + this.rbTabs = new Common.UI.RadioBox({ + el: $window.find('#id-table-text-radio-tabs'), + labelText: this.textTab, + name: 'asc-radio-table-text-separator', + value: 2, + checked: true + }).on('change', _.bind(this.onRadioSeparatorChange, this)); + + this.rbSemi = new Common.UI.RadioBox({ + el: $window.find('#id-table-text-radio-semi'), + labelText: this.textSemicolon, + name: 'asc-radio-table-text-separator', + value: ',' + }).on('change', _.bind(this.onRadioSeparatorChange, this)); + + this.rbOther = new Common.UI.RadioBox({ + el: $window.find('#id-table-text-radio-other'), + labelText: this.textOther, + name: 'asc-radio-table-text-separator', + value: 3 + }).on('change', _.bind(this.onRadioSeparatorChange, this)); + + this.inputOther = new Common.UI.InputField({ + el : $window.find('#id-table-text-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.chNested = new Common.UI.CheckBox({ + el: $window.find('#id-table-text-check-nested'), + labelText: this.textNested, + value: true, + disabled: true + }).on('change', _.bind(function(field, newValue, oldValue, eOpts){ + }, this)); + + this.getChild().find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); + }, + + getFocusedComponents: function() { + return [this.rbPara, this.rbTabs, this.rbSemi, this.rbOther, this.inputOther, this.chNested]; + }, + + getDefaultFocusableComponent: function () { + return this.rbTabs; + }, + + setSettings: function (props) { + if (props) { + } + }, + + _handleInput: function(state) { + if (this.options.handler) { + if (state == 'ok') { + if (!this.isRangeValid()) return; + } + this.options.handler.call(this, this, state); + } + + this.close(); + }, + + onBtnClick: function(event) { + this._handleInput(event.currentTarget.attributes['result'].value); + }, + + onPrimary: function() { + this._handleInput('ok'); + return false; + }, + + getSettings: function() { + var type = this.rbPara.getValue() ? 1 : (this.rbTabs.getValue() ? 2 : 3), + separator = this.rbSemi.getValue() ? ','.charCodeAt(0) : (this.rbOther.getValue() ? this.inputOther.getValue().charCodeAt(0) : undefined); + + return {type: type, separator: separator, nested: this.chNested.getValue()==='checked'}; + }, + + onRadioSeparatorChange: function(field, newValue, eOpts) { + var value = field.options.value, + me = this; + if (newValue) { + this.inputOther.setDisabled(value!==3); + (value==3) && setTimeout(function(){ me.inputOther.focus(); }, 1); + (value!==1) && this.chNested.setValue(true); + this.chNested.setDisabled(value!==1); + } + }, + + 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; + }, + + textTitle: 'Convert Table to Text', + textSeparator: 'Separate text with', + textPara: 'Paragraph marks', + textTab: 'Tabs', + textSemicolon: 'Semicolons', + textOther: 'Other', + textNested: 'Convert nested tables', + textEmpty: 'You must type a character for the custom separator.' + }, DE.Views.TableToTextDialog || {})) +}); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/TextToTableDialog.js b/apps/documenteditor/main/app/view/TextToTableDialog.js index 7d5cdebbb..1062a2f98 100644 --- a/apps/documenteditor/main/app/view/TextToTableDialog.js +++ b/apps/documenteditor/main/app/view/TextToTableDialog.js @@ -284,22 +284,27 @@ define([ 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); + this.spnWidth.setDisabled(val!==1); val = props.get_SeparatorType(); switch (val) { case 1: this.rbPara.setValue(true, true); + this.inputOther.setDisabled(true); break; case 2: this.rbTabs.setValue(true, true); + this.inputOther.setDisabled(true); break; case 3: val = String.fromCharCode(props.get_Separator()); - if (val == ',') + if (val == ',') { this.rbSemi.setValue(true, true); - else { + this.inputOther.setDisabled(true); + } else { this.rbOther.setValue(true, true); this.inputOther.setValue(val); + this.inputOther.setDisabled(false); } break; } diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 4f61bc190..f71862637 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -2394,6 +2394,7 @@ "DE.Views.TableSettings.txtTable_ListTable": "List Table", "DE.Views.TableSettings.txtTable_PlainTable": "Plain Table", "DE.Views.TableSettings.txtTable_TableGrid": "Table Grid", + "DE.Views.TableSettings.textConvert": "Convert Table to Text", "DE.Views.TableSettingsAdvanced.textAlign": "Alignment", "DE.Views.TableSettingsAdvanced.textAlignment": "Alignment", "DE.Views.TableSettingsAdvanced.textAllowSpacing": "Spacing between cells", @@ -2466,6 +2467,14 @@ "DE.Views.TableSettingsAdvanced.txtNoBorders": "No borders", "DE.Views.TableSettingsAdvanced.txtPercent": "Percent", "DE.Views.TableSettingsAdvanced.txtPt": "Point", + "DE.Views.TableToTextDialog.textTitle": "Convert Table to Text", + "DE.Views.TableToTextDialog.textSeparator": "Separate text with", + "DE.Views.TableToTextDialog.textPara": "Paragraph marks", + "DE.Views.TableToTextDialog.textTab": "Tabs", + "DE.Views.TableToTextDialog.textSemicolon": "Semicolons", + "DE.Views.TableToTextDialog.textOther": "Other", + "DE.Views.TableToTextDialog.textNested": "Convert nested tables", + "DE.Views.TableToTextDialog.textEmpty": "You must type a character for the custom separator.", "DE.Views.TextArtSettings.strColor": "Color", "DE.Views.TextArtSettings.strFill": "Fill", "DE.Views.TextArtSettings.strSize": "Size",