From cd2048a00af35f9b5d899504430608b8a00bc251 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 26 Jun 2020 20:44:54 +0300 Subject: [PATCH] [SSE] Set decimal, thousands separators when convert text to columns and in special paste. --- apps/common/main/lib/view/OpenDialog.js | 56 ++++++- .../main/app/controller/DataTab.js | 7 +- .../main/app/controller/DocumentHolder.js | 8 +- .../main/app/controller/Toolbar.js | 3 +- .../main/app/view/AdvancedSeparatorDialog.js | 144 ++++++++++++++++++ 5 files changed, 209 insertions(+), 9 deletions(-) create mode 100644 apps/spreadsheeteditor/main/app/view/AdvancedSeparatorDialog.js diff --git a/apps/common/main/lib/view/OpenDialog.js b/apps/common/main/lib/view/OpenDialog.js index 6fd52e989..659d4b7df 100644 --- a/apps/common/main/lib/view/OpenDialog.js +++ b/apps/common/main/lib/view/OpenDialog.js @@ -104,7 +104,7 @@ define([ '', '', '<% } %>', - '<% if (type == Common.Utils.importTextType.CSV || type == Common.Utils.importTextType.Paste || type == Common.Utils.importTextType.Columns) { %>', + '<% if (type == Common.Utils.importTextType.CSV) { %>', '
', '', '
', @@ -113,6 +113,16 @@ define([ '
', '
', '<% } %>', + '<% if (type == Common.Utils.importTextType.Paste || type == Common.Utils.importTextType.Columns) { %>', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
', + '<% } %>', '<% if (!!preview) { %>', '
', '', @@ -234,7 +244,10 @@ define([ if (!this.closable && this.type == Common.Utils.importTextType.TXT) { //save last encoding only for opening txt files Common.localStorage.setItem("de-settings-open-encoding", encoding); } - this.handler.call(this, state, encoding, delimiter, delimiterChar); + + var decimal = this.separatorOptions ? this.separatorOptions.decimal : undefined, + thousands = this.separatorOptions ? this.separatorOptions.thousands : undefined; + this.handler.call(this, state, encoding, delimiter, delimiterChar, decimal, thousands); } } @@ -336,6 +349,13 @@ define([ this.inputDelimiter.setVisible(false); if (this.preview) this.inputDelimiter.on ('changing', _.bind(this.updatePreview, this)); + + if (this.type == Common.Utils.importTextType.Paste || this.type == Common.Utils.importTextType.Columns) { + this.btnAdvanced = new Common.UI.Button({ + el: $('#id-delimiters-advanced') + }); + this.btnAdvanced.on('click', _.bind(this.onAdvancedClick, this)); + } } }, @@ -355,7 +375,12 @@ define([ break; case Common.Utils.importTextType.Paste: case Common.Utils.importTextType.Columns: - this.api.asc_TextImport(new Asc.asc_CTextOptions(encoding, delimiter, delimiterChar), _.bind(this.previewCallback, this), this.type == Common.Utils.importTextType.Paste); + var options = new Asc.asc_CTextOptions(encoding, delimiter, delimiterChar); + if (this.separatorOptions) { + options.asc_setNumberDecimalSeparator(this.separatorOptions.decimal); + options.asc_setNumberGroupSeparator(this.separatorOptions.thousands); + } + this.api.asc_TextImport(options, _.bind(this.previewCallback, this), this.type == Common.Utils.importTextType.Paste); break; } }, @@ -444,6 +469,28 @@ define([ this.updatePreview(); }, + onAdvancedClick: function() { + if (!SSE) return; + + var me = this, + decimal = this.api.asc_getDecimalSeparator(), + thousands = this.api.asc_getGroupSeparator(); + (new SSE.Views.AdvancedSeparatorDialog({ + props: { + decimal: decimal, + thousands: thousands + }, + handler: function(result, value) { + if (result == 'ok') { + me.separatorOptions = { + decimal: (value.decimal.length > 0) ? value.decimal : decimal, + thousands: (value.thousands.length > 0) ? value.thousands : thousands + }; + } + } + })).show(); + }, + txtDelimiter : "Delimiter", txtEncoding : "Encoding ", txtSpace : "Space", @@ -458,7 +505,8 @@ define([ txtComma: 'Comma', txtColon: 'Colon', txtSemicolon: 'Semicolon', - txtProtected: 'Once you enter the password and open the file, the current password to the file will be reset.' + txtProtected: 'Once you enter the password and open the file, the current password to the file will be reset.', + txtAdvanced: 'Advanced' }, Common.Views.OpenDialog || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/controller/DataTab.js b/apps/spreadsheeteditor/main/app/controller/DataTab.js index 6aa5e25db..46486cd48 100644 --- a/apps/spreadsheeteditor/main/app/controller/DataTab.js +++ b/apps/spreadsheeteditor/main/app/controller/DataTab.js @@ -199,10 +199,13 @@ define([ previewData: data, settings: me._state.CSVOptions, api: me.api, - handler: function (result, encoding, delimiter, delimiterChar) { + handler: function (result, encoding, delimiter, delimiterChar, decimal, thousands) { if (result == 'ok') { if (me && me.api) { - me.api.asc_TextToColumns(new Asc.asc_CTextOptions(encoding, delimiter, delimiterChar)); + var options = new Asc.asc_CTextOptions(encoding, delimiter, delimiterChar); + decimal && options.asc_setNumberDecimalSeparator(decimal); + thousands && options.asc_setNumberGroupSeparator(thousands); + me.api.asc_TextToColumns(options); } } } diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index e35085aae..2553a88e6 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -2442,12 +2442,16 @@ define([ type: Common.Utils.importTextType.Paste, preview: true, api: me.api, - handler: function (result, encoding, delimiter, delimiterChar) { + handler: function (result, encoding, delimiter, delimiterChar, decimal, thousands) { if (result == 'ok') { if (me && me.api) { var props = new Asc.SpecialPasteProps(); props.asc_setProps(Asc.c_oSpecialPasteProps.useTextImport); - props.asc_setAdvancedOptions(new Asc.asc_CTextOptions(encoding, delimiter, delimiterChar)); + + var options = new Asc.asc_CTextOptions(encoding, delimiter, delimiterChar); + decimal && options.asc_setNumberDecimalSeparator(decimal); + thousands && options.asc_setNumberGroupSeparator(thousands); + props.asc_setAdvancedOptions(options); me.api.asc_SpecialPaste(props); } me._state.lastSpecPasteChecked = item; diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 8c277ddfa..856454690 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -60,7 +60,8 @@ define([ 'spreadsheeteditor/main/app/view/PrintTitlesDialog', 'spreadsheeteditor/main/app/view/ScaleDialog', 'spreadsheeteditor/main/app/view/SlicerAddDialog', - 'spreadsheeteditor/main/app/view/CellsAddDialog' + 'spreadsheeteditor/main/app/view/CellsAddDialog', + 'spreadsheeteditor/main/app/view/AdvancedSeparatorDialog' ], function () { 'use strict'; SSE.Controllers.Toolbar = Backbone.Controller.extend(_.extend({ diff --git a/apps/spreadsheeteditor/main/app/view/AdvancedSeparatorDialog.js b/apps/spreadsheeteditor/main/app/view/AdvancedSeparatorDialog.js new file mode 100644 index 000000000..5f2e2bf5e --- /dev/null +++ b/apps/spreadsheeteditor/main/app/view/AdvancedSeparatorDialog.js @@ -0,0 +1,144 @@ +/* + * + * (c) Copyright Ascensio System SIA 2010-2020 + * + * 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 + * +*/ +/** + * AdvancedSeparatorDialog.js + * + * Created by Julia Radzhabova on 26/06/20 + * Copyright (c) 2020 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/component/Window', + 'common/main/lib/component/InputField' +], function () { 'use strict'; + + SSE.Views.AdvancedSeparatorDialog = Common.UI.Window.extend(_.extend({ + options: { + width: 330, + 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); + this.props = options.props; + + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + this.inputDecimalSeparator = new Common.UI.InputField({ + el: $('#id-adv-separator-decimal'), + style: 'width: 35px;', + maxLength: 1, + validateOnBlur: false + }); + + this.inputThousandsSeparator = new Common.UI.InputField({ + el: $('#id-adv-separator-thousands'), + style: 'width: 35px;', + maxLength: 1, + validateOnBlur: false + }); + + var $window = this.getChild(); + $window.find('.btn').on('click', _.bind(this.onBtnClick, this)); + + this.afterRender(); + }, + + afterRender: function() { + this._setDefaults(this.props); + }, + + _setDefaults: function (props) { + if (props) { + this.inputDecimalSeparator.setValue(props.decimal || ''); + this.inputThousandsSeparator.setValue(props.thousands || ''); + } + }, + + show: function() { + Common.UI.Window.prototype.show.apply(this, arguments); + + var me = this; + _.delay(function(){ + me.inputDecimalSeparator.cmpEl.find('input').focus(); + },50); + }, + + onPrimary: function(event) { + this._handleInput('ok'); + return false; + }, + + onBtnClick: function(event) { + this._handleInput(event.currentTarget.attributes['result'].value); + }, + + _handleInput: function(state) { + if (this.options.handler) { + this.options.handler.call(this, state, {decimal: this.inputDecimalSeparator.getValue(), thousands: this.inputThousandsSeparator.getValue()}); + } + + this.close(); + }, + + textTitle: 'Advanced Settings', + textLabel: 'Settings used to recognize numeric data', + strDecimalSeparator: 'Decimal separator', + strThousandsSeparator: 'Thousands separator' + + }, SSE.Views.AdvancedSeparatorDialog || {})); +}); \ No newline at end of file