@odoo/o-spreadsheet 19.4.4 → 19.4.6
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 +89 -34
- package/dist/o_spreadsheet.css +3 -3
- package/dist/o_spreadsheet.esm.js +89 -34
- package/dist/o_spreadsheet.iife.js +89 -34
- package/dist/o_spreadsheet.min.iife.js +257 -257
- package/dist/o_spreadsheet.xml +6 -8
- 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/components/helpers/dom_helpers.d.ts +2 -0
- package/dist/types/components/side_panel/pivot/pivot_layout_configurator/pivot_layout_configurator.d.ts +0 -2
- package/dist/types/index.d.ts +2 -0
- 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.6
|
|
6
|
+
* @date 2026-08-10T12:33:32.728Z
|
|
7
|
+
* @hash 5c667fe
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
@@ -348,6 +348,19 @@ function isOtherMobileOS() {
|
|
|
348
348
|
function isMobileOS() {
|
|
349
349
|
return isAndroid() || isIOS() || isOtherMobileOS();
|
|
350
350
|
}
|
|
351
|
+
const INTERACTIVE_ELEMENT_SELECTOR = "select, input, textarea, button, .o-select, .os-input, .o-input, .o-button, .o-button-icon, .o-button-link, .o-composer";
|
|
352
|
+
/** Check if there is an interactive element (input, select, button, ...) between the event.target and event.currentTarget (inclusive)*/
|
|
353
|
+
function hasInteractiveElementInEventTree(event) {
|
|
354
|
+
const target = event.target;
|
|
355
|
+
const root = event.currentTarget;
|
|
356
|
+
if (!root || !target || !root.contains(target)) return false;
|
|
357
|
+
let node = target;
|
|
358
|
+
while (node && node !== root) {
|
|
359
|
+
if (node.matches(INTERACTIVE_ELEMENT_SELECTOR)) return true;
|
|
360
|
+
node = node.parentElement;
|
|
361
|
+
}
|
|
362
|
+
return root.matches(INTERACTIVE_ELEMENT_SELECTOR);
|
|
363
|
+
}
|
|
351
364
|
|
|
352
365
|
//#endregion
|
|
353
366
|
//#region src/actions/action.ts
|
|
@@ -8903,6 +8916,25 @@ const funnelTooltipPositioner = function(elements) {
|
|
|
8903
8916
|
};
|
|
8904
8917
|
};
|
|
8905
8918
|
|
|
8919
|
+
//#endregion
|
|
8920
|
+
//#region src/components/figures/chart/chartJs/chartjs_geo_projection_plugin.ts
|
|
8921
|
+
/**
|
|
8922
|
+
* ChartJS plugin to apply custom changes to a d3 projection.
|
|
8923
|
+
*
|
|
8924
|
+
* We pass the projection as a string instead of a customized d3 object so
|
|
8925
|
+
* Chart.js creates a fresh projection instance. Custom changes (e.g. rotation)
|
|
8926
|
+
* are then applied in `beforeUpdate`.
|
|
8927
|
+
*
|
|
8928
|
+
* This is important because Chart.js mutates the projection instance at runtime,
|
|
8929
|
+
* and a customize d3 projection object would not be copied during deepCopy.
|
|
8930
|
+
*/
|
|
8931
|
+
const geoProjectionPlugin = {
|
|
8932
|
+
id: "geoProjection",
|
|
8933
|
+
beforeUpdate(chart) {
|
|
8934
|
+
if (chart.options?.scales?.projection?.projection === "conicConformal") chart.scales?.projection?.projection?.rotate([100, 0]);
|
|
8935
|
+
}
|
|
8936
|
+
};
|
|
8937
|
+
|
|
8906
8938
|
//#endregion
|
|
8907
8939
|
//#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
|
|
8908
8940
|
const chartMinorGridPlugin = {
|
|
@@ -10706,7 +10738,7 @@ function getGeoChartScales(definition, args) {
|
|
|
10706
10738
|
const format = axisFormats?.y || axisFormats?.y1;
|
|
10707
10739
|
return {
|
|
10708
10740
|
projection: {
|
|
10709
|
-
projection:
|
|
10741
|
+
projection: region?.defaultProjection || "mercator",
|
|
10710
10742
|
axis: "x"
|
|
10711
10743
|
},
|
|
10712
10744
|
color: {
|
|
@@ -10758,10 +10790,6 @@ function getFunnelChartScales(definition, args) {
|
|
|
10758
10790
|
}
|
|
10759
10791
|
};
|
|
10760
10792
|
}
|
|
10761
|
-
function getGeoChartProjection(projection) {
|
|
10762
|
-
if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
|
|
10763
|
-
return projection;
|
|
10764
|
-
}
|
|
10765
10793
|
function getChartAxisTitleRuntime(design) {
|
|
10766
10794
|
if (design?.title?.text) {
|
|
10767
10795
|
const { text, color, align, italic, bold } = design.title;
|
|
@@ -10963,7 +10991,7 @@ function getCalendarChartDatasetAndLabels(definition, args) {
|
|
|
10963
10991
|
borderWidth: 1,
|
|
10964
10992
|
barPercentage: 1,
|
|
10965
10993
|
categoryPercentage: 1,
|
|
10966
|
-
values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value :
|
|
10994
|
+
values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : void 0)
|
|
10967
10995
|
});
|
|
10968
10996
|
return {
|
|
10969
10997
|
labels,
|
|
@@ -11722,6 +11750,10 @@ chartJsExtensionRegistry.add("chartBackgroundPlugin", {
|
|
|
11722
11750
|
register: (Chart) => Chart.register(chartBackgroundPlugin),
|
|
11723
11751
|
unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
|
|
11724
11752
|
});
|
|
11753
|
+
chartJsExtensionRegistry.add("geoProjectionPlugin", {
|
|
11754
|
+
register: (Chart) => Chart.register(geoProjectionPlugin),
|
|
11755
|
+
unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
|
|
11756
|
+
});
|
|
11725
11757
|
var ChartJsComponent = class extends Component {
|
|
11726
11758
|
static template = "o-spreadsheet-ChartJsComponent";
|
|
11727
11759
|
props = (0, _odoo_owl.useProps)({
|
|
@@ -15571,7 +15603,7 @@ var FigureComponent = class extends Component {
|
|
|
15571
15603
|
figures.push({
|
|
15572
15604
|
sheetId,
|
|
15573
15605
|
figureId,
|
|
15574
|
-
...this.
|
|
15606
|
+
...this.positionInBoundary(sheetId, this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
|
|
15575
15607
|
});
|
|
15576
15608
|
}
|
|
15577
15609
|
this.env.model.dispatch("MOVE_FIGURES", { figures });
|
|
@@ -15591,21 +15623,23 @@ var FigureComponent = class extends Component {
|
|
|
15591
15623
|
break;
|
|
15592
15624
|
}
|
|
15593
15625
|
}
|
|
15594
|
-
|
|
15595
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
15626
|
+
positionInBoundary(sheetId, figure, key, shift) {
|
|
15596
15627
|
const shiftAmount = shift ? 1 : 5;
|
|
15597
|
-
let { col, row, offset } =
|
|
15628
|
+
let { col, row, offset } = figure;
|
|
15598
15629
|
offset = { ...offset };
|
|
15630
|
+
const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
|
|
15599
15631
|
switch (key) {
|
|
15600
15632
|
case "ArrowUp":
|
|
15601
15633
|
if (offset.y < shiftAmount) {
|
|
15602
15634
|
row--;
|
|
15635
|
+
while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
|
|
15603
15636
|
offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
|
|
15604
15637
|
} else offset.y -= shiftAmount;
|
|
15605
15638
|
break;
|
|
15606
15639
|
case "ArrowLeft":
|
|
15607
15640
|
if (offset.x < shiftAmount) {
|
|
15608
15641
|
col--;
|
|
15642
|
+
while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
|
|
15609
15643
|
offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
|
|
15610
15644
|
} else offset.x -= shiftAmount;
|
|
15611
15645
|
break;
|
|
@@ -15613,6 +15647,7 @@ var FigureComponent = class extends Component {
|
|
|
15613
15647
|
const rowSize = this.env.model.getters.getRowSize(sheetId, row);
|
|
15614
15648
|
if (offset.y + shiftAmount >= rowSize) {
|
|
15615
15649
|
row++;
|
|
15650
|
+
while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
|
|
15616
15651
|
offset.y = offset.y + shiftAmount - rowSize;
|
|
15617
15652
|
} else offset.y += shiftAmount;
|
|
15618
15653
|
break;
|
|
@@ -15620,9 +15655,24 @@ var FigureComponent = class extends Component {
|
|
|
15620
15655
|
const colSize = this.env.model.getters.getColSize(sheetId, col);
|
|
15621
15656
|
if (offset.x + shiftAmount >= colSize) {
|
|
15622
15657
|
col++;
|
|
15658
|
+
while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
|
|
15623
15659
|
offset.x = offset.x + shiftAmount - colSize;
|
|
15624
15660
|
} else offset.x += shiftAmount;
|
|
15625
15661
|
}
|
|
15662
|
+
if (col < 0) {
|
|
15663
|
+
col = 0;
|
|
15664
|
+
offset.x = 0;
|
|
15665
|
+
} else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
|
|
15666
|
+
col = maxAnchor.col;
|
|
15667
|
+
offset.x = maxAnchor.offset.x;
|
|
15668
|
+
}
|
|
15669
|
+
if (row < 0) {
|
|
15670
|
+
row = 0;
|
|
15671
|
+
offset.y = 0;
|
|
15672
|
+
} else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
|
|
15673
|
+
row = maxAnchor.row;
|
|
15674
|
+
offset.y = maxAnchor.offset.y;
|
|
15675
|
+
}
|
|
15626
15676
|
return {
|
|
15627
15677
|
col,
|
|
15628
15678
|
row,
|
|
@@ -39315,13 +39365,9 @@ var PivotLayoutConfigurator = class extends Component {
|
|
|
39315
39365
|
dimensionsRef = (0, _odoo_owl.signal)(null);
|
|
39316
39366
|
dragAndDrop = useDragAndDropListItems();
|
|
39317
39367
|
AGGREGATORS = AGGREGATORS;
|
|
39318
|
-
composerFocus;
|
|
39319
39368
|
isDateOrDatetimeField = isDateOrDatetimeField;
|
|
39320
|
-
setup() {
|
|
39321
|
-
this.composerFocus = useStore(ComposerFocusStore);
|
|
39322
|
-
}
|
|
39323
39369
|
startDragAndDrop(dimension, event) {
|
|
39324
|
-
if (event.button !== 0 || event
|
|
39370
|
+
if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
|
|
39325
39371
|
const rects = this.getDimensionElementsRects();
|
|
39326
39372
|
const { columns, rows } = this.props.definition;
|
|
39327
39373
|
const draggableIds = [
|
|
@@ -39361,7 +39407,7 @@ var PivotLayoutConfigurator = class extends Component {
|
|
|
39361
39407
|
return field.type === "date" ? this.props.dateGranularities : this.props.datetimeGranularities;
|
|
39362
39408
|
}
|
|
39363
39409
|
startDragAndDropMeasures(measure, event) {
|
|
39364
|
-
if (event.button !== 0 || event
|
|
39410
|
+
if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
|
|
39365
39411
|
const rects = this.getDimensionElementsRects();
|
|
39366
39412
|
const { measures, columns, rows } = this.props.definition;
|
|
39367
39413
|
const draggableIds = measures.map((m) => m.id);
|
|
@@ -46012,7 +46058,13 @@ var CellComposerStore = class extends AbstractComposerStore {
|
|
|
46012
46058
|
const cell = this.getters.getEvaluatedCell(position);
|
|
46013
46059
|
if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
|
|
46014
46060
|
const currentFormat = this.getters.getCell(position)?.format;
|
|
46015
|
-
const
|
|
46061
|
+
const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
|
|
46062
|
+
const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
|
|
46063
|
+
let afterFormat;
|
|
46064
|
+
if (currentFormat !== "@") {
|
|
46065
|
+
if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
|
|
46066
|
+
else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
|
|
46067
|
+
}
|
|
46016
46068
|
this.addHeadersForSpreadingFormula(content);
|
|
46017
46069
|
result = this.model.dispatch("UPDATE_CELL", {
|
|
46018
46070
|
...this.currentEditedCell,
|
|
@@ -51719,7 +51771,7 @@ var CellPlugin = class extends CorePlugin {
|
|
|
51719
51771
|
positionsByStyle[styleId] ??= [];
|
|
51720
51772
|
positionsByStyle[styleId].push(position);
|
|
51721
51773
|
}
|
|
51722
|
-
if (cell.format) {
|
|
51774
|
+
if (cell.format !== void 0) {
|
|
51723
51775
|
const formatId = getItemId(cell.format, formats);
|
|
51724
51776
|
positionsByFormat[formatId] ??= [];
|
|
51725
51777
|
positionsByFormat[formatId].push(position);
|
|
@@ -52896,22 +52948,19 @@ var DefaultPlugin = class extends CorePlugin {
|
|
|
52896
52948
|
getDefaultFormatInCell(sheetId, zones, priorities) {
|
|
52897
52949
|
const defaults = [];
|
|
52898
52950
|
for (const position of zones.flatMap((zone) => cellPositions(sheetId, zone))) {
|
|
52899
|
-
if (this.getters.getCell(position)?.format) continue;
|
|
52951
|
+
if (this.getters.getCell(position)?.format !== void 0) continue;
|
|
52900
52952
|
const rowDefault = this.format[sheetId]?.rowDefault?.[position.row];
|
|
52901
|
-
if (rowDefault) {
|
|
52953
|
+
if (rowDefault !== void 0) {
|
|
52902
52954
|
if (priorities.shouldUseDefaultRow) defaults.push([position, rowDefault]);
|
|
52903
52955
|
continue;
|
|
52904
52956
|
}
|
|
52905
52957
|
const colDefault = this.format[sheetId]?.colDefault?.[position.col];
|
|
52906
|
-
if (colDefault) {
|
|
52958
|
+
if (colDefault !== void 0) {
|
|
52907
52959
|
if (priorities.shouldUseDefaultCol) defaults.push([position, colDefault]);
|
|
52908
52960
|
continue;
|
|
52909
52961
|
}
|
|
52910
|
-
const sheetDefault = this.format[sheetId]?.sheetDefault;
|
|
52911
|
-
if (sheetDefault)
|
|
52912
|
-
if (priorities.shouldUseDefaultSheet) defaults.push([position, sheetDefault]);
|
|
52913
|
-
continue;
|
|
52914
|
-
}
|
|
52962
|
+
const sheetDefault = this.format[sheetId]?.sheetDefault ?? "";
|
|
52963
|
+
if (priorities.shouldUseDefaultSheet) defaults.push([position, sheetDefault]);
|
|
52915
52964
|
}
|
|
52916
52965
|
return defaults;
|
|
52917
52966
|
}
|
|
@@ -64504,7 +64553,7 @@ var SheetUIPlugin = class extends UIPlugin {
|
|
|
64504
64553
|
if (contentWidth === 0) return 0;
|
|
64505
64554
|
contentWidth += 2 * 4;
|
|
64506
64555
|
if (style.wrapping === "wrap") {
|
|
64507
|
-
const colWidth = this.getters.getColSize(
|
|
64556
|
+
const colWidth = this.getters.getColSize(position.sheetId, position.col);
|
|
64508
64557
|
return Math.min(colWidth, contentWidth);
|
|
64509
64558
|
}
|
|
64510
64559
|
return contentWidth;
|
|
@@ -67870,6 +67919,10 @@ function inverseCreateFigure(cmd) {
|
|
|
67870
67919
|
}
|
|
67871
67920
|
function inverseCreateChart(cmd) {
|
|
67872
67921
|
return [{
|
|
67922
|
+
type: "DELETE_CHART",
|
|
67923
|
+
chartId: cmd.chartId,
|
|
67924
|
+
sheetId: cmd.sheetId
|
|
67925
|
+
}, {
|
|
67873
67926
|
type: "DELETE_FIGURE",
|
|
67874
67927
|
figureId: cmd.figureId,
|
|
67875
67928
|
sheetId: cmd.sheetId
|
|
@@ -69747,6 +69800,7 @@ var SpreadsheetDashboard = class extends Component {
|
|
|
69747
69800
|
return (0, _odoo_owl.toRaw)(this.clickableCellsStore.clickableCells);
|
|
69748
69801
|
}
|
|
69749
69802
|
selectClickableCell(ev, clickableCell) {
|
|
69803
|
+
if (![0, 1].includes(ev.button)) return;
|
|
69750
69804
|
const { position, action } = clickableCell;
|
|
69751
69805
|
action(position, this.env, isMiddleClickOrCtrlClick(ev));
|
|
69752
69806
|
}
|
|
@@ -87705,7 +87759,8 @@ const components = {
|
|
|
87705
87759
|
FullScreenFigure,
|
|
87706
87760
|
NumberInput,
|
|
87707
87761
|
TopBar,
|
|
87708
|
-
Composer
|
|
87762
|
+
Composer,
|
|
87763
|
+
CarouselFigure
|
|
87709
87764
|
};
|
|
87710
87765
|
const hooks = {
|
|
87711
87766
|
useDragAndDropListItems,
|
|
@@ -87859,6 +87914,6 @@ exports.stores = stores;
|
|
|
87859
87914
|
exports.tokenColors = tokenColors;
|
|
87860
87915
|
exports.tokenize = tokenize;
|
|
87861
87916
|
|
|
87862
|
-
__info__.version = "19.4.
|
|
87863
|
-
__info__.date = "2026-
|
|
87864
|
-
__info__.hash = "
|
|
87917
|
+
__info__.version = "19.4.6";
|
|
87918
|
+
__info__.date = "2026-08-10T12:33:32.728Z";
|
|
87919
|
+
__info__.hash = "5c667fe";
|
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.6
|
|
6
|
+
* @date 2026-08-10T12:33:34.157Z
|
|
7
|
+
* @hash 5c667fe
|
|
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.6
|
|
6
|
+
* @date 2026-08-10T12:33:32.728Z
|
|
7
|
+
* @hash 5c667fe
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import * as owl from "@odoo/owl";
|
|
@@ -347,6 +347,19 @@ function isOtherMobileOS() {
|
|
|
347
347
|
function isMobileOS() {
|
|
348
348
|
return isAndroid() || isIOS() || isOtherMobileOS();
|
|
349
349
|
}
|
|
350
|
+
const INTERACTIVE_ELEMENT_SELECTOR = "select, input, textarea, button, .o-select, .os-input, .o-input, .o-button, .o-button-icon, .o-button-link, .o-composer";
|
|
351
|
+
/** Check if there is an interactive element (input, select, button, ...) between the event.target and event.currentTarget (inclusive)*/
|
|
352
|
+
function hasInteractiveElementInEventTree(event) {
|
|
353
|
+
const target = event.target;
|
|
354
|
+
const root = event.currentTarget;
|
|
355
|
+
if (!root || !target || !root.contains(target)) return false;
|
|
356
|
+
let node = target;
|
|
357
|
+
while (node && node !== root) {
|
|
358
|
+
if (node.matches(INTERACTIVE_ELEMENT_SELECTOR)) return true;
|
|
359
|
+
node = node.parentElement;
|
|
360
|
+
}
|
|
361
|
+
return root.matches(INTERACTIVE_ELEMENT_SELECTOR);
|
|
362
|
+
}
|
|
350
363
|
|
|
351
364
|
//#endregion
|
|
352
365
|
//#region src/actions/action.ts
|
|
@@ -8902,6 +8915,25 @@ const funnelTooltipPositioner = function(elements) {
|
|
|
8902
8915
|
};
|
|
8903
8916
|
};
|
|
8904
8917
|
|
|
8918
|
+
//#endregion
|
|
8919
|
+
//#region src/components/figures/chart/chartJs/chartjs_geo_projection_plugin.ts
|
|
8920
|
+
/**
|
|
8921
|
+
* ChartJS plugin to apply custom changes to a d3 projection.
|
|
8922
|
+
*
|
|
8923
|
+
* We pass the projection as a string instead of a customized d3 object so
|
|
8924
|
+
* Chart.js creates a fresh projection instance. Custom changes (e.g. rotation)
|
|
8925
|
+
* are then applied in `beforeUpdate`.
|
|
8926
|
+
*
|
|
8927
|
+
* This is important because Chart.js mutates the projection instance at runtime,
|
|
8928
|
+
* and a customize d3 projection object would not be copied during deepCopy.
|
|
8929
|
+
*/
|
|
8930
|
+
const geoProjectionPlugin = {
|
|
8931
|
+
id: "geoProjection",
|
|
8932
|
+
beforeUpdate(chart) {
|
|
8933
|
+
if (chart.options?.scales?.projection?.projection === "conicConformal") chart.scales?.projection?.projection?.rotate([100, 0]);
|
|
8934
|
+
}
|
|
8935
|
+
};
|
|
8936
|
+
|
|
8905
8937
|
//#endregion
|
|
8906
8938
|
//#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
|
|
8907
8939
|
const chartMinorGridPlugin = {
|
|
@@ -10705,7 +10737,7 @@ function getGeoChartScales(definition, args) {
|
|
|
10705
10737
|
const format = axisFormats?.y || axisFormats?.y1;
|
|
10706
10738
|
return {
|
|
10707
10739
|
projection: {
|
|
10708
|
-
projection:
|
|
10740
|
+
projection: region?.defaultProjection || "mercator",
|
|
10709
10741
|
axis: "x"
|
|
10710
10742
|
},
|
|
10711
10743
|
color: {
|
|
@@ -10757,10 +10789,6 @@ function getFunnelChartScales(definition, args) {
|
|
|
10757
10789
|
}
|
|
10758
10790
|
};
|
|
10759
10791
|
}
|
|
10760
|
-
function getGeoChartProjection(projection) {
|
|
10761
|
-
if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
|
|
10762
|
-
return projection;
|
|
10763
|
-
}
|
|
10764
10792
|
function getChartAxisTitleRuntime(design) {
|
|
10765
10793
|
if (design?.title?.text) {
|
|
10766
10794
|
const { text, color, align, italic, bold } = design.title;
|
|
@@ -10962,7 +10990,7 @@ function getCalendarChartDatasetAndLabels(definition, args) {
|
|
|
10962
10990
|
borderWidth: 1,
|
|
10963
10991
|
barPercentage: 1,
|
|
10964
10992
|
categoryPercentage: 1,
|
|
10965
|
-
values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value :
|
|
10993
|
+
values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : void 0)
|
|
10966
10994
|
});
|
|
10967
10995
|
return {
|
|
10968
10996
|
labels,
|
|
@@ -11721,6 +11749,10 @@ chartJsExtensionRegistry.add("chartBackgroundPlugin", {
|
|
|
11721
11749
|
register: (Chart) => Chart.register(chartBackgroundPlugin),
|
|
11722
11750
|
unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
|
|
11723
11751
|
});
|
|
11752
|
+
chartJsExtensionRegistry.add("geoProjectionPlugin", {
|
|
11753
|
+
register: (Chart) => Chart.register(geoProjectionPlugin),
|
|
11754
|
+
unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
|
|
11755
|
+
});
|
|
11724
11756
|
var ChartJsComponent = class extends Component {
|
|
11725
11757
|
static template = "o-spreadsheet-ChartJsComponent";
|
|
11726
11758
|
props = useProps({
|
|
@@ -15570,7 +15602,7 @@ var FigureComponent = class extends Component {
|
|
|
15570
15602
|
figures.push({
|
|
15571
15603
|
sheetId,
|
|
15572
15604
|
figureId,
|
|
15573
|
-
...this.
|
|
15605
|
+
...this.positionInBoundary(sheetId, this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
|
|
15574
15606
|
});
|
|
15575
15607
|
}
|
|
15576
15608
|
this.env.model.dispatch("MOVE_FIGURES", { figures });
|
|
@@ -15590,21 +15622,23 @@ var FigureComponent = class extends Component {
|
|
|
15590
15622
|
break;
|
|
15591
15623
|
}
|
|
15592
15624
|
}
|
|
15593
|
-
|
|
15594
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
15625
|
+
positionInBoundary(sheetId, figure, key, shift) {
|
|
15595
15626
|
const shiftAmount = shift ? 1 : 5;
|
|
15596
|
-
let { col, row, offset } =
|
|
15627
|
+
let { col, row, offset } = figure;
|
|
15597
15628
|
offset = { ...offset };
|
|
15629
|
+
const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
|
|
15598
15630
|
switch (key) {
|
|
15599
15631
|
case "ArrowUp":
|
|
15600
15632
|
if (offset.y < shiftAmount) {
|
|
15601
15633
|
row--;
|
|
15634
|
+
while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
|
|
15602
15635
|
offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
|
|
15603
15636
|
} else offset.y -= shiftAmount;
|
|
15604
15637
|
break;
|
|
15605
15638
|
case "ArrowLeft":
|
|
15606
15639
|
if (offset.x < shiftAmount) {
|
|
15607
15640
|
col--;
|
|
15641
|
+
while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
|
|
15608
15642
|
offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
|
|
15609
15643
|
} else offset.x -= shiftAmount;
|
|
15610
15644
|
break;
|
|
@@ -15612,6 +15646,7 @@ var FigureComponent = class extends Component {
|
|
|
15612
15646
|
const rowSize = this.env.model.getters.getRowSize(sheetId, row);
|
|
15613
15647
|
if (offset.y + shiftAmount >= rowSize) {
|
|
15614
15648
|
row++;
|
|
15649
|
+
while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
|
|
15615
15650
|
offset.y = offset.y + shiftAmount - rowSize;
|
|
15616
15651
|
} else offset.y += shiftAmount;
|
|
15617
15652
|
break;
|
|
@@ -15619,9 +15654,24 @@ var FigureComponent = class extends Component {
|
|
|
15619
15654
|
const colSize = this.env.model.getters.getColSize(sheetId, col);
|
|
15620
15655
|
if (offset.x + shiftAmount >= colSize) {
|
|
15621
15656
|
col++;
|
|
15657
|
+
while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
|
|
15622
15658
|
offset.x = offset.x + shiftAmount - colSize;
|
|
15623
15659
|
} else offset.x += shiftAmount;
|
|
15624
15660
|
}
|
|
15661
|
+
if (col < 0) {
|
|
15662
|
+
col = 0;
|
|
15663
|
+
offset.x = 0;
|
|
15664
|
+
} else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
|
|
15665
|
+
col = maxAnchor.col;
|
|
15666
|
+
offset.x = maxAnchor.offset.x;
|
|
15667
|
+
}
|
|
15668
|
+
if (row < 0) {
|
|
15669
|
+
row = 0;
|
|
15670
|
+
offset.y = 0;
|
|
15671
|
+
} else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
|
|
15672
|
+
row = maxAnchor.row;
|
|
15673
|
+
offset.y = maxAnchor.offset.y;
|
|
15674
|
+
}
|
|
15625
15675
|
return {
|
|
15626
15676
|
col,
|
|
15627
15677
|
row,
|
|
@@ -39314,13 +39364,9 @@ var PivotLayoutConfigurator = class extends Component {
|
|
|
39314
39364
|
dimensionsRef = signal(null);
|
|
39315
39365
|
dragAndDrop = useDragAndDropListItems();
|
|
39316
39366
|
AGGREGATORS = AGGREGATORS;
|
|
39317
|
-
composerFocus;
|
|
39318
39367
|
isDateOrDatetimeField = isDateOrDatetimeField;
|
|
39319
|
-
setup() {
|
|
39320
|
-
this.composerFocus = useStore(ComposerFocusStore);
|
|
39321
|
-
}
|
|
39322
39368
|
startDragAndDrop(dimension, event) {
|
|
39323
|
-
if (event.button !== 0 || event
|
|
39369
|
+
if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
|
|
39324
39370
|
const rects = this.getDimensionElementsRects();
|
|
39325
39371
|
const { columns, rows } = this.props.definition;
|
|
39326
39372
|
const draggableIds = [
|
|
@@ -39360,7 +39406,7 @@ var PivotLayoutConfigurator = class extends Component {
|
|
|
39360
39406
|
return field.type === "date" ? this.props.dateGranularities : this.props.datetimeGranularities;
|
|
39361
39407
|
}
|
|
39362
39408
|
startDragAndDropMeasures(measure, event) {
|
|
39363
|
-
if (event.button !== 0 || event
|
|
39409
|
+
if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
|
|
39364
39410
|
const rects = this.getDimensionElementsRects();
|
|
39365
39411
|
const { measures, columns, rows } = this.props.definition;
|
|
39366
39412
|
const draggableIds = measures.map((m) => m.id);
|
|
@@ -46011,7 +46057,13 @@ var CellComposerStore = class extends AbstractComposerStore {
|
|
|
46011
46057
|
const cell = this.getters.getEvaluatedCell(position);
|
|
46012
46058
|
if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
|
|
46013
46059
|
const currentFormat = this.getters.getCell(position)?.format;
|
|
46014
|
-
const
|
|
46060
|
+
const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
|
|
46061
|
+
const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
|
|
46062
|
+
let afterFormat;
|
|
46063
|
+
if (currentFormat !== "@") {
|
|
46064
|
+
if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
|
|
46065
|
+
else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
|
|
46066
|
+
}
|
|
46015
46067
|
this.addHeadersForSpreadingFormula(content);
|
|
46016
46068
|
result = this.model.dispatch("UPDATE_CELL", {
|
|
46017
46069
|
...this.currentEditedCell,
|
|
@@ -51718,7 +51770,7 @@ var CellPlugin = class extends CorePlugin {
|
|
|
51718
51770
|
positionsByStyle[styleId] ??= [];
|
|
51719
51771
|
positionsByStyle[styleId].push(position);
|
|
51720
51772
|
}
|
|
51721
|
-
if (cell.format) {
|
|
51773
|
+
if (cell.format !== void 0) {
|
|
51722
51774
|
const formatId = getItemId(cell.format, formats);
|
|
51723
51775
|
positionsByFormat[formatId] ??= [];
|
|
51724
51776
|
positionsByFormat[formatId].push(position);
|
|
@@ -52895,22 +52947,19 @@ var DefaultPlugin = class extends CorePlugin {
|
|
|
52895
52947
|
getDefaultFormatInCell(sheetId, zones, priorities) {
|
|
52896
52948
|
const defaults = [];
|
|
52897
52949
|
for (const position of zones.flatMap((zone) => cellPositions(sheetId, zone))) {
|
|
52898
|
-
if (this.getters.getCell(position)?.format) continue;
|
|
52950
|
+
if (this.getters.getCell(position)?.format !== void 0) continue;
|
|
52899
52951
|
const rowDefault = this.format[sheetId]?.rowDefault?.[position.row];
|
|
52900
|
-
if (rowDefault) {
|
|
52952
|
+
if (rowDefault !== void 0) {
|
|
52901
52953
|
if (priorities.shouldUseDefaultRow) defaults.push([position, rowDefault]);
|
|
52902
52954
|
continue;
|
|
52903
52955
|
}
|
|
52904
52956
|
const colDefault = this.format[sheetId]?.colDefault?.[position.col];
|
|
52905
|
-
if (colDefault) {
|
|
52957
|
+
if (colDefault !== void 0) {
|
|
52906
52958
|
if (priorities.shouldUseDefaultCol) defaults.push([position, colDefault]);
|
|
52907
52959
|
continue;
|
|
52908
52960
|
}
|
|
52909
|
-
const sheetDefault = this.format[sheetId]?.sheetDefault;
|
|
52910
|
-
if (sheetDefault)
|
|
52911
|
-
if (priorities.shouldUseDefaultSheet) defaults.push([position, sheetDefault]);
|
|
52912
|
-
continue;
|
|
52913
|
-
}
|
|
52961
|
+
const sheetDefault = this.format[sheetId]?.sheetDefault ?? "";
|
|
52962
|
+
if (priorities.shouldUseDefaultSheet) defaults.push([position, sheetDefault]);
|
|
52914
52963
|
}
|
|
52915
52964
|
return defaults;
|
|
52916
52965
|
}
|
|
@@ -64319,7 +64368,7 @@ var SheetUIPlugin = class extends UIPlugin {
|
|
|
64319
64368
|
if (contentWidth === 0) return 0;
|
|
64320
64369
|
contentWidth += 2 * 4;
|
|
64321
64370
|
if (style.wrapping === "wrap") {
|
|
64322
|
-
const colWidth = this.getters.getColSize(
|
|
64371
|
+
const colWidth = this.getters.getColSize(position.sheetId, position.col);
|
|
64323
64372
|
return Math.min(colWidth, contentWidth);
|
|
64324
64373
|
}
|
|
64325
64374
|
return contentWidth;
|
|
@@ -67685,6 +67734,10 @@ function inverseCreateFigure(cmd) {
|
|
|
67685
67734
|
}
|
|
67686
67735
|
function inverseCreateChart(cmd) {
|
|
67687
67736
|
return [{
|
|
67737
|
+
type: "DELETE_CHART",
|
|
67738
|
+
chartId: cmd.chartId,
|
|
67739
|
+
sheetId: cmd.sheetId
|
|
67740
|
+
}, {
|
|
67688
67741
|
type: "DELETE_FIGURE",
|
|
67689
67742
|
figureId: cmd.figureId,
|
|
67690
67743
|
sheetId: cmd.sheetId
|
|
@@ -69562,6 +69615,7 @@ var SpreadsheetDashboard = class extends Component {
|
|
|
69562
69615
|
return toRaw(this.clickableCellsStore.clickableCells);
|
|
69563
69616
|
}
|
|
69564
69617
|
selectClickableCell(ev, clickableCell) {
|
|
69618
|
+
if (![0, 1].includes(ev.button)) return;
|
|
69565
69619
|
const { position, action } = clickableCell;
|
|
69566
69620
|
action(position, this.env, isMiddleClickOrCtrlClick(ev));
|
|
69567
69621
|
}
|
|
@@ -87520,7 +87574,8 @@ const components = {
|
|
|
87520
87574
|
FullScreenFigure,
|
|
87521
87575
|
NumberInput,
|
|
87522
87576
|
TopBar,
|
|
87523
|
-
Composer
|
|
87577
|
+
Composer,
|
|
87578
|
+
CarouselFigure
|
|
87524
87579
|
};
|
|
87525
87580
|
const hooks = {
|
|
87526
87581
|
useDragAndDropListItems,
|
|
@@ -87580,6 +87635,6 @@ const chartHelpers = {
|
|
|
87580
87635
|
//#endregion
|
|
87581
87636
|
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 };
|
|
87582
87637
|
|
|
87583
|
-
__info__.version = "19.4.
|
|
87584
|
-
__info__.date = "2026-
|
|
87585
|
-
__info__.hash = "
|
|
87638
|
+
__info__.version = "19.4.6";
|
|
87639
|
+
__info__.date = "2026-08-10T12:33:32.728Z";
|
|
87640
|
+
__info__.hash = "5c667fe";
|