From 8bc661c7452f5bc5838f02a1d4a6f5e3678c283d Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 20 Jul 2018 12:00:30 +0300 Subject: [PATCH] [DE] Separate/join numbering lists --- .../main/app/view/DocumentHolder.js | 68 ++++- .../main/app/view/NumberingValueDialog.js | 261 ++++++++++++++++++ apps/documenteditor/main/locale/en.json | 9 +- 3 files changed, 335 insertions(+), 3 deletions(-) create mode 100644 apps/documenteditor/main/app/view/NumberingValueDialog.js diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index 415fd7d13..359500d0c 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -53,7 +53,8 @@ define([ 'documenteditor/main/app/view/HyperlinkSettingsDialog', 'documenteditor/main/app/view/ParagraphSettingsAdvanced', 'documenteditor/main/app/view/TableSettingsAdvanced', - 'documenteditor/main/app/view/ControlSettingsDialog' + 'documenteditor/main/app/view/ControlSettingsDialog', + 'documenteditor/main/app/view/NumberingValueDialog' ], function ($, _, Backbone, gateway) { 'use strict'; DE.Views.DocumentHolder = Backbone.View.extend(_.extend({ @@ -1891,6 +1892,29 @@ define([ me.fireEvent('editcomplete', me); }, + onContinueNumbering: function(item, e) { + this.api.asc_ContinueNumbering(); + this.fireEvent('editcomplete', this); + }, + + onStartNumbering: function(startfrom, item, e) { + if (startfrom == 1) + this.api.asc_RestartNumbering(1); + else { + var me = this; + (new DE.Views.NumberingValueDialog({ + title: me.textNumberingValue, + props: {format: item.value}, + handler: function (result, value) { + if (result == 'ok') + me.api.asc_RestartNumbering(value); + me.fireEvent('editcomplete', me); + } + })).show(); + } + this.fireEvent('editcomplete', this); + }, + createDelayedElementsViewer: function() { var me = this; @@ -3299,6 +3323,22 @@ define([ caption : '--' }); + var menuParaStartNewList = new Common.UI.MenuItem({ + caption: me.textStartNewList + }).on('click', _.bind(me.onStartNumbering, me, 1)); + + var menuParaStartNumberingFrom = new Common.UI.MenuItem({ + caption: me.textStartNumberingFrom + }).on('click', _.bind(me.onStartNumbering, me)); + + var menuParaContinueNumbering = new Common.UI.MenuItem({ + caption: me.textContinueNumbering + }).on('click', _.bind(me.onContinueNumbering, me)); + + var menuParaNumberingSeparator = new Common.UI.MenuItem({ + caption : '--' + }); + this.textMenu = new Common.UI.Menu({ initMenu: function(value){ var isInShape = (value.imgProps && value.imgProps.value && !_.isNull(value.imgProps.value.get_ShapeProperties())); @@ -3421,6 +3461,20 @@ define([ if (in_field) { menuParaRefreshField.options.fieldProps = in_field; } + + var listId = me.api.asc_GetCurrentNumberingId(), + in_list = (listId !== null); + menuParaNumberingSeparator.setVisible(in_list); // hide when first item is selected + menuParaStartNewList.setVisible(in_list); + menuParaStartNumberingFrom.setVisible(in_list); + menuParaContinueNumbering.setVisible(in_list); + if (in_list) { + var format = me.api.asc_GetNumberingPr(listId).get_Lvl(me.api.asc_GetCurrentNumberingLvl()).get_Format(); + menuParaStartNumberingFrom.setVisible(format != Asc.c_oAscNumberingFormat.Bullet); + menuParaStartNumberingFrom.value = format; + menuParaStartNewList.setCaption((format == Asc.c_oAscNumberingFormat.Bullet) ? me.textSeparateList : me.textStartNewList); + menuParaContinueNumbering.setCaption((format == Asc.c_oAscNumberingFormat.Bullet) ? me.textJoinList : me.textContinueNumbering); + } }, items: [ me.menuSpellPara, @@ -3456,6 +3510,10 @@ define([ menuHyperlinkParaSeparator, menuAddHyperlinkPara, menuHyperlinkPara, + menuParaNumberingSeparator, + menuParaStartNewList, + menuParaStartNumberingFrom, + menuParaContinueNumbering, menuStyleSeparator, menuStyle ] @@ -3776,7 +3834,13 @@ define([ txtPasteSourceFormat: 'Keep source formatting', textReplace: 'Replace image', textFromUrl: 'From URL', - textFromFile: 'From File' + textFromFile: 'From File', + textStartNumberingFrom: 'Set numbering value', + textStartNewList: 'Start new list', + textContinueNumbering: 'Continue numbering', + textSeparateList: 'Separate list', + textJoinList: 'Join to previous list', + textNumberingValue: 'Numbering Value' }, DE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/NumberingValueDialog.js b/apps/documenteditor/main/app/view/NumberingValueDialog.js new file mode 100644 index 000000000..c221e01c3 --- /dev/null +++ b/apps/documenteditor/main/app/view/NumberingValueDialog.js @@ -0,0 +1,261 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2018 + * + * 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 Lubanas st. 125a-25, Riga, Latvia, + * EU, LV-1021. + * + * 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 + * +*/ +/** + * NumberingValueDialog.js + * + * Created by Julia Radzhabova on 7/20/18 + * Copyright (c) 2018 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/component/Window', + 'common/main/lib/component/MetricSpinner' +], function () { 'use strict'; + + DE.Views.NumberingValueDialog = Common.UI.Window.extend(_.extend({ + options: { + width: 214, + header: true, + style: 'min-width: 214px;', + cls: 'modal-dlg' + }, + + initialize : function(options) { + _.extend(this.options, { + title: this.textTitle + }, options || {}); + + this.template = [ + '
', + '
', + '
', + '
', + '' + ].join(''); + + this.options.tpl = _.template(this.template)(this.options); + this.props = this.options.props; + + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + this.spnStart = new Common.UI.CustomSpinner({ + el: $('#id-spin-set-value'), + step: 1, + width: 182, + defaultUnit : "", + value: 1, + maxValue: 16383, + minValue: 1, + allowDecimal: false, + maskExp: /[0-9]/ + }); + + var $window = this.getChild(); + $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); + this.spnStart.on('entervalue', _.bind(this.onPrimary, this)); + this.spnStart.$el.find('input').focus(); + + this.afterRender(); + }, + + afterRender: function() { + this._setDefaults(this.props); + }, + + _setDefaults: function (props) { + if (props) { + // this.spnStart.setValue(props.start); + this.onFormatSelect(props.format); + } + }, + + _handleInput: function(state) { + if (this.options.handler) { + this.options.handler.call(this, state, this.getSettings()); + } + + this.close(); + }, + + onBtnClick: function(event) { + this._handleInput(event.currentTarget.attributes['result'].value); + }, + + getSettings: function() { + return this.spnStart.getNumberValue(); + }, + + onPrimary: function() { + this._handleInput('ok'); + return false; + }, + + onFormatSelect: function(format) { + var maskExp = /[0-9]/; + var me = this; + switch (format) { + case Asc.c_oAscNumberingFormat.UpperRoman: // I, II, III, ... + this.spnStart.options.toCustomFormat = this._10toRome; + this.spnStart.options.fromCustomFormat = this._Rometo10; + maskExp = /[IVXLCDM]/; + break; + case Asc.c_oAscNumberingFormat.LowerRoman: // i, ii, iii, ... + this.spnStart.options.toCustomFormat = function(value) { return me._10toRome(value).toLocaleLowerCase(); }; + this.spnStart.options.fromCustomFormat = function(value) { return me._Rometo10(value.toLocaleUpperCase()); }; + maskExp = /[ivxlcdm]/; + break; + case Asc.c_oAscNumberingFormat.UpperLetter: // A, B, C, ... + this.spnStart.options.toCustomFormat = this._10toS; + this.spnStart.options.fromCustomFormat = this._Sto10; + maskExp = /[A-Z]/; + break; + case Asc.c_oAscNumberingFormat.LowerLetter: // a, b, c, ... + this.spnStart.options.toCustomFormat = function(value) { return me._10toS(value).toLocaleLowerCase(); }; + this.spnStart.options.fromCustomFormat = function(value) { return me._Sto10(value.toLocaleUpperCase()); }; + maskExp = /[a-z]/; + break; + default: // 1, 2, 3, ... + this.spnStart.options.toCustomFormat = function(value) { return value; }; + this.spnStart.options.fromCustomFormat = function(value) { return value; }; + break; + } + + this.spnStart.setMask(maskExp); + this.spnStart.setValue(this.spnStart.getValue()); + }, + + _10toS: function(value) { + value = parseInt(value); + var n = Math.ceil(value / 26), + code = String.fromCharCode((value-1) % 26 + "A".charCodeAt(0)) , + result = ''; + + for (var i=0; i0) { + val = digits[n][1]; + div = value - val; + if (div>=0) { + result += digits[n][0]; + value = div; + } else + n++; + } + + return result; + }, + + _Rometo10: function(str) { + if ( !/[IVXLCDM]/.test(str) || str.length<1 ) return 1; + + var digits = { + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000 + }; + + var n = str.length-1, + result = digits[str.charAt(n)], + prev = result; + + for (var i=n-1; i>=0; i-- ) { + var val = digits[str.charAt(i)]; + if (val10) return 1; + val *= -1; + } + + result += val; + } + + return result; + }, + + cancelButtonText: 'Cancel', + okButtonText: 'Ok' + }, DE.Views.NumberingValueDialog || {})) +}); \ No newline at end of file diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 8b6242550..406531990 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1043,6 +1043,12 @@ "DE.Views.DocumentHolder.txtUngroup": "Ungroup", "DE.Views.DocumentHolder.updateStyleText": "Update %1 style", "DE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "DE.Views.DocumentHolder.textStartNumberingFrom": "Set numbering value", + "DE.Views.DocumentHolder.textStartNewList": "Start new list", + "DE.Views.DocumentHolder.textContinueNumbering": "Continue numbering", + "DE.Views.DocumentHolder.textSeparateList": "Separate list", + "DE.Views.DocumentHolder.textJoinList": "Join to previous list", + "DE.Views.DocumentHolder.textNumberingValue": "Numbering Value", "DE.Views.DropcapSettingsAdvanced.cancelButtonText": "Cancel", "DE.Views.DropcapSettingsAdvanced.okButtonText": "Ok", "DE.Views.DropcapSettingsAdvanced.strBorders": "Borders & Fill", @@ -1411,6 +1417,8 @@ "DE.Views.NoteSettingsDialog.textStart": "Start at", "DE.Views.NoteSettingsDialog.textTextBottom": "Below text", "DE.Views.NoteSettingsDialog.textTitle": "Notes Settings", + "DE.Views.NumberingValueDialog.cancelButtonText": "Cancel", + "DE.Views.NumberingValueDialog.okButtonText": "Ok", "DE.Views.PageMarginsDialog.cancelButtonText": "Cancel", "DE.Views.PageMarginsDialog.notcriticalErrorTitle": "Warning", "DE.Views.PageMarginsDialog.okButtonText": "Ok", @@ -1427,7 +1435,6 @@ "DE.Views.PageSizeDialog.textPreset": "Preset", "DE.Views.PageSizeDialog.textTitle": "Page Size", "DE.Views.PageSizeDialog.textWidth": "Width", - "DE.Views.PageSizeDialog.textPreset": "Preset", "DE.Views.PageSizeDialog.txtCustom": "Custom", "DE.Views.ParagraphSettings.strLineHeight": "Line Spacing", "DE.Views.ParagraphSettings.strParagraphSpacing": "Paragraph Spacing",