diff --git a/apps/spreadsheeteditor/main/app/view/FormatRulesEditDlg.js b/apps/spreadsheeteditor/main/app/view/FormatRulesEditDlg.js new file mode 100644 index 000000000..258efa9f6 --- /dev/null +++ b/apps/spreadsheeteditor/main/app/view/FormatRulesEditDlg.js @@ -0,0 +1,597 @@ +/* + * + * (c) Copyright Ascensio System SIA 2010-2020 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * +*/ +/** + * + * FormatRulesEditDlg.js + * + * Created by Julia.Radzhabova on 15.04.20 + * Copyright (c) 2020 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/view/AdvancedSettingsWindow', + 'common/main/lib/component/ComboBox', + 'common/main/lib/component/InputField' +], function () { + 'use strict'; + + SSE.Views = SSE.Views || {}; + + SSE.Views.FormatRulesEditDlg = Common.Views.AdvancedSettingsWindow.extend(_.extend({ + options: { + alias: 'FormatRulesEditDlg', + contentWidth: 480, + height: 350 + }, + + initialize: function (options) { + var me = this; + + _.extend(this.options, { + title: this.txtTitleNew, + template: [ + '
', + '
', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '
', + '', + '
', + '
', + '', + '
', + '
', + '
', + '
', + '
', + '
', + '', + '
', + '
', + '
','
', + '
','
', + '
','
', + '
','
', + '
', + '
', + '
', + '
', + '
', + '
' + ].join('') + }, options); + + this.api = options.api; + this.handler = options.handler; + this.isEdit = options.isEdit || false; + 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; + + var rules = [ + { + name: this.textValue, + type: Asc.c_oAscCFType.cellIs, + rules: [ + { name: this.textGreater}, + { name: this.textGreaterEq}, + { name: this.textLess}, + { name: this.textLessEq}, + { name: this.textEqual}, + { name: this.textNotEqual}, + { name: this.textBetween}, + { name: this.textNotBetween} + ] + }, + { + name: this.textRanked, + type: Asc.c_oAscCFType.top10, + rules: [ + { name: this.textTop10}, + { name: this.textTop10Per}, + { name: this.textBottom10}, + { name: this.textBottom10Per} + ] + }, + { + name: 'Average', + type: Asc.c_oAscCFType.aboveAverage, + rules: [ + { name: 'Above'}, + { name: 'Below'}, + { name: 'Equal or above'}, + { name: 'Equal or below'}, + { name: '1 std dev above'}, + { name: '1 std dev below'}, + { name: '2 std dev above'}, + { name: '2 std dev below'}, + { name: '3 std dev above'}, + { name: '3 std dev below'} + ] + }, + { + name: 'Text', + type: Asc.c_oAscCFType.containsText, + rules: [ + { name: 'Contains', type: Asc.c_oAscCFType.containsText }, + { name: 'Does not contain', type: Asc.c_oAscCFType.notContainsText }, + { name: 'Begins with', type: Asc.c_oAscCFType.beginsWith }, + { name: 'Ends with', type: Asc.c_oAscCFType.endsWith } + ] + }, + { + name: 'Date', + type: Asc.c_oAscCFType.timePeriod, + rules: [ + { name: 'Yesterday'}, + { name: 'Today'}, + { name: 'Tomorrow'}, + { name: 'In the last 7 days'}, + { name: 'Last week'}, + { name: 'This week'}, + { name: 'Next week'}, + { name: 'Last month'}, + { name: 'This month'}, + { name: 'Next month'} + ] + }, + { + name: 'Blank/Error', + type: Asc.c_oAscCFType.containsBlanks, + rules: [ + { name: 'Contains blanks', type: Asc.c_oAscCFType.containsBlanks }, + { name: 'Does not contain blanks', type: Asc.c_oAscCFType.notContainsBlanks }, + { name: 'Contains errors', type: Asc.c_oAscCFType.containsErrors }, + { name: 'Does not contain errors', type: Asc.c_oAscCFType.notContainsErrors } + ] + }, + { + name: 'Duplicate/Unique', + type: Asc.c_oAscCFType.duplicateValues, + rules: [ + { name: 'Duplicate', type: Asc.c_oAscCFType.duplicateValues }, + { name: 'Unique', type: Asc.c_oAscCFType.uniqueValues } + ] + }, + { + name: '2 Color scale', + type: Asc.c_oAscCFType.colorScale, + num: 2 + }, + { + name: '3 Color scale', + type: Asc.c_oAscCFType.colorScale, + num: 3 + }, + { + name: 'Data bar', + type: Asc.c_oAscCFType.dataBar + }, + { + name: 'Icon sets', + type: Asc.c_oAscCFType.iconSet + }, + { + name: 'Formula', + type: Asc.c_oAscCFType.expression + } + ]; + var arrrules = [], + cmbData = []; + _.each(rules, function(rule, index){ + var arr = []; + + rule.rules && _.each(rule.rules, function(item, idx){ + arr.push({ + name : item.name, + type : (item.type!==undefined) ? item.type : rule.type, + allowSelected : true, + selected: false + }); + }); + var store = new Backbone.Collection(arr); + arrrules.push({ + name : rule.name, + type : rule.type, + rules : store, + num : rule.num, + index : index + }); + cmbData.push({value: index, displayValue: rule.name}); + }); + this.ruleStore = new Backbone.Collection(arrrules); + + this.txtScope = new Common.UI.InputFieldBtn({ + el : $('#format-rules-edit-txt-scope'), + name : 'range', + style : 'width: 150px;', + allowBlank : true, + btnHint : this.textSelectData, + validateOnChange: false + }); + this.txtScope.on('button:click', _.bind(this.onSelectData, this)); + + this.cmbCategory = new Common.UI.ComboBox({ + el : $('#format-rules-edit-combo-category'), + style : 'width: 150px;', + menuStyle : 'min-width: 100%;max-height: 211px;', + editable : false, + cls : 'input-group-nr', + data : cmbData + }).on('selected', function(combo, record) { + me.refreshRules(record.value); + }); + + this.cmbRule = new Common.UI.ComboBox({ + el : $('#format-rules-edit-combo-rule'), + style : 'width: 150px;', + menuStyle : 'min-width: 100%;max-height: 211px;', + editable : false, + cls : 'input-group-nr', + data : [] + }); + // this.cmbRule.on('selected', _.bind(this.onRuleSelect, this)); + + this.txtRange1 = new Common.UI.InputFieldBtn({ + el : $('#format-rules-edit-txt-r1'), + name : 'range', + style : 'width: 150px;', + allowBlank : true, + btnHint : this.textSelectData, + validateOnChange: false + }); + this.txtRange1.on('button:click', _.bind(this.onSelectData, this)); + + this.txtRange2 = new Common.UI.InputFieldBtn({ + el : $('#format-rules-edit-txt-r2'), + name : 'range', + style : 'width: 150px;', + allowBlank : true, + btnHint : this.textSelectData, + validateOnChange: false + }); + this.txtRange2.on('button:click', _.bind(this.onSelectData, this)); + + // Format + var color_data = [ + { value: 'ffeb9c', displayValue: 'absdef', color: '#ffeb9c', displayColor: '9c6500' }, + { value: 'ffc7ce', displayValue: 'absdef', color: '#ffc7ce', displayColor: 'b32e35' }, + { value: 'c6efce', displayValue: 'absdef', color: '#c6efce', displayColor: '2e8230' }, + { value: 'ffcc99', displayValue: 'absdef', color: '#ffcc99', displayColor: '56507b' }, + { value: -1, displayValue: this.textCustom, color: null } + ]; + this.cmbFormats = new Common.UI.ComboBoxColor({ + el : $('#format-rules-format-preset'), + editable : false, + style : 'width: 150px;', + menuStyle : 'min-width: 100%;max-height: 211px;', + data : color_data + }).on('selected', function(combo, record) { + // record.color; + }); + this.cmbFormats.setValue(color_data[0].value); + // this.cmbFormats.on('selected', _.bind(this.onFormatsSelect, this)); + + this.btnBold = new Common.UI.Button({ + cls: 'btn-toolbar', + iconCls: 'toolbar__icon btn-bold', + enableToggle: true, + hint: this.textBold + }); + this.btnBold.render($('#format-rules-bold')) ; + // this.btnBold.on('click', _.bind(this.onBoldClick, this)); + + this.btnItalic = new Common.UI.Button({ + cls: 'btn-toolbar', + iconCls: 'toolbar__icon btn-italic', + enableToggle: true, + hint: this.textItalic + }); + this.btnItalic.render($('#format-rules-italic')) ; + // this.btnItalic.on('click', _.bind(this.onItalicClick, this)); + + this.btnUnderline = new Common.UI.Button({ + cls : 'btn-toolbar', + iconCls : 'toolbar__icon btn-underline', + enableToggle: true, + hint: this.textUnderline + }); + this.btnUnderline.render($('#format-rules-underline')) ; + // this.btnUnderline.on('click', _.bind(this.onUnderlineClick, this)); + + this.btnStrikeout = new Common.UI.Button({ + cls: 'btn-toolbar', + iconCls: 'toolbar__icon btn-strikeout', + enableToggle: true, + hint: this.textStrikeout + }); + this.btnStrikeout.render($('#format-rules-strikeout')) ; + // this.btnStrikeout.on('click',_.bind(this.onStrikeoutClick, this)); + + this.btnSuperscript = new Common.UI.Button({ + cls: 'btn-toolbar', + iconCls: 'toolbar__icon btn-superscript', + enableToggle: true, + toggleGroup: 'superscriptFRGroup', + hint: this.textSuperscript + }); + this.btnSuperscript.render($('#format-rules-superscript')) ; + // this.btnSuperscript.on('click', _.bind(this.onSuperscriptClick, this)); + + this.btnSubscript = new Common.UI.Button({ + cls: 'btn-toolbar', + iconCls: 'toolbar__icon btn-subscript', + enableToggle: true, + toggleGroup: 'superscriptFRGroup', + hint: this.textSubscript + }); + this.btnSubscript.render($('#format-rules-subscript')) ; + // this.btnSubscript.on('click', _.bind(this.onSubscriptClick, this)); + + var initNewColor = function(btn, picker_el) { + if (btn && btn.cmpEl) { + btn.currentColor = '#000000'; + var colorVal = $('
'); + $('button:first-child', btn.cmpEl).append(colorVal); + colorVal.css('background-color', btn.currentColor); + var picker = new Common.UI.ThemeColorPalette({ + el: $(picker_el) + }); + picker.currentColor = btn.currentColor; + } + btn.menu.cmpEl.on('click', picker_el+'-new', _.bind(function() { + picker.addNewColor((typeof(btn.color) == 'object') ? btn.color.color : btn.color); + }, me)); + // picker.on('select', _.bind(me.onColorSelect, me, btn)); + return picker; + }; + + this.btnTextColor = new Common.UI.Button({ + cls : 'btn-toolbar', + iconCls : 'toolbar__icon btn-fontcolor', + hint : this.textColor, + split : true, + menu : new Common.UI.Menu({ + additionalAlign: this.menuAddAlign, + items: [ + { template: _.template('
') }, + { template: _.template('' + this.textNewColor + '') } + ] + }) + }); + this.btnTextColor.render($('#format-rules-fontcolor')); + // this.btnTextColor.on('click', _.bind(this.onTextColor, this)); + this.mnuTextColorPicker = initNewColor(this.btnTextColor, "#format-rules-menu-fontcolor"); + + this.btnFillColor = new Common.UI.Button({ + cls : 'btn-toolbar', + iconCls : 'toolbar__icon btn-paracolor', + hint : this.fillColor, + split : true, + menu : new Common.UI.Menu({ + additionalAlign: this.menuAddAlign, + items: [ + { template: _.template('
') }, + { template: _.template('' + this.textNewColor + '') } + ] + }) + }); + this.btnFillColor.render($('#format-rules-fillcolor')); + // this.btnFillColor.on('click', _.bind(this.onTextColor, this)); + this.mnuFillColorPicker = initNewColor(this.btnFillColor, "#format-rules-menu-fillcolor"); + + this.afterRender(); + }, + + afterRender: function() { + this.updateThemeColors(); + + this._setDefaults(this.props); + this.setTitle((this.isEdit) ? this.txtTitleEdit : this.txtTitleNew); + }, + + show: function() { + Common.Views.AdvancedSettingsWindow.prototype.show.apply(this, arguments); + }, + + _setDefaults: function (props) { + if (props) { + var type = props.asc_getType(), + ruleType; + var rec = this.ruleStore.findWhere({type: type}); + if (!rec) { + var store = this.ruleStore; + for (var i=0; i0) && this.cmbRule.setValue((type!==undefined) ? type : cmbData[0].value); + } + this.setControls(index); + }, + + setControls: function(index) { + var hasformat = this.$window.find('.hasformat'); + hasformat.toggleClass('hidden', index>=7 && index<=10); + }, + + onSelectData: function(cmp) { + var me = this; + if (me.api) { + var handlerDlg = function(dlg, result) { + if (result == 'ok') { + cmp.setValue(dlg.getSettings()); + cmp.checkValidate(); + } + }; + + var win = new SSE.Views.CellRangeDialog({ + handler: handlerDlg + }).on('close', function() { + me.show(); + }); + + var xy = me.$window.offset(); + me.hide(); + win.show(xy.left + 160, xy.top + 125); + win.setSettings({ + api : me.api, + range : (!_.isEmpty(cmp.getValue()) && (cmp.checkValidate()==true)) ? cmp.getValue() : '', + type : Asc.c_oAscSelectionDialogType.Chart + }); + } + }, + + updateThemeColors: function() { + this.mnuTextColorPicker.updateColors(Common.Utils.ThemeColor.getEffectColors(), Common.Utils.ThemeColor.getStandartColors()); + this.mnuFillColorPicker.updateColors(Common.Utils.ThemeColor.getEffectColors(), Common.Utils.ThemeColor.getStandartColors()); + }, + + getSettings: function() { + return {}; + }, + + onPrimary: function() { + this.onDlgBtnClick('ok'); + return false; + }, + + onDlgBtnClick: function(event) { + var me = this; + var state = (typeof(event) == 'object') ? event.currentTarget.attributes['result'].value : event; + if (state == 'ok') { + // var checkname = this.inputName.checkValidate(), + // checkrange = this.txtDataRange.checkValidate(); + // if (checkname !== true) { + // this.inputName.cmpEl.find('input').focus(); + // this.isInputFirstChange = true; + // return; + // } + // if (checkrange !== true) { + // this.txtDataRange.cmpEl.find('input').focus(); + // return; + // } + this.handler && this.handler.call(this, state, (state == 'ok') ? this.getSettings() : undefined); + } + + this.close(); + }, + + txtTitleNew: 'New Formatting Rule', + txtTitleEdit: 'Edit Formatting Rule', + textSelectData: 'Select Data', + textApply: 'Apply to Range', + textRule: 'Rule', + txtEmpty: 'This field is required', + textInvalidRange: 'ERROR! Invalid cells range', + notcriticalErrorTitle: 'Warning', + textFormat: 'Format', + textValue: 'Value is', + textGreater: 'Greater than', + textGreaterEq: 'Greater than or equal to', + textLess: 'Less than', + textLessEq: 'Less than or equal to', + textEqual: 'Equal to', + textNotEqual: 'Not equal to', + textBetween: 'Between', + textNotBetween: 'Not between', + textRanked: 'Ranked', + textTop10: 'Top 10 items', + textTop10Per: 'Top 10%', + textBottom10: 'Bottom 10 items', + textBottom10Per: 'Bottom 10%', + textText: 'Text', + textDate: 'Date', + textBlank: 'Blank', + textDuplicate: 'Duplicate', + textDataBars: 'Data Bars', + textColorScales: 'Color Scales', + textIconSets: 'Icon Sets', + textCustom: 'Custom', + textNewColor: 'Add New Custom Color', + textBold: 'Bold', + textItalic: 'Italic', + textUnderline: 'Underline', + textStrikeout: 'Strikeout', + textSuperscript: 'Superscript', + textSubscript: 'Subscript', + textColor: 'Text color', + fillColor: 'Background color' + + }, SSE.Views.FormatRulesEditDlg || {})); +}); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/FormatRulesManagerDlg.js b/apps/spreadsheeteditor/main/app/view/FormatRulesManagerDlg.js index a8f0a1415..998335446 100644 --- a/apps/spreadsheeteditor/main/app/view/FormatRulesManagerDlg.js +++ b/apps/spreadsheeteditor/main/app/view/FormatRulesManagerDlg.js @@ -43,7 +43,8 @@ define([ 'text!spreadsheeteditor/main/app/template/FormatRulesManagerDlg.templa 'common/main/lib/view/AdvancedSettingsWindow', 'common/main/lib/component/ComboBox', 'common/main/lib/component/ListView', - 'common/main/lib/component/InputField' + 'common/main/lib/component/InputField', + 'spreadsheeteditor/main/app/view/FormatRulesEditDlg' ], function (contentTemplate) { 'use strict'; @@ -323,37 +324,23 @@ define([ 'text!spreadsheeteditor/main/app/template/FormatRulesManagerDlg.templa }, onEditRule: function (isEdit) { - return; - var me = this, xy = me.$window.offset(), - rec = this.rangeList.getSelectedRec(), - idx = _.indexOf(this.rangeList.store.models, rec), - oldname = (isEdit && rec) ? new Asc.asc_CDefName(rec.get('name'), rec.get('range'), rec.get('scope'), rec.get('isTable'), undefined, undefined, undefined, true) : null; + rec = this.rulesList.getSelectedRec(); - var win = new SSE.Views.NamedRangeEditDlg({ + var win = new SSE.Views.FormatRulesEditDlg({ api: me.api, - sheets : this.sheets, - props : (isEdit) ? oldname : this.props, + props : (isEdit && rec) ? rec.get('props') : null, isEdit : isEdit, handler : function(result, settings) { if (result == 'ok' && settings) { if (isEdit) { - me.currentNamedRange = settings; - me.api.asc_editDefinedNames(oldname, settings); } else { - me.cmbFilter.setValue(0); - me.currentNamedRange = settings; - me.api.asc_setDefinedNames(settings); - me.updateButtons(); } } } }).on('close', function() { me.show(); - _.delay(function () { - me.rangeList.cmpEl.find('.listview').focus(); - }, 100, me); }); me.hide();