@odoo/o-spreadsheet 18.1.10 → 18.1.12
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 +207 -71
- package/dist/o-spreadsheet.d.ts +5 -1
- package/dist/o-spreadsheet.esm.js +207 -71
- package/dist/o-spreadsheet.iife.js +207 -71
- package/dist/o-spreadsheet.iife.min.js +402 -402
- package/dist/o_spreadsheet.xml +28 -15
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* This file is generated by o-spreadsheet build tools. Do not edit it.
|
|
4
4
|
* @see https://github.com/odoo/o-spreadsheet
|
|
5
|
-
* @version 18.1.
|
|
6
|
-
* @date 2025-03-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.1.12
|
|
6
|
+
* @date 2025-03-19T08:23:50.676Z
|
|
7
|
+
* @hash 32f788f
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
|
|
@@ -422,7 +422,6 @@ function escapeRegExp(str) {
|
|
|
422
422
|
* Sparse arrays remain sparse.
|
|
423
423
|
*/
|
|
424
424
|
function deepCopy(obj) {
|
|
425
|
-
const result = Array.isArray(obj) ? [] : {};
|
|
426
425
|
switch (typeof obj) {
|
|
427
426
|
case "object": {
|
|
428
427
|
if (obj === null) {
|
|
@@ -434,8 +433,18 @@ function deepCopy(obj) {
|
|
|
434
433
|
else if (!(isPlainObject(obj) || obj instanceof Array)) {
|
|
435
434
|
throw new Error("Unsupported type: only objects and arrays are supported");
|
|
436
435
|
}
|
|
437
|
-
|
|
438
|
-
|
|
436
|
+
const result = Array.isArray(obj) ? new Array(obj.length) : {};
|
|
437
|
+
if (Array.isArray(obj)) {
|
|
438
|
+
for (let i = 0, len = obj.length; i < len; i++) {
|
|
439
|
+
if (i in obj) {
|
|
440
|
+
result[i] = deepCopy(obj[i]);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
for (const key in obj) {
|
|
446
|
+
result[key] = deepCopy(obj[key]);
|
|
447
|
+
}
|
|
439
448
|
}
|
|
440
449
|
return result;
|
|
441
450
|
}
|
|
@@ -2688,21 +2697,30 @@ function mergeContiguousZones(zones) {
|
|
|
2688
2697
|
return mergedZones;
|
|
2689
2698
|
}
|
|
2690
2699
|
|
|
2700
|
+
const globalReverseLookup$1 = new WeakMap();
|
|
2701
|
+
const globalIdCounter = new WeakMap();
|
|
2691
2702
|
/**
|
|
2692
2703
|
* Get the id of the given item (its key in the given dictionary).
|
|
2693
2704
|
* If the given item does not exist in the dictionary, it creates one with a new id.
|
|
2694
2705
|
*/
|
|
2695
2706
|
function getItemId(item, itemsDic) {
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2707
|
+
if (!globalReverseLookup$1.has(itemsDic)) {
|
|
2708
|
+
globalReverseLookup$1.set(itemsDic, new Map());
|
|
2709
|
+
globalIdCounter.set(itemsDic, 0);
|
|
2710
|
+
}
|
|
2711
|
+
const reverseLookup = globalReverseLookup$1.get(itemsDic);
|
|
2712
|
+
const canonical = getCanonicalRepresentation(item);
|
|
2713
|
+
if (reverseLookup.has(canonical)) {
|
|
2714
|
+
const id = reverseLookup.get(canonical);
|
|
2715
|
+
itemsDic[id] = item;
|
|
2716
|
+
return id;
|
|
2700
2717
|
}
|
|
2701
2718
|
// Generate new Id if the item didn't exist in the dictionary
|
|
2702
|
-
const
|
|
2703
|
-
|
|
2704
|
-
itemsDic
|
|
2705
|
-
|
|
2719
|
+
const newId = globalIdCounter.get(itemsDic) + 1;
|
|
2720
|
+
reverseLookup.set(canonical, newId);
|
|
2721
|
+
globalIdCounter.set(itemsDic, newId);
|
|
2722
|
+
itemsDic[newId] = item;
|
|
2723
|
+
return newId;
|
|
2706
2724
|
}
|
|
2707
2725
|
function groupItemIdsByZones(positionsByItemId) {
|
|
2708
2726
|
const result = {};
|
|
@@ -2726,6 +2744,33 @@ function* iterateItemIdsPositions(sheetId, itemIdsByZones) {
|
|
|
2726
2744
|
}
|
|
2727
2745
|
}
|
|
2728
2746
|
}
|
|
2747
|
+
function getCanonicalRepresentation(item) {
|
|
2748
|
+
if (item === null)
|
|
2749
|
+
return "null";
|
|
2750
|
+
if (item === undefined)
|
|
2751
|
+
return "undefined";
|
|
2752
|
+
if (typeof item !== "object")
|
|
2753
|
+
return String(item);
|
|
2754
|
+
if (Array.isArray(item)) {
|
|
2755
|
+
const len = item.length;
|
|
2756
|
+
let result = "[";
|
|
2757
|
+
for (let i = 0; i < len; i++) {
|
|
2758
|
+
if (i > 0)
|
|
2759
|
+
result += ",";
|
|
2760
|
+
result += getCanonicalRepresentation(item[i]);
|
|
2761
|
+
}
|
|
2762
|
+
return result + "]";
|
|
2763
|
+
}
|
|
2764
|
+
const keys = Object.keys(item).sort();
|
|
2765
|
+
let repr = "{";
|
|
2766
|
+
for (const key of keys) {
|
|
2767
|
+
if (item[key] !== undefined) {
|
|
2768
|
+
repr += `"${key}":${getCanonicalRepresentation(item[key])},`;
|
|
2769
|
+
}
|
|
2770
|
+
}
|
|
2771
|
+
repr += "}";
|
|
2772
|
+
return repr;
|
|
2773
|
+
}
|
|
2729
2774
|
|
|
2730
2775
|
// -----------------------------------------------------------------------------
|
|
2731
2776
|
// Date Type
|
|
@@ -6231,11 +6276,13 @@ function getDefaultCellHeight(ctx, cell, colSize) {
|
|
|
6231
6276
|
if (!cell || (!cell.isFormula && !cell.content)) {
|
|
6232
6277
|
return DEFAULT_CELL_HEIGHT;
|
|
6233
6278
|
}
|
|
6234
|
-
const
|
|
6235
|
-
|
|
6236
|
-
|
|
6237
|
-
|
|
6238
|
-
const
|
|
6279
|
+
const content = cell.isFormula ? "" : cell.content;
|
|
6280
|
+
return getCellContentHeight(ctx, content, cell.style, colSize);
|
|
6281
|
+
}
|
|
6282
|
+
function getCellContentHeight(ctx, content, style, colSize) {
|
|
6283
|
+
const maxWidth = style?.wrapping === "wrap" ? colSize - 2 * MIN_CELL_TEXT_MARGIN : undefined;
|
|
6284
|
+
const numberOfLines = splitTextToWidth(ctx, content, style, maxWidth).length;
|
|
6285
|
+
const fontSize = computeTextFontSizeInPixels(style);
|
|
6239
6286
|
return computeTextLinesHeight(fontSize, numberOfLines) + 2 * PADDING_AUTORESIZE_VERTICAL;
|
|
6240
6287
|
}
|
|
6241
6288
|
function getDefaultContextFont(fontSize, bold = false, italic = false) {
|
|
@@ -8279,7 +8326,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
|
|
|
8279
8326
|
const possibleValues = pivot
|
|
8280
8327
|
.getPossibleFieldValues(columns[i])
|
|
8281
8328
|
.map((v) => v.value);
|
|
8282
|
-
if (!possibleValues.includes(sortedColumn.domain[i].value)
|
|
8329
|
+
if (!possibleValues.includes(sortedColumn.domain[i].value) &&
|
|
8330
|
+
!(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
|
|
8283
8331
|
return false;
|
|
8284
8332
|
}
|
|
8285
8333
|
}
|
|
@@ -8430,13 +8478,6 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
8430
8478
|
this.clearClippedZones(content);
|
|
8431
8479
|
const selection = target[0];
|
|
8432
8480
|
this.pasteZone(sheetId, selection.left, selection.top, content.cells, options);
|
|
8433
|
-
this.dispatch("MOVE_RANGES", {
|
|
8434
|
-
target: content.zones,
|
|
8435
|
-
sheetId: content.sheetId,
|
|
8436
|
-
targetSheetId: sheetId,
|
|
8437
|
-
col: selection.left,
|
|
8438
|
-
row: selection.top,
|
|
8439
|
-
});
|
|
8440
8481
|
}
|
|
8441
8482
|
/**
|
|
8442
8483
|
* Clear the clipped zones: remove the cells and clear the formatting
|
|
@@ -8945,14 +8986,15 @@ class MergeClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
8945
8986
|
}
|
|
8946
8987
|
merges.push(mergesInRow);
|
|
8947
8988
|
}
|
|
8948
|
-
return { merges };
|
|
8989
|
+
return { merges, sheetId };
|
|
8949
8990
|
}
|
|
8950
8991
|
/**
|
|
8951
8992
|
* Paste the clipboard content in the given target
|
|
8952
8993
|
*/
|
|
8953
8994
|
paste(target, content, options) {
|
|
8954
8995
|
if (options.isCutOperation) {
|
|
8955
|
-
|
|
8996
|
+
const copiedMerges = content.merges.flat().filter(isDefined);
|
|
8997
|
+
this.dispatch("REMOVE_MERGE", { sheetId: content.sheetId, target: copiedMerges });
|
|
8956
8998
|
}
|
|
8957
8999
|
this.pasteFromCopy(target.sheetId, target.zones, content.merges, options);
|
|
8958
9000
|
}
|
|
@@ -8987,6 +9029,27 @@ class MergeClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
8987
9029
|
}
|
|
8988
9030
|
}
|
|
8989
9031
|
|
|
9032
|
+
class ReferenceClipboardHandler extends AbstractCellClipboardHandler {
|
|
9033
|
+
copy(data) {
|
|
9034
|
+
return {
|
|
9035
|
+
zones: data.clippedZones,
|
|
9036
|
+
sheetId: data.sheetId,
|
|
9037
|
+
};
|
|
9038
|
+
}
|
|
9039
|
+
paste(target, content, options) {
|
|
9040
|
+
if (options.isCutOperation) {
|
|
9041
|
+
const selection = target.zones[0];
|
|
9042
|
+
this.dispatch("MOVE_RANGES", {
|
|
9043
|
+
target: content.zones,
|
|
9044
|
+
sheetId: content.sheetId,
|
|
9045
|
+
targetSheetId: target.sheetId,
|
|
9046
|
+
col: selection.left,
|
|
9047
|
+
row: selection.top,
|
|
9048
|
+
});
|
|
9049
|
+
}
|
|
9050
|
+
}
|
|
9051
|
+
}
|
|
9052
|
+
|
|
8990
9053
|
class SheetClipboardHandler extends AbstractCellClipboardHandler {
|
|
8991
9054
|
isPasteAllowed(sheetId, target, content, options) {
|
|
8992
9055
|
if (!("cells" in content)) {
|
|
@@ -9150,7 +9213,8 @@ clipboardHandlersRegistries.cellHandlers
|
|
|
9150
9213
|
.add("merge", MergeClipboardHandler)
|
|
9151
9214
|
.add("border", BorderClipboardHandler)
|
|
9152
9215
|
.add("table", TableClipboardHandler)
|
|
9153
|
-
.add("conditionalFormat", ConditionalFormatClipboardHandler)
|
|
9216
|
+
.add("conditionalFormat", ConditionalFormatClipboardHandler)
|
|
9217
|
+
.add("references", ReferenceClipboardHandler);
|
|
9154
9218
|
|
|
9155
9219
|
function transformZone(zone, executed) {
|
|
9156
9220
|
if (executed.type === "REMOVE_COLUMNS_ROWS") {
|
|
@@ -11154,6 +11218,7 @@ class ScorecardChart extends Component {
|
|
|
11154
11218
|
const autoCompleteProviders = new Registry();
|
|
11155
11219
|
|
|
11156
11220
|
autoCompleteProviders.add("dataValidation", {
|
|
11221
|
+
displayAllOnInitialContent: true,
|
|
11157
11222
|
getProposals(tokenAtCursor, content) {
|
|
11158
11223
|
if (content.startsWith("=")) {
|
|
11159
11224
|
return [];
|
|
@@ -20946,8 +21011,8 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
20946
21011
|
this.computeParenthesisRelatedToCursor();
|
|
20947
21012
|
}
|
|
20948
21013
|
cancelEdition() {
|
|
20949
|
-
this.cancelEditionAndActivateSheet();
|
|
20950
21014
|
this.resetContent();
|
|
21015
|
+
this.cancelEditionAndActivateSheet();
|
|
20951
21016
|
}
|
|
20952
21017
|
setCurrentContent(content, selection) {
|
|
20953
21018
|
if (selection && !this.isSelectionValid(content.length, selection.start, selection.end)) {
|
|
@@ -20965,8 +21030,8 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
20965
21030
|
switch (cmd.type) {
|
|
20966
21031
|
case "SELECT_FIGURE":
|
|
20967
21032
|
if (cmd.id) {
|
|
20968
|
-
this.cancelEditionAndActivateSheet();
|
|
20969
21033
|
this.resetContent();
|
|
21034
|
+
this.cancelEditionAndActivateSheet();
|
|
20970
21035
|
}
|
|
20971
21036
|
break;
|
|
20972
21037
|
case "START_CHANGE_HIGHLIGHT":
|
|
@@ -21450,6 +21515,15 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
21450
21515
|
const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
|
|
21451
21516
|
// remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
|
|
21452
21517
|
const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
|
|
21518
|
+
if (this._currentContent === this.initialContent &&
|
|
21519
|
+
provider.displayAllOnInitialContent &&
|
|
21520
|
+
proposals?.length) {
|
|
21521
|
+
return {
|
|
21522
|
+
proposals,
|
|
21523
|
+
selectProposal: provider.selectProposal,
|
|
21524
|
+
autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
|
|
21525
|
+
};
|
|
21526
|
+
}
|
|
21453
21527
|
if (exactMatch && this._currentContent !== this.initialContent) {
|
|
21454
21528
|
// this means the user has chosen a proposal
|
|
21455
21529
|
return;
|
|
@@ -22273,7 +22347,7 @@ autoCompleteProviders.add("pivot_group_values", {
|
|
|
22273
22347
|
text,
|
|
22274
22348
|
description: usedLabel,
|
|
22275
22349
|
htmlContent: [{ value: text, color }],
|
|
22276
|
-
fuzzySearchKey:
|
|
22350
|
+
fuzzySearchKey: text + usedLabel,
|
|
22277
22351
|
};
|
|
22278
22352
|
});
|
|
22279
22353
|
},
|
|
@@ -24335,16 +24409,25 @@ function addRelsToFile(relsFiles, path, rel) {
|
|
|
24335
24409
|
}
|
|
24336
24410
|
return id;
|
|
24337
24411
|
}
|
|
24412
|
+
const globalReverseLookup = new WeakMap();
|
|
24338
24413
|
function pushElement(property, propertyList) {
|
|
24339
|
-
let
|
|
24340
|
-
|
|
24341
|
-
|
|
24342
|
-
|
|
24343
|
-
|
|
24414
|
+
let reverseLookup = globalReverseLookup.get(propertyList);
|
|
24415
|
+
if (!reverseLookup) {
|
|
24416
|
+
reverseLookup = new Map();
|
|
24417
|
+
for (let i = 0; i < propertyList.length; i++) {
|
|
24418
|
+
const canonical = getCanonicalRepresentation(propertyList[i]);
|
|
24419
|
+
reverseLookup.set(canonical, i);
|
|
24344
24420
|
}
|
|
24421
|
+
globalReverseLookup.set(propertyList, reverseLookup);
|
|
24422
|
+
}
|
|
24423
|
+
const canonical = getCanonicalRepresentation(property);
|
|
24424
|
+
if (reverseLookup.has(canonical)) {
|
|
24425
|
+
return reverseLookup.get(canonical);
|
|
24345
24426
|
}
|
|
24346
|
-
propertyList
|
|
24347
|
-
|
|
24427
|
+
const maxId = propertyList.length;
|
|
24428
|
+
propertyList.push(property);
|
|
24429
|
+
reverseLookup.set(canonical, maxId);
|
|
24430
|
+
return maxId;
|
|
24348
24431
|
}
|
|
24349
24432
|
const chartIds = [];
|
|
24350
24433
|
/**
|
|
@@ -26191,7 +26274,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
|
|
|
26191
26274
|
title: { text: chartTitle },
|
|
26192
26275
|
type: CHART_TYPE_CONVERSION_MAP[chartType],
|
|
26193
26276
|
dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
|
|
26194
|
-
labelRange: this.
|
|
26277
|
+
labelRange: this.extractLabelRange(chartType, rootChartElement),
|
|
26195
26278
|
backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
|
|
26196
26279
|
default: "ffffff",
|
|
26197
26280
|
}).asString(),
|
|
@@ -26203,6 +26286,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
|
|
|
26203
26286
|
};
|
|
26204
26287
|
})[0];
|
|
26205
26288
|
}
|
|
26289
|
+
extractLabelRange(chartType, rootChartElement) {
|
|
26290
|
+
if (chartType === "scatterChart") {
|
|
26291
|
+
return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
|
|
26292
|
+
this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
|
|
26293
|
+
}
|
|
26294
|
+
return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
|
|
26295
|
+
}
|
|
26206
26296
|
extractComboChart(chartElement) {
|
|
26207
26297
|
// Title can be separated into multiple xml elements (for styling and such), we only import the text
|
|
26208
26298
|
const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
|
|
@@ -36204,6 +36294,7 @@ const irregularityMap = {
|
|
|
36204
36294
|
fingerprintStore.enable();
|
|
36205
36295
|
}
|
|
36206
36296
|
},
|
|
36297
|
+
isReadonlyAllowed: true,
|
|
36207
36298
|
icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
|
|
36208
36299
|
};
|
|
36209
36300
|
const viewFormulas = {
|
|
@@ -46763,6 +46854,7 @@ class RemoveDuplicatesPanel extends Component {
|
|
|
46763
46854
|
columns: {},
|
|
46764
46855
|
});
|
|
46765
46856
|
setup() {
|
|
46857
|
+
this.updateColumns();
|
|
46766
46858
|
onWillUpdateProps(() => this.updateColumns());
|
|
46767
46859
|
}
|
|
46768
46860
|
toggleHasHeader() {
|
|
@@ -48550,8 +48642,8 @@ class CellComposerStore extends AbstractComposerStore {
|
|
|
48550
48642
|
const sheetIdExists = !!this.getters.tryGetSheet(this.sheetId);
|
|
48551
48643
|
if (!sheetIdExists && this.editionMode !== "inactive") {
|
|
48552
48644
|
this.sheetId = this.getters.getActiveSheetId();
|
|
48553
|
-
this.cancelEditionAndActivateSheet();
|
|
48554
48645
|
this.resetContent();
|
|
48646
|
+
this.cancelEditionAndActivateSheet();
|
|
48555
48647
|
this.notificationStore.raiseError(CELL_DELETED_MESSAGE);
|
|
48556
48648
|
}
|
|
48557
48649
|
break;
|
|
@@ -50409,6 +50501,9 @@ class ColResizer extends AbstractResizer {
|
|
|
50409
50501
|
this.MAX_SIZE_MARGIN = 90;
|
|
50410
50502
|
this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
|
|
50411
50503
|
}
|
|
50504
|
+
get sheetId() {
|
|
50505
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50506
|
+
}
|
|
50412
50507
|
_getEvOffset(ev) {
|
|
50413
50508
|
return ev.offsetX;
|
|
50414
50509
|
}
|
|
@@ -50431,10 +50526,10 @@ class ColResizer extends AbstractResizer {
|
|
|
50431
50526
|
return this.env.model.getters.getEdgeScrollCol(position, position, position);
|
|
50432
50527
|
}
|
|
50433
50528
|
_getDimensionsInViewport(index) {
|
|
50434
|
-
return this.env.model.getters.getColDimensionsInViewport(this.
|
|
50529
|
+
return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
|
|
50435
50530
|
}
|
|
50436
50531
|
_getElementSize(index) {
|
|
50437
|
-
return this.env.model.getters.getColSize(this.
|
|
50532
|
+
return this.env.model.getters.getColSize(this.sheetId, index);
|
|
50438
50533
|
}
|
|
50439
50534
|
_getMaxSize() {
|
|
50440
50535
|
return this.colResizerRef.el.clientWidth;
|
|
@@ -50445,7 +50540,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50445
50540
|
const cols = this.env.model.getters.getActiveCols();
|
|
50446
50541
|
this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
50447
50542
|
dimension: "COL",
|
|
50448
|
-
sheetId: this.
|
|
50543
|
+
sheetId: this.sheetId,
|
|
50449
50544
|
elements: cols.has(index) ? [...cols] : [index],
|
|
50450
50545
|
size,
|
|
50451
50546
|
});
|
|
@@ -50458,7 +50553,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50458
50553
|
elements.push(colIndex);
|
|
50459
50554
|
}
|
|
50460
50555
|
const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
|
|
50461
|
-
sheetId: this.
|
|
50556
|
+
sheetId: this.sheetId,
|
|
50462
50557
|
dimension: "COL",
|
|
50463
50558
|
base: this.state.base,
|
|
50464
50559
|
elements,
|
|
@@ -50477,7 +50572,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50477
50572
|
_fitElementSize(index) {
|
|
50478
50573
|
const cols = this.env.model.getters.getActiveCols();
|
|
50479
50574
|
this.env.model.dispatch("AUTORESIZE_COLUMNS", {
|
|
50480
|
-
sheetId: this.
|
|
50575
|
+
sheetId: this.sheetId,
|
|
50481
50576
|
cols: cols.has(index) ? [...cols] : [index],
|
|
50482
50577
|
});
|
|
50483
50578
|
}
|
|
@@ -50488,7 +50583,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50488
50583
|
return this.env.model.getters.getActiveCols();
|
|
50489
50584
|
}
|
|
50490
50585
|
_getPreviousVisibleElement(index) {
|
|
50491
|
-
const sheetId = this.
|
|
50586
|
+
const sheetId = this.sheetId;
|
|
50492
50587
|
let row;
|
|
50493
50588
|
for (row = index - 1; row >= 0; row--) {
|
|
50494
50589
|
if (!this.env.model.getters.isColHidden(sheetId, row)) {
|
|
@@ -50499,7 +50594,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50499
50594
|
}
|
|
50500
50595
|
unhide(hiddenElements) {
|
|
50501
50596
|
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50502
|
-
sheetId: this.
|
|
50597
|
+
sheetId: this.sheetId,
|
|
50503
50598
|
elements: hiddenElements,
|
|
50504
50599
|
dimension: "COL",
|
|
50505
50600
|
});
|
|
@@ -50515,7 +50610,7 @@ css /* scss */ `
|
|
|
50515
50610
|
left: 0;
|
|
50516
50611
|
right: 0;
|
|
50517
50612
|
width: ${HEADER_WIDTH}px;
|
|
50518
|
-
height: 100
|
|
50613
|
+
height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
|
|
50519
50614
|
&.o-dragging {
|
|
50520
50615
|
cursor: grabbing;
|
|
50521
50616
|
}
|
|
@@ -50573,6 +50668,9 @@ class RowResizer extends AbstractResizer {
|
|
|
50573
50668
|
this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
|
|
50574
50669
|
}
|
|
50575
50670
|
rowResizerRef;
|
|
50671
|
+
get sheetId() {
|
|
50672
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50673
|
+
}
|
|
50576
50674
|
_getEvOffset(ev) {
|
|
50577
50675
|
return ev.offsetY;
|
|
50578
50676
|
}
|
|
@@ -50595,10 +50693,10 @@ class RowResizer extends AbstractResizer {
|
|
|
50595
50693
|
return this.env.model.getters.getEdgeScrollRow(position, position, position);
|
|
50596
50694
|
}
|
|
50597
50695
|
_getDimensionsInViewport(index) {
|
|
50598
|
-
return this.env.model.getters.getRowDimensionsInViewport(this.
|
|
50696
|
+
return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
|
|
50599
50697
|
}
|
|
50600
50698
|
_getElementSize(index) {
|
|
50601
|
-
return this.env.model.getters.getRowSize(this.
|
|
50699
|
+
return this.env.model.getters.getRowSize(this.sheetId, index);
|
|
50602
50700
|
}
|
|
50603
50701
|
_getMaxSize() {
|
|
50604
50702
|
return this.rowResizerRef.el.clientHeight;
|
|
@@ -50609,7 +50707,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50609
50707
|
const rows = this.env.model.getters.getActiveRows();
|
|
50610
50708
|
this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
50611
50709
|
dimension: "ROW",
|
|
50612
|
-
sheetId: this.
|
|
50710
|
+
sheetId: this.sheetId,
|
|
50613
50711
|
elements: rows.has(index) ? [...rows] : [index],
|
|
50614
50712
|
size,
|
|
50615
50713
|
});
|
|
@@ -50622,7 +50720,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50622
50720
|
elements.push(rowIndex);
|
|
50623
50721
|
}
|
|
50624
50722
|
const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
|
|
50625
|
-
sheetId: this.
|
|
50723
|
+
sheetId: this.sheetId,
|
|
50626
50724
|
dimension: "ROW",
|
|
50627
50725
|
base: this.state.base,
|
|
50628
50726
|
elements,
|
|
@@ -50641,7 +50739,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50641
50739
|
_fitElementSize(index) {
|
|
50642
50740
|
const rows = this.env.model.getters.getActiveRows();
|
|
50643
50741
|
this.env.model.dispatch("AUTORESIZE_ROWS", {
|
|
50644
|
-
sheetId: this.
|
|
50742
|
+
sheetId: this.sheetId,
|
|
50645
50743
|
rows: rows.has(index) ? [...rows] : [index],
|
|
50646
50744
|
});
|
|
50647
50745
|
}
|
|
@@ -50652,7 +50750,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50652
50750
|
return this.env.model.getters.getActiveRows();
|
|
50653
50751
|
}
|
|
50654
50752
|
_getPreviousVisibleElement(index) {
|
|
50655
|
-
const sheetId = this.
|
|
50753
|
+
const sheetId = this.sheetId;
|
|
50656
50754
|
let row;
|
|
50657
50755
|
for (row = index - 1; row >= 0; row--) {
|
|
50658
50756
|
if (!this.env.model.getters.isRowHidden(sheetId, row)) {
|
|
@@ -50663,7 +50761,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50663
50761
|
}
|
|
50664
50762
|
unhide(hiddenElements) {
|
|
50665
50763
|
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50666
|
-
sheetId: this.
|
|
50764
|
+
sheetId: this.sheetId,
|
|
50667
50765
|
dimension: "ROW",
|
|
50668
50766
|
elements: hiddenElements,
|
|
50669
50767
|
});
|
|
@@ -64832,12 +64930,7 @@ class SheetUIPlugin extends UIPlugin {
|
|
|
64832
64930
|
}
|
|
64833
64931
|
break;
|
|
64834
64932
|
case "AUTORESIZE_ROWS":
|
|
64835
|
-
this.
|
|
64836
|
-
elements: cmd.rows,
|
|
64837
|
-
dimension: "ROW",
|
|
64838
|
-
size: null,
|
|
64839
|
-
sheetId: cmd.sheetId,
|
|
64840
|
-
});
|
|
64933
|
+
this.autoResizeRows(cmd.sheetId, cmd.rows);
|
|
64841
64934
|
break;
|
|
64842
64935
|
}
|
|
64843
64936
|
}
|
|
@@ -65001,6 +65094,48 @@ class SheetUIPlugin extends UIPlugin {
|
|
|
65001
65094
|
}
|
|
65002
65095
|
return "Success" /* CommandResult.Success */;
|
|
65003
65096
|
}
|
|
65097
|
+
autoResizeRows(sheetId, rows) {
|
|
65098
|
+
const rowSizes = [];
|
|
65099
|
+
for (const row of rows) {
|
|
65100
|
+
let evaluatedRowSize = 0;
|
|
65101
|
+
for (const cellId of this.getters.getRowCells(sheetId, row)) {
|
|
65102
|
+
const cell = this.getters.getCellById(cellId);
|
|
65103
|
+
if (!cell) {
|
|
65104
|
+
continue;
|
|
65105
|
+
}
|
|
65106
|
+
const position = this.getters.getCellPosition(cell.id);
|
|
65107
|
+
const colSize = this.getters.getColSize(sheetId, position.col);
|
|
65108
|
+
if (cell.isFormula) {
|
|
65109
|
+
const content = this.getters.getEvaluatedCell(position).formattedValue;
|
|
65110
|
+
const evaluatedSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
|
|
65111
|
+
if (evaluatedSize > evaluatedRowSize && evaluatedSize > DEFAULT_CELL_HEIGHT) {
|
|
65112
|
+
evaluatedRowSize = evaluatedSize;
|
|
65113
|
+
}
|
|
65114
|
+
}
|
|
65115
|
+
else {
|
|
65116
|
+
const content = cell.content;
|
|
65117
|
+
const dynamicRowSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
|
|
65118
|
+
// Only keep the size of evaluated cells if it's bigger than the dynamic row size
|
|
65119
|
+
if (dynamicRowSize >= evaluatedRowSize && dynamicRowSize > DEFAULT_CELL_HEIGHT) {
|
|
65120
|
+
evaluatedRowSize = 0;
|
|
65121
|
+
}
|
|
65122
|
+
}
|
|
65123
|
+
}
|
|
65124
|
+
rowSizes.push(evaluatedRowSize || null);
|
|
65125
|
+
}
|
|
65126
|
+
const groupedSizes = new Map(rowSizes.map((size) => [size, []]));
|
|
65127
|
+
for (let i = 0; i < rowSizes.length; i++) {
|
|
65128
|
+
groupedSizes.get(rowSizes[i])?.push(rows[i]);
|
|
65129
|
+
}
|
|
65130
|
+
for (const [size, rows] of groupedSizes) {
|
|
65131
|
+
this.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
65132
|
+
elements: rows,
|
|
65133
|
+
dimension: "ROW",
|
|
65134
|
+
size,
|
|
65135
|
+
sheetId,
|
|
65136
|
+
});
|
|
65137
|
+
}
|
|
65138
|
+
}
|
|
65004
65139
|
}
|
|
65005
65140
|
|
|
65006
65141
|
class TableComputedStylePlugin extends UIPlugin {
|
|
@@ -67902,7 +68037,8 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
67902
68037
|
? this.getters.getSheetViewVisibleCols()
|
|
67903
68038
|
: this.getters.getSheetViewVisibleRows();
|
|
67904
68039
|
const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
|
|
67905
|
-
|
|
68040
|
+
let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
|
|
68041
|
+
endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
|
|
67906
68042
|
const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
|
|
67907
68043
|
let offset = 0;
|
|
67908
68044
|
for (const i of relevantIndexes) {
|
|
@@ -74009,7 +74145,7 @@ function addStyles(styles) {
|
|
|
74009
74145
|
}
|
|
74010
74146
|
if (alignAttrs.length > 0) {
|
|
74011
74147
|
attributes.push(["applyAlignment", "1"]); // for Libre Office
|
|
74012
|
-
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}
|
|
74148
|
+
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
|
|
74013
74149
|
}
|
|
74014
74150
|
else {
|
|
74015
74151
|
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
|
|
@@ -74177,6 +74313,9 @@ function addColumns(cols) {
|
|
|
74177
74313
|
}
|
|
74178
74314
|
function addRows(construct, data, sheet) {
|
|
74179
74315
|
const rowNodes = [];
|
|
74316
|
+
const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
|
|
74317
|
+
const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
|
|
74318
|
+
const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
|
|
74180
74319
|
for (let r = 0; r < sheet.rowNumber; r++) {
|
|
74181
74320
|
const rowAttrs = [["r", r + 1]];
|
|
74182
74321
|
const row = sheet.rows[r] || {};
|
|
@@ -74192,9 +74331,6 @@ function addRows(construct, data, sheet) {
|
|
|
74192
74331
|
if (row.collapsed) {
|
|
74193
74332
|
rowAttrs.push(["collapsed", 1]);
|
|
74194
74333
|
}
|
|
74195
|
-
const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
|
|
74196
|
-
const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
|
|
74197
|
-
const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
|
|
74198
74334
|
const cellNodes = [];
|
|
74199
74335
|
for (let c = 0; c < sheet.colNumber; c++) {
|
|
74200
74336
|
const xc = toXC(c, r);
|
|
@@ -75422,6 +75558,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
|
|
|
75422
75558
|
export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
|
|
75423
75559
|
|
|
75424
75560
|
|
|
75425
|
-
__info__.version = "18.1.
|
|
75426
|
-
__info__.date = "2025-03-
|
|
75427
|
-
__info__.hash = "
|
|
75561
|
+
__info__.version = "18.1.12";
|
|
75562
|
+
__info__.date = "2025-03-19T08:23:50.676Z";
|
|
75563
|
+
__info__.hash = "32f788f";
|