@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
|
'use strict';
|
|
@@ -425,7 +425,6 @@ function escapeRegExp(str) {
|
|
|
425
425
|
* Sparse arrays remain sparse.
|
|
426
426
|
*/
|
|
427
427
|
function deepCopy(obj) {
|
|
428
|
-
const result = Array.isArray(obj) ? [] : {};
|
|
429
428
|
switch (typeof obj) {
|
|
430
429
|
case "object": {
|
|
431
430
|
if (obj === null) {
|
|
@@ -437,8 +436,18 @@ function deepCopy(obj) {
|
|
|
437
436
|
else if (!(isPlainObject(obj) || obj instanceof Array)) {
|
|
438
437
|
throw new Error("Unsupported type: only objects and arrays are supported");
|
|
439
438
|
}
|
|
440
|
-
|
|
441
|
-
|
|
439
|
+
const result = Array.isArray(obj) ? new Array(obj.length) : {};
|
|
440
|
+
if (Array.isArray(obj)) {
|
|
441
|
+
for (let i = 0, len = obj.length; i < len; i++) {
|
|
442
|
+
if (i in obj) {
|
|
443
|
+
result[i] = deepCopy(obj[i]);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
for (const key in obj) {
|
|
449
|
+
result[key] = deepCopy(obj[key]);
|
|
450
|
+
}
|
|
442
451
|
}
|
|
443
452
|
return result;
|
|
444
453
|
}
|
|
@@ -2701,21 +2710,30 @@ function mergeContiguousZones(zones) {
|
|
|
2701
2710
|
return mergedZones;
|
|
2702
2711
|
}
|
|
2703
2712
|
|
|
2713
|
+
const globalReverseLookup$1 = new WeakMap();
|
|
2714
|
+
const globalIdCounter = new WeakMap();
|
|
2704
2715
|
/**
|
|
2705
2716
|
* Get the id of the given item (its key in the given dictionary).
|
|
2706
2717
|
* If the given item does not exist in the dictionary, it creates one with a new id.
|
|
2707
2718
|
*/
|
|
2708
2719
|
function getItemId(item, itemsDic) {
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
2720
|
+
if (!globalReverseLookup$1.has(itemsDic)) {
|
|
2721
|
+
globalReverseLookup$1.set(itemsDic, new Map());
|
|
2722
|
+
globalIdCounter.set(itemsDic, 0);
|
|
2723
|
+
}
|
|
2724
|
+
const reverseLookup = globalReverseLookup$1.get(itemsDic);
|
|
2725
|
+
const canonical = getCanonicalRepresentation(item);
|
|
2726
|
+
if (reverseLookup.has(canonical)) {
|
|
2727
|
+
const id = reverseLookup.get(canonical);
|
|
2728
|
+
itemsDic[id] = item;
|
|
2729
|
+
return id;
|
|
2713
2730
|
}
|
|
2714
2731
|
// Generate new Id if the item didn't exist in the dictionary
|
|
2715
|
-
const
|
|
2716
|
-
|
|
2717
|
-
itemsDic
|
|
2718
|
-
|
|
2732
|
+
const newId = globalIdCounter.get(itemsDic) + 1;
|
|
2733
|
+
reverseLookup.set(canonical, newId);
|
|
2734
|
+
globalIdCounter.set(itemsDic, newId);
|
|
2735
|
+
itemsDic[newId] = item;
|
|
2736
|
+
return newId;
|
|
2719
2737
|
}
|
|
2720
2738
|
function groupItemIdsByZones(positionsByItemId) {
|
|
2721
2739
|
const result = {};
|
|
@@ -2739,6 +2757,33 @@ function* iterateItemIdsPositions(sheetId, itemIdsByZones) {
|
|
|
2739
2757
|
}
|
|
2740
2758
|
}
|
|
2741
2759
|
}
|
|
2760
|
+
function getCanonicalRepresentation(item) {
|
|
2761
|
+
if (item === null)
|
|
2762
|
+
return "null";
|
|
2763
|
+
if (item === undefined)
|
|
2764
|
+
return "undefined";
|
|
2765
|
+
if (typeof item !== "object")
|
|
2766
|
+
return String(item);
|
|
2767
|
+
if (Array.isArray(item)) {
|
|
2768
|
+
const len = item.length;
|
|
2769
|
+
let result = "[";
|
|
2770
|
+
for (let i = 0; i < len; i++) {
|
|
2771
|
+
if (i > 0)
|
|
2772
|
+
result += ",";
|
|
2773
|
+
result += getCanonicalRepresentation(item[i]);
|
|
2774
|
+
}
|
|
2775
|
+
return result + "]";
|
|
2776
|
+
}
|
|
2777
|
+
const keys = Object.keys(item).sort();
|
|
2778
|
+
let repr = "{";
|
|
2779
|
+
for (const key of keys) {
|
|
2780
|
+
if (item[key] !== undefined) {
|
|
2781
|
+
repr += `"${key}":${getCanonicalRepresentation(item[key])},`;
|
|
2782
|
+
}
|
|
2783
|
+
}
|
|
2784
|
+
repr += "}";
|
|
2785
|
+
return repr;
|
|
2786
|
+
}
|
|
2742
2787
|
|
|
2743
2788
|
// -----------------------------------------------------------------------------
|
|
2744
2789
|
// Date Type
|
|
@@ -8291,7 +8336,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
|
|
|
8291
8336
|
const possibleValues = pivot
|
|
8292
8337
|
.getPossibleFieldValues(columns[i])
|
|
8293
8338
|
.map((v) => v.value);
|
|
8294
|
-
if (!possibleValues.includes(sortedColumn.domain[i].value)
|
|
8339
|
+
if (!possibleValues.includes(sortedColumn.domain[i].value) &&
|
|
8340
|
+
!(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
|
|
8295
8341
|
return false;
|
|
8296
8342
|
}
|
|
8297
8343
|
}
|
|
@@ -11320,6 +11366,7 @@ class ScorecardChart extends owl.Component {
|
|
|
11320
11366
|
const autoCompleteProviders = new Registry();
|
|
11321
11367
|
|
|
11322
11368
|
autoCompleteProviders.add("dataValidation", {
|
|
11369
|
+
displayAllOnInitialContent: true,
|
|
11323
11370
|
getProposals(tokenAtCursor, content) {
|
|
11324
11371
|
if (content.startsWith("=")) {
|
|
11325
11372
|
return [];
|
|
@@ -21616,6 +21663,15 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
21616
21663
|
const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
|
|
21617
21664
|
// remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
|
|
21618
21665
|
const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
|
|
21666
|
+
if (this._currentContent === this.initialContent &&
|
|
21667
|
+
provider.displayAllOnInitialContent &&
|
|
21668
|
+
proposals?.length) {
|
|
21669
|
+
return {
|
|
21670
|
+
proposals,
|
|
21671
|
+
selectProposal: provider.selectProposal,
|
|
21672
|
+
autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
|
|
21673
|
+
};
|
|
21674
|
+
}
|
|
21619
21675
|
if (exactMatch && this._currentContent !== this.initialContent) {
|
|
21620
21676
|
// this means the user has chosen a proposal
|
|
21621
21677
|
return;
|
|
@@ -24361,16 +24417,25 @@ function addRelsToFile(relsFiles, path, rel) {
|
|
|
24361
24417
|
}
|
|
24362
24418
|
return id;
|
|
24363
24419
|
}
|
|
24420
|
+
const globalReverseLookup = new WeakMap();
|
|
24364
24421
|
function pushElement(property, propertyList) {
|
|
24365
|
-
let
|
|
24366
|
-
|
|
24367
|
-
|
|
24368
|
-
|
|
24369
|
-
|
|
24422
|
+
let reverseLookup = globalReverseLookup.get(propertyList);
|
|
24423
|
+
if (!reverseLookup) {
|
|
24424
|
+
reverseLookup = new Map();
|
|
24425
|
+
for (let i = 0; i < propertyList.length; i++) {
|
|
24426
|
+
const canonical = getCanonicalRepresentation(propertyList[i]);
|
|
24427
|
+
reverseLookup.set(canonical, i);
|
|
24370
24428
|
}
|
|
24429
|
+
globalReverseLookup.set(propertyList, reverseLookup);
|
|
24371
24430
|
}
|
|
24372
|
-
|
|
24373
|
-
|
|
24431
|
+
const canonical = getCanonicalRepresentation(property);
|
|
24432
|
+
if (reverseLookup.has(canonical)) {
|
|
24433
|
+
return reverseLookup.get(canonical);
|
|
24434
|
+
}
|
|
24435
|
+
const maxId = propertyList.length;
|
|
24436
|
+
propertyList.push(property);
|
|
24437
|
+
reverseLookup.set(canonical, maxId);
|
|
24438
|
+
return maxId;
|
|
24374
24439
|
}
|
|
24375
24440
|
const chartIds = [];
|
|
24376
24441
|
/**
|
|
@@ -26217,7 +26282,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
|
|
|
26217
26282
|
title: { text: chartTitle },
|
|
26218
26283
|
type: CHART_TYPE_CONVERSION_MAP[chartType],
|
|
26219
26284
|
dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
|
|
26220
|
-
labelRange: this.
|
|
26285
|
+
labelRange: this.extractLabelRange(chartType, rootChartElement),
|
|
26221
26286
|
backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
|
|
26222
26287
|
default: "ffffff",
|
|
26223
26288
|
}).asString(),
|
|
@@ -26229,6 +26294,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
|
|
|
26229
26294
|
};
|
|
26230
26295
|
})[0];
|
|
26231
26296
|
}
|
|
26297
|
+
extractLabelRange(chartType, rootChartElement) {
|
|
26298
|
+
if (chartType === "scatterChart") {
|
|
26299
|
+
return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
|
|
26300
|
+
this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
|
|
26301
|
+
}
|
|
26302
|
+
return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
|
|
26303
|
+
}
|
|
26232
26304
|
extractComboChart(chartElement) {
|
|
26233
26305
|
// Title can be separated into multiple xml elements (for styling and such), we only import the text
|
|
26234
26306
|
const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
|
|
@@ -36401,6 +36473,7 @@ const irregularityMap = {
|
|
|
36401
36473
|
fingerprintStore.enable();
|
|
36402
36474
|
}
|
|
36403
36475
|
},
|
|
36476
|
+
isReadonlyAllowed: true,
|
|
36404
36477
|
icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
|
|
36405
36478
|
};
|
|
36406
36479
|
const viewFormulas = {
|
|
@@ -50462,6 +50535,71 @@ class GridPopover extends owl.Component {
|
|
|
50462
50535
|
}
|
|
50463
50536
|
}
|
|
50464
50537
|
|
|
50538
|
+
class UnhideRowHeaders extends owl.Component {
|
|
50539
|
+
static template = "o-spreadsheet-UnhideRowHeaders";
|
|
50540
|
+
static props = {
|
|
50541
|
+
headersGroups: Array,
|
|
50542
|
+
headerRange: Object,
|
|
50543
|
+
offset: { type: Number, optional: true },
|
|
50544
|
+
};
|
|
50545
|
+
static defaultProps = { offset: 0 };
|
|
50546
|
+
get sheetId() {
|
|
50547
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50548
|
+
}
|
|
50549
|
+
getUnhidePreviousButtonStyle(hiddenIndex) {
|
|
50550
|
+
const rect = this.env.model.getters.getRect(positionToZone({ col: 0, row: hiddenIndex }));
|
|
50551
|
+
const y = rect.y + rect.height - HEADER_HEIGHT;
|
|
50552
|
+
return cssPropertiesToCss({ top: y - this.props.offset + "px", "margin-right": "1px" });
|
|
50553
|
+
}
|
|
50554
|
+
getUnhideNextButtonStyle(hiddenIndex) {
|
|
50555
|
+
const rect = this.env.model.getters.getRect(positionToZone({ col: 0, row: hiddenIndex }));
|
|
50556
|
+
const y = rect.y - HEADER_HEIGHT;
|
|
50557
|
+
return cssPropertiesToCss({ top: y - this.props.offset + "px", "margin-right": "1px" });
|
|
50558
|
+
}
|
|
50559
|
+
unhide(hiddenElements) {
|
|
50560
|
+
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50561
|
+
sheetId: this.sheetId,
|
|
50562
|
+
dimension: "ROW",
|
|
50563
|
+
elements: hiddenElements,
|
|
50564
|
+
});
|
|
50565
|
+
}
|
|
50566
|
+
isVisible(header) {
|
|
50567
|
+
return header >= this.props.headerRange.start && header <= this.props.headerRange.end;
|
|
50568
|
+
}
|
|
50569
|
+
}
|
|
50570
|
+
class UnhideColumnHeaders extends owl.Component {
|
|
50571
|
+
static template = "o-spreadsheet-UnhideColumnHeaders";
|
|
50572
|
+
static props = {
|
|
50573
|
+
headersGroups: Array,
|
|
50574
|
+
headerRange: Object,
|
|
50575
|
+
offset: { type: Number, optional: true },
|
|
50576
|
+
};
|
|
50577
|
+
static defaultProps = { offset: 0 };
|
|
50578
|
+
get sheetId() {
|
|
50579
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50580
|
+
}
|
|
50581
|
+
getUnhidePreviousButtonStyle(hiddenIndex) {
|
|
50582
|
+
const rect = this.env.model.getters.getRect(positionToZone({ col: hiddenIndex, row: 0 }));
|
|
50583
|
+
const x = rect.x + rect.width - HEADER_WIDTH;
|
|
50584
|
+
return cssPropertiesToCss({ left: x - this.props.offset + "px" });
|
|
50585
|
+
}
|
|
50586
|
+
getUnhideNextButtonStyle(hiddenIndex) {
|
|
50587
|
+
const rect = this.env.model.getters.getRect(positionToZone({ col: hiddenIndex, row: 0 }));
|
|
50588
|
+
const x = rect.x - HEADER_WIDTH;
|
|
50589
|
+
return cssPropertiesToCss({ left: x - this.props.offset + "px" });
|
|
50590
|
+
}
|
|
50591
|
+
unhide(hiddenElements) {
|
|
50592
|
+
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50593
|
+
sheetId: this.sheetId,
|
|
50594
|
+
dimension: "COL",
|
|
50595
|
+
elements: hiddenElements,
|
|
50596
|
+
});
|
|
50597
|
+
}
|
|
50598
|
+
isVisible(header) {
|
|
50599
|
+
return header >= this.props.headerRange.start && header <= this.props.headerRange.end;
|
|
50600
|
+
}
|
|
50601
|
+
}
|
|
50602
|
+
|
|
50465
50603
|
class AbstractResizer extends owl.Component {
|
|
50466
50604
|
static props = {
|
|
50467
50605
|
onOpenContextMenu: Function,
|
|
@@ -50680,6 +50818,7 @@ css /* scss */ `
|
|
|
50680
50818
|
left: ${HEADER_WIDTH}px;
|
|
50681
50819
|
right: 0;
|
|
50682
50820
|
height: ${HEADER_HEIGHT}px;
|
|
50821
|
+
width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH}px);
|
|
50683
50822
|
&.o-dragging {
|
|
50684
50823
|
cursor: grabbing;
|
|
50685
50824
|
}
|
|
@@ -50729,6 +50868,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50729
50868
|
onOpenContextMenu: Function,
|
|
50730
50869
|
};
|
|
50731
50870
|
static template = "o-spreadsheet-ColResizer";
|
|
50871
|
+
static components = { UnhideColumnHeaders };
|
|
50732
50872
|
colResizerRef;
|
|
50733
50873
|
setup() {
|
|
50734
50874
|
super.setup();
|
|
@@ -50737,6 +50877,9 @@ class ColResizer extends AbstractResizer {
|
|
|
50737
50877
|
this.MAX_SIZE_MARGIN = 90;
|
|
50738
50878
|
this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
|
|
50739
50879
|
}
|
|
50880
|
+
get sheetId() {
|
|
50881
|
+
return this.env.model.getters.getActiveSheetId();
|
|
50882
|
+
}
|
|
50740
50883
|
_getEvOffset(ev) {
|
|
50741
50884
|
return ev.offsetX;
|
|
50742
50885
|
}
|
|
@@ -50759,10 +50902,10 @@ class ColResizer extends AbstractResizer {
|
|
|
50759
50902
|
return this.env.model.getters.getEdgeScrollCol(position, position, position);
|
|
50760
50903
|
}
|
|
50761
50904
|
_getDimensionsInViewport(index) {
|
|
50762
|
-
return this.env.model.getters.getColDimensionsInViewport(this.
|
|
50905
|
+
return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
|
|
50763
50906
|
}
|
|
50764
50907
|
_getElementSize(index) {
|
|
50765
|
-
return this.env.model.getters.getColSize(this.
|
|
50908
|
+
return this.env.model.getters.getColSize(this.sheetId, index);
|
|
50766
50909
|
}
|
|
50767
50910
|
_getMaxSize() {
|
|
50768
50911
|
return this.colResizerRef.el.clientWidth;
|
|
@@ -50773,7 +50916,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50773
50916
|
const cols = this.env.model.getters.getActiveCols();
|
|
50774
50917
|
this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
50775
50918
|
dimension: "COL",
|
|
50776
|
-
sheetId: this.
|
|
50919
|
+
sheetId: this.sheetId,
|
|
50777
50920
|
elements: cols.has(index) ? [...cols] : [index],
|
|
50778
50921
|
size,
|
|
50779
50922
|
});
|
|
@@ -50786,7 +50929,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50786
50929
|
elements.push(colIndex);
|
|
50787
50930
|
}
|
|
50788
50931
|
const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
|
|
50789
|
-
sheetId: this.
|
|
50932
|
+
sheetId: this.sheetId,
|
|
50790
50933
|
dimension: "COL",
|
|
50791
50934
|
base: this.state.base,
|
|
50792
50935
|
elements,
|
|
@@ -50805,7 +50948,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50805
50948
|
_fitElementSize(index) {
|
|
50806
50949
|
const cols = this.env.model.getters.getActiveCols();
|
|
50807
50950
|
this.env.model.dispatch("AUTORESIZE_COLUMNS", {
|
|
50808
|
-
sheetId: this.
|
|
50951
|
+
sheetId: this.sheetId,
|
|
50809
50952
|
cols: cols.has(index) ? [...cols] : [index],
|
|
50810
50953
|
});
|
|
50811
50954
|
}
|
|
@@ -50816,7 +50959,7 @@ class ColResizer extends AbstractResizer {
|
|
|
50816
50959
|
return this.env.model.getters.getActiveCols();
|
|
50817
50960
|
}
|
|
50818
50961
|
_getPreviousVisibleElement(index) {
|
|
50819
|
-
const sheetId = this.
|
|
50962
|
+
const sheetId = this.sheetId;
|
|
50820
50963
|
let row;
|
|
50821
50964
|
for (row = index - 1; row >= 0; row--) {
|
|
50822
50965
|
if (!this.env.model.getters.isColHidden(sheetId, row)) {
|
|
@@ -50827,13 +50970,38 @@ class ColResizer extends AbstractResizer {
|
|
|
50827
50970
|
}
|
|
50828
50971
|
unhide(hiddenElements) {
|
|
50829
50972
|
this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
50830
|
-
sheetId: this.
|
|
50973
|
+
sheetId: this.sheetId,
|
|
50831
50974
|
elements: hiddenElements,
|
|
50832
50975
|
dimension: "COL",
|
|
50833
50976
|
});
|
|
50834
50977
|
}
|
|
50835
|
-
|
|
50836
|
-
|
|
50978
|
+
get mainUnhideHeadersProps() {
|
|
50979
|
+
const { left, right } = this.env.model.getters.getActiveMainViewport();
|
|
50980
|
+
const { xSplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
|
|
50981
|
+
const hiddenGroups = this.env.model.getters.getHiddenColsGroups(this.sheetId);
|
|
50982
|
+
const index = hiddenGroups.findIndex((group) => group[0] >= xSplit - 1);
|
|
50983
|
+
return {
|
|
50984
|
+
headersGroups: hiddenGroups.slice(index),
|
|
50985
|
+
offset: this.env.model.getters.getMainViewportCoordinates().x,
|
|
50986
|
+
headerRange: { start: left, end: right },
|
|
50987
|
+
};
|
|
50988
|
+
}
|
|
50989
|
+
get frozenUnhideHeadersProps() {
|
|
50990
|
+
const { xSplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
|
|
50991
|
+
const hiddenGroups = this.env.model.getters.getHiddenColsGroups(this.sheetId);
|
|
50992
|
+
const index = hiddenGroups.findIndex((group) => group[0] >= xSplit - 1);
|
|
50993
|
+
return {
|
|
50994
|
+
headersGroups: hiddenGroups.slice(0, index + 1),
|
|
50995
|
+
headerRange: { start: 0, end: xSplit - 1 },
|
|
50996
|
+
};
|
|
50997
|
+
}
|
|
50998
|
+
get frozenContainerStyle() {
|
|
50999
|
+
return cssPropertiesToCss({
|
|
51000
|
+
width: this.env.model.getters.getMainViewportCoordinates().x + "px",
|
|
51001
|
+
});
|
|
51002
|
+
}
|
|
51003
|
+
get hasFrozenPane() {
|
|
51004
|
+
return this.env.model.getters.getPaneDivisions(this.sheetId).xSplit > 0;
|
|
50837
51005
|
}
|
|
50838
51006
|
}
|
|
50839
51007
|
css /* scss */ `
|
|
@@ -50843,7 +51011,7 @@ css /* scss */ `
|
|
|
50843
51011
|
left: 0;
|
|
50844
51012
|
right: 0;
|
|
50845
51013
|
width: ${HEADER_WIDTH}px;
|
|
50846
|
-
height: 100
|
|
51014
|
+
height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
|
|
50847
51015
|
&.o-dragging {
|
|
50848
51016
|
cursor: grabbing;
|
|
50849
51017
|
}
|
|
@@ -50893,6 +51061,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50893
51061
|
onOpenContextMenu: Function,
|
|
50894
51062
|
};
|
|
50895
51063
|
static template = "o-spreadsheet-RowResizer";
|
|
51064
|
+
static components = { UnhideRowHeaders };
|
|
50896
51065
|
setup() {
|
|
50897
51066
|
super.setup();
|
|
50898
51067
|
this.rowResizerRef = owl.useRef("rowResizer");
|
|
@@ -50901,6 +51070,9 @@ class RowResizer extends AbstractResizer {
|
|
|
50901
51070
|
this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
|
|
50902
51071
|
}
|
|
50903
51072
|
rowResizerRef;
|
|
51073
|
+
get sheetId() {
|
|
51074
|
+
return this.env.model.getters.getActiveSheetId();
|
|
51075
|
+
}
|
|
50904
51076
|
_getEvOffset(ev) {
|
|
50905
51077
|
return ev.offsetY;
|
|
50906
51078
|
}
|
|
@@ -50923,10 +51095,10 @@ class RowResizer extends AbstractResizer {
|
|
|
50923
51095
|
return this.env.model.getters.getEdgeScrollRow(position, position, position);
|
|
50924
51096
|
}
|
|
50925
51097
|
_getDimensionsInViewport(index) {
|
|
50926
|
-
return this.env.model.getters.getRowDimensionsInViewport(this.
|
|
51098
|
+
return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
|
|
50927
51099
|
}
|
|
50928
51100
|
_getElementSize(index) {
|
|
50929
|
-
return this.env.model.getters.getRowSize(this.
|
|
51101
|
+
return this.env.model.getters.getRowSize(this.sheetId, index);
|
|
50930
51102
|
}
|
|
50931
51103
|
_getMaxSize() {
|
|
50932
51104
|
return this.rowResizerRef.el.clientHeight;
|
|
@@ -50937,7 +51109,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50937
51109
|
const rows = this.env.model.getters.getActiveRows();
|
|
50938
51110
|
this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
50939
51111
|
dimension: "ROW",
|
|
50940
|
-
sheetId: this.
|
|
51112
|
+
sheetId: this.sheetId,
|
|
50941
51113
|
elements: rows.has(index) ? [...rows] : [index],
|
|
50942
51114
|
size,
|
|
50943
51115
|
});
|
|
@@ -50950,7 +51122,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50950
51122
|
elements.push(rowIndex);
|
|
50951
51123
|
}
|
|
50952
51124
|
const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
|
|
50953
|
-
sheetId: this.
|
|
51125
|
+
sheetId: this.sheetId,
|
|
50954
51126
|
dimension: "ROW",
|
|
50955
51127
|
base: this.state.base,
|
|
50956
51128
|
elements,
|
|
@@ -50969,7 +51141,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50969
51141
|
_fitElementSize(index) {
|
|
50970
51142
|
const rows = this.env.model.getters.getActiveRows();
|
|
50971
51143
|
this.env.model.dispatch("AUTORESIZE_ROWS", {
|
|
50972
|
-
sheetId: this.
|
|
51144
|
+
sheetId: this.sheetId,
|
|
50973
51145
|
rows: rows.has(index) ? [...rows] : [index],
|
|
50974
51146
|
});
|
|
50975
51147
|
}
|
|
@@ -50980,7 +51152,7 @@ class RowResizer extends AbstractResizer {
|
|
|
50980
51152
|
return this.env.model.getters.getActiveRows();
|
|
50981
51153
|
}
|
|
50982
51154
|
_getPreviousVisibleElement(index) {
|
|
50983
|
-
const sheetId = this.
|
|
51155
|
+
const sheetId = this.sheetId;
|
|
50984
51156
|
let row;
|
|
50985
51157
|
for (row = index - 1; row >= 0; row--) {
|
|
50986
51158
|
if (!this.env.model.getters.isRowHidden(sheetId, row)) {
|
|
@@ -50989,15 +51161,33 @@ class RowResizer extends AbstractResizer {
|
|
|
50989
51161
|
}
|
|
50990
51162
|
return row;
|
|
50991
51163
|
}
|
|
50992
|
-
|
|
50993
|
-
this.env.model.
|
|
50994
|
-
|
|
50995
|
-
|
|
50996
|
-
|
|
51164
|
+
get mainUnhideHeadersProps() {
|
|
51165
|
+
const { top, bottom } = this.env.model.getters.getActiveMainViewport();
|
|
51166
|
+
const { ySplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
|
|
51167
|
+
const hiddenGroups = this.env.model.getters.getHiddenRowsGroups(this.sheetId);
|
|
51168
|
+
const index = hiddenGroups.findIndex((group) => group[0] >= ySplit - 1);
|
|
51169
|
+
return {
|
|
51170
|
+
headersGroups: hiddenGroups.slice(index),
|
|
51171
|
+
offset: this.env.model.getters.getMainViewportCoordinates().y,
|
|
51172
|
+
headerRange: { start: top, end: bottom },
|
|
51173
|
+
};
|
|
51174
|
+
}
|
|
51175
|
+
get frozenUnhideHeadersProps() {
|
|
51176
|
+
const { ySplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
|
|
51177
|
+
const hiddenGroups = this.env.model.getters.getHiddenRowsGroups(this.sheetId);
|
|
51178
|
+
const index = hiddenGroups.findIndex((group) => group[0] >= ySplit - 1);
|
|
51179
|
+
return {
|
|
51180
|
+
headersGroups: hiddenGroups.slice(0, index + 1),
|
|
51181
|
+
headerRange: { start: 0, end: ySplit - 1 },
|
|
51182
|
+
};
|
|
51183
|
+
}
|
|
51184
|
+
get frozenContainerStyle() {
|
|
51185
|
+
return cssPropertiesToCss({
|
|
51186
|
+
height: this.env.model.getters.getMainViewportCoordinates().y + "px",
|
|
50997
51187
|
});
|
|
50998
51188
|
}
|
|
50999
|
-
|
|
51000
|
-
return
|
|
51189
|
+
get hasFrozenPane() {
|
|
51190
|
+
return this.env.model.getters.getPaneDivisions(this.sheetId).ySplit > 0;
|
|
51001
51191
|
}
|
|
51002
51192
|
}
|
|
51003
51193
|
css /* scss */ `
|
|
@@ -67767,7 +67957,7 @@ class InternalViewport {
|
|
|
67767
67957
|
*
|
|
67768
67958
|
*/
|
|
67769
67959
|
getFullRect(zone) {
|
|
67770
|
-
const targetZone = intersection(zone, this);
|
|
67960
|
+
const targetZone = intersection(zone, this.boundaries);
|
|
67771
67961
|
const scrollDeltaX = this.snapCorrection.x;
|
|
67772
67962
|
const scrollDeltaY = this.snapCorrection.y;
|
|
67773
67963
|
if (targetZone) {
|
|
@@ -68235,7 +68425,8 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
68235
68425
|
? this.getters.getSheetViewVisibleCols()
|
|
68236
68426
|
: this.getters.getSheetViewVisibleRows();
|
|
68237
68427
|
const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
|
|
68238
|
-
|
|
68428
|
+
let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
|
|
68429
|
+
endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
|
|
68239
68430
|
const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
|
|
68240
68431
|
let offset = 0;
|
|
68241
68432
|
for (const i of relevantIndexes) {
|
|
@@ -68360,11 +68551,12 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
68360
68551
|
* column of the current viewport
|
|
68361
68552
|
*/
|
|
68362
68553
|
getColDimensionsInViewport(sheetId, col) {
|
|
68554
|
+
const { top } = this.getMainInternalViewport(sheetId);
|
|
68363
68555
|
const zone = {
|
|
68364
68556
|
left: col,
|
|
68365
68557
|
right: col,
|
|
68366
|
-
top:
|
|
68367
|
-
bottom:
|
|
68558
|
+
top: top,
|
|
68559
|
+
bottom: top,
|
|
68368
68560
|
};
|
|
68369
68561
|
const { x, width } = this.getVisibleRect(zone);
|
|
68370
68562
|
const start = x - this.gridOffsetX;
|
|
@@ -68375,9 +68567,10 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
68375
68567
|
* of the current viewport
|
|
68376
68568
|
*/
|
|
68377
68569
|
getRowDimensionsInViewport(sheetId, row) {
|
|
68570
|
+
const { left } = this.getMainInternalViewport(sheetId);
|
|
68378
68571
|
const zone = {
|
|
68379
68572
|
left: 0,
|
|
68380
|
-
right:
|
|
68573
|
+
right: left,
|
|
68381
68574
|
top: row,
|
|
68382
68575
|
bottom: row,
|
|
68383
68576
|
};
|
|
@@ -74329,7 +74522,7 @@ function addStyles(styles) {
|
|
|
74329
74522
|
}
|
|
74330
74523
|
if (alignAttrs.length > 0) {
|
|
74331
74524
|
attributes.push(["applyAlignment", "1"]); // for Libre Office
|
|
74332
|
-
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}
|
|
74525
|
+
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
|
|
74333
74526
|
}
|
|
74334
74527
|
else {
|
|
74335
74528
|
styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
|
|
@@ -74497,6 +74690,9 @@ function addColumns(cols) {
|
|
|
74497
74690
|
}
|
|
74498
74691
|
function addRows(construct, data, sheet) {
|
|
74499
74692
|
const rowNodes = [];
|
|
74693
|
+
const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
|
|
74694
|
+
const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
|
|
74695
|
+
const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
|
|
74500
74696
|
for (let r = 0; r < sheet.rowNumber; r++) {
|
|
74501
74697
|
const rowAttrs = [["r", r + 1]];
|
|
74502
74698
|
const row = sheet.rows[r] || {};
|
|
@@ -74512,9 +74708,6 @@ function addRows(construct, data, sheet) {
|
|
|
74512
74708
|
if (row.collapsed) {
|
|
74513
74709
|
rowAttrs.push(["collapsed", 1]);
|
|
74514
74710
|
}
|
|
74515
|
-
const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
|
|
74516
|
-
const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
|
|
74517
|
-
const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
|
|
74518
74711
|
const cellNodes = [];
|
|
74519
74712
|
for (let c = 0; c < sheet.colNumber; c++) {
|
|
74520
74713
|
const xc = toXC(c, r);
|
|
@@ -75819,6 +76012,6 @@ exports.tokenColors = tokenColors;
|
|
|
75819
76012
|
exports.tokenize = tokenize;
|
|
75820
76013
|
|
|
75821
76014
|
|
|
75822
|
-
__info__.version = "18.2.
|
|
75823
|
-
__info__.date = "2025-03-
|
|
75824
|
-
__info__.hash = "
|
|
76015
|
+
__info__.version = "18.2.3";
|
|
76016
|
+
__info__.date = "2025-03-12T15:32:36.274Z";
|
|
76017
|
+
__info__.hash = "81b0e08";
|