@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
|
'use strict';
|
|
@@ -424,7 +424,6 @@ function escapeRegExp(str) {
|
|
|
424
424
|
* Sparse arrays remain sparse.
|
|
425
425
|
*/
|
|
426
426
|
function deepCopy(obj) {
|
|
427
|
-
const result = Array.isArray(obj) ? [] : {};
|
|
428
427
|
switch (typeof obj) {
|
|
429
428
|
case "object": {
|
|
430
429
|
if (obj === null) {
|
|
@@ -436,8 +435,18 @@ function deepCopy(obj) {
|
|
|
436
435
|
else if (!(isPlainObject(obj) || obj instanceof Array)) {
|
|
437
436
|
throw new Error("Unsupported type: only objects and arrays are supported");
|
|
438
437
|
}
|
|
439
|
-
|
|
440
|
-
|
|
438
|
+
const result = Array.isArray(obj) ? new Array(obj.length) : {};
|
|
439
|
+
if (Array.isArray(obj)) {
|
|
440
|
+
for (let i = 0, len = obj.length; i < len; i++) {
|
|
441
|
+
if (i in obj) {
|
|
442
|
+
result[i] = deepCopy(obj[i]);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
for (const key in obj) {
|
|
448
|
+
result[key] = deepCopy(obj[key]);
|
|
449
|
+
}
|
|
441
450
|
}
|
|
442
451
|
return result;
|
|
443
452
|
}
|
|
@@ -2690,21 +2699,30 @@ function mergeContiguousZones(zones) {
|
|
|
2690
2699
|
return mergedZones;
|
|
2691
2700
|
}
|
|
2692
2701
|
|
|
2702
|
+
const globalReverseLookup$1 = new WeakMap();
|
|
2703
|
+
const globalIdCounter = new WeakMap();
|
|
2693
2704
|
/**
|
|
2694
2705
|
* Get the id of the given item (its key in the given dictionary).
|
|
2695
2706
|
* If the given item does not exist in the dictionary, it creates one with a new id.
|
|
2696
2707
|
*/
|
|
2697
2708
|
function getItemId(item, itemsDic) {
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2709
|
+
if (!globalReverseLookup$1.has(itemsDic)) {
|
|
2710
|
+
globalReverseLookup$1.set(itemsDic, new Map());
|
|
2711
|
+
globalIdCounter.set(itemsDic, 0);
|
|
2712
|
+
}
|
|
2713
|
+
const reverseLookup = globalReverseLookup$1.get(itemsDic);
|
|
2714
|
+
const canonical = getCanonicalRepresentation(item);
|
|
2715
|
+
if (reverseLookup.has(canonical)) {
|
|
2716
|
+
const id = reverseLookup.get(canonical);
|
|
2717
|
+
itemsDic[id] = item;
|
|
2718
|
+
return id;
|
|
2702
2719
|
}
|
|
2703
2720
|
// Generate new Id if the item didn't exist in the dictionary
|
|
2704
|
-
const
|
|
2705
|
-
|
|
2706
|
-
itemsDic
|
|
2707
|
-
|
|
2721
|
+
const newId = globalIdCounter.get(itemsDic) + 1;
|
|
2722
|
+
reverseLookup.set(canonical, newId);
|
|
2723
|
+
globalIdCounter.set(itemsDic, newId);
|
|
2724
|
+
itemsDic[newId] = item;
|
|
2725
|
+
return newId;
|
|
2708
2726
|
}
|
|
2709
2727
|
function groupItemIdsByZones(positionsByItemId) {
|
|
2710
2728
|
const result = {};
|
|
@@ -2728,6 +2746,33 @@ function* iterateItemIdsPositions(sheetId, itemIdsByZones) {
|
|
|
2728
2746
|
}
|
|
2729
2747
|
}
|
|
2730
2748
|
}
|
|
2749
|
+
function getCanonicalRepresentation(item) {
|
|
2750
|
+
if (item === null)
|
|
2751
|
+
return "null";
|
|
2752
|
+
if (item === undefined)
|
|
2753
|
+
return "undefined";
|
|
2754
|
+
if (typeof item !== "object")
|
|
2755
|
+
return String(item);
|
|
2756
|
+
if (Array.isArray(item)) {
|
|
2757
|
+
const len = item.length;
|
|
2758
|
+
let result = "[";
|
|
2759
|
+
for (let i = 0; i < len; i++) {
|
|
2760
|
+
if (i > 0)
|
|
2761
|
+
result += ",";
|
|
2762
|
+
result += getCanonicalRepresentation(item[i]);
|
|
2763
|
+
}
|
|
2764
|
+
return result + "]";
|
|
2765
|
+
}
|
|
2766
|
+
const keys = Object.keys(item).sort();
|
|
2767
|
+
let repr = "{";
|
|
2768
|
+
for (const key of keys) {
|
|
2769
|
+
if (item[key] !== undefined) {
|
|
2770
|
+
repr += `"${key}":${getCanonicalRepresentation(item[key])},`;
|
|
2771
|
+
}
|
|
2772
|
+
}
|
|
2773
|
+
repr += "}";
|
|
2774
|
+
return repr;
|
|
2775
|
+
}
|
|
2731
2776
|
|
|
2732
2777
|
// -----------------------------------------------------------------------------
|
|
2733
2778
|
// Date Type
|
|
@@ -6233,11 +6278,13 @@ function getDefaultCellHeight(ctx, cell, colSize) {
|
|
|
6233
6278
|
if (!cell || (!cell.isFormula && !cell.content)) {
|
|
6234
6279
|
return DEFAULT_CELL_HEIGHT;
|
|
6235
6280
|
}
|
|
6236
|
-
const
|
|
6237
|
-
|
|
6238
|
-
|
|
6239
|
-
|
|
6240
|
-
const
|
|
6281
|
+
const content = cell.isFormula ? "" : cell.content;
|
|
6282
|
+
return getCellContentHeight(ctx, content, cell.style, colSize);
|
|
6283
|
+
}
|
|
6284
|
+
function getCellContentHeight(ctx, content, style, colSize) {
|
|
6285
|
+
const maxWidth = style?.wrapping === "wrap" ? colSize - 2 * MIN_CELL_TEXT_MARGIN : undefined;
|
|
6286
|
+
const numberOfLines = splitTextToWidth(ctx, content, style, maxWidth).length;
|
|
6287
|
+
const fontSize = computeTextFontSizeInPixels(style);
|
|
6241
6288
|
return computeTextLinesHeight(fontSize, numberOfLines) + 2 * PADDING_AUTORESIZE_VERTICAL;
|
|
6242
6289
|
}
|
|
6243
6290
|
function getDefaultContextFont(fontSize, bold = false, italic = false) {
|
|
@@ -8281,7 +8328,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
|
|
|
8281
8328
|
const possibleValues = pivot
|
|
8282
8329
|
.getPossibleFieldValues(columns[i])
|
|
8283
8330
|
.map((v) => v.value);
|
|
8284
|
-
if (!possibleValues.includes(sortedColumn.domain[i].value)
|
|
8331
|
+
if (!possibleValues.includes(sortedColumn.domain[i].value) &&
|
|
8332
|
+
!(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
|
|
8285
8333
|
return false;
|
|
8286
8334
|
}
|
|
8287
8335
|
}
|
|
@@ -8432,13 +8480,6 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
8432
8480
|
this.clearClippedZones(content);
|
|
8433
8481
|
const selection = target[0];
|
|
8434
8482
|
this.pasteZone(sheetId, selection.left, selection.top, content.cells, options);
|
|
8435
|
-
this.dispatch("MOVE_RANGES", {
|
|
8436
|
-
target: content.zones,
|
|
8437
|
-
sheetId: content.sheetId,
|
|
8438
|
-
targetSheetId: sheetId,
|
|
8439
|
-
col: selection.left,
|
|
8440
|
-
row: selection.top,
|
|
8441
|
-
});
|
|
8442
8483
|
}
|
|
8443
8484
|
/**
|
|
8444
8485
|
* Clear the clipped zones: remove the cells and clear the formatting
|
|
@@ -8947,14 +8988,15 @@ class MergeClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
8947
8988
|
}
|
|
8948
8989
|
merges.push(mergesInRow);
|
|
8949
8990
|
}
|
|
8950
|
-
return { merges };
|
|
8991
|
+
return { merges, sheetId };
|
|
8951
8992
|
}
|
|
8952
8993
|
/**
|
|
8953
8994
|
* Paste the clipboard content in the given target
|
|
8954
8995
|
*/
|
|
8955
8996
|
paste(target, content, options) {
|
|
8956
8997
|
if (options.isCutOperation) {
|
|
8957
|
-
|
|
8998
|
+
const copiedMerges = content.merges.flat().filter(isDefined);
|
|
8999
|
+
this.dispatch("REMOVE_MERGE", { sheetId: content.sheetId, target: copiedMerges });
|
|
8958
9000
|
}
|
|
8959
9001
|
this.pasteFromCopy(target.sheetId, target.zones, content.merges, options);
|
|
8960
9002
|
}
|
|
@@ -8989,6 +9031,27 @@ class MergeClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
8989
9031
|
}
|
|
8990
9032
|
}
|
|
8991
9033
|
|
|
9034
|
+
class ReferenceClipboardHandler extends AbstractCellClipboardHandler {
|
|
9035
|
+
copy(data) {
|
|
9036
|
+
return {
|
|
9037
|
+
zones: data.clippedZones,
|
|
9038
|
+
sheetId: data.sheetId,
|
|
9039
|
+
};
|
|
9040
|
+
}
|
|
9041
|
+
paste(target, content, options) {
|
|
9042
|
+
if (options.isCutOperation) {
|
|
9043
|
+
const selection = target.zones[0];
|
|
9044
|
+
this.dispatch("MOVE_RANGES", {
|
|
9045
|
+
target: content.zones,
|
|
9046
|
+
sheetId: content.sheetId,
|
|
9047
|
+
targetSheetId: target.sheetId,
|
|
9048
|
+
col: selection.left,
|
|
9049
|
+
row: selection.top,
|
|
9050
|
+
});
|
|
9051
|
+
}
|
|
9052
|
+
}
|
|
9053
|
+
}
|
|
9054
|
+
|
|
8992
9055
|
class SheetClipboardHandler extends AbstractCellClipboardHandler {
|
|
8993
9056
|
isPasteAllowed(sheetId, target, content, options) {
|
|
8994
9057
|
if (!("cells" in content)) {
|
|
@@ -9152,7 +9215,8 @@ clipboardHandlersRegistries.cellHandlers
|
|
|
9152
9215
|
.add("merge", MergeClipboardHandler)
|
|
9153
9216
|
.add("border", BorderClipboardHandler)
|
|
9154
9217
|
.add("table", TableClipboardHandler)
|
|
9155
|
-
.add("conditionalFormat", ConditionalFormatClipboardHandler)
|
|
9218
|
+
.add("conditionalFormat", ConditionalFormatClipboardHandler)
|
|
9219
|
+
.add("references", ReferenceClipboardHandler);
|
|
9156
9220
|
|
|
9157
9221
|
function transformZone(zone, executed) {
|
|
9158
9222
|
if (executed.type === "REMOVE_COLUMNS_ROWS") {
|
|
@@ -11156,6 +11220,7 @@ class ScorecardChart extends owl.Component {
|
|
|
11156
11220
|
const autoCompleteProviders = new Registry();
|
|
11157
11221
|
|
|
11158
11222
|
autoCompleteProviders.add("dataValidation", {
|
|
11223
|
+
displayAllOnInitialContent: true,
|
|
11159
11224
|
getProposals(tokenAtCursor, content) {
|
|
11160
11225
|
if (content.startsWith("=")) {
|
|
11161
11226
|
return [];
|
|
@@ -20948,8 +21013,8 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
20948
21013
|
this.computeParenthesisRelatedToCursor();
|
|
20949
21014
|
}
|
|
20950
21015
|
cancelEdition() {
|
|
20951
|
-
this.cancelEditionAndActivateSheet();
|
|
20952
21016
|
this.resetContent();
|
|
21017
|
+
this.cancelEditionAndActivateSheet();
|
|
20953
21018
|
}
|
|
20954
21019
|
setCurrentContent(content, selection) {
|
|
20955
21020
|
if (selection && !this.isSelectionValid(content.length, selection.start, selection.end)) {
|
|
@@ -20967,8 +21032,8 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
20967
21032
|
switch (cmd.type) {
|
|
20968
21033
|
case "SELECT_FIGURE":
|
|
20969
21034
|
if (cmd.id) {
|
|
20970
|
-
this.cancelEditionAndActivateSheet();
|
|
20971
21035
|
this.resetContent();
|
|
21036
|
+
this.cancelEditionAndActivateSheet();
|
|
20972
21037
|
}
|
|
20973
21038
|
break;
|
|
20974
21039
|
case "START_CHANGE_HIGHLIGHT":
|
|
@@ -21452,6 +21517,15 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
21452
21517
|
const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
|
|
21453
21518
|
// remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
|
|
21454
21519
|
const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
|
|
21520
|
+
if (this._currentContent === this.initialContent &&
|
|
21521
|
+
provider.displayAllOnInitialContent &&
|
|
21522
|
+
proposals?.length) {
|
|
21523
|
+
return {
|
|
21524
|
+
proposals,
|
|
21525
|
+
selectProposal: provider.selectProposal,
|
|
21526
|
+
autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
|
|
21527
|
+
};
|
|
21528
|
+
}
|
|
21455
21529
|
if (exactMatch && this._currentContent !== this.initialContent) {
|
|
21456
21530
|
// this means the user has chosen a proposal
|
|
21457
21531
|
return;
|
|
@@ -22275,7 +22349,7 @@ autoCompleteProviders.add("pivot_group_values", {
|
|
|
22275
22349
|
text,
|
|
22276
22350
|
description: usedLabel,
|
|
22277
22351
|
htmlContent: [{ value: text, color }],
|
|
22278
|
-
fuzzySearchKey:
|
|
22352
|
+
fuzzySearchKey: text + usedLabel,
|
|
22279
22353
|
};
|
|
22280
22354
|
});
|
|
22281
22355
|
},
|
|
@@ -24337,16 +24411,25 @@ function addRelsToFile(relsFiles, path, rel) {
|
|
|
24337
24411
|
}
|
|
24338
24412
|
return id;
|
|
24339
24413
|
}
|
|
24414
|
+
const globalReverseLookup = new WeakMap();
|
|
24340
24415
|
function pushElement(property, propertyList) {
|
|
24341
|
-
let
|
|
24342
|
-
|
|
24343
|
-
|
|
24344
|
-
|
|
24345
|
-
|
|
24416
|
+
let reverseLookup = globalReverseLookup.get(propertyList);
|
|
24417
|
+
if (!reverseLookup) {
|
|
24418
|
+
reverseLookup = new Map();
|
|
24419
|
+
for (let i = 0; i < propertyList.length; i++) {
|
|
24420
|
+
const canonical = getCanonicalRepresentation(propertyList[i]);
|
|
24421
|
+
reverseLookup.set(canonical, i);
|
|
24346
24422
|
}
|
|
24423
|
+
globalReverseLookup.set(propertyList, reverseLookup);
|
|
24424
|
+
}
|
|
24425
|
+
const canonical = getCanonicalRepresentation(property);
|
|
24426
|
+
if (reverseLookup.has(canonical)) {
|
|
24427
|
+
return reverseLookup.get(canonical);
|
|
24347
24428
|
}
|
|
24348
|
-
propertyList
|
|
24349
|
-
|
|
24429
|
+
const maxId = propertyList.length;
|
|
24430
|
+
propertyList.push(property);
|
|
24431
|
+
reverseLookup.set(canonical, maxId);
|
|
24432
|
+
return maxId;
|
|
24350
24433
|
}
|
|
24351
24434
|
const chartIds = [];
|
|
24352
24435
|
/**
|
|
@@ -26193,7 +26276,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
|
|
|
26193
26276
|
title: { text: chartTitle },
|
|
26194
26277
|
type: CHART_TYPE_CONVERSION_MAP[chartType],
|
|
26195
26278
|
dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
|
|
26196
|
-
labelRange: this.
|
|
26279
|
+
labelRange: this.extractLabelRange(chartType, rootChartElement),
|
|
26197
26280
|
backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
|
|
26198
26281
|
default: "ffffff",
|
|
26199
26282
|
}).asString(),
|
|
@@ -26205,6 +26288,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
|
|
|
26205
26288
|
};
|
|
26206
26289
|
})[0];
|
|
26207
26290
|
}
|
|
26291
|
+
extractLabelRange(chartType, rootChartElement) {
|
|
26292
|
+
if (chartType === "scatterChart") {
|
|
26293
|
+
return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
|
|
26294
|
+
this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
|
|
26295
|
+
}
|
|
26296
|
+
return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
|
|
26297
|
+
}
|
|
26208
26298
|
extractComboChart(chartElement) {
|
|
26209
26299
|
// Title can be separated into multiple xml elements (for styling and such), we only import the text
|
|
26210
26300
|
const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
|
|
@@ -36206,6 +36296,7 @@ const irregularityMap = {
|
|
|
36206
36296
|
fingerprintStore.enable();
|
|
36207
36297
|
}
|
|
36208
36298
|
},
|
|
36299
|
+
isReadonlyAllowed: true,
|
|
36209
36300
|
icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
|
|
36210
36301
|
};
|
|
36211
36302
|
const viewFormulas = {
|
|
@@ -46765,6 +46856,7 @@ class RemoveDuplicatesPanel extends owl.Component {
|
|
|
46765
46856
|
columns: {},
|
|
46766
46857
|
});
|
|
46767
46858
|
setup() {
|
|
46859
|
+
this.updateColumns();
|
|
46768
46860
|
owl.onWillUpdateProps(() => this.updateColumns());
|
|
46769
46861
|
}
|
|
46770
46862
|
toggleHasHeader() {
|
|
@@ -48552,8 +48644,8 @@ class CellComposerStore extends AbstractComposerStore {
|
|
|
48552
48644
|
const sheetIdExists = !!this.getters.tryGetSheet(this.sheetId);
|
|
48553
48645
|
if (!sheetIdExists && this.editionMode !== "inactive") {
|
|
48554
48646
|
this.sheetId = this.getters.getActiveSheetId();
|
|
48555
|
-
this.cancelEditionAndActivateSheet();
|
|
48556
48647
|
this.resetContent();
|
|
48648
|
+
this.cancelEditionAndActivateSheet();
|
|
48557
48649
|
this.notificationStore.raiseError(CELL_DELETED_MESSAGE);
|
|
48558
48650
|
}
|
|
48559
48651
|
break;
|
|
@@ -50411,6 +50503,9 @@ class ColResizer extends AbstractResizer {
|
|
|
50411
50503
|
this.MAX_SIZE_MARGIN = 90;
|
|
50412
50504
|
this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
|
|
50413
50505
|
}
|
|
50506
|
+
get sheetId() {
|
|
50507
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50508
|
+
}
|
|
50414
50509
|
_getEvOffset(ev) {
|
|
50415
50510
|
return ev.offsetX;
|
|
50416
50511
|
}
|
|
@@ -50433,10 +50528,10 @@ class ColResizer extends AbstractResizer {
|
|
|
50433
50528
|
return this.env.model.getters.getEdgeScrollCol(position, position, position);
|
|
50434
50529
|
}
|
|
50435
50530
|
_getDimensionsInViewport(index) {
|
|
50436
|
-
return this.env.model.getters.getColDimensionsInViewport(this.
|
|
50531
|
+
return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
|
|
50437
50532
|
}
|
|
50438
50533
|
_getElementSize(index) {
|
|
50439
|
-
return this.env.model.getters.getColSize(this.
|
|
50534
|
+
return this.env.model.getters.getColSize(this.sheetId, index);
|
|
50440
50535
|
}
|
|
50441
50536
|
_getMaxSize() {
|
|
50442
50537
|
return this.colResizerRef.el.clientWidth;
|
|
@@ -50447,7 +50542,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50447
50542
|
const cols = this.env.model.getters.getActiveCols();
|
|
50448
50543
|
this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
50449
50544
|
dimension: "COL",
|
|
50450
|
-
sheetId: this.
|
|
50545
|
+
sheetId: this.sheetId,
|
|
50451
50546
|
elements: cols.has(index) ? [...cols] : [index],
|
|
50452
50547
|
size,
|
|
50453
50548
|
});
|
|
@@ -50460,7 +50555,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50460
50555
|
elements.push(colIndex);
|
|
50461
50556
|
}
|
|
50462
50557
|
const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
|
|
50463
|
-
sheetId: this.
|
|
50558
|
+
sheetId: this.sheetId,
|
|
50464
50559
|
dimension: "COL",
|
|
50465
50560
|
base: this.state.base,
|
|
50466
50561
|
elements,
|
|
@@ -50479,7 +50574,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50479
50574
|
_fitElementSize(index) {
|
|
50480
50575
|
const cols = this.env.model.getters.getActiveCols();
|
|
50481
50576
|
this.env.model.dispatch("AUTORESIZE_COLUMNS", {
|
|
50482
|
-
sheetId: this.
|
|
50577
|
+
sheetId: this.sheetId,
|
|
50483
50578
|
cols: cols.has(index) ? [...cols] : [index],
|
|
50484
50579
|
});
|
|
50485
50580
|
}
|
|
@@ -50490,7 +50585,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50490
50585
|
return this.env.model.getters.getActiveCols();
|
|
50491
50586
|
}
|
|
50492
50587
|
_getPreviousVisibleElement(index) {
|
|
50493
|
-
const sheetId = this.
|
|
50588
|
+
const sheetId = this.sheetId;
|
|
50494
50589
|
let row;
|
|
50495
50590
|
for (row = index - 1; row >= 0; row--) {
|
|
50496
50591
|
if (!this.env.model.getters.isColHidden(sheetId, row)) {
|
|
@@ -50501,7 +50596,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50501
50596
|
}
|
|
50502
50597
|
unhide(hiddenElements) {
|
|
50503
50598
|
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50504
|
-
sheetId: this.
|
|
50599
|
+
sheetId: this.sheetId,
|
|
50505
50600
|
elements: hiddenElements,
|
|
50506
50601
|
dimension: "COL",
|
|
50507
50602
|
});
|
|
@@ -50517,7 +50612,7 @@ css /* scss */ `
|
|
|
50517
50612
|
left: 0;
|
|
50518
50613
|
right: 0;
|
|
50519
50614
|
width: ${HEADER_WIDTH}px;
|
|
50520
|
-
height: 100
|
|
50615
|
+
height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
|
|
50521
50616
|
&.o-dragging {
|
|
50522
50617
|
cursor: grabbing;
|
|
50523
50618
|
}
|
|
@@ -50575,6 +50670,9 @@ class RowResizer extends AbstractResizer {
|
|
|
50575
50670
|
this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
|
|
50576
50671
|
}
|
|
50577
50672
|
rowResizerRef;
|
|
50673
|
+
get sheetId() {
|
|
50674
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50675
|
+
}
|
|
50578
50676
|
_getEvOffset(ev) {
|
|
50579
50677
|
return ev.offsetY;
|
|
50580
50678
|
}
|
|
@@ -50597,10 +50695,10 @@ class RowResizer extends AbstractResizer {
|
|
|
50597
50695
|
return this.env.model.getters.getEdgeScrollRow(position, position, position);
|
|
50598
50696
|
}
|
|
50599
50697
|
_getDimensionsInViewport(index) {
|
|
50600
|
-
return this.env.model.getters.getRowDimensionsInViewport(this.
|
|
50698
|
+
return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
|
|
50601
50699
|
}
|
|
50602
50700
|
_getElementSize(index) {
|
|
50603
|
-
return this.env.model.getters.getRowSize(this.
|
|
50701
|
+
return this.env.model.getters.getRowSize(this.sheetId, index);
|
|
50604
50702
|
}
|
|
50605
50703
|
_getMaxSize() {
|
|
50606
50704
|
return this.rowResizerRef.el.clientHeight;
|
|
@@ -50611,7 +50709,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50611
50709
|
const rows = this.env.model.getters.getActiveRows();
|
|
50612
50710
|
this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
50613
50711
|
dimension: "ROW",
|
|
50614
|
-
sheetId: this.
|
|
50712
|
+
sheetId: this.sheetId,
|
|
50615
50713
|
elements: rows.has(index) ? [...rows] : [index],
|
|
50616
50714
|
size,
|
|
50617
50715
|
});
|
|
@@ -50624,7 +50722,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50624
50722
|
elements.push(rowIndex);
|
|
50625
50723
|
}
|
|
50626
50724
|
const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
|
|
50627
|
-
sheetId: this.
|
|
50725
|
+
sheetId: this.sheetId,
|
|
50628
50726
|
dimension: "ROW",
|
|
50629
50727
|
base: this.state.base,
|
|
50630
50728
|
elements,
|
|
@@ -50643,7 +50741,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50643
50741
|
_fitElementSize(index) {
|
|
50644
50742
|
const rows = this.env.model.getters.getActiveRows();
|
|
50645
50743
|
this.env.model.dispatch("AUTORESIZE_ROWS", {
|
|
50646
|
-
sheetId: this.
|
|
50744
|
+
sheetId: this.sheetId,
|
|
50647
50745
|
rows: rows.has(index) ? [...rows] : [index],
|
|
50648
50746
|
});
|
|
50649
50747
|
}
|
|
@@ -50654,7 +50752,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50654
50752
|
return this.env.model.getters.getActiveRows();
|
|
50655
50753
|
}
|
|
50656
50754
|
_getPreviousVisibleElement(index) {
|
|
50657
|
-
const sheetId = this.
|
|
50755
|
+
const sheetId = this.sheetId;
|
|
50658
50756
|
let row;
|
|
50659
50757
|
for (row = index - 1; row >= 0; row--) {
|
|
50660
50758
|
if (!this.env.model.getters.isRowHidden(sheetId, row)) {
|
|
@@ -50665,7 +50763,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50665
50763
|
}
|
|
50666
50764
|
unhide(hiddenElements) {
|
|
50667
50765
|
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50668
|
-
sheetId: this.
|
|
50766
|
+
sheetId: this.sheetId,
|
|
50669
50767
|
dimension: "ROW",
|
|
50670
50768
|
elements: hiddenElements,
|
|
50671
50769
|
});
|
|
@@ -64834,12 +64932,7 @@ class SheetUIPlugin extends UIPlugin {
|
|
|
64834
64932
|
}
|
|
64835
64933
|
break;
|
|
64836
64934
|
case "AUTORESIZE_ROWS":
|
|
64837
|
-
this.
|
|
64838
|
-
elements: cmd.rows,
|
|
64839
|
-
dimension: "ROW",
|
|
64840
|
-
size: null,
|
|
64841
|
-
sheetId: cmd.sheetId,
|
|
64842
|
-
});
|
|
64935
|
+
this.autoResizeRows(cmd.sheetId, cmd.rows);
|
|
64843
64936
|
break;
|
|
64844
64937
|
}
|
|
64845
64938
|
}
|
|
@@ -65003,6 +65096,48 @@ class SheetUIPlugin extends UIPlugin {
|
|
|
65003
65096
|
}
|
|
65004
65097
|
return "Success" /* CommandResult.Success */;
|
|
65005
65098
|
}
|
|
65099
|
+
autoResizeRows(sheetId, rows) {
|
|
65100
|
+
const rowSizes = [];
|
|
65101
|
+
for (const row of rows) {
|
|
65102
|
+
let evaluatedRowSize = 0;
|
|
65103
|
+
for (const cellId of this.getters.getRowCells(sheetId, row)) {
|
|
65104
|
+
const cell = this.getters.getCellById(cellId);
|
|
65105
|
+
if (!cell) {
|
|
65106
|
+
continue;
|
|
65107
|
+
}
|
|
65108
|
+
const position = this.getters.getCellPosition(cell.id);
|
|
65109
|
+
const colSize = this.getters.getColSize(sheetId, position.col);
|
|
65110
|
+
if (cell.isFormula) {
|
|
65111
|
+
const content = this.getters.getEvaluatedCell(position).formattedValue;
|
|
65112
|
+
const evaluatedSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
|
|
65113
|
+
if (evaluatedSize > evaluatedRowSize && evaluatedSize > DEFAULT_CELL_HEIGHT) {
|
|
65114
|
+
evaluatedRowSize = evaluatedSize;
|
|
65115
|
+
}
|
|
65116
|
+
}
|
|
65117
|
+
else {
|
|
65118
|
+
const content = cell.content;
|
|
65119
|
+
const dynamicRowSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
|
|
65120
|
+
// Only keep the size of evaluated cells if it's bigger than the dynamic row size
|
|
65121
|
+
if (dynamicRowSize >= evaluatedRowSize && dynamicRowSize > DEFAULT_CELL_HEIGHT) {
|
|
65122
|
+
evaluatedRowSize = 0;
|
|
65123
|
+
}
|
|
65124
|
+
}
|
|
65125
|
+
}
|
|
65126
|
+
rowSizes.push(evaluatedRowSize || null);
|
|
65127
|
+
}
|
|
65128
|
+
const groupedSizes = new Map(rowSizes.map((size) => [size, []]));
|
|
65129
|
+
for (let i = 0; i < rowSizes.length; i++) {
|
|
65130
|
+
groupedSizes.get(rowSizes[i])?.push(rows[i]);
|
|
65131
|
+
}
|
|
65132
|
+
for (const [size, rows] of groupedSizes) {
|
|
65133
|
+
this.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
65134
|
+
elements: rows,
|
|
65135
|
+
dimension: "ROW",
|
|
65136
|
+
size,
|
|
65137
|
+
sheetId,
|
|
65138
|
+
});
|
|
65139
|
+
}
|
|
65140
|
+
}
|
|
65006
65141
|
}
|
|
65007
65142
|
|
|
65008
65143
|
class TableComputedStylePlugin extends UIPlugin {
|
|
@@ -67904,7 +68039,8 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
67904
68039
|
? this.getters.getSheetViewVisibleCols()
|
|
67905
68040
|
: this.getters.getSheetViewVisibleRows();
|
|
67906
68041
|
const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
|
|
67907
|
-
|
|
68042
|
+
let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
|
|
68043
|
+
endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
|
|
67908
68044
|
const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
|
|
67909
68045
|
let offset = 0;
|
|
67910
68046
|
for (const i of relevantIndexes) {
|
|
@@ -74011,7 +74147,7 @@ function addStyles(styles) {
|
|
|
74011
74147
|
}
|
|
74012
74148
|
if (alignAttrs.length > 0) {
|
|
74013
74149
|
attributes.push(["applyAlignment", "1"]); // for Libre Office
|
|
74014
|
-
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}
|
|
74150
|
+
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
|
|
74015
74151
|
}
|
|
74016
74152
|
else {
|
|
74017
74153
|
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
|
|
@@ -74179,6 +74315,9 @@ function addColumns(cols) {
|
|
|
74179
74315
|
}
|
|
74180
74316
|
function addRows(construct, data, sheet) {
|
|
74181
74317
|
const rowNodes = [];
|
|
74318
|
+
const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
|
|
74319
|
+
const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
|
|
74320
|
+
const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
|
|
74182
74321
|
for (let r = 0; r < sheet.rowNumber; r++) {
|
|
74183
74322
|
const rowAttrs = [["r", r + 1]];
|
|
74184
74323
|
const row = sheet.rows[r] || {};
|
|
@@ -74194,9 +74333,6 @@ function addRows(construct, data, sheet) {
|
|
|
74194
74333
|
if (row.collapsed) {
|
|
74195
74334
|
rowAttrs.push(["collapsed", 1]);
|
|
74196
74335
|
}
|
|
74197
|
-
const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
|
|
74198
|
-
const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
|
|
74199
|
-
const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
|
|
74200
74336
|
const cellNodes = [];
|
|
74201
74337
|
for (let c = 0; c < sheet.colNumber; c++) {
|
|
74202
74338
|
const xc = toXC(c, r);
|
|
@@ -75468,6 +75604,6 @@ exports.tokenColors = tokenColors;
|
|
|
75468
75604
|
exports.tokenize = tokenize;
|
|
75469
75605
|
|
|
75470
75606
|
|
|
75471
|
-
__info__.version = "18.1.
|
|
75472
|
-
__info__.date = "2025-03-
|
|
75473
|
-
__info__.hash = "
|
|
75607
|
+
__info__.version = "18.1.12";
|
|
75608
|
+
__info__.date = "2025-03-19T08:23:50.676Z";
|
|
75609
|
+
__info__.hash = "32f788f";
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -5732,6 +5732,7 @@ declare class SheetUIPlugin extends UIPlugin {
|
|
|
5732
5732
|
* not outside the sheet.
|
|
5733
5733
|
*/
|
|
5734
5734
|
private checkZonesAreInSheet;
|
|
5735
|
+
private autoResizeRows;
|
|
5735
5736
|
}
|
|
5736
5737
|
|
|
5737
5738
|
declare class CellComputedStylePlugin extends UIPlugin {
|
|
@@ -8493,11 +8494,12 @@ interface ComposerStoreInterface {
|
|
|
8493
8494
|
* We declare the providers in the registry as an object (rather than a class)
|
|
8494
8495
|
* to allow a type-safe way to declare the provider.
|
|
8495
8496
|
* We still want to be able to use `this` for the getters and dispatch for simplicity.
|
|
8496
|
-
* Binding happens at runtime in the
|
|
8497
|
+
* Binding happens at runtime in the composer store.
|
|
8497
8498
|
*/
|
|
8498
8499
|
interface AutoCompleteProviderDefinition {
|
|
8499
8500
|
sequence?: number;
|
|
8500
8501
|
autoSelectFirstProposal?: boolean;
|
|
8502
|
+
displayAllOnInitialContent?: boolean;
|
|
8501
8503
|
maxDisplayedProposals?: number;
|
|
8502
8504
|
getProposals(this: {
|
|
8503
8505
|
composer: ComposerStoreInterface;
|
|
@@ -9219,6 +9221,7 @@ declare class ColResizer extends AbstractResizer {
|
|
|
9219
9221
|
static template: string;
|
|
9220
9222
|
private colResizerRef;
|
|
9221
9223
|
setup(): void;
|
|
9224
|
+
get sheetId(): UID;
|
|
9222
9225
|
_getEvOffset(ev: MouseEvent): Pixel;
|
|
9223
9226
|
_getViewportOffset(): Pixel;
|
|
9224
9227
|
_getClientPosition(ev: MouseEvent): Pixel;
|
|
@@ -9247,6 +9250,7 @@ declare class RowResizer extends AbstractResizer {
|
|
|
9247
9250
|
static template: string;
|
|
9248
9251
|
setup(): void;
|
|
9249
9252
|
private rowResizerRef;
|
|
9253
|
+
get sheetId(): UID;
|
|
9250
9254
|
_getEvOffset(ev: MouseEvent): Pixel;
|
|
9251
9255
|
_getViewportOffset(): Pixel;
|
|
9252
9256
|
_getClientPosition(ev: MouseEvent): Pixel;
|