@odoo/o-spreadsheet 18.2.2 → 18.2.3
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 +251 -58
- package/dist/o-spreadsheet.d.ts +175 -88
- package/dist/o-spreadsheet.esm.js +251 -58
- package/dist/o-spreadsheet.iife.js +251 -58
- package/dist/o-spreadsheet.iife.min.js +388 -387
- package/dist/o_spreadsheet.xml +96 -47
- 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.2.
|
|
6
|
-
* @date 2025-03-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.2.3
|
|
6
|
+
* @date 2025-03-12T15:32:36.274Z
|
|
7
|
+
* @hash 81b0e08
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, App, blockDom, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
|
|
@@ -423,7 +423,6 @@ function escapeRegExp(str) {
|
|
|
423
423
|
* Sparse arrays remain sparse.
|
|
424
424
|
*/
|
|
425
425
|
function deepCopy(obj) {
|
|
426
|
-
const result = Array.isArray(obj) ? [] : {};
|
|
427
426
|
switch (typeof obj) {
|
|
428
427
|
case "object": {
|
|
429
428
|
if (obj === null) {
|
|
@@ -435,8 +434,18 @@ function deepCopy(obj) {
|
|
|
435
434
|
else if (!(isPlainObject(obj) || obj instanceof Array)) {
|
|
436
435
|
throw new Error("Unsupported type: only objects and arrays are supported");
|
|
437
436
|
}
|
|
438
|
-
|
|
439
|
-
|
|
437
|
+
const result = Array.isArray(obj) ? new Array(obj.length) : {};
|
|
438
|
+
if (Array.isArray(obj)) {
|
|
439
|
+
for (let i = 0, len = obj.length; i < len; i++) {
|
|
440
|
+
if (i in obj) {
|
|
441
|
+
result[i] = deepCopy(obj[i]);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
for (const key in obj) {
|
|
447
|
+
result[key] = deepCopy(obj[key]);
|
|
448
|
+
}
|
|
440
449
|
}
|
|
441
450
|
return result;
|
|
442
451
|
}
|
|
@@ -2699,21 +2708,30 @@ function mergeContiguousZones(zones) {
|
|
|
2699
2708
|
return mergedZones;
|
|
2700
2709
|
}
|
|
2701
2710
|
|
|
2711
|
+
const globalReverseLookup$1 = new WeakMap();
|
|
2712
|
+
const globalIdCounter = new WeakMap();
|
|
2702
2713
|
/**
|
|
2703
2714
|
* Get the id of the given item (its key in the given dictionary).
|
|
2704
2715
|
* If the given item does not exist in the dictionary, it creates one with a new id.
|
|
2705
2716
|
*/
|
|
2706
2717
|
function getItemId(item, itemsDic) {
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2718
|
+
if (!globalReverseLookup$1.has(itemsDic)) {
|
|
2719
|
+
globalReverseLookup$1.set(itemsDic, new Map());
|
|
2720
|
+
globalIdCounter.set(itemsDic, 0);
|
|
2721
|
+
}
|
|
2722
|
+
const reverseLookup = globalReverseLookup$1.get(itemsDic);
|
|
2723
|
+
const canonical = getCanonicalRepresentation(item);
|
|
2724
|
+
if (reverseLookup.has(canonical)) {
|
|
2725
|
+
const id = reverseLookup.get(canonical);
|
|
2726
|
+
itemsDic[id] = item;
|
|
2727
|
+
return id;
|
|
2711
2728
|
}
|
|
2712
2729
|
// Generate new Id if the item didn't exist in the dictionary
|
|
2713
|
-
const
|
|
2714
|
-
|
|
2715
|
-
itemsDic
|
|
2716
|
-
|
|
2730
|
+
const newId = globalIdCounter.get(itemsDic) + 1;
|
|
2731
|
+
reverseLookup.set(canonical, newId);
|
|
2732
|
+
globalIdCounter.set(itemsDic, newId);
|
|
2733
|
+
itemsDic[newId] = item;
|
|
2734
|
+
return newId;
|
|
2717
2735
|
}
|
|
2718
2736
|
function groupItemIdsByZones(positionsByItemId) {
|
|
2719
2737
|
const result = {};
|
|
@@ -2737,6 +2755,33 @@ function* iterateItemIdsPositions(sheetId, itemIdsByZones) {
|
|
|
2737
2755
|
}
|
|
2738
2756
|
}
|
|
2739
2757
|
}
|
|
2758
|
+
function getCanonicalRepresentation(item) {
|
|
2759
|
+
if (item === null)
|
|
2760
|
+
return "null";
|
|
2761
|
+
if (item === undefined)
|
|
2762
|
+
return "undefined";
|
|
2763
|
+
if (typeof item !== "object")
|
|
2764
|
+
return String(item);
|
|
2765
|
+
if (Array.isArray(item)) {
|
|
2766
|
+
const len = item.length;
|
|
2767
|
+
let result = "[";
|
|
2768
|
+
for (let i = 0; i < len; i++) {
|
|
2769
|
+
if (i > 0)
|
|
2770
|
+
result += ",";
|
|
2771
|
+
result += getCanonicalRepresentation(item[i]);
|
|
2772
|
+
}
|
|
2773
|
+
return result + "]";
|
|
2774
|
+
}
|
|
2775
|
+
const keys = Object.keys(item).sort();
|
|
2776
|
+
let repr = "{";
|
|
2777
|
+
for (const key of keys) {
|
|
2778
|
+
if (item[key] !== undefined) {
|
|
2779
|
+
repr += `"${key}":${getCanonicalRepresentation(item[key])},`;
|
|
2780
|
+
}
|
|
2781
|
+
}
|
|
2782
|
+
repr += "}";
|
|
2783
|
+
return repr;
|
|
2784
|
+
}
|
|
2740
2785
|
|
|
2741
2786
|
// -----------------------------------------------------------------------------
|
|
2742
2787
|
// Date Type
|
|
@@ -8289,7 +8334,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
|
|
|
8289
8334
|
const possibleValues = pivot
|
|
8290
8335
|
.getPossibleFieldValues(columns[i])
|
|
8291
8336
|
.map((v) => v.value);
|
|
8292
|
-
if (!possibleValues.includes(sortedColumn.domain[i].value)
|
|
8337
|
+
if (!possibleValues.includes(sortedColumn.domain[i].value) &&
|
|
8338
|
+
!(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
|
|
8293
8339
|
return false;
|
|
8294
8340
|
}
|
|
8295
8341
|
}
|
|
@@ -11318,6 +11364,7 @@ class ScorecardChart extends Component {
|
|
|
11318
11364
|
const autoCompleteProviders = new Registry();
|
|
11319
11365
|
|
|
11320
11366
|
autoCompleteProviders.add("dataValidation", {
|
|
11367
|
+
displayAllOnInitialContent: true,
|
|
11321
11368
|
getProposals(tokenAtCursor, content) {
|
|
11322
11369
|
if (content.startsWith("=")) {
|
|
11323
11370
|
return [];
|
|
@@ -21614,6 +21661,15 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
21614
21661
|
const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
|
|
21615
21662
|
// remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
|
|
21616
21663
|
const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
|
|
21664
|
+
if (this._currentContent === this.initialContent &&
|
|
21665
|
+
provider.displayAllOnInitialContent &&
|
|
21666
|
+
proposals?.length) {
|
|
21667
|
+
return {
|
|
21668
|
+
proposals,
|
|
21669
|
+
selectProposal: provider.selectProposal,
|
|
21670
|
+
autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
|
|
21671
|
+
};
|
|
21672
|
+
}
|
|
21617
21673
|
if (exactMatch && this._currentContent !== this.initialContent) {
|
|
21618
21674
|
// this means the user has chosen a proposal
|
|
21619
21675
|
return;
|
|
@@ -24359,16 +24415,25 @@ function addRelsToFile(relsFiles, path, rel) {
|
|
|
24359
24415
|
}
|
|
24360
24416
|
return id;
|
|
24361
24417
|
}
|
|
24418
|
+
const globalReverseLookup = new WeakMap();
|
|
24362
24419
|
function pushElement(property, propertyList) {
|
|
24363
|
-
let
|
|
24364
|
-
|
|
24365
|
-
|
|
24366
|
-
|
|
24367
|
-
|
|
24420
|
+
let reverseLookup = globalReverseLookup.get(propertyList);
|
|
24421
|
+
if (!reverseLookup) {
|
|
24422
|
+
reverseLookup = new Map();
|
|
24423
|
+
for (let i = 0; i < propertyList.length; i++) {
|
|
24424
|
+
const canonical = getCanonicalRepresentation(propertyList[i]);
|
|
24425
|
+
reverseLookup.set(canonical, i);
|
|
24368
24426
|
}
|
|
24427
|
+
globalReverseLookup.set(propertyList, reverseLookup);
|
|
24369
24428
|
}
|
|
24370
|
-
|
|
24371
|
-
|
|
24429
|
+
const canonical = getCanonicalRepresentation(property);
|
|
24430
|
+
if (reverseLookup.has(canonical)) {
|
|
24431
|
+
return reverseLookup.get(canonical);
|
|
24432
|
+
}
|
|
24433
|
+
const maxId = propertyList.length;
|
|
24434
|
+
propertyList.push(property);
|
|
24435
|
+
reverseLookup.set(canonical, maxId);
|
|
24436
|
+
return maxId;
|
|
24372
24437
|
}
|
|
24373
24438
|
const chartIds = [];
|
|
24374
24439
|
/**
|
|
@@ -26215,7 +26280,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
|
|
|
26215
26280
|
title: { text: chartTitle },
|
|
26216
26281
|
type: CHART_TYPE_CONVERSION_MAP[chartType],
|
|
26217
26282
|
dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
|
|
26218
|
-
labelRange: this.
|
|
26283
|
+
labelRange: this.extractLabelRange(chartType, rootChartElement),
|
|
26219
26284
|
backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
|
|
26220
26285
|
default: "ffffff",
|
|
26221
26286
|
}).asString(),
|
|
@@ -26227,6 +26292,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
|
|
|
26227
26292
|
};
|
|
26228
26293
|
})[0];
|
|
26229
26294
|
}
|
|
26295
|
+
extractLabelRange(chartType, rootChartElement) {
|
|
26296
|
+
if (chartType === "scatterChart") {
|
|
26297
|
+
return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
|
|
26298
|
+
this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
|
|
26299
|
+
}
|
|
26300
|
+
return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
|
|
26301
|
+
}
|
|
26230
26302
|
extractComboChart(chartElement) {
|
|
26231
26303
|
// Title can be separated into multiple xml elements (for styling and such), we only import the text
|
|
26232
26304
|
const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
|
|
@@ -36399,6 +36471,7 @@ const irregularityMap = {
|
|
|
36399
36471
|
fingerprintStore.enable();
|
|
36400
36472
|
}
|
|
36401
36473
|
},
|
|
36474
|
+
isReadonlyAllowed: true,
|
|
36402
36475
|
icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
|
|
36403
36476
|
};
|
|
36404
36477
|
const viewFormulas = {
|
|
@@ -50460,6 +50533,71 @@ class GridPopover extends Component {
|
|
|
50460
50533
|
}
|
|
50461
50534
|
}
|
|
50462
50535
|
|
|
50536
|
+
class UnhideRowHeaders extends Component {
|
|
50537
|
+
static template = "o-spreadsheet-UnhideRowHeaders";
|
|
50538
|
+
static props = {
|
|
50539
|
+
headersGroups: Array,
|
|
50540
|
+
headerRange: Object,
|
|
50541
|
+
offset: { type: Number, optional: true },
|
|
50542
|
+
};
|
|
50543
|
+
static defaultProps = { offset: 0 };
|
|
50544
|
+
get sheetId() {
|
|
50545
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50546
|
+
}
|
|
50547
|
+
getUnhidePreviousButtonStyle(hiddenIndex) {
|
|
50548
|
+
const rect = this.env.model.getters.getRect(positionToZone({ col: 0, row: hiddenIndex }));
|
|
50549
|
+
const y = rect.y + rect.height - HEADER_HEIGHT;
|
|
50550
|
+
return cssPropertiesToCss({ top: y - this.props.offset + "px", "margin-right": "1px" });
|
|
50551
|
+
}
|
|
50552
|
+
getUnhideNextButtonStyle(hiddenIndex) {
|
|
50553
|
+
const rect = this.env.model.getters.getRect(positionToZone({ col: 0, row: hiddenIndex }));
|
|
50554
|
+
const y = rect.y - HEADER_HEIGHT;
|
|
50555
|
+
return cssPropertiesToCss({ top: y - this.props.offset + "px", "margin-right": "1px" });
|
|
50556
|
+
}
|
|
50557
|
+
unhide(hiddenElements) {
|
|
50558
|
+
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50559
|
+
sheetId: this.sheetId,
|
|
50560
|
+
dimension: "ROW",
|
|
50561
|
+
elements: hiddenElements,
|
|
50562
|
+
});
|
|
50563
|
+
}
|
|
50564
|
+
isVisible(header) {
|
|
50565
|
+
return header >= this.props.headerRange.start && header <= this.props.headerRange.end;
|
|
50566
|
+
}
|
|
50567
|
+
}
|
|
50568
|
+
class UnhideColumnHeaders extends Component {
|
|
50569
|
+
static template = "o-spreadsheet-UnhideColumnHeaders";
|
|
50570
|
+
static props = {
|
|
50571
|
+
headersGroups: Array,
|
|
50572
|
+
headerRange: Object,
|
|
50573
|
+
offset: { type: Number, optional: true },
|
|
50574
|
+
};
|
|
50575
|
+
static defaultProps = { offset: 0 };
|
|
50576
|
+
get sheetId() {
|
|
50577
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50578
|
+
}
|
|
50579
|
+
getUnhidePreviousButtonStyle(hiddenIndex) {
|
|
50580
|
+
const rect = this.env.model.getters.getRect(positionToZone({ col: hiddenIndex, row: 0 }));
|
|
50581
|
+
const x = rect.x + rect.width - HEADER_WIDTH;
|
|
50582
|
+
return cssPropertiesToCss({ left: x - this.props.offset + "px" });
|
|
50583
|
+
}
|
|
50584
|
+
getUnhideNextButtonStyle(hiddenIndex) {
|
|
50585
|
+
const rect = this.env.model.getters.getRect(positionToZone({ col: hiddenIndex, row: 0 }));
|
|
50586
|
+
const x = rect.x - HEADER_WIDTH;
|
|
50587
|
+
return cssPropertiesToCss({ left: x - this.props.offset + "px" });
|
|
50588
|
+
}
|
|
50589
|
+
unhide(hiddenElements) {
|
|
50590
|
+
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50591
|
+
sheetId: this.sheetId,
|
|
50592
|
+
dimension: "COL",
|
|
50593
|
+
elements: hiddenElements,
|
|
50594
|
+
});
|
|
50595
|
+
}
|
|
50596
|
+
isVisible(header) {
|
|
50597
|
+
return header >= this.props.headerRange.start && header <= this.props.headerRange.end;
|
|
50598
|
+
}
|
|
50599
|
+
}
|
|
50600
|
+
|
|
50463
50601
|
class AbstractResizer extends Component {
|
|
50464
50602
|
static props = {
|
|
50465
50603
|
onOpenContextMenu: Function,
|
|
@@ -50678,6 +50816,7 @@ css /* scss */ `
|
|
|
50678
50816
|
left: ${HEADER_WIDTH}px;
|
|
50679
50817
|
right: 0;
|
|
50680
50818
|
height: ${HEADER_HEIGHT}px;
|
|
50819
|
+
width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH}px);
|
|
50681
50820
|
&.o-dragging {
|
|
50682
50821
|
cursor: grabbing;
|
|
50683
50822
|
}
|
|
@@ -50727,6 +50866,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50727
50866
|
onOpenContextMenu: Function,
|
|
50728
50867
|
};
|
|
50729
50868
|
static template = "o-spreadsheet-ColResizer";
|
|
50869
|
+
static components = { UnhideColumnHeaders };
|
|
50730
50870
|
colResizerRef;
|
|
50731
50871
|
setup() {
|
|
50732
50872
|
super.setup();
|
|
@@ -50735,6 +50875,9 @@ class ColResizer extends AbstractResizer {
|
|
|
50735
50875
|
this.MAX_SIZE_MARGIN = 90;
|
|
50736
50876
|
this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
|
|
50737
50877
|
}
|
|
50878
|
+
get sheetId() {
|
|
50879
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50880
|
+
}
|
|
50738
50881
|
_getEvOffset(ev) {
|
|
50739
50882
|
return ev.offsetX;
|
|
50740
50883
|
}
|
|
@@ -50757,10 +50900,10 @@ class ColResizer extends AbstractResizer {
|
|
|
50757
50900
|
return this.env.model.getters.getEdgeScrollCol(position, position, position);
|
|
50758
50901
|
}
|
|
50759
50902
|
_getDimensionsInViewport(index) {
|
|
50760
|
-
return this.env.model.getters.getColDimensionsInViewport(this.
|
|
50903
|
+
return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
|
|
50761
50904
|
}
|
|
50762
50905
|
_getElementSize(index) {
|
|
50763
|
-
return this.env.model.getters.getColSize(this.
|
|
50906
|
+
return this.env.model.getters.getColSize(this.sheetId, index);
|
|
50764
50907
|
}
|
|
50765
50908
|
_getMaxSize() {
|
|
50766
50909
|
return this.colResizerRef.el.clientWidth;
|
|
@@ -50771,7 +50914,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50771
50914
|
const cols = this.env.model.getters.getActiveCols();
|
|
50772
50915
|
this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
50773
50916
|
dimension: "COL",
|
|
50774
|
-
sheetId: this.
|
|
50917
|
+
sheetId: this.sheetId,
|
|
50775
50918
|
elements: cols.has(index) ? [...cols] : [index],
|
|
50776
50919
|
size,
|
|
50777
50920
|
});
|
|
@@ -50784,7 +50927,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50784
50927
|
elements.push(colIndex);
|
|
50785
50928
|
}
|
|
50786
50929
|
const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
|
|
50787
|
-
sheetId: this.
|
|
50930
|
+
sheetId: this.sheetId,
|
|
50788
50931
|
dimension: "COL",
|
|
50789
50932
|
base: this.state.base,
|
|
50790
50933
|
elements,
|
|
@@ -50803,7 +50946,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50803
50946
|
_fitElementSize(index) {
|
|
50804
50947
|
const cols = this.env.model.getters.getActiveCols();
|
|
50805
50948
|
this.env.model.dispatch("AUTORESIZE_COLUMNS", {
|
|
50806
|
-
sheetId: this.
|
|
50949
|
+
sheetId: this.sheetId,
|
|
50807
50950
|
cols: cols.has(index) ? [...cols] : [index],
|
|
50808
50951
|
});
|
|
50809
50952
|
}
|
|
@@ -50814,7 +50957,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50814
50957
|
return this.env.model.getters.getActiveCols();
|
|
50815
50958
|
}
|
|
50816
50959
|
_getPreviousVisibleElement(index) {
|
|
50817
|
-
const sheetId = this.
|
|
50960
|
+
const sheetId = this.sheetId;
|
|
50818
50961
|
let row;
|
|
50819
50962
|
for (row = index - 1; row >= 0; row--) {
|
|
50820
50963
|
if (!this.env.model.getters.isColHidden(sheetId, row)) {
|
|
@@ -50825,13 +50968,38 @@ class ColResizer extends AbstractResizer {
|
|
|
50825
50968
|
}
|
|
50826
50969
|
unhide(hiddenElements) {
|
|
50827
50970
|
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50828
|
-
sheetId: this.
|
|
50971
|
+
sheetId: this.sheetId,
|
|
50829
50972
|
elements: hiddenElements,
|
|
50830
50973
|
dimension: "COL",
|
|
50831
50974
|
});
|
|
50832
50975
|
}
|
|
50833
|
-
|
|
50834
|
-
|
|
50976
|
+
get mainUnhideHeadersProps() {
|
|
50977
|
+
const { left, right } = this.env.model.getters.getActiveMainViewport();
|
|
50978
|
+
const { xSplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
|
|
50979
|
+
const hiddenGroups = this.env.model.getters.getHiddenColsGroups(this.sheetId);
|
|
50980
|
+
const index = hiddenGroups.findIndex((group) => group[0] >= xSplit - 1);
|
|
50981
|
+
return {
|
|
50982
|
+
headersGroups: hiddenGroups.slice(index),
|
|
50983
|
+
offset: this.env.model.getters.getMainViewportCoordinates().x,
|
|
50984
|
+
headerRange: { start: left, end: right },
|
|
50985
|
+
};
|
|
50986
|
+
}
|
|
50987
|
+
get frozenUnhideHeadersProps() {
|
|
50988
|
+
const { xSplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
|
|
50989
|
+
const hiddenGroups = this.env.model.getters.getHiddenColsGroups(this.sheetId);
|
|
50990
|
+
const index = hiddenGroups.findIndex((group) => group[0] >= xSplit - 1);
|
|
50991
|
+
return {
|
|
50992
|
+
headersGroups: hiddenGroups.slice(0, index + 1),
|
|
50993
|
+
headerRange: { start: 0, end: xSplit - 1 },
|
|
50994
|
+
};
|
|
50995
|
+
}
|
|
50996
|
+
get frozenContainerStyle() {
|
|
50997
|
+
return cssPropertiesToCss({
|
|
50998
|
+
width: this.env.model.getters.getMainViewportCoordinates().x + "px",
|
|
50999
|
+
});
|
|
51000
|
+
}
|
|
51001
|
+
get hasFrozenPane() {
|
|
51002
|
+
return this.env.model.getters.getPaneDivisions(this.sheetId).xSplit > 0;
|
|
50835
51003
|
}
|
|
50836
51004
|
}
|
|
50837
51005
|
css /* scss */ `
|
|
@@ -50841,7 +51009,7 @@ css /* scss */ `
|
|
|
50841
51009
|
left: 0;
|
|
50842
51010
|
right: 0;
|
|
50843
51011
|
width: ${HEADER_WIDTH}px;
|
|
50844
|
-
height: 100
|
|
51012
|
+
height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
|
|
50845
51013
|
&.o-dragging {
|
|
50846
51014
|
cursor: grabbing;
|
|
50847
51015
|
}
|
|
@@ -50891,6 +51059,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50891
51059
|
onOpenContextMenu: Function,
|
|
50892
51060
|
};
|
|
50893
51061
|
static template = "o-spreadsheet-RowResizer";
|
|
51062
|
+
static components = { UnhideRowHeaders };
|
|
50894
51063
|
setup() {
|
|
50895
51064
|
super.setup();
|
|
50896
51065
|
this.rowResizerRef = useRef("rowResizer");
|
|
@@ -50899,6 +51068,9 @@ class RowResizer extends AbstractResizer {
|
|
|
50899
51068
|
this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
|
|
50900
51069
|
}
|
|
50901
51070
|
rowResizerRef;
|
|
51071
|
+
get sheetId() {
|
|
51072
|
+
return this.env.model.getters.getActiveSheetId();
|
|
51073
|
+
}
|
|
50902
51074
|
_getEvOffset(ev) {
|
|
50903
51075
|
return ev.offsetY;
|
|
50904
51076
|
}
|
|
@@ -50921,10 +51093,10 @@ class RowResizer extends AbstractResizer {
|
|
|
50921
51093
|
return this.env.model.getters.getEdgeScrollRow(position, position, position);
|
|
50922
51094
|
}
|
|
50923
51095
|
_getDimensionsInViewport(index) {
|
|
50924
|
-
return this.env.model.getters.getRowDimensionsInViewport(this.
|
|
51096
|
+
return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
|
|
50925
51097
|
}
|
|
50926
51098
|
_getElementSize(index) {
|
|
50927
|
-
return this.env.model.getters.getRowSize(this.
|
|
51099
|
+
return this.env.model.getters.getRowSize(this.sheetId, index);
|
|
50928
51100
|
}
|
|
50929
51101
|
_getMaxSize() {
|
|
50930
51102
|
return this.rowResizerRef.el.clientHeight;
|
|
@@ -50935,7 +51107,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50935
51107
|
const rows = this.env.model.getters.getActiveRows();
|
|
50936
51108
|
this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
50937
51109
|
dimension: "ROW",
|
|
50938
|
-
sheetId: this.
|
|
51110
|
+
sheetId: this.sheetId,
|
|
50939
51111
|
elements: rows.has(index) ? [...rows] : [index],
|
|
50940
51112
|
size,
|
|
50941
51113
|
});
|
|
@@ -50948,7 +51120,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50948
51120
|
elements.push(rowIndex);
|
|
50949
51121
|
}
|
|
50950
51122
|
const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
|
|
50951
|
-
sheetId: this.
|
|
51123
|
+
sheetId: this.sheetId,
|
|
50952
51124
|
dimension: "ROW",
|
|
50953
51125
|
base: this.state.base,
|
|
50954
51126
|
elements,
|
|
@@ -50967,7 +51139,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50967
51139
|
_fitElementSize(index) {
|
|
50968
51140
|
const rows = this.env.model.getters.getActiveRows();
|
|
50969
51141
|
this.env.model.dispatch("AUTORESIZE_ROWS", {
|
|
50970
|
-
sheetId: this.
|
|
51142
|
+
sheetId: this.sheetId,
|
|
50971
51143
|
rows: rows.has(index) ? [...rows] : [index],
|
|
50972
51144
|
});
|
|
50973
51145
|
}
|
|
@@ -50978,7 +51150,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50978
51150
|
return this.env.model.getters.getActiveRows();
|
|
50979
51151
|
}
|
|
50980
51152
|
_getPreviousVisibleElement(index) {
|
|
50981
|
-
const sheetId = this.
|
|
51153
|
+
const sheetId = this.sheetId;
|
|
50982
51154
|
let row;
|
|
50983
51155
|
for (row = index - 1; row >= 0; row--) {
|
|
50984
51156
|
if (!this.env.model.getters.isRowHidden(sheetId, row)) {
|
|
@@ -50987,15 +51159,33 @@ class RowResizer extends AbstractResizer {
|
|
|
50987
51159
|
}
|
|
50988
51160
|
return row;
|
|
50989
51161
|
}
|
|
50990
|
-
|
|
50991
|
-
this.env.model.
|
|
50992
|
-
|
|
50993
|
-
|
|
50994
|
-
|
|
51162
|
+
get mainUnhideHeadersProps() {
|
|
51163
|
+
const { top, bottom } = this.env.model.getters.getActiveMainViewport();
|
|
51164
|
+
const { ySplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
|
|
51165
|
+
const hiddenGroups = this.env.model.getters.getHiddenRowsGroups(this.sheetId);
|
|
51166
|
+
const index = hiddenGroups.findIndex((group) => group[0] >= ySplit - 1);
|
|
51167
|
+
return {
|
|
51168
|
+
headersGroups: hiddenGroups.slice(index),
|
|
51169
|
+
offset: this.env.model.getters.getMainViewportCoordinates().y,
|
|
51170
|
+
headerRange: { start: top, end: bottom },
|
|
51171
|
+
};
|
|
51172
|
+
}
|
|
51173
|
+
get frozenUnhideHeadersProps() {
|
|
51174
|
+
const { ySplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
|
|
51175
|
+
const hiddenGroups = this.env.model.getters.getHiddenRowsGroups(this.sheetId);
|
|
51176
|
+
const index = hiddenGroups.findIndex((group) => group[0] >= ySplit - 1);
|
|
51177
|
+
return {
|
|
51178
|
+
headersGroups: hiddenGroups.slice(0, index + 1),
|
|
51179
|
+
headerRange: { start: 0, end: ySplit - 1 },
|
|
51180
|
+
};
|
|
51181
|
+
}
|
|
51182
|
+
get frozenContainerStyle() {
|
|
51183
|
+
return cssPropertiesToCss({
|
|
51184
|
+
height: this.env.model.getters.getMainViewportCoordinates().y + "px",
|
|
50995
51185
|
});
|
|
50996
51186
|
}
|
|
50997
|
-
|
|
50998
|
-
return
|
|
51187
|
+
get hasFrozenPane() {
|
|
51188
|
+
return this.env.model.getters.getPaneDivisions(this.sheetId).ySplit > 0;
|
|
50999
51189
|
}
|
|
51000
51190
|
}
|
|
51001
51191
|
css /* scss */ `
|
|
@@ -67765,7 +67955,7 @@ class InternalViewport {
|
|
|
67765
67955
|
*
|
|
67766
67956
|
*/
|
|
67767
67957
|
getFullRect(zone) {
|
|
67768
|
-
const targetZone = intersection(zone, this);
|
|
67958
|
+
const targetZone = intersection(zone, this.boundaries);
|
|
67769
67959
|
const scrollDeltaX = this.snapCorrection.x;
|
|
67770
67960
|
const scrollDeltaY = this.snapCorrection.y;
|
|
67771
67961
|
if (targetZone) {
|
|
@@ -68233,7 +68423,8 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
68233
68423
|
? this.getters.getSheetViewVisibleCols()
|
|
68234
68424
|
: this.getters.getSheetViewVisibleRows();
|
|
68235
68425
|
const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
|
|
68236
|
-
|
|
68426
|
+
let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
|
|
68427
|
+
endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
|
|
68237
68428
|
const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
|
|
68238
68429
|
let offset = 0;
|
|
68239
68430
|
for (const i of relevantIndexes) {
|
|
@@ -68358,11 +68549,12 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
68358
68549
|
* column of the current viewport
|
|
68359
68550
|
*/
|
|
68360
68551
|
getColDimensionsInViewport(sheetId, col) {
|
|
68552
|
+
const { top } = this.getMainInternalViewport(sheetId);
|
|
68361
68553
|
const zone = {
|
|
68362
68554
|
left: col,
|
|
68363
68555
|
right: col,
|
|
68364
|
-
top:
|
|
68365
|
-
bottom:
|
|
68556
|
+
top: top,
|
|
68557
|
+
bottom: top,
|
|
68366
68558
|
};
|
|
68367
68559
|
const { x, width } = this.getVisibleRect(zone);
|
|
68368
68560
|
const start = x - this.gridOffsetX;
|
|
@@ -68373,9 +68565,10 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
68373
68565
|
* of the current viewport
|
|
68374
68566
|
*/
|
|
68375
68567
|
getRowDimensionsInViewport(sheetId, row) {
|
|
68568
|
+
const { left } = this.getMainInternalViewport(sheetId);
|
|
68376
68569
|
const zone = {
|
|
68377
68570
|
left: 0,
|
|
68378
|
-
right:
|
|
68571
|
+
right: left,
|
|
68379
68572
|
top: row,
|
|
68380
68573
|
bottom: row,
|
|
68381
68574
|
};
|
|
@@ -74327,7 +74520,7 @@ function addStyles(styles) {
|
|
|
74327
74520
|
}
|
|
74328
74521
|
if (alignAttrs.length > 0) {
|
|
74329
74522
|
attributes.push(["applyAlignment", "1"]); // for Libre Office
|
|
74330
|
-
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}
|
|
74523
|
+
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
|
|
74331
74524
|
}
|
|
74332
74525
|
else {
|
|
74333
74526
|
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
|
|
@@ -74495,6 +74688,9 @@ function addColumns(cols) {
|
|
|
74495
74688
|
}
|
|
74496
74689
|
function addRows(construct, data, sheet) {
|
|
74497
74690
|
const rowNodes = [];
|
|
74691
|
+
const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
|
|
74692
|
+
const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
|
|
74693
|
+
const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
|
|
74498
74694
|
for (let r = 0; r < sheet.rowNumber; r++) {
|
|
74499
74695
|
const rowAttrs = [["r", r + 1]];
|
|
74500
74696
|
const row = sheet.rows[r] || {};
|
|
@@ -74510,9 +74706,6 @@ function addRows(construct, data, sheet) {
|
|
|
74510
74706
|
if (row.collapsed) {
|
|
74511
74707
|
rowAttrs.push(["collapsed", 1]);
|
|
74512
74708
|
}
|
|
74513
|
-
const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
|
|
74514
|
-
const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
|
|
74515
|
-
const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
|
|
74516
74709
|
const cellNodes = [];
|
|
74517
74710
|
for (let c = 0; c < sheet.colNumber; c++) {
|
|
74518
74711
|
const xc = toXC(c, r);
|
|
@@ -75772,6 +75965,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
|
|
|
75772
75965
|
export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, CoreViewPlugin, 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 };
|
|
75773
75966
|
|
|
75774
75967
|
|
|
75775
|
-
__info__.version = "18.2.
|
|
75776
|
-
__info__.date = "2025-03-
|
|
75777
|
-
__info__.hash = "
|
|
75968
|
+
__info__.version = "18.2.3";
|
|
75969
|
+
__info__.date = "2025-03-12T15:32:36.274Z";
|
|
75970
|
+
__info__.hash = "81b0e08";
|