diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index 02881cd2a3..d16bbe35f6 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -72,7 +72,8 @@ define([ 'spreadsheeteditor/main/app/view/SetValueDialog', 'spreadsheeteditor/main/app/view/AutoFilterDialog', 'spreadsheeteditor/main/app/view/SpecialPasteDialog', - 'spreadsheeteditor/main/app/view/SlicerSettingsAdvanced' + 'spreadsheeteditor/main/app/view/SlicerSettingsAdvanced', + 'spreadsheeteditor/main/app/view/PivotGroupDialog' ], function () { 'use strict'; @@ -196,6 +197,8 @@ define([ view.pmiSortCells.menu.on('item:click', _.bind(me.onSortCells, me)); view.pmiFilterCells.menu.on('item:click', _.bind(me.onFilterCells, me)); view.pmiReapply.on('click', _.bind(me.onReapply, me)); + view.mnuGroupPivot.on('click', _.bind(me.onGroupPivot, me)); + view.mnuUnGroupPivot.on('click', _.bind(me.onGroupPivot, me)); view.pmiClear.menu.on('item:click', _.bind(me.onClear, me)); view.pmiSelectTable.menu.on('item:click', _.bind(me.onSelectTable, me)); view.pmiInsertTable.menu.on('item:click', _.bind(me.onInsertTable, me)); @@ -323,6 +326,7 @@ define([ this.api.asc_registerCallback('asc_ChangeCropState', _.bind(this.onChangeCropState, this)); this.api.asc_registerCallback('asc_onInputMessage', _.bind(this.onInputMessage, this)); this.api.asc_registerCallback('asc_onTableTotalMenu', _.bind(this.onTableTotalMenu, this)); + this.api.asc_registerCallback('asc_onShowPivotGroupDialog', _.bind(this.onShowPivotGroupDialog, this)); } return this; }, @@ -474,6 +478,27 @@ define([ this.api.asc_reapplyAutoFilter(this.documentHolder.ssMenu.formatTableName); }, + onGroupPivot: function(item) { + item.value=='grouping' ? this.api.asc_groupPivot() : this.api.asc_ungroupPivot(); + }, + + onShowPivotGroupDialog: function(rangePr, dateTypes, defRangePr) { + var win, props, + me = this; + win = new SSE.Views.PivotGroupDialog({ + date: !!dateTypes, + handler: function(dlg, result) { + if (result == 'ok') { + props = dlg.getSettings(); + me.api.asc_groupPivot(props[0], props[1]); + Common.NotificationCenter.trigger('edit:complete', me.documentHolder); + } + } + }); + win.show(); + win.setSettings(rangePr, dateTypes, defRangePr); + }, + onClear: function(menu, item) { if (this.api) { this.api.asc_emptyCells(item.value); @@ -1657,6 +1682,7 @@ define([ seltype = cellinfo.asc_getSelectionType(), isCellLocked = cellinfo.asc_getLocked(), isTableLocked = cellinfo.asc_getLockedTable()===true, + isPivotLocked = cellinfo.asc_getLockedPivotTable()===true, isObjLocked = false, commentsController = this.getApplication().getController('Common.Controllers.Comments'), internaleditor = this.permissions.isEditMailMerge || this.permissions.isEditDiagram, @@ -1861,7 +1887,8 @@ define([ formatTableInfo = cellinfo.asc_getFormatTableInfo(), isinsparkline = (cellinfo.asc_getSparklineInfo()!==null), isintable = (formatTableInfo !== null), - ismultiselect = cellinfo.asc_getMultiselect(); + ismultiselect = cellinfo.asc_getMultiselect(), + inPivot = !!cellinfo.asc_getPivotTableInfo(); documentHolder.ssMenu.formatTableName = (isintable) ? formatTableInfo.asc_getTableName() : null; documentHolder.ssMenu.cellColor = xfs.asc_getFillColor(); documentHolder.ssMenu.fontColor = xfs.asc_getFontColor(); @@ -1869,20 +1896,22 @@ define([ documentHolder.pmiInsertEntire.setVisible(isrowmenu||iscolmenu); documentHolder.pmiInsertEntire.setCaption((isrowmenu) ? this.textInsertTop : this.textInsertLeft); documentHolder.pmiDeleteEntire.setVisible(isrowmenu||iscolmenu); - documentHolder.pmiInsertCells.setVisible(iscellmenu && !iscelledit && !isintable); - documentHolder.pmiDeleteCells.setVisible(iscellmenu && !iscelledit && !isintable); + documentHolder.pmiInsertCells.setVisible(iscellmenu && !iscelledit && !isintable && !inPivot); + documentHolder.pmiDeleteCells.setVisible(iscellmenu && !iscelledit && !isintable && !inPivot); documentHolder.pmiSelectTable.setVisible(iscellmenu && !iscelledit && isintable); documentHolder.pmiInsertTable.setVisible(iscellmenu && !iscelledit && isintable); documentHolder.pmiDeleteTable.setVisible(iscellmenu && !iscelledit && isintable); documentHolder.pmiSparklines.setVisible(isinsparkline); - documentHolder.pmiSortCells.setVisible((iscellmenu||isallmenu) && !iscelledit); + documentHolder.pmiSortCells.setVisible((iscellmenu||isallmenu) && !iscelledit && !inPivot); documentHolder.pmiSortCells.menu.items[2].setVisible(!internaleditor); documentHolder.pmiSortCells.menu.items[3].setVisible(!internaleditor); documentHolder.pmiSortCells.menu.items[4].setVisible(!internaleditor); - documentHolder.pmiFilterCells.setVisible(iscellmenu && !iscelledit && !internaleditor); - documentHolder.pmiReapply.setVisible((iscellmenu||isallmenu) && !iscelledit && !internaleditor); + documentHolder.pmiFilterCells.setVisible(iscellmenu && !iscelledit && !internaleditor && !inPivot); + documentHolder.pmiReapply.setVisible((iscellmenu||isallmenu) && !iscelledit && !internaleditor && !inPivot); + documentHolder.mnuGroupPivot.setVisible(iscellmenu && !iscelledit && !internaleditor && inPivot); + documentHolder.mnuUnGroupPivot.setVisible(iscellmenu && !iscelledit && !internaleditor && inPivot); documentHolder.ssMenu.items[12].setVisible((iscellmenu||isallmenu||isinsparkline) && !iscelledit); - documentHolder.pmiInsFunction.setVisible(iscellmenu && !iscelledit); + documentHolder.pmiInsFunction.setVisible(iscellmenu && !iscelledit && !inPivot); documentHolder.pmiAddNamedRange.setVisible(iscellmenu && !iscelledit && !internaleditor); if (isintable) { @@ -1898,8 +1927,8 @@ define([ } var hyperinfo = cellinfo.asc_getHyperlink(); - documentHolder.menuHyperlink.setVisible(iscellmenu && hyperinfo && !iscelledit && !ismultiselect && !internaleditor); - documentHolder.menuAddHyperlink.setVisible(iscellmenu && !hyperinfo && !iscelledit && !ismultiselect && !internaleditor); + documentHolder.menuHyperlink.setVisible(iscellmenu && hyperinfo && !iscelledit && !ismultiselect && !internaleditor && !inPivot); + documentHolder.menuAddHyperlink.setVisible(iscellmenu && !hyperinfo && !iscelledit && !ismultiselect && !internaleditor && !inPivot); documentHolder.pmiRowHeight.setVisible(isrowmenu||isallmenu); documentHolder.pmiColumnWidth.setVisible(iscolmenu||isallmenu); @@ -1910,7 +1939,7 @@ define([ /** coauthoring begin **/ var count = cellinfo.asc_getComments().length; - documentHolder.ssMenu.items[17].setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && count < 1); + documentHolder.ssMenu.items[19].setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && count < 1); documentHolder.pmiAddComment.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && count < 1); /** coauthoring end **/ documentHolder.pmiCellMenuSeparator.setVisible(iscellmenu && !iscelledit || isrowmenu || iscolmenu || isallmenu); @@ -1936,8 +1965,6 @@ define([ documentHolder.pmiInsertCells.menu.items[1].setDisabled(isApplyAutoFilter); documentHolder.pmiDeleteCells.menu.items[1].setDisabled(isApplyAutoFilter); - var inPivot = !!cellinfo.asc_getPivotTableInfo(); - documentHolder.pmiEntriesList.setVisible(!iscelledit && !inPivot); documentHolder.pmiNumFormat.setVisible(!iscelledit); @@ -1965,6 +1992,12 @@ define([ documentHolder.pmiInsFunction.setDisabled(isCellLocked || inPivot); documentHolder.pmiFreezePanes.setDisabled(this.api.asc_isWorksheetLockedOrDeleted(this.api.asc_getActiveWorksheetIndex())); + if (inPivot) { + var canGroup = this.api.asc_canGroupPivot(); + documentHolder.mnuGroupPivot.setDisabled(isPivotLocked || !canGroup); + documentHolder.mnuUnGroupPivot.setDisabled(isPivotLocked || !canGroup); + } + if (showMenu) this.showPopupMenu(documentHolder.ssMenu, {}, event); } else if (this.permissions.isEditDiagram && seltype == Asc.c_oAscSelectionType.RangeChartText) { if (!showMenu && !documentHolder.textInShapeMenu.isVisible()) return; diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index a3920b07ee..1e5c0283ab 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -1619,6 +1619,10 @@ define([ config.msg = this.errorSetPassword; break; + case Asc.c_oAscError.ID.PivotGroup : + config.msg = this.errorPivotGroup; + break; + default: config.msg = (typeof id == 'string') ? id : this.errorDefaultMessage.replace('%1', id); break; @@ -2832,7 +2836,8 @@ define([ txtDays: 'Days', txtMonths: 'Months', txtQuarters: 'Quarters', - txtYears: 'Years' + txtYears: 'Years', + errorPivotGroup: 'Cannot group that selection.' } })(), SSE.Controllers.Main || {})) }); diff --git a/apps/spreadsheeteditor/main/app/view/DocumentHolder.js b/apps/spreadsheeteditor/main/app/view/DocumentHolder.js index f0635f9a4d..9fa867b2b4 100644 --- a/apps/spreadsheeteditor/main/app/view/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/view/DocumentHolder.js @@ -338,6 +338,16 @@ define([ caption : me.txtReapply }); + me.mnuGroupPivot = new Common.UI.MenuItem({ + caption : this.txtGroup, + value : 'grouping' + }); + + me.mnuUnGroupPivot = new Common.UI.MenuItem({ + caption : this.txtUngroup, + value : 'ungrouping' + }); + me.pmiInsFunction = new Common.UI.MenuItem({ iconCls: 'menu__icon btn-function', caption : me.txtFormula @@ -560,6 +570,8 @@ define([ me.pmiSortCells, me.pmiFilterCells, me.pmiReapply, + me.mnuGroupPivot, + me.mnuUnGroupPivot, {caption: '--'}, me.pmiAddComment, me.pmiCellMenuSeparator, diff --git a/apps/spreadsheeteditor/main/app/view/PivotGroupDialog.js b/apps/spreadsheeteditor/main/app/view/PivotGroupDialog.js new file mode 100644 index 0000000000..83fba93dde --- /dev/null +++ b/apps/spreadsheeteditor/main/app/view/PivotGroupDialog.js @@ -0,0 +1,375 @@ +/* + * + * (c) Copyright Ascensio System SIA 2010-2021 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +/** + * PivotGroupDialog.js + * + * Created by Julia Radzhabova 04.03.2021 + * Copyright (c) 2021 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/component/Window' +], function () { + 'use strict'; + + SSE.Views.PivotGroupDialog = Common.UI.Window.extend(_.extend({ + options: { + width: 250, + header: true, + cls: 'modal-dlg', + buttons: ['ok', 'cancel'] + }, + + initialize : function (options) { + var t = this, + height = options.date ? 335 : 195; + + _.extend(this.options, { + title: this.txtTitle + }, options || {}); + + this.template = options.template || [ + '
| ', + '', + ' | ', + '|
| ', + '', + ' | ', + '', + '', + ' | ', + '
| ', + '', + ' | ', + '', + '', + ' | ', + '
| ', + '', + ' | ', + '', + '', + ' | ', + '
| ', + '', + ' | ', + '|
| ', + '', + ' | ', + '|
| ', + '', + ' | ', + '', + '', + ' | ', + '