@odoo/o-spreadsheet 16.0.17 → 16.0.18
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 +64 -19
- package/dist/o-spreadsheet.d.ts +11 -3
- package/dist/o-spreadsheet.esm.js +64 -19
- package/dist/o-spreadsheet.iife.js +64 -19
- package/dist/o-spreadsheet.iife.min.js +238 -237
- package/package.json +1 -1
|
@@ -3519,6 +3519,7 @@ css /* scss */ `
|
|
|
3519
3519
|
background-color: white;
|
|
3520
3520
|
border-left: 3px solid red;
|
|
3521
3521
|
padding: 10px;
|
|
3522
|
+
overflow-wrap: break-word;
|
|
3522
3523
|
}
|
|
3523
3524
|
`;
|
|
3524
3525
|
class ErrorToolTip extends owl.Component {
|
|
@@ -5035,6 +5036,13 @@ const REMOVE_ROWS_ACTION = (env) => {
|
|
|
5035
5036
|
elements: rows,
|
|
5036
5037
|
});
|
|
5037
5038
|
};
|
|
5039
|
+
const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
|
|
5040
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
5041
|
+
const selectedElements = env.model.getters.getElementsFromSelection(dimension);
|
|
5042
|
+
const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
|
|
5043
|
+
const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
|
|
5044
|
+
return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
|
|
5045
|
+
};
|
|
5038
5046
|
const REMOVE_COLUMNS_NAME = (env) => {
|
|
5039
5047
|
if (env.model.getters.getSelectedZones().length > 1) {
|
|
5040
5048
|
return _lt("Delete columns");
|
|
@@ -5639,11 +5647,7 @@ colMenuRegistry
|
|
|
5639
5647
|
name: REMOVE_COLUMNS_NAME,
|
|
5640
5648
|
sequence: 90,
|
|
5641
5649
|
action: REMOVE_COLUMNS_ACTION,
|
|
5642
|
-
isVisible: (env) =>
|
|
5643
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
5644
|
-
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
5645
|
-
return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
|
|
5646
|
-
},
|
|
5650
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
5647
5651
|
})
|
|
5648
5652
|
.add("clear_column", {
|
|
5649
5653
|
name: DELETE_CONTENT_COLUMNS_NAME,
|
|
@@ -5657,7 +5661,7 @@ colMenuRegistry
|
|
|
5657
5661
|
isVisible: (env) => {
|
|
5658
5662
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
5659
5663
|
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
5660
|
-
return env.model.getters.
|
|
5664
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
|
|
5661
5665
|
},
|
|
5662
5666
|
separator: true,
|
|
5663
5667
|
})
|
|
@@ -5731,11 +5735,7 @@ rowMenuRegistry
|
|
|
5731
5735
|
name: REMOVE_ROWS_NAME,
|
|
5732
5736
|
sequence: 70,
|
|
5733
5737
|
action: REMOVE_ROWS_ACTION,
|
|
5734
|
-
isVisible: (env) =>
|
|
5735
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
5736
|
-
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
5737
|
-
return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
|
|
5738
|
-
},
|
|
5738
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
5739
5739
|
})
|
|
5740
5740
|
.add("clear_row", {
|
|
5741
5741
|
name: DELETE_CONTENT_ROWS_NAME,
|
|
@@ -5749,7 +5749,7 @@ rowMenuRegistry
|
|
|
5749
5749
|
isVisible: (env) => {
|
|
5750
5750
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
5751
5751
|
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
5752
|
-
return env.model.getters.
|
|
5752
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
|
|
5753
5753
|
},
|
|
5754
5754
|
separator: true,
|
|
5755
5755
|
})
|
|
@@ -6043,11 +6043,13 @@ topbarMenuRegistry
|
|
|
6043
6043
|
name: REMOVE_ROWS_NAME,
|
|
6044
6044
|
sequence: 80,
|
|
6045
6045
|
action: REMOVE_ROWS_ACTION,
|
|
6046
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
6046
6047
|
})
|
|
6047
6048
|
.addChild("edit_delete_column", ["edit"], {
|
|
6048
6049
|
name: REMOVE_COLUMNS_NAME,
|
|
6049
6050
|
sequence: 90,
|
|
6050
6051
|
action: REMOVE_COLUMNS_ACTION,
|
|
6052
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
6051
6053
|
})
|
|
6052
6054
|
.addChild("edit_delete_cell_shift_up", ["edit"], {
|
|
6053
6055
|
name: _lt("Delete cell and shift up"),
|
|
@@ -7814,6 +7816,7 @@ class LineChart extends AbstractChart {
|
|
|
7814
7816
|
this.legendPosition = definition.legendPosition;
|
|
7815
7817
|
this.labelsAsText = definition.labelsAsText;
|
|
7816
7818
|
this.stacked = definition.stacked;
|
|
7819
|
+
this.cumulative = definition.cumulative;
|
|
7817
7820
|
}
|
|
7818
7821
|
static validateChartDefinition(validator, definition) {
|
|
7819
7822
|
return validator.checkValidations(definition, checkDataset, checkLabelRange);
|
|
@@ -7833,6 +7836,7 @@ class LineChart extends AbstractChart {
|
|
|
7833
7836
|
verticalAxisPosition: "left",
|
|
7834
7837
|
labelRange: context.auxiliaryRange || undefined,
|
|
7835
7838
|
stacked: false,
|
|
7839
|
+
cumulative: false,
|
|
7836
7840
|
};
|
|
7837
7841
|
}
|
|
7838
7842
|
getDefinition() {
|
|
@@ -7852,6 +7856,7 @@ class LineChart extends AbstractChart {
|
|
|
7852
7856
|
title: this.title,
|
|
7853
7857
|
labelsAsText: this.labelsAsText,
|
|
7854
7858
|
stacked: this.stacked,
|
|
7859
|
+
cumulative: this.cumulative,
|
|
7855
7860
|
};
|
|
7856
7861
|
}
|
|
7857
7862
|
getContextCreation() {
|
|
@@ -8036,6 +8041,16 @@ function createLineChartRuntime(chart, getters) {
|
|
|
8036
8041
|
if (chart.stacked) {
|
|
8037
8042
|
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
8038
8043
|
}
|
|
8044
|
+
if (chart.cumulative) {
|
|
8045
|
+
let accumulator = 0;
|
|
8046
|
+
data = data.map((value) => {
|
|
8047
|
+
if (!isNaN(value)) {
|
|
8048
|
+
accumulator += parseFloat(value);
|
|
8049
|
+
return accumulator;
|
|
8050
|
+
}
|
|
8051
|
+
return value;
|
|
8052
|
+
});
|
|
8053
|
+
}
|
|
8039
8054
|
const backgroundColor = rgbaToHex(backgroundRGBA);
|
|
8040
8055
|
const dataset = {
|
|
8041
8056
|
label,
|
|
@@ -8821,6 +8836,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
8821
8836
|
stacked: ev.target.checked,
|
|
8822
8837
|
});
|
|
8823
8838
|
}
|
|
8839
|
+
onUpdateCumulative(ev) {
|
|
8840
|
+
this.props.updateChart(this.props.figureId, {
|
|
8841
|
+
cumulative: ev.target.checked,
|
|
8842
|
+
});
|
|
8843
|
+
}
|
|
8824
8844
|
}
|
|
8825
8845
|
LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
|
|
8826
8846
|
|
|
@@ -24650,6 +24670,7 @@ function convertChartData(chartData) {
|
|
|
24650
24670
|
verticalAxisPosition: chartData.verticalAxisPosition,
|
|
24651
24671
|
legendPosition: chartData.legendPosition,
|
|
24652
24672
|
stacked: chartData.stacked || false,
|
|
24673
|
+
cumulative: chartData.cumulative || false,
|
|
24653
24674
|
labelsAsText: false,
|
|
24654
24675
|
};
|
|
24655
24676
|
}
|
|
@@ -29142,7 +29163,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29142
29163
|
if (!this.getters.tryGetSheet(cmd.sheetId)) {
|
|
29143
29164
|
return 27 /* CommandResult.InvalidSheetId */;
|
|
29144
29165
|
}
|
|
29145
|
-
if (
|
|
29166
|
+
if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
29146
29167
|
return 8 /* CommandResult.NotEnoughElements */;
|
|
29147
29168
|
}
|
|
29148
29169
|
return 0 /* CommandResult.Success */;
|
|
@@ -29192,9 +29213,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29192
29213
|
}
|
|
29193
29214
|
return;
|
|
29194
29215
|
}
|
|
29195
|
-
|
|
29216
|
+
checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
|
|
29196
29217
|
const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
|
|
29197
|
-
return
|
|
29218
|
+
return includesAll(elements, visibleHeaders);
|
|
29198
29219
|
}
|
|
29199
29220
|
isRowHiddenByUser(sheetId, index) {
|
|
29200
29221
|
return this.hiddenHeaders[sheetId].ROW[index];
|
|
@@ -29290,7 +29311,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29290
29311
|
}
|
|
29291
29312
|
}
|
|
29292
29313
|
HeaderVisibilityPlugin.getters = [
|
|
29293
|
-
"
|
|
29314
|
+
"checkElementsIncludeAllVisibleHeaders",
|
|
29294
29315
|
"getHiddenColsGroups",
|
|
29295
29316
|
"getHiddenRowsGroups",
|
|
29296
29317
|
"isRowHiddenByUser",
|
|
@@ -29809,6 +29830,9 @@ class SheetPlugin extends CorePlugin {
|
|
|
29809
29830
|
if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
|
|
29810
29831
|
return 85 /* CommandResult.InvalidHeaderIndex */;
|
|
29811
29832
|
}
|
|
29833
|
+
else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
29834
|
+
return 8 /* CommandResult.NotEnoughElements */;
|
|
29835
|
+
}
|
|
29812
29836
|
else {
|
|
29813
29837
|
return 0 /* CommandResult.Success */;
|
|
29814
29838
|
}
|
|
@@ -30108,6 +30132,20 @@ class SheetPlugin extends CorePlugin {
|
|
|
30108
30132
|
}
|
|
30109
30133
|
this.history.update("sheets", sheetId, "panes", panes);
|
|
30110
30134
|
}
|
|
30135
|
+
/**
|
|
30136
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
30137
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
30138
|
+
*/
|
|
30139
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
|
|
30140
|
+
const paneDivisions = this.getters.getPaneDivisions(sheetId);
|
|
30141
|
+
const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
|
|
30142
|
+
const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
|
|
30143
|
+
if (!startIndex) {
|
|
30144
|
+
return false;
|
|
30145
|
+
}
|
|
30146
|
+
const indicesToCheck = range(startIndex, endIndex);
|
|
30147
|
+
return includesAll(elements, indicesToCheck);
|
|
30148
|
+
}
|
|
30111
30149
|
// ---------------------------------------------------------------------------
|
|
30112
30150
|
// Row/Col manipulation
|
|
30113
30151
|
// ---------------------------------------------------------------------------
|
|
@@ -30642,6 +30680,7 @@ SheetPlugin.getters = [
|
|
|
30642
30680
|
"getSheetSize",
|
|
30643
30681
|
"getSheetZone",
|
|
30644
30682
|
"getPaneDivisions",
|
|
30683
|
+
"checkElementsIncludeAllNonFrozenHeaders",
|
|
30645
30684
|
];
|
|
30646
30685
|
|
|
30647
30686
|
/**
|
|
@@ -36435,6 +36474,9 @@ class InternalViewport {
|
|
|
36435
36474
|
const sheetId = this.sheetId;
|
|
36436
36475
|
this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
|
|
36437
36476
|
this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
|
|
36477
|
+
if (this.left === -1) {
|
|
36478
|
+
this.left = this.boundaries.left;
|
|
36479
|
+
}
|
|
36438
36480
|
if (this.right === -1) {
|
|
36439
36481
|
this.right = this.getters.getNumberCols(sheetId) - 1;
|
|
36440
36482
|
}
|
|
@@ -36448,6 +36490,9 @@ class InternalViewport {
|
|
|
36448
36490
|
const sheetId = this.sheetId;
|
|
36449
36491
|
this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
|
|
36450
36492
|
this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
|
|
36493
|
+
if (this.top === -1) {
|
|
36494
|
+
this.top = this.boundaries.top;
|
|
36495
|
+
}
|
|
36451
36496
|
if (this.bottom === -1) {
|
|
36452
36497
|
this.bottom = this.getters.getNumberRows(sheetId) - 1;
|
|
36453
36498
|
}
|
|
@@ -42861,6 +42906,6 @@ exports.setTranslationMethod = setTranslationMethod;
|
|
|
42861
42906
|
exports.tokenize = tokenize;
|
|
42862
42907
|
|
|
42863
42908
|
|
|
42864
|
-
__info__.version = '16.0.
|
|
42865
|
-
__info__.date = '2023-
|
|
42866
|
-
__info__.hash = '
|
|
42909
|
+
__info__.version = '16.0.18';
|
|
42910
|
+
__info__.date = '2023-09-12T11:42:03.083Z';
|
|
42911
|
+
__info__.hash = '41fd4fa';
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -600,6 +600,7 @@ interface LineChartDefinition {
|
|
|
600
600
|
readonly legendPosition: LegendPosition;
|
|
601
601
|
readonly labelsAsText: boolean;
|
|
602
602
|
readonly stacked: boolean;
|
|
603
|
+
readonly cumulative: boolean;
|
|
603
604
|
}
|
|
604
605
|
type LineChartRuntime = {
|
|
605
606
|
chartJsConfig: ChartConfiguration;
|
|
@@ -665,6 +666,7 @@ interface ExcelChartDefinition {
|
|
|
665
666
|
readonly verticalAxisPosition: VerticalAxisPosition;
|
|
666
667
|
readonly legendPosition: LegendPosition;
|
|
667
668
|
readonly stacked?: boolean;
|
|
669
|
+
readonly cumulative?: boolean;
|
|
668
670
|
}
|
|
669
671
|
interface ChartCreationContext {
|
|
670
672
|
readonly range?: string[];
|
|
@@ -3390,11 +3392,11 @@ declare class HeaderSizePlugin extends CorePlugin<HeaderSizeState> implements He
|
|
|
3390
3392
|
}
|
|
3391
3393
|
|
|
3392
3394
|
declare class HeaderVisibilityPlugin extends CorePlugin {
|
|
3393
|
-
static getters: readonly ["
|
|
3395
|
+
static getters: readonly ["checkElementsIncludeAllVisibleHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
|
|
3394
3396
|
private readonly hiddenHeaders;
|
|
3395
3397
|
allowDispatch(cmd: Command): CommandResult.Success | CommandResult.NotEnoughElements | CommandResult.InvalidSheetId | CommandResult.TooManyHiddenElements | CommandResult.InvalidHeaderIndex;
|
|
3396
3398
|
handle(cmd: Command): void;
|
|
3397
|
-
|
|
3399
|
+
checkElementsIncludeAllVisibleHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
|
|
3398
3400
|
isRowHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
|
|
3399
3401
|
isColHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
|
|
3400
3402
|
getHiddenColsGroups(sheetId: UID): ConsecutiveIndexes[];
|
|
@@ -3489,7 +3491,7 @@ interface SheetState {
|
|
|
3489
3491
|
readonly cellPosition: Record<UID, CellPosition | undefined>;
|
|
3490
3492
|
}
|
|
3491
3493
|
declare class SheetPlugin extends CorePlugin<SheetState> implements SheetState {
|
|
3492
|
-
static getters: readonly ["getSheetName", "tryGetSheetName", "getSheet", "tryGetSheet", "getSheetIdByName", "getSheetIds", "getVisibleSheetIds", "isSheetVisible", "getEvaluationSheets", "doesHeaderExist", "getCell", "getCellsInZone", "getCellPosition", "getColCells", "getColsZone", "getRowCells", "getRowsZone", "getNumberCols", "getNumberRows", "getNumberHeaders", "getGridLinesVisibility", "getNextSheetName", "isEmpty", "getSheetSize", "getSheetZone", "getPaneDivisions"];
|
|
3494
|
+
static getters: readonly ["getSheetName", "tryGetSheetName", "getSheet", "tryGetSheet", "getSheetIdByName", "getSheetIds", "getVisibleSheetIds", "isSheetVisible", "getEvaluationSheets", "doesHeaderExist", "getCell", "getCellsInZone", "getCellPosition", "getColCells", "getColsZone", "getRowCells", "getRowsZone", "getNumberCols", "getNumberRows", "getNumberHeaders", "getGridLinesVisibility", "getNextSheetName", "isEmpty", "getSheetSize", "getSheetZone", "getPaneDivisions", "checkElementsIncludeAllNonFrozenHeaders"];
|
|
3493
3495
|
readonly sheetIdsMapName: Record<string, UID | undefined>;
|
|
3494
3496
|
readonly orderedSheetIds: UID[];
|
|
3495
3497
|
readonly sheets: Record<UID, Sheet | undefined>;
|
|
@@ -3536,6 +3538,11 @@ declare class SheetPlugin extends CorePlugin<SheetState> implements SheetState {
|
|
|
3536
3538
|
getSheetZone(sheetId: UID): Zone;
|
|
3537
3539
|
getPaneDivisions(sheetId: UID): Readonly<PaneDivision>;
|
|
3538
3540
|
private setPaneDivisions;
|
|
3541
|
+
/**
|
|
3542
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
3543
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
3544
|
+
*/
|
|
3545
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
|
|
3539
3546
|
/**
|
|
3540
3547
|
* Check if a zone only contains empty cells
|
|
3541
3548
|
*/
|
|
@@ -5004,6 +5011,7 @@ declare class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
5004
5011
|
get canTreatLabelsAsText(): boolean;
|
|
5005
5012
|
onUpdateLabelsAsText(ev: any): void;
|
|
5006
5013
|
onUpdateStacked(ev: any): void;
|
|
5014
|
+
onUpdateCumulative(ev: any): void;
|
|
5007
5015
|
}
|
|
5008
5016
|
|
|
5009
5017
|
interface Props$t {
|
|
@@ -3515,6 +3515,7 @@ css /* scss */ `
|
|
|
3515
3515
|
background-color: white;
|
|
3516
3516
|
border-left: 3px solid red;
|
|
3517
3517
|
padding: 10px;
|
|
3518
|
+
overflow-wrap: break-word;
|
|
3518
3519
|
}
|
|
3519
3520
|
`;
|
|
3520
3521
|
class ErrorToolTip extends Component {
|
|
@@ -5031,6 +5032,13 @@ const REMOVE_ROWS_ACTION = (env) => {
|
|
|
5031
5032
|
elements: rows,
|
|
5032
5033
|
});
|
|
5033
5034
|
};
|
|
5035
|
+
const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
|
|
5036
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
5037
|
+
const selectedElements = env.model.getters.getElementsFromSelection(dimension);
|
|
5038
|
+
const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
|
|
5039
|
+
const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
|
|
5040
|
+
return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
|
|
5041
|
+
};
|
|
5034
5042
|
const REMOVE_COLUMNS_NAME = (env) => {
|
|
5035
5043
|
if (env.model.getters.getSelectedZones().length > 1) {
|
|
5036
5044
|
return _lt("Delete columns");
|
|
@@ -5635,11 +5643,7 @@ colMenuRegistry
|
|
|
5635
5643
|
name: REMOVE_COLUMNS_NAME,
|
|
5636
5644
|
sequence: 90,
|
|
5637
5645
|
action: REMOVE_COLUMNS_ACTION,
|
|
5638
|
-
isVisible: (env) =>
|
|
5639
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
5640
|
-
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
5641
|
-
return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
|
|
5642
|
-
},
|
|
5646
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
5643
5647
|
})
|
|
5644
5648
|
.add("clear_column", {
|
|
5645
5649
|
name: DELETE_CONTENT_COLUMNS_NAME,
|
|
@@ -5653,7 +5657,7 @@ colMenuRegistry
|
|
|
5653
5657
|
isVisible: (env) => {
|
|
5654
5658
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
5655
5659
|
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
5656
|
-
return env.model.getters.
|
|
5660
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
|
|
5657
5661
|
},
|
|
5658
5662
|
separator: true,
|
|
5659
5663
|
})
|
|
@@ -5727,11 +5731,7 @@ rowMenuRegistry
|
|
|
5727
5731
|
name: REMOVE_ROWS_NAME,
|
|
5728
5732
|
sequence: 70,
|
|
5729
5733
|
action: REMOVE_ROWS_ACTION,
|
|
5730
|
-
isVisible: (env) =>
|
|
5731
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
5732
|
-
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
5733
|
-
return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
|
|
5734
|
-
},
|
|
5734
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
5735
5735
|
})
|
|
5736
5736
|
.add("clear_row", {
|
|
5737
5737
|
name: DELETE_CONTENT_ROWS_NAME,
|
|
@@ -5745,7 +5745,7 @@ rowMenuRegistry
|
|
|
5745
5745
|
isVisible: (env) => {
|
|
5746
5746
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
5747
5747
|
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
5748
|
-
return env.model.getters.
|
|
5748
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
|
|
5749
5749
|
},
|
|
5750
5750
|
separator: true,
|
|
5751
5751
|
})
|
|
@@ -6039,11 +6039,13 @@ topbarMenuRegistry
|
|
|
6039
6039
|
name: REMOVE_ROWS_NAME,
|
|
6040
6040
|
sequence: 80,
|
|
6041
6041
|
action: REMOVE_ROWS_ACTION,
|
|
6042
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
6042
6043
|
})
|
|
6043
6044
|
.addChild("edit_delete_column", ["edit"], {
|
|
6044
6045
|
name: REMOVE_COLUMNS_NAME,
|
|
6045
6046
|
sequence: 90,
|
|
6046
6047
|
action: REMOVE_COLUMNS_ACTION,
|
|
6048
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
6047
6049
|
})
|
|
6048
6050
|
.addChild("edit_delete_cell_shift_up", ["edit"], {
|
|
6049
6051
|
name: _lt("Delete cell and shift up"),
|
|
@@ -7810,6 +7812,7 @@ class LineChart extends AbstractChart {
|
|
|
7810
7812
|
this.legendPosition = definition.legendPosition;
|
|
7811
7813
|
this.labelsAsText = definition.labelsAsText;
|
|
7812
7814
|
this.stacked = definition.stacked;
|
|
7815
|
+
this.cumulative = definition.cumulative;
|
|
7813
7816
|
}
|
|
7814
7817
|
static validateChartDefinition(validator, definition) {
|
|
7815
7818
|
return validator.checkValidations(definition, checkDataset, checkLabelRange);
|
|
@@ -7829,6 +7832,7 @@ class LineChart extends AbstractChart {
|
|
|
7829
7832
|
verticalAxisPosition: "left",
|
|
7830
7833
|
labelRange: context.auxiliaryRange || undefined,
|
|
7831
7834
|
stacked: false,
|
|
7835
|
+
cumulative: false,
|
|
7832
7836
|
};
|
|
7833
7837
|
}
|
|
7834
7838
|
getDefinition() {
|
|
@@ -7848,6 +7852,7 @@ class LineChart extends AbstractChart {
|
|
|
7848
7852
|
title: this.title,
|
|
7849
7853
|
labelsAsText: this.labelsAsText,
|
|
7850
7854
|
stacked: this.stacked,
|
|
7855
|
+
cumulative: this.cumulative,
|
|
7851
7856
|
};
|
|
7852
7857
|
}
|
|
7853
7858
|
getContextCreation() {
|
|
@@ -8032,6 +8037,16 @@ function createLineChartRuntime(chart, getters) {
|
|
|
8032
8037
|
if (chart.stacked) {
|
|
8033
8038
|
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
8034
8039
|
}
|
|
8040
|
+
if (chart.cumulative) {
|
|
8041
|
+
let accumulator = 0;
|
|
8042
|
+
data = data.map((value) => {
|
|
8043
|
+
if (!isNaN(value)) {
|
|
8044
|
+
accumulator += parseFloat(value);
|
|
8045
|
+
return accumulator;
|
|
8046
|
+
}
|
|
8047
|
+
return value;
|
|
8048
|
+
});
|
|
8049
|
+
}
|
|
8035
8050
|
const backgroundColor = rgbaToHex(backgroundRGBA);
|
|
8036
8051
|
const dataset = {
|
|
8037
8052
|
label,
|
|
@@ -8817,6 +8832,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
8817
8832
|
stacked: ev.target.checked,
|
|
8818
8833
|
});
|
|
8819
8834
|
}
|
|
8835
|
+
onUpdateCumulative(ev) {
|
|
8836
|
+
this.props.updateChart(this.props.figureId, {
|
|
8837
|
+
cumulative: ev.target.checked,
|
|
8838
|
+
});
|
|
8839
|
+
}
|
|
8820
8840
|
}
|
|
8821
8841
|
LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
|
|
8822
8842
|
|
|
@@ -24646,6 +24666,7 @@ function convertChartData(chartData) {
|
|
|
24646
24666
|
verticalAxisPosition: chartData.verticalAxisPosition,
|
|
24647
24667
|
legendPosition: chartData.legendPosition,
|
|
24648
24668
|
stacked: chartData.stacked || false,
|
|
24669
|
+
cumulative: chartData.cumulative || false,
|
|
24649
24670
|
labelsAsText: false,
|
|
24650
24671
|
};
|
|
24651
24672
|
}
|
|
@@ -29138,7 +29159,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29138
29159
|
if (!this.getters.tryGetSheet(cmd.sheetId)) {
|
|
29139
29160
|
return 27 /* CommandResult.InvalidSheetId */;
|
|
29140
29161
|
}
|
|
29141
|
-
if (
|
|
29162
|
+
if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
29142
29163
|
return 8 /* CommandResult.NotEnoughElements */;
|
|
29143
29164
|
}
|
|
29144
29165
|
return 0 /* CommandResult.Success */;
|
|
@@ -29188,9 +29209,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29188
29209
|
}
|
|
29189
29210
|
return;
|
|
29190
29211
|
}
|
|
29191
|
-
|
|
29212
|
+
checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
|
|
29192
29213
|
const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
|
|
29193
|
-
return
|
|
29214
|
+
return includesAll(elements, visibleHeaders);
|
|
29194
29215
|
}
|
|
29195
29216
|
isRowHiddenByUser(sheetId, index) {
|
|
29196
29217
|
return this.hiddenHeaders[sheetId].ROW[index];
|
|
@@ -29286,7 +29307,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29286
29307
|
}
|
|
29287
29308
|
}
|
|
29288
29309
|
HeaderVisibilityPlugin.getters = [
|
|
29289
|
-
"
|
|
29310
|
+
"checkElementsIncludeAllVisibleHeaders",
|
|
29290
29311
|
"getHiddenColsGroups",
|
|
29291
29312
|
"getHiddenRowsGroups",
|
|
29292
29313
|
"isRowHiddenByUser",
|
|
@@ -29805,6 +29826,9 @@ class SheetPlugin extends CorePlugin {
|
|
|
29805
29826
|
if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
|
|
29806
29827
|
return 85 /* CommandResult.InvalidHeaderIndex */;
|
|
29807
29828
|
}
|
|
29829
|
+
else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
29830
|
+
return 8 /* CommandResult.NotEnoughElements */;
|
|
29831
|
+
}
|
|
29808
29832
|
else {
|
|
29809
29833
|
return 0 /* CommandResult.Success */;
|
|
29810
29834
|
}
|
|
@@ -30104,6 +30128,20 @@ class SheetPlugin extends CorePlugin {
|
|
|
30104
30128
|
}
|
|
30105
30129
|
this.history.update("sheets", sheetId, "panes", panes);
|
|
30106
30130
|
}
|
|
30131
|
+
/**
|
|
30132
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
30133
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
30134
|
+
*/
|
|
30135
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
|
|
30136
|
+
const paneDivisions = this.getters.getPaneDivisions(sheetId);
|
|
30137
|
+
const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
|
|
30138
|
+
const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
|
|
30139
|
+
if (!startIndex) {
|
|
30140
|
+
return false;
|
|
30141
|
+
}
|
|
30142
|
+
const indicesToCheck = range(startIndex, endIndex);
|
|
30143
|
+
return includesAll(elements, indicesToCheck);
|
|
30144
|
+
}
|
|
30107
30145
|
// ---------------------------------------------------------------------------
|
|
30108
30146
|
// Row/Col manipulation
|
|
30109
30147
|
// ---------------------------------------------------------------------------
|
|
@@ -30638,6 +30676,7 @@ SheetPlugin.getters = [
|
|
|
30638
30676
|
"getSheetSize",
|
|
30639
30677
|
"getSheetZone",
|
|
30640
30678
|
"getPaneDivisions",
|
|
30679
|
+
"checkElementsIncludeAllNonFrozenHeaders",
|
|
30641
30680
|
];
|
|
30642
30681
|
|
|
30643
30682
|
/**
|
|
@@ -36431,6 +36470,9 @@ class InternalViewport {
|
|
|
36431
36470
|
const sheetId = this.sheetId;
|
|
36432
36471
|
this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
|
|
36433
36472
|
this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
|
|
36473
|
+
if (this.left === -1) {
|
|
36474
|
+
this.left = this.boundaries.left;
|
|
36475
|
+
}
|
|
36434
36476
|
if (this.right === -1) {
|
|
36435
36477
|
this.right = this.getters.getNumberCols(sheetId) - 1;
|
|
36436
36478
|
}
|
|
@@ -36444,6 +36486,9 @@ class InternalViewport {
|
|
|
36444
36486
|
const sheetId = this.sheetId;
|
|
36445
36487
|
this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
|
|
36446
36488
|
this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
|
|
36489
|
+
if (this.top === -1) {
|
|
36490
|
+
this.top = this.boundaries.top;
|
|
36491
|
+
}
|
|
36447
36492
|
if (this.bottom === -1) {
|
|
36448
36493
|
this.bottom = this.getters.getNumberRows(sheetId) - 1;
|
|
36449
36494
|
}
|
|
@@ -42829,6 +42874,6 @@ function addFunction(functionName, functionDescription) {
|
|
|
42829
42874
|
export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, cellTypes, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, load, parse, readonlyAllowedCommands, registries, setTranslationMethod, tokenize };
|
|
42830
42875
|
|
|
42831
42876
|
|
|
42832
|
-
__info__.version = '16.0.
|
|
42833
|
-
__info__.date = '2023-
|
|
42834
|
-
__info__.hash = '
|
|
42877
|
+
__info__.version = '16.0.18';
|
|
42878
|
+
__info__.date = '2023-09-12T11:42:03.083Z';
|
|
42879
|
+
__info__.hash = '41fd4fa';
|