@odoo/o-spreadsheet 16.3.8 → 16.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/o-spreadsheet.cjs.js +71 -27
- package/dist/o-spreadsheet.d.ts +11 -3
- package/dist/o-spreadsheet.esm.js +71 -27
- package/dist/o-spreadsheet.iife.js +71 -27
- package/dist/o-spreadsheet.iife.min.js +123 -123
- package/package.json +1 -1
|
@@ -7466,6 +7466,7 @@ class LineChart extends AbstractChart {
|
|
|
7466
7466
|
aggregated;
|
|
7467
7467
|
type = "line";
|
|
7468
7468
|
dataSetsHaveTitle;
|
|
7469
|
+
cumulative;
|
|
7469
7470
|
constructor(definition, sheetId, getters) {
|
|
7470
7471
|
super(definition, sheetId, getters);
|
|
7471
7472
|
this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
@@ -7477,6 +7478,7 @@ class LineChart extends AbstractChart {
|
|
|
7477
7478
|
this.stacked = definition.stacked;
|
|
7478
7479
|
this.aggregated = definition.aggregated;
|
|
7479
7480
|
this.dataSetsHaveTitle = definition.dataSetsHaveTitle;
|
|
7481
|
+
this.cumulative = definition.cumulative;
|
|
7480
7482
|
}
|
|
7481
7483
|
static validateChartDefinition(validator, definition) {
|
|
7482
7484
|
return validator.checkValidations(definition, checkDataset, checkLabelRange);
|
|
@@ -7497,6 +7499,7 @@ class LineChart extends AbstractChart {
|
|
|
7497
7499
|
labelRange: context.auxiliaryRange || undefined,
|
|
7498
7500
|
stacked: false,
|
|
7499
7501
|
aggregated: false,
|
|
7502
|
+
cumulative: false,
|
|
7500
7503
|
};
|
|
7501
7504
|
}
|
|
7502
7505
|
getDefinition() {
|
|
@@ -7517,6 +7520,7 @@ class LineChart extends AbstractChart {
|
|
|
7517
7520
|
labelsAsText: this.labelsAsText,
|
|
7518
7521
|
stacked: this.stacked,
|
|
7519
7522
|
aggregated: this.aggregated,
|
|
7523
|
+
cumulative: this.cumulative,
|
|
7520
7524
|
};
|
|
7521
7525
|
}
|
|
7522
7526
|
getContextCreation() {
|
|
@@ -7725,6 +7729,16 @@ function createLineChartRuntime(chart, getters) {
|
|
|
7725
7729
|
if (chart.stacked) {
|
|
7726
7730
|
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
7727
7731
|
}
|
|
7732
|
+
if (chart.cumulative) {
|
|
7733
|
+
let accumulator = 0;
|
|
7734
|
+
data = data.map((value) => {
|
|
7735
|
+
if (!isNaN(value)) {
|
|
7736
|
+
accumulator += parseFloat(value);
|
|
7737
|
+
return accumulator;
|
|
7738
|
+
}
|
|
7739
|
+
return value;
|
|
7740
|
+
});
|
|
7741
|
+
}
|
|
7728
7742
|
const backgroundColor = rgbaToHex(backgroundRGBA);
|
|
7729
7743
|
const dataset = {
|
|
7730
7744
|
label,
|
|
@@ -8546,6 +8560,7 @@ function getSmartChartDefinition(zone, getters) {
|
|
|
8546
8560
|
labelsAsText: false,
|
|
8547
8561
|
stacked: false,
|
|
8548
8562
|
aggregated: false,
|
|
8563
|
+
cumulative: false,
|
|
8549
8564
|
labelRange: labelRangeXc,
|
|
8550
8565
|
type: "line",
|
|
8551
8566
|
dataSetsHaveTitle,
|
|
@@ -8908,6 +8923,13 @@ const REMOVE_ROWS_ACTION = (env) => {
|
|
|
8908
8923
|
elements: rows,
|
|
8909
8924
|
});
|
|
8910
8925
|
};
|
|
8926
|
+
const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
|
|
8927
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
8928
|
+
const selectedElements = env.model.getters.getElementsFromSelection(dimension);
|
|
8929
|
+
const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
|
|
8930
|
+
const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
|
|
8931
|
+
return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
|
|
8932
|
+
};
|
|
8911
8933
|
const REMOVE_COLUMNS_NAME = (env) => {
|
|
8912
8934
|
if (env.model.getters.getSelectedZones().length > 1) {
|
|
8913
8935
|
return _lt("Delete columns");
|
|
@@ -8932,7 +8954,7 @@ const REMOVE_COLUMNS_NAME = (env) => {
|
|
|
8932
8954
|
const NOT_ALL_VISIBLE_ROWS_SELECTED = (env) => {
|
|
8933
8955
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
8934
8956
|
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
8935
|
-
return env.model.getters.
|
|
8957
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
|
|
8936
8958
|
};
|
|
8937
8959
|
const REMOVE_COLUMNS_ACTION = (env) => {
|
|
8938
8960
|
let columns = [...env.model.getters.getActiveCols()];
|
|
@@ -8951,7 +8973,7 @@ const REMOVE_COLUMNS_ACTION = (env) => {
|
|
|
8951
8973
|
const NOT_ALL_VISIBLE_COLS_SELECTED = (env) => {
|
|
8952
8974
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
8953
8975
|
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
8954
|
-
return env.model.getters.
|
|
8976
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
|
|
8955
8977
|
};
|
|
8956
8978
|
const INSERT_CELL_SHIFT_DOWN = (env) => {
|
|
8957
8979
|
const zone = env.model.getters.getSelectedZone();
|
|
@@ -9408,7 +9430,7 @@ const deleteValues = {
|
|
|
9408
9430
|
const deleteRows = {
|
|
9409
9431
|
name: REMOVE_ROWS_NAME,
|
|
9410
9432
|
execute: REMOVE_ROWS_ACTION,
|
|
9411
|
-
isVisible:
|
|
9433
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
9412
9434
|
};
|
|
9413
9435
|
const deleteRow = {
|
|
9414
9436
|
...deleteRows,
|
|
@@ -9421,7 +9443,7 @@ const clearRows = {
|
|
|
9421
9443
|
const deleteCols = {
|
|
9422
9444
|
name: REMOVE_COLUMNS_NAME,
|
|
9423
9445
|
execute: REMOVE_COLUMNS_ACTION,
|
|
9424
|
-
isVisible:
|
|
9446
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
9425
9447
|
};
|
|
9426
9448
|
const deleteCol = {
|
|
9427
9449
|
...deleteCols,
|
|
@@ -18469,6 +18491,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
18469
18491
|
aggregated: ev.target.checked,
|
|
18470
18492
|
});
|
|
18471
18493
|
}
|
|
18494
|
+
onUpdateCumulative(ev) {
|
|
18495
|
+
this.props.updateChart(this.props.figureId, {
|
|
18496
|
+
cumulative: ev.target.checked,
|
|
18497
|
+
});
|
|
18498
|
+
}
|
|
18472
18499
|
}
|
|
18473
18500
|
|
|
18474
18501
|
class LineChartDesignPanel extends LineBarPieDesignPanel {
|
|
@@ -20113,34 +20140,25 @@ FigureComponent.props = {
|
|
|
20113
20140
|
};
|
|
20114
20141
|
|
|
20115
20142
|
function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
|
|
20116
|
-
const _onMouseDown = (ev) => {
|
|
20117
|
-
ev.preventDefault();
|
|
20118
|
-
onMouseDown(ev);
|
|
20119
|
-
};
|
|
20120
|
-
const _onMouseMove = (ev) => {
|
|
20121
|
-
ev.preventDefault();
|
|
20122
|
-
onMouseMove(ev);
|
|
20123
|
-
};
|
|
20124
20143
|
const _onMouseUp = (ev) => {
|
|
20125
|
-
ev.preventDefault();
|
|
20126
20144
|
onMouseUp(ev);
|
|
20127
|
-
window.removeEventListener("mousedown",
|
|
20145
|
+
window.removeEventListener("mousedown", onMouseDown);
|
|
20128
20146
|
window.removeEventListener("mouseup", _onMouseUp);
|
|
20129
20147
|
window.removeEventListener("dragstart", _onDragStart);
|
|
20130
|
-
window.removeEventListener("mousemove",
|
|
20131
|
-
window.removeEventListener("wheel",
|
|
20148
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
20149
|
+
window.removeEventListener("wheel", onMouseMove);
|
|
20132
20150
|
};
|
|
20133
20151
|
function _onDragStart(ev) {
|
|
20134
20152
|
ev.preventDefault();
|
|
20135
20153
|
}
|
|
20136
|
-
window.addEventListener("mousedown",
|
|
20154
|
+
window.addEventListener("mousedown", onMouseDown);
|
|
20137
20155
|
window.addEventListener("mouseup", _onMouseUp);
|
|
20138
20156
|
window.addEventListener("dragstart", _onDragStart);
|
|
20139
|
-
window.addEventListener("mousemove",
|
|
20157
|
+
window.addEventListener("mousemove", onMouseMove);
|
|
20140
20158
|
// mouse wheel on window is by default a passive event.
|
|
20141
20159
|
// preventDefault() is not allowed in passive event handler.
|
|
20142
20160
|
// https://chromestatus.com/feature/6662647093133312
|
|
20143
|
-
window.addEventListener("wheel",
|
|
20161
|
+
window.addEventListener("wheel", onMouseMove, { passive: false });
|
|
20144
20162
|
}
|
|
20145
20163
|
/**
|
|
20146
20164
|
* Function to be used during a mousedown event, this function allows to
|
|
@@ -23701,7 +23719,8 @@ class Grid extends owl.Component {
|
|
|
23701
23719
|
}
|
|
23702
23720
|
let prevCol = col;
|
|
23703
23721
|
let prevRow = row;
|
|
23704
|
-
const onMouseMove = (col, row) => {
|
|
23722
|
+
const onMouseMove = (col, row, ev) => {
|
|
23723
|
+
ev.preventDefault();
|
|
23705
23724
|
if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
|
|
23706
23725
|
prevCol = col === -1 ? prevCol : col;
|
|
23707
23726
|
prevRow = row === -1 ? prevRow : row;
|
|
@@ -26416,6 +26435,7 @@ function convertChartData(chartData) {
|
|
|
26416
26435
|
legendPosition: chartData.legendPosition,
|
|
26417
26436
|
stacked: chartData.stacked || false,
|
|
26418
26437
|
aggregated: false,
|
|
26438
|
+
cumulative: chartData.cumulative || false,
|
|
26419
26439
|
labelsAsText: false,
|
|
26420
26440
|
};
|
|
26421
26441
|
}
|
|
@@ -31096,7 +31116,7 @@ class HeaderSizePlugin extends CorePlugin {
|
|
|
31096
31116
|
|
|
31097
31117
|
class HeaderVisibilityPlugin extends CorePlugin {
|
|
31098
31118
|
static getters = [
|
|
31099
|
-
"
|
|
31119
|
+
"checkElementsIncludeAllVisibleHeaders",
|
|
31100
31120
|
"getHiddenColsGroups",
|
|
31101
31121
|
"getHiddenRowsGroups",
|
|
31102
31122
|
"isRowHiddenByUser",
|
|
@@ -31130,7 +31150,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
31130
31150
|
if (!this.getters.tryGetSheet(cmd.sheetId)) {
|
|
31131
31151
|
return 27 /* CommandResult.InvalidSheetId */;
|
|
31132
31152
|
}
|
|
31133
|
-
if (
|
|
31153
|
+
if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
31134
31154
|
return 8 /* CommandResult.NotEnoughElements */;
|
|
31135
31155
|
}
|
|
31136
31156
|
return 0 /* CommandResult.Success */;
|
|
@@ -31180,9 +31200,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
31180
31200
|
}
|
|
31181
31201
|
return;
|
|
31182
31202
|
}
|
|
31183
|
-
|
|
31203
|
+
checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
|
|
31184
31204
|
const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
|
|
31185
|
-
return
|
|
31205
|
+
return includesAll(elements, visibleHeaders);
|
|
31186
31206
|
}
|
|
31187
31207
|
isRowHiddenByUser(sheetId, index) {
|
|
31188
31208
|
return this.hiddenHeaders[sheetId].ROW[index];
|
|
@@ -32269,6 +32289,7 @@ class SheetPlugin extends CorePlugin {
|
|
|
32269
32289
|
"getPaneDivisions",
|
|
32270
32290
|
"checkZonesExistInSheet",
|
|
32271
32291
|
"getCommandZones",
|
|
32292
|
+
"checkElementsIncludeAllNonFrozenHeaders",
|
|
32272
32293
|
];
|
|
32273
32294
|
sheetIdsMapName = {};
|
|
32274
32295
|
orderedSheetIds = [];
|
|
@@ -32325,6 +32346,9 @@ class SheetPlugin extends CorePlugin {
|
|
|
32325
32346
|
if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
|
|
32326
32347
|
return 86 /* CommandResult.InvalidHeaderIndex */;
|
|
32327
32348
|
}
|
|
32349
|
+
else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
32350
|
+
return 8 /* CommandResult.NotEnoughElements */;
|
|
32351
|
+
}
|
|
32328
32352
|
else {
|
|
32329
32353
|
return 0 /* CommandResult.Success */;
|
|
32330
32354
|
}
|
|
@@ -32607,6 +32631,20 @@ class SheetPlugin extends CorePlugin {
|
|
|
32607
32631
|
}
|
|
32608
32632
|
this.history.update("sheets", sheetId, "panes", panes);
|
|
32609
32633
|
}
|
|
32634
|
+
/**
|
|
32635
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
32636
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
32637
|
+
*/
|
|
32638
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
|
|
32639
|
+
const paneDivisions = this.getters.getPaneDivisions(sheetId);
|
|
32640
|
+
const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
|
|
32641
|
+
const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
|
|
32642
|
+
if (!startIndex) {
|
|
32643
|
+
return false;
|
|
32644
|
+
}
|
|
32645
|
+
const indicesToCheck = range(startIndex, endIndex);
|
|
32646
|
+
return includesAll(elements, indicesToCheck);
|
|
32647
|
+
}
|
|
32610
32648
|
// ---------------------------------------------------------------------------
|
|
32611
32649
|
// Row/Col manipulation
|
|
32612
32650
|
// ---------------------------------------------------------------------------
|
|
@@ -34571,6 +34609,9 @@ class InternalViewport {
|
|
|
34571
34609
|
const sheetId = this.sheetId;
|
|
34572
34610
|
this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
|
|
34573
34611
|
this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
|
|
34612
|
+
if (this.left === -1) {
|
|
34613
|
+
this.left = this.boundaries.left;
|
|
34614
|
+
}
|
|
34574
34615
|
if (this.right === -1) {
|
|
34575
34616
|
this.right = this.getters.getNumberCols(sheetId) - 1;
|
|
34576
34617
|
}
|
|
@@ -34584,6 +34625,9 @@ class InternalViewport {
|
|
|
34584
34625
|
const sheetId = this.sheetId;
|
|
34585
34626
|
this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
|
|
34586
34627
|
this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
|
|
34628
|
+
if (this.top === -1) {
|
|
34629
|
+
this.top = this.boundaries.top;
|
|
34630
|
+
}
|
|
34587
34631
|
if (this.bottom === -1) {
|
|
34588
34632
|
this.bottom = this.getters.getNumberRows(sheetId) - 1;
|
|
34589
34633
|
}
|
|
@@ -47663,6 +47707,6 @@ exports.setTranslationMethod = setTranslationMethod;
|
|
|
47663
47707
|
exports.tokenize = tokenize;
|
|
47664
47708
|
|
|
47665
47709
|
|
|
47666
|
-
__info__.version = '16.3.
|
|
47667
|
-
__info__.date = '2023-
|
|
47668
|
-
__info__.hash = '
|
|
47710
|
+
__info__.version = '16.3.10';
|
|
47711
|
+
__info__.date = '2023-09-12T11:41:57.775Z';
|
|
47712
|
+
__info__.hash = '3a95562';
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -405,6 +405,7 @@ interface LineChartDefinition {
|
|
|
405
405
|
readonly labelsAsText: boolean;
|
|
406
406
|
readonly stacked: boolean;
|
|
407
407
|
readonly aggregated?: boolean;
|
|
408
|
+
readonly cumulative: boolean;
|
|
408
409
|
}
|
|
409
410
|
type LineChartRuntime = {
|
|
410
411
|
chartJsConfig: ChartConfiguration;
|
|
@@ -471,6 +472,7 @@ interface ExcelChartDefinition {
|
|
|
471
472
|
readonly verticalAxisPosition: VerticalAxisPosition;
|
|
472
473
|
readonly legendPosition: LegendPosition;
|
|
473
474
|
readonly stacked?: boolean;
|
|
475
|
+
readonly cumulative?: boolean;
|
|
474
476
|
}
|
|
475
477
|
interface ChartCreationContext {
|
|
476
478
|
readonly range?: string[];
|
|
@@ -3420,11 +3422,11 @@ declare class HeaderSizePlugin extends CorePlugin<HeaderSizeState> implements He
|
|
|
3420
3422
|
}
|
|
3421
3423
|
|
|
3422
3424
|
declare class HeaderVisibilityPlugin extends CorePlugin {
|
|
3423
|
-
static getters: readonly ["
|
|
3425
|
+
static getters: readonly ["checkElementsIncludeAllVisibleHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
|
|
3424
3426
|
private readonly hiddenHeaders;
|
|
3425
3427
|
allowDispatch(cmd: Command): CommandResult.Success | CommandResult.NotEnoughElements | CommandResult.InvalidSheetId | CommandResult.TooManyHiddenElements | CommandResult.InvalidHeaderIndex;
|
|
3426
3428
|
handle(cmd: Command): void;
|
|
3427
|
-
|
|
3429
|
+
checkElementsIncludeAllVisibleHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
|
|
3428
3430
|
isRowHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
|
|
3429
3431
|
isColHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
|
|
3430
3432
|
getHiddenColsGroups(sheetId: UID): ConsecutiveIndexes[];
|
|
@@ -3547,7 +3549,7 @@ interface SheetState$1 {
|
|
|
3547
3549
|
readonly cellPosition: Record<UID, CellPosition | undefined>;
|
|
3548
3550
|
}
|
|
3549
3551
|
declare class SheetPlugin extends CorePlugin<SheetState$1> implements SheetState$1 {
|
|
3550
|
-
static getters: readonly ["getSheetName", "tryGetSheetName", "getSheet", "tryGetSheet", "getSheetIdByName", "getSheetIds", "getVisibleSheetIds", "isSheetVisible", "getEvaluationSheets", "doesHeaderExist", "getCell", "getCellPosition", "getColsZone", "getRowCells", "getRowsZone", "getNumberCols", "getNumberRows", "getNumberHeaders", "getGridLinesVisibility", "getNextSheetName", "isEmpty", "getSheetSize", "getSheetZone", "getPaneDivisions", "checkZonesExistInSheet", "getCommandZones"];
|
|
3552
|
+
static getters: readonly ["getSheetName", "tryGetSheetName", "getSheet", "tryGetSheet", "getSheetIdByName", "getSheetIds", "getVisibleSheetIds", "isSheetVisible", "getEvaluationSheets", "doesHeaderExist", "getCell", "getCellPosition", "getColsZone", "getRowCells", "getRowsZone", "getNumberCols", "getNumberRows", "getNumberHeaders", "getGridLinesVisibility", "getNextSheetName", "isEmpty", "getSheetSize", "getSheetZone", "getPaneDivisions", "checkZonesExistInSheet", "getCommandZones", "checkElementsIncludeAllNonFrozenHeaders"];
|
|
3551
3553
|
readonly sheetIdsMapName: Record<string, UID | undefined>;
|
|
3552
3554
|
readonly orderedSheetIds: UID[];
|
|
3553
3555
|
readonly sheets: Record<UID, Sheet | undefined>;
|
|
@@ -3589,6 +3591,11 @@ declare class SheetPlugin extends CorePlugin<SheetState$1> implements SheetState
|
|
|
3589
3591
|
getSheetZone(sheetId: UID): Zone;
|
|
3590
3592
|
getPaneDivisions(sheetId: UID): Readonly<PaneDivision>;
|
|
3591
3593
|
private setPaneDivisions;
|
|
3594
|
+
/**
|
|
3595
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
3596
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
3597
|
+
*/
|
|
3598
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
|
|
3592
3599
|
/**
|
|
3593
3600
|
* Check if a zone only contains empty cells
|
|
3594
3601
|
*/
|
|
@@ -5245,6 +5252,7 @@ declare class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
5245
5252
|
onUpdateLabelsAsText(ev: any): void;
|
|
5246
5253
|
onUpdateStacked(ev: any): void;
|
|
5247
5254
|
onUpdateAggregated(ev: any): void;
|
|
5255
|
+
onUpdateCumulative(ev: any): void;
|
|
5248
5256
|
}
|
|
5249
5257
|
|
|
5250
5258
|
interface Props$x {
|
|
@@ -7462,6 +7462,7 @@ class LineChart extends AbstractChart {
|
|
|
7462
7462
|
aggregated;
|
|
7463
7463
|
type = "line";
|
|
7464
7464
|
dataSetsHaveTitle;
|
|
7465
|
+
cumulative;
|
|
7465
7466
|
constructor(definition, sheetId, getters) {
|
|
7466
7467
|
super(definition, sheetId, getters);
|
|
7467
7468
|
this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
@@ -7473,6 +7474,7 @@ class LineChart extends AbstractChart {
|
|
|
7473
7474
|
this.stacked = definition.stacked;
|
|
7474
7475
|
this.aggregated = definition.aggregated;
|
|
7475
7476
|
this.dataSetsHaveTitle = definition.dataSetsHaveTitle;
|
|
7477
|
+
this.cumulative = definition.cumulative;
|
|
7476
7478
|
}
|
|
7477
7479
|
static validateChartDefinition(validator, definition) {
|
|
7478
7480
|
return validator.checkValidations(definition, checkDataset, checkLabelRange);
|
|
@@ -7493,6 +7495,7 @@ class LineChart extends AbstractChart {
|
|
|
7493
7495
|
labelRange: context.auxiliaryRange || undefined,
|
|
7494
7496
|
stacked: false,
|
|
7495
7497
|
aggregated: false,
|
|
7498
|
+
cumulative: false,
|
|
7496
7499
|
};
|
|
7497
7500
|
}
|
|
7498
7501
|
getDefinition() {
|
|
@@ -7513,6 +7516,7 @@ class LineChart extends AbstractChart {
|
|
|
7513
7516
|
labelsAsText: this.labelsAsText,
|
|
7514
7517
|
stacked: this.stacked,
|
|
7515
7518
|
aggregated: this.aggregated,
|
|
7519
|
+
cumulative: this.cumulative,
|
|
7516
7520
|
};
|
|
7517
7521
|
}
|
|
7518
7522
|
getContextCreation() {
|
|
@@ -7721,6 +7725,16 @@ function createLineChartRuntime(chart, getters) {
|
|
|
7721
7725
|
if (chart.stacked) {
|
|
7722
7726
|
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
7723
7727
|
}
|
|
7728
|
+
if (chart.cumulative) {
|
|
7729
|
+
let accumulator = 0;
|
|
7730
|
+
data = data.map((value) => {
|
|
7731
|
+
if (!isNaN(value)) {
|
|
7732
|
+
accumulator += parseFloat(value);
|
|
7733
|
+
return accumulator;
|
|
7734
|
+
}
|
|
7735
|
+
return value;
|
|
7736
|
+
});
|
|
7737
|
+
}
|
|
7724
7738
|
const backgroundColor = rgbaToHex(backgroundRGBA);
|
|
7725
7739
|
const dataset = {
|
|
7726
7740
|
label,
|
|
@@ -8542,6 +8556,7 @@ function getSmartChartDefinition(zone, getters) {
|
|
|
8542
8556
|
labelsAsText: false,
|
|
8543
8557
|
stacked: false,
|
|
8544
8558
|
aggregated: false,
|
|
8559
|
+
cumulative: false,
|
|
8545
8560
|
labelRange: labelRangeXc,
|
|
8546
8561
|
type: "line",
|
|
8547
8562
|
dataSetsHaveTitle,
|
|
@@ -8904,6 +8919,13 @@ const REMOVE_ROWS_ACTION = (env) => {
|
|
|
8904
8919
|
elements: rows,
|
|
8905
8920
|
});
|
|
8906
8921
|
};
|
|
8922
|
+
const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
|
|
8923
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
8924
|
+
const selectedElements = env.model.getters.getElementsFromSelection(dimension);
|
|
8925
|
+
const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
|
|
8926
|
+
const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
|
|
8927
|
+
return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
|
|
8928
|
+
};
|
|
8907
8929
|
const REMOVE_COLUMNS_NAME = (env) => {
|
|
8908
8930
|
if (env.model.getters.getSelectedZones().length > 1) {
|
|
8909
8931
|
return _lt("Delete columns");
|
|
@@ -8928,7 +8950,7 @@ const REMOVE_COLUMNS_NAME = (env) => {
|
|
|
8928
8950
|
const NOT_ALL_VISIBLE_ROWS_SELECTED = (env) => {
|
|
8929
8951
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
8930
8952
|
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
8931
|
-
return env.model.getters.
|
|
8953
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
|
|
8932
8954
|
};
|
|
8933
8955
|
const REMOVE_COLUMNS_ACTION = (env) => {
|
|
8934
8956
|
let columns = [...env.model.getters.getActiveCols()];
|
|
@@ -8947,7 +8969,7 @@ const REMOVE_COLUMNS_ACTION = (env) => {
|
|
|
8947
8969
|
const NOT_ALL_VISIBLE_COLS_SELECTED = (env) => {
|
|
8948
8970
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
8949
8971
|
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
8950
|
-
return env.model.getters.
|
|
8972
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
|
|
8951
8973
|
};
|
|
8952
8974
|
const INSERT_CELL_SHIFT_DOWN = (env) => {
|
|
8953
8975
|
const zone = env.model.getters.getSelectedZone();
|
|
@@ -9404,7 +9426,7 @@ const deleteValues = {
|
|
|
9404
9426
|
const deleteRows = {
|
|
9405
9427
|
name: REMOVE_ROWS_NAME,
|
|
9406
9428
|
execute: REMOVE_ROWS_ACTION,
|
|
9407
|
-
isVisible:
|
|
9429
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
9408
9430
|
};
|
|
9409
9431
|
const deleteRow = {
|
|
9410
9432
|
...deleteRows,
|
|
@@ -9417,7 +9439,7 @@ const clearRows = {
|
|
|
9417
9439
|
const deleteCols = {
|
|
9418
9440
|
name: REMOVE_COLUMNS_NAME,
|
|
9419
9441
|
execute: REMOVE_COLUMNS_ACTION,
|
|
9420
|
-
isVisible:
|
|
9442
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
9421
9443
|
};
|
|
9422
9444
|
const deleteCol = {
|
|
9423
9445
|
...deleteCols,
|
|
@@ -18465,6 +18487,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
18465
18487
|
aggregated: ev.target.checked,
|
|
18466
18488
|
});
|
|
18467
18489
|
}
|
|
18490
|
+
onUpdateCumulative(ev) {
|
|
18491
|
+
this.props.updateChart(this.props.figureId, {
|
|
18492
|
+
cumulative: ev.target.checked,
|
|
18493
|
+
});
|
|
18494
|
+
}
|
|
18468
18495
|
}
|
|
18469
18496
|
|
|
18470
18497
|
class LineChartDesignPanel extends LineBarPieDesignPanel {
|
|
@@ -20109,34 +20136,25 @@ FigureComponent.props = {
|
|
|
20109
20136
|
};
|
|
20110
20137
|
|
|
20111
20138
|
function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
|
|
20112
|
-
const _onMouseDown = (ev) => {
|
|
20113
|
-
ev.preventDefault();
|
|
20114
|
-
onMouseDown(ev);
|
|
20115
|
-
};
|
|
20116
|
-
const _onMouseMove = (ev) => {
|
|
20117
|
-
ev.preventDefault();
|
|
20118
|
-
onMouseMove(ev);
|
|
20119
|
-
};
|
|
20120
20139
|
const _onMouseUp = (ev) => {
|
|
20121
|
-
ev.preventDefault();
|
|
20122
20140
|
onMouseUp(ev);
|
|
20123
|
-
window.removeEventListener("mousedown",
|
|
20141
|
+
window.removeEventListener("mousedown", onMouseDown);
|
|
20124
20142
|
window.removeEventListener("mouseup", _onMouseUp);
|
|
20125
20143
|
window.removeEventListener("dragstart", _onDragStart);
|
|
20126
|
-
window.removeEventListener("mousemove",
|
|
20127
|
-
window.removeEventListener("wheel",
|
|
20144
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
20145
|
+
window.removeEventListener("wheel", onMouseMove);
|
|
20128
20146
|
};
|
|
20129
20147
|
function _onDragStart(ev) {
|
|
20130
20148
|
ev.preventDefault();
|
|
20131
20149
|
}
|
|
20132
|
-
window.addEventListener("mousedown",
|
|
20150
|
+
window.addEventListener("mousedown", onMouseDown);
|
|
20133
20151
|
window.addEventListener("mouseup", _onMouseUp);
|
|
20134
20152
|
window.addEventListener("dragstart", _onDragStart);
|
|
20135
|
-
window.addEventListener("mousemove",
|
|
20153
|
+
window.addEventListener("mousemove", onMouseMove);
|
|
20136
20154
|
// mouse wheel on window is by default a passive event.
|
|
20137
20155
|
// preventDefault() is not allowed in passive event handler.
|
|
20138
20156
|
// https://chromestatus.com/feature/6662647093133312
|
|
20139
|
-
window.addEventListener("wheel",
|
|
20157
|
+
window.addEventListener("wheel", onMouseMove, { passive: false });
|
|
20140
20158
|
}
|
|
20141
20159
|
/**
|
|
20142
20160
|
* Function to be used during a mousedown event, this function allows to
|
|
@@ -23697,7 +23715,8 @@ class Grid extends Component {
|
|
|
23697
23715
|
}
|
|
23698
23716
|
let prevCol = col;
|
|
23699
23717
|
let prevRow = row;
|
|
23700
|
-
const onMouseMove = (col, row) => {
|
|
23718
|
+
const onMouseMove = (col, row, ev) => {
|
|
23719
|
+
ev.preventDefault();
|
|
23701
23720
|
if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
|
|
23702
23721
|
prevCol = col === -1 ? prevCol : col;
|
|
23703
23722
|
prevRow = row === -1 ? prevRow : row;
|
|
@@ -26412,6 +26431,7 @@ function convertChartData(chartData) {
|
|
|
26412
26431
|
legendPosition: chartData.legendPosition,
|
|
26413
26432
|
stacked: chartData.stacked || false,
|
|
26414
26433
|
aggregated: false,
|
|
26434
|
+
cumulative: chartData.cumulative || false,
|
|
26415
26435
|
labelsAsText: false,
|
|
26416
26436
|
};
|
|
26417
26437
|
}
|
|
@@ -31092,7 +31112,7 @@ class HeaderSizePlugin extends CorePlugin {
|
|
|
31092
31112
|
|
|
31093
31113
|
class HeaderVisibilityPlugin extends CorePlugin {
|
|
31094
31114
|
static getters = [
|
|
31095
|
-
"
|
|
31115
|
+
"checkElementsIncludeAllVisibleHeaders",
|
|
31096
31116
|
"getHiddenColsGroups",
|
|
31097
31117
|
"getHiddenRowsGroups",
|
|
31098
31118
|
"isRowHiddenByUser",
|
|
@@ -31126,7 +31146,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
31126
31146
|
if (!this.getters.tryGetSheet(cmd.sheetId)) {
|
|
31127
31147
|
return 27 /* CommandResult.InvalidSheetId */;
|
|
31128
31148
|
}
|
|
31129
|
-
if (
|
|
31149
|
+
if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
31130
31150
|
return 8 /* CommandResult.NotEnoughElements */;
|
|
31131
31151
|
}
|
|
31132
31152
|
return 0 /* CommandResult.Success */;
|
|
@@ -31176,9 +31196,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
31176
31196
|
}
|
|
31177
31197
|
return;
|
|
31178
31198
|
}
|
|
31179
|
-
|
|
31199
|
+
checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
|
|
31180
31200
|
const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
|
|
31181
|
-
return
|
|
31201
|
+
return includesAll(elements, visibleHeaders);
|
|
31182
31202
|
}
|
|
31183
31203
|
isRowHiddenByUser(sheetId, index) {
|
|
31184
31204
|
return this.hiddenHeaders[sheetId].ROW[index];
|
|
@@ -32265,6 +32285,7 @@ class SheetPlugin extends CorePlugin {
|
|
|
32265
32285
|
"getPaneDivisions",
|
|
32266
32286
|
"checkZonesExistInSheet",
|
|
32267
32287
|
"getCommandZones",
|
|
32288
|
+
"checkElementsIncludeAllNonFrozenHeaders",
|
|
32268
32289
|
];
|
|
32269
32290
|
sheetIdsMapName = {};
|
|
32270
32291
|
orderedSheetIds = [];
|
|
@@ -32321,6 +32342,9 @@ class SheetPlugin extends CorePlugin {
|
|
|
32321
32342
|
if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
|
|
32322
32343
|
return 86 /* CommandResult.InvalidHeaderIndex */;
|
|
32323
32344
|
}
|
|
32345
|
+
else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
32346
|
+
return 8 /* CommandResult.NotEnoughElements */;
|
|
32347
|
+
}
|
|
32324
32348
|
else {
|
|
32325
32349
|
return 0 /* CommandResult.Success */;
|
|
32326
32350
|
}
|
|
@@ -32603,6 +32627,20 @@ class SheetPlugin extends CorePlugin {
|
|
|
32603
32627
|
}
|
|
32604
32628
|
this.history.update("sheets", sheetId, "panes", panes);
|
|
32605
32629
|
}
|
|
32630
|
+
/**
|
|
32631
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
32632
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
32633
|
+
*/
|
|
32634
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
|
|
32635
|
+
const paneDivisions = this.getters.getPaneDivisions(sheetId);
|
|
32636
|
+
const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
|
|
32637
|
+
const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
|
|
32638
|
+
if (!startIndex) {
|
|
32639
|
+
return false;
|
|
32640
|
+
}
|
|
32641
|
+
const indicesToCheck = range(startIndex, endIndex);
|
|
32642
|
+
return includesAll(elements, indicesToCheck);
|
|
32643
|
+
}
|
|
32606
32644
|
// ---------------------------------------------------------------------------
|
|
32607
32645
|
// Row/Col manipulation
|
|
32608
32646
|
// ---------------------------------------------------------------------------
|
|
@@ -34567,6 +34605,9 @@ class InternalViewport {
|
|
|
34567
34605
|
const sheetId = this.sheetId;
|
|
34568
34606
|
this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
|
|
34569
34607
|
this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
|
|
34608
|
+
if (this.left === -1) {
|
|
34609
|
+
this.left = this.boundaries.left;
|
|
34610
|
+
}
|
|
34570
34611
|
if (this.right === -1) {
|
|
34571
34612
|
this.right = this.getters.getNumberCols(sheetId) - 1;
|
|
34572
34613
|
}
|
|
@@ -34580,6 +34621,9 @@ class InternalViewport {
|
|
|
34580
34621
|
const sheetId = this.sheetId;
|
|
34581
34622
|
this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
|
|
34582
34623
|
this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
|
|
34624
|
+
if (this.top === -1) {
|
|
34625
|
+
this.top = this.boundaries.top;
|
|
34626
|
+
}
|
|
34583
34627
|
if (this.bottom === -1) {
|
|
34584
34628
|
this.bottom = this.getters.getNumberRows(sheetId) - 1;
|
|
34585
34629
|
}
|
|
@@ -47631,6 +47675,6 @@ function addFunction(functionName, functionDescription) {
|
|
|
47631
47675
|
export { AbstractChart, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, links, load, parse, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
|
|
47632
47676
|
|
|
47633
47677
|
|
|
47634
|
-
__info__.version = '16.3.
|
|
47635
|
-
__info__.date = '2023-
|
|
47636
|
-
__info__.hash = '
|
|
47678
|
+
__info__.version = '16.3.10';
|
|
47679
|
+
__info__.date = '2023-09-12T11:41:57.775Z';
|
|
47680
|
+
__info__.hash = '3a95562';
|