@odoo/o-spreadsheet 16.2.14 → 16.2.17
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 +155 -95
- package/dist/o-spreadsheet.d.ts +13 -5
- package/dist/o-spreadsheet.esm.js +155 -95
- package/dist/o-spreadsheet.iife.js +155 -95
- package/dist/o-spreadsheet.iife.min.js +227 -226
- package/package.json +2 -2
|
@@ -987,13 +987,17 @@ function getAddHeaderStartIndex(position, base) {
|
|
|
987
987
|
return position === "after" ? base + 1 : base;
|
|
988
988
|
}
|
|
989
989
|
/**
|
|
990
|
-
*
|
|
990
|
+
* Compares two objects.
|
|
991
991
|
*/
|
|
992
992
|
function deepEquals(o1, o2) {
|
|
993
993
|
if (o1 === o2)
|
|
994
994
|
return true;
|
|
995
995
|
if ((o1 && !o2) || (o2 && !o1))
|
|
996
996
|
return false;
|
|
997
|
+
if (typeof o1 !== typeof o2)
|
|
998
|
+
return false;
|
|
999
|
+
if (typeof o1 !== "object")
|
|
1000
|
+
return o1 === o2;
|
|
997
1001
|
// Objects can have different keys if the values are undefined
|
|
998
1002
|
const keys = new Set();
|
|
999
1003
|
Object.keys(o1).forEach((key) => keys.add(key));
|
|
@@ -4679,6 +4683,7 @@ css /* scss */ `
|
|
|
4679
4683
|
padding: 10px;
|
|
4680
4684
|
width: ${ERROR_TOOLTIP_WIDTH}px;
|
|
4681
4685
|
box-sizing: border-box !important;
|
|
4686
|
+
overflow-wrap: break-word;
|
|
4682
4687
|
}
|
|
4683
4688
|
`;
|
|
4684
4689
|
class ErrorToolTip extends Component {
|
|
@@ -4860,6 +4865,9 @@ class FilterMenu extends Component {
|
|
|
4860
4865
|
});
|
|
4861
4866
|
this.state.values = this.getFilterValues(this.props.filterPosition);
|
|
4862
4867
|
}
|
|
4868
|
+
get isReadonly() {
|
|
4869
|
+
return this.env.model.getters.isReadonly();
|
|
4870
|
+
}
|
|
4863
4871
|
getFilterValues(position) {
|
|
4864
4872
|
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
4865
4873
|
const filter = this.env.model.getters.getFilter({ sheetId, ...position });
|
|
@@ -7241,6 +7249,7 @@ class LineChart extends AbstractChart {
|
|
|
7241
7249
|
this.labelsAsText = definition.labelsAsText;
|
|
7242
7250
|
this.stacked = definition.stacked;
|
|
7243
7251
|
this.aggregated = definition.aggregated;
|
|
7252
|
+
this.cumulative = definition.cumulative;
|
|
7244
7253
|
}
|
|
7245
7254
|
static validateChartDefinition(validator, definition) {
|
|
7246
7255
|
return validator.checkValidations(definition, checkDataset, checkLabelRange);
|
|
@@ -7261,6 +7270,7 @@ class LineChart extends AbstractChart {
|
|
|
7261
7270
|
labelRange: context.auxiliaryRange || undefined,
|
|
7262
7271
|
stacked: false,
|
|
7263
7272
|
aggregated: false,
|
|
7273
|
+
cumulative: false,
|
|
7264
7274
|
};
|
|
7265
7275
|
}
|
|
7266
7276
|
getDefinition() {
|
|
@@ -7281,6 +7291,7 @@ class LineChart extends AbstractChart {
|
|
|
7281
7291
|
labelsAsText: this.labelsAsText,
|
|
7282
7292
|
stacked: this.stacked,
|
|
7283
7293
|
aggregated: this.aggregated,
|
|
7294
|
+
cumulative: this.cumulative,
|
|
7284
7295
|
};
|
|
7285
7296
|
}
|
|
7286
7297
|
getContextCreation() {
|
|
@@ -7484,6 +7495,16 @@ function createLineChartRuntime(chart, getters) {
|
|
|
7484
7495
|
if (chart.stacked) {
|
|
7485
7496
|
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
7486
7497
|
}
|
|
7498
|
+
if (chart.cumulative) {
|
|
7499
|
+
let accumulator = 0;
|
|
7500
|
+
data = data.map((value) => {
|
|
7501
|
+
if (!isNaN(value)) {
|
|
7502
|
+
accumulator += parseFloat(value);
|
|
7503
|
+
return accumulator;
|
|
7504
|
+
}
|
|
7505
|
+
return value;
|
|
7506
|
+
});
|
|
7507
|
+
}
|
|
7487
7508
|
const backgroundColor = rgbaToHex(backgroundRGBA);
|
|
7488
7509
|
const dataset = {
|
|
7489
7510
|
label,
|
|
@@ -8266,6 +8287,7 @@ function getSmartChartDefinition(zone, getters) {
|
|
|
8266
8287
|
labelsAsText: false,
|
|
8267
8288
|
stacked: false,
|
|
8268
8289
|
aggregated: false,
|
|
8290
|
+
cumulative: false,
|
|
8269
8291
|
labelRange: labelRangeXc,
|
|
8270
8292
|
type: "line",
|
|
8271
8293
|
dataSetsHaveTitle,
|
|
@@ -8628,6 +8650,13 @@ const REMOVE_ROWS_ACTION = (env) => {
|
|
|
8628
8650
|
elements: rows,
|
|
8629
8651
|
});
|
|
8630
8652
|
};
|
|
8653
|
+
const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
|
|
8654
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
8655
|
+
const selectedElements = env.model.getters.getElementsFromSelection(dimension);
|
|
8656
|
+
const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
|
|
8657
|
+
const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
|
|
8658
|
+
return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
|
|
8659
|
+
};
|
|
8631
8660
|
const REMOVE_COLUMNS_NAME = (env) => {
|
|
8632
8661
|
if (env.model.getters.getSelectedZones().length > 1) {
|
|
8633
8662
|
return _lt("Delete columns");
|
|
@@ -9218,11 +9247,7 @@ colMenuRegistry
|
|
|
9218
9247
|
name: REMOVE_COLUMNS_NAME,
|
|
9219
9248
|
sequence: 90,
|
|
9220
9249
|
action: REMOVE_COLUMNS_ACTION,
|
|
9221
|
-
isVisible: (env) =>
|
|
9222
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
9223
|
-
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
9224
|
-
return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
|
|
9225
|
-
},
|
|
9250
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
9226
9251
|
})
|
|
9227
9252
|
.add("clear_column", {
|
|
9228
9253
|
name: DELETE_CONTENT_COLUMNS_NAME,
|
|
@@ -9236,7 +9261,7 @@ colMenuRegistry
|
|
|
9236
9261
|
isVisible: (env) => {
|
|
9237
9262
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
9238
9263
|
const selectedCols = env.model.getters.getElementsFromSelection("COL");
|
|
9239
|
-
return env.model.getters.
|
|
9264
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
|
|
9240
9265
|
},
|
|
9241
9266
|
separator: true,
|
|
9242
9267
|
})
|
|
@@ -9310,11 +9335,7 @@ rowMenuRegistry
|
|
|
9310
9335
|
name: REMOVE_ROWS_NAME,
|
|
9311
9336
|
sequence: 70,
|
|
9312
9337
|
action: REMOVE_ROWS_ACTION,
|
|
9313
|
-
isVisible: (env) =>
|
|
9314
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
9315
|
-
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
9316
|
-
return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
|
|
9317
|
-
},
|
|
9338
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
9318
9339
|
})
|
|
9319
9340
|
.add("clear_row", {
|
|
9320
9341
|
name: DELETE_CONTENT_ROWS_NAME,
|
|
@@ -9328,7 +9349,7 @@ rowMenuRegistry
|
|
|
9328
9349
|
isVisible: (env) => {
|
|
9329
9350
|
const sheetId = env.model.getters.getActiveSheetId();
|
|
9330
9351
|
const selectedRows = env.model.getters.getElementsFromSelection("ROW");
|
|
9331
|
-
return env.model.getters.
|
|
9352
|
+
return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
|
|
9332
9353
|
},
|
|
9333
9354
|
separator: true,
|
|
9334
9355
|
})
|
|
@@ -16174,11 +16195,13 @@ topbarMenuRegistry
|
|
|
16174
16195
|
name: REMOVE_ROWS_NAME,
|
|
16175
16196
|
sequence: 80,
|
|
16176
16197
|
action: REMOVE_ROWS_ACTION,
|
|
16198
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
|
|
16177
16199
|
})
|
|
16178
16200
|
.addChild("edit_delete_column", ["edit"], {
|
|
16179
16201
|
name: REMOVE_COLUMNS_NAME,
|
|
16180
16202
|
sequence: 90,
|
|
16181
16203
|
action: REMOVE_COLUMNS_ACTION,
|
|
16204
|
+
isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
|
|
16182
16205
|
})
|
|
16183
16206
|
.addChild("edit_delete_cell_shift_up", ["edit"], {
|
|
16184
16207
|
name: _lt("Delete cell and shift up"),
|
|
@@ -17491,6 +17514,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
|
|
|
17491
17514
|
aggregated: ev.target.checked,
|
|
17492
17515
|
});
|
|
17493
17516
|
}
|
|
17517
|
+
onUpdateCumulative(ev) {
|
|
17518
|
+
this.props.updateChart(this.props.figureId, {
|
|
17519
|
+
cumulative: ev.target.checked,
|
|
17520
|
+
});
|
|
17521
|
+
}
|
|
17494
17522
|
}
|
|
17495
17523
|
LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
|
|
17496
17524
|
|
|
@@ -18680,9 +18708,9 @@ class FindAndReplacePanel extends Component {
|
|
|
18680
18708
|
}
|
|
18681
18709
|
setup() {
|
|
18682
18710
|
this.showFormulaState = this.env.model.getters.shouldShowFormulas();
|
|
18683
|
-
this.debouncedUpdateSearch = debounce(this.updateSearch.bind(this), 200);
|
|
18684
18711
|
onMounted(() => this.focusInput());
|
|
18685
18712
|
onWillUnmount(() => {
|
|
18713
|
+
clearTimeout(this.debounceTimeoutId);
|
|
18686
18714
|
this.env.model.dispatch("CLEAR_SEARCH");
|
|
18687
18715
|
this.env.model.dispatch("SET_FORMULA_VISIBILITY", { show: this.showFormulaState });
|
|
18688
18716
|
});
|
|
@@ -18727,6 +18755,13 @@ class FindAndReplacePanel extends Component {
|
|
|
18727
18755
|
searchOptions: this.state.searchOptions,
|
|
18728
18756
|
});
|
|
18729
18757
|
}
|
|
18758
|
+
debouncedUpdateSearch() {
|
|
18759
|
+
clearTimeout(this.debounceTimeoutId);
|
|
18760
|
+
this.debounceTimeoutId = setTimeout(() => {
|
|
18761
|
+
this.updateSearch();
|
|
18762
|
+
this.debounceTimeoutId = undefined;
|
|
18763
|
+
}, 200);
|
|
18764
|
+
}
|
|
18730
18765
|
replace() {
|
|
18731
18766
|
this.env.model.dispatch("REPLACE_SEARCH", {
|
|
18732
18767
|
replaceWith: this.state.replaceWith,
|
|
@@ -20850,9 +20885,11 @@ function useCellHovered(env, gridRef, callback) {
|
|
|
20850
20885
|
}
|
|
20851
20886
|
}
|
|
20852
20887
|
function updateMousePosition(e) {
|
|
20853
|
-
|
|
20854
|
-
|
|
20855
|
-
|
|
20888
|
+
if (gridRef.el === e.target) {
|
|
20889
|
+
x = e.offsetX;
|
|
20890
|
+
y = e.offsetY;
|
|
20891
|
+
lastMoved = Date.now();
|
|
20892
|
+
}
|
|
20856
20893
|
}
|
|
20857
20894
|
function recompute() {
|
|
20858
20895
|
const { col, row } = getPosition();
|
|
@@ -24965,6 +25002,7 @@ function convertChartData(chartData) {
|
|
|
24965
25002
|
legendPosition: chartData.legendPosition,
|
|
24966
25003
|
stacked: chartData.stacked || false,
|
|
24967
25004
|
aggregated: false,
|
|
25005
|
+
cumulative: chartData.cumulative || false,
|
|
24968
25006
|
labelsAsText: false,
|
|
24969
25007
|
};
|
|
24970
25008
|
}
|
|
@@ -29403,7 +29441,11 @@ class HeaderSizePlugin extends CorePlugin {
|
|
|
29403
29441
|
let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
|
|
29404
29442
|
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
29405
29443
|
const baseSize = sizes[cmd.base];
|
|
29406
|
-
|
|
29444
|
+
const sizesToInsert = range(0, cmd.quantity).map(() => ({
|
|
29445
|
+
manualSize: baseSize.manualSize,
|
|
29446
|
+
computedSize: lazy(baseSize.computedSize()),
|
|
29447
|
+
}));
|
|
29448
|
+
sizes.splice(addIndex, 0, ...sizesToInsert);
|
|
29407
29449
|
sizes = sizes.map((size, row) => {
|
|
29408
29450
|
if (cmd.dimension === "ROW" && row > cmd.base + cmd.quantity) {
|
|
29409
29451
|
// invalidate sizes
|
|
@@ -29619,7 +29661,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29619
29661
|
if (!this.getters.tryGetSheet(cmd.sheetId)) {
|
|
29620
29662
|
return 27 /* CommandResult.InvalidSheetId */;
|
|
29621
29663
|
}
|
|
29622
|
-
if (
|
|
29664
|
+
if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
29623
29665
|
return 8 /* CommandResult.NotEnoughElements */;
|
|
29624
29666
|
}
|
|
29625
29667
|
return 0 /* CommandResult.Success */;
|
|
@@ -29669,9 +29711,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29669
29711
|
}
|
|
29670
29712
|
return;
|
|
29671
29713
|
}
|
|
29672
|
-
|
|
29714
|
+
checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
|
|
29673
29715
|
const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
|
|
29674
|
-
return
|
|
29716
|
+
return includesAll(elements, visibleHeaders);
|
|
29675
29717
|
}
|
|
29676
29718
|
isRowHiddenByUser(sheetId, index) {
|
|
29677
29719
|
return this.hiddenHeaders[sheetId].ROW[index];
|
|
@@ -29767,7 +29809,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
29767
29809
|
}
|
|
29768
29810
|
}
|
|
29769
29811
|
HeaderVisibilityPlugin.getters = [
|
|
29770
|
-
"
|
|
29812
|
+
"checkElementsIncludeAllVisibleHeaders",
|
|
29771
29813
|
"getHiddenColsGroups",
|
|
29772
29814
|
"getHiddenRowsGroups",
|
|
29773
29815
|
"isRowHiddenByUser",
|
|
@@ -30804,6 +30846,9 @@ class SheetPlugin extends CorePlugin {
|
|
|
30804
30846
|
if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
|
|
30805
30847
|
return 86 /* CommandResult.InvalidHeaderIndex */;
|
|
30806
30848
|
}
|
|
30849
|
+
else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
|
|
30850
|
+
return 8 /* CommandResult.NotEnoughElements */;
|
|
30851
|
+
}
|
|
30807
30852
|
else {
|
|
30808
30853
|
return 0 /* CommandResult.Success */;
|
|
30809
30854
|
}
|
|
@@ -31090,6 +31135,20 @@ class SheetPlugin extends CorePlugin {
|
|
|
31090
31135
|
}
|
|
31091
31136
|
this.history.update("sheets", sheetId, "panes", panes);
|
|
31092
31137
|
}
|
|
31138
|
+
/**
|
|
31139
|
+
* Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
|
|
31140
|
+
* This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
|
|
31141
|
+
*/
|
|
31142
|
+
checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
|
|
31143
|
+
const paneDivisions = this.getters.getPaneDivisions(sheetId);
|
|
31144
|
+
const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
|
|
31145
|
+
const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
|
|
31146
|
+
if (!startIndex) {
|
|
31147
|
+
return false;
|
|
31148
|
+
}
|
|
31149
|
+
const indicesToCheck = range(startIndex, endIndex);
|
|
31150
|
+
return includesAll(elements, indicesToCheck);
|
|
31151
|
+
}
|
|
31093
31152
|
// ---------------------------------------------------------------------------
|
|
31094
31153
|
// Row/Col manipulation
|
|
31095
31154
|
// ---------------------------------------------------------------------------
|
|
@@ -31618,6 +31677,7 @@ SheetPlugin.getters = [
|
|
|
31618
31677
|
"getSheetSize",
|
|
31619
31678
|
"getSheetZone",
|
|
31620
31679
|
"getPaneDivisions",
|
|
31680
|
+
"checkElementsIncludeAllNonFrozenHeaders",
|
|
31621
31681
|
];
|
|
31622
31682
|
|
|
31623
31683
|
/**
|
|
@@ -32184,6 +32244,7 @@ class EvaluationConditionalFormatPlugin extends UIPlugin {
|
|
|
32184
32244
|
// stores the computed styles in the format of computedStyles.sheetName[col][row] = Style
|
|
32185
32245
|
this.computedStyles = {};
|
|
32186
32246
|
this.computedIcons = {};
|
|
32247
|
+
this.uuidGenerator = new UuidGenerator();
|
|
32187
32248
|
/**
|
|
32188
32249
|
* Execute the predicate to know if a conditional formatting rule should be applied to a cell
|
|
32189
32250
|
*/
|
|
@@ -32536,13 +32597,20 @@ class EvaluationConditionalFormatPlugin extends UIPlugin {
|
|
|
32536
32597
|
this.adaptRules(origin.sheetId, cf, [xc], toRemoveRange);
|
|
32537
32598
|
}
|
|
32538
32599
|
else {
|
|
32539
|
-
this.adaptRules(target.sheetId, cf, [xc], []);
|
|
32540
32600
|
this.adaptRules(origin.sheetId, cf, [], toRemoveRange);
|
|
32601
|
+
const cfToCopyTo = this.getCFToCopyTo(target.sheetId, cf);
|
|
32602
|
+
this.adaptRules(target.sheetId, cfToCopyTo, [xc], []);
|
|
32541
32603
|
}
|
|
32542
32604
|
}
|
|
32543
32605
|
}
|
|
32544
32606
|
}
|
|
32545
32607
|
}
|
|
32608
|
+
getCFToCopyTo(targetSheetId, originCF) {
|
|
32609
|
+
const cfInTarget = this.getters
|
|
32610
|
+
.getConditionalFormats(targetSheetId)
|
|
32611
|
+
.find((cf) => cf.stopIfTrue === originCF.stopIfTrue && deepEquals(cf.rule, originCF.rule));
|
|
32612
|
+
return cfInTarget ? cfInTarget : { ...originCF, id: this.uuidGenerator.uuidv4(), ranges: [] };
|
|
32613
|
+
}
|
|
32546
32614
|
}
|
|
32547
32615
|
EvaluationConditionalFormatPlugin.getters = ["getConditionalIcon", "getCellComputedStyle"];
|
|
32548
32616
|
|
|
@@ -32890,30 +32958,26 @@ class InternalViewport {
|
|
|
32890
32958
|
const { end } = this.getters.getColDimensions(sheetId, targetCol);
|
|
32891
32959
|
const maxCol = this.getters.getNumberCols(sheetId);
|
|
32892
32960
|
if (this.offsetX + this.offsetCorrectionX + this.viewportWidth < end) {
|
|
32893
|
-
|
|
32894
|
-
|
|
32895
|
-
|
|
32896
|
-
}
|
|
32897
|
-
if (this.getters.isColHidden(sheetId, col)) {
|
|
32898
|
-
continue;
|
|
32899
|
-
}
|
|
32900
|
-
this.offsetX = this.getters.getColDimensions(sheetId, col).end - this.offsetCorrectionX;
|
|
32901
|
-
this.offsetScrollbarX = this.offsetX;
|
|
32902
|
-
this.adjustViewportZoneX();
|
|
32961
|
+
let finalTarget = targetCol;
|
|
32962
|
+
while (this.getters.isColHidden(sheetId, finalTarget) && targetCol < maxCol) {
|
|
32963
|
+
finalTarget++;
|
|
32903
32964
|
}
|
|
32965
|
+
const finalTargetEnd = this.getters.getColDimensions(sheetId, finalTarget).end;
|
|
32966
|
+
const startIndex = this.searchHeaderIndex("COL", finalTargetEnd - this.viewportWidth - this.offsetCorrectionX, this.boundaries.left, true);
|
|
32967
|
+
this.offsetX =
|
|
32968
|
+
this.getters.getColDimensions(sheetId, startIndex).end - this.offsetCorrectionX;
|
|
32969
|
+
this.offsetScrollbarX = this.offsetX;
|
|
32970
|
+
this.adjustViewportZoneX();
|
|
32904
32971
|
}
|
|
32905
32972
|
else if (this.left > targetCol) {
|
|
32906
|
-
|
|
32907
|
-
|
|
32908
|
-
|
|
32909
|
-
}
|
|
32910
|
-
if (this.getters.isColHidden(sheetId, col)) {
|
|
32911
|
-
continue;
|
|
32912
|
-
}
|
|
32913
|
-
this.offsetX = this.getters.getColDimensions(sheetId, col).start - this.offsetCorrectionX;
|
|
32914
|
-
this.offsetScrollbarX = this.offsetX;
|
|
32915
|
-
this.adjustViewportZoneX();
|
|
32973
|
+
let finalTarget = targetCol;
|
|
32974
|
+
while (this.getters.isColHidden(sheetId, finalTarget) && targetCol > 0) {
|
|
32975
|
+
finalTarget--;
|
|
32916
32976
|
}
|
|
32977
|
+
this.offsetX =
|
|
32978
|
+
this.getters.getColDimensions(sheetId, finalTarget).start - this.offsetCorrectionX;
|
|
32979
|
+
this.offsetScrollbarX = this.offsetX;
|
|
32980
|
+
this.adjustViewportZoneX();
|
|
32917
32981
|
}
|
|
32918
32982
|
}
|
|
32919
32983
|
adjustPositionY(targetRow) {
|
|
@@ -32921,30 +32985,26 @@ class InternalViewport {
|
|
|
32921
32985
|
const { end } = this.getters.getRowDimensions(sheetId, targetRow);
|
|
32922
32986
|
const maxRow = this.getters.getNumberRows(sheetId);
|
|
32923
32987
|
if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) {
|
|
32924
|
-
|
|
32925
|
-
|
|
32926
|
-
|
|
32927
|
-
}
|
|
32928
|
-
if (this.getters.isRowHidden(sheetId, row)) {
|
|
32929
|
-
continue;
|
|
32930
|
-
}
|
|
32931
|
-
this.offsetY = this.getters.getRowDimensions(sheetId, row).end - this.offsetCorrectionY;
|
|
32932
|
-
this.offsetScrollbarY = this.offsetY;
|
|
32933
|
-
this.adjustViewportZoneY();
|
|
32988
|
+
let finalTarget = targetRow;
|
|
32989
|
+
while (this.getters.isRowHidden(sheetId, finalTarget) && targetRow < maxRow) {
|
|
32990
|
+
finalTarget++;
|
|
32934
32991
|
}
|
|
32992
|
+
const finalTargetEnd = this.getters.getRowDimensions(sheetId, finalTarget).end;
|
|
32993
|
+
const startIndex = this.searchHeaderIndex("ROW", finalTargetEnd - this.viewportHeight - this.offsetCorrectionY, this.boundaries.top, true);
|
|
32994
|
+
this.offsetY =
|
|
32995
|
+
this.getters.getRowDimensions(sheetId, startIndex).end - this.offsetCorrectionY;
|
|
32996
|
+
this.offsetScrollbarY = this.offsetY;
|
|
32997
|
+
this.adjustViewportZoneY();
|
|
32935
32998
|
}
|
|
32936
32999
|
else if (this.top > targetRow) {
|
|
32937
|
-
|
|
32938
|
-
|
|
32939
|
-
|
|
32940
|
-
}
|
|
32941
|
-
if (this.getters.isRowHidden(sheetId, row)) {
|
|
32942
|
-
continue;
|
|
32943
|
-
}
|
|
32944
|
-
this.offsetY = this.getters.getRowDimensions(sheetId, row).start - this.offsetCorrectionY;
|
|
32945
|
-
this.offsetScrollbarY = this.offsetY;
|
|
32946
|
-
this.adjustViewportZoneY();
|
|
33000
|
+
let finalTarget = targetRow;
|
|
33001
|
+
while (this.getters.isRowHidden(sheetId, finalTarget) && targetRow > 0) {
|
|
33002
|
+
finalTarget--;
|
|
32947
33003
|
}
|
|
33004
|
+
this.offsetY =
|
|
33005
|
+
this.getters.getRowDimensions(sheetId, finalTarget).start - this.offsetCorrectionY;
|
|
33006
|
+
this.offsetScrollbarY = this.offsetY;
|
|
33007
|
+
this.adjustViewportZoneY();
|
|
32948
33008
|
}
|
|
32949
33009
|
}
|
|
32950
33010
|
setViewportOffset(offsetX, offsetY) {
|
|
@@ -33064,6 +33124,9 @@ class InternalViewport {
|
|
|
33064
33124
|
const sheetId = this.sheetId;
|
|
33065
33125
|
this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
|
|
33066
33126
|
this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
|
|
33127
|
+
if (this.left === -1) {
|
|
33128
|
+
this.left = this.boundaries.left;
|
|
33129
|
+
}
|
|
33067
33130
|
if (this.right === -1) {
|
|
33068
33131
|
this.right = this.getters.getNumberCols(sheetId) - 1;
|
|
33069
33132
|
}
|
|
@@ -33077,6 +33140,9 @@ class InternalViewport {
|
|
|
33077
33140
|
const sheetId = this.sheetId;
|
|
33078
33141
|
this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
|
|
33079
33142
|
this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
|
|
33143
|
+
if (this.top === -1) {
|
|
33144
|
+
this.top = this.boundaries.top;
|
|
33145
|
+
}
|
|
33080
33146
|
if (this.bottom === -1) {
|
|
33081
33147
|
this.bottom = this.getters.getNumberRows(sheetId) - 1;
|
|
33082
33148
|
}
|
|
@@ -34513,14 +34579,10 @@ class FindAndReplacePlugin extends UIPlugin {
|
|
|
34513
34579
|
case "REPLACE_ALL_SEARCH":
|
|
34514
34580
|
this.replaceAll(cmd.replaceWith);
|
|
34515
34581
|
break;
|
|
34516
|
-
case "EVALUATE_CELLS":
|
|
34517
|
-
case "UPDATE_CELL":
|
|
34518
|
-
case "REMOVE_FILTER_TABLE":
|
|
34519
|
-
case "UPDATE_FILTER":
|
|
34520
|
-
this.isSearchDirty = true;
|
|
34521
|
-
break;
|
|
34522
34582
|
case "UNDO":
|
|
34523
34583
|
case "REDO":
|
|
34584
|
+
case "REMOVE_FILTER_TABLE":
|
|
34585
|
+
case "UPDATE_FILTER":
|
|
34524
34586
|
case "REMOVE_COLUMNS_ROWS":
|
|
34525
34587
|
case "HIDE_COLUMNS_ROWS":
|
|
34526
34588
|
case "UNHIDE_COLUMNS_ROWS":
|
|
@@ -37520,7 +37582,7 @@ class ClipboardCellsState extends ClipboardCellsAbstractState {
|
|
|
37520
37582
|
});
|
|
37521
37583
|
for (const filterTable of this.copiedTables) {
|
|
37522
37584
|
this.dispatch("REMOVE_FILTER_TABLE", {
|
|
37523
|
-
sheetId: this.
|
|
37585
|
+
sheetId: this.sheetId,
|
|
37524
37586
|
target: [filterTable.zone],
|
|
37525
37587
|
});
|
|
37526
37588
|
}
|
|
@@ -37998,7 +38060,7 @@ class ClipboardPlugin extends UIPlugin {
|
|
|
37998
38060
|
allowDispatch(cmd) {
|
|
37999
38061
|
switch (cmd.type) {
|
|
38000
38062
|
case "CUT":
|
|
38001
|
-
const zones =
|
|
38063
|
+
const zones = this.getters.getSelectedZones();
|
|
38002
38064
|
const state = this.getClipboardState(zones, cmd.type);
|
|
38003
38065
|
return state.isCutAllowed(zones);
|
|
38004
38066
|
case "PASTE":
|
|
@@ -38029,7 +38091,7 @@ class ClipboardPlugin extends UIPlugin {
|
|
|
38029
38091
|
switch (cmd.type) {
|
|
38030
38092
|
case "COPY":
|
|
38031
38093
|
case "CUT":
|
|
38032
|
-
const zones =
|
|
38094
|
+
const zones = this.getters.getSelectedZones();
|
|
38033
38095
|
this.state = this.getClipboardState(zones, cmd.type);
|
|
38034
38096
|
this.status = "visible";
|
|
38035
38097
|
break;
|
|
@@ -39409,26 +39471,24 @@ class GridSelectionPlugin extends UIPlugin {
|
|
|
39409
39471
|
const isBasedBefore = cmd.base < start;
|
|
39410
39472
|
const deltaCol = isBasedBefore && isCol ? thickness : 0;
|
|
39411
39473
|
const deltaRow = isBasedBefore && !isCol ? thickness : 0;
|
|
39412
|
-
|
|
39413
|
-
|
|
39414
|
-
|
|
39415
|
-
|
|
39416
|
-
|
|
39417
|
-
|
|
39418
|
-
|
|
39419
|
-
|
|
39420
|
-
|
|
39421
|
-
|
|
39422
|
-
|
|
39423
|
-
|
|
39424
|
-
|
|
39425
|
-
|
|
39426
|
-
|
|
39427
|
-
|
|
39428
|
-
|
|
39429
|
-
|
|
39430
|
-
],
|
|
39431
|
-
});
|
|
39474
|
+
const target = [
|
|
39475
|
+
{
|
|
39476
|
+
left: isCol ? start + deltaCol : 0,
|
|
39477
|
+
right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
|
|
39478
|
+
top: !isCol ? start + deltaRow : 0,
|
|
39479
|
+
bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
|
|
39480
|
+
},
|
|
39481
|
+
];
|
|
39482
|
+
const state = new ClipboardCellsState(target, "CUT", this.getters, this.dispatch, this.selection);
|
|
39483
|
+
const pasteTarget = [
|
|
39484
|
+
{
|
|
39485
|
+
left: isCol ? cmd.base : 0,
|
|
39486
|
+
right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
|
|
39487
|
+
top: !isCol ? cmd.base : 0,
|
|
39488
|
+
bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
|
|
39489
|
+
},
|
|
39490
|
+
];
|
|
39491
|
+
state.paste(pasteTarget, { selectTarget: true });
|
|
39432
39492
|
const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
|
|
39433
39493
|
let currentIndex = cmd.base;
|
|
39434
39494
|
for (const element of toRemove) {
|
|
@@ -45368,6 +45428,6 @@ function addFunction(functionName, functionDescription) {
|
|
|
45368
45428
|
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 };
|
|
45369
45429
|
|
|
45370
45430
|
|
|
45371
|
-
__info__.version = '16.2.
|
|
45372
|
-
__info__.date = '2023-
|
|
45373
|
-
__info__.hash = '
|
|
45431
|
+
__info__.version = '16.2.17';
|
|
45432
|
+
__info__.date = '2023-10-03T12:42:54.642Z';
|
|
45433
|
+
__info__.hash = '146867a';
|