@odoo/o-spreadsheet 18.4.17 → 18.4.19
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 +114 -51
- package/dist/o-spreadsheet.d.ts +11 -8
- package/dist/o-spreadsheet.esm.js +114 -51
- package/dist/o-spreadsheet.iife.js +114 -51
- package/dist/o-spreadsheet.iife.min.js +377 -377
- package/dist/o_spreadsheet.xml +4 -3
- 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.4.
|
|
6
|
-
* @date 2025-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.4.19
|
|
6
|
+
* @date 2025-12-02T05:34:03.902Z
|
|
7
|
+
* @hash 95b1252
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
@@ -2615,7 +2615,6 @@ const invalidateEvaluationCommands = new Set([
|
|
|
2615
2615
|
"REDO",
|
|
2616
2616
|
"ADD_MERGE",
|
|
2617
2617
|
"REMOVE_MERGE",
|
|
2618
|
-
"DUPLICATE_SHEET",
|
|
2619
2618
|
"UPDATE_LOCALE",
|
|
2620
2619
|
"ADD_PIVOT",
|
|
2621
2620
|
"UPDATE_PIVOT",
|
|
@@ -18543,7 +18542,7 @@ function getTokenNextReferenceType(xc) {
|
|
|
18543
18542
|
function setXcToFixedReferenceType(xc, referenceType) {
|
|
18544
18543
|
let sheetName;
|
|
18545
18544
|
({ sheetName, xc } = splitReference(xc));
|
|
18546
|
-
sheetName = sheetName ? sheetName + "!" : "";
|
|
18545
|
+
sheetName = sheetName ? getCanonicalSymbolName(sheetName) + "!" : "";
|
|
18547
18546
|
xc = xc.replace(/\$/g, "");
|
|
18548
18547
|
const splitIndex = xc.indexOf(":");
|
|
18549
18548
|
if (splitIndex >= 0) {
|
|
@@ -22584,6 +22583,9 @@ function getTreeMapGroupColors(definition, tree) {
|
|
|
22584
22583
|
}));
|
|
22585
22584
|
}
|
|
22586
22585
|
function getTreeMapColorScale(tree, coloringOption) {
|
|
22586
|
+
if (tree.length === 0) {
|
|
22587
|
+
return undefined;
|
|
22588
|
+
}
|
|
22587
22589
|
const treeNodesByLevel = pyramidizeTree(tree);
|
|
22588
22590
|
const nodes = treeNodesByLevel[treeNodesByLevel.length - 1];
|
|
22589
22591
|
const minValue = Math.min(...nodes.map((node) => node.value));
|
|
@@ -24253,11 +24255,18 @@ function chartToImageUrl(runtime, figure, type) {
|
|
|
24253
24255
|
// we have to add the canvas to the DOM otherwise it won't be rendered
|
|
24254
24256
|
document.body.append(div);
|
|
24255
24257
|
if ("chartJsConfig" in runtime) {
|
|
24258
|
+
const extensionsLoaded = areChartJSExtensionsLoaded();
|
|
24259
|
+
if (!extensionsLoaded) {
|
|
24260
|
+
registerChartJSExtensions();
|
|
24261
|
+
}
|
|
24256
24262
|
const config = deepCopy(runtime.chartJsConfig);
|
|
24257
24263
|
config.plugins = [backgroundColorChartJSPlugin];
|
|
24258
24264
|
const chart = new window.Chart(canvas, config);
|
|
24259
24265
|
imageContent = chart.toBase64Image();
|
|
24260
24266
|
chart.destroy();
|
|
24267
|
+
if (!extensionsLoaded) {
|
|
24268
|
+
unregisterChartJsExtensions();
|
|
24269
|
+
}
|
|
24261
24270
|
}
|
|
24262
24271
|
else if (type === "scorecard") {
|
|
24263
24272
|
const design = getScorecardConfiguration(figure, runtime);
|
|
@@ -24287,11 +24296,18 @@ async function chartToImageFile(runtime, figure, type) {
|
|
|
24287
24296
|
document.body.append(div);
|
|
24288
24297
|
let chartBlob = null;
|
|
24289
24298
|
if ("chartJsConfig" in runtime) {
|
|
24299
|
+
const extensionsLoaded = areChartJSExtensionsLoaded();
|
|
24300
|
+
if (!extensionsLoaded) {
|
|
24301
|
+
registerChartJSExtensions();
|
|
24302
|
+
}
|
|
24290
24303
|
const config = deepCopy(runtime.chartJsConfig);
|
|
24291
24304
|
config.plugins = [backgroundColorChartJSPlugin];
|
|
24292
24305
|
const chart = new window.Chart(canvas, config);
|
|
24293
24306
|
chartBlob = await new Promise((resolve) => canvas.toBlob(resolve, "image/png"));
|
|
24294
24307
|
chart.destroy();
|
|
24308
|
+
if (!extensionsLoaded) {
|
|
24309
|
+
unregisterChartJsExtensions();
|
|
24310
|
+
}
|
|
24295
24311
|
}
|
|
24296
24312
|
else if (type === "scorecard") {
|
|
24297
24313
|
const design = getScorecardConfiguration(figure, runtime);
|
|
@@ -32644,6 +32660,7 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
32644
32660
|
}
|
|
32645
32661
|
this.selectionStart = start;
|
|
32646
32662
|
this.selectionEnd = end;
|
|
32663
|
+
this.stopComposerRangeSelection();
|
|
32647
32664
|
this.computeFormulaCursorContext();
|
|
32648
32665
|
this.computeParenthesisRelatedToCursor();
|
|
32649
32666
|
this.updateAutoCompleteProvider();
|
|
@@ -33319,10 +33336,13 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
33319
33336
|
hideHelp() {
|
|
33320
33337
|
this.autoComplete.hide();
|
|
33321
33338
|
}
|
|
33322
|
-
autoCompleteOrStop(direction) {
|
|
33339
|
+
autoCompleteOrStop(direction, assistantForcedClosed = false) {
|
|
33323
33340
|
if (this.editionMode !== "inactive") {
|
|
33324
33341
|
const autoComplete = this.autoComplete;
|
|
33325
|
-
|
|
33342
|
+
const suppressAutocomplete = assistantForcedClosed && this.canBeToggled;
|
|
33343
|
+
if (!suppressAutocomplete &&
|
|
33344
|
+
autoComplete.provider &&
|
|
33345
|
+
autoComplete.selectedIndex !== undefined) {
|
|
33326
33346
|
const autoCompleteValue = autoComplete.provider.proposals[autoComplete.selectedIndex]?.text;
|
|
33327
33347
|
if (autoCompleteValue) {
|
|
33328
33348
|
this.autoComplete.provider?.selectProposal(autoCompleteValue);
|
|
@@ -33545,7 +33565,8 @@ class Composer extends owl.Component {
|
|
|
33545
33565
|
assistantStyle["max-height"] = `${availableSpaceAbove - CLOSE_ICON_RADIUS}px`;
|
|
33546
33566
|
// render top
|
|
33547
33567
|
// We compensate 2 px of margin on the assistant style + 1px for design reasons
|
|
33548
|
-
assistantStyle.
|
|
33568
|
+
assistantStyle.top = `-3px`;
|
|
33569
|
+
assistantStyle.transform = `translate(0, -100%)`;
|
|
33549
33570
|
}
|
|
33550
33571
|
if (cellX + ASSISTANT_WIDTH > this.props.delimitation.width) {
|
|
33551
33572
|
// render left
|
|
@@ -33665,16 +33686,12 @@ class Composer extends owl.Component {
|
|
|
33665
33686
|
processTabKey(ev, direction) {
|
|
33666
33687
|
ev.preventDefault();
|
|
33667
33688
|
ev.stopPropagation();
|
|
33668
|
-
|
|
33669
|
-
this.props.composerStore.autoCompleteOrStop(direction);
|
|
33670
|
-
}
|
|
33689
|
+
this.props.composerStore.autoCompleteOrStop(direction, this.assistant.forcedClosed);
|
|
33671
33690
|
}
|
|
33672
33691
|
processEnterKey(ev, direction) {
|
|
33673
33692
|
ev.preventDefault();
|
|
33674
33693
|
ev.stopPropagation();
|
|
33675
|
-
|
|
33676
|
-
this.props.composerStore.autoCompleteOrStop(direction);
|
|
33677
|
-
}
|
|
33694
|
+
this.props.composerStore.autoCompleteOrStop(direction, this.assistant.forcedClosed);
|
|
33678
33695
|
}
|
|
33679
33696
|
processNewLineEvent(ev) {
|
|
33680
33697
|
ev.preventDefault();
|
|
@@ -33850,7 +33867,6 @@ class Composer extends owl.Component {
|
|
|
33850
33867
|
return;
|
|
33851
33868
|
}
|
|
33852
33869
|
const newSelection = this.contentHelper.getCurrentSelection();
|
|
33853
|
-
this.props.composerStore.stopComposerRangeSelection();
|
|
33854
33870
|
this.props.onComposerContentFocused();
|
|
33855
33871
|
this.props.composerStore.changeComposerCursorSelection(newSelection.start, newSelection.end);
|
|
33856
33872
|
this.processTokenAtCursor();
|
|
@@ -47371,10 +47387,11 @@ class AbstractResizer extends owl.Component {
|
|
|
47371
47387
|
this.state.waitingForMove = false;
|
|
47372
47388
|
}
|
|
47373
47389
|
onMouseMove(ev) {
|
|
47374
|
-
if (this.env.isMobile()
|
|
47375
|
-
|
|
47376
|
-
|
|
47377
|
-
|
|
47390
|
+
if (this.env.isMobile() ||
|
|
47391
|
+
this.env.model.getters.isReadonly() ||
|
|
47392
|
+
this.state.isResizing ||
|
|
47393
|
+
this.state.isMoving ||
|
|
47394
|
+
this.state.isSelecting) {
|
|
47378
47395
|
return;
|
|
47379
47396
|
}
|
|
47380
47397
|
this._computeHandleDisplay(ev);
|
|
@@ -47441,6 +47458,10 @@ class AbstractResizer extends owl.Component {
|
|
|
47441
47458
|
if (index < 0) {
|
|
47442
47459
|
return;
|
|
47443
47460
|
}
|
|
47461
|
+
if (this.env.model.getters.isReadonly()) {
|
|
47462
|
+
this._selectElement(index, false);
|
|
47463
|
+
return;
|
|
47464
|
+
}
|
|
47444
47465
|
if (this.state.waitingForMove) {
|
|
47445
47466
|
if (!this.env.model.getters.isGridSelectionActive()) {
|
|
47446
47467
|
this._selectElement(index, false);
|
|
@@ -48801,7 +48822,7 @@ const friction = 0.95;
|
|
|
48801
48822
|
const verticalScrollFactor = 1;
|
|
48802
48823
|
const horizontalScrollFactor = 1;
|
|
48803
48824
|
const resetTimeoutDuration = 100;
|
|
48804
|
-
function useTouchScroll(ref, updateScroll, canMoveUp) {
|
|
48825
|
+
function useTouchScroll(ref, updateScroll, canMoveUp, canMoveDown) {
|
|
48805
48826
|
let lastX = 0;
|
|
48806
48827
|
let lastY = 0;
|
|
48807
48828
|
let velocityX = 0;
|
|
@@ -48838,7 +48859,7 @@ function useTouchScroll(ref, updateScroll, canMoveUp) {
|
|
|
48838
48859
|
lastX = clientX;
|
|
48839
48860
|
lastY = clientY;
|
|
48840
48861
|
lastTime = currentTime;
|
|
48841
|
-
if (canMoveUp()) {
|
|
48862
|
+
if ((deltaY < 0 && canMoveUp()) || (deltaY > 0 && canMoveDown())) {
|
|
48842
48863
|
if (event.cancelable) {
|
|
48843
48864
|
event.preventDefault();
|
|
48844
48865
|
}
|
|
@@ -54738,7 +54759,6 @@ function insertTokenAfterArgSeparator(tokenAtCursor, value) {
|
|
|
54738
54759
|
// replace the whole token
|
|
54739
54760
|
start = tokenAtCursor.start;
|
|
54740
54761
|
}
|
|
54741
|
-
this.composer.stopComposerRangeSelection();
|
|
54742
54762
|
this.composer.changeComposerCursorSelection(start, end);
|
|
54743
54763
|
this.composer.replaceComposerCursorSelection(value);
|
|
54744
54764
|
}
|
|
@@ -54756,7 +54776,6 @@ function insertTokenAfterLeftParenthesis(tokenAtCursor, value) {
|
|
|
54756
54776
|
// replace the whole token
|
|
54757
54777
|
start = tokenAtCursor.start;
|
|
54758
54778
|
}
|
|
54759
|
-
this.composer.stopComposerRangeSelection();
|
|
54760
54779
|
this.composer.changeComposerCursorSelection(start, end);
|
|
54761
54780
|
this.composer.replaceComposerCursorSelection(value);
|
|
54762
54781
|
}
|
|
@@ -56039,7 +56058,6 @@ const dateGranularities = [
|
|
|
56039
56058
|
pivotRegistry.add("SPREADSHEET", {
|
|
56040
56059
|
ui: SpreadsheetPivot,
|
|
56041
56060
|
definition: SpreadsheetPivotRuntimeDefinition,
|
|
56042
|
-
externalData: false,
|
|
56043
56061
|
dateGranularities: [...dateGranularities],
|
|
56044
56062
|
datetimeGranularities: [...dateGranularities, "hour_number", "minute_number", "second_number"],
|
|
56045
56063
|
isMeasureCandidate: (field) => field.type !== "boolean",
|
|
@@ -57455,6 +57473,7 @@ class SidePanelStore extends SpreadsheetStore {
|
|
|
57455
57473
|
getPanelProps(panelInfo) {
|
|
57456
57474
|
const state = this.computeState(panelInfo);
|
|
57457
57475
|
if (state.isOpen) {
|
|
57476
|
+
panelInfo.currentPanelProps = state.props ?? panelInfo.currentPanelProps;
|
|
57458
57477
|
return state.props ?? {};
|
|
57459
57478
|
}
|
|
57460
57479
|
return {};
|
|
@@ -57466,11 +57485,11 @@ class SidePanelStore extends SpreadsheetStore {
|
|
|
57466
57485
|
}
|
|
57467
57486
|
return undefined;
|
|
57468
57487
|
}
|
|
57469
|
-
open(componentTag,
|
|
57488
|
+
open(componentTag, currentPanelProps = {}) {
|
|
57470
57489
|
if (this.screenWidthStore.isSmall) {
|
|
57471
57490
|
return;
|
|
57472
57491
|
}
|
|
57473
|
-
const newPanelInfo = {
|
|
57492
|
+
const newPanelInfo = { currentPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
|
|
57474
57493
|
const state = this.computeState(newPanelInfo);
|
|
57475
57494
|
if (!state.isOpen) {
|
|
57476
57495
|
return;
|
|
@@ -57494,8 +57513,8 @@ class SidePanelStore extends SpreadsheetStore {
|
|
|
57494
57513
|
}
|
|
57495
57514
|
this._openPanel("secondaryPanel", newPanelInfo, state);
|
|
57496
57515
|
}
|
|
57497
|
-
replace(componentTag, currentPanelKey,
|
|
57498
|
-
const newPanelInfo = {
|
|
57516
|
+
replace(componentTag, currentPanelKey, currentPanelProps = {}) {
|
|
57517
|
+
const newPanelInfo = { currentPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
|
|
57499
57518
|
const state = this.computeState(newPanelInfo);
|
|
57500
57519
|
if (!state.isOpen) {
|
|
57501
57520
|
return;
|
|
@@ -57525,10 +57544,10 @@ class SidePanelStore extends SpreadsheetStore {
|
|
|
57525
57544
|
_openPanel(panel, newPanel, state) {
|
|
57526
57545
|
const currentPanel = this[panel];
|
|
57527
57546
|
if (currentPanel && newPanel.componentTag !== currentPanel.componentTag) {
|
|
57528
|
-
currentPanel.
|
|
57547
|
+
currentPanel.currentPanelProps?.onCloseSidePanel?.();
|
|
57529
57548
|
}
|
|
57530
57549
|
this[panel] = {
|
|
57531
|
-
|
|
57550
|
+
currentPanelProps: state.props ?? {},
|
|
57532
57551
|
componentTag: newPanel.componentTag,
|
|
57533
57552
|
size: currentPanel?.size || DEFAULT_SIDE_PANEL_SIZE,
|
|
57534
57553
|
isCollapsed: currentPanel?.isCollapsed || false,
|
|
@@ -57550,16 +57569,16 @@ class SidePanelStore extends SpreadsheetStore {
|
|
|
57550
57569
|
close() {
|
|
57551
57570
|
if (this.mainPanel?.isPinned) {
|
|
57552
57571
|
if (this.secondaryPanel) {
|
|
57553
|
-
this.secondaryPanel.
|
|
57572
|
+
this.secondaryPanel.currentPanelProps.onCloseSidePanel?.();
|
|
57554
57573
|
this.secondaryPanel = undefined;
|
|
57555
57574
|
}
|
|
57556
57575
|
return;
|
|
57557
57576
|
}
|
|
57558
|
-
this.mainPanel?.
|
|
57577
|
+
this.mainPanel?.currentPanelProps.onCloseSidePanel?.();
|
|
57559
57578
|
this.mainPanel = undefined;
|
|
57560
57579
|
}
|
|
57561
57580
|
closeMainPanel() {
|
|
57562
|
-
this.mainPanel?.
|
|
57581
|
+
this.mainPanel?.currentPanelProps.onCloseSidePanel?.();
|
|
57563
57582
|
this.mainPanel = this.secondaryPanel || undefined;
|
|
57564
57583
|
this.secondaryPanel = undefined;
|
|
57565
57584
|
}
|
|
@@ -57591,7 +57610,7 @@ class SidePanelStore extends SpreadsheetStore {
|
|
|
57591
57610
|
}
|
|
57592
57611
|
this.mainPanel.isPinned = !this.mainPanel.isPinned;
|
|
57593
57612
|
if (!this.mainPanel.isPinned && this.secondaryPanel) {
|
|
57594
|
-
this.secondaryPanel?.
|
|
57613
|
+
this.secondaryPanel?.currentPanelProps.onCloseSidePanel?.();
|
|
57595
57614
|
this.mainPanel = this.secondaryPanel;
|
|
57596
57615
|
this.secondaryPanel = undefined;
|
|
57597
57616
|
}
|
|
@@ -57610,7 +57629,7 @@ class SidePanelStore extends SpreadsheetStore {
|
|
|
57610
57629
|
panelInfo.size = COLLAPSED_SIDE_PANEL_SIZE;
|
|
57611
57630
|
}
|
|
57612
57631
|
}
|
|
57613
|
-
computeState({ componentTag, initialPanelProps }) {
|
|
57632
|
+
computeState({ componentTag, currentPanelProps: initialPanelProps, }) {
|
|
57614
57633
|
const customComputeState = sidePanelRegistry.get(componentTag).computeState;
|
|
57615
57634
|
const state = customComputeState
|
|
57616
57635
|
? customComputeState(this.getters, initialPanelProps)
|
|
@@ -57620,7 +57639,7 @@ class SidePanelStore extends SpreadsheetStore {
|
|
|
57620
57639
|
changeSpreadsheetWidth(width) {
|
|
57621
57640
|
this.availableWidth = width - MIN_SHEET_VIEW_WIDTH;
|
|
57622
57641
|
if (this.secondaryPanel && width - this.totalPanelSize < MIN_SHEET_VIEW_WIDTH) {
|
|
57623
|
-
this.secondaryPanel?.
|
|
57642
|
+
this.secondaryPanel?.currentPanelProps.onCloseSidePanel?.();
|
|
57624
57643
|
this.secondaryPanel = undefined;
|
|
57625
57644
|
}
|
|
57626
57645
|
if (this.mainPanel && width - this.totalPanelSize < MIN_SHEET_VIEW_WIDTH) {
|
|
@@ -57780,6 +57799,10 @@ class Grid extends owl.Component {
|
|
|
57780
57799
|
useTouchScroll(this.gridRef, this.moveCanvas.bind(this), () => {
|
|
57781
57800
|
const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
|
|
57782
57801
|
return scrollY > 0;
|
|
57802
|
+
}, () => {
|
|
57803
|
+
const { maxOffsetY } = this.env.model.getters.getMaximumSheetOffset();
|
|
57804
|
+
const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
|
|
57805
|
+
return scrollY < maxOffsetY;
|
|
57783
57806
|
});
|
|
57784
57807
|
}
|
|
57785
57808
|
get highlights() {
|
|
@@ -64428,10 +64451,17 @@ class PivotCorePlugin extends CorePlugin {
|
|
|
64428
64451
|
if (!pivot) {
|
|
64429
64452
|
continue;
|
|
64430
64453
|
}
|
|
64431
|
-
|
|
64454
|
+
const def = deepCopy(pivot.definition);
|
|
64455
|
+
for (const measure of def.measures) {
|
|
64432
64456
|
if (measure.computedBy?.formula === formulaString) {
|
|
64433
|
-
const measureIndex =
|
|
64434
|
-
|
|
64457
|
+
const measureIndex = def.measures.indexOf(measure);
|
|
64458
|
+
if (measureIndex !== -1) {
|
|
64459
|
+
def.measures[measureIndex].computedBy = {
|
|
64460
|
+
formula: newFormulaString,
|
|
64461
|
+
sheetId,
|
|
64462
|
+
};
|
|
64463
|
+
}
|
|
64464
|
+
this.dispatch("UPDATE_PIVOT", { pivotId, pivot: def });
|
|
64435
64465
|
}
|
|
64436
64466
|
}
|
|
64437
64467
|
}
|
|
@@ -64569,6 +64599,9 @@ class SpreadsheetPivotCorePlugin extends CorePlugin {
|
|
|
64569
64599
|
const { sheetId, zone } = definition.dataSet;
|
|
64570
64600
|
const range = this.getters.getRangeFromZone(sheetId, zone);
|
|
64571
64601
|
const adaptedRange = adaptPivotRange(range, applyChange);
|
|
64602
|
+
if (adaptedRange === range) {
|
|
64603
|
+
return;
|
|
64604
|
+
}
|
|
64572
64605
|
const dataSet = adaptedRange && {
|
|
64573
64606
|
sheetId: adaptedRange.sheetId,
|
|
64574
64607
|
zone: adaptedRange.zone,
|
|
@@ -68574,9 +68607,7 @@ class PivotUIPlugin extends CoreViewPlugin {
|
|
|
68574
68607
|
handle(cmd) {
|
|
68575
68608
|
if (invalidateEvaluationCommands.has(cmd.type)) {
|
|
68576
68609
|
for (const pivotId of this.getters.getPivotIds()) {
|
|
68577
|
-
|
|
68578
|
-
this.setupPivot(pivotId, { recreate: true });
|
|
68579
|
-
}
|
|
68610
|
+
this.setupPivot(pivotId, { recreate: true });
|
|
68580
68611
|
}
|
|
68581
68612
|
}
|
|
68582
68613
|
switch (cmd.type) {
|
|
@@ -68784,7 +68815,7 @@ class PivotUIPlugin extends CoreViewPlugin {
|
|
|
68784
68815
|
pivot.init({ reload: true });
|
|
68785
68816
|
}
|
|
68786
68817
|
setupPivot(pivotId, { recreate } = { recreate: false }) {
|
|
68787
|
-
const definition = this.getters.getPivotCoreDefinition(pivotId);
|
|
68818
|
+
const definition = deepCopy(this.getters.getPivotCoreDefinition(pivotId));
|
|
68788
68819
|
if (!(pivotId in this.pivots)) {
|
|
68789
68820
|
const Pivot = withPivotPresentationLayer(pivotRegistry.get(definition.type).ui);
|
|
68790
68821
|
this.pivots[pivotId] = new Pivot(this.custom, { definition, getters: this.getters });
|
|
@@ -75001,6 +75032,7 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
75001
75032
|
"getFigureUI",
|
|
75002
75033
|
"getPositionAnchorOffset",
|
|
75003
75034
|
"getGridOffset",
|
|
75035
|
+
"getMaximumSheetOffset",
|
|
75004
75036
|
];
|
|
75005
75037
|
viewports = {};
|
|
75006
75038
|
/**
|
|
@@ -78036,16 +78068,18 @@ class ClickableCellsStore extends SpreadsheetStore {
|
|
|
78036
78068
|
get clickableCells() {
|
|
78037
78069
|
const cells = [];
|
|
78038
78070
|
const getters = this.getters;
|
|
78039
|
-
const sheetId = getters.getActiveSheetId();
|
|
78040
78071
|
for (const position of this.getters.getVisibleCellPositions()) {
|
|
78041
78072
|
const item = this.getClickableItem(position);
|
|
78042
78073
|
if (!item) {
|
|
78043
78074
|
continue;
|
|
78044
78075
|
}
|
|
78045
78076
|
const title = typeof item.title === "function" ? item.title(position, getters) : item.title;
|
|
78046
|
-
const
|
|
78077
|
+
const rect = this.getClickableCellRect(position);
|
|
78078
|
+
if (!rect) {
|
|
78079
|
+
continue;
|
|
78080
|
+
}
|
|
78047
78081
|
cells.push({
|
|
78048
|
-
coordinates:
|
|
78082
|
+
coordinates: rect,
|
|
78049
78083
|
position,
|
|
78050
78084
|
action: item.execute,
|
|
78051
78085
|
title: title || "",
|
|
@@ -78053,6 +78087,31 @@ class ClickableCellsStore extends SpreadsheetStore {
|
|
|
78053
78087
|
}
|
|
78054
78088
|
return cells;
|
|
78055
78089
|
}
|
|
78090
|
+
getClickableCellRect(position) {
|
|
78091
|
+
const zone = this.getters.expandZone(position.sheetId, positionToZone(position));
|
|
78092
|
+
const clickableRect = this.getters.getVisibleRect(zone);
|
|
78093
|
+
const icons = this.getters.getCellIcons(position);
|
|
78094
|
+
const iconsAtPosition = {
|
|
78095
|
+
center: icons.find((icon) => icon.horizontalAlign === "center"),
|
|
78096
|
+
left: icons.find((icon) => icon.horizontalAlign === "left"),
|
|
78097
|
+
right: icons.find((icon) => icon.horizontalAlign === "right"),
|
|
78098
|
+
};
|
|
78099
|
+
if (iconsAtPosition.center?.onClick) {
|
|
78100
|
+
return undefined;
|
|
78101
|
+
}
|
|
78102
|
+
if (iconsAtPosition.right?.onClick) {
|
|
78103
|
+
const cellRect = this.getters.getRect(zone);
|
|
78104
|
+
const iconRect = this.getters.getCellIconRect(iconsAtPosition.right, cellRect);
|
|
78105
|
+
clickableRect.width -= iconRect.width + iconsAtPosition.right.margin;
|
|
78106
|
+
}
|
|
78107
|
+
if (iconsAtPosition.left?.onClick) {
|
|
78108
|
+
const cellRect = this.getters.getRect(zone);
|
|
78109
|
+
const iconRect = this.getters.getCellIconRect(iconsAtPosition.left, cellRect);
|
|
78110
|
+
clickableRect.x += iconRect.width + iconsAtPosition.left.margin;
|
|
78111
|
+
clickableRect.width -= iconRect.width + iconsAtPosition.left.margin;
|
|
78112
|
+
}
|
|
78113
|
+
return clickableRect;
|
|
78114
|
+
}
|
|
78056
78115
|
}
|
|
78057
78116
|
|
|
78058
78117
|
css /* scss */ `
|
|
@@ -78091,6 +78150,10 @@ class SpreadsheetDashboard extends owl.Component {
|
|
|
78091
78150
|
useTouchScroll(this.gridRef, this.moveCanvas.bind(this), () => {
|
|
78092
78151
|
const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
|
|
78093
78152
|
return scrollY > 0;
|
|
78153
|
+
}, () => {
|
|
78154
|
+
const { maxOffsetY } = this.env.model.getters.getMaximumSheetOffset();
|
|
78155
|
+
const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
|
|
78156
|
+
return scrollY < maxOffsetY;
|
|
78094
78157
|
});
|
|
78095
78158
|
}
|
|
78096
78159
|
get gridContainer() {
|
|
@@ -78805,7 +78868,7 @@ class SmallBottomBar extends owl.Component {
|
|
|
78805
78868
|
height: this.focus === "inactive" ? "26px" : "fit-content",
|
|
78806
78869
|
"max-height": `130px`,
|
|
78807
78870
|
}),
|
|
78808
|
-
showAssistant:
|
|
78871
|
+
showAssistant: false, // Hide assistant in small composer as it gets cropped ATM
|
|
78809
78872
|
placeholder: this.composerStore.placeholder,
|
|
78810
78873
|
};
|
|
78811
78874
|
}
|
|
@@ -80134,7 +80197,7 @@ css /* scss */ `
|
|
|
80134
80197
|
border-radius: 4px;
|
|
80135
80198
|
font-weight: 500;
|
|
80136
80199
|
font-size: 14px;
|
|
80137
|
-
height: 32px;
|
|
80200
|
+
min-height: 32px;
|
|
80138
80201
|
line-height: 16px;
|
|
80139
80202
|
flex-grow: 1;
|
|
80140
80203
|
background-color: ${BUTTON_BG};
|
|
@@ -84938,6 +85001,6 @@ exports.tokenColors = tokenColors;
|
|
|
84938
85001
|
exports.tokenize = tokenize;
|
|
84939
85002
|
|
|
84940
85003
|
|
|
84941
|
-
__info__.version = "18.4.
|
|
84942
|
-
__info__.date = "2025-
|
|
84943
|
-
__info__.hash = "
|
|
85004
|
+
__info__.version = "18.4.19";
|
|
85005
|
+
__info__.date = "2025-12-02T05:34:03.902Z";
|
|
85006
|
+
__info__.hash = "95b1252";
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -2500,7 +2500,7 @@ declare class InternalViewport {
|
|
|
2500
2500
|
*
|
|
2501
2501
|
*/
|
|
2502
2502
|
declare class SheetViewPlugin extends UIPlugin {
|
|
2503
|
-
static getters: readonly ["getColIndex", "getRowIndex", "getActiveMainViewport", "getSheetViewDimension", "getSheetViewDimensionWithHeaders", "getMainViewportRect", "isVisibleInViewport", "getEdgeScrollCol", "getEdgeScrollRow", "getVisibleFigures", "getVisibleRect", "getVisibleRectWithoutHeaders", "getVisibleCellPositions", "getColRowOffsetInViewport", "getMainViewportCoordinates", "getActiveSheetScrollInfo", "getSheetViewVisibleCols", "getSheetViewVisibleRows", "getFrozenSheetViewRatio", "isPixelPositionVisible", "getColDimensionsInViewport", "getRowDimensionsInViewport", "getAllActiveViewportsZonesAndRect", "getRect", "getFigureUI", "getPositionAnchorOffset", "getGridOffset"];
|
|
2503
|
+
static getters: readonly ["getColIndex", "getRowIndex", "getActiveMainViewport", "getSheetViewDimension", "getSheetViewDimensionWithHeaders", "getMainViewportRect", "isVisibleInViewport", "getEdgeScrollCol", "getEdgeScrollRow", "getVisibleFigures", "getVisibleRect", "getVisibleRectWithoutHeaders", "getVisibleCellPositions", "getColRowOffsetInViewport", "getMainViewportCoordinates", "getActiveSheetScrollInfo", "getSheetViewVisibleCols", "getSheetViewVisibleRows", "getFrozenSheetViewRatio", "isPixelPositionVisible", "getColDimensionsInViewport", "getRowDimensionsInViewport", "getAllActiveViewportsZonesAndRect", "getRect", "getFigureUI", "getPositionAnchorOffset", "getGridOffset", "getMaximumSheetOffset"];
|
|
2504
2504
|
private viewports;
|
|
2505
2505
|
/**
|
|
2506
2506
|
* The viewport dimensions are usually set by one of the components
|
|
@@ -2551,7 +2551,10 @@ declare class SheetViewPlugin extends UIPlugin {
|
|
|
2551
2551
|
* Return the main viewport maximum size relative to the client size.
|
|
2552
2552
|
*/
|
|
2553
2553
|
getMainViewportRect(): Rect;
|
|
2554
|
-
|
|
2554
|
+
getMaximumSheetOffset(): {
|
|
2555
|
+
maxOffsetX: Pixel;
|
|
2556
|
+
maxOffsetY: Pixel;
|
|
2557
|
+
};
|
|
2555
2558
|
getColRowOffsetInViewport(dimension: Dimension, referenceHeaderIndex: HeaderIndex, targetHeaderIndex: HeaderIndex): Pixel;
|
|
2556
2559
|
/**
|
|
2557
2560
|
* Check if a given position is visible in the viewport.
|
|
@@ -6763,7 +6766,6 @@ type PivotDefinitionConstructor = new (definition: PivotCoreDefinition, fields:
|
|
|
6763
6766
|
interface PivotRegistryItem {
|
|
6764
6767
|
ui: PivotUIConstructor;
|
|
6765
6768
|
definition: PivotDefinitionConstructor;
|
|
6766
|
-
externalData: boolean;
|
|
6767
6769
|
dateGranularities: string[];
|
|
6768
6770
|
datetimeGranularities: string[];
|
|
6769
6771
|
isMeasureCandidate: (field: PivotField) => boolean;
|
|
@@ -8641,7 +8643,7 @@ declare abstract class AbstractComposerStore extends SpreadsheetStore {
|
|
|
8641
8643
|
private updateAutoCompleteProvider;
|
|
8642
8644
|
private findAutocompleteProvider;
|
|
8643
8645
|
hideHelp(): void;
|
|
8644
|
-
autoCompleteOrStop(direction: Direction$1): void;
|
|
8646
|
+
autoCompleteOrStop(direction: Direction$1, assistantForcedClosed?: boolean): void;
|
|
8645
8647
|
insertAutoCompleteValue(value: string): void;
|
|
8646
8648
|
selectAutoCompleteIndex(index: number): void;
|
|
8647
8649
|
moveAutoCompleteSelection(direction: "previous" | "next"): void;
|
|
@@ -9142,7 +9144,7 @@ interface ClosedSidePanel {
|
|
|
9142
9144
|
}
|
|
9143
9145
|
type SidePanelState = OpenSidePanel | ClosedSidePanel;
|
|
9144
9146
|
interface PanelInfo {
|
|
9145
|
-
|
|
9147
|
+
currentPanelProps: SidePanelComponentProps;
|
|
9146
9148
|
componentTag: string;
|
|
9147
9149
|
size: number;
|
|
9148
9150
|
isCollapsed?: boolean;
|
|
@@ -9169,8 +9171,8 @@ declare class SidePanelStore extends SpreadsheetStore {
|
|
|
9169
9171
|
get totalPanelSize(): number;
|
|
9170
9172
|
private getPanelProps;
|
|
9171
9173
|
private getPanelKey;
|
|
9172
|
-
open(componentTag: string,
|
|
9173
|
-
replace(componentTag: string, currentPanelKey: string,
|
|
9174
|
+
open(componentTag: string, currentPanelProps?: SidePanelComponentProps): void;
|
|
9175
|
+
replace(componentTag: string, currentPanelKey: string, currentPanelProps?: SidePanelComponentProps): void;
|
|
9174
9176
|
private _openPanel;
|
|
9175
9177
|
toggle(componentTag: string, panelProps: SidePanelComponentProps): void;
|
|
9176
9178
|
close(): void;
|
|
@@ -10023,7 +10025,7 @@ declare abstract class AbstractResizer extends Component<ResizerProps, Spreadshe
|
|
|
10023
10025
|
setup(): void;
|
|
10024
10026
|
_computeHandleDisplay(ev: MouseEvent): void;
|
|
10025
10027
|
_computeGrabDisplay(ev: MouseEvent): void;
|
|
10026
|
-
onMouseMove(ev:
|
|
10028
|
+
onMouseMove(ev: MouseEvent): void;
|
|
10027
10029
|
onMouseLeave(): void;
|
|
10028
10030
|
onDblClick(ev: MouseEvent): void;
|
|
10029
10031
|
onMouseDown(ev: MouseEvent): void;
|
|
@@ -11987,6 +11989,7 @@ declare class ClickableCellsStore extends SpreadsheetStore {
|
|
|
11987
11989
|
private getClickableItem;
|
|
11988
11990
|
private findClickableItem;
|
|
11989
11991
|
get clickableCells(): ClickableCell[];
|
|
11992
|
+
private getClickableCellRect;
|
|
11990
11993
|
}
|
|
11991
11994
|
|
|
11992
11995
|
interface Props$4 {
|