@odoo/o-spreadsheet 19.4.5 → 19.4.7
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 +77 -20
- package/dist/o_spreadsheet.css +3 -3
- package/dist/o_spreadsheet.esm.js +77 -20
- package/dist/o_spreadsheet.iife.js +77 -20
- package/dist/o_spreadsheet.min.iife.js +261 -261
- package/dist/o_spreadsheet.xml +3 -3
- package/dist/types/components/figures/chart/chartJs/chartjs_geo_projection_plugin.d.ts +12 -0
- package/dist/types/components/figures/figure/figure.d.ts +3 -3
- package/dist/types/functions/function_registry.d.ts +3 -0
- package/dist/types/index.d.ts +4 -1
- package/dist/types/plugins/core/squisher.d.ts +2 -1
- package/package.json +2 -2
package/dist/o_spreadsheet.cjs
CHANGED
|
@@ -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 19.4.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.4.7
|
|
6
|
+
* @date 2026-08-12T09:16:40.949Z
|
|
7
|
+
* @hash 65642fe
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
@@ -5958,6 +5958,9 @@ var FunctionRegistry = class extends Registry {
|
|
|
5958
5958
|
}
|
|
5959
5959
|
};
|
|
5960
5960
|
const functionRegistry = new FunctionRegistry();
|
|
5961
|
+
/** Formulas using one of these functions are never squished: they are always exported
|
|
5962
|
+
* as a full formula string, and they don't become the base formula of the next cells. */
|
|
5963
|
+
const NonSquishableFunctionRegistry = new Registry();
|
|
5961
5964
|
|
|
5962
5965
|
//#endregion
|
|
5963
5966
|
//#region src/helpers/references.ts
|
|
@@ -8916,6 +8919,25 @@ const funnelTooltipPositioner = function(elements) {
|
|
|
8916
8919
|
};
|
|
8917
8920
|
};
|
|
8918
8921
|
|
|
8922
|
+
//#endregion
|
|
8923
|
+
//#region src/components/figures/chart/chartJs/chartjs_geo_projection_plugin.ts
|
|
8924
|
+
/**
|
|
8925
|
+
* ChartJS plugin to apply custom changes to a d3 projection.
|
|
8926
|
+
*
|
|
8927
|
+
* We pass the projection as a string instead of a customized d3 object so
|
|
8928
|
+
* Chart.js creates a fresh projection instance. Custom changes (e.g. rotation)
|
|
8929
|
+
* are then applied in `beforeUpdate`.
|
|
8930
|
+
*
|
|
8931
|
+
* This is important because Chart.js mutates the projection instance at runtime,
|
|
8932
|
+
* and a customize d3 projection object would not be copied during deepCopy.
|
|
8933
|
+
*/
|
|
8934
|
+
const geoProjectionPlugin = {
|
|
8935
|
+
id: "geoProjection",
|
|
8936
|
+
beforeUpdate(chart) {
|
|
8937
|
+
if (chart.options?.scales?.projection?.projection === "conicConformal") chart.scales?.projection?.projection?.rotate([100, 0]);
|
|
8938
|
+
}
|
|
8939
|
+
};
|
|
8940
|
+
|
|
8919
8941
|
//#endregion
|
|
8920
8942
|
//#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
|
|
8921
8943
|
const chartMinorGridPlugin = {
|
|
@@ -10719,7 +10741,7 @@ function getGeoChartScales(definition, args) {
|
|
|
10719
10741
|
const format = axisFormats?.y || axisFormats?.y1;
|
|
10720
10742
|
return {
|
|
10721
10743
|
projection: {
|
|
10722
|
-
projection:
|
|
10744
|
+
projection: region?.defaultProjection || "mercator",
|
|
10723
10745
|
axis: "x"
|
|
10724
10746
|
},
|
|
10725
10747
|
color: {
|
|
@@ -10771,10 +10793,6 @@ function getFunnelChartScales(definition, args) {
|
|
|
10771
10793
|
}
|
|
10772
10794
|
};
|
|
10773
10795
|
}
|
|
10774
|
-
function getGeoChartProjection(projection) {
|
|
10775
|
-
if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
|
|
10776
|
-
return projection;
|
|
10777
|
-
}
|
|
10778
10796
|
function getChartAxisTitleRuntime(design) {
|
|
10779
10797
|
if (design?.title?.text) {
|
|
10780
10798
|
const { text, color, align, italic, bold } = design.title;
|
|
@@ -11735,6 +11753,10 @@ chartJsExtensionRegistry.add("chartBackgroundPlugin", {
|
|
|
11735
11753
|
register: (Chart) => Chart.register(chartBackgroundPlugin),
|
|
11736
11754
|
unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
|
|
11737
11755
|
});
|
|
11756
|
+
chartJsExtensionRegistry.add("geoProjectionPlugin", {
|
|
11757
|
+
register: (Chart) => Chart.register(geoProjectionPlugin),
|
|
11758
|
+
unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
|
|
11759
|
+
});
|
|
11738
11760
|
var ChartJsComponent = class extends Component {
|
|
11739
11761
|
static template = "o-spreadsheet-ChartJsComponent";
|
|
11740
11762
|
props = (0, _odoo_owl.useProps)({
|
|
@@ -15584,7 +15606,7 @@ var FigureComponent = class extends Component {
|
|
|
15584
15606
|
figures.push({
|
|
15585
15607
|
sheetId,
|
|
15586
15608
|
figureId,
|
|
15587
|
-
...this.
|
|
15609
|
+
...this.positionInBoundary(sheetId, this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
|
|
15588
15610
|
});
|
|
15589
15611
|
}
|
|
15590
15612
|
this.env.model.dispatch("MOVE_FIGURES", { figures });
|
|
@@ -15604,21 +15626,23 @@ var FigureComponent = class extends Component {
|
|
|
15604
15626
|
break;
|
|
15605
15627
|
}
|
|
15606
15628
|
}
|
|
15607
|
-
|
|
15608
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
15629
|
+
positionInBoundary(sheetId, figure, key, shift) {
|
|
15609
15630
|
const shiftAmount = shift ? 1 : 5;
|
|
15610
|
-
let { col, row, offset } =
|
|
15631
|
+
let { col, row, offset } = figure;
|
|
15611
15632
|
offset = { ...offset };
|
|
15633
|
+
const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
|
|
15612
15634
|
switch (key) {
|
|
15613
15635
|
case "ArrowUp":
|
|
15614
15636
|
if (offset.y < shiftAmount) {
|
|
15615
15637
|
row--;
|
|
15638
|
+
while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
|
|
15616
15639
|
offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
|
|
15617
15640
|
} else offset.y -= shiftAmount;
|
|
15618
15641
|
break;
|
|
15619
15642
|
case "ArrowLeft":
|
|
15620
15643
|
if (offset.x < shiftAmount) {
|
|
15621
15644
|
col--;
|
|
15645
|
+
while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
|
|
15622
15646
|
offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
|
|
15623
15647
|
} else offset.x -= shiftAmount;
|
|
15624
15648
|
break;
|
|
@@ -15626,6 +15650,7 @@ var FigureComponent = class extends Component {
|
|
|
15626
15650
|
const rowSize = this.env.model.getters.getRowSize(sheetId, row);
|
|
15627
15651
|
if (offset.y + shiftAmount >= rowSize) {
|
|
15628
15652
|
row++;
|
|
15653
|
+
while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
|
|
15629
15654
|
offset.y = offset.y + shiftAmount - rowSize;
|
|
15630
15655
|
} else offset.y += shiftAmount;
|
|
15631
15656
|
break;
|
|
@@ -15633,9 +15658,24 @@ var FigureComponent = class extends Component {
|
|
|
15633
15658
|
const colSize = this.env.model.getters.getColSize(sheetId, col);
|
|
15634
15659
|
if (offset.x + shiftAmount >= colSize) {
|
|
15635
15660
|
col++;
|
|
15661
|
+
while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
|
|
15636
15662
|
offset.x = offset.x + shiftAmount - colSize;
|
|
15637
15663
|
} else offset.x += shiftAmount;
|
|
15638
15664
|
}
|
|
15665
|
+
if (col < 0) {
|
|
15666
|
+
col = 0;
|
|
15667
|
+
offset.x = 0;
|
|
15668
|
+
} else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
|
|
15669
|
+
col = maxAnchor.col;
|
|
15670
|
+
offset.x = maxAnchor.offset.x;
|
|
15671
|
+
}
|
|
15672
|
+
if (row < 0) {
|
|
15673
|
+
row = 0;
|
|
15674
|
+
offset.y = 0;
|
|
15675
|
+
} else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
|
|
15676
|
+
row = maxAnchor.row;
|
|
15677
|
+
offset.y = maxAnchor.offset.y;
|
|
15678
|
+
}
|
|
15639
15679
|
return {
|
|
15640
15680
|
col,
|
|
15641
15681
|
row,
|
|
@@ -46021,7 +46061,13 @@ var CellComposerStore = class extends AbstractComposerStore {
|
|
|
46021
46061
|
const cell = this.getters.getEvaluatedCell(position);
|
|
46022
46062
|
if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
|
|
46023
46063
|
const currentFormat = this.getters.getCell(position)?.format;
|
|
46024
|
-
const
|
|
46064
|
+
const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
|
|
46065
|
+
const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
|
|
46066
|
+
let afterFormat;
|
|
46067
|
+
if (currentFormat !== "@") {
|
|
46068
|
+
if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
|
|
46069
|
+
else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
|
|
46070
|
+
}
|
|
46025
46071
|
this.addHeadersForSpreadingFormula(content);
|
|
46026
46072
|
result = this.model.dispatch("UPDATE_CELL", {
|
|
46027
46073
|
...this.currentEditedCell,
|
|
@@ -51107,7 +51153,8 @@ var Squisher = class {
|
|
|
51107
51153
|
* The result of this method is:
|
|
51108
51154
|
* - if the cell is not a formula, returns the content as is and resets the base formula
|
|
51109
51155
|
* - if the cell is a formula:
|
|
51110
|
-
* - if there is no previous formula, or the normalized formula is different from the previous one
|
|
51156
|
+
* - if there is no previous formula, or the normalized formula is different from the previous one or it contains blacklisted functions (see NonSquishableFunctionRegistry),
|
|
51157
|
+
* resets the base formula to this one and returns the full formula string
|
|
51111
51158
|
* - else, compares the literal values and range dependencies to the previous formula, and for each parameter:
|
|
51112
51159
|
* - for numbers: returns a relative change (+N or -N) if possible, else the full number or "=" if unchanged
|
|
51113
51160
|
* - for strings: returns the full string if changed, else "="
|
|
@@ -51115,6 +51162,10 @@ var Squisher = class {
|
|
|
51115
51162
|
* */
|
|
51116
51163
|
squish(cell, forSheetId) {
|
|
51117
51164
|
if (cell.isFormula) {
|
|
51165
|
+
if (NonSquishableFunctionRegistry.getAll().some((functionName) => cell.compiledFormula.usesSymbol(functionName))) {
|
|
51166
|
+
this.resetBaseFormula();
|
|
51167
|
+
return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
|
|
51168
|
+
}
|
|
51118
51169
|
let numbers = [];
|
|
51119
51170
|
let strings = [];
|
|
51120
51171
|
let references = [];
|
|
@@ -62559,7 +62610,7 @@ var Session = class extends EventBus {
|
|
|
62559
62610
|
}
|
|
62560
62611
|
message = {
|
|
62561
62612
|
...message,
|
|
62562
|
-
commands:
|
|
62613
|
+
commands: revision.commands
|
|
62563
62614
|
};
|
|
62564
62615
|
}
|
|
62565
62616
|
if (this.isReplayingInitialRevisions) throw new Error(`Trying to send a new revision while replaying initial revision. This can lead to endless dispatches every time the spreadsheet is open.
|
|
@@ -67876,6 +67927,10 @@ function inverseCreateFigure(cmd) {
|
|
|
67876
67927
|
}
|
|
67877
67928
|
function inverseCreateChart(cmd) {
|
|
67878
67929
|
return [{
|
|
67930
|
+
type: "DELETE_CHART",
|
|
67931
|
+
chartId: cmd.chartId,
|
|
67932
|
+
sheetId: cmd.sheetId
|
|
67933
|
+
}, {
|
|
67879
67934
|
type: "DELETE_FIGURE",
|
|
67880
67935
|
figureId: cmd.figureId,
|
|
67881
67936
|
sheetId: cmd.sheetId
|
|
@@ -87565,7 +87620,8 @@ const registries = {
|
|
|
87565
87620
|
migrationStepRegistry,
|
|
87566
87621
|
chartJsExtensionRegistry,
|
|
87567
87622
|
onIterationEndEvaluationRegistry,
|
|
87568
|
-
specificRangeTransformRegistry
|
|
87623
|
+
specificRangeTransformRegistry,
|
|
87624
|
+
NonSquishableFunctionRegistry
|
|
87569
87625
|
};
|
|
87570
87626
|
const helpers = {
|
|
87571
87627
|
arg,
|
|
@@ -87712,7 +87768,8 @@ const components = {
|
|
|
87712
87768
|
FullScreenFigure,
|
|
87713
87769
|
NumberInput,
|
|
87714
87770
|
TopBar,
|
|
87715
|
-
Composer
|
|
87771
|
+
Composer,
|
|
87772
|
+
CarouselFigure
|
|
87716
87773
|
};
|
|
87717
87774
|
const hooks = {
|
|
87718
87775
|
useDragAndDropListItems,
|
|
@@ -87866,6 +87923,6 @@ exports.stores = stores;
|
|
|
87866
87923
|
exports.tokenColors = tokenColors;
|
|
87867
87924
|
exports.tokenize = tokenize;
|
|
87868
87925
|
|
|
87869
|
-
__info__.version = "19.4.
|
|
87870
|
-
__info__.date = "2026-
|
|
87871
|
-
__info__.hash = "
|
|
87926
|
+
__info__.version = "19.4.7";
|
|
87927
|
+
__info__.date = "2026-08-12T09:16:40.949Z";
|
|
87928
|
+
__info__.hash = "65642fe";
|
package/dist/o_spreadsheet.css
CHANGED
|
@@ -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 19.4.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.4.7
|
|
6
|
+
* @date 2026-08-12T09:16:42.630Z
|
|
7
|
+
* @hash 65642fe
|
|
8
8
|
*/
|
|
9
9
|
:root {
|
|
10
10
|
--os-gray-100: light-dark(#f9fafb, #1b1d26);
|
|
@@ -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 19.4.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.4.7
|
|
6
|
+
* @date 2026-08-12T09:16:40.949Z
|
|
7
|
+
* @hash 65642fe
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import * as owl from "@odoo/owl";
|
|
@@ -5957,6 +5957,9 @@ var FunctionRegistry = class extends Registry {
|
|
|
5957
5957
|
}
|
|
5958
5958
|
};
|
|
5959
5959
|
const functionRegistry = new FunctionRegistry();
|
|
5960
|
+
/** Formulas using one of these functions are never squished: they are always exported
|
|
5961
|
+
* as a full formula string, and they don't become the base formula of the next cells. */
|
|
5962
|
+
const NonSquishableFunctionRegistry = new Registry();
|
|
5960
5963
|
|
|
5961
5964
|
//#endregion
|
|
5962
5965
|
//#region src/helpers/references.ts
|
|
@@ -8915,6 +8918,25 @@ const funnelTooltipPositioner = function(elements) {
|
|
|
8915
8918
|
};
|
|
8916
8919
|
};
|
|
8917
8920
|
|
|
8921
|
+
//#endregion
|
|
8922
|
+
//#region src/components/figures/chart/chartJs/chartjs_geo_projection_plugin.ts
|
|
8923
|
+
/**
|
|
8924
|
+
* ChartJS plugin to apply custom changes to a d3 projection.
|
|
8925
|
+
*
|
|
8926
|
+
* We pass the projection as a string instead of a customized d3 object so
|
|
8927
|
+
* Chart.js creates a fresh projection instance. Custom changes (e.g. rotation)
|
|
8928
|
+
* are then applied in `beforeUpdate`.
|
|
8929
|
+
*
|
|
8930
|
+
* This is important because Chart.js mutates the projection instance at runtime,
|
|
8931
|
+
* and a customize d3 projection object would not be copied during deepCopy.
|
|
8932
|
+
*/
|
|
8933
|
+
const geoProjectionPlugin = {
|
|
8934
|
+
id: "geoProjection",
|
|
8935
|
+
beforeUpdate(chart) {
|
|
8936
|
+
if (chart.options?.scales?.projection?.projection === "conicConformal") chart.scales?.projection?.projection?.rotate([100, 0]);
|
|
8937
|
+
}
|
|
8938
|
+
};
|
|
8939
|
+
|
|
8918
8940
|
//#endregion
|
|
8919
8941
|
//#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
|
|
8920
8942
|
const chartMinorGridPlugin = {
|
|
@@ -10718,7 +10740,7 @@ function getGeoChartScales(definition, args) {
|
|
|
10718
10740
|
const format = axisFormats?.y || axisFormats?.y1;
|
|
10719
10741
|
return {
|
|
10720
10742
|
projection: {
|
|
10721
|
-
projection:
|
|
10743
|
+
projection: region?.defaultProjection || "mercator",
|
|
10722
10744
|
axis: "x"
|
|
10723
10745
|
},
|
|
10724
10746
|
color: {
|
|
@@ -10770,10 +10792,6 @@ function getFunnelChartScales(definition, args) {
|
|
|
10770
10792
|
}
|
|
10771
10793
|
};
|
|
10772
10794
|
}
|
|
10773
|
-
function getGeoChartProjection(projection) {
|
|
10774
|
-
if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
|
|
10775
|
-
return projection;
|
|
10776
|
-
}
|
|
10777
10795
|
function getChartAxisTitleRuntime(design) {
|
|
10778
10796
|
if (design?.title?.text) {
|
|
10779
10797
|
const { text, color, align, italic, bold } = design.title;
|
|
@@ -11734,6 +11752,10 @@ chartJsExtensionRegistry.add("chartBackgroundPlugin", {
|
|
|
11734
11752
|
register: (Chart) => Chart.register(chartBackgroundPlugin),
|
|
11735
11753
|
unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
|
|
11736
11754
|
});
|
|
11755
|
+
chartJsExtensionRegistry.add("geoProjectionPlugin", {
|
|
11756
|
+
register: (Chart) => Chart.register(geoProjectionPlugin),
|
|
11757
|
+
unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
|
|
11758
|
+
});
|
|
11737
11759
|
var ChartJsComponent = class extends Component {
|
|
11738
11760
|
static template = "o-spreadsheet-ChartJsComponent";
|
|
11739
11761
|
props = useProps({
|
|
@@ -15583,7 +15605,7 @@ var FigureComponent = class extends Component {
|
|
|
15583
15605
|
figures.push({
|
|
15584
15606
|
sheetId,
|
|
15585
15607
|
figureId,
|
|
15586
|
-
...this.
|
|
15608
|
+
...this.positionInBoundary(sheetId, this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
|
|
15587
15609
|
});
|
|
15588
15610
|
}
|
|
15589
15611
|
this.env.model.dispatch("MOVE_FIGURES", { figures });
|
|
@@ -15603,21 +15625,23 @@ var FigureComponent = class extends Component {
|
|
|
15603
15625
|
break;
|
|
15604
15626
|
}
|
|
15605
15627
|
}
|
|
15606
|
-
|
|
15607
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
15628
|
+
positionInBoundary(sheetId, figure, key, shift) {
|
|
15608
15629
|
const shiftAmount = shift ? 1 : 5;
|
|
15609
|
-
let { col, row, offset } =
|
|
15630
|
+
let { col, row, offset } = figure;
|
|
15610
15631
|
offset = { ...offset };
|
|
15632
|
+
const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
|
|
15611
15633
|
switch (key) {
|
|
15612
15634
|
case "ArrowUp":
|
|
15613
15635
|
if (offset.y < shiftAmount) {
|
|
15614
15636
|
row--;
|
|
15637
|
+
while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
|
|
15615
15638
|
offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
|
|
15616
15639
|
} else offset.y -= shiftAmount;
|
|
15617
15640
|
break;
|
|
15618
15641
|
case "ArrowLeft":
|
|
15619
15642
|
if (offset.x < shiftAmount) {
|
|
15620
15643
|
col--;
|
|
15644
|
+
while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
|
|
15621
15645
|
offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
|
|
15622
15646
|
} else offset.x -= shiftAmount;
|
|
15623
15647
|
break;
|
|
@@ -15625,6 +15649,7 @@ var FigureComponent = class extends Component {
|
|
|
15625
15649
|
const rowSize = this.env.model.getters.getRowSize(sheetId, row);
|
|
15626
15650
|
if (offset.y + shiftAmount >= rowSize) {
|
|
15627
15651
|
row++;
|
|
15652
|
+
while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
|
|
15628
15653
|
offset.y = offset.y + shiftAmount - rowSize;
|
|
15629
15654
|
} else offset.y += shiftAmount;
|
|
15630
15655
|
break;
|
|
@@ -15632,9 +15657,24 @@ var FigureComponent = class extends Component {
|
|
|
15632
15657
|
const colSize = this.env.model.getters.getColSize(sheetId, col);
|
|
15633
15658
|
if (offset.x + shiftAmount >= colSize) {
|
|
15634
15659
|
col++;
|
|
15660
|
+
while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
|
|
15635
15661
|
offset.x = offset.x + shiftAmount - colSize;
|
|
15636
15662
|
} else offset.x += shiftAmount;
|
|
15637
15663
|
}
|
|
15664
|
+
if (col < 0) {
|
|
15665
|
+
col = 0;
|
|
15666
|
+
offset.x = 0;
|
|
15667
|
+
} else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
|
|
15668
|
+
col = maxAnchor.col;
|
|
15669
|
+
offset.x = maxAnchor.offset.x;
|
|
15670
|
+
}
|
|
15671
|
+
if (row < 0) {
|
|
15672
|
+
row = 0;
|
|
15673
|
+
offset.y = 0;
|
|
15674
|
+
} else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
|
|
15675
|
+
row = maxAnchor.row;
|
|
15676
|
+
offset.y = maxAnchor.offset.y;
|
|
15677
|
+
}
|
|
15638
15678
|
return {
|
|
15639
15679
|
col,
|
|
15640
15680
|
row,
|
|
@@ -46020,7 +46060,13 @@ var CellComposerStore = class extends AbstractComposerStore {
|
|
|
46020
46060
|
const cell = this.getters.getEvaluatedCell(position);
|
|
46021
46061
|
if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
|
|
46022
46062
|
const currentFormat = this.getters.getCell(position)?.format;
|
|
46023
|
-
const
|
|
46063
|
+
const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
|
|
46064
|
+
const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
|
|
46065
|
+
let afterFormat;
|
|
46066
|
+
if (currentFormat !== "@") {
|
|
46067
|
+
if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
|
|
46068
|
+
else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
|
|
46069
|
+
}
|
|
46024
46070
|
this.addHeadersForSpreadingFormula(content);
|
|
46025
46071
|
result = this.model.dispatch("UPDATE_CELL", {
|
|
46026
46072
|
...this.currentEditedCell,
|
|
@@ -51106,7 +51152,8 @@ var Squisher = class {
|
|
|
51106
51152
|
* The result of this method is:
|
|
51107
51153
|
* - if the cell is not a formula, returns the content as is and resets the base formula
|
|
51108
51154
|
* - if the cell is a formula:
|
|
51109
|
-
* - if there is no previous formula, or the normalized formula is different from the previous one
|
|
51155
|
+
* - if there is no previous formula, or the normalized formula is different from the previous one or it contains blacklisted functions (see NonSquishableFunctionRegistry),
|
|
51156
|
+
* resets the base formula to this one and returns the full formula string
|
|
51110
51157
|
* - else, compares the literal values and range dependencies to the previous formula, and for each parameter:
|
|
51111
51158
|
* - for numbers: returns a relative change (+N or -N) if possible, else the full number or "=" if unchanged
|
|
51112
51159
|
* - for strings: returns the full string if changed, else "="
|
|
@@ -51114,6 +51161,10 @@ var Squisher = class {
|
|
|
51114
51161
|
* */
|
|
51115
51162
|
squish(cell, forSheetId) {
|
|
51116
51163
|
if (cell.isFormula) {
|
|
51164
|
+
if (NonSquishableFunctionRegistry.getAll().some((functionName) => cell.compiledFormula.usesSymbol(functionName))) {
|
|
51165
|
+
this.resetBaseFormula();
|
|
51166
|
+
return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
|
|
51167
|
+
}
|
|
51117
51168
|
let numbers = [];
|
|
51118
51169
|
let strings = [];
|
|
51119
51170
|
let references = [];
|
|
@@ -62374,7 +62425,7 @@ var Session = class extends EventBus {
|
|
|
62374
62425
|
}
|
|
62375
62426
|
message = {
|
|
62376
62427
|
...message,
|
|
62377
|
-
commands:
|
|
62428
|
+
commands: revision.commands
|
|
62378
62429
|
};
|
|
62379
62430
|
}
|
|
62380
62431
|
if (this.isReplayingInitialRevisions) throw new Error(`Trying to send a new revision while replaying initial revision. This can lead to endless dispatches every time the spreadsheet is open.
|
|
@@ -67691,6 +67742,10 @@ function inverseCreateFigure(cmd) {
|
|
|
67691
67742
|
}
|
|
67692
67743
|
function inverseCreateChart(cmd) {
|
|
67693
67744
|
return [{
|
|
67745
|
+
type: "DELETE_CHART",
|
|
67746
|
+
chartId: cmd.chartId,
|
|
67747
|
+
sheetId: cmd.sheetId
|
|
67748
|
+
}, {
|
|
67694
67749
|
type: "DELETE_FIGURE",
|
|
67695
67750
|
figureId: cmd.figureId,
|
|
67696
67751
|
sheetId: cmd.sheetId
|
|
@@ -87380,7 +87435,8 @@ const registries = {
|
|
|
87380
87435
|
migrationStepRegistry,
|
|
87381
87436
|
chartJsExtensionRegistry,
|
|
87382
87437
|
onIterationEndEvaluationRegistry,
|
|
87383
|
-
specificRangeTransformRegistry
|
|
87438
|
+
specificRangeTransformRegistry,
|
|
87439
|
+
NonSquishableFunctionRegistry
|
|
87384
87440
|
};
|
|
87385
87441
|
const helpers = {
|
|
87386
87442
|
arg,
|
|
@@ -87527,7 +87583,8 @@ const components = {
|
|
|
87527
87583
|
FullScreenFigure,
|
|
87528
87584
|
NumberInput,
|
|
87529
87585
|
TopBar,
|
|
87530
|
-
Composer
|
|
87586
|
+
Composer,
|
|
87587
|
+
CarouselFigure
|
|
87531
87588
|
};
|
|
87532
87589
|
const hooks = {
|
|
87533
87590
|
useDragAndDropListItems,
|
|
@@ -87587,6 +87644,6 @@ const chartHelpers = {
|
|
|
87587
87644
|
//#endregion
|
|
87588
87645
|
export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, BadExpressionError, CHART_TYPES, CellErrorType, CellValueType, CircularDependencyError, ClientDisconnectedError, ClipboardMIMEType, CommandResult, CompiledFormula, CorePlugin, CoreViewPlugin, DEFAULT_LOCALE, DEFAULT_LOCALES, DEFAULT_LOCALE_DIGIT_GROUPING, DIRECTION, DispatchResult, DivisionByZeroError, EvaluationError, InvalidReferenceError, LocalTransportService, Model, NEXT_VALUE, NotAvailableError, NumberTooLargeError, OrderedLayers, PREVIOUS_VALUE, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, SplillBlockedError, Spreadsheet, SpreadsheetPivotTable, UIPlugin, UnknownFunctionError, __info__, addFunction, addRenderingLayer, astToFormula, availableConditionalFormatOperators, availableDataValidationOperators, availableFiltersOperators, borderPositions, borderStyles, canExecuteInReadonly, categories, chartHelpers, compatibility, components, composerFocusTypes, constants, convertAstNodes, coreTypes, createAutocompleteArgumentsProvider, errorTypes, filterDateCriterionOperators, filterNumberCriterionOperators, filterTextCriterionOperators, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidSubtotalFormulasCommands, invalidateBordersCommands, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, isCoreCommand, isHeadersDependant, isMatrix, isPositionDependent, isRangeDependant, isSheetDependent, isTargetDependent, isZoneDependent, iterateAstNodes, links, load, lockedSheetAllowedCommands, parse, parseTokens, readonlyAllowedCommands, registries, schemeToColorScale, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
|
|
87589
87646
|
|
|
87590
|
-
__info__.version = "19.4.
|
|
87591
|
-
__info__.date = "2026-
|
|
87592
|
-
__info__.hash = "
|
|
87647
|
+
__info__.version = "19.4.7";
|
|
87648
|
+
__info__.date = "2026-08-12T09:16:40.949Z";
|
|
87649
|
+
__info__.hash = "65642fe";
|