diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js
index 58032aed3..dc7b04cb4 100644
--- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js
+++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js
@@ -62,7 +62,8 @@ define([
'spreadsheeteditor/main/app/view/ScaleDialog',
'spreadsheeteditor/main/app/view/FormatRulesManagerDlg',
'spreadsheeteditor/main/app/view/SlicerAddDialog',
- 'spreadsheeteditor/main/app/view/AdvancedSeparatorDialog'
+ 'spreadsheeteditor/main/app/view/AdvancedSeparatorDialog',
+ 'spreadsheeteditor/main/app/view/CreateSparklineDialog'
], function () { 'use strict';
SSE.Controllers.Toolbar = Backbone.Controller.extend(_.extend({
@@ -79,6 +80,7 @@ define([
'Toolbar': {
'change:compact': this.onClickChangeCompact.bind(me),
'add:chart' : this.onSelectChart,
+ 'add:spark' : this.onSelectSpark,
'insert:textart': this.onInsertTextart,
'change:scalespn': this.onClickChangeScaleInMenu.bind(me),
'click:customscale': this.onScaleClick.bind(me),
@@ -191,7 +193,8 @@ define([
pgmargins: undefined,
pgorient: undefined,
lock_doc: undefined,
- cf_locked: []
+ cf_locked: [],
+ selectedCells: 0
};
this.binding = {};
@@ -416,6 +419,7 @@ define([
this.api.asc_registerCallback('asc_onContextMenu', _.bind(this.onContextMenu, this));
Common.NotificationCenter.on('storage:image-load', _.bind(this.openImageFromStorage, this));
Common.NotificationCenter.on('storage:image-insert', _.bind(this.insertImageFromStorage, this));
+ this.api.asc_registerCallback('asc_onSelectionMathChanged', _.bind(this.onApiMathChanged, this));
}
this.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(this.onApiInitEditorStyles, this));
this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onApiCoAuthoringDisconnect, this));
@@ -1078,58 +1082,84 @@ define([
if (!this.editMode) return;
var me = this,
info = me.api.asc_getCellInfo(),
- seltype = info.asc_getSelectionType(),
- isSpark = (group == 'menu-chart-group-sparkcolumn' || group == 'menu-chart-group-sparkline' || group == 'menu-chart-group-sparkwin');
+ seltype = info.asc_getSelectionType();
if (me.api) {
var win, props;
- if (isSpark && (seltype==Asc.c_oAscSelectionType.RangeCells || seltype==Asc.c_oAscSelectionType.RangeCol ||
- seltype==Asc.c_oAscSelectionType.RangeRow || seltype==Asc.c_oAscSelectionType.RangeMax)) {
+ var ischartedit = ( seltype == Asc.c_oAscSelectionType.RangeChart || seltype == Asc.c_oAscSelectionType.RangeChartText);
+ props = me.api.asc_getChartObject(true); // don't lock chart object
+ if (props) {
+ (ischartedit) ? props.changeType(type) : props.putType(type);
+ var range = props.getRange(),
+ isvalid = (!_.isEmpty(range)) ? me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, range, true, props.getInRows(), props.getType()) : Asc.c_oAscError.ID.No;
+ if (isvalid == Asc.c_oAscError.ID.No) {
+ (ischartedit) ? me.api.asc_editChartDrawingObject(props) : me.api.asc_addChartDrawingObject(props);
+ } else {
+ var msg = me.txtInvalidRange;
+ switch (isvalid) {
+ case isvalid == Asc.c_oAscError.ID.StockChartError:
+ msg = me.errorStockChart;
+ break;
+ case isvalid == Asc.c_oAscError.ID.MaxDataSeriesError:
+ msg = me.errorMaxRows;
+ break;
+ case isvalid == Asc.c_oAscError.ID.ComboSeriesError:
+ msg = me.errorComboSeries;
+ break;
+ }
+ Common.UI.warning({
+ msg: msg,
+ callback: function() {
+ _.defer(function(btn) {
+ Common.NotificationCenter.trigger('edit:complete', me.toolbar);
+ })
+ }
+ });
+ }
+ }
+ }
+ Common.NotificationCenter.trigger('edit:complete', this.toolbar);
+ },
+
+ onSelectSpark: function(type) {
+ if (!this.editMode) return;
+ var me = this,
+ info = me.api.asc_getCellInfo(),
+ seltype = info.asc_getSelectionType();
+
+ if (me.api) {
+ if (seltype==Asc.c_oAscSelectionType.RangeCells || seltype==Asc.c_oAscSelectionType.RangeCol ||
+ seltype==Asc.c_oAscSelectionType.RangeRow || seltype==Asc.c_oAscSelectionType.RangeMax) {
var sparkLineInfo = info.asc_getSparklineInfo();
if (!!sparkLineInfo) {
var props = new Asc.sparklineGroup();
props.asc_setType(type);
this.api.asc_setSparklineGroup(sparkLineInfo.asc_getId(), props);
} else {
- // add sparkline
- }
- } else if (!isSpark) {
- var ischartedit = ( seltype == Asc.c_oAscSelectionType.RangeChart || seltype == Asc.c_oAscSelectionType.RangeChartText);
- props = me.api.asc_getChartObject(true); // don't lock chart object
- if (props) {
- (ischartedit) ? props.changeType(type) : props.putType(type);
- var range = props.getRange(),
- isvalid = (!_.isEmpty(range)) ? me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, range, true, props.getInRows(), props.getType()) : Asc.c_oAscError.ID.No;
- if (isvalid == Asc.c_oAscError.ID.No) {
- (ischartedit) ? me.api.asc_editChartDrawingObject(props) : me.api.asc_addChartDrawingObject(props);
- } else {
- var msg = me.txtInvalidRange;
- switch (isvalid) {
- case isvalid == Asc.c_oAscError.ID.StockChartError:
- msg = me.errorStockChart;
- break;
- case isvalid == Asc.c_oAscError.ID.MaxDataSeriesError:
- msg = me.errorMaxRows;
- break;
- case isvalid == Asc.c_oAscError.ID.ComboSeriesError:
- msg = me.errorComboSeries;
- break;
- }
- Common.UI.warning({
- msg: msg,
- callback: function() {
- _.defer(function(btn) {
- Common.NotificationCenter.trigger('edit:complete', me.toolbar);
- })
+ var me = this;
+ (new SSE.Views.CreateSparklineDialog(
+ {
+ api: me.api,
+ props: {selectedCells: me._state.selectedCells},
+ handler: function(result, settings) {
+ if (result == 'ok' && settings) {
+ me.view && me.view.fireEvent('insertspark', me.view);
+ if (settings.destination)
+ me.api.asc_addSparklineGroup(type, settings.source, settings.destination);
+ }
+ Common.NotificationCenter.trigger('edit:complete', me);
}
- });
- }
+ })).show();
}
}
}
Common.NotificationCenter.trigger('edit:complete', this.toolbar);
},
+ onApiMathChanged: function(info) {
+ this._state.selectedCells = info.asc_getCount(); // not empty cells
+ },
+
onInsertTextart: function (data) {
if (this.api) {
this.toolbar.fireEvent('inserttextart', this.toolbar);
diff --git a/apps/spreadsheeteditor/main/app/template/Toolbar.template b/apps/spreadsheeteditor/main/app/template/Toolbar.template
index 1b359be7d..55a1bf9a0 100644
--- a/apps/spreadsheeteditor/main/app/template/Toolbar.template
+++ b/apps/spreadsheeteditor/main/app/template/Toolbar.template
@@ -130,6 +130,7 @@
+
diff --git a/apps/spreadsheeteditor/main/app/view/CreateSparklineDialog.js b/apps/spreadsheeteditor/main/app/view/CreateSparklineDialog.js
new file mode 100644
index 000000000..271fe84a4
--- /dev/null
+++ b/apps/spreadsheeteditor/main/app/view/CreateSparklineDialog.js
@@ -0,0 +1,251 @@
+/*
+ *
+ * (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
+ *
+ */
+
+/**
+ * CreateSparklineDialog.js
+ *
+ * Created by Julia Radzhabova on 23.03.2021
+ * Copyright (c) 2021 Ascensio System SIA. All rights reserved.
+ *
+ */
+define([
+ 'common/main/lib/util/utils',
+ 'common/main/lib/component/InputField',
+ 'common/main/lib/view/AdvancedSettingsWindow'
+], function () { 'use strict';
+
+ SSE.Views.CreateSparklineDialog = Common.Views.AdvancedSettingsWindow.extend(_.extend({
+ options: {
+ contentWidth: 310,
+ height: 195
+ },
+
+ initialize : function(options) {
+ var me = this;
+
+ _.extend(this.options, {
+ title: this.textTitle,
+ template: [
+ '
',
+ '
',
+ '
',
+ '
',
+ '',
+ '',
+ '' + me.textDataRange + ' ',
+ ' ',
+ ' ',
+ '',
+ '',
+ '
',
+ ' ',
+ ' ',
+ '',
+ '',
+ '' + me.textDestination + ' ',
+ ' ',
+ ' ',
+ '',
+ '',
+ '
',
+ ' ',
+ ' ',
+ '
',
+ '
',
+ '
',
+ '
'
+ ].join('')
+ }, options);
+
+ this.api = options.api;
+ this.props = options.props;
+
+ this.options.handler = function(result, value) {
+ if ( result != 'ok' || this.isRangeValid() ) {
+ if (options.handler)
+ options.handler.call(this, result, value);
+ return;
+ }
+ return true;
+ };
+
+ this.dataSourceValid = '';
+ this.dataDestValid = '';
+
+ Common.Views.AdvancedSettingsWindow.prototype.initialize.call(this, this.options);
+ },
+
+ render: function() {
+ Common.Views.AdvancedSettingsWindow.prototype.render.call(this);
+ var me = this;
+
+ this.txtSourceRange = new Common.UI.InputFieldBtn({
+ el : $('#create-spark-input-source'),
+ name : 'range',
+ style : 'width: 100%;',
+ btnHint : this.textSelectData,
+ allowBlank : true,
+ validateOnChange: true
+ });
+ this.txtSourceRange.on('button:click', _.bind(this.onSelectData, this, 'source'));
+
+ this.txtDestRange = new Common.UI.InputFieldBtn({
+ el : $('#create-spark-input-dest'),
+ name : 'range',
+ style : 'width: 100%;',
+ btnHint : this.textSelectData,
+ allowBlank : true,
+ validateOnChange: true,
+ validateOnBlur: false
+ });
+ this.txtDestRange.on('button:click', _.bind(this.onSelectData, this, 'dest'));
+
+ this.afterRender();
+ },
+
+ getFocusedComponents: function() {
+ return [this.txtSourceRange, this.txtDestRange];
+ },
+
+ afterRender: function() {
+ this._setDefaults(this.props);
+ },
+
+ _setDefaults: function (props) {
+ var cells = props ? props.selectedCells : 0;
+ var me = this;
+ if (cells>0) {
+ var range = this.api.asc_getActiveRangeStr(Asc.referenceType.R);
+ this.txtSourceRange.setValue(range);
+ this.dataSourceValid = range;
+ setTimeout(function(){me.txtDestRange.focus();}, 100);
+ } else {
+ var range = this.api.asc_getActiveRangeStr(Asc.referenceType.A);
+ this.txtDestRange.setValue(range);
+ this.dataDestValid = range;
+ setTimeout(function(){me.txtSourceRange.focus();}, 100);
+ }
+ this.txtSourceRange.validation = function(value) {
+ var isvalid = me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, value, false);
+ return (isvalid==Asc.c_oAscError.ID.DataRangeError) ? me.textInvalidRange : true;
+ };
+ this.txtDestRange.validation = function(value) {
+ var isvalid = me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.FormatTable, value, false);
+ return (isvalid==Asc.c_oAscError.ID.DataRangeError) ? me.textInvalidRange : true;
+ };
+ },
+
+ getSettings: function () {
+ var source = this.txtSourceRange.getValue(),
+ dest = this.txtDestRange.getValue();
+
+ return {source: source, destination: dest};
+ },
+
+ isRangeValid: function() {
+ var isvalid = true,
+ txtError = '';
+
+ if (_.isEmpty(this.txtSourceRange.getValue())) {
+ isvalid = false;
+ txtError = this.txtEmpty;
+ } else {
+ isvalid = this.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, this.txtSourceRange.getValue());
+ isvalid = (isvalid == Asc.c_oAscError.ID.No);
+ !isvalid && (txtError = this.textInvalidRange);
+ }
+ if (!isvalid) {
+ this.txtSourceRange.showError([txtError]);
+ this.txtSourceRange.focus();
+ return isvalid;
+ }
+
+ if (_.isEmpty(this.txtDestRange.getValue())) {
+ isvalid = false;
+ txtError = this.txtEmpty;
+ } else {
+ isvalid = this.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.FormatTable, this.txtDestRange.getValue());
+ isvalid = (isvalid == Asc.c_oAscError.ID.No);
+ !isvalid && (txtError = this.textInvalidRange);
+ }
+ if (!isvalid) {
+ this.txtDestRange.showError([txtError]);
+ this.txtDestRange.focus();
+ return isvalid;
+ }
+
+ return isvalid;
+ },
+
+ onSelectData: function(type) {
+ var me = this,
+ txtRange = (type=='source') ? me.txtSourceRange : me.txtDestRange;
+
+ if (me.api) {
+ var handlerDlg = function(dlg, result) {
+ if (result == 'ok') {
+ var txt = dlg.getSettings();
+ (type=='source') ? (me.dataSourceValid = txt) : (me.dataDestValid = txt);
+ txtRange.setValue(txt);
+ txtRange.checkValidate();
+ }
+ };
+
+ var win = new SSE.Views.CellRangeDialog({
+ handler: handlerDlg
+ }).on('close', function() {
+ me.show();
+ _.delay(function(){
+ txtRange.focus();
+ },1);
+ });
+
+ var xy = me.$window.offset();
+ me.hide();
+ win.show(xy.left + 160, xy.top + 125);
+ win.setSettings({
+ api : me.api,
+ range : (!_.isEmpty(txtRange.getValue()) && (txtRange.checkValidate()==true)) ? txtRange.getValue() : ((type=='source') ? me.dataSourceValid : me.dataDestValid),
+ type : (type=='source') ? Asc.c_oAscSelectionDialogType.Chart : Asc.c_oAscSelectionDialogType.FormatTable
+ });
+ }
+ },
+
+ textTitle: 'Create Sparklines',
+ textDataRange: 'Source data range',
+ textSelectData: 'Select data',
+ textDestination: 'Choose, where to place the sparklines',
+ txtEmpty: 'This field is required',
+ textInvalidRange: 'Invalid cells range'
+ }, SSE.Views.CreateSparklineDialog || {}))
+});
\ No newline at end of file
diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js
index e3999e20b..db0cfc733 100644
--- a/apps/spreadsheeteditor/main/app/view/Toolbar.js
+++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js
@@ -722,6 +722,15 @@ define([
menu : true
});
+ me.btnInsertSparkline = new Common.UI.Button({
+ id : 'tlbtn-insertsparkline',
+ cls : 'btn-toolbar x-huge icon-top',
+ iconCls : 'toolbar__icon btn-sparkline',
+ lock : [_set.editCell, _set.selChart, _set.selChartText, _set.selImage, _set.selShape, _set.selSlicer, _set.multiselect, _set.lostConnect, _set.coAuth, _set.coAuthText, _set.editPivot],
+ caption : me.capInsertSpark,
+ menu : true
+ });
+
me.btnInsertShape = new Common.UI.Button({
id : 'tlbtn-insertshape',
cls : 'btn-toolbar x-huge icon-top',
@@ -1461,7 +1470,7 @@ define([
me.btnInsertText, me.btnInsertTextArt, me.btnSortUp, me.btnSortDown, me.btnSetAutofilter, me.btnClearAutofilter,
me.btnTableTemplate, me.btnPercentStyle, me.btnCurrencyStyle, me.btnDecDecimal, me.btnAddCell, me.btnDeleteCell, me.btnCondFormat,
me.cmbNumberFormat, me.btnBorders, me.btnInsertImage, me.btnInsertHyperlink,
- me.btnInsertChart, me.btnColorSchemas,
+ me.btnInsertChart, me.btnColorSchemas, me.btnInsertSparkline,
me.btnCopy, me.btnPaste, me.listStyles, me.btnPrint,
/*me.btnSave,*/ me.btnClearStyle, me.btnCopyStyle,
me.btnPageMargins, me.btnPageSize, me.btnPageOrient, me.btnPrintArea, me.btnPrintTitles, me.btnImgAlign, me.btnImgBackward, me.btnImgForward, me.btnImgGroup, me.btnScale
@@ -1661,6 +1670,7 @@ define([
_injectComponent('#slot-btn-colorschemas', this.btnColorSchemas);
_injectComponent('#slot-btn-search', this.btnSearch);
_injectComponent('#slot-btn-inschart', this.btnInsertChart);
+ _injectComponent('#slot-btn-inssparkline', this.btnInsertSparkline);
_injectComponent('#slot-field-styles', this.listStyles);
_injectComponent('#slot-btn-chart', this.btnEditChart);
_injectComponent('#slot-btn-chart-data', this.btnEditChartData);
@@ -1720,6 +1730,7 @@ define([
_updateHint(this.btnInsertTable, this.tipInsertTable);
_updateHint(this.btnInsertImage, this.tipInsertImage);
_updateHint(this.btnInsertChart, this.tipInsertChartSpark);
+ _updateHint(this.btnInsertSparkline, this.tipInsertSpark);
_updateHint(this.btnInsertText, this.tipInsertText);
_updateHint(this.btnInsertTextArt, this.tipInsertTextart);
_updateHint(this.btnInsertHyperlink, this.tipInsertHyperlink + Common.Utils.String.platformKey('Ctrl+K'));
@@ -1919,6 +1930,34 @@ define([
this.btnInsertChart.menu.on('show:before', onShowBefore);
}
+ if ( this.btnInsertSparkline ) {
+ this.btnInsertSparkline.setMenu(new Common.UI.Menu({
+ style: 'width: 166px;padding: 5px 0 10px;',
+ items: [
+ { template: _.template('') }
+ ]
+ }));
+
+ var onShowBefore = function(menu) {
+ var picker = new Common.UI.DataView({
+ el: $('#id-toolbar-menu-insertspark'),
+ parentMenu: menu,
+ showLast: false,
+ restoreHeight: 50,
+ // groups: new Common.UI.DataViewGroupStore(Common.define.chartData.getSparkGroupData()),
+ store: new Common.UI.DataViewStore(Common.define.chartData.getSparkData()),
+ itemTemplate: _.template('
\">
')
+ });
+ picker.on('item:click', function (picker, item, record, e) {
+ if (record)
+ me.fireEvent('add:spark', [record.get('type')]);
+ if (e.type !== 'click') menu.hide();
+ });
+ menu.off('show:before', onShowBefore);
+ };
+ this.btnInsertSparkline.menu.on('show:before', onShowBefore);
+ }
+
if (this.btnInsertTextArt) {
var onShowBeforeTextArt = function (menu) {
var collection = SSE.getCollection('Common.Collections.TextArt');
@@ -2648,6 +2687,8 @@ define([
tipEditChartData: 'Select Data',
tipEditChartType: 'Change Chart Type',
textAutoColor: 'Automatic',
- textItems: 'Items'
+ textItems: 'Items',
+ tipInsertSpark: 'Insert sparkline',
+ capInsertSpark: 'Sparklines'
}, SSE.Views.Toolbar || {}));
});
\ No newline at end of file
diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json
index 356da4318..91f67c292 100644
--- a/apps/spreadsheeteditor/main/locale/en.json
+++ b/apps/spreadsheeteditor/main/locale/en.json
@@ -1647,6 +1647,12 @@
"SSE.Views.CreatePivotDialog.textSelectData": "Select data",
"SSE.Views.CreatePivotDialog.textTitle": "Create Pivot Table",
"SSE.Views.CreatePivotDialog.txtEmpty": "This field is required",
+ "SSE.Views.CreateSparklineDialog.textTitle": "Create Sparklines",
+ "SSE.Views.CreateSparklineDialog.textDataRange": "Source data range",
+ "SSE.Views.CreateSparklineDialog.textSelectData": "Select data",
+ "SSE.Views.CreateSparklineDialog.textDestination": "Choose, where to place the sparklines",
+ "SSE.Views.CreateSparklineDialog.txtEmpty": "This field is required",
+ "SSE.Views.CreateSparklineDialog.textInvalidRange": "Invalid cells range",
"SSE.Views.DataTab.capBtnGroup": "Group",
"SSE.Views.DataTab.capBtnTextCustomSort": "Custom Sort",
"SSE.Views.DataTab.capBtnTextDataValidation": "Data Validation",
@@ -3283,6 +3289,8 @@
"SSE.Views.Toolbar.txtTime": "Time",
"SSE.Views.Toolbar.txtUnmerge": "Unmerge Cells",
"SSE.Views.Toolbar.txtYen": "¥ Yen",
+ "SSE.Views.Toolbar.tipInsertSpark": "Insert sparkline",
+ "SSE.Views.Toolbar.capInsertSpark": "Sparklines",
"SSE.Views.Top10FilterDialog.textType": "Show",
"SSE.Views.Top10FilterDialog.txtBottom": "Bottom",
"SSE.Views.Top10FilterDialog.txtBy": "by",
diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/1.25x/big/btn-sparkline.png b/apps/spreadsheeteditor/main/resources/img/toolbar/1.25x/big/btn-sparkline.png
new file mode 100644
index 000000000..e03dc660a
Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/img/toolbar/1.25x/big/btn-sparkline.png differ
diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/1.5x/big/btn-sparkline.png b/apps/spreadsheeteditor/main/resources/img/toolbar/1.5x/big/btn-sparkline.png
new file mode 100644
index 000000000..dd49df8fb
Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/img/toolbar/1.5x/big/btn-sparkline.png differ
diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/1.75x/big/btn-sparkline.png b/apps/spreadsheeteditor/main/resources/img/toolbar/1.75x/big/btn-sparkline.png
new file mode 100644
index 000000000..8b7a09c05
Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/img/toolbar/1.75x/big/btn-sparkline.png differ
diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/1x/big/btn-sparkline.png b/apps/spreadsheeteditor/main/resources/img/toolbar/1x/big/btn-sparkline.png
new file mode 100644
index 000000000..25fb558ea
Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/img/toolbar/1x/big/btn-sparkline.png differ
diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/2x/big/btn-sparkline.png b/apps/spreadsheeteditor/main/resources/img/toolbar/2x/big/btn-sparkline.png
new file mode 100644
index 000000000..9a59a5514
Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/img/toolbar/2x/big/btn-sparkline.png differ