Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

406 lines
21 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff --git a/common/Charts/ChartsDrawer.js b/common/Charts/ChartsDrawer.js
index a3b387aae1..74913c7411 100644
--- a/common/Charts/ChartsDrawer.js
+++ b/common/Charts/ChartsDrawer.js
@@ -189,7 +189,9 @@ CChartsDrawer.prototype =
//CHARTS
if (!chartSpace.bEmptySeries) {
for(var i in this.charts) {
- this.charts[i].recalculate();
+ if (this.charts.hasOwnProperty(i) && this.charts[i]) {
+ this.charts[i].recalculate();
+ }
}
}

@@ -318,7 +320,9 @@ CChartsDrawer.prototype =

if (chartSpace.chart.plotArea.isForChartEx) {
for (i in t.charts) {
- t.charts[i].draw();
+ if (t.charts.hasOwnProperty(i) && t.charts[i]) {
+ t.charts[i].draw();
+ }
}
} else {
//для начала нужно отсортировать
@@ -616,6 +620,7 @@ CChartsDrawer.prototype =

if (!this.cChartSpace.bEmptySeries) {
var type = obj.getObjectType();
+ console.log(type);
switch (type) {
case AscDFH.historyitem_type_DLbl: {
pos = this._calculatePositionDlbl(obj);
@@ -625,7 +630,7 @@ CChartsDrawer.prototype =
var parentType = obj.parent ? obj.parent.getObjectType() : null;
if (parentType === AscDFH.historyitem_type_Chart) {
pos = this._calculatePositionTitle(obj);
- } else if (parentType === AscDFH.historyitem_type_ValAx || parentType === AscDFH.historyitem_type_CatAx || parentType === AscDFH.historyitem_type_DateAx) {
+ } else if (parentType === AscDFH.historyitem_type_ValAx || parentType === AscDFH.historyitem_type_CatAx || parentType === AscDFH.historyitem_type_DateAx || parentType === AscDFH.historyitem_type_Axis) {
pos = this._calculatePositionAxisTitle(obj.parent);
}
break;
@@ -2491,13 +2496,6 @@ CChartsDrawer.prototype =
valAxis.max = axisProperties.val.max;
valAxis.scale = axisProperties.val.scale.length > 0 ? axisProperties.val.scale : this._roundValues(this._getAxisValues2(valAxis, this.cChartSpace, false, false));

- // Exchange cross axes 
- catAxis.crossAx = valAxis;
- valAxis.crossAx = catAxis;
-
- // Differentiate between axes 
- catAxis.axPos = window['AscFormat'].AX_POS_B;
- valAxis.axPos = window['AscFormat'].AX_POS_L;
},

_chartExSetAxisMinAndMax: function (axis, num) {
@@ -4615,11 +4613,11 @@ CChartsDrawer.prototype =
if (!this.cChartSpace || !this.calcProp) {
return null;
}
- var pathId = this.cChartSpace.AllocPath();
- var path = this.cChartSpace.GetPath(pathId);
+ const pathId = this.cChartSpace.AllocPath();
+ const path = this.cChartSpace.GetPath(pathId);

- var pathH = this.calcProp.pathH;
- var pathW = this.calcProp.pathW;
+ const pathH = this.calcProp.pathH;
+ const pathW = this.calcProp.pathW;

if (!isPxToMmConverted) {
const pxToMm = this.calcProp.pxToMM;
@@ -5049,9 +5047,10 @@ CChartsDrawer.prototype =

getVerticalGridLines: function (axis, isCatAxis) {
var gridLines, minorGridLines;
+ const isForChartEx = this.cChartSpace && this.cChartSpace.chart && this.cChartSpace.chart.plotArea && this.cChartSpace.chart.plotArea.isForChartEx ? true : false;

var crossBetween = this.cChartSpace.getValAxisCrossType();
- if(null === crossBetween && isCatAxis) {
+ if(null === crossBetween && (isCatAxis || isForChartEx)) {
crossBetween = axis.crossAx ? axis.crossAx.crossBetween : null;
}

@@ -5067,15 +5066,14 @@ CChartsDrawer.prototype =
if(!axis.majorGridlines && !axis.minorGridlines) {
return;
}
-
- var minorLinesCount = isCatAxis ? 2 : 5;
+ var minorLinesCount = isCatAxis || isForChartEx ? 2 : 5;

var posAxis = this.calcProp.chartGutter._left / this.calcProp.pxToMM;
var stepX = points[1] ? Math.abs((points[1].pos - points[0].pos)) : (Math.abs(points[0].pos - posAxis) * 2);
var minorStep = (stepX * this.calcProp.pxToMM) / minorLinesCount;
var posX, crossDiff;

- if (crossBetween === AscFormat.CROSS_BETWEEN_BETWEEN && isCatAxis) {
+ if (crossBetween === AscFormat.CROSS_BETWEEN_BETWEEN && (isCatAxis || isForChartEx)) {
crossDiff = points[1] ? Math.abs((points[1].pos - points[0].pos) / 2) : Math.abs(points[0].pos - posAxis);
}

@@ -5083,7 +5081,7 @@ CChartsDrawer.prototype =
var path = this.cChartSpace.GetPath(pathId);
var i;
for (i = 0; i < points.length; i++) {
- if(isCatAxis && points[i].val < 0) {
+ if((isCatAxis && points[i].val < 0) && !isForChartEx) {
continue;
}

@@ -5114,7 +5112,7 @@ CChartsDrawer.prototype =
var pathIdMinor = this.cChartSpace.AllocPath();
var pathMinor = this.cChartSpace.GetPath(pathIdMinor);
for (i = 0; i < points.length; i++) {
- if(isCatAxis && points[i].val < 0) {
+ if((isCatAxis && points[i].val < 0) && !isForChartEx) {
continue;
}

@@ -7633,7 +7631,10 @@ drawHistogramChart.prototype = {
// two different ways of storing information, object and array, therefore convert object into array
const sections = isAggregation ? Object.values(cachedData.aggregation) : cachedData.results; 
if (sections) {
- const initialBarWidth = (this.chartProp.trueWidth)/ sections.length;
+ // 1 px gap for each section length
+ const gapWidth = 1;
+ // const gapNumbers = sections.length - 1;
+ const initialBarWidth = (this.chartProp.trueWidth) / sections.length;
const barWidth = (initialBarWidth / (1 + coeff));
const margin = (initialBarWidth - barWidth) / 2;

@@ -7642,11 +7643,12 @@ drawHistogramChart.prototype = {
// aggregation object does not have field occurrence;
const val = isAggregation ? sections[i] : sections[i].occurrence;
const startY = this.cChartDrawer.getYPosition(val, valAxis, true);
+ const bW = i === 0 ? barWidth : barWidth - gapWidth;
if (this.chartProp && this.chartProp.pxToMM ) {
const height = valStart - (startY * this.chartProp.pxToMM);
- this.paths[i] = this.cChartDrawer._calculateRect(start, valStart, barWidth, height);
+ this.paths[i] = this.cChartDrawer._calculateRect(start, valStart, bW, height);
} 
- start += (barWidth + margin + margin);
+ start += (bW + margin + margin + gapWidth);
}
}

@@ -7817,25 +7819,52 @@ drawWaterfallChart.prototype = {
let valStart = this.cChartSpace.chart.plotArea.axId ? this.cChartSpace.chart.plotArea.axId[0].posY * this.chartProp.pxToMM : this.chartProp.trueHeight + this.chartProp.chartGutter._top;
if (AscFormat.isRealNumber(valStart)) {
const coeff = catAxis.scaling.gapWidth;
- const initialBarWidth = (this.chartProp.trueWidth)/ data.length;
+ // 1 px gap for each section length
+ const gapWidth = 1;
+ const gapNumbers = data.length - 1;
+ const initialBarWidth = (this.chartProp.trueWidth - (gapWidth * gapNumbers))/ data.length;
const barWidth = (initialBarWidth / (1 + coeff));
const margin = (initialBarWidth - barWidth) / 2;
+
let sum = 0;
- let start = (catStart + margin);
+ let start = (catStart + margin); 
for (let i = 0; i < data.length; i++) {
sum += data[i].val;
- const startY = this.cChartDrawer.getYPosition(sum, valAxis, true) * this.chartProp.pxToMM;
+ const valPos = this.cChartDrawer.getYPosition(sum, valAxis, true) * this.chartProp.pxToMM; // calc roof of the current bar
+ const next = start + (barWidth + margin + gapWidth + margin); // calc end of the current barr
if (this.chartProp && this.chartProp.pxToMM ) {
- const height = valStart - startY;
- this.paths[i] = this.cChartDrawer._calculateRect(start, valStart, barWidth, height);
+ const height = valStart - valPos;
+ this.paths[i] = [];
+ this.paths[i].push(this.cChartDrawer._calculateRect(start, valStart, barWidth, height));
+ //dont need last connectorLine
+ if (i !== data.length - 1 && margin !== 0) {
+ this.paths[i].push(this._calculateConnectorLine(valPos, start + barWidth, next))
+ }
}
- valStart = startY; 
- start += (barWidth + margin + margin);
+ valStart = valPos; // go up in y direction
+ start = next; // go right in x direction
}
}
}
},

+ _calculateConnectorLine: function (y, x1, x2) {
+ if (!this.cChartSpace || !this.chartProp) {
+ return null;
+ }
+ const pathId = this.cChartSpace.AllocPath();
+ const path = this.cChartSpace.GetPath(pathId);
+
+ const pathH = this.chartProp.pathH;
+ const pathW = this.chartProp.pathW;
+ const pxToMm = this.chartProp.pxToMM;
+
+ path.moveTo((x1 / pxToMm) * pathW, (y / pxToMm) * pathH);
+ path.lnTo((x2 / pxToMm) * pathW, (y / pxToMm) * pathH);
+
+ return pathId;
+ },
+
draw: function () {
if (!this.cChartDrawer || !this.cChartDrawer.calcProp || !this.cChartDrawer.cShapeDrawer || !this.cChartDrawer.cShapeDrawer.Graphics || !this.cChartDrawer.calcProp.chartGutter) {
return;
@@ -7888,10 +7917,12 @@ drawWaterfallChart.prototype = {
let oSeries = series[0];
if(oSeries) {
for (let i in this.paths) {
- let nPtIdx = parseInt(i);
- let pen = oSeries.getPtPen(nPtIdx);
- let brush = oSeries.getPtBrush(nPtIdx);
- this.cChartDrawer.drawPath(this.paths[i], pen, brush);
+ for (let j in this.paths[i]) {
+ let nPtIdx = parseInt(i);
+ let pen = (j === 0 ) ? oSeries.getPtPen(nPtIdx) : this.cChartSpace.chart.plotArea.axId[1].compiledMajorGridLines;
+ let brush = oSeries.getPtBrush(nPtIdx);
+ this.cChartDrawer.drawPath(this.paths[i][j], pen, brush);
+ }
}
}

diff --git a/common/Drawings/Format/ChartEx.js b/common/Drawings/Format/ChartEx.js
index d89caa5d80..905898aaee 100644
--- a/common/Drawings/Format/ChartEx.js
+++ b/common/Drawings/Format/ChartEx.js
@@ -268,6 +268,10 @@ function (window, undefined) {
this.setParentToChild(pr);
};

+ CAxis.prototype.setAxPos = function (pos) {
+ this.axPos = pos ? window['AscFormat'].AX_POS_L : window['AscFormat'].AX_POS_B;
+ }
+
// AxisUnits
drawingsChangesMap[AscDFH.historyitem_AxisUnits_SetUnitsLabel] = function (oClass, value) {
oClass.unitsLabel = value;
@@ -2946,6 +2950,10 @@ function (window, undefined) {
}
return null;
};
+ CSeries.prototype.getValPts = function () {
+ const numLit = this.getValLit();
+ return numLit ? numLit.pts : [];
+ };
CSeries.prototype.getCatLit = function (type) {
let oSeriesData = this.getData();
if(!oSeriesData) {
diff --git a/common/Drawings/Format/ChartSpace.js b/common/Drawings/Format/ChartSpace.js
index 76db98a8ac..0add210264 100644
--- a/common/Drawings/Format/ChartSpace.js
+++ b/common/Drawings/Format/ChartSpace.js
@@ -4149,7 +4149,7 @@ function(window, undefined) {
const cachedData = this.chart.plotArea.plotAreaRegion.cachedData;
const results = obtainResults(cachedData);
//seria.dataLabels.visibility optional
- if (seria && seria.dataLabels) {
+ if (cachedData && seria && seria.dataLabels) {
const default_lbl = new AscFormat.CDLbl();
const nDefaultPosition = seria.dataLabels.pos ? seria.dataLabels.pos : AscFormat.DATA_LABEL_POS_OUT_END;
default_lbl.initDefault(nDefaultPosition);
@@ -4185,6 +4185,18 @@ function(window, undefined) {
CChartSpace.prototype.calculateLabelsPositions = function (b_recalc_labels, b_recalc_legend) {
let layout;
let aDLbls = this.recalcInfo.dataLbls;
+
+ // TODO after new succefull implementation of new type remove option here
+ const isForChartEx = this.chart && this.chart.plotArea && this.chart.plotArea.isForChartEx ? true : false;
+ const type = this.chart && this.chart.plotArea && this.chart.plotArea.plotAreaRegion && this.chart.plotArea.plotAreaRegion.series && this.chart.plotArea.plotAreaRegion.series[0] ? this.chart.plotArea.plotAreaRegion.series[0].layoutId : null;
+ if (isForChartEx && type !== AscFormat.SERIES_LAYOUT_BOX_WHISKER && !type) {
+ return ;
+ }
+ if (isForChartEx && (type === AscFormat.SERIES_LAYOUT_BOX_WHISKER || type === AscFormat.SERIES_LAYOUT_FUNNEL || type === AscFormat.SERIES_LAYOUT_PARETO_LINE || type === AscFormat.SERIES_LAYOUT_REGION_MAP || type === AscFormat.SERIES_LAYOUT_SUNBURST || type === AscFormat.SERIES_LAYOUT_TREEMAP)) {
+ return ;
+ }
+ //----------------------------------
+ 
if (!aDLbls || aDLbls.length === 0) {
this.calculateChartExLabelsPositions();
}
@@ -4367,7 +4379,7 @@ function(window, undefined) {
if (!this.chart || !this.chart.plotArea) {
return [];
}
- if (oAxis.Id === this.chart.plotArea.axId[1].Id) {
+ if (this.chart.plotArea.axId.length > 1 && oAxis.Id === this.chart.plotArea.axId[1].Id) {
// for the val axis, regularly get labels
aStrings = this.getLabelsForAxis(oAxis, true);
} else {
@@ -4736,6 +4748,7 @@ function(window, undefined) {
if(this.chart.plotArea.layout && this.chart.plotArea.layout.layoutTarget === AscFormat.LAYOUT_TARGET_INNER) {
bWithoutLabels = true;
}
+ 
let bCorrected = false;
let fL = oRect.x, fT = oRect.y, fR = oRect.x + oRect.w, fB = oRect.y + oRect.h;
const isChartEX = this.chart && this.chart.plotArea && this.chart.plotArea.isForChartEx ? true : false;
@@ -4754,6 +4767,9 @@ function(window, undefined) {
this.calculateAxisGrid(oCrossAxis, oRect);
oCalcMap[oCrossAxis.Id] = true;
}
+ if (!oCrossAxis) {
+ return;
+ }
let fCrossValue;
// posY seeks the zero position on the diagram
let posY = null;
@@ -5143,6 +5159,16 @@ function(window, undefined) {
this.cachedCanvas = null;
this.plotAreaRect = null;
this.bEmptySeries = this.checkEmptySeries();
+ // TODO after new succefull implementation of new type remove option here
+ const isForChartEx = this.chart && this.chart.plotArea && this.chart.plotArea.isForChartEx ? true : false;
+ const type = this.chart && this.chart.plotArea && this.chart.plotArea.plotAreaRegion && this.chart.plotArea.plotAreaRegion.series && this.chart.plotArea.plotAreaRegion.series[0] ? this.chart.plotArea.plotAreaRegion.series[0].layoutId : null;
+ if (isForChartEx && type !== AscFormat.SERIES_LAYOUT_BOX_WHISKER && !type) {
+ return ;
+ }
+ if (isForChartEx && (type === AscFormat.SERIES_LAYOUT_BOX_WHISKER || type === AscFormat.SERIES_LAYOUT_FUNNEL || type === AscFormat.SERIES_LAYOUT_PARETO_LINE || type === AscFormat.SERIES_LAYOUT_REGION_MAP || type === AscFormat.SERIES_LAYOUT_SUNBURST || type === AscFormat.SERIES_LAYOUT_TREEMAP)) {
+ return ;
+ }
+ //----------------------------------
if (this.chart && this.chart.plotArea) {
var oPlotArea = this.chart.plotArea;
for (i = 0; i < oPlotArea.axId.length; ++i) {
@@ -5771,7 +5797,8 @@ function(window, undefined) {
if (AscFormat.isRealNumber(legend.legendPos)) {
legend_pos = legend.legendPos;
}
- var aCharts = this.chart.plotArea.charts;
+ const isChartEx = this.chart && this.chart.plotArea && this.chart.plotArea.isForChartEx ? true : false;
+ var aCharts = isChartEx ? [this.chart.plotArea.plotAreaRegion] : this.chart.plotArea.charts;
var oTypedChart;
//Order series for the legend
var aOrderedSeries = [];
@@ -5853,7 +5880,8 @@ function(window, undefined) {
entry = legend.findLegendEntryByIndex(i);
if(entry && entry.bDelete)
continue;
- arr_str_labels.push(ser.getSeriesName());
+ const label = ser.getSeriesName ? ser.getSeriesName() : '';
+ arr_str_labels.push(label);
}
else {
entry = legend.findLegendEntryByIndex(i);
@@ -5884,7 +5912,7 @@ function(window, undefined) {

calc_entry.calcMarkerUnion = new AscFormat.CUnionMarker();
union_marker = calc_entry.calcMarkerUnion;
- var pts = ser.getNumPts();
+ var pts = isChartEx ? ser.getValPts() : ser.getNumPts();
var nSerType = ser.getObjectType();
if(nSerType === AscDFH.historyitem_type_BarSeries ||
nSerType === AscDFH.historyitem_type_BubbleSeries ||
@@ -6084,6 +6112,9 @@ function(window, undefined) {
} else {
marker_size = 0.2 * max_font_size;
for (i = 0; i < calc_entryes.length; ++i) {
+ if (!calc_entryes[i].calcMarkerUnion || !calc_entryes[i].calcMarkerUnion.marker || !calc_entryes[i].calcMarkerUnion.marker.spPr || !calc_entryes[i].calcMarkerUnion.marker.spPr.geometry) {
+ continue;
+ }
calc_entryes[i].calcMarkerUnion.marker.spPr.geometry.Recalculate(marker_size, marker_size);
}
distance_to_text = marker_size * 0.7;
@@ -8458,6 +8489,16 @@ function(window, undefined) {
if (this.chartObj) {
this.chartObj.draw(this, graphics);
}
+ // TODO after new succefull implementation of new type remove option here
+ const isForChartEx = this.chart && this.chart.plotArea && this.chart.plotArea.isForChartEx ? true : false;
+ const type = this.chart && this.chart.plotArea && this.chart.plotArea.plotAreaRegion && this.chart.plotArea.plotAreaRegion.series && this.chart.plotArea.plotAreaRegion.series[0] ? this.chart.plotArea.plotAreaRegion.series[0].layoutId : null;
+ if (isForChartEx && type !== AscFormat.SERIES_LAYOUT_BOX_WHISKER && !type) {
+ return ;
+ }
+ if (isForChartEx && (type === AscFormat.SERIES_LAYOUT_BOX_WHISKER || type === AscFormat.SERIES_LAYOUT_FUNNEL || type === AscFormat.SERIES_LAYOUT_PARETO_LINE || type === AscFormat.SERIES_LAYOUT_REGION_MAP || type === AscFormat.SERIES_LAYOUT_SUNBURST || type === AscFormat.SERIES_LAYOUT_TREEMAP)) {
+ return ;
+ }
+ //----------------------------------
if (this.chart && !this.bEmptySeries) {
if (this.chart.plotArea) {
// var oChartSize = this.getChartSizes();
diff --git a/common/SerializeChart.js b/common/SerializeChart.js
index 56ddebb127..c757e73eb6 100644
--- a/common/SerializeChart.js
+++ b/common/SerializeChart.js
@@ -13507,6 +13507,17 @@ BinaryChartReader.prototype.ReadCT_ChartEx = function (type, length, val) {
res = this.bcr.Read1(length, function (t, l) {
return oThis.ReadCT_ChartExPlotArea(t, l, oNewVal);
});
+ if (oNewVal && oNewVal.axId && Array.isArray(oNewVal.axId)) {
+ for (let i = 0; i < oNewVal.axId.length; i++) {
+ const axis = oNewVal.axId[i];
+ axis.setAxPos(i);
+ }
+ if (oNewVal.axId.length === 2) {
+ oNewVal.axId[0].crossAx = oNewVal.axId[1];
+ oNewVal.axId[1].crossAx = oNewVal.axId[0];
+ oNewVal.axId[1].crossBetween = 0;
+ }
+ }
val.setPlotArea(oNewVal);
}
else if (c_oserct_chartExChartTITLE === type)