From e198458d5873413d1b918a33aac97b8856efcee5 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 19 Dec 2017 16:30:58 +0300 Subject: [PATCH 01/30] [DE] Added document structure in the left panel. --- apps/common/main/lib/component/DataView.js | 2 +- apps/common/main/lib/component/TreeView.js | 199 ++++++++++++++++++ apps/common/main/resources/less/treeview.less | 41 ++++ apps/documenteditor/main/app.js | 2 + .../main/app/collection/EquationGroups.js | 5 +- .../main/app/collection/Navigation.js | 50 +++++ .../main/app/controller/LeftMenu.js | 4 + .../main/app/controller/Main.js | 5 +- .../main/app/controller/Navigation.js | 182 ++++++++++++++++ .../main/app/template/LeftMenu.template | 2 + apps/documenteditor/main/app/view/LeftMenu.js | 30 ++- .../main/app/view/Navigation.js | 151 +++++++++++++ apps/documenteditor/main/app_dev.js | 2 + .../main/resources/less/app.less | 2 + .../main/resources/less/navigation.less | 23 ++ apps/documenteditor/sdk_dev_scripts.js | 1 + 16 files changed, 693 insertions(+), 8 deletions(-) create mode 100644 apps/common/main/lib/component/TreeView.js create mode 100644 apps/common/main/resources/less/treeview.less create mode 100644 apps/documenteditor/main/app/collection/Navigation.js create mode 100644 apps/documenteditor/main/app/controller/Navigation.js create mode 100644 apps/documenteditor/main/app/view/Navigation.js create mode 100644 apps/documenteditor/main/resources/less/navigation.less diff --git a/apps/common/main/lib/component/DataView.js b/apps/common/main/lib/component/DataView.js index b4d1811bf..b7144524d 100644 --- a/apps/common/main/lib/component/DataView.js +++ b/apps/common/main/lib/component/DataView.js @@ -143,7 +143,7 @@ define([ el.off('click').on('click', _.bind(this.onClick, this)); el.off('dblclick').on('dblclick', _.bind(this.onDblClick, this)); el.off('contextmenu').on('contextmenu', _.bind(this.onContextMenu, this)); - el.toggleClass('disabled', this.model.get('disabled')); + el.toggleClass('disabled', !!this.model.get('disabled')); if (!_.isUndefined(this.model.get('cls'))) el.addClass(this.model.get('cls')); diff --git a/apps/common/main/lib/component/TreeView.js b/apps/common/main/lib/component/TreeView.js new file mode 100644 index 000000000..4b4ed903f --- /dev/null +++ b/apps/common/main/lib/component/TreeView.js @@ -0,0 +1,199 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * 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 + * +*/ +/** + * TreeView.js + * + * Created by Julia Radzhabova on 12/14/17 + * + */ + +if (Common === undefined) + var Common = {}; + +define([ + 'common/main/lib/component/DataView' +], function () { + 'use strict'; + + Common.UI.TreeViewModel = Common.UI.DataViewModel.extend({ + defaults: function() { + return { + id: Common.UI.getId(), + name: '', + hasSubItems: false, + isExpanded: true, + isVisible: true, + selected: false, + allowSelected: true, + disabled: false, + level: 0, + index: 0 + } + } + }); + + Common.UI.TreeViewStore = Backbone.Collection.extend({ + model: Common.UI.TreeViewModel, + + expand: function(record) { + var me = this; + var _expand_sub_items = function(idx, expanded, level) { + for (var i=idx+1; ilevel) { + if (expanded) + item.set('isVisible', true); + if (item.get('hasSubItems')) + i = _expand_sub_items(i, item.get('isExpanded'), item_level ); + } else { + return (i-1); + } + } + }; + + record.set('isExpanded', true); + _expand_sub_items(record.get('index'), true, record.get('level')); + }, + + collapse: function(record) { + var start_level = record.get('level'), + index = record.get('index'); + for (var i=index+1; istart_level) { + item.set('isVisible', false); + } else { + break; + } + } + } + }); + + Common.UI.TreeView = Common.UI.DataView.extend((function() { + return { + options: { + handleSelect: true, + showLast: true, + allowScrollbar: true, + itemTemplate: _.template([ + '
', + '<% if (hasSubItems) { %>', + '
', + '<% } %>', + '
<%= name %>
', + '
' + ].join('')) + }, + + template: _.template([ + '
' + ].join('')), + + initialize : function(options) { + options.store = options.store || new Common.UI.TreeViewStore(); + Common.UI.DataView.prototype.initialize.call(this, options); + }, + + onAddItem: function(record, index, opts) { + var view = new Common.UI.DataViewItem({ + template: this.itemTemplate, + model: record + }); + + if (view) { + var innerEl = $(this.el).find('.inner').addBack().filter('.inner'); + if (innerEl) { + if (opts && opts.at == 0) + innerEl.prepend(view.render().el); else + innerEl.append(view.render().el); + + innerEl.find('.empty-text').remove(); + this.dataViewItems.push(view); + + var name = record.get('name'); + if (name.length > 37 - record.get('level')*2) + record.set('tip', name); + if (record.get('tip')) { + var view_el = $(view.el); + view_el.attr('data-toggle', 'tooltip'); + view_el.tooltip({ + title : record.get('tip'), + placement : 'cursor', + zIndex : this.tipZIndex + }); + } + + this.listenTo(view, 'change', this.onChangeItem); + this.listenTo(view, 'remove', this.onRemoveItem); + this.listenTo(view, 'click', this.onClickItem); + this.listenTo(view, 'dblclick', this.onDblClickItem); + this.listenTo(view, 'select', this.onSelectItem); + this.listenTo(view, 'contextmenu', this.onContextMenuItem); + + if (!this.isSuspendEvents) + this.trigger('item:add', this, view, record); + } + } + }, + + onClickItem: function(view, record, e) { + var btn = $(e.target); + if (btn && btn.hasClass('tree-caret')) { + var tip = view.$el.data('bs.tooltip'); + if (tip) (tip.tip()).remove(); + + var isExpanded = !record.get('isExpanded'); + record.set('isExpanded', isExpanded); + this.store[(isExpanded) ? 'expand' : 'collapse'](record); + this.scroller.update({minScrollbarLength: 40}); + } else + Common.UI.DataView.prototype.onClickItem.call(this, view, record, e); + }, + + expandAll: function() { + this.store.each(function(item) { + item.set('isExpanded', true); + }); + this.store.expand(this.store.at(0)); + this.scroller.update({minScrollbarLength: 40}); + }, + + collapseAll: function() { + this.store.collapse(this.store.at(0)); + this.scroller.update({minScrollbarLength: 40}); + } + } + })()); +}); \ No newline at end of file diff --git a/apps/common/main/resources/less/treeview.less b/apps/common/main/resources/less/treeview.less new file mode 100644 index 000000000..7ecb01b1d --- /dev/null +++ b/apps/common/main/resources/less/treeview.less @@ -0,0 +1,41 @@ +.treeview { + .item { + display: block; + width: 100%; + .box-shadow(none); + margin: 0; + + &:hover, + &.over, + &.selected { + background-color: @secondary; + } + } + + .tree-item { + width: 100%; + padding: 0px 0 0 26px; + } + + .name { + width: 100%; + padding: 7px 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .tree-caret { + width: 26px; + height: 26px; + background-position: 4px -269px; + display: inline-block; + position: absolute; + left: 0; + cursor: pointer; + + &.up { + transform: rotate(270deg); + } + } +} \ No newline at end of file diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js index bc6d337c9..ef7ea2c9e 100644 --- a/apps/documenteditor/main/app.js +++ b/apps/documenteditor/main/app.js @@ -150,6 +150,7 @@ require([ 'DocumentHolder', 'Toolbar', 'Statusbar', + 'Navigation', 'RightMenu', 'LeftMenu', 'Main', @@ -174,6 +175,7 @@ require([ 'documenteditor/main/app/controller/DocumentHolder', 'documenteditor/main/app/controller/Toolbar', 'documenteditor/main/app/controller/Statusbar', + 'documenteditor/main/app/controller/Navigation', 'documenteditor/main/app/controller/RightMenu', 'documenteditor/main/app/controller/LeftMenu', 'documenteditor/main/app/controller/Main', diff --git a/apps/documenteditor/main/app/collection/EquationGroups.js b/apps/documenteditor/main/app/collection/EquationGroups.js index 60b8d0597..70e7e9bd8 100644 --- a/apps/documenteditor/main/app/collection/EquationGroups.js +++ b/apps/documenteditor/main/app/collection/EquationGroups.js @@ -42,10 +42,7 @@ define([ 'backbone', 'documenteditor/main/app/model/EquationGroup' ], function(Backbone){ 'use strict'; - if (Common === undefined) - var Common = {}; - - Common.Collections = Common.Collections || {}; + DE.Collections = DE.Collections || {}; DE.Collections.EquationGroups = Backbone.Collection.extend({ model: DE.Models.EquationGroup diff --git a/apps/documenteditor/main/app/collection/Navigation.js b/apps/documenteditor/main/app/collection/Navigation.js new file mode 100644 index 000000000..29d450535 --- /dev/null +++ b/apps/documenteditor/main/app/collection/Navigation.js @@ -0,0 +1,50 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * 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 + * +*/ +/** + * User: Julia.Radzhabova + * Date: 14.12.17 + */ + +DE.Collections = DE.Collections || {}; + +define([ + 'underscore', + 'backbone', + 'common/main/lib/component/TreeView' +], function(_, Backbone){ + 'use strict'; + + DE.Collections.Navigation = Common.UI.TreeViewStore.extend({ + model: Common.UI.TreeViewModel + }); +}); diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js index 5a5dceced..e85876240 100644 --- a/apps/documenteditor/main/app/controller/LeftMenu.js +++ b/apps/documenteditor/main/app/controller/LeftMenu.js @@ -198,6 +198,8 @@ define([ if (this.mode.canUseHistory) this.leftMenu.setOptionsPanel('history', this.getApplication().getController('Common.Controllers.History').getView('Common.Views.History')); + this.leftMenu.setOptionsPanel('navigation', this.getApplication().getController('Navigation').getView('Navigation')); + this.mode.trialMode && this.leftMenu.setDeveloperMode(this.mode.trialMode); Common.util.Shortcuts.resumeEvents(); @@ -494,6 +496,7 @@ define([ this.leftMenu.btnChat.setDisabled(true); /** coauthoring end **/ this.leftMenu.btnPlugins.setDisabled(true); + this.leftMenu.btnNavigation.setDisabled(true); this.leftMenu.getMenu('file').setMode({isDisconnected: true, disableDownload: !!disableDownload}); if ( this.dlgSearch ) { @@ -511,6 +514,7 @@ define([ this.leftMenu.btnChat.setDisabled(disable); /** coauthoring end **/ this.leftMenu.btnPlugins.setDisabled(disable); + this.leftMenu.btnNavigation.setDisabled(disable); if (disableFileMenu) this.leftMenu.getMenu('file').SetDisabled(disable); }, diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index a090b4f02..a23130e8a 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -891,7 +891,8 @@ define([ rightmenuController = application.getController('RightMenu'), leftmenuController = application.getController('LeftMenu'), chatController = application.getController('Common.Controllers.Chat'), - pluginsController = application.getController('Common.Controllers.Plugins'); + pluginsController = application.getController('Common.Controllers.Plugins'), + navigationController = application.getController('Navigation'); leftmenuController.getView('LeftMenu').getMenu('file').loadDocument({doc:me.document}); leftmenuController.setMode(me.appOptions).createDelayedElements().setApi(me.api); @@ -904,6 +905,8 @@ define([ me.requestPlugins('../../../../plugins.json'); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); + navigationController.setApi(me.api); + documentHolderController.setApi(me.api); documentHolderController.createDelayedElements(); statusbarController.createDelayedElements(); diff --git a/apps/documenteditor/main/app/controller/Navigation.js b/apps/documenteditor/main/app/controller/Navigation.js new file mode 100644 index 000000000..8ad35e774 --- /dev/null +++ b/apps/documenteditor/main/app/controller/Navigation.js @@ -0,0 +1,182 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * 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 + * +*/ +/** + * User: Julia.Radzhabova + * Date: 14.12.17 + */ + +define([ + 'core', + 'documenteditor/main/app/collection/Navigation', + 'documenteditor/main/app/view/Navigation' +], function () { + 'use strict'; + + DE.Controllers.Navigation = Backbone.Controller.extend(_.extend({ + models: [], + collections: [ + 'Navigation' + ], + views: [ + 'Navigation' + ], + + initialize: function() { + var me = this; + this.addListeners({ + 'Navigation': { + 'show': function() { + var obj = me.api.asc_ShowDocumentOutline(); + if (!me._navigationObject) + me._navigationObject = obj; + me.updateNavigation(); + }, + 'hide': function() { + me.api.asc_HideDocumentOutline(); + } + } + }); + }, + + events: function() { + }, + + onLaunch: function() { + this.panelNavigation= this.createView('Navigation', { + storeNavigation: this.getApplication().getCollection('Navigation') + }); + this.panelNavigation.on('render:after', _.bind(this.onAfterRender, this)); + this._navigationObject = null; + }, + + setApi: function(api) { + this.api = api; + this.api.asc_registerCallback('asc_onDocumentOutlineUpdate', _.bind(this.updateNavigation, this)); + return this; + }, + + setMode: function(mode) { + }, + + onAfterRender: function(panelNavigation) { + panelNavigation.viewNavigationList.on('item:click', _.bind(this.onSelectItem, this)); + panelNavigation.viewNavigationList.on('item:contextmenu', _.bind(this.onItemContextMenu, this)); + panelNavigation.navigationMenu.on('item:click', _.bind(this.onMenuItemClick, this)); + }, + + updateNavigation: function() { + if (!this._navigationObject) return; + + var count = this._navigationObject.get_ElementsCount(), + prev_level = -1, + arr = []; + for (var i=0; iprev_level && i>0) + arr[i-1].set('hasSubItems', true); + arr.push(new Common.UI.TreeViewModel({ + name : this._navigationObject.get_Text(i), + level: level, + index: i + })); + prev_level = level; + + } + this.getApplication().getCollection('Navigation').reset(arr); + }, + + onItemContextMenu: function(picker, item, record, e){ + var showPoint; + var menu = this.panelNavigation.navigationMenu; + if (menu.isVisible()) { + menu.hide(); + } + + var parentOffset = this.panelNavigation.$el.offset(), + top = e.clientY*Common.Utils.zoom(); + showPoint = [e.clientX*Common.Utils.zoom() + 5, top - parentOffset.top + 5]; + + if (record != undefined) { + //itemMenu + // menu.items[0].setVisible(true); + } else { + } + + if (showPoint != undefined) { + var menuContainer = this.panelNavigation.$el.find('#menu-navigation-container'); + if (!menu.rendered) { + if (menuContainer.length < 1) { + menuContainer = $('', menu.id); + $(this.panelNavigation.$el).append(menuContainer); + } + menu.render(menuContainer); + menu.cmpEl.attr({tabindex: "-1"}); + } + + menuContainer.css({ + left: showPoint[0], + top: showPoint[1] + }); + menu.show(); + } + + }, + + onSelectItem: function(picker, item, record, e){ + // this.api.asc_gotoHeader(); + }, + + onMenuItemClick: function (menu, item) { + if (item.value == 'promote') { + + } else if (item.value == 'promote') { + + } else if (item.value == 'indent') { + + } else if (item.value == 'before') { + + } else if (item.value == 'after') { + + } else if (item.value == 'new') { + + } else if (item.value == 'select') { + + } else if (item.value == 'expand') { + this.panelNavigation.viewNavigationList.expandAll(); + } else if (item.value == 'collapse') { + this.panelNavigation.viewNavigationList.collapseAll(); + } + } + + }, DE.Controllers.Navigation || {})); +}); diff --git a/apps/documenteditor/main/app/template/LeftMenu.template b/apps/documenteditor/main/app/template/LeftMenu.template index 70f94a475..faf223e75 100644 --- a/apps/documenteditor/main/app/template/LeftMenu.template +++ b/apps/documenteditor/main/app/template/LeftMenu.template @@ -6,6 +6,7 @@ + @@ -15,5 +16,6 @@ ' ].join('')); diff --git a/apps/documenteditor/main/app/controller/Navigation.js b/apps/documenteditor/main/app/controller/Navigation.js index 6118ac769..b7f0fd03f 100644 --- a/apps/documenteditor/main/app/controller/Navigation.js +++ b/apps/documenteditor/main/app/controller/Navigation.js @@ -109,7 +109,8 @@ define([ arr.push(new Common.UI.TreeViewModel({ name : this._navigationObject.get_Text(i), level: level, - index: i + index: i, + isEmptyItem: this._navigationObject.isEmptyItem(i) })); prev_level = level; } From ec02d0695e0bad887f49a1e4a4d764ff0d2e1bd2 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 25 Dec 2017 12:20:13 +0300 Subject: [PATCH 12/30] [DE] Bugfix for treeview. --- apps/common/main/lib/component/TreeView.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/common/main/lib/component/TreeView.js b/apps/common/main/lib/component/TreeView.js index 066f503e5..84ffd6ffc 100644 --- a/apps/common/main/lib/component/TreeView.js +++ b/apps/common/main/lib/component/TreeView.js @@ -169,10 +169,12 @@ define([ '<% if (hasSubItems) { %>', '
', '<% } %>', - '<% if (isEmptyItem) { %>', + '<% if (isNotHeader) { %>', + '
<%= name %>
', + '<% } else if (isEmptyItem) { %>', '
' + options.emptyItemText + '
', '<% } else { %>', - '
<%= name %>
', + '
<%= name %>
', '<% } %>', '' ].join('')); From be416c5ed2dcc9dada83cebbd2809a0f270fa6b4 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 25 Dec 2017 15:55:26 +0300 Subject: [PATCH 13/30] Add Note editing button to the Links tab. --- .../main/app/controller/Links.js | 71 +++++++++++++- .../main/app/controller/Toolbar.js | 73 +------------- .../main/app/template/Toolbar.template | 2 +- apps/documenteditor/main/app/view/Links.js | 94 ++++++++++++++++++- apps/documenteditor/main/app/view/Toolbar.js | 52 ---------- apps/documenteditor/main/locale/en.json | 29 ++++-- 6 files changed, 181 insertions(+), 140 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index 660ea25c0..b2b244a59 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -41,7 +41,8 @@ define([ 'core', - 'documenteditor/main/app/view/Links' + 'documenteditor/main/app/view/Links', + 'documenteditor/main/app/view/NoteSettingsDialog' ], function () { 'use strict'; @@ -59,7 +60,8 @@ define([ this.addListeners({ 'Links': { 'links:contents': this.onTableContents, - 'links:update': this.onTableContentsUpdate + 'links:update': this.onTableContentsUpdate, + 'links:notes': this.onNotesClick } }); }, @@ -102,9 +104,12 @@ define([ onApiFocusObject: function(selectedObjects) { if (!this.editMode) return; - var i = -1, type, pr, + var pr, i = -1, type, paragraph_locked = false, - header_locked = false; + header_locked = false, + in_header = false, + in_equation = false, + in_image = false; while (++i < selectedObjects.length) { type = selectedObjects[i].get_ObjectType(); @@ -114,9 +119,19 @@ define([ paragraph_locked = pr.get_Locked(); } else if (type === Asc.c_oAscTypeSelectElement.Header) { header_locked = pr.get_Locked(); + in_header = true; + } else if (type === Asc.c_oAscTypeSelectElement.Image) { + in_image = true; + } else if (type === Asc.c_oAscTypeSelectElement.Math) { + in_equation = true; } } + var need_disable = paragraph_locked || in_equation || in_image || in_header; + _.each (this.view.btnsNotes, function(item){ + item.setDisabled(need_disable); + }, this); + // var need_disable = paragraph_locked || header_locked; // _.each (this.view.btnsContents, function(item){ // item.setDisabled(need_disable); @@ -141,6 +156,54 @@ define([ this.api.asc_updateTableOfContents(); else this.api.asc_updateaddTableOfContents(); + }, + + onNotesClick: function(type) { + var me = this; + switch (type) { + case 'ins_footnote': + this.api.asc_AddFootnote(); + break; + case 'delele': + Common.UI.warning({ + msg: this.view.confirmDeleteFootnotes, + buttons: ['yes', 'no'], + primary: 'yes', + callback: _.bind(function (btn) { + if (btn == 'yes') { + this.api.asc_RemoveAllFootnotes(); + } + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + }, this) + }); + break; + case 'settings': + (new DE.Views.NoteSettingsDialog({ + api: me.api, + handler: function (result, settings) { + if (settings) { + me.api.asc_SetFootnoteProps(settings.props, settings.applyToAll); + if (result == 'insert') + me.api.asc_AddFootnote(settings.custom); + } + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + }, + props: me.api.asc_GetFootnoteProps() + })).show(); + break; + case 'prev': + this.api.asc_GotoFootnote(false); + setTimeout(function() { + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + }, 50); + break; + case 'next': + this.api.asc_GotoFootnote(true); + setTimeout(function() { + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + }, 50); + break; + } } }, DE.Controllers.Links || {})); diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 743e05f00..75858b112 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -54,7 +54,6 @@ define([ 'documenteditor/main/app/view/StyleTitleDialog', 'documenteditor/main/app/view/PageMarginsDialog', 'documenteditor/main/app/view/PageSizeDialog', - 'documenteditor/main/app/view/NoteSettingsDialog', 'documenteditor/main/app/controller/PageLayout', 'documenteditor/main/app/view/CustomColumnsDialog' ], function () { @@ -309,10 +308,6 @@ define([ toolbar.mnuZoomIn.on('click', _.bind(this.onZoomInClick, this)); toolbar.mnuZoomOut.on('click', _.bind(this.onZoomOutClick, this)); toolbar.btnInsertEquation.on('click', _.bind(this.onInsertEquationClick, this)); - toolbar.btnNotes.on('click', _.bind(this.onNotesClick, this)); - toolbar.btnNotes.menu.on('item:click', _.bind(this.onNotesMenuClick, this)); - toolbar.mnuGotoFootPrev.on('click', _.bind(this.onFootnotePrevClick, this)); - toolbar.mnuGotoFootNext.on('click', _.bind(this.onFootnoteNextClick, this)); $('#id-save-style-plus, #id-save-style-link', toolbar.$el).on('click', this.onMenuSaveStyle.bind(this)); @@ -754,9 +749,6 @@ define([ toolbar.btnEditHeader.setDisabled(in_equation); - need_disable = paragraph_locked || in_equation || in_image || in_header; - if (need_disable !== toolbar.btnNotes.isDisabled()) - toolbar.btnNotes.setDisabled(need_disable); need_disable = paragraph_locked || header_locked || in_image; if (need_disable != toolbar.btnColumns.isDisabled()) @@ -2060,68 +2052,6 @@ define([ Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, - onNotesClick: function() { - if (this.api) - this.api.asc_AddFootnote(); - }, - - onNotesMenuClick: function(menu, item) { - if (this.api) { - if (item.value == 'ins_footnote') - this.api.asc_AddFootnote(); - else if (item.value == 'delele') - Common.UI.warning({ - msg: this.confirmDeleteFootnotes, - buttons: ['yes', 'no'], - primary: 'yes', - callback: _.bind(function(btn) { - if (btn == 'yes') { - this.api.asc_RemoveAllFootnotes(); - } - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, this) - }); - else if (item.value == 'settings') { - var me = this; - (new DE.Views.NoteSettingsDialog({ - api: me.api, - handler: function(result, settings) { - if (settings) { - me.api.asc_SetFootnoteProps(settings.props, settings.applyToAll); - if (result == 'insert') - me.api.asc_AddFootnote(settings.custom); - } - Common.NotificationCenter.trigger('edit:complete', me.toolbar); - }, - props : me.api.asc_GetFootnoteProps() - })).show(); - } else - return; - - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - } - }, - - onFootnotePrevClick: function(btn) { - if (this.api) - this.api.asc_GotoFootnote(false); - - var me = this; - setTimeout(function() { - Common.NotificationCenter.trigger('edit:complete', me.toolbar); - }, 50); - }, - - onFootnoteNextClick: function(btn) { - if (this.api) - this.api.asc_GotoFootnote(true); - - var me = this; - setTimeout(function() { - Common.NotificationCenter.trigger('edit:complete', me.toolbar); - }, 50); - }, - _clearBullets: function() { this.toolbar.btnMarkers.toggle(false, true); this.toolbar.btnNumbers.toggle(false, true); @@ -3264,8 +3194,7 @@ define([ confirmAddFontName: 'The font you are going to save is not available on the current device.
The text style will be displayed using one of the device fonts, the saved font will be used when it is available.
Do you want to continue?', notcriticalErrorTitle: 'Warning', txtMarginsW: 'Left and right margins are too high for a given page wight', - txtMarginsH: 'Top and bottom margins are too high for a given page height', - confirmDeleteFootnotes: 'Do you want to delete all footnotes?' + txtMarginsH: 'Top and bottom margins are too high for a given page height' }, DE.Controllers.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index 2d8b33c76..d88c57e1b 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -123,7 +123,7 @@
- +
diff --git a/apps/documenteditor/main/app/view/Links.js b/apps/documenteditor/main/app/view/Links.js index a863adbf8..54c2b71d3 100644 --- a/apps/documenteditor/main/app/view/Links.js +++ b/apps/documenteditor/main/app/view/Links.js @@ -64,6 +64,27 @@ define([ this.btnContentsUpdate.on('click', function (b, e) { me.fireEvent('links:update', ['all']); }); + + this.btnsNotes.forEach(function(button) { + button.menu.on('item:click', function (menu, item, e) { + me.fireEvent('links:notes', [item.value]); + }); + button.on('click', function (b, e) { + me.fireEvent('links:notes', ['ins_footnote']); + }); + }); + + this.btnsPrevNote.forEach(function(button) { + button.on('click', function (b, e) { + me.fireEvent('links:notes', ['prev']); + }); + }); + + this.btnsNextNote.forEach(function(button) { + button.on('click', function (b, e) { + me.fireEvent('links:notes', ['next']); + }); + }); } return { @@ -75,6 +96,9 @@ define([ this.toolbar = options.toolbar; this.btnsContents = []; + this.btnsNotes = []; + this.btnsPrevNote = []; + this.btnsNextNote = []; var me = this, $host = me.toolbar.$el; @@ -111,7 +135,24 @@ define([ }); _injectComponent('#slot-btn-contents-update', this.btnContentsUpdate); - this._state = {disabled: false, hasPassword: false}; + $slots = $host.find('.btn-slot.slot-notes'); + $slots.each(function(index, el) { + var _cls = 'btn-toolbar'; + /x-huge/.test(el.className) && (_cls += ' x-huge icon-top'); + + var button = new Common.UI.Button({ + cls: _cls, + iconCls: 'btn-notes', + caption: me.capBtnInsFootnote, + split: true, + menu: true, + disabled: true + }).render( $slots.eq(index) ); + + me.btnsNotes.push(button); + }); + + this._state = {disabled: false}; Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); }, @@ -149,6 +190,44 @@ define([ }); me.btnContentsUpdate.setMenu(_menu); + me.btnsNotes.forEach( function(btn, index) { + btn.updateHint( me.tipNotes ); + + var _menu = new Common.UI.Menu({ + items: [ + {caption: me.mniInsFootnote, value: 'ins_footnote'}, + {caption: '--'}, + new Common.UI.MenuItem({ + template: _.template([ + '' + ].join('')), + stopPropagation: true + }), + {caption: '--'}, + {caption: me.mniDelFootnote, value: 'delele'}, + {caption: me.mniNoteSettings, value: 'settings'} + ] + }); + btn.setMenu(_menu); + + me.btnsPrevNote.push(new Common.UI.Button({ + el: $('#id-menu-goto-footnote-prev-'+index), + cls: 'btn-toolbar' + })); + me.btnsNextNote.push(me.mnuGotoFootNext = new Common.UI.Button({ + el: $('#id-menu-goto-footnote-next-'+index), + cls: 'btn-toolbar' + })); + + }); + setEvents.call(me); }); }, @@ -159,12 +238,12 @@ define([ }, getButtons: function() { - return this.btnsContents.concat(this.btnContentsUpdate); + return this.btnsContents.concat(this.btnContentsUpdate).concat(this.btnsNotes); }, SetDisabled: function (state) { this._state.disabled = state; - this.btnsContents.forEach(function(button) { + this.btnsContents.concat(this.btnsNotes).forEach(function(button) { if ( button ) { button.setDisabled(state); } @@ -179,7 +258,14 @@ define([ capBtnContentsUpdate: 'Update', tipContentsUpdate: 'Update table of contents', textUpdateAll: 'Update entire table', - textUpdatePages: 'Update page numbers only' + textUpdatePages: 'Update page numbers only', + tipNotes: 'Footnotes', + mniInsFootnote: 'Insert Footnote', + mniDelFootnote: 'Delete All Footnotes', + mniNoteSettings: 'Notes Settings', + textGotoFootnote: 'Go to Footnotes', + capBtnInsFootnote: 'Footnotes', + confirmDeleteFootnotes: 'Do you want to delete all footnotes?' } }()), DE.Views.Links || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index f24e4fcd0..aa18c469d 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -909,16 +909,6 @@ define([ }); this.toolbarControls.push(this.btnColorSchemas); - this.btnNotes = new Common.UI.Button({ - id: 'id-toolbar-btn-notes', - cls: 'btn-toolbar x-huge icon-top', - iconCls: 'btn-notes', - caption: me.capBtnInsFootnote, - split: true, - menu: true - }); - this.paragraphControls.push(this.btnNotes); - this.btnMailRecepients = new Common.UI.Button({ id: 'id-toolbar-btn-mailrecepients', cls: 'btn-toolbar', @@ -1275,7 +1265,6 @@ define([ _injectComponent('#slot-field-styles', this.listStyles); _injectComponent('#slot-btn-halign', this.btnHorizontalAlign); _injectComponent('#slot-btn-mailrecepients', this.btnMailRecepients); - _injectComponent('#slot-btn-notes', this.btnNotes); _injectComponent('#slot-img-align', this.btnImgAlign); _injectComponent('#slot-img-group', this.btnImgGroup); _injectComponent('#slot-img-movefrwd', this.btnImgForward); @@ -1525,7 +1514,6 @@ define([ this.btnMailRecepients.updateHint(this.tipMailRecepients); this.btnHide.updateHint(this.tipViewSettings); this.btnAdvSettings.updateHint(this.tipAdvSettings); - this.btnNotes.updateHint(this.tipNotes); // set menus @@ -1650,40 +1638,6 @@ define([ cls: 'btn-toolbar' }); - this.btnNotes.setMenu( - new Common.UI.Menu({ - items: [ - {caption: this.mniInsFootnote, value: 'ins_footnote'}, - {caption: '--'}, - this.mnuGotoFootnote = new Common.UI.MenuItem({ - template: _.template([ - '' - ].join('')), - stopPropagation: true - }), - {caption: '--'}, - {caption: this.mniDelFootnote, value: 'delele'}, - {caption: this.mniNoteSettings, value: 'settings'} - ] - }) - ); - - this.mnuGotoFootPrev = new Common.UI.Button({ - el: $('#id-menu-goto-footnote-prev'), - cls: 'btn-toolbar' - }); - this.mnuGotoFootNext = new Common.UI.Button({ - el: $('#id-menu-goto-footnote-next'), - cls: 'btn-toolbar' - }); - // set dataviews var _conf = this.mnuMarkersPicker.conf; @@ -2418,11 +2372,6 @@ define([ textLandscape: 'Landscape', textInsertPageCount: 'Insert number of pages', textCharts: 'Charts', - tipNotes: 'Footnotes', - mniInsFootnote: 'Insert Footnote', - mniDelFootnote: 'Delete All Footnotes', - mniNoteSettings: 'Notes Settings', - textGotoFootnote: 'Go to Footnotes', tipChangeChart: 'Change Chart Type', capBtnInsPagebreak: 'Page Break', capBtnInsImage: 'Picture', @@ -2438,7 +2387,6 @@ define([ capBtnInsTextbox: 'Text Box', capBtnInsTextart: 'Text Art', capBtnInsDropcap: 'Drop Cap', - capBtnInsFootnote: 'Footnotes', capBtnInsEquation: 'Equation', capBtnInsHeader: 'Headers/Footers', capBtnColumns: 'Columns', diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index d1b233dab..bd03dff46 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -436,7 +436,7 @@ "DE.Controllers.Statusbar.tipReview": "Track changes", "DE.Controllers.Statusbar.zoomText": "Zoom {0}%", "DE.Controllers.Toolbar.confirmAddFontName": "The font you are going to save is not available on the current device.
The text style will be displayed using one of the system fonts, the saved font will be used when it is available.
Do you want to continue?", - "DE.Controllers.Toolbar.confirmDeleteFootnotes": "Do you want to delete all footnotes?", + "del_DE.Controllers.Toolbar.confirmDeleteFootnotes": "Do you want to delete all footnotes?", "DE.Controllers.Toolbar.notcriticalErrorTitle": "Warning", "DE.Controllers.Toolbar.textAccent": "Accents", "DE.Controllers.Toolbar.textBracket": "Brackets", @@ -1233,6 +1233,21 @@ "DE.Views.LeftMenu.tipTitles": "Titles", "DE.Views.LeftMenu.txtDeveloper": "DEVELOPER MODE", "DE.Views.LeftMenu.txtTrial": "TRIAL MODE", + "DE.Views.Links.capBtnContentsUpdate": "Update", + "DE.Views.Links.capBtnInsContents": "Table of Contents", + "DE.Views.Links.capBtnInsFootnote": "Footnote", + "DE.Views.Links.confirmDeleteFootnotes": "Do you want to delete all footnotes?", + "DE.Views.Links.mniDelFootnote": "Delete All Footnotes", + "DE.Views.Links.mniInsFootnote": "Insert Footnote", + "DE.Views.Links.mniNoteSettings": "Notes Settings", + "DE.Views.Links.textContentsRemove": "Remove table of contents", + "DE.Views.Links.textContentsSettings": "Settings", + "DE.Views.Links.textGotoFootnote": "Go to Footnotes", + "DE.Views.Links.textUpdateAll": "Update entire table", + "DE.Views.Links.textUpdatePages": "Update page numbers only", + "DE.Views.Links.tipContents": "Insert table of contents", + "DE.Views.Links.tipContentsUpdate": "Update table of contents", + "DE.Views.Links.tipNotes": "Insert or edit footnotes", "DE.Views.MailMergeEmailDlg.cancelButtonText": "Cancel", "DE.Views.MailMergeEmailDlg.filePlaceholder": "PDF", "DE.Views.MailMergeEmailDlg.okButtonText": "Send", @@ -1622,7 +1637,7 @@ "DE.Views.Toolbar.capBtnInsChart": "Chart", "DE.Views.Toolbar.capBtnInsDropcap": "Drop Cap", "DE.Views.Toolbar.capBtnInsEquation": "Equation", - "DE.Views.Toolbar.capBtnInsFootnote": "Footnote", + "del_DE.Views.Toolbar.capBtnInsFootnote": "Footnote", "DE.Views.Toolbar.capBtnInsHeader": "Header/Footer", "DE.Views.Toolbar.capBtnInsImage": "Picture", "DE.Views.Toolbar.capBtnInsLink": "Hyperlink", @@ -1640,7 +1655,7 @@ "DE.Views.Toolbar.capImgGroup": "Group", "DE.Views.Toolbar.capImgWrapping": "Wrapping", "DE.Views.Toolbar.mniCustomTable": "Insert Custom Table", - "DE.Views.Toolbar.mniDelFootnote": "Delete All Footnotes", + "del_DE.Views.Toolbar.mniDelFootnote": "Delete All Footnotes", "DE.Views.Toolbar.mniEditDropCap": "Drop Cap Settings", "DE.Views.Toolbar.mniEditFooter": "Edit Footer", "DE.Views.Toolbar.mniEditHeader": "Edit Header", @@ -1648,8 +1663,8 @@ "DE.Views.Toolbar.mniHiddenChars": "Nonprinting Characters", "DE.Views.Toolbar.mniImageFromFile": "Picture from File", "DE.Views.Toolbar.mniImageFromUrl": "Picture from URL", - "DE.Views.Toolbar.mniInsFootnote": "Insert Footnote", - "DE.Views.Toolbar.mniNoteSettings": "Notes Settings", + "del_DE.Views.Toolbar.mniInsFootnote": "Insert Footnote", + "del_DE.Views.Toolbar.mniNoteSettings": "Notes Settings", "DE.Views.Toolbar.strMenuNoFill": "No Fill", "DE.Views.Toolbar.textArea": "Area", "DE.Views.Toolbar.textAutoColor": "Automatic", @@ -1669,7 +1684,7 @@ "DE.Views.Toolbar.textEvenPage": "Even Page", "DE.Views.Toolbar.textFitPage": "Fit to Page", "DE.Views.Toolbar.textFitWidth": "Fit to Width", - "DE.Views.Toolbar.textGotoFootnote": "Go to Footnotes", + "del_DE.Views.Toolbar.textGotoFootnote": "Go to Footnotes", "DE.Views.Toolbar.textHideLines": "Hide Rulers", "DE.Views.Toolbar.textHideStatusBar": "Hide Status Bar", "DE.Views.Toolbar.textHideTitleBar": "Hide Title Bar", @@ -1762,7 +1777,7 @@ "DE.Views.Toolbar.tipMailRecepients": "Mail merge", "DE.Views.Toolbar.tipMarkers": "Bullets", "DE.Views.Toolbar.tipMultilevels": "Multilevel list", - "DE.Views.Toolbar.tipNotes": "Insert or edit footnotes", + "del_DE.Views.Toolbar.tipNotes": "Insert or edit footnotes", "DE.Views.Toolbar.tipNumbers": "Numbering", "DE.Views.Toolbar.tipPageBreak": "Insert page or section break", "DE.Views.Toolbar.tipPageMargins": "Page margins", From 8ca83c71444bd8488ab118c4b814c3e8acb09546 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 26 Dec 2017 10:32:52 +0300 Subject: [PATCH 14/30] [DE] Added hyperlink button to the Links tab. --- .../main/app/controller/Links.js | 84 ++++++++++++++++--- .../main/app/controller/Toolbar.js | 65 +------------- .../main/app/template/Toolbar.template | 6 +- apps/documenteditor/main/app/view/Links.js | 77 ++++++++--------- apps/documenteditor/main/app/view/Toolbar.js | 12 --- apps/documenteditor/main/locale/en.json | 6 +- 6 files changed, 122 insertions(+), 128 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index b2b244a59..8fcf61379 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -42,7 +42,8 @@ define([ 'core', 'documenteditor/main/app/view/Links', - 'documenteditor/main/app/view/NoteSettingsDialog' + 'documenteditor/main/app/view/NoteSettingsDialog', + 'documenteditor/main/app/view/HyperlinkSettingsDialog' ], function () { 'use strict'; @@ -61,19 +62,22 @@ define([ 'Links': { 'links:contents': this.onTableContents, 'links:update': this.onTableContentsUpdate, - 'links:notes': this.onNotesClick + 'links:notes': this.onNotesClick, + 'links:hyperlink': this.onHyperlinkClick } }); }, onLaunch: function () { - this._state = {}; - this.editMode = true; + this._state = { + prcontrolsdisable:undefined + }; }, setApi: function (api) { if (api) { this.api = api; this.api.asc_registerCallback('asc_onFocusObject', this.onApiFocusObject.bind(this)); + this.api.asc_registerCallback('asc_onCanAddHyperlink', _.bind(this.onApiCanAddHyperlink, this)); this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onCoAuthoringDisconnect, this)); Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); } @@ -83,7 +87,7 @@ define([ setConfig: function(config) { this.toolbar = config.toolbar; this.view = this.createView('Links', { - toolbar: this.toolbar + toolbar: this.toolbar.toolbar }); }, @@ -97,12 +101,11 @@ define([ }, onCoAuthoringDisconnect: function() { - this.editMode = false; this.SetDisabled(true); }, onApiFocusObject: function(selectedObjects) { - if (!this.editMode) return; + if (!this.toolbar.editMode) return; var pr, i = -1, type, paragraph_locked = false, @@ -127,15 +130,74 @@ define([ } } + this._state.prcontrolsdisable = paragraph_locked || header_locked; + var need_disable = paragraph_locked || in_equation || in_image || in_header; _.each (this.view.btnsNotes, function(item){ item.setDisabled(need_disable); }, this); + }, - // var need_disable = paragraph_locked || header_locked; - // _.each (this.view.btnsContents, function(item){ - // item.setDisabled(need_disable); - // }, this); + onApiCanAddHyperlink: function(value) { + var need_disable = !value || this._state.prcontrolsdisable; + + if ( this.toolbar.editMode ) { + _.each (this.view.btnsHyperlink, function(item){ + item.setDisabled(need_disable); + }, this); + } + }, + + onHyperlinkClick: function(btn) { + var me = this, + win, props, text; + + if (me.api){ + + var handlerDlg = function(dlg, result) { + if (result == 'ok') { + props = dlg.getSettings(); + (text!==false) + ? me.api.add_Hyperlink(props) + : me.api.change_Hyperlink(props); + } + + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + }; + + text = me.api.can_AddHyperlink(); + + if (text !== false) { + win = new DE.Views.HyperlinkSettingsDialog({ + api: me.api, + handler: handlerDlg + }); + + props = new Asc.CHyperlinkProperty(); + props.put_Text(text); + + win.show(); + win.setSettings(props); + } else { + var selectedElements = me.api.getSelectedElements(); + if (selectedElements && _.isArray(selectedElements)){ + _.each(selectedElements, function(el, i) { + if (selectedElements[i].get_ObjectType() == Asc.c_oAscTypeSelectElement.Hyperlink) + props = selectedElements[i].get_ObjectValue(); + }); + } + if (props) { + win = new DE.Views.HyperlinkSettingsDialog({ + api: me.api, + handler: handlerDlg + }); + win.show(); + win.setSettings(props); + } + } + } + + Common.component.Analytics.trackEvent('ToolBar', 'Add Hyperlink'); }, onTableContents: function(type){ diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 75858b112..a76bdb405 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -48,7 +48,6 @@ define([ 'common/main/lib/view/InsertTableDialog', 'common/main/lib/util/define', 'documenteditor/main/app/view/Toolbar', - 'documenteditor/main/app/view/HyperlinkSettingsDialog', 'documenteditor/main/app/view/DropcapSettingsAdvanced', 'documenteditor/main/app/view/MailMergeRecepients', 'documenteditor/main/app/view/StyleTitleDialog', @@ -275,7 +274,6 @@ define([ toolbar.mnuLineSpace.on('item:toggle', _.bind(this.onLineSpaceToggle, this)); toolbar.mnuNonPrinting.on('item:toggle', _.bind(this.onMenuNonPrintingToggle, this)); toolbar.btnShowHidenChars.on('toggle', _.bind(this.onNonPrintingToggle, this)); - toolbar.btnInsertHyperlink.on('click', _.bind(this.onHyperlinkClick, this)); toolbar.mnuTablePicker.on('select', _.bind(this.onTablePickerSelect, this)); toolbar.mnuInsertTable.on('item:click', _.bind(this.onInsertTableClick, this)); toolbar.mnuInsertImage.on('item:click', _.bind(this.onInsertImageClick, this)); @@ -331,7 +329,6 @@ define([ this.api.asc_registerCallback('asc_onPrAlign', _.bind(this.onApiParagraphAlign, this)); this.api.asc_registerCallback('asc_onTextColor', _.bind(this.onApiTextColor, this)); this.api.asc_registerCallback('asc_onParaSpacingLine', _.bind(this.onApiLineSpacing, this)); - this.api.asc_registerCallback('asc_onCanAddHyperlink', _.bind(this.onApiCanAddHyperlink, this)); this.api.asc_registerCallback('asc_onFocusObject', _.bind(this.onApiFocusObject, this)); this.api.asc_registerCallback('asc_onDocSize', _.bind(this.onApiPageSize, this)); this.api.asc_registerCallback('asc_onPaintFormatChanged', _.bind(this.onApiStyleChange, this)); @@ -567,14 +564,6 @@ define([ } }, - onApiCanAddHyperlink: function(value) { - var need_disable = !value || this._state.prcontrolsdisable; - - if ( this.editMode ) { - this.toolbar.btnInsertHyperlink.setDisabled(need_disable); - } - }, - onApiPageSize: function(w, h) { var width = this._state.pgorient ? w : h, height = this._state.pgorient ? h : w; @@ -1290,58 +1279,6 @@ define([ Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, - onHyperlinkClick: function(btn) { - var me = this, - win, props, text; - - if (me.api){ - - var handlerDlg = function(dlg, result) { - if (result == 'ok') { - props = dlg.getSettings(); - (text!==false) - ? me.api.add_Hyperlink(props) - : me.api.change_Hyperlink(props); - } - - Common.NotificationCenter.trigger('edit:complete', me.toolbar); - }; - - text = me.api.can_AddHyperlink(); - - if (text !== false) { - win = new DE.Views.HyperlinkSettingsDialog({ - api: me.api, - handler: handlerDlg - }); - - props = new Asc.CHyperlinkProperty(); - props.put_Text(text); - - win.show(); - win.setSettings(props); - } else { - var selectedElements = me.api.getSelectedElements(); - if (selectedElements && _.isArray(selectedElements)){ - _.each(selectedElements, function(el, i) { - if (selectedElements[i].get_ObjectType() == Asc.c_oAscTypeSelectElement.Hyperlink) - props = selectedElements[i].get_ObjectValue(); - }); - } - if (props) { - win = new DE.Views.HyperlinkSettingsDialog({ - api: me.api, - handler: handlerDlg - }); - win.show(); - win.setSettings(props); - } - } - } - - Common.component.Analytics.trackEvent('ToolBar', 'Add Hyperlink'); - }, - onTablePickerSelect: function(picker, columns, rows, e) { if (this.api) { this.toolbar.fireEvent('inserttable', this.toolbar); @@ -2787,7 +2724,7 @@ define([ } var links = me.getApplication().getController('Links'); - links.setApi(me.api).setConfig({toolbar: me.toolbar}); + links.setApi(me.api).setConfig({toolbar: me}); Array.prototype.push.apply(me.toolbar.toolbarControls, links.getView('Links').getButtons()); } }, diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index d88c57e1b..22c4e3b48 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -122,7 +122,7 @@
- +
@@ -166,6 +166,10 @@
+
+
+ +
diff --git a/apps/documenteditor/main/app/view/Links.js b/apps/documenteditor/main/app/view/Links.js index 54c2b71d3..896d07fa0 100644 --- a/apps/documenteditor/main/app/view/Links.js +++ b/apps/documenteditor/main/app/view/Links.js @@ -85,6 +85,12 @@ define([ me.fireEvent('links:notes', ['next']); }); }); + + this.btnsHyperlink.forEach(function(button) { + button.on('click', function (b, e) { + me.fireEvent('links:hyperlink'); + }); + }); } return { @@ -99,6 +105,8 @@ define([ this.btnsNotes = []; this.btnsPrevNote = []; this.btnsNextNote = []; + this.btnsHyperlink = []; + this.paragraphControls = []; var me = this, $host = me.toolbar.$el; @@ -108,22 +116,28 @@ define([ cmp.rendered ? $slot.append(cmp.$el) : cmp.render($slot); }; - var $slots = $host.find('.btn-slot.btn-contents'); - $slots.each(function(index, el) { - var _cls = 'btn-toolbar'; - /x-huge/.test(el.className) && (_cls += ' x-huge icon-top'); + var _injectComponents = function ($slots, iconCls, split, menu, caption, btnsArr) { + $slots.each(function(index, el) { + var _cls = 'btn-toolbar'; + /x-huge/.test(el.className) && (_cls += ' x-huge icon-top'); - var button = new Common.UI.Button({ - cls: _cls, - iconCls: 'btn-contents', - caption: me.capBtnInsContents, - split: true, - menu: true, - disabled: true - }).render( $slots.eq(index) ); + var button = new Common.UI.Button({ + cls: _cls, + iconCls: iconCls, + caption: caption, + split: split, + menu: menu, + disabled: true + }).render( $slots.eq(index) ); - me.btnsContents.push(button); - }); + btnsArr.push(button); + me.paragraphControls.push(button); + }); + }; + + _injectComponents($host.find('.btn-slot.btn-contents'), 'btn-contents', true, true, me.capBtnInsContents, me.btnsContents); + _injectComponents($host.find('.btn-slot.slot-notes'), 'btn-notes', true, true, me.capBtnInsFootnote, me.btnsNotes); + _injectComponents($host.find('.btn-slot.slot-inshyperlink'), 'btn-inserthyperlink', false, false, me.capBtnInsLink, me.btnsHyperlink); this.btnContentsUpdate = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', @@ -134,23 +148,7 @@ define([ disabled: true }); _injectComponent('#slot-btn-contents-update', this.btnContentsUpdate); - - $slots = $host.find('.btn-slot.slot-notes'); - $slots.each(function(index, el) { - var _cls = 'btn-toolbar'; - /x-huge/.test(el.className) && (_cls += ' x-huge icon-top'); - - var button = new Common.UI.Button({ - cls: _cls, - iconCls: 'btn-notes', - caption: me.capBtnInsFootnote, - split: true, - menu: true, - disabled: true - }).render( $slots.eq(index) ); - - me.btnsNotes.push(button); - }); + this.paragraphControls.push(this.btnContentsUpdate); this._state = {disabled: false}; Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); @@ -182,13 +180,12 @@ define([ }); me.btnContentsUpdate.updateHint(me.tipContentsUpdate); - var _menu = new Common.UI.Menu({ + me.btnContentsUpdate.setMenu(new Common.UI.Menu({ items: [ {caption: me.textUpdateAll, value: 'all'}, {caption: me.textUpdatePages, value: 'pages'} ] - }); - me.btnContentsUpdate.setMenu(_menu); + })); me.btnsNotes.forEach( function(btn, index) { btn.updateHint( me.tipNotes ); @@ -225,7 +222,10 @@ define([ el: $('#id-menu-goto-footnote-next-'+index), cls: 'btn-toolbar' })); + }); + me.btnsHyperlink.forEach( function(btn) { + btn.updateHint(me.tipInsertHyperlink + Common.Utils.String.platformKey('Ctrl+K')); }); setEvents.call(me); @@ -238,17 +238,16 @@ define([ }, getButtons: function() { - return this.btnsContents.concat(this.btnContentsUpdate).concat(this.btnsNotes); + return this.paragraphControls; }, SetDisabled: function (state) { this._state.disabled = state; - this.btnsContents.concat(this.btnsNotes).forEach(function(button) { + this.paragraphControls.forEach(function(button) { if ( button ) { button.setDisabled(state); } }, this); - this.btnContentsUpdate.setDisabled(state); }, capBtnInsContents: 'Table of Contents', @@ -265,7 +264,9 @@ define([ mniNoteSettings: 'Notes Settings', textGotoFootnote: 'Go to Footnotes', capBtnInsFootnote: 'Footnotes', - confirmDeleteFootnotes: 'Do you want to delete all footnotes?' + confirmDeleteFootnotes: 'Do you want to delete all footnotes?', + capBtnInsLink: 'Hyperlink', + tipInsertHyperlink: 'Add Hyperlink' } }()), DE.Views.Links || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index aa18c469d..d61552b9a 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -521,14 +521,6 @@ define([ }); this.paragraphControls.push(this.btnInsertTextArt); - this.btnInsertHyperlink = new Common.UI.Button({ - id: 'tlbtn-insertlink', - cls: 'btn-toolbar x-huge icon-top', - caption: me.capBtnInsLink, - iconCls: 'btn-inserthyperlink' - }); - this.paragraphControls.push(this.btnInsertHyperlink); - this.btnEditHeader = new Common.UI.Button({ id: 'id-toolbar-btn-editheader', cls: 'btn-toolbar x-huge icon-top', @@ -1249,7 +1241,6 @@ define([ _injectComponent('#slot-btn-instextart', this.btnInsertTextArt); _injectComponent('#slot-btn-dropcap', this.btnDropCap); _injectComponent('#slot-btn-columns', this.btnColumns); - _injectComponent('#slot-btn-inshyperlink', this.btnInsertHyperlink); _injectComponent('#slot-btn-editheader', this.btnEditHeader); _injectComponent('#slot-btn-insshape', this.btnInsertShape); _injectComponent('#slot-btn-insequation', this.btnInsertEquation); @@ -1499,7 +1490,6 @@ define([ this.btnInsertChart.updateHint(this.tipInsertChart); this.btnInsertText.updateHint(this.tipInsertText); this.btnInsertTextArt.updateHint(this.tipInsertTextArt); - this.btnInsertHyperlink.updateHint(this.tipInsertHyperlink + Common.Utils.String.platformKey('Ctrl+K')); this.btnEditHeader.updateHint(this.tipEditHeader); this.btnInsertShape.updateHint(this.tipInsertShape); this.btnInsertEquation.updateHint(this.tipInsertEquation); @@ -2281,7 +2271,6 @@ define([ tipEditHeader: 'Edit Document Header or Footer', mniEditHeader: 'Edit Document Header', mniEditFooter: 'Edit Document Footer', - tipInsertHyperlink: 'Add Hyperlink', mniHiddenChars: 'Nonprinting Characters', mniHiddenBorders: 'Hidden Table Borders', tipSynchronize: 'The document has been changed by another user. Please click to save your changes and reload the updates.', @@ -2377,7 +2366,6 @@ define([ capBtnInsImage: 'Picture', capBtnInsTable: 'Table', capBtnInsChart: 'Chart', - capBtnInsLink: 'Hyperlink', textTabFile: 'File', textTabHome: 'Home', textTabInsert: 'Insert', diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index bd03dff46..7a25df8db 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1236,6 +1236,7 @@ "DE.Views.Links.capBtnContentsUpdate": "Update", "DE.Views.Links.capBtnInsContents": "Table of Contents", "DE.Views.Links.capBtnInsFootnote": "Footnote", + "DE.Views.Links.capBtnInsLink": "Hyperlink", "DE.Views.Links.confirmDeleteFootnotes": "Do you want to delete all footnotes?", "DE.Views.Links.mniDelFootnote": "Delete All Footnotes", "DE.Views.Links.mniInsFootnote": "Insert Footnote", @@ -1247,6 +1248,7 @@ "DE.Views.Links.textUpdatePages": "Update page numbers only", "DE.Views.Links.tipContents": "Insert table of contents", "DE.Views.Links.tipContentsUpdate": "Update table of contents", + "DE.Views.Links.tipInsertHyperlink": "Add hyperlink", "DE.Views.Links.tipNotes": "Insert or edit footnotes", "DE.Views.MailMergeEmailDlg.cancelButtonText": "Cancel", "DE.Views.MailMergeEmailDlg.filePlaceholder": "PDF", @@ -1640,7 +1642,7 @@ "del_DE.Views.Toolbar.capBtnInsFootnote": "Footnote", "DE.Views.Toolbar.capBtnInsHeader": "Header/Footer", "DE.Views.Toolbar.capBtnInsImage": "Picture", - "DE.Views.Toolbar.capBtnInsLink": "Hyperlink", + "del_DE.Views.Toolbar.capBtnInsLink": "Hyperlink", "DE.Views.Toolbar.capBtnInsPagebreak": "Breaks", "DE.Views.Toolbar.capBtnInsShape": "Shape", "DE.Views.Toolbar.capBtnInsTable": "Table", @@ -1766,7 +1768,7 @@ "DE.Views.Toolbar.tipIncPrLeft": "Increase indent", "DE.Views.Toolbar.tipInsertChart": "Insert chart", "DE.Views.Toolbar.tipInsertEquation": "Insert equation", - "DE.Views.Toolbar.tipInsertHyperlink": "Add hyperlink", + "del_DE.Views.Toolbar.tipInsertHyperlink": "Add hyperlink", "DE.Views.Toolbar.tipInsertImage": "Insert picture", "DE.Views.Toolbar.tipInsertNum": "Insert Page Number", "DE.Views.Toolbar.tipInsertShape": "Insert autoshape", From 2e1ab32de6dd376c0fa9388bc7c0738ddf7974c7 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 26 Dec 2017 17:31:14 +0300 Subject: [PATCH 15/30] [DE] Added advanced settings for table of contents. --- .../main/app/controller/Links.js | 18 +- .../main/app/view/TableOfContentsSettings.js | 271 ++++++++++++++++++ 2 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 apps/documenteditor/main/app/view/TableOfContentsSettings.js diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index 8fcf61379..194360771 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -43,7 +43,8 @@ define([ 'core', 'documenteditor/main/app/view/Links', 'documenteditor/main/app/view/NoteSettingsDialog', - 'documenteditor/main/app/view/HyperlinkSettingsDialog' + 'documenteditor/main/app/view/HyperlinkSettingsDialog', + 'documenteditor/main/app/view/TableOfContentsSettings' ], function () { 'use strict'; @@ -206,7 +207,20 @@ define([ this.api.asc_addTableOfContents(); break; case 1: this.api.asc_addTableOfContents(); break; - case 'settins': + case 'settings': + var props, me = this; + var win = new DE.Views.TableOfContentsSettings({ + api: this.api, + props: props, + handler: function(dlg, result) { + if (result == 'ok') { + props = dlg.getSettings(); + } + + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + }); + win.show(); break; case 'remove': break; diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js new file mode 100644 index 000000000..3a0aa4f27 --- /dev/null +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -0,0 +1,271 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * 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 + * + */ + +/** + * TableOfContentsSettings.js.js + * + * Created by Julia Radzhabova on 26.12.2017 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/util/utils', + 'common/main/lib/component/MetricSpinner', + 'common/main/lib/component/ComboBox', + 'common/main/lib/view/AdvancedSettingsWindow' +], function () { 'use strict'; + + DE.Views.TableOfContentsSettings = Common.Views.AdvancedSettingsWindow.extend(_.extend({ + options: { + contentWidth: 500, + height: 380 + }, + + initialize : function(options) { + var me = this; + + _.extend(this.options, { + title: this.textTitle, + template: [ + '
', + '
', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '', + '
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
', + '', + '
', + '
', + '
', + '
', + '
', + '
', + '' + ].join('') + }, options); + + this.api = options.api; + this.handler = options.handler; + this.props = options.props; + + Common.Views.AdvancedSettingsWindow.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.Views.AdvancedSettingsWindow.prototype.render.call(this); + var me = this; + + this.chPages = new Common.UI.CheckBox({ + el: $('#tableofcontents-chb-pages'), + labelText: this.strShowPages, + value: 'checked' + }); + this.chPages.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + this.chAlign.setDisabled(field.getValue()!=='checked'); + this.cmbLeader.setDisabled(field.getValue()!=='checked'); + if (this._changedProps) { + } + }, this)); + + this.chAlign = new Common.UI.CheckBox({ + el: $('#tableofcontents-chb-align'), + labelText: this.strAlign, + value: 'checked' + }); + // this.chAlign.on('change', _.bind(this.onAlignChange, this)); + + this.cmbLeader = new Common.UI.ComboBox({ + el : $('#tableofcontents-combo-leader'), + style : 'width: 85px;', + menuStyle : 'min-width: 85px;', + editable : false, + cls : 'input-group-nr', + data : [ + { value: Asc.c_oAscTabLeader.None, displayValue: this.textNone }, + { value: Asc.c_oAscTabLeader.Dot, displayValue: '....................' }, + { value: Asc.c_oAscTabLeader.Hyphen, displayValue: '-----------------' }, + { value: Asc.c_oAscTabLeader.Underscore,displayValue: '__________' } + ] + }); + this.cmbLeader.setValue(Asc.c_oAscTabLeader.None); + + this.chLinks = new Common.UI.CheckBox({ + el: $('#tableofcontents-chb-links'), + labelText: this.strLinks + }); + this.chLinks.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + this.chUnderline.setDisabled(field.getValue()!=='checked'); + if (this._changedProps) { + } + }, this)); + + this.chUnderline = new Common.UI.CheckBox({ + el: $('#tableofcontents-chb-underline'), + labelText: this.strUnderline, + disabled: true + }); + + this.radioLevels = new Common.UI.RadioBox({ + el: $('#tableofcontents-radio-levels'), + labelText: this.textRadioLevels, + name: 'asc-radio-content-build', + checked: true + }); + + this.radioStyles = new Common.UI.RadioBox({ + el: $('#tableofcontents-radio-styles'), + labelText: this.textRadioStyles, + name: 'asc-radio-content-build' + }); + + this.cmbStyles = new Common.UI.ComboBox({ + el: $('#tableofcontents-combo-styles'), + cls: 'input-group-nr', + menuStyle: 'min-width: 150px;', + editable: false, + data: [ + { displayValue: this.txtCurrent, value: Asc.c_oAscNumberingFormat.Decimal }, + { displayValue: this.txtSimple, value: Asc.c_oAscNumberingFormat.Decimal }, + { displayValue: this.txtStandard, value: Asc.c_oAscNumberingFormat.Decimal }, + { displayValue: this.txtModern, value: Asc.c_oAscNumberingFormat.Decimal }, + { displayValue: this.txtClassic, value: Asc.c_oAscNumberingFormat.Decimal } + ] + }); + // this.cmbStyles.setValue(); + // this.cmbStyles.on('selected', _.bind(this.onStylesSelect, this)); + + this.spnLevels = new Common.UI.CustomSpinner({ + el: $('#tableofcontents-spin-levels'), + step: 1, + width: 85, + defaultUnit : "", + value: 4, + maxValue: 9, + minValue: 1, + allowDecimal: false, + maskExp: /[1-9]/ + }); + this.spnLevels.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + if (this._changedProps) { + // this._changedProps.get_Ind().put_FirstLine(Common.Utils.Metric.fnRecalcToMM(field.getNumberValue())); + } + }, this)); + + + this.afterRender(); + }, + + afterRender: function() { + this._setDefaults(this.props); + }, + + show: function() { + Common.Views.AdvancedSettingsWindow.prototype.show.apply(this, arguments); + }, + + _setDefaults: function (props) { + if (props) { + } + // this._changedProps = new Asc.asc_CParagraphProperty(); + }, + + getSettings: function () { + var props; + return props; + }, + + textTitle: 'Table of Contents', + textLeader: 'Leader', + textBuildTable: 'Build table of contents from', + textLevels: 'Levels', + textStyles: 'Styles', + strShowPages: 'Show page numbers', + strAlign: 'Right align page numbers', + strLinks: 'Use hyperlinks instead of page numbers', + strUnderline: 'Underline hyperlinks', + textNone: 'None', + textRadioLevels: 'Outline levels', + textRadioStyles: 'Selected styles', + cancelButtonText: 'Cancel', + okButtonText : 'Ok' + + }, DE.Views.TableOfContentsSettings || {})) +}); \ No newline at end of file From ac78e89a588a06a35d1782155cabc7a7536aa04f Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 10 Jan 2018 13:23:11 +0300 Subject: [PATCH 16/30] [DE] Update left menu icon for table of contents. --- .../main/app/template/LeftMenu.template | 2 +- .../main/resources/img/toolbar-menu.png | Bin 15726 -> 15767 bytes .../main/resources/img/toolbar-menu@2x.png | Bin 37585 -> 37658 bytes .../main/resources/less/leftmenu.less | 1 + 4 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/template/LeftMenu.template b/apps/documenteditor/main/app/template/LeftMenu.template index faf223e75..ad40fa7e8 100644 --- a/apps/documenteditor/main/app/template/LeftMenu.template +++ b/apps/documenteditor/main/app/template/LeftMenu.template @@ -6,7 +6,7 @@ - +
diff --git a/apps/documenteditor/main/resources/img/toolbar-menu.png b/apps/documenteditor/main/resources/img/toolbar-menu.png index 3c959c510edc1ad9894b6bbe33c76a3ab76b020f..558dd83d48792949ada0792e62593ea0ef93a90d 100644 GIT binary patch literal 15767 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 literal 15726 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 JtJDBT{U6lW5Xk@l diff --git a/apps/documenteditor/main/resources/img/toolbar-menu@2x.png b/apps/documenteditor/main/resources/img/toolbar-menu@2x.png index 8a0406eb277a6ab8fc405ccd1105b0e676896adf..7f29f381cff6bb7defe98ebb1f6772b9c591ddfa 100644 GIT binary patch literal 37658 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 diff --git a/apps/documenteditor/main/resources/less/leftmenu.less b/apps/documenteditor/main/resources/less/leftmenu.less index 1a58d8c97..cfcbbdaee 100644 --- a/apps/documenteditor/main/resources/less/leftmenu.less +++ b/apps/documenteditor/main/resources/less/leftmenu.less @@ -22,6 +22,7 @@ button.notify .btn-menu-comments {background-position: -0*@toolbar-icon-size -60 .button-normal-icon(btn-menu-about, 68, @toolbar-icon-size); .button-normal-icon(btn-menu-support, 70, @toolbar-icon-size); .button-normal-icon(btn-menu-plugin, 77, @toolbar-icon-size); +.button-normal-icon(btn-menu-navigation, 83, @toolbar-icon-size); .tool-menu-btns { width: 40px; From 1a3b022467c085338584628050934ff3d1347888 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 11 Jan 2018 10:38:50 +0300 Subject: [PATCH 17/30] [DE] Fast updating name of the headers in the table of contents. --- .../main/app/controller/Navigation.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/apps/documenteditor/main/app/controller/Navigation.js b/apps/documenteditor/main/app/controller/Navigation.js index b7f0fd03f..ec8341df0 100644 --- a/apps/documenteditor/main/app/controller/Navigation.js +++ b/apps/documenteditor/main/app/controller/Navigation.js @@ -83,6 +83,9 @@ define([ this.api = api; this.api.asc_registerCallback('asc_onDocumentOutlineUpdate', _.bind(this.updateNavigation, this)); this.api.asc_registerCallback('asc_onDocumentOutlineCurrentPosition', _.bind(this.onChangeOutlinePosition, this)); + this.api.asc_registerCallback('asc_onDocumentOutlineUpdateAdd', _.bind(this.updateNavigation, this)); + this.api.asc_registerCallback('asc_onDocumentOutlineUpdateChange', _.bind(this.updateChangeNavigation, this)); + this.api.asc_registerCallback('asc_onDocumentOutlineUpdateRemove', _.bind(this.updateNavigation, this)); return this; }, @@ -123,6 +126,19 @@ define([ this.getApplication().getCollection('Navigation').reset(arr); }, + updateChangeNavigation: function(index) { + if (!this._navigationObject) return; + + var item = this.getApplication().getCollection('Navigation').at(index); + if (item.get('level') !== this._navigationObject.get_Level(index) || + index==0 && item.get('isNotHeader') !== this._navigationObject.isFirstItemNotHeader()) { + this.updateNavigation(); + } else { + item.set('name', this._navigationObject.get_Text(index)); + item.set('isEmptyItem', this._navigationObject.isEmptyItem(index)); + } + }, + onChangeOutlinePosition: function(index) { this.panelNavigation.viewNavigationList.selectByIndex(index); }, From fa6e01bbe7b793d8e5c32a0c9521304187a78216 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 11 Jan 2018 11:22:50 +0300 Subject: [PATCH 18/30] TreeView: insert element by index. --- apps/common/main/lib/component/TreeView.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/common/main/lib/component/TreeView.js b/apps/common/main/lib/component/TreeView.js index 84ffd6ffc..12d383107 100644 --- a/apps/common/main/lib/component/TreeView.js +++ b/apps/common/main/lib/component/TreeView.js @@ -181,7 +181,7 @@ define([ Common.UI.DataView.prototype.initialize.call(this, options); }, - onAddItem: function(record, index, opts) { + onAddItem: function(record, store, opts) { var view = new Common.UI.DataViewItem({ template: this.itemTemplate, model: record @@ -190,12 +190,21 @@ define([ if (view) { var innerEl = $(this.el).find('.inner').addBack().filter('.inner'); if (innerEl) { - if (opts && opts.at == 0) - innerEl.prepend(view.render().el); else - innerEl.append(view.render().el); - innerEl.find('.empty-text').remove(); - this.dataViewItems.push(view); + + if (opts && opts.at!==undefined) { + var idx = opts.at; + var innerDivs = innerEl.find('> div'); + if (idx > 0) + $(innerDivs.get(idx - 1)).after(view.render().el); + else { + (innerDivs.length > 0) ? $(innerDivs[idx]).before(view.render().el) : innerEl.append(view.render().el); + } + this.dataViewItems = this.dataViewItems.slice(0, idx).concat(view).concat(this.dataViewItems.slice(idx)); + } else { + innerEl.append(view.render().el); + this.dataViewItems.push(view); + } var name = record.get('name'); if (name.length > 37 - record.get('level')*2) From 234c38aadf139a95dea6e8cf05b77060344755a6 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 11 Jan 2018 18:02:27 +0300 Subject: [PATCH 19/30] [DE] Change advanced settings for table of contents. --- .../main/resources/less/asc-mixins.less | 2 +- .../main/app/view/TableOfContentsSettings.js | 126 ++++++++++++++++-- .../resources/less/advanced-settings.less | 30 +++++ 3 files changed, 147 insertions(+), 11 deletions(-) diff --git a/apps/common/main/resources/less/asc-mixins.less b/apps/common/main/resources/less/asc-mixins.less index 447654e4b..fccee9993 100644 --- a/apps/common/main/resources/less/asc-mixins.less +++ b/apps/common/main/resources/less/asc-mixins.less @@ -146,7 +146,7 @@ @common-controls-width: 100px; .img-commonctrl, .theme-colorpalette .color-transparent, .palette-color-ext .color-transparent, .dropdown-menu li .checked:before, .input-error:before, - .btn-toolbar .icon.img-commonctrl { + .btn-toolbar .icon.img-commonctrl, .list-item div.checked:before { background-image: data-uri(%("%s",'@{common-image-path}/@{common-controls}')); background-repeat: no-repeat; diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index 3a0aa4f27..36e4b22ea 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -49,7 +49,7 @@ define([ DE.Views.TableOfContentsSettings = Common.Views.AdvancedSettingsWindow.extend(_.extend({ options: { contentWidth: 500, - height: 380 + height: 445 }, initialize : function(options) { @@ -67,7 +67,7 @@ define([ '
', '', '', - '
', + '
', '
', '
', '', @@ -94,19 +94,30 @@ define([ '', '', '', - '', + '', '', '
', - '
', + '
', '', '', '', - '', - '', - '
', + '', + '
', + '', + '
', + '
', + '', '', - '', - '', + '', + '', '
', '', '', @@ -189,12 +200,24 @@ define([ name: 'asc-radio-content-build', checked: true }); + this.radioLevels.on('change', _.bind(function(field, newValue, eOpts) { + if (newValue) { + this.levelsContainer.toggleClass('hidden', !newValue); + this.stylesContainer.toggleClass('hidden', newValue); + } + }, this)); this.radioStyles = new Common.UI.RadioBox({ el: $('#tableofcontents-radio-styles'), labelText: this.textRadioStyles, name: 'asc-radio-content-build' }); + this.radioStyles.on('change', _.bind(function(field, newValue, eOpts) { + if (newValue) { + this.stylesContainer.toggleClass('hidden', !newValue); + this.levelsContainer.toggleClass('hidden', newValue); + } + }, this)); this.cmbStyles = new Common.UI.ComboBox({ el: $('#tableofcontents-combo-styles'), @@ -229,7 +252,31 @@ define([ } }, this)); + this.stylesLevels = new Common.UI.DataViewStore(); + if (this.stylesLevels) { + this.stylesList = new Common.UI.ListView({ + el: $('#tableofcontents-styles-list', this.$window), + store: this.stylesLevels, + simpleAddMode: true, + showLast: false, + template: _.template(['
'].join('')), + itemTemplate: _.template([ + '
', + '
<%= name %>
', + '
', + '
', + '
', + '
', + '
' + ].join('')) + }); + this.stylesList.on('item:change', _.bind(this.onItemChange, this)); + this.stylesList.on('item:add', _.bind(this.addEvents, this)); + } + + this.levelsContainer = $('#tableofcontents-from-levels'); + this.stylesContainer = $('#tableofcontents-from-styles'); this.afterRender(); }, @@ -244,6 +291,27 @@ define([ _setDefaults: function (props) { if (props) { } + + this.stylesLevels.reset([ + (new Common.UI.DataViewModel({ + name: 'header1', + allowSelected: false, + checked: true, + value: 1 + })), + (new Common.UI.DataViewModel({ + name: 'header2', + allowSelected: false, + checked: false, + value: '' + })), + (new Common.UI.DataViewModel({ + name: 'header3', + allowSelected: false, + checked: false, + value: '' + }))]); + // this._changedProps = new Asc.asc_CParagraphProperty(); }, @@ -252,6 +320,37 @@ define([ return props; }, + addEvents: function(listView, itemView, record) { + var input = itemView.$el.find('input'); + input.on('keypress', function(e) { + var charCode = String.fromCharCode(e.which); + if(!/[1-9]/.test(charCode) && !e.ctrlKey && e.keyCode !== Common.UI.Keys.DELETE && e.keyCode !== Common.UI.Keys.BACKSPACE && + e.keyCode !== Common.UI.Keys.LEFT && e.keyCode !== Common.UI.Keys.RIGHT && e.keyCode !== Common.UI.Keys.HOME && + e.keyCode !== Common.UI.Keys.END && e.keyCode !== Common.UI.Keys.ESC && e.keyCode !== Common.UI.Keys.INSERT && + e.keyCode !== Common.UI.Keys.TAB || input.val().length>1){ + // if (e.keyCode==Common.UI.Keys.RETURN) me.trigger('changed', me, el.val()); + e.preventDefault(); + e.stopPropagation(); + } + + }); + input.on('input', function(e) { + // console.log(input.val()); + var newval = !_.isEmpty(input.val()); + if (record.get('checked') !== newval) { + record.set('checked', !_.isEmpty(input.val())); + } + record.set('value', input.val()); + }); + }, + + onItemChange: function(listView, itemView, record) { + this.addEvents(listView, itemView, record); + setTimeout(function(){ + itemView.$el.find('input').focus(); + }, 10); + }, + textTitle: 'Table of Contents', textLeader: 'Leader', textBuildTable: 'Build table of contents from', @@ -264,8 +363,15 @@ define([ textNone: 'None', textRadioLevels: 'Outline levels', textRadioStyles: 'Selected styles', + textStyle: 'Style', + textLevel: 'Level', cancelButtonText: 'Cancel', - okButtonText : 'Ok' + okButtonText : 'Ok', + txtCurrent: 'Current', + txtSimple: 'Simple', + txtStandard: 'Standard', + txtModern: 'Modern', + txtClassic: 'Classic' }, DE.Views.TableOfContentsSettings || {})) }); \ No newline at end of file diff --git a/apps/documenteditor/main/resources/less/advanced-settings.less b/apps/documenteditor/main/resources/less/advanced-settings.less index 5b15b0632..374a3293f 100644 --- a/apps/documenteditor/main/resources/less/advanced-settings.less +++ b/apps/documenteditor/main/resources/less/advanced-settings.less @@ -75,6 +75,36 @@ height:20px; } +.header-styles-tableview { + .list-item > div{ + &:nth-child(1) { + width:160px; + height: 16px; + padding-left:16px; + padding-right: 5px; + + &.checked { + &:before { + content: ''; + width: 16px; + height: 16px; + display: inline-block; + float: left; + margin-left: -18px; + background-position: @menu-check-offset-x @menu-check-offset-y; + } + } + } + + padding-right: 6px; + vertical-align: middle; + display: inline-block; + text-overflow: ellipsis; + overflow: hidden; + white-space: pre; + } +} + From 6f0050da480a6bd5e9cbd27bf10cab4ee217dcbc Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 15 Jan 2018 17:25:18 +0300 Subject: [PATCH 20/30] [DE] Change settings for table of contents. --- apps/documenteditor/main/app/view/TableOfContentsSettings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index 36e4b22ea..2d3167c3f 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -358,8 +358,8 @@ define([ textStyles: 'Styles', strShowPages: 'Show page numbers', strAlign: 'Right align page numbers', - strLinks: 'Use hyperlinks instead of page numbers', - strUnderline: 'Underline hyperlinks', + strLinks: 'Format Table of Contents as links', + strUnderline: 'Underline links', textNone: 'None', textRadioLevels: 'Outline levels', textRadioStyles: 'Selected styles', From dc2475af7ae19c2fa39745ebb0c260138bce0dda Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 16 Jan 2018 14:12:13 +0300 Subject: [PATCH 21/30] [DE] Change settings for table of contents. --- .../main/app/view/TableOfContentsSettings.js | 25 ++++-------------- .../main/resources/img/toolbar/contents.png | Bin 941 -> 733 bytes .../resources/img/toolbar/contents@2x.png | Bin 2079 -> 1624 bytes 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index 2d3167c3f..e3684197c 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -49,7 +49,7 @@ define([ DE.Views.TableOfContentsSettings = Common.Views.AdvancedSettingsWindow.extend(_.extend({ options: { contentWidth: 500, - height: 445 + height: 430 }, initialize : function(options) { @@ -66,8 +66,8 @@ define([ '', '
', '', - '', - '
', + '', + '
', '
', '
', '', @@ -83,14 +83,9 @@ define([ '
', '', '', - '', - '', - '', - '', - '', '', '', - '
', + '', '', '', '', @@ -102,7 +97,7 @@ define([ '', '', '', - '
', + '
', '', '
', '
', @@ -183,17 +178,8 @@ define([ labelText: this.strLinks }); this.chLinks.on('change', _.bind(function(field, newValue, oldValue, eOpts){ - this.chUnderline.setDisabled(field.getValue()!=='checked'); - if (this._changedProps) { - } }, this)); - this.chUnderline = new Common.UI.CheckBox({ - el: $('#tableofcontents-chb-underline'), - labelText: this.strUnderline, - disabled: true - }); - this.radioLevels = new Common.UI.RadioBox({ el: $('#tableofcontents-radio-levels'), labelText: this.textRadioLevels, @@ -359,7 +345,6 @@ define([ strShowPages: 'Show page numbers', strAlign: 'Right align page numbers', strLinks: 'Format Table of Contents as links', - strUnderline: 'Underline links', textNone: 'None', textRadioLevels: 'Outline levels', textRadioStyles: 'Selected styles', diff --git a/apps/documenteditor/main/resources/img/toolbar/contents.png b/apps/documenteditor/main/resources/img/toolbar/contents.png index e9acee2a3811f13151816b52950a767e2677eb6a..83210bd7a250c18e476663f092eafadd0b3d2a43 100644 GIT binary patch literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^-+*`m2Q!f5Nle=dq>KZ6LR>*KDZs_W#ngJ|2B0>< zk|4iehW{?*cXz)_n<=Ptro(tuXoK1Rx8E5Um^?gP978H@y}1#aCt@hz`mi|mUwQSR zf8pJeY!(DwSmE1T;9MJbF!ZE8`|~-)=PaLpTfz|WMBDq%oX)qA(@w2Fw{GhCEV13$ znh9C^Ki;ZkDdgr-Pm{ki?%lsLTG(`0#>^PxCngyV^kRzcY7Ll>eoSoRwZe={n)2tG85aSla&gU>n!88$nuo z3O25CG}^~%uCtDb=Zsl0!cS-Xi<^oxsPQMZ<^3hOb`vYugiJIMRD`Knuq zSAl|8SD7Uz@`G4gSEU6d&A!R4`!*@Gd5YQWy)mWNS4#Br)+yCyA&i0(`ISdSUr`~cYPkrFLmmOQ)BHUyHoDFEx~z a;Q=$No!(xHGuGDDv$L~ZU0r>BeMw14zrVklnws_X_3P{F zZfEfH;Earn%gf85p`it1!P4FDtH9$$e#&i@(~hj$D{;l??)O@X&Yia3-R1MR z%IAKe*Yx-M#nbC~oz-HG&>(EYP=w5~#pa))Yli>;0{KZqL4Q?7+fZsD>c^1j^zq513uW}?-SAv7F zocLw6+cCS7ZD2Gq0M0YE*Q=d;BQtR0L&8%fuE52=z1lAxsTK5wVkq$oF{AqT zY$gnjuUHTaSAUw_Y{zH&#wWN&G7T1>zh_4Pbg$X{O0z@8p4k}>C1${HX8ZSr0@>;5-?&vq^@{>>rDso*bVtjtU(p z(c!~10}=;5jPs;7h=_=YT&b$nK(>M1OA@+S{|16cTotuWAp$ zuq02?uyI~h!pTILO1CwWv%_d5UM5*^hNK*cOwxs-JwiS86t^s3ugr&(LUi_n%ucTM6 zUw?e@2Irh}&bg=GS+dl(xvCZmI}LMh1H^2wszHths~Xp|4OX>Kr@^W=>oi!^W||nR zYFY0!4DhPvRn0l)oOAApcb3_u-pp0C71_O*dE2YnOv_$Xi&Dm5RfC-ERW%^UTvdw= tayM7ihNRrEz^mHrc~x`HIp>^v3+DoIbr2W!ea!#>002ovPDHLkV1jb*;Hdxr diff --git a/apps/documenteditor/main/resources/img/toolbar/contents@2x.png b/apps/documenteditor/main/resources/img/toolbar/contents@2x.png index b622082dcf878f44e34d9d5b6d9f489d01d726d0..e1946694c9974e5160557535ca55c6a1647179e8 100644 GIT binary patch literal 1624 zcmb7CeK^x=7@kT#B6T^Z$)ZnR)ljsP96HOIB&r=1c6`hZmRV%JYKqb!A*IGaMJ>9> z*fd`eWjIW-fKQlct{mTRJg71r+^D_(le+FEZ#ZGlOo~*FNtD9*o^-Igmoqwls3=ny3z0+vX6nxNcZwvaeN7WR=_PHucBdAF>|) zl@a2;eUWw28Y_?f+o4^D+a3ToA$D0Lh2h}t73Wlu(iS1R6mY@+sBiC{t`}jEY}dMA z%IFo7JFiY~)+Iv-Z=G_|e#8dgkMyEfUt46N3^0qG*#VX|kMui5-1DyRzpvC5acN^( z*FV~#XkUTsdguBhZa? z4;Y0hpV)MfTsGvr=)cTw3j}dJGOK%x!&V6NLb{u$@sjr`>t@kIb55O;Mlhh z0uVOU^G(kO_HFbf=kd@|=szJ_C1Kzzq+ObP#+I8nUIKOFRLAat(btc3D1(TbZAh%L z5-6pBhE(UAMuxEu<5eO;Hq!2$T*=&Zn%WXDknnrJxBNLJN0cXcO3(rTlg z-ye3*=b?$hLWy_v+jY_$JhP1nk1Qby;Gh}s;Zde9Bn|o^JDx<=aC6%C^ zwI9u?gq^m=*7N3W9gBg+>S$r1%TSYAX(+C=z3@>d?n}L;K zKE?5J0Rs7>W5+>X&vMl+f>UEPWc@e4smO3kPf^t zTWPO6C~)c2sAEKg)bP(fTj^?TIf>PnXVaS{E>F!9pee23)Qa#<*-NA+k>=7g=}s;_ zL2ZM@FN-tZjXjY1o8T1aZN|ER0DM}&ljb7fO|@|n>rdCSsFu8Sy?Cow-uL1)<$o*w zKNt;#B`|Z0c>^QK&`&$Hp3f(M^YM!cm*t$fks{0b+$8MM8(Fexu*2J==t7fF4}UEh z>Wqtwk%d@gc?kl*3rvrPnK$hbehEzDPRkFr@omDdTU|TQd0e+jj4tZQcWFq3!OL>w>F=ADd^NS;PHUk{6U4JR<}K7* T@?DE@P0C}hH>zq+@cDlMR1O%` literal 2079 zcmb_cYcw0!77nUj6E3AhG#c7zM~b4-POCLBL5*Hg&s*x5i>QQ4n^4afr8OFZQY+Q* zN^3@mN}I$pi3*{#B-#>*Ruz2^T15It!%aG!weJ0S*SdS1bM|+>wfA28to7|vi1P6S z>YD2U005xZaikvrpe9l7o!S~o2Jx)*H>Jx(od|GOdZ+)zkVvE^`riL>b-B+=l}*6T z`T6(*9&9>2HN2I&e95XSkQ|F7{&nxNB43I{2DUztE-;`aZ$31D70qt`0DzX27ZMSW zCX)2zDr*3UwTed5Miu(gh?6wEEnQExGcq{9^C4YdO-8rKZq`(Rt~=l3l^6B%DX}htPe68+VvHkeajp4;EXg7aE919p>NEW;o30EfRPwy8`Jt z;A9i#6WZeGxQwZ?Fn1UNGUy$=|5()9M+@Tvi7rsS6}G8v%t)g9#!yDtMhDBJxy-+b zo1e7CRj8MLo8xPrUrD=2Sf%TWn;ETzukL;#X1gMa+Sz^f==a0#f}*PMR!1cVEES-O zC|dWNT?@z_t<``R230rXTkbaPsqfCH|HXWsP40edKQZ~)9A12oW(kqJvUa_ThaSa3 zE4E09eKFnTJ3Br(5_o?g@mOwRd;eh}-2`wvY-@y?q{@>${lP9EystRlA!VT}88#~9 zu*}*YjduUIXR*f4+V}lbb51*1$du%;FPF?G^`{b+H70RjUG84(TYxi@n~4#gMpZ4T zb~7m>m*K<+>WX}JlQifz&0xIy{Rn3yYf1B~K6aAf*We-1{37_z&W0ax^fZ1ES`ot= z(NCw1&j+73A60^_kTH3izzt!a=z7whJmI0I$x3@1t}aWW^yh`Q+$>C$=ZLkie=;8i~M`&1MwER}723l%kRdEtU{4 z)J0Y7B||XuQM&zOr!l;mclHQIguzhiNCj|nkrMv-{Qo-N^%aNh#`w~5Q1 z-k6eGwpNwW9x&i*7oF~p#lh)-%WM2}oBa^B0)+Jr`HU&m2{90III(dygi)cZAkwTX z+Eq^iO_l~oyracGIPSa7EIFY`Ju|0uPj*8KbqHwfDlN63u|6mc;MCaX*1k6sp< z&tKd(UZ2&=OdCp8A6kw04o{>CVgCQ@35uuW;}4-{+3>;5mM>;o1@?ab!zTP@q%-ZBmsWGE#0(4KseoQy-xQ#xz6q%fb?e};= zv>oWQtUcdCk>Vvo+Kn36etipC#UY)*veHwhtvSU@M(MrdYZ9zlpFo{FsqqBmf&YHg zXS(<0V<0n{;%CG!^s~Vk?2Z~sg4&y!TD2m9u} zbvi!nv6umteK%M=d~KlV*~Xc(C0UaAU+iZkS2{^Dhc<{YhQb;+mM2we5qrDV4ZQRy z3Yw}EqsXKjLvc^?EMbs>;u3K5TcHV*b>>!Q5vGbdOcyW-T1v=Li1Mazbn0{Ae@G8Q zQTwVo75Uq&)>?w@Sesy3hSMv1b!Q}tQ+a6(BR86Z97$)Lz6uu&3u8o>D^B4JB*I&q z-fEkG7sL6z_6P9N6ShShs-CocR6s}w#!!I4h0Aqt5g+zAfgyMXLB}OgvMk<=w!=k) zso~V3c-@pX0aG@sQ>OeBz|(`7HMy!m_&O1ro?zhDu827w_UB))-DQ!jBD~yvkS%VJ GKmQx8R_90n From 5f3d992f121685456ca9906a25cc29564ade6596 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 17 Jan 2018 12:32:12 +0300 Subject: [PATCH 22/30] [DE] Show settings for table of contents. --- .../main/app/controller/Links.js | 8 ++- .../main/app/view/TableOfContentsSettings.js | 69 ++++++++++++------- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index 194360771..bb62c9d71 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -204,17 +204,18 @@ define([ onTableContents: function(type){ switch (type) { case 0: - this.api.asc_addTableOfContents(); break; + this.api.asc_AddTableOfContents(); break; case 1: - this.api.asc_addTableOfContents(); break; + this.api.asc_AddTableOfContents(); break; case 'settings': var props, me = this; var win = new DE.Views.TableOfContentsSettings({ api: this.api, - props: props, + props: this.api.asc_GetTableOfContentsPr(), handler: function(dlg, result) { if (result == 'ok') { props = dlg.getSettings(); + me.api.asc_SetTableOfContentsPr(props); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); @@ -223,6 +224,7 @@ define([ win.show(); break; case 'remove': + this.api.asc_RemoveTableOfContents(); break; } }, diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index e3684197c..a8ee22cdb 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -49,7 +49,7 @@ define([ DE.Views.TableOfContentsSettings = Common.Views.AdvancedSettingsWindow.extend(_.extend({ options: { contentWidth: 500, - height: 430 + height: 455 }, initialize : function(options) { @@ -106,8 +106,8 @@ define([ '', '', '', - '', - '
', + '', + '
', '', '
', '', @@ -171,7 +171,7 @@ define([ { value: Asc.c_oAscTabLeader.Underscore,displayValue: '__________' } ] }); - this.cmbLeader.setValue(Asc.c_oAscTabLeader.None); + this.cmbLeader.setValue(Asc.c_oAscTabLeader.Dot); this.chLinks = new Common.UI.CheckBox({ el: $('#tableofcontents-chb-links'), @@ -275,30 +275,49 @@ define([ }, _setDefaults: function (props) { + var styles = []; + _.each(window.styles.get_MergedStyles(), function (style) { + styles.push(new Common.UI.DataViewModel({ + name: style.get_Name(), + allowSelected: false, + checked: false, + value: '' + })); + }); + if (props) { + var value = props.get_Hyperlink(); + this.chLinks.setValue((value !== null && value !== undefined) ? value : 'indeterminate', true); + + var start = props.get_OutlineStart(), + end = props.get_OutlineEnd(); + + this.spnLevels.setValue((start<0 || end<0) ? 0 : end); + this.spnLevels.setDisabled(start>1); + + var count = props.get_StylesCount(); + for (var i=0; i Date: Thu, 18 Jan 2018 11:58:24 +0300 Subject: [PATCH 23/30] [SE] Show settings for table of contents. --- .../main/app/controller/Links.js | 26 ++- .../main/app/view/TableOfContentsSettings.js | 179 ++++++++++++++++-- 2 files changed, 176 insertions(+), 29 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index bb62c9d71..71173365b 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -204,20 +204,30 @@ define([ onTableContents: function(type){ switch (type) { case 0: - this.api.asc_AddTableOfContents(); break; + var props = new Asc.CTableOfContentsPr(); + props.put_Hyperlink(true); + props.put_ShowPageNumbers(true); + props.put_RightAlignTab(true); + props.put_TabLeader( Asc.c_oAscTabLeader.Dot); + props.put_OutlineRange(1, 9); + this.api.asc_AddTableOfContents(props); break; case 1: - this.api.asc_AddTableOfContents(); break; + var props = new Asc.CTableOfContentsPr(); + props.put_Hyperlink(true); + props.put_ShowPageNumbers(false); + props.put_TabLeader( Asc.c_oAscTabLeader.None); + props.put_OutlineRange(1, 9); + this.api.asc_AddTableOfContents(props); break; case 'settings': - var props, me = this; + var props = this.api.asc_GetTableOfContentsPr(), + me = this; var win = new DE.Views.TableOfContentsSettings({ api: this.api, - props: this.api.asc_GetTableOfContentsPr(), - handler: function(dlg, result) { + props: props, + handler: function(result, value) { if (result == 'ok') { - props = dlg.getSettings(); - me.api.asc_SetTableOfContentsPr(props); + (props) ? me.api.asc_SetTableOfContentsPr(value) : me.api.asc_AddTableOfContents(value); } - Common.NotificationCenter.trigger('edit:complete', me.toolbar); } }); diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index a8ee22cdb..db829cfe8 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -131,6 +131,8 @@ define([ this.api = options.api; this.handler = options.handler; this.props = options.props; + this.startLevel = 1; + this.endLevel = 3; Common.Views.AdvancedSettingsWindow.prototype.initialize.call(this, this.options); }, @@ -156,7 +158,6 @@ define([ labelText: this.strAlign, value: 'checked' }); - // this.chAlign.on('change', _.bind(this.onAlignChange, this)); this.cmbLeader = new Common.UI.ComboBox({ el : $('#tableofcontents-combo-leader'), @@ -190,6 +191,8 @@ define([ if (newValue) { this.levelsContainer.toggleClass('hidden', !newValue); this.stylesContainer.toggleClass('hidden', newValue); + if (this._needUpdateOutlineLevels) + this.synchronizeLevelsFromStyles(); } }, this)); @@ -202,6 +205,8 @@ define([ if (newValue) { this.stylesContainer.toggleClass('hidden', !newValue); this.levelsContainer.toggleClass('hidden', newValue); + if (this._needUpdateStyles) + this.synchronizeLevelsFromOutline(); } }, this)); @@ -226,16 +231,16 @@ define([ step: 1, width: 85, defaultUnit : "", - value: 4, + value: 3, maxValue: 9, minValue: 1, allowDecimal: false, maskExp: /[1-9]/ }); this.spnLevels.on('change', _.bind(function(field, newValue, oldValue, eOpts){ - if (this._changedProps) { - // this._changedProps.get_Ind().put_FirstLine(Common.Utils.Metric.fnRecalcToMM(field.getNumberValue())); - } + this._needUpdateStyles = true; + this.startLevel = 1; + this.endLevel = field.getNumberValue(); }, this)); this.stylesLevels = new Common.UI.DataViewStore(); @@ -275,14 +280,17 @@ define([ }, _setDefaults: function (props) { - var styles = []; + var me = this, + styles = []; _.each(window.styles.get_MergedStyles(), function (style) { - styles.push(new Common.UI.DataViewModel({ + var level = me.api.asc_GetHeadingLevel(style.get_Name()); + styles.push({ name: style.get_Name(), allowSelected: false, checked: false, - value: '' - })); + value: '', + headerLevel: (level>0) ? level+1 : -1 // -1 if is not header + }); }); if (props) { @@ -290,50 +298,178 @@ define([ this.chLinks.setValue((value !== null && value !== undefined) ? value : 'indeterminate', true); var start = props.get_OutlineStart(), - end = props.get_OutlineEnd(); + end = props.get_OutlineEnd(), + count = props.get_StylesCount(); - this.spnLevels.setValue((start<0 || end<0) ? 0 : end); - this.spnLevels.setDisabled(start>1); + this.startLevel = start; + this.endLevel = end; - var count = props.get_StylesCount(); + if ((start<0 || end<0) && count<1) { + start = 1; + end = 9; + this.spnLevels.setValue(end, true); + } + + var disable_outlines = false; for (var i=0; i0 && end>0) { + for (var i=start; i<=end; i++) { + var rec = _.findWhere(styles, {headerLevel: i}); + if (rec) { + rec.checked = true; + rec.value = i; + } + } + } + var new_start = -1, new_end = -1, empty_index = -1; + for (var i=0; i<9; i++) { + var rec = _.findWhere(styles, {headerLevel: i+1}); + if (rec) { + var headerLevel = rec.headerLevel, + level = rec.value; + if (headerLevel == level) { + if (empty_index<1) { + if (new_start<1) + new_start = level; + new_end = level; + } else { + new_start = new_end = -1; + disable_outlines = true; + break; + } + } else if (!rec.checked) { + (new_start>0) && (empty_index = i+1); + } else { + new_start = new_end = -1; + disable_outlines = true; + break; + } + } + } + + this.spnLevels.setValue(new_end>0 ? new_end : '', true); + this.spnLevels.setDisabled(disable_outlines || new_start>1 ); } this.stylesLevels.reset(styles); + if (this.spnLevels.isDisabled()) + this.radioStyles.setValue(true); // this.api.SetDrawImagePlaceContents('tableofcontents-img', props); this._changedProps = new Asc.CTableOfContentsPr(); }, + synchronizeLevelsFromOutline: function() { + var start = 1, end = this.spnLevels.getNumberValue(); + this.stylesLevels.each(function (style) { + var header = style.get('headerLevel'); + if (header>=start && header<=end) { + style.set('checked', true); + style.set('value', header); + } else { + style.set('checked', false); + style.set('value', ''); + } + }); + this._needUpdateStyles = false; + }, + + synchronizeLevelsFromStyles: function() { + var new_start = -1, new_end = -1, empty_index = -1, + disable_outlines = false; + + for (var i=0; i<9; i++) { + var rec = this.stylesLevels.findWhere({headerLevel: i+1}); + if (rec) { + var headerLevel = rec.get('headerLevel'), + level = rec.get('value'); + if (headerLevel == level) { + if (empty_index<1) { + if (new_start<1) + new_start = level; + new_end = level; + } else { + new_start = new_end = -1; + disable_outlines = true; + break; + } + } else if (!rec.get('checked')) { + (new_start>0) && (empty_index = i+1); + } else { + new_start = new_end = -1; + disable_outlines = true; + break; + } + } + } + if (new_start<0 && new_end<0) { + var rec = this.stylesLevels.findWhere({checked: true}); + if (rec) { // has checked style + disable_outlines = true; + } else { // all levels are empty + new_start = 1; + new_end = 9; + } + } + + this.startLevel = new_start; + this.endLevel = new_end; + + this.spnLevels.setValue(new_end>0 ? new_end : '', true); + this.spnLevels.setDisabled(disable_outlines || new_start>1 ); + this._needUpdateOutlineLevels = false; + }, + getSettings: function () { - var props; + var props = new Asc.CTableOfContentsPr(); + + props.put_Hyperlink(this.chLinks.getValue() == 'checked'); + props.put_ShowPageNumbers(this.chPages.getValue() == 'checked'); + if (this.chPages.getValue() == 'checked') + props.put_RightAlignTab(this.chAlign.getValue() == 'checked'); + props.put_TabLeader(this.cmbLeader.getValue()); + + props.clear_Styles(); + if (this._needUpdateOutlineLevels) { + this.synchronizeLevelsFromStyles(); + } + if (!this._needUpdateStyles) // if this._needUpdateStyles==true - fill only OutlineRange + this.stylesLevels.each(function (style) { + if (style.get('checked')) + props.add_Style(style.get('name'), style.get('value')); + }); + props.put_OutlineRange(this.startLevel, this.endLevel); return props; }, addEvents: function(listView, itemView, record) { - var input = itemView.$el.find('input'); + var input = itemView.$el.find('input'), + me = this; input.on('keypress', function(e) { var charCode = String.fromCharCode(e.which); if(!/[1-9]/.test(charCode) && !e.ctrlKey && e.keyCode !== Common.UI.Keys.DELETE && e.keyCode !== Common.UI.Keys.BACKSPACE && e.keyCode !== Common.UI.Keys.LEFT && e.keyCode !== Common.UI.Keys.RIGHT && e.keyCode !== Common.UI.Keys.HOME && e.keyCode !== Common.UI.Keys.END && e.keyCode !== Common.UI.Keys.ESC && e.keyCode !== Common.UI.Keys.INSERT && e.keyCode !== Common.UI.Keys.TAB || input.val().length>1){ - // if (e.keyCode==Common.UI.Keys.RETURN) me.trigger('changed', me, el.val()); e.preventDefault(); e.stopPropagation(); } @@ -346,6 +482,7 @@ define([ record.set('checked', !_.isEmpty(input.val())); } record.set('value', input.val()); + me._needUpdateOutlineLevels = true; }); }, From 23c0294722ef2fa53b9da2d7fab1c1db32b97754 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 19 Jan 2018 14:47:26 +0300 Subject: [PATCH 24/30] [DE] Change styles for Table of contents. --- .../main/app/view/TableOfContentsSettings.js | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index db829cfe8..2d5b35b06 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -216,15 +216,14 @@ define([ menuStyle: 'min-width: 150px;', editable: false, data: [ - { displayValue: this.txtCurrent, value: Asc.c_oAscNumberingFormat.Decimal }, - { displayValue: this.txtSimple, value: Asc.c_oAscNumberingFormat.Decimal }, - { displayValue: this.txtStandard, value: Asc.c_oAscNumberingFormat.Decimal }, - { displayValue: this.txtModern, value: Asc.c_oAscNumberingFormat.Decimal }, - { displayValue: this.txtClassic, value: Asc.c_oAscNumberingFormat.Decimal } + { displayValue: this.txtCurrent, value: Asc.c_oAscTOCStylesType.Current }, + { displayValue: this.txtSimple, value: Asc.c_oAscTOCStylesType.Simple }, + { displayValue: this.txtStandard, value: Asc.c_oAscTOCStylesType.Standard }, + { displayValue: this.txtModern, value: Asc.c_oAscTOCStylesType.Modern }, + { displayValue: this.txtClassic, value: Asc.c_oAscTOCStylesType.Classic } ] }); - // this.cmbStyles.setValue(); - // this.cmbStyles.on('selected', _.bind(this.onStylesSelect, this)); + this.cmbStyles.setValue(Asc.c_oAscTOCStylesType.Current); this.spnLevels = new Common.UI.CustomSpinner({ el: $('#tableofcontents-spin-levels'), @@ -281,21 +280,27 @@ define([ _setDefaults: function (props) { var me = this, + docStyles = this.api.asc_GetStylesArray(), styles = []; - _.each(window.styles.get_MergedStyles(), function (style) { - var level = me.api.asc_GetHeadingLevel(style.get_Name()); - styles.push({ - name: style.get_Name(), - allowSelected: false, - checked: false, - value: '', - headerLevel: (level>0) ? level+1 : -1 // -1 if is not header - }); + _.each(docStyles, function (style) { + var name = style.get_Name(), + level = me.api.asc_GetHeadingLevel(name); + if (style.get_QFormat() || level>=0) { + styles.push({ + name: name, + allowSelected: false, + checked: false, + value: '', + headerLevel: (level>=0) ? level+1 : -1 // -1 if is not header + }); + } }); if (props) { var value = props.get_Hyperlink(); this.chLinks.setValue((value !== null && value !== undefined) ? value : 'indeterminate', true); + value = props.get_StylesType(); + this.cmbStyles.setValue((value!==null) ? value : Asc.c_oAscTOCStylesType.Current); var start = props.get_OutlineStart(), end = props.get_OutlineEnd(), @@ -447,6 +452,7 @@ define([ if (this.chPages.getValue() == 'checked') props.put_RightAlignTab(this.chAlign.getValue() == 'checked'); props.put_TabLeader(this.cmbLeader.getValue()); + props.put_StylesType(this.cmbStyles.getValue()); props.clear_Styles(); if (this._needUpdateOutlineLevels) { @@ -477,11 +483,11 @@ define([ }); input.on('input', function(e) { // console.log(input.val()); - var newval = !_.isEmpty(input.val()); - if (record.get('checked') !== newval) { - record.set('checked', !_.isEmpty(input.val())); + var isEmpty = _.isEmpty(input.val()); + if (record.get('checked') !== !isEmpty) { + record.set('checked', !isEmpty); } - record.set('value', input.val()); + record.set('value', (isEmpty) ? '' : parseInt(input.val())); me._needUpdateOutlineLevels = true; }); }, From c154b154e9f174ab98c6526ab7d63407f8140ea5 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 19 Jan 2018 15:20:45 +0300 Subject: [PATCH 25/30] [DE] Change style for existing table in contents from toolbar presets. --- .../main/app/controller/Links.js | 22 ++++++++++++++----- .../main/app/view/TableOfContentsSettings.js | 5 +++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index 71173365b..db5780a80 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -204,20 +204,30 @@ define([ onTableContents: function(type){ switch (type) { case 0: - var props = new Asc.CTableOfContentsPr(); + var props = this.api.asc_GetTableOfContentsPr(), + hasTable = !!props; + if (!props) { + props = new Asc.CTableOfContentsPr(); + props.put_OutlineRange(1, 9); + } props.put_Hyperlink(true); props.put_ShowPageNumbers(true); props.put_RightAlignTab(true); props.put_TabLeader( Asc.c_oAscTabLeader.Dot); - props.put_OutlineRange(1, 9); - this.api.asc_AddTableOfContents(props); break; + (hasTable) ? this.api.asc_SetTableOfContentsPr(props) : this.api.asc_AddTableOfContents(props); + break; case 1: - var props = new Asc.CTableOfContentsPr(); + var props = this.api.asc_GetTableOfContentsPr(), + hasTable = !!props; + if (!props) { + props = new Asc.CTableOfContentsPr(); + props.put_OutlineRange(1, 9); + } props.put_Hyperlink(true); props.put_ShowPageNumbers(false); props.put_TabLeader( Asc.c_oAscTabLeader.None); - props.put_OutlineRange(1, 9); - this.api.asc_AddTableOfContents(props); break; + (hasTable) ? this.api.asc_SetTableOfContentsPr(props) : this.api.asc_AddTableOfContents(props); + break; case 'settings': var props = this.api.asc_GetTableOfContentsPr(), me = this; diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index 2d5b35b06..bcd738336 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -449,9 +449,10 @@ define([ props.put_Hyperlink(this.chLinks.getValue() == 'checked'); props.put_ShowPageNumbers(this.chPages.getValue() == 'checked'); - if (this.chPages.getValue() == 'checked') + if (this.chPages.getValue() == 'checked') { props.put_RightAlignTab(this.chAlign.getValue() == 'checked'); - props.put_TabLeader(this.cmbLeader.getValue()); + props.put_TabLeader(this.cmbLeader.getValue()); + } props.put_StylesType(this.cmbStyles.getValue()); props.clear_Styles(); From efa339a12567fa0655c33f7ba60165371e02911a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 19 Jan 2018 15:53:04 +0300 Subject: [PATCH 26/30] [DE] Update table of contents. --- apps/documenteditor/main/app/controller/Links.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index db5780a80..2b9716d2a 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -250,10 +250,7 @@ define([ }, onTableContentsUpdate: function(type){ - if (type == 'pages') - this.api.asc_updateTableOfContents(); - else - this.api.asc_updateaddTableOfContents(); + this.api.asc_UpdateTableOfContents(type == 'pages'); }, onNotesClick: function(type) { From 69ee24f112c4b8e4e4d69e9827a0366c6714a2b6 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 19 Jan 2018 16:41:40 +0300 Subject: [PATCH 27/30] [DE] Fix adding table of contents. --- apps/documenteditor/main/app/controller/Links.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index 2b9716d2a..1310227ac 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -214,7 +214,7 @@ define([ props.put_ShowPageNumbers(true); props.put_RightAlignTab(true); props.put_TabLeader( Asc.c_oAscTabLeader.Dot); - (hasTable) ? this.api.asc_SetTableOfContentsPr(props) : this.api.asc_AddTableOfContents(props); + (hasTable) ? this.api.asc_SetTableOfContentsPr(props) : this.api.asc_AddTableOfContents(null, props); break; case 1: var props = this.api.asc_GetTableOfContentsPr(), @@ -226,7 +226,7 @@ define([ props.put_Hyperlink(true); props.put_ShowPageNumbers(false); props.put_TabLeader( Asc.c_oAscTabLeader.None); - (hasTable) ? this.api.asc_SetTableOfContentsPr(props) : this.api.asc_AddTableOfContents(props); + (hasTable) ? this.api.asc_SetTableOfContentsPr(props) : this.api.asc_AddTableOfContents(null, props); break; case 'settings': var props = this.api.asc_GetTableOfContentsPr(), @@ -236,7 +236,7 @@ define([ props: props, handler: function(result, value) { if (result == 'ok') { - (props) ? me.api.asc_SetTableOfContentsPr(value) : me.api.asc_AddTableOfContents(value); + (props) ? me.api.asc_SetTableOfContentsPr(value) : me.api.asc_AddTableOfContents(null, value); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); } From ca1bc79bb803214bae4e88040c682716924089da Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 22 Jan 2018 11:42:46 +0300 Subject: [PATCH 28/30] [DE] Update preview for table of contents. --- .../main/app/view/TableOfContentsSettings.js | 91 +++++++++++++++++-- 1 file changed, 85 insertions(+), 6 deletions(-) diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index bcd738336..472d9302c 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -133,6 +133,8 @@ define([ this.props = options.props; this.startLevel = 1; this.endLevel = 3; + this._noApply = true; + this._originalProps = null; Common.Views.AdvancedSettingsWindow.prototype.initialize.call(this, this.options); }, @@ -147,9 +149,17 @@ define([ value: 'checked' }); this.chPages.on('change', _.bind(function(field, newValue, oldValue, eOpts){ - this.chAlign.setDisabled(field.getValue()!=='checked'); - this.cmbLeader.setDisabled(field.getValue()!=='checked'); - if (this._changedProps) { + var checked = (field.getValue()=='checked'); + this.chAlign.setDisabled(!checked); + this.cmbLeader.setDisabled(!checked); + if (this.api && !this._noApply) { + var properties = (this._originalProps) ? this._originalProps : new Asc.CTableOfContentsPr(); + properties.put_ShowPageNumbers(checked); + if (checked) { + properties.put_RightAlignTab(this.chAlign.getValue() == 'checked'); + properties.put_TabLeader(this.cmbLeader.getValue()); + } + // this.api.SetDrawImagePlaceContents('tableofcontents-img', properties); } }, this)); @@ -158,6 +168,18 @@ define([ labelText: this.strAlign, value: 'checked' }); + this.chAlign.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + var checked = (field.getValue()=='checked'); + this.cmbLeader.setDisabled(!checked); + if (this.api && !this._noApply) { + var properties = (this._originalProps) ? this._originalProps : new Asc.CTableOfContentsPr(); + properties.put_RightAlignTab(checked); + if (checked) { + properties.put_TabLeader(this.cmbLeader.getValue()); + } + // this.api.SetDrawImagePlaceContents('tableofcontents-img', properties); + } + }, this)); this.cmbLeader = new Common.UI.ComboBox({ el : $('#tableofcontents-combo-leader'), @@ -173,12 +195,25 @@ define([ ] }); this.cmbLeader.setValue(Asc.c_oAscTabLeader.Dot); + this.cmbLeader.on('selected', _.bind(function(combo, record) { + if (this.api && !this._noApply) { + var properties = (this._originalProps) ? this._originalProps : new Asc.CTableOfContentsPr(); + properties.put_TabLeader(record.value); + // this.api.SetDrawImagePlaceContents('tableofcontents-img', properties); + } + }, this)); this.chLinks = new Common.UI.CheckBox({ el: $('#tableofcontents-chb-links'), - labelText: this.strLinks + labelText: this.strLinks, + value: 'checked' }); this.chLinks.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + if (this.api && !this._noApply) { + var properties = (this._originalProps) ? this._originalProps : new Asc.CTableOfContentsPr(); + properties.put_Hyperlink(field.getValue()=='checked'); + // this.api.SetDrawImagePlaceContents('tableofcontents-img', properties); + } }, this)); this.radioLevels = new Common.UI.RadioBox({ @@ -224,6 +259,13 @@ define([ ] }); this.cmbStyles.setValue(Asc.c_oAscTOCStylesType.Current); + this.cmbStyles.on('selected', _.bind(function(combo, record) { + if (this.api && !this._noApply) { + var properties = (this._originalProps) ? this._originalProps : new Asc.CTableOfContentsPr(); + properties.put_StylesType(record.value); + // this.api.SetDrawImagePlaceContents('tableofcontents-img', properties); + } + }, this)); this.spnLevels = new Common.UI.CustomSpinner({ el: $('#tableofcontents-spin-levels'), @@ -240,6 +282,13 @@ define([ this._needUpdateStyles = true; this.startLevel = 1; this.endLevel = field.getNumberValue(); + + if (this.api && !this._noApply) { + var properties = (this._originalProps) ? this._originalProps : new Asc.CTableOfContentsPr(); + properties.clear_Styles(); + properties.put_OutlineRange(this.startLevel, this.endLevel); + // this.api.SetDrawImagePlaceContents('tableofcontents-img', properties); + } }, this)); this.stylesLevels = new Common.UI.DataViewStore(); @@ -279,6 +328,8 @@ define([ }, _setDefaults: function (props) { + this._noApply = true; + var me = this, docStyles = this.api.asc_GetStylesArray(), styles = []; @@ -378,9 +429,22 @@ define([ this.stylesLevels.reset(styles); if (this.spnLevels.isDisabled()) this.radioStyles.setValue(true); - // this.api.SetDrawImagePlaceContents('tableofcontents-img', props); - this._changedProps = new Asc.CTableOfContentsPr(); + // Show Pages is always true when window is opened + this._originalProps = (props) ? props : new Asc.CTableOfContentsPr(); + if (!props) { + this._originalProps.put_OutlineRange(this.startLevel, this.endLevel); + this._originalProps.put_Hyperlink(this.chLinks.getValue() == 'checked'); + } + this._originalProps.put_ShowPageNumbers(this.chPages.getValue() == 'checked'); + if (this.chPages.getValue() == 'checked') { + this._originalProps.put_RightAlignTab(this.chAlign.getValue() == 'checked'); + this._originalProps.put_TabLeader(this.cmbLeader.getValue()); + } + + // this.api.SetDrawImagePlaceContents('tableofcontents-img', this._originalProps); + + this._noApply = false; }, synchronizeLevelsFromOutline: function() { @@ -490,6 +554,21 @@ define([ } record.set('value', (isEmpty) ? '' : parseInt(input.val())); me._needUpdateOutlineLevels = true; + + if (me.api && !me._noApply) { + var properties = (me._originalProps) ? me._originalProps : new Asc.CTableOfContentsPr(); + properties.clear_Styles(); + me.stylesLevels.each(function (style) { + if (style.get('checked')) + properties.add_Style(style.get('name'), style.get('value')); + }); + if (properties.get_StylesCount()>0) + properties.put_OutlineRange(-1, -1); + else + properties.put_OutlineRange(1, 9); + // this.api.SetDrawImagePlaceContents('tableofcontents-img', properties); + } + }); }, From 7c70133e2aa7048d4240313b4af706894cba2608 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 23 Jan 2018 13:21:27 +0300 Subject: [PATCH 29/30] [DE] Debug expand/collapse for table of contents. --- apps/common/main/lib/component/TreeView.js | 12 ++++++++---- .../main/app/controller/Navigation.js | 16 ++++++++++++++-- apps/documenteditor/main/app/view/Navigation.js | 1 + 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/apps/common/main/lib/component/TreeView.js b/apps/common/main/lib/component/TreeView.js index 12d383107..eb382a14b 100644 --- a/apps/common/main/lib/component/TreeView.js +++ b/apps/common/main/lib/component/TreeView.js @@ -52,6 +52,7 @@ define([ name: '', isNotHeader: false, hasSubItems: false, + hasParent: false, isEmptyItem: false, isExpanded: true, isVisible: true, @@ -113,8 +114,10 @@ define([ collapseAll: function() { for (var i=0; iprev_level && i>0) arr[i-1].set('hasSubItems', true); + if (header_level<0 || level<=header_level) { + if (i>0 || first_header) + header_level = level; + hasParent = false; + } arr.push(new Common.UI.TreeViewModel({ name : this._navigationObject.get_Text(i), level: level, index: i, + hasParent: hasParent, isEmptyItem: this._navigationObject.isEmptyItem(i) })); prev_level = level; } - if (count>0 && this._navigationObject.isFirstItemNotHeader()) { + if (count>0 && !first_header) { arr[0].set('hasSubItems', false); arr[0].set('isNotHeader', true); arr[0].set('name', this.txtBeginning); @@ -176,6 +185,9 @@ define([ top: showPoint[1] }); menu.show(); + _.delay(function() { + menu.cmpEl.focus(); + }, 10); } }, diff --git a/apps/documenteditor/main/app/view/Navigation.js b/apps/documenteditor/main/app/view/Navigation.js index bbaf7153c..a6a14f123 100644 --- a/apps/documenteditor/main/app/view/Navigation.js +++ b/apps/documenteditor/main/app/view/Navigation.js @@ -119,6 +119,7 @@ define([ caption : this.txtExpandToLevel, menu: new Common.UI.Menu({ menuAlign: 'tl-tr', + style: 'min-width: 60px;', items: [{ caption : '1', value: 1 }, { caption : '2', value: 2 }, { caption : '3', value: 3 }, { caption : '4', value: 4 }, { caption : '5', value: 5 }, { caption : '6', value: 6 }, { caption : '7', value: 7 }, { caption : '8', value: 8 }, { caption : '9', value: 9 } From 1e99bee8898b6b9ca01c4f38802b227477e8853c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 23 Jan 2018 14:35:35 +0300 Subject: [PATCH 30/30] [DE] Table of content settings: scroll list of styles to the first header. --- .../main/app/view/TableOfContentsSettings.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/view/TableOfContentsSettings.js b/apps/documenteditor/main/app/view/TableOfContentsSettings.js index 472d9302c..ca0ab8aca 100644 --- a/apps/documenteditor/main/app/view/TableOfContentsSettings.js +++ b/apps/documenteditor/main/app/view/TableOfContentsSettings.js @@ -242,6 +242,12 @@ define([ this.levelsContainer.toggleClass('hidden', newValue); if (this._needUpdateStyles) this.synchronizeLevelsFromOutline(); + this.stylesList.scroller.update({alwaysVisibleY: true}); + setTimeout(function(){ + var rec = me.stylesLevels.findWhere({checked: true}); + if (rec) + me.stylesList.scrollToRecord(rec); + }, 10); } }, this)); @@ -427,8 +433,13 @@ define([ this.spnLevels.setDisabled(disable_outlines || new_start>1 ); } this.stylesLevels.reset(styles); - if (this.spnLevels.isDisabled()) + if (this.spnLevels.isDisabled()) { this.radioStyles.setValue(true); + this.stylesList.scroller.update({alwaysVisibleY: true}); + var rec = this.stylesLevels.findWhere({checked: true}); + if (rec) + this.stylesList.scrollToRecord(rec); + } // Show Pages is always true when window is opened this._originalProps = (props) ? props : new Asc.CTableOfContentsPr();