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