@odoo/o-spreadsheet 16.0.31 → 16.0.33
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 +186 -114
- package/dist/o-spreadsheet.d.ts +64 -48
- package/dist/o-spreadsheet.esm.js +186 -114
- package/dist/o-spreadsheet.iife.js +186 -114
- package/dist/o-spreadsheet.iife.min.js +80 -80
- package/dist/o_spreadsheet.xml +13 -31
- package/package.json +1 -1
|
@@ -203,7 +203,7 @@ const TOPBAR_HEIGHT = 63;
|
|
|
203
203
|
const BOTTOMBAR_HEIGHT = 36;
|
|
204
204
|
const DEFAULT_CELL_WIDTH = 96;
|
|
205
205
|
const DEFAULT_CELL_HEIGHT = 23;
|
|
206
|
-
const SCROLLBAR_WIDTH
|
|
206
|
+
const SCROLLBAR_WIDTH = 15;
|
|
207
207
|
const AUTOFILL_EDGE_LENGTH = 8;
|
|
208
208
|
const ICON_EDGE_LENGTH = 18;
|
|
209
209
|
const UNHIDE_ICON_EDGE_LENGTH = 14;
|
|
@@ -4074,7 +4074,7 @@ class Popover extends Component {
|
|
|
4074
4074
|
this.spreadsheetPosition = useSpreadsheetPosition();
|
|
4075
4075
|
}
|
|
4076
4076
|
get maxHeight() {
|
|
4077
|
-
return Math.max(0, this.viewportDimension.height - BOTTOMBAR_HEIGHT - SCROLLBAR_WIDTH
|
|
4077
|
+
return Math.max(0, this.viewportDimension.height - BOTTOMBAR_HEIGHT - SCROLLBAR_WIDTH);
|
|
4078
4078
|
}
|
|
4079
4079
|
get style() {
|
|
4080
4080
|
// the props's position is expressed relative to the "body" element
|
|
@@ -19520,9 +19520,6 @@ class EditionPlugin extends UIPlugin {
|
|
|
19520
19520
|
break;
|
|
19521
19521
|
}
|
|
19522
19522
|
}
|
|
19523
|
-
unsubscribe() {
|
|
19524
|
-
this.mode = "inactive";
|
|
19525
|
-
}
|
|
19526
19523
|
// ---------------------------------------------------------------------------
|
|
19527
19524
|
// Getters
|
|
19528
19525
|
// ---------------------------------------------------------------------------
|
|
@@ -20423,13 +20420,12 @@ class Composer extends Component {
|
|
|
20423
20420
|
setup() {
|
|
20424
20421
|
onMounted(() => {
|
|
20425
20422
|
const el = this.composerRef.el;
|
|
20423
|
+
if (this.props.isDefaultFocus) {
|
|
20424
|
+
this.env.focusableElement.setFocusableElement(el);
|
|
20425
|
+
}
|
|
20426
20426
|
this.contentHelper.updateEl(el);
|
|
20427
20427
|
this.processContent();
|
|
20428
20428
|
});
|
|
20429
|
-
onWillUnmount(() => {
|
|
20430
|
-
var _a, _b;
|
|
20431
|
-
(_b = (_a = this.props).onComposerUnmounted) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
20432
|
-
});
|
|
20433
20429
|
onPatched(() => {
|
|
20434
20430
|
if (!this.isKeyStillDown) {
|
|
20435
20431
|
this.processContent();
|
|
@@ -20440,7 +20436,8 @@ class Composer extends Component {
|
|
|
20440
20436
|
// Handlers
|
|
20441
20437
|
// ---------------------------------------------------------------------------
|
|
20442
20438
|
processArrowKeys(ev) {
|
|
20443
|
-
if (this.env.model.getters.isSelectingForComposer()
|
|
20439
|
+
if (this.env.model.getters.isSelectingForComposer() ||
|
|
20440
|
+
this.env.model.getters.getEditionMode() === "inactive") {
|
|
20444
20441
|
this.functionDescriptionState.showDescription = false;
|
|
20445
20442
|
// Prevent the default content editable behavior which moves the cursor
|
|
20446
20443
|
// but don't stop the event and let it bubble to the grid which will
|
|
@@ -20473,21 +20470,23 @@ class Composer extends Component {
|
|
|
20473
20470
|
processTabKey(ev) {
|
|
20474
20471
|
ev.preventDefault();
|
|
20475
20472
|
ev.stopPropagation();
|
|
20476
|
-
if (this.
|
|
20477
|
-
|
|
20478
|
-
|
|
20479
|
-
|
|
20480
|
-
|
|
20473
|
+
if (this.env.model.getters.getEditionMode() !== "inactive") {
|
|
20474
|
+
if (this.autoCompleteState.showProvider && this.autocompleteAPI) {
|
|
20475
|
+
const autoCompleteValue = this.autocompleteAPI.getValueToFill();
|
|
20476
|
+
if (autoCompleteValue) {
|
|
20477
|
+
this.autoComplete(autoCompleteValue);
|
|
20478
|
+
return;
|
|
20479
|
+
}
|
|
20481
20480
|
}
|
|
20482
|
-
|
|
20483
|
-
|
|
20484
|
-
|
|
20485
|
-
|
|
20486
|
-
|
|
20487
|
-
|
|
20481
|
+
else {
|
|
20482
|
+
// when completing with tab, if there is no value to complete, the active cell will be moved to the right.
|
|
20483
|
+
// we can't let the model think that it is for a ref selection.
|
|
20484
|
+
// todo: check if this can be removed someday
|
|
20485
|
+
this.env.model.dispatch("STOP_COMPOSER_RANGE_SELECTION");
|
|
20486
|
+
}
|
|
20487
|
+
this.env.model.dispatch("STOP_EDITION");
|
|
20488
20488
|
}
|
|
20489
20489
|
const direction = ev.shiftKey ? "left" : "right";
|
|
20490
|
-
this.env.model.dispatch("STOP_EDITION");
|
|
20491
20490
|
this.env.model.selection.moveAnchorCell(direction, 1);
|
|
20492
20491
|
}
|
|
20493
20492
|
processEnterKey(ev) {
|
|
@@ -20519,6 +20518,9 @@ class Composer extends Component {
|
|
|
20519
20518
|
this.compositionActive = false;
|
|
20520
20519
|
}
|
|
20521
20520
|
onKeydown(ev) {
|
|
20521
|
+
if (this.env.model.getters.getEditionMode() === "inactive") {
|
|
20522
|
+
return;
|
|
20523
|
+
}
|
|
20522
20524
|
let handler = this.keyMapping[ev.key];
|
|
20523
20525
|
if (handler) {
|
|
20524
20526
|
handler.call(this, ev);
|
|
@@ -20529,23 +20531,46 @@ class Composer extends Component {
|
|
|
20529
20531
|
}
|
|
20530
20532
|
}
|
|
20531
20533
|
updateCursorIfNeeded() {
|
|
20532
|
-
|
|
20534
|
+
const moveCursor = !this.env.model.getters.isSelectingForComposer() &&
|
|
20535
|
+
!(this.env.model.getters.getEditionMode() === "inactive");
|
|
20536
|
+
if (moveCursor) {
|
|
20533
20537
|
const { start, end } = this.contentHelper.getCurrentSelection();
|
|
20534
20538
|
this.env.model.dispatch("CHANGE_COMPOSER_CURSOR_SELECTION", { start, end });
|
|
20535
20539
|
this.isKeyStillDown = true;
|
|
20536
20540
|
}
|
|
20537
20541
|
}
|
|
20542
|
+
onPaste(ev) {
|
|
20543
|
+
if (this.env.model.getters.getEditionMode() !== "inactive") {
|
|
20544
|
+
ev.stopPropagation();
|
|
20545
|
+
}
|
|
20546
|
+
}
|
|
20538
20547
|
/*
|
|
20539
20548
|
* Triggered automatically by the content-editable between the keydown and key up
|
|
20540
20549
|
* */
|
|
20541
|
-
onInput() {
|
|
20542
|
-
|
|
20550
|
+
onInput(ev) {
|
|
20551
|
+
var _a, _b;
|
|
20552
|
+
if (!this.shouldProcessInputEvents) {
|
|
20553
|
+
return;
|
|
20554
|
+
}
|
|
20555
|
+
if (ev.inputType === "insertFromPaste" &&
|
|
20556
|
+
this.env.model.getters.getEditionMode() === "inactive") {
|
|
20543
20557
|
return;
|
|
20544
20558
|
}
|
|
20559
|
+
ev.stopPropagation();
|
|
20560
|
+
let content;
|
|
20561
|
+
if (this.env.model.getters.getEditionMode() === "inactive") {
|
|
20562
|
+
content = ev.data || "";
|
|
20563
|
+
}
|
|
20564
|
+
else {
|
|
20565
|
+
const el = this.composerRef.el;
|
|
20566
|
+
content = el.childNodes.length ? el.textContent : "";
|
|
20567
|
+
}
|
|
20568
|
+
if (this.props.focus === "inactive") {
|
|
20569
|
+
return (_b = (_a = this.props).onComposerCellFocused) === null || _b === void 0 ? void 0 : _b.call(_a, content);
|
|
20570
|
+
}
|
|
20545
20571
|
this.env.model.dispatch("STOP_COMPOSER_RANGE_SELECTION");
|
|
20546
|
-
const el = this.composerRef.el;
|
|
20547
20572
|
this.env.model.dispatch("SET_CURRENT_CONTENT", {
|
|
20548
|
-
content
|
|
20573
|
+
content,
|
|
20549
20574
|
selection: this.contentHelper.getCurrentSelection(),
|
|
20550
20575
|
});
|
|
20551
20576
|
}
|
|
@@ -20592,9 +20617,8 @@ class Composer extends Component {
|
|
|
20592
20617
|
}
|
|
20593
20618
|
const newSelection = this.contentHelper.getCurrentSelection();
|
|
20594
20619
|
this.env.model.dispatch("STOP_COMPOSER_RANGE_SELECTION");
|
|
20595
|
-
|
|
20596
|
-
|
|
20597
|
-
}
|
|
20620
|
+
this.props.onComposerContentFocused();
|
|
20621
|
+
if (this.props.focus === "inactive") ;
|
|
20598
20622
|
this.env.model.dispatch("CHANGE_COMPOSER_CURSOR_SELECTION", newSelection);
|
|
20599
20623
|
this.processTokenAtCursor();
|
|
20600
20624
|
}
|
|
@@ -20614,6 +20638,7 @@ class Composer extends Component {
|
|
|
20614
20638
|
this.contentHelper.removeAll(); // removes the content of the composer, to be added just after
|
|
20615
20639
|
this.shouldProcessInputEvents = false;
|
|
20616
20640
|
if (this.props.focus !== "inactive") {
|
|
20641
|
+
this.contentHelper.el.focus();
|
|
20617
20642
|
this.contentHelper.selectRange(0, 0); // move the cursor inside the composer at 0 0.
|
|
20618
20643
|
}
|
|
20619
20644
|
const content = this.getContent();
|
|
@@ -20782,10 +20807,9 @@ Composer.components = { TextValueProvider, FunctionDescriptionProvider };
|
|
|
20782
20807
|
Composer.defaultProps = {
|
|
20783
20808
|
inputStyle: "",
|
|
20784
20809
|
focus: "inactive",
|
|
20810
|
+
isDefaultFocus: false,
|
|
20785
20811
|
};
|
|
20786
20812
|
|
|
20787
|
-
const SCROLLBAR_WIDTH = 14;
|
|
20788
|
-
const SCROLLBAR_HIGHT = 15;
|
|
20789
20813
|
const COMPOSER_BORDER_WIDTH = 3 * 0.4 * window.devicePixelRatio || 1;
|
|
20790
20814
|
css /* scss */ `
|
|
20791
20815
|
div.o-grid-composer {
|
|
@@ -20800,40 +20824,52 @@ css /* scss */ `
|
|
|
20800
20824
|
* It also applies the style of the cell to the composer input.
|
|
20801
20825
|
*/
|
|
20802
20826
|
class GridComposer extends Component {
|
|
20827
|
+
constructor() {
|
|
20828
|
+
super(...arguments);
|
|
20829
|
+
this.rect = undefined;
|
|
20830
|
+
this.isEditing = false;
|
|
20831
|
+
}
|
|
20832
|
+
get defaultRect() {
|
|
20833
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
20834
|
+
}
|
|
20803
20835
|
setup() {
|
|
20804
|
-
|
|
20805
|
-
|
|
20806
|
-
|
|
20807
|
-
|
|
20808
|
-
|
|
20809
|
-
|
|
20810
|
-
|
|
20811
|
-
|
|
20812
|
-
|
|
20813
|
-
|
|
20814
|
-
|
|
20815
|
-
|
|
20816
|
-
|
|
20817
|
-
onMounted(() => {
|
|
20818
|
-
const el = this.gridComposerRef.el;
|
|
20819
|
-
//TODO Should be more correct to have a props that give the parent's clientHeight and clientWidth
|
|
20820
|
-
const maxHeight = el.parentElement.clientHeight - this.rect.y - SCROLLBAR_HIGHT;
|
|
20821
|
-
el.style.maxHeight = (maxHeight + "px");
|
|
20822
|
-
const maxWidth = el.parentElement.clientWidth - this.rect.x - SCROLLBAR_WIDTH;
|
|
20823
|
-
el.style.maxWidth = (maxWidth + "px");
|
|
20824
|
-
this.composerState.rect = {
|
|
20825
|
-
x: this.rect.x,
|
|
20826
|
-
y: this.rect.y,
|
|
20827
|
-
width: el.clientWidth,
|
|
20828
|
-
height: el.clientHeight,
|
|
20829
|
-
};
|
|
20830
|
-
this.composerState.delimitation = {
|
|
20831
|
-
width: el.parentElement.clientWidth,
|
|
20832
|
-
height: el.parentElement.clientHeight,
|
|
20833
|
-
};
|
|
20836
|
+
onWillUpdateProps(() => {
|
|
20837
|
+
const isEditing = this.env.model.getters.getEditionMode() !== "inactive";
|
|
20838
|
+
if (this.isEditing !== isEditing) {
|
|
20839
|
+
this.isEditing = isEditing;
|
|
20840
|
+
if (!isEditing) {
|
|
20841
|
+
this.rect = undefined;
|
|
20842
|
+
this.env.focusableElement.focus();
|
|
20843
|
+
return;
|
|
20844
|
+
}
|
|
20845
|
+
const position = this.env.model.getters.getPosition();
|
|
20846
|
+
const zone = this.env.model.getters.expandZone(this.env.model.getters.getActiveSheetId(), positionToZone(position));
|
|
20847
|
+
this.rect = this.env.model.getters.getVisibleRect(zone);
|
|
20848
|
+
}
|
|
20834
20849
|
});
|
|
20835
20850
|
}
|
|
20851
|
+
get composerProps() {
|
|
20852
|
+
const { width, height } = this.env.model.getters.getSheetViewDimensionWithHeaders();
|
|
20853
|
+
return {
|
|
20854
|
+
rect: this.rect && { ...this.rect },
|
|
20855
|
+
delimitation: {
|
|
20856
|
+
width,
|
|
20857
|
+
height,
|
|
20858
|
+
},
|
|
20859
|
+
inputStyle: this.composerStyle,
|
|
20860
|
+
focus: this.props.focus,
|
|
20861
|
+
isDefaultFocus: true,
|
|
20862
|
+
onComposerContentFocused: this.props.onComposerContentFocused,
|
|
20863
|
+
onComposerCellFocused: this.props.onComposerCellFocused,
|
|
20864
|
+
};
|
|
20865
|
+
}
|
|
20836
20866
|
get containerStyle() {
|
|
20867
|
+
if (this.env.model.getters.getEditionMode() === "inactive" || !this.rect) {
|
|
20868
|
+
return `
|
|
20869
|
+
position: absolute;
|
|
20870
|
+
z-index: -1000;
|
|
20871
|
+
`;
|
|
20872
|
+
}
|
|
20837
20873
|
const isFormula = this.env.model.getters.getCurrentContent().startsWith("=");
|
|
20838
20874
|
const cell = this.env.model.getters.getActiveCell();
|
|
20839
20875
|
let style = {};
|
|
@@ -20856,12 +20892,18 @@ class GridComposer extends Component {
|
|
|
20856
20892
|
if (!isFormula) {
|
|
20857
20893
|
textAlign = style.align || (cell === null || cell === void 0 ? void 0 : cell.defaultAlign) || "left";
|
|
20858
20894
|
}
|
|
20895
|
+
const sheetDimensions = this.env.model.getters.getSheetViewDimensionWithHeaders();
|
|
20896
|
+
const maxWidth = sheetDimensions.width - this.rect.x;
|
|
20897
|
+
const maxHeight = sheetDimensions.height - this.rect.y;
|
|
20859
20898
|
return `
|
|
20860
20899
|
left: ${left - 1}px;
|
|
20861
20900
|
top: ${top}px;
|
|
20862
20901
|
min-width: ${width + 2}px;
|
|
20863
20902
|
min-height: ${height + 1}px;
|
|
20864
20903
|
|
|
20904
|
+
max-width: ${maxWidth}px;
|
|
20905
|
+
max-height: ${maxHeight}px;
|
|
20906
|
+
|
|
20865
20907
|
background: ${background};
|
|
20866
20908
|
color: ${color};
|
|
20867
20909
|
|
|
@@ -22498,8 +22540,8 @@ css /* scss */ `
|
|
|
22498
22540
|
&.corner {
|
|
22499
22541
|
right: 0px;
|
|
22500
22542
|
bottom: 0px;
|
|
22501
|
-
height: ${SCROLLBAR_WIDTH
|
|
22502
|
-
width: ${SCROLLBAR_WIDTH
|
|
22543
|
+
height: ${SCROLLBAR_WIDTH}px;
|
|
22544
|
+
width: ${SCROLLBAR_WIDTH}px;
|
|
22503
22545
|
border-top: 1px solid #e2e3e3;
|
|
22504
22546
|
border-left: 1px solid #e2e3e3;
|
|
22505
22547
|
}
|
|
@@ -22564,7 +22606,7 @@ class HorizontalScrollBar extends Component {
|
|
|
22564
22606
|
return {
|
|
22565
22607
|
left: `${this.props.position.left + x}px`,
|
|
22566
22608
|
bottom: "0px",
|
|
22567
|
-
height: `${SCROLLBAR_WIDTH
|
|
22609
|
+
height: `${SCROLLBAR_WIDTH}px`,
|
|
22568
22610
|
right: `0px`,
|
|
22569
22611
|
};
|
|
22570
22612
|
}
|
|
@@ -22606,7 +22648,7 @@ class VerticalScrollBar extends Component {
|
|
|
22606
22648
|
return {
|
|
22607
22649
|
top: `${this.props.position.top + y}px`,
|
|
22608
22650
|
right: "0px",
|
|
22609
|
-
width: `${SCROLLBAR_WIDTH
|
|
22651
|
+
width: `${SCROLLBAR_WIDTH}px`,
|
|
22610
22652
|
bottom: `0px`,
|
|
22611
22653
|
};
|
|
22612
22654
|
}
|
|
@@ -22764,16 +22806,15 @@ class Grid extends Component {
|
|
|
22764
22806
|
menuItems: [],
|
|
22765
22807
|
});
|
|
22766
22808
|
this.gridRef = useRef("grid");
|
|
22767
|
-
this.hiddenInput = useRef("hiddenInput");
|
|
22768
22809
|
this.canvasPosition = useAbsolutePosition(this.gridRef);
|
|
22769
22810
|
this.hoveredCell = useState({ col: undefined, row: undefined });
|
|
22770
22811
|
useExternalListener(document.body, "cut", this.copy.bind(this, true));
|
|
22771
22812
|
useExternalListener(document.body, "copy", this.copy.bind(this, false));
|
|
22772
22813
|
useExternalListener(document.body, "paste", this.paste);
|
|
22773
|
-
onMounted(() => this.
|
|
22774
|
-
this.props.exposeFocus(() => this.
|
|
22814
|
+
onMounted(() => this.focusDefaultElement());
|
|
22815
|
+
this.props.exposeFocus(() => this.focusDefaultElement());
|
|
22775
22816
|
useGridDrawing("canvas", this.env.model, () => this.env.model.getters.getSheetViewDimensionWithHeaders());
|
|
22776
|
-
useEffect(() => this.
|
|
22817
|
+
useEffect(() => this.focusDefaultElement(), () => [this.env.model.getters.getActiveSheetId()]);
|
|
22777
22818
|
this.onMouseWheel = useWheelHandler((deltaX, deltaY) => {
|
|
22778
22819
|
this.moveCanvas(deltaX, deltaY);
|
|
22779
22820
|
this.hoveredCell.col = undefined;
|
|
@@ -22788,19 +22829,18 @@ class Grid extends Component {
|
|
|
22788
22829
|
return `
|
|
22789
22830
|
top: ${HEADER_HEIGHT}px;
|
|
22790
22831
|
left: ${HEADER_WIDTH}px;
|
|
22791
|
-
height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH
|
|
22792
|
-
width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH
|
|
22832
|
+
height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
|
|
22833
|
+
width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH}px);
|
|
22793
22834
|
`;
|
|
22794
22835
|
}
|
|
22795
22836
|
onClosePopover() {
|
|
22796
22837
|
this.closeOpenedPopover();
|
|
22797
|
-
this.
|
|
22838
|
+
this.focusDefaultElement();
|
|
22798
22839
|
}
|
|
22799
|
-
|
|
22800
|
-
var _a;
|
|
22840
|
+
focusDefaultElement() {
|
|
22801
22841
|
if (!this.env.model.getters.getSelectedFigureId() &&
|
|
22802
22842
|
this.env.model.getters.getEditionMode() === "inactive") {
|
|
22803
|
-
|
|
22843
|
+
this.env.focusableElement.focus();
|
|
22804
22844
|
}
|
|
22805
22845
|
}
|
|
22806
22846
|
get gridEl() {
|
|
@@ -22949,19 +22989,6 @@ class Grid extends Component {
|
|
|
22949
22989
|
return;
|
|
22950
22990
|
}
|
|
22951
22991
|
}
|
|
22952
|
-
onInput(ev) {
|
|
22953
|
-
// the user meant to paste in the sheet, not open the composer with the pasted content
|
|
22954
|
-
if (!ev.isComposing && ev.inputType === "insertFromPaste") {
|
|
22955
|
-
return;
|
|
22956
|
-
}
|
|
22957
|
-
if (ev.data) {
|
|
22958
|
-
// if the user types a character on the grid, it means he wants to start composing the selected cell with that
|
|
22959
|
-
// character
|
|
22960
|
-
ev.preventDefault();
|
|
22961
|
-
ev.stopPropagation();
|
|
22962
|
-
this.props.onGridComposerCellFocused(ev.data);
|
|
22963
|
-
}
|
|
22964
|
-
}
|
|
22965
22992
|
// ---------------------------------------------------------------------------
|
|
22966
22993
|
// Context Menu
|
|
22967
22994
|
// ---------------------------------------------------------------------------
|
|
@@ -23042,7 +23069,7 @@ class Grid extends Component {
|
|
|
23042
23069
|
}
|
|
23043
23070
|
closeMenu() {
|
|
23044
23071
|
this.menuState.isOpen = false;
|
|
23045
|
-
this.
|
|
23072
|
+
this.focusDefaultElement();
|
|
23046
23073
|
}
|
|
23047
23074
|
}
|
|
23048
23075
|
Grid.template = "o-spreadsheet-Grid";
|
|
@@ -26738,7 +26765,7 @@ function normalizeV9(formula) {
|
|
|
26738
26765
|
* a breaking change is made in the way the state is handled, and an upgrade
|
|
26739
26766
|
* function should be defined
|
|
26740
26767
|
*/
|
|
26741
|
-
const CURRENT_VERSION = 12;
|
|
26768
|
+
const CURRENT_VERSION = 12.5;
|
|
26742
26769
|
const INITIAL_SHEET_ID = "Sheet1";
|
|
26743
26770
|
/**
|
|
26744
26771
|
* This function tries to load anything that could look like a valid
|
|
@@ -27004,6 +27031,31 @@ const MIGRATIONS = [
|
|
|
27004
27031
|
return data;
|
|
27005
27032
|
},
|
|
27006
27033
|
},
|
|
27034
|
+
{
|
|
27035
|
+
description: "Fix datafilter duplication",
|
|
27036
|
+
from: 12,
|
|
27037
|
+
to: 12.5,
|
|
27038
|
+
applyMigration(data) {
|
|
27039
|
+
for (let sheet of data.sheets || []) {
|
|
27040
|
+
let knownDataFilterZones = [];
|
|
27041
|
+
for (let filterTable of sheet.filterTables || []) {
|
|
27042
|
+
const zone = toZone(filterTable.range);
|
|
27043
|
+
// See commit message for the details
|
|
27044
|
+
const intersectZoneIndex = knownDataFilterZones.findIndex((knownZone) => overlap(knownZone, zone));
|
|
27045
|
+
if (intersectZoneIndex !== -1) {
|
|
27046
|
+
knownDataFilterZones[intersectZoneIndex] = zone;
|
|
27047
|
+
}
|
|
27048
|
+
else {
|
|
27049
|
+
knownDataFilterZones.push(zone);
|
|
27050
|
+
}
|
|
27051
|
+
}
|
|
27052
|
+
sheet.filterTables = knownDataFilterZones.map((zone) => ({
|
|
27053
|
+
range: zoneToXc(zone),
|
|
27054
|
+
}));
|
|
27055
|
+
}
|
|
27056
|
+
return data;
|
|
27057
|
+
},
|
|
27058
|
+
},
|
|
27007
27059
|
];
|
|
27008
27060
|
/**
|
|
27009
27061
|
* This function is used to repair faulty data independently of the migration.
|
|
@@ -27765,9 +27817,9 @@ class CellPlugin extends CorePlugin {
|
|
|
27765
27817
|
allowDispatch(cmd) {
|
|
27766
27818
|
switch (cmd.type) {
|
|
27767
27819
|
case "UPDATE_CELL":
|
|
27768
|
-
return this.
|
|
27820
|
+
return this.checkValidations(cmd, this.checkCellOutOfSheet, this.checkUselessUpdateCell);
|
|
27769
27821
|
case "CLEAR_CELL":
|
|
27770
|
-
return this.checkValidations(cmd, this.
|
|
27822
|
+
return this.checkValidations(cmd, this.checkCellOutOfSheet, this.checkUselessClearCell);
|
|
27771
27823
|
default:
|
|
27772
27824
|
return 0 /* CommandResult.Success */;
|
|
27773
27825
|
}
|
|
@@ -27899,9 +27951,6 @@ class CellPlugin extends CorePlugin {
|
|
|
27899
27951
|
format: cell.format ? getItemId(cell.format, formats) : undefined,
|
|
27900
27952
|
content: cell.content || undefined,
|
|
27901
27953
|
};
|
|
27902
|
-
if (cell.isFormula()) {
|
|
27903
|
-
cells[xc].content = this.buildFormulaContent(_sheet.id, cell, cell.dependencies, true);
|
|
27904
|
-
}
|
|
27905
27954
|
}
|
|
27906
27955
|
_sheet.cells = cells;
|
|
27907
27956
|
}
|
|
@@ -27924,6 +27973,9 @@ class CellPlugin extends CorePlugin {
|
|
|
27924
27973
|
const exportedCellData = sheet.cells[xc];
|
|
27925
27974
|
exportedCellData.value = cell.evaluated.value;
|
|
27926
27975
|
exportedCellData.isFormula = cell.isFormula();
|
|
27976
|
+
if (cell.isFormula()) {
|
|
27977
|
+
exportedCellData.content = this.buildFormulaContent(sheet.id, cell, cell.dependencies, true);
|
|
27978
|
+
}
|
|
27927
27979
|
if (cell.format !== cell.evaluated.format) {
|
|
27928
27980
|
exportedCellData.computedFormat = cell.evaluated.format;
|
|
27929
27981
|
}
|
|
@@ -28126,6 +28178,18 @@ class CellPlugin extends CorePlugin {
|
|
|
28126
28178
|
}
|
|
28127
28179
|
return 0 /* CommandResult.Success */;
|
|
28128
28180
|
}
|
|
28181
|
+
checkUselessUpdateCell(cmd) {
|
|
28182
|
+
const cell = this.getters.getCell(cmd.sheetId, cmd.col, cmd.row);
|
|
28183
|
+
const hasContent = "content" in cmd || "formula" in cmd;
|
|
28184
|
+
const hasStyle = "style" in cmd;
|
|
28185
|
+
const hasFormat = "format" in cmd;
|
|
28186
|
+
if ((!hasContent || (cell === null || cell === void 0 ? void 0 : cell.content) === cmd.content) &&
|
|
28187
|
+
(!hasStyle || deepEquals(cell === null || cell === void 0 ? void 0 : cell.style, cmd.style)) &&
|
|
28188
|
+
(!hasFormat || (cell === null || cell === void 0 ? void 0 : cell.format) === cmd.format)) {
|
|
28189
|
+
return 88 /* CommandResult.NoChanges */;
|
|
28190
|
+
}
|
|
28191
|
+
return 0 /* CommandResult.Success */;
|
|
28192
|
+
}
|
|
28129
28193
|
}
|
|
28130
28194
|
CellPlugin.getters = [
|
|
28131
28195
|
"zoneToXC",
|
|
@@ -35366,9 +35430,6 @@ class SelectionInputPlugin extends UIPlugin {
|
|
|
35366
35430
|
}
|
|
35367
35431
|
}
|
|
35368
35432
|
}
|
|
35369
|
-
unsubscribe() {
|
|
35370
|
-
this.unfocus();
|
|
35371
|
-
}
|
|
35372
35433
|
// ---------------------------------------------------------------------------
|
|
35373
35434
|
// Getters || only callable by the parent
|
|
35374
35435
|
// ---------------------------------------------------------------------------
|
|
@@ -35580,9 +35641,6 @@ class SelectionInputsManagerPlugin extends UIPlugin {
|
|
|
35580
35641
|
}
|
|
35581
35642
|
(_a = this.currentInput) === null || _a === void 0 ? void 0 : _a.handle(cmd);
|
|
35582
35643
|
}
|
|
35583
|
-
unsubscribe() {
|
|
35584
|
-
this.unfocus();
|
|
35585
|
-
}
|
|
35586
35644
|
// ---------------------------------------------------------------------------
|
|
35587
35645
|
// Getters
|
|
35588
35646
|
// ---------------------------------------------------------------------------
|
|
@@ -37981,6 +38039,19 @@ clickableCellRegistry.add("link", {
|
|
|
37981
38039
|
sequence: 5,
|
|
37982
38040
|
});
|
|
37983
38041
|
|
|
38042
|
+
class FocusableElement {
|
|
38043
|
+
constructor() {
|
|
38044
|
+
this.focusableElement = undefined;
|
|
38045
|
+
}
|
|
38046
|
+
setFocusableElement(element) {
|
|
38047
|
+
this.focusableElement = element;
|
|
38048
|
+
}
|
|
38049
|
+
focus() {
|
|
38050
|
+
var _a;
|
|
38051
|
+
(_a = this.focusableElement) === null || _a === void 0 ? void 0 : _a.focus();
|
|
38052
|
+
}
|
|
38053
|
+
}
|
|
38054
|
+
|
|
37984
38055
|
// -----------------------------------------------------------------------------
|
|
37985
38056
|
// SpreadSheet
|
|
37986
38057
|
// -----------------------------------------------------------------------------
|
|
@@ -39124,8 +39195,8 @@ css /* scss */ `
|
|
|
39124
39195
|
&.corner {
|
|
39125
39196
|
right: 0px;
|
|
39126
39197
|
bottom: 0px;
|
|
39127
|
-
height: ${SCROLLBAR_WIDTH
|
|
39128
|
-
width: ${SCROLLBAR_WIDTH
|
|
39198
|
+
height: ${SCROLLBAR_WIDTH}px;
|
|
39199
|
+
width: ${SCROLLBAR_WIDTH}px;
|
|
39129
39200
|
border-top: 1px solid #e2e3e3;
|
|
39130
39201
|
border-left: 1px solid #e2e3e3;
|
|
39131
39202
|
}
|
|
@@ -39169,6 +39240,7 @@ class Spreadsheet extends Component {
|
|
|
39169
39240
|
toggleSidePanel: this.toggleSidePanel.bind(this),
|
|
39170
39241
|
_t: Spreadsheet._t,
|
|
39171
39242
|
clipboard: navigator.clipboard,
|
|
39243
|
+
focusableElement: new FocusableElement(),
|
|
39172
39244
|
});
|
|
39173
39245
|
useExternalListener(window, "resize", () => this.render(true));
|
|
39174
39246
|
useExternalListener(window, "beforeunload", this.unbindModelEvents.bind(this));
|
|
@@ -39271,17 +39343,18 @@ class Spreadsheet extends Component {
|
|
|
39271
39343
|
this.model.dispatch("UNFOCUS_SELECTION_INPUT");
|
|
39272
39344
|
this.composer.topBarFocus = "contentFocus";
|
|
39273
39345
|
this.composer.gridFocusMode = "inactive";
|
|
39274
|
-
this.setComposerContent({ selection }
|
|
39346
|
+
this.setComposerContent({ selection });
|
|
39275
39347
|
}
|
|
39276
|
-
onGridComposerContentFocused() {
|
|
39348
|
+
onGridComposerContentFocused(selection) {
|
|
39277
39349
|
if (this.model.getters.isReadonly()) {
|
|
39278
39350
|
return;
|
|
39279
39351
|
}
|
|
39280
39352
|
this.model.dispatch("UNFOCUS_SELECTION_INPUT");
|
|
39281
39353
|
this.composer.topBarFocus = "inactive";
|
|
39282
39354
|
this.composer.gridFocusMode = "contentFocus";
|
|
39283
|
-
this.setComposerContent({});
|
|
39355
|
+
this.setComposerContent({ selection });
|
|
39284
39356
|
}
|
|
39357
|
+
// TODO: either both are defined or none of them. change those args to an object
|
|
39285
39358
|
onGridComposerCellFocused(content, selection) {
|
|
39286
39359
|
if (this.model.getters.isReadonly()) {
|
|
39287
39360
|
return;
|
|
@@ -40654,18 +40727,17 @@ class EventStream {
|
|
|
40654
40727
|
if (this.observers.find((sub) => sub.owner === owner)) {
|
|
40655
40728
|
throw new Error("You are already subscribed forever");
|
|
40656
40729
|
}
|
|
40657
|
-
if ((_a = this.mainSubscription) === null || _a === void 0 ? void 0 : _a.owner) {
|
|
40730
|
+
if (((_a = this.mainSubscription) === null || _a === void 0 ? void 0 : _a.owner) && this.mainSubscription.owner !== owner) {
|
|
40658
40731
|
(_c = (_b = this.mainSubscription.callbacks).release) === null || _c === void 0 ? void 0 : _c.call(_b);
|
|
40659
40732
|
}
|
|
40660
40733
|
this.mainSubscription = { owner, callbacks };
|
|
40661
40734
|
}
|
|
40662
40735
|
release(owner) {
|
|
40663
|
-
var _a
|
|
40736
|
+
var _a;
|
|
40664
40737
|
if (((_a = this.mainSubscription) === null || _a === void 0 ? void 0 : _a.owner) !== owner ||
|
|
40665
40738
|
this.observers.find((sub) => sub.owner === owner)) {
|
|
40666
40739
|
return;
|
|
40667
40740
|
}
|
|
40668
|
-
(_d = (_b = this.mainSubscription) === null || _b === void 0 ? void 0 : (_c = _b.callbacks).release) === null || _d === void 0 ? void 0 : _d.call(_c);
|
|
40669
40741
|
this.mainSubscription = this.defaultSubscription;
|
|
40670
40742
|
}
|
|
40671
40743
|
/**
|
|
@@ -43084,7 +43156,7 @@ const SPREADSHEET_DIMENSIONS = {
|
|
|
43084
43156
|
BOTTOMBAR_HEIGHT,
|
|
43085
43157
|
DEFAULT_CELL_WIDTH,
|
|
43086
43158
|
DEFAULT_CELL_HEIGHT,
|
|
43087
|
-
SCROLLBAR_WIDTH
|
|
43159
|
+
SCROLLBAR_WIDTH,
|
|
43088
43160
|
};
|
|
43089
43161
|
const registries = {
|
|
43090
43162
|
autofillModifiersRegistry,
|
|
@@ -43167,6 +43239,6 @@ function addFunction(functionName, functionDescription) {
|
|
|
43167
43239
|
export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, cellTypes, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, load, parse, readonlyAllowedCommands, registries, setTranslationMethod, tokenize };
|
|
43168
43240
|
|
|
43169
43241
|
|
|
43170
|
-
__info__.version = '16.0.
|
|
43171
|
-
__info__.date = '2024-02-
|
|
43172
|
-
__info__.hash = '
|
|
43242
|
+
__info__.version = '16.0.33';
|
|
43243
|
+
__info__.date = '2024-02-16T14:49:10.674Z';
|
|
43244
|
+
__info__.hash = 'c0cefe8';
|