@odoo/o-spreadsheet 16.1.18 → 16.1.20
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 +72 -35
- package/dist/o-spreadsheet.d.ts +11 -3
- package/dist/o-spreadsheet.esm.js +72 -35
- package/dist/o-spreadsheet.iife.js +72 -35
- package/dist/o-spreadsheet.iife.min.js +230 -230
- package/package.json +1 -1
|
@@ -4830,6 +4830,7 @@ class LineChart extends AbstractChart {
|
|
|
4830
4830
|
this.labelsAsText = definition.labelsAsText;
|
|
4831
4831
|
this.stacked = definition.stacked;
|
|
4832
4832
|
this.aggregated = definition.aggregated;
|
|
4833
|
+
this.cumulative = definition.cumulative;
|
|
4833
4834
|
}
|
|
4834
4835
|
static validateChartDefinition(validator, definition) {
|
|
4835
4836
|
return validator.checkValidations(definition, checkDataset, checkLabelRange);
|
|
@@ -4850,6 +4851,7 @@ class LineChart extends AbstractChart {
|
|
|
4850
4851
|
labelRange: context.auxiliaryRange || undefined,
|
|
4851
4852
|
stacked: false,
|
|
4852
4853
|
aggregated: false,
|
|
4854
|
+
cumulative: false,
|
|
4853
4855
|
};
|
|
4854
4856
|
}
|
|
4855
4857
|
getDefinition() {
|
|
@@ -4870,6 +4872,7 @@ class LineChart extends AbstractChart {
|
|
|
4870
4872
|
labelsAsText: this.labelsAsText,
|
|
4871
4873
|
stacked: this.stacked,
|
|
4872
4874
|
aggregated: this.aggregated,
|
|
4875
|
+
cumulative: this.cumulative,
|
|
4873
4876
|
};
|
|
4874
4877
|
}
|
|
4875
4878
|
getContextCreation() {
|
|
@@ -5063,6 +5066,16 @@ function createLineChartRuntime(chart, getters) {
|
|
|
5063
5066
|
if (chart.stacked) {
|
|
5064
5067
|
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
5065
5068
|
}
|
|
5069
|
+
if (chart.cumulative) {
|
|
5070
|
+
let accumulator = 0;
|
|
5071
|
+
data = data.map((value) => {
|
|
5072
|
+
if (!isNaN(value)) {
|
|
5073
|
+
accumulator += parseFloat(value);
|
|
5074
|
+
return accumulator;
|
|
5075
|
+
}
|
|
5076
|
+
return value;
|
|
5077
|
+
});
|
|
5078
|
+
}
|
|
5066
5079
|
const backgroundColor = rgbaToHex(backgroundRGBA);
|
|
5067
5080
|
const dataset = {
|
|
5068
5081
|
label,
|
|
@@ -6404,6 +6417,7 @@ function getSmartChartDefinition(zone, getters) {
|
|
|
6404
6417
|
labelsAsText: false,
|
|
6405
6418
|
stacked: false,
|
|
6406
6419
|
aggregated: false,
|
|
6420
|
+
cumulative: false,
|
|
6407
6421
|
labelRange: labelRangeXc,
|
|
6408
6422
|
type: "line",
|
|
6409
6423
|
dataSetsHaveTitle,
|
|
@@ -6757,6 +6771,13 @@ const REMOVE_ROWS_ACTION = (env) => {
|
|
|
6757
6771
|
elements: rows,
|
|
6758
6772
|
});
|
|
6759
6773
|
};
|
|
6774
|
+
const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
|
|
6775
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
6776
|
+
const selectedElements = env.model.getters.getElementsFromSelection(dimension);
|
|
6777
|
+
const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
|
|
6778
|
+
const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
|
|
6779
|
+
return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
|
|
6780
|
+
};
|
|
6760
6781
|
const REMOVE_COLUMNS_NAME = (env) => {
|
|
6761
6782
|
if (env.model.getters.getSelectedZones().length > 1) {
|
|
6762
6783
|
return _lt("Delete columns");
|
|
@@ -7347,11 +7368,7 @@ colMenuRegistry
|
|
|
7347
7368
|
name: REMOVE_COLUMNS_NAME,
|
|
7348
7369
|
sequence: 90,
|
|
7349
7370
|
action: REMOVE_COLUMNS_ACTION,
|
|
7350
|
-
isVisible: (env) =>
|
|
7351
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
7352
|
-
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
7353
|
-
return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
|
|
7354
|
-
},
|
|
7371
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
7355
7372
|
})
|
|
7356
7373
|
.add("clear_column", {
|
|
7357
7374
|
name: DELETE_CONTENT_COLUMNS_NAME,
|
|
@@ -7365,7 +7382,7 @@ colMenuRegistry
|
|
|
7365
7382
|
isVisible: (env) => {
|
|
7366
7383
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
7367
7384
|
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
7368
|
-
return env.model.getters.
|
|
7385
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
|
|
7369
7386
|
},
|
|
7370
7387
|
separator: true,
|
|
7371
7388
|
})
|
|
@@ -7439,11 +7456,7 @@ rowMenuRegistry
|
|
|
7439
7456
|
name: REMOVE_ROWS_NAME,
|
|
7440
7457
|
sequence: 70,
|
|
7441
7458
|
action: REMOVE_ROWS_ACTION,
|
|
7442
|
-
isVisible: (env) =>
|
|
7443
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
7444
|
-
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
7445
|
-
return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
|
|
7446
|
-
},
|
|
7459
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
7447
7460
|
})
|
|
7448
7461
|
.add("clear_row", {
|
|
7449
7462
|
name: DELETE_CONTENT_ROWS_NAME,
|
|
@@ -7457,7 +7470,7 @@ rowMenuRegistry
|
|
|
7457
7470
|
isVisible: (env) => {
|
|
7458
7471
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
7459
7472
|
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
7460
|
-
return env.model.getters.
|
|
7473
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
|
|
7461
7474
|
},
|
|
7462
7475
|
separator: true,
|
|
7463
7476
|
})
|
|
@@ -7481,34 +7494,25 @@ rowMenuRegistry
|
|
|
7481
7494
|
});
|
|
7482
7495
|
|
|
7483
7496
|
function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
|
|
7484
|
-
const _onMouseDown = (ev) => {
|
|
7485
|
-
ev.preventDefault();
|
|
7486
|
-
onMouseDown(ev);
|
|
7487
|
-
};
|
|
7488
|
-
const _onMouseMove = (ev) => {
|
|
7489
|
-
ev.preventDefault();
|
|
7490
|
-
onMouseMove(ev);
|
|
7491
|
-
};
|
|
7492
7497
|
const _onMouseUp = (ev) => {
|
|
7493
|
-
ev.preventDefault();
|
|
7494
7498
|
onMouseUp(ev);
|
|
7495
|
-
window.removeEventListener("mousedown",
|
|
7499
|
+
window.removeEventListener("mousedown", onMouseDown);
|
|
7496
7500
|
window.removeEventListener("mouseup", _onMouseUp);
|
|
7497
7501
|
window.removeEventListener("dragstart", _onDragStart);
|
|
7498
|
-
window.removeEventListener("mousemove",
|
|
7499
|
-
window.removeEventListener("wheel",
|
|
7502
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
7503
|
+
window.removeEventListener("wheel", onMouseMove);
|
|
7500
7504
|
};
|
|
7501
7505
|
function _onDragStart(ev) {
|
|
7502
7506
|
ev.preventDefault();
|
|
7503
7507
|
}
|
|
7504
|
-
window.addEventListener("mousedown",
|
|
7508
|
+
window.addEventListener("mousedown", onMouseDown);
|
|
7505
7509
|
window.addEventListener("mouseup", _onMouseUp);
|
|
7506
7510
|
window.addEventListener("dragstart", _onDragStart);
|
|
7507
|
-
window.addEventListener("mousemove",
|
|
7511
|
+
window.addEventListener("mousemove", onMouseMove);
|
|
7508
7512
|
// mouse wheel on window is by default a passive event.
|
|
7509
7513
|
// preventDefault() is not allowed in passive event handler.
|
|
7510
7514
|
// https://chromestatus.com/feature/6662647093133312
|
|
7511
|
-
window.addEventListener("wheel",
|
|
7515
|
+
window.addEventListener("wheel", onMouseMove, { passive: false });
|
|
7512
7516
|
}
|
|
7513
7517
|
/**
|
|
7514
7518
|
* Function to be used during a mousedown event, this function allows to
|
|
@@ -19343,11 +19347,13 @@ topbarMenuRegistry
|
|
|
19343
19347
|
name: REMOVE_ROWS_NAME,
|
|
19344
19348
|
sequence: 80,
|
|
19345
19349
|
action: REMOVE_ROWS_ACTION,
|
|
19350
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
19346
19351
|
})
|
|
19347
19352
|
.addChild("edit_delete_column", ["edit"], {
|
|
19348
19353
|
name: REMOVE_COLUMNS_NAME,
|
|
19349
19354
|
sequence: 90,
|
|
19350
19355
|
action: REMOVE_COLUMNS_ACTION,
|
|
19356
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
19351
19357
|
})
|
|
19352
19358
|
.addChild("edit_delete_cell_shift_up", ["edit"], {
|
|
19353
19359
|
name: _lt("Delete cell and shift up"),
|
|
@@ -20527,6 +20533,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
20527
20533
|
aggregated: ev.target.checked,
|
|
20528
20534
|
});
|
|
20529
20535
|
}
|
|
20536
|
+
onUpdateCumulative(ev) {
|
|
20537
|
+
this.props.updateChart(this.props.figureId, {
|
|
20538
|
+
cumulative: ev.target.checked,
|
|
20539
|
+
});
|
|
20540
|
+
}
|
|
20530
20541
|
}
|
|
20531
20542
|
LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
|
|
20532
20543
|
|
|
@@ -23858,7 +23869,8 @@ class Grid extends owl.Component {
|
|
|
23858
23869
|
}
|
|
23859
23870
|
let prevCol = col;
|
|
23860
23871
|
let prevRow = row;
|
|
23861
|
-
const onMouseMove = (col, row) => {
|
|
23872
|
+
const onMouseMove = (col, row, ev) => {
|
|
23873
|
+
ev.preventDefault();
|
|
23862
23874
|
if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
|
|
23863
23875
|
prevCol = col === -1 ? prevCol : col;
|
|
23864
23876
|
prevRow = row === -1 ? prevRow : row;
|
|
@@ -25496,6 +25508,7 @@ function convertChartData(chartData) {
|
|
|
25496
25508
|
legendPosition: chartData.legendPosition,
|
|
25497
25509
|
stacked: chartData.stacked || false,
|
|
25498
25510
|
aggregated: false,
|
|
25511
|
+
cumulative: chartData.cumulative || false,
|
|
25499
25512
|
labelsAsText: false,
|
|
25500
25513
|
};
|
|
25501
25514
|
}
|
|
@@ -30060,7 +30073,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
30060
30073
|
if (!this.getters.tryGetSheet(cmd.sheetId)) {
|
|
30061
30074
|
return 27 /* CommandResult.InvalidSheetId */;
|
|
30062
30075
|
}
|
|
30063
|
-
if (
|
|
30076
|
+
if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
30064
30077
|
return 8 /* CommandResult.NotEnoughElements */;
|
|
30065
30078
|
}
|
|
30066
30079
|
return 0 /* CommandResult.Success */;
|
|
@@ -30110,9 +30123,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
30110
30123
|
}
|
|
30111
30124
|
return;
|
|
30112
30125
|
}
|
|
30113
|
-
|
|
30126
|
+
checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
|
|
30114
30127
|
const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
|
|
30115
|
-
return
|
|
30128
|
+
return includesAll(elements, visibleHeaders);
|
|
30116
30129
|
}
|
|
30117
30130
|
isRowHiddenByUser(sheetId, index) {
|
|
30118
30131
|
return this.hiddenHeaders[sheetId].ROW[index];
|
|
@@ -30208,7 +30221,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
30208
30221
|
}
|
|
30209
30222
|
}
|
|
30210
30223
|
HeaderVisibilityPlugin.getters = [
|
|
30211
|
-
"
|
|
30224
|
+
"checkElementsIncludeAllVisibleHeaders",
|
|
30212
30225
|
"getHiddenColsGroups",
|
|
30213
30226
|
"getHiddenRowsGroups",
|
|
30214
30227
|
"isRowHiddenByUser",
|
|
@@ -31236,6 +31249,9 @@ class SheetPlugin extends CorePlugin {
|
|
|
31236
31249
|
if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
|
|
31237
31250
|
return 86 /* CommandResult.InvalidHeaderIndex */;
|
|
31238
31251
|
}
|
|
31252
|
+
else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
31253
|
+
return 8 /* CommandResult.NotEnoughElements */;
|
|
31254
|
+
}
|
|
31239
31255
|
else {
|
|
31240
31256
|
return 0 /* CommandResult.Success */;
|
|
31241
31257
|
}
|
|
@@ -31522,6 +31538,20 @@ class SheetPlugin extends CorePlugin {
|
|
|
31522
31538
|
}
|
|
31523
31539
|
this.history.update("sheets", sheetId, "panes", panes);
|
|
31524
31540
|
}
|
|
31541
|
+
/**
|
|
31542
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
31543
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
31544
|
+
*/
|
|
31545
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
|
|
31546
|
+
const paneDivisions = this.getters.getPaneDivisions(sheetId);
|
|
31547
|
+
const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
|
|
31548
|
+
const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
|
|
31549
|
+
if (!startIndex) {
|
|
31550
|
+
return false;
|
|
31551
|
+
}
|
|
31552
|
+
const indicesToCheck = range(startIndex, endIndex);
|
|
31553
|
+
return includesAll(elements, indicesToCheck);
|
|
31554
|
+
}
|
|
31525
31555
|
// ---------------------------------------------------------------------------
|
|
31526
31556
|
// Row/Col manipulation
|
|
31527
31557
|
// ---------------------------------------------------------------------------
|
|
@@ -32054,6 +32084,7 @@ SheetPlugin.getters = [
|
|
|
32054
32084
|
"getSheetSize",
|
|
32055
32085
|
"getSheetZone",
|
|
32056
32086
|
"getPaneDivisions",
|
|
32087
|
+
"checkElementsIncludeAllNonFrozenHeaders",
|
|
32057
32088
|
];
|
|
32058
32089
|
|
|
32059
32090
|
/**
|
|
@@ -33472,6 +33503,9 @@ class InternalViewport {
|
|
|
33472
33503
|
const sheetId = this.sheetId;
|
|
33473
33504
|
this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
|
|
33474
33505
|
this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
|
|
33506
|
+
if (this.left === -1) {
|
|
33507
|
+
this.left = this.boundaries.left;
|
|
33508
|
+
}
|
|
33475
33509
|
if (this.right === -1) {
|
|
33476
33510
|
this.right = this.getters.getNumberCols(sheetId) - 1;
|
|
33477
33511
|
}
|
|
@@ -33485,6 +33519,9 @@ class InternalViewport {
|
|
|
33485
33519
|
const sheetId = this.sheetId;
|
|
33486
33520
|
this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
|
|
33487
33521
|
this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
|
|
33522
|
+
if (this.top === -1) {
|
|
33523
|
+
this.top = this.boundaries.top;
|
|
33524
|
+
}
|
|
33488
33525
|
if (this.bottom === -1) {
|
|
33489
33526
|
this.bottom = this.getters.getNumberRows(sheetId) - 1;
|
|
33490
33527
|
}
|
|
@@ -44313,6 +44350,6 @@ exports.setTranslationMethod = setTranslationMethod;
|
|
|
44313
44350
|
exports.tokenize = tokenize;
|
|
44314
44351
|
|
|
44315
44352
|
|
|
44316
|
-
__info__.version = '16.1.
|
|
44317
|
-
__info__.date = '2023-
|
|
44318
|
-
__info__.hash = '
|
|
44353
|
+
__info__.version = '16.1.20';
|
|
44354
|
+
__info__.date = '2023-09-12T11:43:40.624Z';
|
|
44355
|
+
__info__.hash = '7d7b841';
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -581,6 +581,7 @@ interface LineChartDefinition {
|
|
|
581
581
|
readonly labelsAsText: boolean;
|
|
582
582
|
readonly stacked: boolean;
|
|
583
583
|
readonly aggregated?: boolean;
|
|
584
|
+
readonly cumulative: boolean;
|
|
584
585
|
}
|
|
585
586
|
type LineChartRuntime = {
|
|
586
587
|
chartJsConfig: ChartConfiguration;
|
|
@@ -647,6 +648,7 @@ interface ExcelChartDefinition {
|
|
|
647
648
|
readonly verticalAxisPosition: VerticalAxisPosition;
|
|
648
649
|
readonly legendPosition: LegendPosition;
|
|
649
650
|
readonly stacked?: boolean;
|
|
651
|
+
readonly cumulative?: boolean;
|
|
650
652
|
}
|
|
651
653
|
interface ChartCreationContext {
|
|
652
654
|
readonly range?: string[];
|
|
@@ -3498,11 +3500,11 @@ declare class HeaderSizePlugin extends CorePlugin<HeaderSizeState> implements He
|
|
|
3498
3500
|
}
|
|
3499
3501
|
|
|
3500
3502
|
declare class HeaderVisibilityPlugin extends CorePlugin {
|
|
3501
|
-
static getters: readonly ["
|
|
3503
|
+
static getters: readonly ["checkElementsIncludeAllVisibleHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
|
|
3502
3504
|
private readonly hiddenHeaders;
|
|
3503
3505
|
allowDispatch(cmd: Command): CommandResult.Success | CommandResult.NotEnoughElements | CommandResult.InvalidSheetId | CommandResult.TooManyHiddenElements | CommandResult.InvalidHeaderIndex;
|
|
3504
3506
|
handle(cmd: Command): void;
|
|
3505
|
-
|
|
3507
|
+
checkElementsIncludeAllVisibleHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
|
|
3506
3508
|
isRowHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
|
|
3507
3509
|
isColHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
|
|
3508
3510
|
getHiddenColsGroups(sheetId: UID): ConsecutiveIndexes[];
|
|
@@ -3624,7 +3626,7 @@ interface SheetState {
|
|
|
3624
3626
|
readonly cellPosition: Record<UID, CellPosition | undefined>;
|
|
3625
3627
|
}
|
|
3626
3628
|
declare class SheetPlugin extends CorePlugin<SheetState> implements SheetState {
|
|
3627
|
-
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"];
|
|
3629
|
+
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", "checkElementsIncludeAllNonFrozenHeaders"];
|
|
3628
3630
|
readonly sheetIdsMapName: Record<string, UID | undefined>;
|
|
3629
3631
|
readonly orderedSheetIds: UID[];
|
|
3630
3632
|
readonly sheets: Record<UID, Sheet | undefined>;
|
|
@@ -3666,6 +3668,11 @@ declare class SheetPlugin extends CorePlugin<SheetState> implements SheetState {
|
|
|
3666
3668
|
getSheetZone(sheetId: UID): Zone;
|
|
3667
3669
|
getPaneDivisions(sheetId: UID): Readonly<PaneDivision>;
|
|
3668
3670
|
private setPaneDivisions;
|
|
3671
|
+
/**
|
|
3672
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
3673
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
3674
|
+
*/
|
|
3675
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
|
|
3669
3676
|
/**
|
|
3670
3677
|
* Check if a zone only contains empty cells
|
|
3671
3678
|
*/
|
|
@@ -5163,6 +5170,7 @@ declare class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
5163
5170
|
onUpdateLabelsAsText(ev: any): void;
|
|
5164
5171
|
onUpdateStacked(ev: any): void;
|
|
5165
5172
|
onUpdateAggregated(ev: any): void;
|
|
5173
|
+
onUpdateCumulative(ev: any): void;
|
|
5166
5174
|
}
|
|
5167
5175
|
|
|
5168
5176
|
interface Props$s {
|
|
@@ -4826,6 +4826,7 @@ class LineChart extends AbstractChart {
|
|
|
4826
4826
|
this.labelsAsText = definition.labelsAsText;
|
|
4827
4827
|
this.stacked = definition.stacked;
|
|
4828
4828
|
this.aggregated = definition.aggregated;
|
|
4829
|
+
this.cumulative = definition.cumulative;
|
|
4829
4830
|
}
|
|
4830
4831
|
static validateChartDefinition(validator, definition) {
|
|
4831
4832
|
return validator.checkValidations(definition, checkDataset, checkLabelRange);
|
|
@@ -4846,6 +4847,7 @@ class LineChart extends AbstractChart {
|
|
|
4846
4847
|
labelRange: context.auxiliaryRange || undefined,
|
|
4847
4848
|
stacked: false,
|
|
4848
4849
|
aggregated: false,
|
|
4850
|
+
cumulative: false,
|
|
4849
4851
|
};
|
|
4850
4852
|
}
|
|
4851
4853
|
getDefinition() {
|
|
@@ -4866,6 +4868,7 @@ class LineChart extends AbstractChart {
|
|
|
4866
4868
|
labelsAsText: this.labelsAsText,
|
|
4867
4869
|
stacked: this.stacked,
|
|
4868
4870
|
aggregated: this.aggregated,
|
|
4871
|
+
cumulative: this.cumulative,
|
|
4869
4872
|
};
|
|
4870
4873
|
}
|
|
4871
4874
|
getContextCreation() {
|
|
@@ -5059,6 +5062,16 @@ function createLineChartRuntime(chart, getters) {
|
|
|
5059
5062
|
if (chart.stacked) {
|
|
5060
5063
|
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
5061
5064
|
}
|
|
5065
|
+
if (chart.cumulative) {
|
|
5066
|
+
let accumulator = 0;
|
|
5067
|
+
data = data.map((value) => {
|
|
5068
|
+
if (!isNaN(value)) {
|
|
5069
|
+
accumulator += parseFloat(value);
|
|
5070
|
+
return accumulator;
|
|
5071
|
+
}
|
|
5072
|
+
return value;
|
|
5073
|
+
});
|
|
5074
|
+
}
|
|
5062
5075
|
const backgroundColor = rgbaToHex(backgroundRGBA);
|
|
5063
5076
|
const dataset = {
|
|
5064
5077
|
label,
|
|
@@ -6400,6 +6413,7 @@ function getSmartChartDefinition(zone, getters) {
|
|
|
6400
6413
|
labelsAsText: false,
|
|
6401
6414
|
stacked: false,
|
|
6402
6415
|
aggregated: false,
|
|
6416
|
+
cumulative: false,
|
|
6403
6417
|
labelRange: labelRangeXc,
|
|
6404
6418
|
type: "line",
|
|
6405
6419
|
dataSetsHaveTitle,
|
|
@@ -6753,6 +6767,13 @@ const REMOVE_ROWS_ACTION = (env) => {
|
|
|
6753
6767
|
elements: rows,
|
|
6754
6768
|
});
|
|
6755
6769
|
};
|
|
6770
|
+
const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
|
|
6771
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
6772
|
+
const selectedElements = env.model.getters.getElementsFromSelection(dimension);
|
|
6773
|
+
const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
|
|
6774
|
+
const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
|
|
6775
|
+
return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
|
|
6776
|
+
};
|
|
6756
6777
|
const REMOVE_COLUMNS_NAME = (env) => {
|
|
6757
6778
|
if (env.model.getters.getSelectedZones().length > 1) {
|
|
6758
6779
|
return _lt("Delete columns");
|
|
@@ -7343,11 +7364,7 @@ colMenuRegistry
|
|
|
7343
7364
|
name: REMOVE_COLUMNS_NAME,
|
|
7344
7365
|
sequence: 90,
|
|
7345
7366
|
action: REMOVE_COLUMNS_ACTION,
|
|
7346
|
-
isVisible: (env) =>
|
|
7347
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
7348
|
-
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
7349
|
-
return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
|
|
7350
|
-
},
|
|
7367
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
7351
7368
|
})
|
|
7352
7369
|
.add("clear_column", {
|
|
7353
7370
|
name: DELETE_CONTENT_COLUMNS_NAME,
|
|
@@ -7361,7 +7378,7 @@ colMenuRegistry
|
|
|
7361
7378
|
isVisible: (env) => {
|
|
7362
7379
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
7363
7380
|
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
7364
|
-
return env.model.getters.
|
|
7381
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
|
|
7365
7382
|
},
|
|
7366
7383
|
separator: true,
|
|
7367
7384
|
})
|
|
@@ -7435,11 +7452,7 @@ rowMenuRegistry
|
|
|
7435
7452
|
name: REMOVE_ROWS_NAME,
|
|
7436
7453
|
sequence: 70,
|
|
7437
7454
|
action: REMOVE_ROWS_ACTION,
|
|
7438
|
-
isVisible: (env) =>
|
|
7439
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
7440
|
-
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
7441
|
-
return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
|
|
7442
|
-
},
|
|
7455
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
7443
7456
|
})
|
|
7444
7457
|
.add("clear_row", {
|
|
7445
7458
|
name: DELETE_CONTENT_ROWS_NAME,
|
|
@@ -7453,7 +7466,7 @@ rowMenuRegistry
|
|
|
7453
7466
|
isVisible: (env) => {
|
|
7454
7467
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
7455
7468
|
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
7456
|
-
return env.model.getters.
|
|
7469
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
|
|
7457
7470
|
},
|
|
7458
7471
|
separator: true,
|
|
7459
7472
|
})
|
|
@@ -7477,34 +7490,25 @@ rowMenuRegistry
|
|
|
7477
7490
|
});
|
|
7478
7491
|
|
|
7479
7492
|
function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
|
|
7480
|
-
const _onMouseDown = (ev) => {
|
|
7481
|
-
ev.preventDefault();
|
|
7482
|
-
onMouseDown(ev);
|
|
7483
|
-
};
|
|
7484
|
-
const _onMouseMove = (ev) => {
|
|
7485
|
-
ev.preventDefault();
|
|
7486
|
-
onMouseMove(ev);
|
|
7487
|
-
};
|
|
7488
7493
|
const _onMouseUp = (ev) => {
|
|
7489
|
-
ev.preventDefault();
|
|
7490
7494
|
onMouseUp(ev);
|
|
7491
|
-
window.removeEventListener("mousedown",
|
|
7495
|
+
window.removeEventListener("mousedown", onMouseDown);
|
|
7492
7496
|
window.removeEventListener("mouseup", _onMouseUp);
|
|
7493
7497
|
window.removeEventListener("dragstart", _onDragStart);
|
|
7494
|
-
window.removeEventListener("mousemove",
|
|
7495
|
-
window.removeEventListener("wheel",
|
|
7498
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
7499
|
+
window.removeEventListener("wheel", onMouseMove);
|
|
7496
7500
|
};
|
|
7497
7501
|
function _onDragStart(ev) {
|
|
7498
7502
|
ev.preventDefault();
|
|
7499
7503
|
}
|
|
7500
|
-
window.addEventListener("mousedown",
|
|
7504
|
+
window.addEventListener("mousedown", onMouseDown);
|
|
7501
7505
|
window.addEventListener("mouseup", _onMouseUp);
|
|
7502
7506
|
window.addEventListener("dragstart", _onDragStart);
|
|
7503
|
-
window.addEventListener("mousemove",
|
|
7507
|
+
window.addEventListener("mousemove", onMouseMove);
|
|
7504
7508
|
// mouse wheel on window is by default a passive event.
|
|
7505
7509
|
// preventDefault() is not allowed in passive event handler.
|
|
7506
7510
|
// https://chromestatus.com/feature/6662647093133312
|
|
7507
|
-
window.addEventListener("wheel",
|
|
7511
|
+
window.addEventListener("wheel", onMouseMove, { passive: false });
|
|
7508
7512
|
}
|
|
7509
7513
|
/**
|
|
7510
7514
|
* Function to be used during a mousedown event, this function allows to
|
|
@@ -19339,11 +19343,13 @@ topbarMenuRegistry
|
|
|
19339
19343
|
name: REMOVE_ROWS_NAME,
|
|
19340
19344
|
sequence: 80,
|
|
19341
19345
|
action: REMOVE_ROWS_ACTION,
|
|
19346
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
19342
19347
|
})
|
|
19343
19348
|
.addChild("edit_delete_column", ["edit"], {
|
|
19344
19349
|
name: REMOVE_COLUMNS_NAME,
|
|
19345
19350
|
sequence: 90,
|
|
19346
19351
|
action: REMOVE_COLUMNS_ACTION,
|
|
19352
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
19347
19353
|
})
|
|
19348
19354
|
.addChild("edit_delete_cell_shift_up", ["edit"], {
|
|
19349
19355
|
name: _lt("Delete cell and shift up"),
|
|
@@ -20523,6 +20529,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
20523
20529
|
aggregated: ev.target.checked,
|
|
20524
20530
|
});
|
|
20525
20531
|
}
|
|
20532
|
+
onUpdateCumulative(ev) {
|
|
20533
|
+
this.props.updateChart(this.props.figureId, {
|
|
20534
|
+
cumulative: ev.target.checked,
|
|
20535
|
+
});
|
|
20536
|
+
}
|
|
20526
20537
|
}
|
|
20527
20538
|
LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
|
|
20528
20539
|
|
|
@@ -23854,7 +23865,8 @@ class Grid extends Component {
|
|
|
23854
23865
|
}
|
|
23855
23866
|
let prevCol = col;
|
|
23856
23867
|
let prevRow = row;
|
|
23857
|
-
const onMouseMove = (col, row) => {
|
|
23868
|
+
const onMouseMove = (col, row, ev) => {
|
|
23869
|
+
ev.preventDefault();
|
|
23858
23870
|
if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
|
|
23859
23871
|
prevCol = col === -1 ? prevCol : col;
|
|
23860
23872
|
prevRow = row === -1 ? prevRow : row;
|
|
@@ -25492,6 +25504,7 @@ function convertChartData(chartData) {
|
|
|
25492
25504
|
legendPosition: chartData.legendPosition,
|
|
25493
25505
|
stacked: chartData.stacked || false,
|
|
25494
25506
|
aggregated: false,
|
|
25507
|
+
cumulative: chartData.cumulative || false,
|
|
25495
25508
|
labelsAsText: false,
|
|
25496
25509
|
};
|
|
25497
25510
|
}
|
|
@@ -30056,7 +30069,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
30056
30069
|
if (!this.getters.tryGetSheet(cmd.sheetId)) {
|
|
30057
30070
|
return 27 /* CommandResult.InvalidSheetId */;
|
|
30058
30071
|
}
|
|
30059
|
-
if (
|
|
30072
|
+
if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
30060
30073
|
return 8 /* CommandResult.NotEnoughElements */;
|
|
30061
30074
|
}
|
|
30062
30075
|
return 0 /* CommandResult.Success */;
|
|
@@ -30106,9 +30119,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
30106
30119
|
}
|
|
30107
30120
|
return;
|
|
30108
30121
|
}
|
|
30109
|
-
|
|
30122
|
+
checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
|
|
30110
30123
|
const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
|
|
30111
|
-
return
|
|
30124
|
+
return includesAll(elements, visibleHeaders);
|
|
30112
30125
|
}
|
|
30113
30126
|
isRowHiddenByUser(sheetId, index) {
|
|
30114
30127
|
return this.hiddenHeaders[sheetId].ROW[index];
|
|
@@ -30204,7 +30217,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
30204
30217
|
}
|
|
30205
30218
|
}
|
|
30206
30219
|
HeaderVisibilityPlugin.getters = [
|
|
30207
|
-
"
|
|
30220
|
+
"checkElementsIncludeAllVisibleHeaders",
|
|
30208
30221
|
"getHiddenColsGroups",
|
|
30209
30222
|
"getHiddenRowsGroups",
|
|
30210
30223
|
"isRowHiddenByUser",
|
|
@@ -31232,6 +31245,9 @@ class SheetPlugin extends CorePlugin {
|
|
|
31232
31245
|
if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
|
|
31233
31246
|
return 86 /* CommandResult.InvalidHeaderIndex */;
|
|
31234
31247
|
}
|
|
31248
|
+
else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
31249
|
+
return 8 /* CommandResult.NotEnoughElements */;
|
|
31250
|
+
}
|
|
31235
31251
|
else {
|
|
31236
31252
|
return 0 /* CommandResult.Success */;
|
|
31237
31253
|
}
|
|
@@ -31518,6 +31534,20 @@ class SheetPlugin extends CorePlugin {
|
|
|
31518
31534
|
}
|
|
31519
31535
|
this.history.update("sheets", sheetId, "panes", panes);
|
|
31520
31536
|
}
|
|
31537
|
+
/**
|
|
31538
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
31539
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
31540
|
+
*/
|
|
31541
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
|
|
31542
|
+
const paneDivisions = this.getters.getPaneDivisions(sheetId);
|
|
31543
|
+
const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
|
|
31544
|
+
const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
|
|
31545
|
+
if (!startIndex) {
|
|
31546
|
+
return false;
|
|
31547
|
+
}
|
|
31548
|
+
const indicesToCheck = range(startIndex, endIndex);
|
|
31549
|
+
return includesAll(elements, indicesToCheck);
|
|
31550
|
+
}
|
|
31521
31551
|
// ---------------------------------------------------------------------------
|
|
31522
31552
|
// Row/Col manipulation
|
|
31523
31553
|
// ---------------------------------------------------------------------------
|
|
@@ -32050,6 +32080,7 @@ SheetPlugin.getters = [
|
|
|
32050
32080
|
"getSheetSize",
|
|
32051
32081
|
"getSheetZone",
|
|
32052
32082
|
"getPaneDivisions",
|
|
32083
|
+
"checkElementsIncludeAllNonFrozenHeaders",
|
|
32053
32084
|
];
|
|
32054
32085
|
|
|
32055
32086
|
/**
|
|
@@ -33468,6 +33499,9 @@ class InternalViewport {
|
|
|
33468
33499
|
const sheetId = this.sheetId;
|
|
33469
33500
|
this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
|
|
33470
33501
|
this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
|
|
33502
|
+
if (this.left === -1) {
|
|
33503
|
+
this.left = this.boundaries.left;
|
|
33504
|
+
}
|
|
33471
33505
|
if (this.right === -1) {
|
|
33472
33506
|
this.right = this.getters.getNumberCols(sheetId) - 1;
|
|
33473
33507
|
}
|
|
@@ -33481,6 +33515,9 @@ class InternalViewport {
|
|
|
33481
33515
|
const sheetId = this.sheetId;
|
|
33482
33516
|
this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
|
|
33483
33517
|
this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
|
|
33518
|
+
if (this.top === -1) {
|
|
33519
|
+
this.top = this.boundaries.top;
|
|
33520
|
+
}
|
|
33484
33521
|
if (this.bottom === -1) {
|
|
33485
33522
|
this.bottom = this.getters.getNumberRows(sheetId) - 1;
|
|
33486
33523
|
}
|
|
@@ -44281,6 +44318,6 @@ function addFunction(functionName, functionDescription) {
|
|
|
44281
44318
|
export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, 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, setTranslationMethod, tokenize };
|
|
44282
44319
|
|
|
44283
44320
|
|
|
44284
|
-
__info__.version = '16.1.
|
|
44285
|
-
__info__.date = '2023-
|
|
44286
|
-
__info__.hash = '
|
|
44321
|
+
__info__.version = '16.1.20';
|
|
44322
|
+
__info__.date = '2023-09-12T11:43:40.624Z';
|
|
44323
|
+
__info__.hash = '7d7b841';
|