@odoo/o-spreadsheet 17.0.18 → 17.0.20
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 +741 -410
- package/dist/o-spreadsheet.d.ts +4 -7
- package/dist/o-spreadsheet.esm.js +741 -410
- package/dist/o-spreadsheet.iife.js +741 -410
- package/dist/o-spreadsheet.iife.min.js +265 -261
- package/dist/o_spreadsheet.xml +4 -4
- 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 17.0.
|
|
6
|
-
* @date 2024-04-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 17.0.20
|
|
6
|
+
* @date 2024-04-26T07:37:04.503Z
|
|
7
|
+
* @hash 065ac98
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { Component, useRef, onMounted, useEffect, onWillPatch, useState, onWillUpdateProps, onPatched, useComponent, useExternalListener, onWillUnmount, onWillStart, xml, useChildSubEnv, useSubEnv, markRaw } from '@odoo/owl';
|
|
@@ -8118,6 +8118,7 @@ class LinkEditor extends Component {
|
|
|
8118
8118
|
this.save();
|
|
8119
8119
|
}
|
|
8120
8120
|
ev.stopPropagation();
|
|
8121
|
+
ev.preventDefault();
|
|
8121
8122
|
break;
|
|
8122
8123
|
case "Escape":
|
|
8123
8124
|
this.cancel();
|
|
@@ -19900,6 +19901,332 @@ function interactiveAddFilter(env, sheetId, target) {
|
|
|
19900
19901
|
}
|
|
19901
19902
|
}
|
|
19902
19903
|
|
|
19904
|
+
function interactiveFreezeColumnsRows(env, dimension, base) {
|
|
19905
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
19906
|
+
const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
|
|
19907
|
+
const result = env.model.dispatch(cmd, { sheetId, quantity: base });
|
|
19908
|
+
if (result.isCancelledBecause("MergeOverlap" /* CommandResult.MergeOverlap */)) {
|
|
19909
|
+
env.raiseError(MergeErrorMessage);
|
|
19910
|
+
}
|
|
19911
|
+
}
|
|
19912
|
+
|
|
19913
|
+
const hideCols = {
|
|
19914
|
+
name: HIDE_COLUMNS_NAME,
|
|
19915
|
+
execute: (env) => {
|
|
19916
|
+
const columns = env.model.getters.getElementsFromSelection("COL");
|
|
19917
|
+
env.model.dispatch("HIDE_COLUMNS_ROWS", {
|
|
19918
|
+
sheetId: env.model.getters.getActiveSheetId(),
|
|
19919
|
+
dimension: "COL",
|
|
19920
|
+
elements: columns,
|
|
19921
|
+
});
|
|
19922
|
+
},
|
|
19923
|
+
isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
|
|
19924
|
+
icon: "o-spreadsheet-Icon.HIDE_COL",
|
|
19925
|
+
};
|
|
19926
|
+
const unhideCols = {
|
|
19927
|
+
name: _t("Unhide columns"),
|
|
19928
|
+
execute: (env) => {
|
|
19929
|
+
const columns = env.model.getters.getElementsFromSelection("COL");
|
|
19930
|
+
env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
19931
|
+
sheetId: env.model.getters.getActiveSheetId(),
|
|
19932
|
+
dimension: "COL",
|
|
19933
|
+
elements: columns,
|
|
19934
|
+
});
|
|
19935
|
+
},
|
|
19936
|
+
isVisible: (env) => {
|
|
19937
|
+
const hiddenCols = env.model.getters
|
|
19938
|
+
.getHiddenColsGroups(env.model.getters.getActiveSheetId())
|
|
19939
|
+
.flat();
|
|
19940
|
+
const currentCols = env.model.getters.getElementsFromSelection("COL");
|
|
19941
|
+
return currentCols.some((col) => hiddenCols.includes(col));
|
|
19942
|
+
},
|
|
19943
|
+
};
|
|
19944
|
+
const unhideAllCols = {
|
|
19945
|
+
name: _t("Unhide all columns"),
|
|
19946
|
+
execute: (env) => {
|
|
19947
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
19948
|
+
env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
19949
|
+
sheetId,
|
|
19950
|
+
dimension: "COL",
|
|
19951
|
+
elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
|
|
19952
|
+
});
|
|
19953
|
+
},
|
|
19954
|
+
isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
|
|
19955
|
+
};
|
|
19956
|
+
const hideRows = {
|
|
19957
|
+
name: HIDE_ROWS_NAME,
|
|
19958
|
+
execute: (env) => {
|
|
19959
|
+
const rows = env.model.getters.getElementsFromSelection("ROW");
|
|
19960
|
+
env.model.dispatch("HIDE_COLUMNS_ROWS", {
|
|
19961
|
+
sheetId: env.model.getters.getActiveSheetId(),
|
|
19962
|
+
dimension: "ROW",
|
|
19963
|
+
elements: rows,
|
|
19964
|
+
});
|
|
19965
|
+
},
|
|
19966
|
+
isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
|
|
19967
|
+
icon: "o-spreadsheet-Icon.HIDE_ROW",
|
|
19968
|
+
};
|
|
19969
|
+
const unhideRows = {
|
|
19970
|
+
name: _t("Unhide rows"),
|
|
19971
|
+
execute: (env) => {
|
|
19972
|
+
const columns = env.model.getters.getElementsFromSelection("ROW");
|
|
19973
|
+
env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
19974
|
+
sheetId: env.model.getters.getActiveSheetId(),
|
|
19975
|
+
dimension: "ROW",
|
|
19976
|
+
elements: columns,
|
|
19977
|
+
});
|
|
19978
|
+
},
|
|
19979
|
+
isVisible: (env) => {
|
|
19980
|
+
const hiddenRows = env.model.getters
|
|
19981
|
+
.getHiddenRowsGroups(env.model.getters.getActiveSheetId())
|
|
19982
|
+
.flat();
|
|
19983
|
+
const currentRows = env.model.getters.getElementsFromSelection("ROW");
|
|
19984
|
+
return currentRows.some((col) => hiddenRows.includes(col));
|
|
19985
|
+
},
|
|
19986
|
+
};
|
|
19987
|
+
const unhideAllRows = {
|
|
19988
|
+
name: _t("Unhide all rows"),
|
|
19989
|
+
execute: (env) => {
|
|
19990
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
19991
|
+
env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
19992
|
+
sheetId,
|
|
19993
|
+
dimension: "ROW",
|
|
19994
|
+
elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
|
|
19995
|
+
});
|
|
19996
|
+
},
|
|
19997
|
+
isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
|
|
19998
|
+
};
|
|
19999
|
+
const unFreezePane = {
|
|
20000
|
+
name: _t("Unfreeze"),
|
|
20001
|
+
isVisible: (env) => {
|
|
20002
|
+
const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
|
|
20003
|
+
return xSplit + ySplit > 0;
|
|
20004
|
+
},
|
|
20005
|
+
execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
|
|
20006
|
+
sheetId: env.model.getters.getActiveSheetId(),
|
|
20007
|
+
}),
|
|
20008
|
+
icon: "o-spreadsheet-Icon.UNFREEZE",
|
|
20009
|
+
};
|
|
20010
|
+
const freezePane = {
|
|
20011
|
+
name: _t("Freeze"),
|
|
20012
|
+
icon: "o-spreadsheet-Icon.FREEZE",
|
|
20013
|
+
};
|
|
20014
|
+
const unFreezeRows = {
|
|
20015
|
+
name: _t("No rows"),
|
|
20016
|
+
execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
|
|
20017
|
+
sheetId: env.model.getters.getActiveSheetId(),
|
|
20018
|
+
}),
|
|
20019
|
+
isReadonlyAllowed: true,
|
|
20020
|
+
isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
|
|
20021
|
+
};
|
|
20022
|
+
const freezeFirstRow = {
|
|
20023
|
+
name: _t("1 row"),
|
|
20024
|
+
execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
|
|
20025
|
+
isReadonlyAllowed: true,
|
|
20026
|
+
};
|
|
20027
|
+
const freezeSecondRow = {
|
|
20028
|
+
name: _t("2 rows"),
|
|
20029
|
+
execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
|
|
20030
|
+
isReadonlyAllowed: true,
|
|
20031
|
+
};
|
|
20032
|
+
const freezeCurrentRow = {
|
|
20033
|
+
name: _t("Up to current row"),
|
|
20034
|
+
execute: (env) => {
|
|
20035
|
+
const { bottom } = env.model.getters.getSelectedZone();
|
|
20036
|
+
interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
|
|
20037
|
+
},
|
|
20038
|
+
isReadonlyAllowed: true,
|
|
20039
|
+
};
|
|
20040
|
+
const unFreezeCols = {
|
|
20041
|
+
name: _t("No columns"),
|
|
20042
|
+
execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
|
|
20043
|
+
sheetId: env.model.getters.getActiveSheetId(),
|
|
20044
|
+
}),
|
|
20045
|
+
isReadonlyAllowed: true,
|
|
20046
|
+
isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
|
|
20047
|
+
};
|
|
20048
|
+
const freezeFirstCol = {
|
|
20049
|
+
name: _t("1 column"),
|
|
20050
|
+
execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
|
|
20051
|
+
isReadonlyAllowed: true,
|
|
20052
|
+
};
|
|
20053
|
+
const freezeSecondCol = {
|
|
20054
|
+
name: _t("2 columns"),
|
|
20055
|
+
execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
|
|
20056
|
+
isReadonlyAllowed: true,
|
|
20057
|
+
};
|
|
20058
|
+
const freezeCurrentCol = {
|
|
20059
|
+
name: _t("Up to current column"),
|
|
20060
|
+
execute: (env) => {
|
|
20061
|
+
const { right } = env.model.getters.getSelectedZone();
|
|
20062
|
+
interactiveFreezeColumnsRows(env, "COL", right + 1);
|
|
20063
|
+
},
|
|
20064
|
+
isReadonlyAllowed: true,
|
|
20065
|
+
};
|
|
20066
|
+
const viewGridlines = {
|
|
20067
|
+
name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
|
|
20068
|
+
? _t("Hide gridlines")
|
|
20069
|
+
: _t("Show gridlines"),
|
|
20070
|
+
execute: (env) => {
|
|
20071
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
20072
|
+
env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
|
|
20073
|
+
sheetId,
|
|
20074
|
+
areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
|
|
20075
|
+
});
|
|
20076
|
+
},
|
|
20077
|
+
icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
|
|
20078
|
+
};
|
|
20079
|
+
const viewFormulas = {
|
|
20080
|
+
name: (env) => env.model.getters.shouldShowFormulas() ? "Hide formulas" : _t("Show formulas"),
|
|
20081
|
+
execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
|
|
20082
|
+
isReadonlyAllowed: true,
|
|
20083
|
+
icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
|
|
20084
|
+
};
|
|
20085
|
+
const createRemoveFilter = {
|
|
20086
|
+
name: (env) => selectionContainsFilter(env) ? _t("Remove selected filters") : _t("Create filter"),
|
|
20087
|
+
isActive: (env) => selectionContainsFilter(env),
|
|
20088
|
+
isEnabled: (env) => !cannotCreateFilter(env),
|
|
20089
|
+
execute: (env) => createRemoveFilterAction(env),
|
|
20090
|
+
icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
|
|
20091
|
+
};
|
|
20092
|
+
const groupColumns = {
|
|
20093
|
+
name: (env) => {
|
|
20094
|
+
const selection = env.model.getters.getSelectedZone();
|
|
20095
|
+
if (selection.left === selection.right) {
|
|
20096
|
+
return _t("Group column %s", numberToLetters(selection.left));
|
|
20097
|
+
}
|
|
20098
|
+
return _t("Group columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
|
|
20099
|
+
},
|
|
20100
|
+
execute: (env) => groupHeadersAction(env, "COL"),
|
|
20101
|
+
isVisible: (env) => {
|
|
20102
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
20103
|
+
const selection = env.model.getters.getSelectedZone();
|
|
20104
|
+
const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "COL", selection);
|
|
20105
|
+
return (IS_ONLY_ONE_RANGE(env) &&
|
|
20106
|
+
!groups.some((group) => group.start === selection.left && group.end === selection.right));
|
|
20107
|
+
},
|
|
20108
|
+
icon: "o-spreadsheet-Icon.GROUP_COLUMNS",
|
|
20109
|
+
};
|
|
20110
|
+
const groupRows = {
|
|
20111
|
+
name: (env) => {
|
|
20112
|
+
const selection = env.model.getters.getSelectedZone();
|
|
20113
|
+
if (selection.top === selection.bottom) {
|
|
20114
|
+
return _t("Group row %s", String(selection.top + 1));
|
|
20115
|
+
}
|
|
20116
|
+
return _t("Group rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
|
|
20117
|
+
},
|
|
20118
|
+
execute: (env) => groupHeadersAction(env, "ROW"),
|
|
20119
|
+
isVisible: (env) => {
|
|
20120
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
20121
|
+
const selection = env.model.getters.getSelectedZone();
|
|
20122
|
+
const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "ROW", selection);
|
|
20123
|
+
return (IS_ONLY_ONE_RANGE(env) &&
|
|
20124
|
+
!groups.some((group) => group.start === selection.top && group.end === selection.bottom));
|
|
20125
|
+
},
|
|
20126
|
+
icon: "o-spreadsheet-Icon.GROUP_ROWS",
|
|
20127
|
+
};
|
|
20128
|
+
const ungroupColumns = {
|
|
20129
|
+
name: (env) => {
|
|
20130
|
+
const selection = env.model.getters.getSelectedZone();
|
|
20131
|
+
if (selection.left === selection.right) {
|
|
20132
|
+
return _t("Ungroup column %s", numberToLetters(selection.left));
|
|
20133
|
+
}
|
|
20134
|
+
return _t("Ungroup columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
|
|
20135
|
+
},
|
|
20136
|
+
execute: (env) => ungroupHeaders(env, "COL"),
|
|
20137
|
+
icon: "o-spreadsheet-Icon.UNGROUP_COLUMNS",
|
|
20138
|
+
};
|
|
20139
|
+
const ungroupRows = {
|
|
20140
|
+
name: (env) => {
|
|
20141
|
+
const selection = env.model.getters.getSelectedZone();
|
|
20142
|
+
if (selection.top === selection.bottom) {
|
|
20143
|
+
return _t("Ungroup row %s", String(selection.top + 1));
|
|
20144
|
+
}
|
|
20145
|
+
return _t("Ungroup rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
|
|
20146
|
+
},
|
|
20147
|
+
execute: (env) => ungroupHeaders(env, "ROW"),
|
|
20148
|
+
icon: "o-spreadsheet-Icon.UNGROUP_ROWS",
|
|
20149
|
+
};
|
|
20150
|
+
function selectionContainsFilter(env) {
|
|
20151
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
20152
|
+
const selectedZones = env.model.getters.getSelectedZones();
|
|
20153
|
+
return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
|
|
20154
|
+
}
|
|
20155
|
+
function cannotCreateFilter(env) {
|
|
20156
|
+
return !areZonesContinuous(...env.model.getters.getSelectedZones());
|
|
20157
|
+
}
|
|
20158
|
+
function createRemoveFilterAction(env) {
|
|
20159
|
+
if (selectionContainsFilter(env)) {
|
|
20160
|
+
env.model.dispatch("REMOVE_FILTER_TABLE", {
|
|
20161
|
+
sheetId: env.model.getters.getActiveSheetId(),
|
|
20162
|
+
target: env.model.getters.getSelectedZones(),
|
|
20163
|
+
});
|
|
20164
|
+
return;
|
|
20165
|
+
}
|
|
20166
|
+
if (cannotCreateFilter(env)) {
|
|
20167
|
+
return;
|
|
20168
|
+
}
|
|
20169
|
+
env.model.selection.selectTableAroundSelection();
|
|
20170
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
20171
|
+
const selection = env.model.getters.getSelectedZones();
|
|
20172
|
+
interactiveAddFilter(env, sheetId, selection);
|
|
20173
|
+
}
|
|
20174
|
+
function groupHeadersAction(env, dim) {
|
|
20175
|
+
const selection = env.model.getters.getSelectedZone();
|
|
20176
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
20177
|
+
env.model.dispatch("GROUP_HEADERS", {
|
|
20178
|
+
sheetId,
|
|
20179
|
+
dimension: dim,
|
|
20180
|
+
start: dim === "COL" ? selection.left : selection.top,
|
|
20181
|
+
end: dim === "COL" ? selection.right : selection.bottom,
|
|
20182
|
+
});
|
|
20183
|
+
}
|
|
20184
|
+
function ungroupHeaders(env, dim) {
|
|
20185
|
+
const selection = env.model.getters.getSelectedZone();
|
|
20186
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
20187
|
+
env.model.dispatch("UNGROUP_HEADERS", {
|
|
20188
|
+
sheetId,
|
|
20189
|
+
dimension: dim,
|
|
20190
|
+
start: dim === "COL" ? selection.left : selection.top,
|
|
20191
|
+
end: dim === "COL" ? selection.right : selection.bottom,
|
|
20192
|
+
});
|
|
20193
|
+
}
|
|
20194
|
+
function canUngroupHeaders(env, dimension) {
|
|
20195
|
+
const sheetId = env.model.getters.getActiveSheetId();
|
|
20196
|
+
const selection = env.model.getters.getSelectedZones();
|
|
20197
|
+
return (selection.length === 1 &&
|
|
20198
|
+
env.model.getters.getHeaderGroupsInZone(sheetId, dimension, selection[0]).length > 0);
|
|
20199
|
+
}
|
|
20200
|
+
|
|
20201
|
+
var ACTION_VIEW = /*#__PURE__*/Object.freeze({
|
|
20202
|
+
__proto__: null,
|
|
20203
|
+
canUngroupHeaders: canUngroupHeaders,
|
|
20204
|
+
createRemoveFilter: createRemoveFilter,
|
|
20205
|
+
createRemoveFilterAction: createRemoveFilterAction,
|
|
20206
|
+
freezeCurrentCol: freezeCurrentCol,
|
|
20207
|
+
freezeCurrentRow: freezeCurrentRow,
|
|
20208
|
+
freezeFirstCol: freezeFirstCol,
|
|
20209
|
+
freezeFirstRow: freezeFirstRow,
|
|
20210
|
+
freezePane: freezePane,
|
|
20211
|
+
freezeSecondCol: freezeSecondCol,
|
|
20212
|
+
freezeSecondRow: freezeSecondRow,
|
|
20213
|
+
groupColumns: groupColumns,
|
|
20214
|
+
groupRows: groupRows,
|
|
20215
|
+
hideCols: hideCols,
|
|
20216
|
+
hideRows: hideRows,
|
|
20217
|
+
unFreezeCols: unFreezeCols,
|
|
20218
|
+
unFreezePane: unFreezePane,
|
|
20219
|
+
unFreezeRows: unFreezeRows,
|
|
20220
|
+
ungroupColumns: ungroupColumns,
|
|
20221
|
+
ungroupRows: ungroupRows,
|
|
20222
|
+
unhideAllCols: unhideAllCols,
|
|
20223
|
+
unhideAllRows: unhideAllRows,
|
|
20224
|
+
unhideCols: unhideCols,
|
|
20225
|
+
unhideRows: unhideRows,
|
|
20226
|
+
viewFormulas: viewFormulas,
|
|
20227
|
+
viewGridlines: viewGridlines
|
|
20228
|
+
});
|
|
20229
|
+
|
|
19903
20230
|
const sortRange = {
|
|
19904
20231
|
name: _t("Sort range"),
|
|
19905
20232
|
isVisible: IS_ONLY_ONE_RANGE,
|
|
@@ -19942,32 +20269,15 @@ const sortDescending = {
|
|
|
19942
20269
|
},
|
|
19943
20270
|
icon: "o-spreadsheet-Icon.SORT_DESCENDING",
|
|
19944
20271
|
};
|
|
19945
|
-
const
|
|
19946
|
-
name: _t("Create filter"),
|
|
19947
|
-
execute: (env) =>
|
|
19948
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
19949
|
-
const selection = env.model.getters.getSelection().zones;
|
|
19950
|
-
interactiveAddFilter(env, sheetId, selection);
|
|
19951
|
-
},
|
|
19952
|
-
isVisible: (env) => !SELECTION_CONTAINS_FILTER(env),
|
|
20272
|
+
const addRemoveDataFilter = {
|
|
20273
|
+
name: (env) => SELECTION_CONTAINS_FILTER(env) ? _t("Remove filter") : _t("Create filter"),
|
|
20274
|
+
execute: (env) => createRemoveFilterAction(env),
|
|
19953
20275
|
isEnabled: (env) => {
|
|
19954
20276
|
const selectedZones = env.model.getters.getSelectedZones();
|
|
19955
20277
|
return areZonesContinuous(...selectedZones);
|
|
19956
20278
|
},
|
|
19957
20279
|
icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
|
|
19958
20280
|
};
|
|
19959
|
-
const removeDataFilter = {
|
|
19960
|
-
name: _t("Remove filter"),
|
|
19961
|
-
execute: (env) => {
|
|
19962
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
19963
|
-
env.model.dispatch("REMOVE_FILTER_TABLE", {
|
|
19964
|
-
sheetId,
|
|
19965
|
-
target: env.model.getters.getSelectedZones(),
|
|
19966
|
-
});
|
|
19967
|
-
},
|
|
19968
|
-
isVisible: SELECTION_CONTAINS_FILTER,
|
|
19969
|
-
icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
|
|
19970
|
-
};
|
|
19971
20281
|
const splitToColumns = {
|
|
19972
20282
|
name: _t("Split text to columns"),
|
|
19973
20283
|
sequence: 1,
|
|
@@ -20373,331 +20683,6 @@ var ACTION_FORMAT = /*#__PURE__*/Object.freeze({
|
|
|
20373
20683
|
textColor: textColor
|
|
20374
20684
|
});
|
|
20375
20685
|
|
|
20376
|
-
function interactiveFreezeColumnsRows(env, dimension, base) {
|
|
20377
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20378
|
-
const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
|
|
20379
|
-
const result = env.model.dispatch(cmd, { sheetId, quantity: base });
|
|
20380
|
-
if (result.isCancelledBecause("MergeOverlap" /* CommandResult.MergeOverlap */)) {
|
|
20381
|
-
env.raiseError(MergeErrorMessage);
|
|
20382
|
-
}
|
|
20383
|
-
}
|
|
20384
|
-
|
|
20385
|
-
const hideCols = {
|
|
20386
|
-
name: HIDE_COLUMNS_NAME,
|
|
20387
|
-
execute: (env) => {
|
|
20388
|
-
const columns = env.model.getters.getElementsFromSelection("COL");
|
|
20389
|
-
env.model.dispatch("HIDE_COLUMNS_ROWS", {
|
|
20390
|
-
sheetId: env.model.getters.getActiveSheetId(),
|
|
20391
|
-
dimension: "COL",
|
|
20392
|
-
elements: columns,
|
|
20393
|
-
});
|
|
20394
|
-
},
|
|
20395
|
-
isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
|
|
20396
|
-
icon: "o-spreadsheet-Icon.HIDE_COL",
|
|
20397
|
-
};
|
|
20398
|
-
const unhideCols = {
|
|
20399
|
-
name: _t("Unhide columns"),
|
|
20400
|
-
execute: (env) => {
|
|
20401
|
-
const columns = env.model.getters.getElementsFromSelection("COL");
|
|
20402
|
-
env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
20403
|
-
sheetId: env.model.getters.getActiveSheetId(),
|
|
20404
|
-
dimension: "COL",
|
|
20405
|
-
elements: columns,
|
|
20406
|
-
});
|
|
20407
|
-
},
|
|
20408
|
-
isVisible: (env) => {
|
|
20409
|
-
const hiddenCols = env.model.getters
|
|
20410
|
-
.getHiddenColsGroups(env.model.getters.getActiveSheetId())
|
|
20411
|
-
.flat();
|
|
20412
|
-
const currentCols = env.model.getters.getElementsFromSelection("COL");
|
|
20413
|
-
return currentCols.some((col) => hiddenCols.includes(col));
|
|
20414
|
-
},
|
|
20415
|
-
};
|
|
20416
|
-
const unhideAllCols = {
|
|
20417
|
-
name: _t("Unhide all columns"),
|
|
20418
|
-
execute: (env) => {
|
|
20419
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20420
|
-
env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
20421
|
-
sheetId,
|
|
20422
|
-
dimension: "COL",
|
|
20423
|
-
elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
|
|
20424
|
-
});
|
|
20425
|
-
},
|
|
20426
|
-
isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
|
|
20427
|
-
};
|
|
20428
|
-
const hideRows = {
|
|
20429
|
-
name: HIDE_ROWS_NAME,
|
|
20430
|
-
execute: (env) => {
|
|
20431
|
-
const rows = env.model.getters.getElementsFromSelection("ROW");
|
|
20432
|
-
env.model.dispatch("HIDE_COLUMNS_ROWS", {
|
|
20433
|
-
sheetId: env.model.getters.getActiveSheetId(),
|
|
20434
|
-
dimension: "ROW",
|
|
20435
|
-
elements: rows,
|
|
20436
|
-
});
|
|
20437
|
-
},
|
|
20438
|
-
isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
|
|
20439
|
-
icon: "o-spreadsheet-Icon.HIDE_ROW",
|
|
20440
|
-
};
|
|
20441
|
-
const unhideRows = {
|
|
20442
|
-
name: _t("Unhide rows"),
|
|
20443
|
-
execute: (env) => {
|
|
20444
|
-
const columns = env.model.getters.getElementsFromSelection("ROW");
|
|
20445
|
-
env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
20446
|
-
sheetId: env.model.getters.getActiveSheetId(),
|
|
20447
|
-
dimension: "ROW",
|
|
20448
|
-
elements: columns,
|
|
20449
|
-
});
|
|
20450
|
-
},
|
|
20451
|
-
isVisible: (env) => {
|
|
20452
|
-
const hiddenRows = env.model.getters
|
|
20453
|
-
.getHiddenRowsGroups(env.model.getters.getActiveSheetId())
|
|
20454
|
-
.flat();
|
|
20455
|
-
const currentRows = env.model.getters.getElementsFromSelection("ROW");
|
|
20456
|
-
return currentRows.some((col) => hiddenRows.includes(col));
|
|
20457
|
-
},
|
|
20458
|
-
};
|
|
20459
|
-
const unhideAllRows = {
|
|
20460
|
-
name: _t("Unhide all rows"),
|
|
20461
|
-
execute: (env) => {
|
|
20462
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20463
|
-
env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
|
|
20464
|
-
sheetId,
|
|
20465
|
-
dimension: "ROW",
|
|
20466
|
-
elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
|
|
20467
|
-
});
|
|
20468
|
-
},
|
|
20469
|
-
isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
|
|
20470
|
-
};
|
|
20471
|
-
const unFreezePane = {
|
|
20472
|
-
name: _t("Unfreeze"),
|
|
20473
|
-
isVisible: (env) => {
|
|
20474
|
-
const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
|
|
20475
|
-
return xSplit + ySplit > 0;
|
|
20476
|
-
},
|
|
20477
|
-
execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
|
|
20478
|
-
sheetId: env.model.getters.getActiveSheetId(),
|
|
20479
|
-
}),
|
|
20480
|
-
icon: "o-spreadsheet-Icon.UNFREEZE",
|
|
20481
|
-
};
|
|
20482
|
-
const freezePane = {
|
|
20483
|
-
name: _t("Freeze"),
|
|
20484
|
-
icon: "o-spreadsheet-Icon.FREEZE",
|
|
20485
|
-
};
|
|
20486
|
-
const unFreezeRows = {
|
|
20487
|
-
name: _t("No rows"),
|
|
20488
|
-
execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
|
|
20489
|
-
sheetId: env.model.getters.getActiveSheetId(),
|
|
20490
|
-
}),
|
|
20491
|
-
isReadonlyAllowed: true,
|
|
20492
|
-
isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
|
|
20493
|
-
};
|
|
20494
|
-
const freezeFirstRow = {
|
|
20495
|
-
name: _t("1 row"),
|
|
20496
|
-
execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
|
|
20497
|
-
isReadonlyAllowed: true,
|
|
20498
|
-
};
|
|
20499
|
-
const freezeSecondRow = {
|
|
20500
|
-
name: _t("2 rows"),
|
|
20501
|
-
execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
|
|
20502
|
-
isReadonlyAllowed: true,
|
|
20503
|
-
};
|
|
20504
|
-
const freezeCurrentRow = {
|
|
20505
|
-
name: _t("Up to current row"),
|
|
20506
|
-
execute: (env) => {
|
|
20507
|
-
const { bottom } = env.model.getters.getSelectedZone();
|
|
20508
|
-
interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
|
|
20509
|
-
},
|
|
20510
|
-
isReadonlyAllowed: true,
|
|
20511
|
-
};
|
|
20512
|
-
const unFreezeCols = {
|
|
20513
|
-
name: _t("No columns"),
|
|
20514
|
-
execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
|
|
20515
|
-
sheetId: env.model.getters.getActiveSheetId(),
|
|
20516
|
-
}),
|
|
20517
|
-
isReadonlyAllowed: true,
|
|
20518
|
-
isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
|
|
20519
|
-
};
|
|
20520
|
-
const freezeFirstCol = {
|
|
20521
|
-
name: _t("1 column"),
|
|
20522
|
-
execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
|
|
20523
|
-
isReadonlyAllowed: true,
|
|
20524
|
-
};
|
|
20525
|
-
const freezeSecondCol = {
|
|
20526
|
-
name: _t("2 columns"),
|
|
20527
|
-
execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
|
|
20528
|
-
isReadonlyAllowed: true,
|
|
20529
|
-
};
|
|
20530
|
-
const freezeCurrentCol = {
|
|
20531
|
-
name: _t("Up to current column"),
|
|
20532
|
-
execute: (env) => {
|
|
20533
|
-
const { right } = env.model.getters.getSelectedZone();
|
|
20534
|
-
interactiveFreezeColumnsRows(env, "COL", right + 1);
|
|
20535
|
-
},
|
|
20536
|
-
isReadonlyAllowed: true,
|
|
20537
|
-
};
|
|
20538
|
-
const viewGridlines = {
|
|
20539
|
-
name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
|
|
20540
|
-
? _t("Hide gridlines")
|
|
20541
|
-
: _t("Show gridlines"),
|
|
20542
|
-
execute: (env) => {
|
|
20543
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20544
|
-
env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
|
|
20545
|
-
sheetId,
|
|
20546
|
-
areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
|
|
20547
|
-
});
|
|
20548
|
-
},
|
|
20549
|
-
icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
|
|
20550
|
-
};
|
|
20551
|
-
const viewFormulas = {
|
|
20552
|
-
name: (env) => env.model.getters.shouldShowFormulas() ? "Hide formulas" : _t("Show formulas"),
|
|
20553
|
-
execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
|
|
20554
|
-
isReadonlyAllowed: true,
|
|
20555
|
-
icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
|
|
20556
|
-
};
|
|
20557
|
-
const createRemoveFilter = {
|
|
20558
|
-
name: (env) => selectionContainsFilter(env) ? _t("Remove selected filters") : _t("Create filter"),
|
|
20559
|
-
isActive: (env) => selectionContainsFilter(env),
|
|
20560
|
-
isEnabled: (env) => !cannotCreateFilter(env),
|
|
20561
|
-
execute: (env) => createRemoveFilterAction(env),
|
|
20562
|
-
icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
|
|
20563
|
-
};
|
|
20564
|
-
const groupColumns = {
|
|
20565
|
-
name: (env) => {
|
|
20566
|
-
const selection = env.model.getters.getSelectedZone();
|
|
20567
|
-
if (selection.left === selection.right) {
|
|
20568
|
-
return _t("Group column %s", numberToLetters(selection.left));
|
|
20569
|
-
}
|
|
20570
|
-
return _t("Group columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
|
|
20571
|
-
},
|
|
20572
|
-
execute: (env) => groupHeadersAction(env, "COL"),
|
|
20573
|
-
isVisible: (env) => {
|
|
20574
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20575
|
-
const selection = env.model.getters.getSelectedZone();
|
|
20576
|
-
const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "COL", selection);
|
|
20577
|
-
return (IS_ONLY_ONE_RANGE(env) &&
|
|
20578
|
-
!groups.some((group) => group.start === selection.left && group.end === selection.right));
|
|
20579
|
-
},
|
|
20580
|
-
icon: "o-spreadsheet-Icon.GROUP_COLUMNS",
|
|
20581
|
-
};
|
|
20582
|
-
const groupRows = {
|
|
20583
|
-
name: (env) => {
|
|
20584
|
-
const selection = env.model.getters.getSelectedZone();
|
|
20585
|
-
if (selection.top === selection.bottom) {
|
|
20586
|
-
return _t("Group row %s", String(selection.top + 1));
|
|
20587
|
-
}
|
|
20588
|
-
return _t("Group rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
|
|
20589
|
-
},
|
|
20590
|
-
execute: (env) => groupHeadersAction(env, "ROW"),
|
|
20591
|
-
isVisible: (env) => {
|
|
20592
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20593
|
-
const selection = env.model.getters.getSelectedZone();
|
|
20594
|
-
const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "ROW", selection);
|
|
20595
|
-
return (IS_ONLY_ONE_RANGE(env) &&
|
|
20596
|
-
!groups.some((group) => group.start === selection.top && group.end === selection.bottom));
|
|
20597
|
-
},
|
|
20598
|
-
icon: "o-spreadsheet-Icon.GROUP_ROWS",
|
|
20599
|
-
};
|
|
20600
|
-
const ungroupColumns = {
|
|
20601
|
-
name: (env) => {
|
|
20602
|
-
const selection = env.model.getters.getSelectedZone();
|
|
20603
|
-
if (selection.left === selection.right) {
|
|
20604
|
-
return _t("Ungroup column %s", numberToLetters(selection.left));
|
|
20605
|
-
}
|
|
20606
|
-
return _t("Ungroup columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
|
|
20607
|
-
},
|
|
20608
|
-
execute: (env) => ungroupHeaders(env, "COL"),
|
|
20609
|
-
icon: "o-spreadsheet-Icon.UNGROUP_COLUMNS",
|
|
20610
|
-
};
|
|
20611
|
-
const ungroupRows = {
|
|
20612
|
-
name: (env) => {
|
|
20613
|
-
const selection = env.model.getters.getSelectedZone();
|
|
20614
|
-
if (selection.top === selection.bottom) {
|
|
20615
|
-
return _t("Ungroup row %s", String(selection.top + 1));
|
|
20616
|
-
}
|
|
20617
|
-
return _t("Ungroup rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
|
|
20618
|
-
},
|
|
20619
|
-
execute: (env) => ungroupHeaders(env, "ROW"),
|
|
20620
|
-
icon: "o-spreadsheet-Icon.UNGROUP_ROWS",
|
|
20621
|
-
};
|
|
20622
|
-
function selectionContainsFilter(env) {
|
|
20623
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20624
|
-
const selectedZones = env.model.getters.getSelectedZones();
|
|
20625
|
-
return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
|
|
20626
|
-
}
|
|
20627
|
-
function cannotCreateFilter(env) {
|
|
20628
|
-
return !areZonesContinuous(...env.model.getters.getSelectedZones());
|
|
20629
|
-
}
|
|
20630
|
-
function createRemoveFilterAction(env) {
|
|
20631
|
-
if (selectionContainsFilter(env)) {
|
|
20632
|
-
env.model.dispatch("REMOVE_FILTER_TABLE", {
|
|
20633
|
-
sheetId: env.model.getters.getActiveSheetId(),
|
|
20634
|
-
target: env.model.getters.getSelectedZones(),
|
|
20635
|
-
});
|
|
20636
|
-
return;
|
|
20637
|
-
}
|
|
20638
|
-
if (cannotCreateFilter(env)) {
|
|
20639
|
-
return;
|
|
20640
|
-
}
|
|
20641
|
-
env.model.selection.selectTableAroundSelection();
|
|
20642
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20643
|
-
const selection = env.model.getters.getSelectedZones();
|
|
20644
|
-
interactiveAddFilter(env, sheetId, selection);
|
|
20645
|
-
}
|
|
20646
|
-
function groupHeadersAction(env, dim) {
|
|
20647
|
-
const selection = env.model.getters.getSelectedZone();
|
|
20648
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20649
|
-
env.model.dispatch("GROUP_HEADERS", {
|
|
20650
|
-
sheetId,
|
|
20651
|
-
dimension: dim,
|
|
20652
|
-
start: dim === "COL" ? selection.left : selection.top,
|
|
20653
|
-
end: dim === "COL" ? selection.right : selection.bottom,
|
|
20654
|
-
});
|
|
20655
|
-
}
|
|
20656
|
-
function ungroupHeaders(env, dim) {
|
|
20657
|
-
const selection = env.model.getters.getSelectedZone();
|
|
20658
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20659
|
-
env.model.dispatch("UNGROUP_HEADERS", {
|
|
20660
|
-
sheetId,
|
|
20661
|
-
dimension: dim,
|
|
20662
|
-
start: dim === "COL" ? selection.left : selection.top,
|
|
20663
|
-
end: dim === "COL" ? selection.right : selection.bottom,
|
|
20664
|
-
});
|
|
20665
|
-
}
|
|
20666
|
-
function canUngroupHeaders(env, dimension) {
|
|
20667
|
-
const sheetId = env.model.getters.getActiveSheetId();
|
|
20668
|
-
const selection = env.model.getters.getSelectedZones();
|
|
20669
|
-
return (selection.length === 1 &&
|
|
20670
|
-
env.model.getters.getHeaderGroupsInZone(sheetId, dimension, selection[0]).length > 0);
|
|
20671
|
-
}
|
|
20672
|
-
|
|
20673
|
-
var ACTION_VIEW = /*#__PURE__*/Object.freeze({
|
|
20674
|
-
__proto__: null,
|
|
20675
|
-
canUngroupHeaders: canUngroupHeaders,
|
|
20676
|
-
createRemoveFilter: createRemoveFilter,
|
|
20677
|
-
freezeCurrentCol: freezeCurrentCol,
|
|
20678
|
-
freezeCurrentRow: freezeCurrentRow,
|
|
20679
|
-
freezeFirstCol: freezeFirstCol,
|
|
20680
|
-
freezeFirstRow: freezeFirstRow,
|
|
20681
|
-
freezePane: freezePane,
|
|
20682
|
-
freezeSecondCol: freezeSecondCol,
|
|
20683
|
-
freezeSecondRow: freezeSecondRow,
|
|
20684
|
-
groupColumns: groupColumns,
|
|
20685
|
-
groupRows: groupRows,
|
|
20686
|
-
hideCols: hideCols,
|
|
20687
|
-
hideRows: hideRows,
|
|
20688
|
-
unFreezeCols: unFreezeCols,
|
|
20689
|
-
unFreezePane: unFreezePane,
|
|
20690
|
-
unFreezeRows: unFreezeRows,
|
|
20691
|
-
ungroupColumns: ungroupColumns,
|
|
20692
|
-
ungroupRows: ungroupRows,
|
|
20693
|
-
unhideAllCols: unhideAllCols,
|
|
20694
|
-
unhideAllRows: unhideAllRows,
|
|
20695
|
-
unhideCols: unhideCols,
|
|
20696
|
-
unhideRows: unhideRows,
|
|
20697
|
-
viewFormulas: viewFormulas,
|
|
20698
|
-
viewGridlines: viewGridlines
|
|
20699
|
-
});
|
|
20700
|
-
|
|
20701
20686
|
const colMenuRegistry = new MenuItemRegistry();
|
|
20702
20687
|
colMenuRegistry
|
|
20703
20688
|
.add("cut", {
|
|
@@ -21340,13 +21325,8 @@ topbarMenuRegistry
|
|
|
21340
21325
|
sequence: 30,
|
|
21341
21326
|
separator: true,
|
|
21342
21327
|
})
|
|
21343
|
-
.addChild("
|
|
21344
|
-
...
|
|
21345
|
-
sequence: 40,
|
|
21346
|
-
separator: true,
|
|
21347
|
-
})
|
|
21348
|
-
.addChild("remove_data_filter", ["data"], {
|
|
21349
|
-
...removeDataFilter,
|
|
21328
|
+
.addChild("add_remove_data_filter", ["data"], {
|
|
21329
|
+
...addRemoveDataFilter,
|
|
21350
21330
|
sequence: 40,
|
|
21351
21331
|
separator: true,
|
|
21352
21332
|
});
|
|
@@ -26686,17 +26666,13 @@ class Composer extends Component {
|
|
|
26686
26666
|
this.env.focusableElement.setFocusableElement(el);
|
|
26687
26667
|
}
|
|
26688
26668
|
this.contentHelper.updateEl(el);
|
|
26689
|
-
this.processTokenAtCursor();
|
|
26690
26669
|
});
|
|
26691
26670
|
useEffect(() => {
|
|
26692
26671
|
this.processContent();
|
|
26693
26672
|
});
|
|
26694
|
-
|
|
26695
|
-
|
|
26696
|
-
|
|
26697
|
-
this.processTokenAtCursor();
|
|
26698
|
-
}
|
|
26699
|
-
});
|
|
26673
|
+
useEffect(() => {
|
|
26674
|
+
this.processTokenAtCursor();
|
|
26675
|
+
}, () => [this.env.model.getters.getEditionMode() !== "inactive"]);
|
|
26700
26676
|
}
|
|
26701
26677
|
// ---------------------------------------------------------------------------
|
|
26702
26678
|
// Handlers
|
|
@@ -27127,6 +27103,7 @@ class Composer extends Component {
|
|
|
27127
27103
|
const dataValidationAutocompleteValues = this.env.model.getters.getAutoCompleteDataValidationValues();
|
|
27128
27104
|
if (!content.startsWith("=") && dataValidationAutocompleteValues.length) {
|
|
27129
27105
|
this.showDataValidationAutocomplete(dataValidationAutocompleteValues);
|
|
27106
|
+
return;
|
|
27130
27107
|
}
|
|
27131
27108
|
if (content.startsWith("=")) {
|
|
27132
27109
|
const token = this.env.model.getters.getTokenAtCursor();
|
|
@@ -27849,6 +27826,10 @@ css /*SCSS*/ `
|
|
|
27849
27826
|
height: 0px;
|
|
27850
27827
|
}
|
|
27851
27828
|
}
|
|
27829
|
+
.o-figure-container {
|
|
27830
|
+
-webkit-user-select: none; // safari
|
|
27831
|
+
user-select: none;
|
|
27832
|
+
}
|
|
27852
27833
|
`;
|
|
27853
27834
|
/**
|
|
27854
27835
|
* Each figure ⭐ is positioned inside a container `div` placed and sized
|
|
@@ -34382,7 +34363,7 @@ class BordersPlugin extends CorePlugin {
|
|
|
34382
34363
|
this.clearBorders(cmd.sheetId, cmd.target);
|
|
34383
34364
|
break;
|
|
34384
34365
|
case "REMOVE_COLUMNS_ROWS":
|
|
34385
|
-
for (let el of cmd.elements) {
|
|
34366
|
+
for (let el of [...cmd.elements].sort((a, b) => b - a)) {
|
|
34386
34367
|
if (cmd.dimension === "COL") {
|
|
34387
34368
|
this.shiftBordersHorizontally(cmd.sheetId, el + 1, -1);
|
|
34388
34369
|
}
|
|
@@ -40162,6 +40143,353 @@ class CompilationParametersBuilder {
|
|
|
40162
40143
|
}
|
|
40163
40144
|
}
|
|
40164
40145
|
|
|
40146
|
+
/**
|
|
40147
|
+
* ####################################################
|
|
40148
|
+
* # INTRODUCTION
|
|
40149
|
+
* ####################################################
|
|
40150
|
+
*
|
|
40151
|
+
* This file contain the function recomputeZones.
|
|
40152
|
+
* This function try to recompute in a performant way
|
|
40153
|
+
* an ensemble of zones possibly overlapping to avoid
|
|
40154
|
+
* overlapping and to reduce the number of zones.
|
|
40155
|
+
*
|
|
40156
|
+
* It also allows to remove some zones from the ensemble.
|
|
40157
|
+
*
|
|
40158
|
+
* In the following example, 2 zones are overlapping.
|
|
40159
|
+
* Applying recomputeZones will return zones without
|
|
40160
|
+
* overlapping:
|
|
40161
|
+
*
|
|
40162
|
+
* ["B3:D4", "D2:E3"] ["B3:C4", "D2:D4", "E2:E3"]
|
|
40163
|
+
*
|
|
40164
|
+
* A B C D E A B C D E
|
|
40165
|
+
* 1 ___ 1 ___
|
|
40166
|
+
* 2 ___|_ | 2 ___| | |
|
|
40167
|
+
* 3 | |_|_| ---> 3 | | |_|
|
|
40168
|
+
* 4 |_____| 4 |___|_|
|
|
40169
|
+
* 6 6
|
|
40170
|
+
* 7 7
|
|
40171
|
+
*
|
|
40172
|
+
*
|
|
40173
|
+
* In the following example, 2 zones are contiguous.
|
|
40174
|
+
* Applying recomputeZones will return only one zone:
|
|
40175
|
+
*
|
|
40176
|
+
* ["B2:B3", "C2:D3"] ["B2:D3"]
|
|
40177
|
+
*
|
|
40178
|
+
* A B C D E A B C D E
|
|
40179
|
+
* 1 _ ___ 1 _____
|
|
40180
|
+
* 2 | | | ---> 2 | |
|
|
40181
|
+
* 3 |_|___| 3 |_____|
|
|
40182
|
+
* 4 4
|
|
40183
|
+
*
|
|
40184
|
+
*
|
|
40185
|
+
* In the following example, we want to remove a zone
|
|
40186
|
+
* from the ensemble. Applying recomputeZones will
|
|
40187
|
+
* return the ensemble without the zone to remove:
|
|
40188
|
+
*
|
|
40189
|
+
* remove ["C3:D3"] ["B2:B4", "C2:D2",
|
|
40190
|
+
* "C4:D4", "E2:E4"]
|
|
40191
|
+
*
|
|
40192
|
+
* A B C D E F A B C D E F
|
|
40193
|
+
* 1 _______ 1 _______
|
|
40194
|
+
* 2 | | ---> 2 | |___| |
|
|
40195
|
+
* 3 | xxx | 3 | |___| |
|
|
40196
|
+
* 4 |_______| 4 |_|___|_|
|
|
40197
|
+
* 5 5
|
|
40198
|
+
*
|
|
40199
|
+
*
|
|
40200
|
+
* The exercise seems simple when we have only 2 zones.
|
|
40201
|
+
* But with n zones and in a performant way, we want to
|
|
40202
|
+
* avoid comparing each zone with all the others.
|
|
40203
|
+
*
|
|
40204
|
+
*
|
|
40205
|
+
* ####################################################
|
|
40206
|
+
* # Methodological approach
|
|
40207
|
+
* ####################################################
|
|
40208
|
+
*
|
|
40209
|
+
* The methodological approach to avoid comparing each
|
|
40210
|
+
* zone with all the others is to use a data structure
|
|
40211
|
+
* that allow to quickly find which zones are
|
|
40212
|
+
* overlapping with any other given zone.
|
|
40213
|
+
*
|
|
40214
|
+
* Here the idea is to profile the zones at the columns level.
|
|
40215
|
+
*
|
|
40216
|
+
* To do that, we propose to use a data structure
|
|
40217
|
+
* composed of 2 parts:
|
|
40218
|
+
* - profilesStartingPosition: a sorted number array
|
|
40219
|
+
* indicating on which columns a new profile begins.
|
|
40220
|
+
* - profiles: a map where the key is a column
|
|
40221
|
+
* position (from profilesStartingPosition) and the
|
|
40222
|
+
* value is a sorted number array representing a
|
|
40223
|
+
* profile.
|
|
40224
|
+
*
|
|
40225
|
+
*
|
|
40226
|
+
* See the following example: here profileStartingPosition
|
|
40227
|
+
* corresponds to [A,C,E,G,K]
|
|
40228
|
+
* A B C D E F G H I J K so with number [0,2,4,6,10]
|
|
40229
|
+
* 1 ' ' ' '
|
|
40230
|
+
* 2 ' ' '_______' here profile correspond
|
|
40231
|
+
* 3 '___' |_______| for A to []
|
|
40232
|
+
* 4 | | for C to [3, 5]
|
|
40233
|
+
* 5 |___| for E to []
|
|
40234
|
+
* 6 for G to [2, 3]
|
|
40235
|
+
* 7 for K to []
|
|
40236
|
+
*
|
|
40237
|
+
*
|
|
40238
|
+
* Now we can easily find which zones are overlapping
|
|
40239
|
+
* with a given zone. Suppose we want to add a new zone
|
|
40240
|
+
* D5:H6 to the ensemble:
|
|
40241
|
+
*
|
|
40242
|
+
* With a binary search of left and right
|
|
40243
|
+
* A B C D E F G H I J K on profilesStartingPosition, we can
|
|
40244
|
+
* 1 ' ' ' ' find the indexes of the profiles on which
|
|
40245
|
+
* 2 ' ' '_______' to apply a modification.
|
|
40246
|
+
* 3 '___' |_______|
|
|
40247
|
+
* 4 | _|_______ Here we will:
|
|
40248
|
+
* 5 |_|_| | - add a new profile in D --> become [3, 6]
|
|
40249
|
+
* 6 |_________| - modify the profile in E --> become [4, 6]
|
|
40250
|
+
* 7 - modify the profile in G --> become [2, 3, 4, 6]
|
|
40251
|
+
* - add a new profile in I --> become [8, 10]
|
|
40252
|
+
*
|
|
40253
|
+
* See below the result:
|
|
40254
|
+
*
|
|
40255
|
+
* Note the particularity of the profile
|
|
40256
|
+
* A B C D E F G H I J K for G: it will correspond to [2, 3, 4, 6]
|
|
40257
|
+
* 1 ' ' ' ' ' '
|
|
40258
|
+
* 2 ' ' ' '___'___' To know how to modify the profile (add a
|
|
40259
|
+
* 3 '_'_' |___|___| zone or remove it) we do a binary
|
|
40260
|
+
* 4 | | |___ ___ search of the top and bottom value on the
|
|
40261
|
+
* 5 |_| | | | profile array. Depending on the result index
|
|
40262
|
+
* 6 |_|___|___| parity (odd or even), because zone boundaries
|
|
40263
|
+
* 7 go by pairs, we know if we are in a zone or
|
|
40264
|
+
* not and how operate.
|
|
40265
|
+
*/
|
|
40266
|
+
/**
|
|
40267
|
+
* Recompute the zone without the cells in toRemoveZones and avoid overlapping.
|
|
40268
|
+
* This compute is particularly useful because after this function:
|
|
40269
|
+
* - you will find coordinate of a cell only once among all the zones
|
|
40270
|
+
* - the number of zones will be reduced to the minimum
|
|
40271
|
+
*/
|
|
40272
|
+
function futureRecomputeZones(zones, zonesToRemove = []) {
|
|
40273
|
+
const profilesStartingPosition = [0];
|
|
40274
|
+
const profiles = new Map([[0, []]]);
|
|
40275
|
+
modifyProfiles(profilesStartingPosition, profiles, zones, false);
|
|
40276
|
+
modifyProfiles(profilesStartingPosition, profiles, zonesToRemove, true);
|
|
40277
|
+
return constructZonesFromProfiles(profilesStartingPosition, profiles);
|
|
40278
|
+
}
|
|
40279
|
+
function modifyProfiles(// export for testing only
|
|
40280
|
+
profilesStartingPosition, profiles, zones, toRemove = false) {
|
|
40281
|
+
for (const zone of zones) {
|
|
40282
|
+
const leftValue = zone.left;
|
|
40283
|
+
const rightValue = zone.right === undefined ? undefined : zone.right + 1;
|
|
40284
|
+
const leftIndex = findIndexAndCreateProfile(profilesStartingPosition, profiles, leftValue, true, 0);
|
|
40285
|
+
const rightIndex = findIndexAndCreateProfile(profilesStartingPosition, profiles, rightValue, false, leftIndex);
|
|
40286
|
+
for (let i = leftIndex; i <= rightIndex; i++) {
|
|
40287
|
+
const profile = profiles.get(profilesStartingPosition[i]);
|
|
40288
|
+
modifyProfile(profile, zone, toRemove);
|
|
40289
|
+
}
|
|
40290
|
+
// maybe this part cost in performance, and maybe it's not necessary (depending on the use case). To be checked
|
|
40291
|
+
removeContiguousProfiles(profilesStartingPosition, profiles, leftIndex, rightIndex);
|
|
40292
|
+
}
|
|
40293
|
+
}
|
|
40294
|
+
function findIndexAndCreateProfile(profilesStartingPosition, profiles, value, searchLeft, startIndex) {
|
|
40295
|
+
if (value === undefined) {
|
|
40296
|
+
// this is only the case when the value correspond to a bottom value that could be undefined
|
|
40297
|
+
return profilesStartingPosition.length - 1;
|
|
40298
|
+
}
|
|
40299
|
+
const predecessorIndex = binaryPredecessorSearch(profilesStartingPosition, value, startIndex);
|
|
40300
|
+
if (value != profilesStartingPosition[predecessorIndex]) {
|
|
40301
|
+
// mean that the value is not ending/starting at the same position as the previous/next profile
|
|
40302
|
+
// --> it's a new profile
|
|
40303
|
+
// --> we need to add it
|
|
40304
|
+
profilesStartingPosition.splice(predecessorIndex + 1, 0, value);
|
|
40305
|
+
// suppose the we want to add the for the left value
|
|
40306
|
+
// following profile following zone: 'C', the predecessor index
|
|
40307
|
+
// for B: [1, 3] "C3:D4" correspond to 'B'.
|
|
40308
|
+
// The next line code will
|
|
40309
|
+
// A B C D A B C D copy the profile of 'B'
|
|
40310
|
+
// 1 '___' 1 '___' to 'C'. In the rest of the
|
|
40311
|
+
// 2 | | ---> 2 | _|_ process the 'modifyProfile'
|
|
40312
|
+
// 3 |___| 3 |_|_| | function will adapt the waiting
|
|
40313
|
+
// 4 4 |___| 'C' profile [1, 3] to the
|
|
40314
|
+
// correct 'C' profile [1, 4]
|
|
40315
|
+
profiles.set(value, [...profiles.get(profilesStartingPosition[predecessorIndex])]);
|
|
40316
|
+
return searchLeft ? predecessorIndex + 1 : predecessorIndex;
|
|
40317
|
+
}
|
|
40318
|
+
return searchLeft ? predecessorIndex : predecessorIndex - 1;
|
|
40319
|
+
}
|
|
40320
|
+
/**
|
|
40321
|
+
* Suppose the following Suppose we want to add We want to have the
|
|
40322
|
+
* profile: the following zone: following profile:
|
|
40323
|
+
*
|
|
40324
|
+
* A B C D E F A B C D E F A B C D E F
|
|
40325
|
+
* 1 '___' 1 ' ' 1 '___'
|
|
40326
|
+
* 2 |___| 2 '___' 2 | |
|
|
40327
|
+
* 3 ' ' 3 | | 3 | |
|
|
40328
|
+
* 4 '___' --> 4 | | --> 4 | |
|
|
40329
|
+
* 6 | | 6 |___| 6 | |
|
|
40330
|
+
* 7 |___| 7 7 |___|
|
|
40331
|
+
* 8 8 8
|
|
40332
|
+
*
|
|
40333
|
+
* the profile for 'C' the top zone correspond Here [2, 3, 5, 8] with [3, 7]
|
|
40334
|
+
* corresponds to: to 3 and the bottom zone would be merged into [2, 8]
|
|
40335
|
+
* ____ ____ correspond to 6
|
|
40336
|
+
* [2, 3, 5, 8] would be the profile: The difficulty of modify profile
|
|
40337
|
+
* ____ is to know what must be deleted
|
|
40338
|
+
* Note that the 'filled [3, 7] and what must be added to the
|
|
40339
|
+
* zone' are always between existing profile.
|
|
40340
|
+
* an even index and its
|
|
40341
|
+
* next index
|
|
40342
|
+
*
|
|
40343
|
+
*/
|
|
40344
|
+
function modifyProfile(profile, zone, toRemove = false) {
|
|
40345
|
+
const topValue = zone.top;
|
|
40346
|
+
const bottomValue = zone.bottom === undefined ? undefined : zone.bottom + 1;
|
|
40347
|
+
const newPoints = [];
|
|
40348
|
+
// Case we want to add a zone to the profile:
|
|
40349
|
+
// - If the top predecessor index `topPredIndex` is even, it means the top of the zone is already positioned on a filled zone
|
|
40350
|
+
// so we don't need to add it to the profile. we can keep in reference the index of the predecessor.
|
|
40351
|
+
// - If it is odd, it means the top of the zone must be the beginning of a filled zone.
|
|
40352
|
+
// so we can keep the index of the top position
|
|
40353
|
+
// Case we want to remove a zone from the profile: it's the opposite of the previous case
|
|
40354
|
+
const topPredIndex = binaryPredecessorSearch(profile, topValue, 0, false);
|
|
40355
|
+
if ((topPredIndex % 2 !== 0 && !toRemove) || (topPredIndex % 2 === 0 && toRemove)) {
|
|
40356
|
+
newPoints.push(topValue);
|
|
40357
|
+
}
|
|
40358
|
+
if (bottomValue === undefined) {
|
|
40359
|
+
// The following two code lines will not impact the final result,
|
|
40360
|
+
// but they will impact the intermediate profile.
|
|
40361
|
+
// We keep them for performance reason
|
|
40362
|
+
profile.splice(topPredIndex + 1);
|
|
40363
|
+
profile.push(...newPoints);
|
|
40364
|
+
return;
|
|
40365
|
+
}
|
|
40366
|
+
// Case we want to add a zone to the profile:
|
|
40367
|
+
// - If the bottom successor index `bottomSuccIndex` is even, it means the bottom of the zone must be the ending of a filled zone
|
|
40368
|
+
// so we can keep the index of the bottom position.
|
|
40369
|
+
// - If it is odd, it means the bottom of the zone is already positioned on a filled zone
|
|
40370
|
+
// so we don't need to add it to the profile. we can keep in reference the index of the successor
|
|
40371
|
+
// Case we want to remove a zone from the profile: it's the opposite of the previous case
|
|
40372
|
+
const bottomSuccIndex = binarySuccessorSearch(profile, bottomValue, 0, false);
|
|
40373
|
+
if ((bottomSuccIndex % 2 === 0 && !toRemove) || (bottomSuccIndex % 2 !== 0 && toRemove)) {
|
|
40374
|
+
newPoints.push(bottomValue);
|
|
40375
|
+
}
|
|
40376
|
+
// add the top and bottom value to the profile and
|
|
40377
|
+
// remove all information between the top and bottom index
|
|
40378
|
+
profile.splice(topPredIndex + 1, bottomSuccIndex - topPredIndex - 1, ...newPoints);
|
|
40379
|
+
}
|
|
40380
|
+
function removeContiguousProfiles(profilesStartingPosition, profiles, leftIndex, rightIndex) {
|
|
40381
|
+
const start = leftIndex - 1 === -1 ? 0 : leftIndex - 1;
|
|
40382
|
+
const end = rightIndex === profilesStartingPosition.length - 1 ? rightIndex : rightIndex + 1;
|
|
40383
|
+
for (let i = end; i > start; i--) {
|
|
40384
|
+
if (deepEqualsArray(profiles.get(profilesStartingPosition[i]), profiles.get(profilesStartingPosition[i - 1]))) {
|
|
40385
|
+
profiles.delete(profilesStartingPosition[i]);
|
|
40386
|
+
profilesStartingPosition.splice(i, 1);
|
|
40387
|
+
}
|
|
40388
|
+
}
|
|
40389
|
+
}
|
|
40390
|
+
function constructZonesFromProfiles(profilesStartingPosition, profiles) {
|
|
40391
|
+
const mergedZone = [];
|
|
40392
|
+
let pendingZones = [];
|
|
40393
|
+
for (let colIndex = 0; colIndex < profilesStartingPosition.length; colIndex++) {
|
|
40394
|
+
const left = profilesStartingPosition[colIndex];
|
|
40395
|
+
const profile = profiles.get(left);
|
|
40396
|
+
if (!profile || profile.length === 0) {
|
|
40397
|
+
mergedZone.push(...pendingZones);
|
|
40398
|
+
pendingZones = [];
|
|
40399
|
+
continue;
|
|
40400
|
+
}
|
|
40401
|
+
let right = profilesStartingPosition[colIndex + 1];
|
|
40402
|
+
if (right !== undefined) {
|
|
40403
|
+
right--;
|
|
40404
|
+
}
|
|
40405
|
+
const nextPendingZones = [];
|
|
40406
|
+
for (let i = 0; i < profile.length; i += 2) {
|
|
40407
|
+
const top = profile[i];
|
|
40408
|
+
let bottom = profile[i + 1];
|
|
40409
|
+
if (bottom !== undefined) {
|
|
40410
|
+
bottom--;
|
|
40411
|
+
}
|
|
40412
|
+
const profileZone = {
|
|
40413
|
+
top,
|
|
40414
|
+
left,
|
|
40415
|
+
bottom,
|
|
40416
|
+
right,
|
|
40417
|
+
hasHeader: (bottom === undefined && top !== 0) || (right === undefined && left !== 0),
|
|
40418
|
+
};
|
|
40419
|
+
let findCorrespondingZone = false;
|
|
40420
|
+
for (let j = pendingZones.length - 1; j >= 0; j--) {
|
|
40421
|
+
const pendingZone = pendingZones[j];
|
|
40422
|
+
if (pendingZone.top === profileZone.top && pendingZone.bottom === profileZone.bottom) {
|
|
40423
|
+
pendingZone.right = profileZone.right;
|
|
40424
|
+
pendingZones.splice(j, 1);
|
|
40425
|
+
nextPendingZones.push(pendingZone);
|
|
40426
|
+
findCorrespondingZone = true;
|
|
40427
|
+
break;
|
|
40428
|
+
}
|
|
40429
|
+
}
|
|
40430
|
+
if (!findCorrespondingZone) {
|
|
40431
|
+
nextPendingZones.push(profileZone);
|
|
40432
|
+
}
|
|
40433
|
+
}
|
|
40434
|
+
mergedZone.push(...pendingZones);
|
|
40435
|
+
pendingZones = nextPendingZones;
|
|
40436
|
+
}
|
|
40437
|
+
mergedZone.push(...pendingZones);
|
|
40438
|
+
return mergedZone;
|
|
40439
|
+
}
|
|
40440
|
+
function binaryPredecessorSearch(arr, val, start = 0, matchEqual = true) {
|
|
40441
|
+
let end = arr.length - 1;
|
|
40442
|
+
let result = -1;
|
|
40443
|
+
while (start <= end) {
|
|
40444
|
+
const mid = Math.floor((start + end) / 2);
|
|
40445
|
+
if (arr[mid] === val && matchEqual) {
|
|
40446
|
+
return mid;
|
|
40447
|
+
}
|
|
40448
|
+
else if (arr[mid] < val) {
|
|
40449
|
+
result = mid;
|
|
40450
|
+
start = mid + 1;
|
|
40451
|
+
}
|
|
40452
|
+
else {
|
|
40453
|
+
end = mid - 1;
|
|
40454
|
+
}
|
|
40455
|
+
}
|
|
40456
|
+
return result;
|
|
40457
|
+
}
|
|
40458
|
+
function binarySuccessorSearch(arr, val, start = 0, matchEqual = true) {
|
|
40459
|
+
let end = arr.length - 1;
|
|
40460
|
+
let result = arr.length;
|
|
40461
|
+
while (start <= end) {
|
|
40462
|
+
const mid = Math.floor((start + end) / 2);
|
|
40463
|
+
if (arr[mid] === val && matchEqual) {
|
|
40464
|
+
return mid;
|
|
40465
|
+
}
|
|
40466
|
+
else if (arr[mid] > val) {
|
|
40467
|
+
result = mid;
|
|
40468
|
+
end = mid - 1;
|
|
40469
|
+
}
|
|
40470
|
+
else {
|
|
40471
|
+
start = mid + 1;
|
|
40472
|
+
}
|
|
40473
|
+
}
|
|
40474
|
+
return result;
|
|
40475
|
+
}
|
|
40476
|
+
/**
|
|
40477
|
+
* Compares two arrays.
|
|
40478
|
+
* For performance reasons, this function is to be preferred
|
|
40479
|
+
* to 'deepEquals' in the case we know that the inputs are arrays.
|
|
40480
|
+
*/
|
|
40481
|
+
function deepEqualsArray(arr1, arr2) {
|
|
40482
|
+
if (arr1.length !== arr2.length) {
|
|
40483
|
+
return false;
|
|
40484
|
+
}
|
|
40485
|
+
for (let i = 0; i < arr1.length; i++) {
|
|
40486
|
+
if (!deepEquals(arr1[i], arr2[i])) {
|
|
40487
|
+
return false;
|
|
40488
|
+
}
|
|
40489
|
+
}
|
|
40490
|
+
return true;
|
|
40491
|
+
}
|
|
40492
|
+
|
|
40165
40493
|
function quickselect(arr, k, left, right, compare) {
|
|
40166
40494
|
quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
|
|
40167
40495
|
}
|
|
@@ -40925,7 +41253,7 @@ class FormulaDependencyGraph {
|
|
|
40925
41253
|
}
|
|
40926
41254
|
}
|
|
40927
41255
|
/**
|
|
40928
|
-
* Return the
|
|
41256
|
+
* Return all the cells that depend on the provided ranges,
|
|
40929
41257
|
* in the correct order they should be evaluated.
|
|
40930
41258
|
* This is called a topological ordering (excluding cycles)
|
|
40931
41259
|
*/
|
|
@@ -40936,11 +41264,20 @@ class FormulaDependencyGraph {
|
|
|
40936
41264
|
const range = queue.pop();
|
|
40937
41265
|
visited.addMany(this.encoder.encodeBoundingBox(range));
|
|
40938
41266
|
const impactedPositionIds = this.rTree.search(range).map((dep) => dep.data);
|
|
41267
|
+
const nextInQueue = {};
|
|
40939
41268
|
for (const positionId of impactedPositionIds) {
|
|
40940
41269
|
if (!visited.has(positionId)) {
|
|
40941
|
-
|
|
41270
|
+
const { sheetId, zone } = this.encoder.decodeToBoundingBox(positionId);
|
|
41271
|
+
if (!nextInQueue[sheetId]) {
|
|
41272
|
+
nextInQueue[sheetId] = [];
|
|
41273
|
+
}
|
|
41274
|
+
nextInQueue[sheetId].push(zone);
|
|
40942
41275
|
}
|
|
40943
41276
|
}
|
|
41277
|
+
for (const sheetId in nextInQueue) {
|
|
41278
|
+
const zones = futureRecomputeZones(nextInQueue[sheetId]);
|
|
41279
|
+
queue.push(...zones.map((zone) => ({ sheetId, zone })));
|
|
41280
|
+
}
|
|
40944
41281
|
}
|
|
40945
41282
|
visited.deleteMany(ranges.flatMap((r) => this.encoder.encodeBoundingBox(r)));
|
|
40946
41283
|
return visited;
|
|
@@ -41096,7 +41433,7 @@ class Evaluator {
|
|
|
41096
41433
|
}
|
|
41097
41434
|
if (!content) {
|
|
41098
41435
|
// The previous content could have blocked some array formulas
|
|
41099
|
-
impactedPositionIds.addMany(this.
|
|
41436
|
+
impactedPositionIds.addMany(this.getArrayFormulasBlockedBy(positionId));
|
|
41100
41437
|
}
|
|
41101
41438
|
}
|
|
41102
41439
|
return impactedPositionIds;
|
|
@@ -41141,13 +41478,22 @@ class Evaluator {
|
|
|
41141
41478
|
}
|
|
41142
41479
|
return positionIds;
|
|
41143
41480
|
}
|
|
41144
|
-
|
|
41481
|
+
/**
|
|
41482
|
+
* Return the position of formulas blocked by the given position
|
|
41483
|
+
* as well as all their dependencies.
|
|
41484
|
+
*/
|
|
41485
|
+
getArrayFormulasBlockedBy(positionId) {
|
|
41145
41486
|
if (!this.spreadingRelations.hasArrayFormulaResult(positionId)) {
|
|
41146
41487
|
return [];
|
|
41147
41488
|
}
|
|
41148
41489
|
const arrayFormulas = this.spreadingRelations.getFormulaPositionsSpreadingOn(positionId);
|
|
41149
41490
|
const cells = new JetSet(arrayFormulas);
|
|
41150
|
-
|
|
41491
|
+
const arrayFormulaPositionId = this.getArrayFormulaSpreadingOnId(positionId);
|
|
41492
|
+
if (arrayFormulaPositionId) {
|
|
41493
|
+
// ignore the formula spreading on the position. Keep only the blocked ones
|
|
41494
|
+
cells.delete(arrayFormulaPositionId);
|
|
41495
|
+
}
|
|
41496
|
+
cells.addMany(this.getCellsDependingOn(cells));
|
|
41151
41497
|
return cells;
|
|
41152
41498
|
}
|
|
41153
41499
|
nextPositionsToUpdate = new JetSet();
|
|
@@ -41312,7 +41658,7 @@ class Evaluator {
|
|
|
41312
41658
|
}
|
|
41313
41659
|
this.evaluatedCells.delete(child);
|
|
41314
41660
|
this.nextPositionsToUpdate.addMany(this.getCellsDependingOn([child]));
|
|
41315
|
-
this.nextPositionsToUpdate.addMany(this.
|
|
41661
|
+
this.nextPositionsToUpdate.addMany(this.getArrayFormulasBlockedBy(child));
|
|
41316
41662
|
}
|
|
41317
41663
|
this.spreadingRelations.removeNode(positionId);
|
|
41318
41664
|
}
|
|
@@ -48925,7 +49271,7 @@ class FilterEvaluationPlugin extends UIPlugin {
|
|
|
48925
49271
|
"isFilterActive",
|
|
48926
49272
|
];
|
|
48927
49273
|
filterValues = {};
|
|
48928
|
-
hiddenRows =
|
|
49274
|
+
hiddenRows = {};
|
|
48929
49275
|
isEvaluationDirty = false;
|
|
48930
49276
|
allowDispatch(cmd) {
|
|
48931
49277
|
switch (cmd.type) {
|
|
@@ -48968,11 +49314,11 @@ class FilterEvaluationPlugin extends UIPlugin {
|
|
|
48968
49314
|
case "UNFOLD_HEADER_GROUP":
|
|
48969
49315
|
case "FOLD_ALL_HEADER_GROUPS":
|
|
48970
49316
|
case "UNFOLD_ALL_HEADER_GROUPS":
|
|
48971
|
-
this.updateHiddenRows();
|
|
49317
|
+
this.updateHiddenRows(cmd.sheetId);
|
|
48972
49318
|
break;
|
|
48973
49319
|
case "UPDATE_FILTER":
|
|
48974
49320
|
this.updateFilter(cmd);
|
|
48975
|
-
this.updateHiddenRows();
|
|
49321
|
+
this.updateHiddenRows(cmd.sheetId);
|
|
48976
49322
|
break;
|
|
48977
49323
|
case "DUPLICATE_SHEET":
|
|
48978
49324
|
const filterValues = {};
|
|
@@ -48992,15 +49338,14 @@ class FilterEvaluationPlugin extends UIPlugin {
|
|
|
48992
49338
|
}
|
|
48993
49339
|
finalize() {
|
|
48994
49340
|
if (this.isEvaluationDirty) {
|
|
48995
|
-
this.
|
|
49341
|
+
for (const sheetId of this.getters.getSheetIds()) {
|
|
49342
|
+
this.updateHiddenRows(sheetId);
|
|
49343
|
+
}
|
|
48996
49344
|
this.isEvaluationDirty = false;
|
|
48997
49345
|
}
|
|
48998
49346
|
}
|
|
48999
49347
|
isRowFiltered(sheetId, row) {
|
|
49000
|
-
|
|
49001
|
-
return false;
|
|
49002
|
-
}
|
|
49003
|
-
return this.hiddenRows.has(row);
|
|
49348
|
+
return !!this.hiddenRows[sheetId]?.has(row);
|
|
49004
49349
|
}
|
|
49005
49350
|
getCellBorderWithFilterBorder(position) {
|
|
49006
49351
|
const { sheetId, col, row } = position;
|
|
@@ -49051,8 +49396,7 @@ class FilterEvaluationPlugin extends UIPlugin {
|
|
|
49051
49396
|
this.filterValues[sheetId] = {};
|
|
49052
49397
|
this.filterValues[sheetId][id] = hiddenValues;
|
|
49053
49398
|
}
|
|
49054
|
-
updateHiddenRows() {
|
|
49055
|
-
const sheetId = this.getters.getActiveSheetId();
|
|
49399
|
+
updateHiddenRows(sheetId) {
|
|
49056
49400
|
const filters = this.getters
|
|
49057
49401
|
.getFilters(sheetId)
|
|
49058
49402
|
.sort((filter1, filter2) => filter1.zoneWithHeaders.top - filter2.zoneWithHeaders.top);
|
|
@@ -49073,7 +49417,7 @@ class FilterEvaluationPlugin extends UIPlugin {
|
|
|
49073
49417
|
}
|
|
49074
49418
|
}
|
|
49075
49419
|
}
|
|
49076
|
-
this.hiddenRows = hiddenRows;
|
|
49420
|
+
this.hiddenRows[sheetId] = hiddenRows;
|
|
49077
49421
|
}
|
|
49078
49422
|
getCellValueAsString(sheetId, col, row) {
|
|
49079
49423
|
const value = this.getters.getEvaluatedCell({ sheetId, col, row }).formattedValue;
|
|
@@ -50214,13 +50558,14 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
50214
50558
|
}
|
|
50215
50559
|
}
|
|
50216
50560
|
handleEvent(event) {
|
|
50561
|
+
const sheetId = this.getters.getActiveSheetId();
|
|
50217
50562
|
if (event.options.scrollIntoView) {
|
|
50218
50563
|
let { col, row } = findCellInNewZone(event.previousAnchor.zone, event.anchor.zone);
|
|
50219
50564
|
if (event.mode === "updateAnchor") {
|
|
50220
50565
|
const oldZone = event.previousAnchor.zone;
|
|
50221
50566
|
const newZone = event.anchor.zone;
|
|
50222
50567
|
// altering a zone should not move the viewport in a dimension that wasn't changed
|
|
50223
|
-
const { top, bottom, left, right } = this.
|
|
50568
|
+
const { top, bottom, left, right } = this.getMainInternalViewport(sheetId);
|
|
50224
50569
|
if (oldZone.left === newZone.left && oldZone.right === newZone.right) {
|
|
50225
50570
|
col = left > col || col > right ? left : col;
|
|
50226
50571
|
}
|
|
@@ -50228,7 +50573,6 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
50228
50573
|
row = top > row || row > bottom ? top : row;
|
|
50229
50574
|
}
|
|
50230
50575
|
}
|
|
50231
|
-
const sheetId = this.getters.getActiveSheetId();
|
|
50232
50576
|
col = Math.min(col, this.getters.getNumberCols(sheetId) - 1);
|
|
50233
50577
|
row = Math.min(row, this.getters.getNumberRows(sheetId) - 1);
|
|
50234
50578
|
if (!this.sheetsWithDirtyViewports.has(sheetId)) {
|
|
@@ -50265,16 +50609,16 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
50265
50609
|
this.setSheetViewOffset(cmd.offsetX, cmd.offsetY);
|
|
50266
50610
|
break;
|
|
50267
50611
|
case "SHIFT_VIEWPORT_DOWN":
|
|
50268
|
-
const { top } = this.getActiveMainViewport();
|
|
50269
50612
|
const sheetId = this.getters.getActiveSheetId();
|
|
50270
|
-
const
|
|
50271
|
-
this.
|
|
50613
|
+
const { top, viewportHeight, offsetCorrectionY } = this.getMainInternalViewport(sheetId);
|
|
50614
|
+
const topRowDims = this.getters.getRowDimensions(sheetId, top);
|
|
50615
|
+
this.shiftVertically(topRowDims.start + viewportHeight - offsetCorrectionY);
|
|
50272
50616
|
break;
|
|
50273
50617
|
case "SHIFT_VIEWPORT_UP": {
|
|
50274
|
-
const { top } = this.getActiveMainViewport();
|
|
50275
50618
|
const sheetId = this.getters.getActiveSheetId();
|
|
50276
|
-
const
|
|
50277
|
-
this.
|
|
50619
|
+
const { top, viewportHeight, offsetCorrectionY } = this.getMainInternalViewport(sheetId);
|
|
50620
|
+
const topRowDims = this.getters.getRowDimensions(sheetId, top);
|
|
50621
|
+
this.shiftVertically(topRowDims.end - offsetCorrectionY - viewportHeight);
|
|
50278
50622
|
break;
|
|
50279
50623
|
}
|
|
50280
50624
|
case "REMOVE_FILTER_TABLE":
|
|
@@ -50667,17 +51011,6 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
50667
51011
|
const { maxOffsetX, maxOffsetY } = this.getMaximumSheetOffset();
|
|
50668
51012
|
Object.values(this.getSubViewports(sheetId)).forEach((viewport) => viewport.setViewportOffset(clip(offsetX, 0, maxOffsetX), clip(offsetY, 0, maxOffsetY)));
|
|
50669
51013
|
}
|
|
50670
|
-
/**
|
|
50671
|
-
* Clip the vertical offset within the allowed range.
|
|
50672
|
-
* Not above the sheet, nor below the sheet.
|
|
50673
|
-
*/
|
|
50674
|
-
clipOffsetY(offsetY) {
|
|
50675
|
-
const { height } = this.getMainViewportRect();
|
|
50676
|
-
const maxOffset = height - this.sheetViewHeight;
|
|
50677
|
-
offsetY = Math.min(offsetY, maxOffset);
|
|
50678
|
-
offsetY = Math.max(offsetY, 0);
|
|
50679
|
-
return offsetY;
|
|
50680
|
-
}
|
|
50681
51014
|
getViewportOffset(sheetId) {
|
|
50682
51015
|
return {
|
|
50683
51016
|
x: this.viewports[sheetId]?.bottomRight.offsetScrollbarX || 0,
|
|
@@ -50733,12 +51066,15 @@ class SheetViewPlugin extends UIPlugin {
|
|
|
50733
51066
|
* viewport top.
|
|
50734
51067
|
*/
|
|
50735
51068
|
shiftVertically(offset) {
|
|
50736
|
-
const
|
|
51069
|
+
const sheetId = this.getters.getActiveSheetId();
|
|
51070
|
+
const { top } = this.getMainInternalViewport(sheetId);
|
|
50737
51071
|
const { scrollX } = this.getActiveSheetScrollInfo();
|
|
50738
51072
|
this.setSheetViewOffset(scrollX, offset);
|
|
50739
51073
|
const { anchor } = this.getters.getSelection();
|
|
50740
|
-
|
|
50741
|
-
|
|
51074
|
+
if (anchor.cell.row >= this.getters.getPaneDivisions(sheetId).ySplit) {
|
|
51075
|
+
const deltaRow = this.getMainInternalViewport(sheetId).top - top;
|
|
51076
|
+
this.selection.selectCell(anchor.cell.col, anchor.cell.row + deltaRow);
|
|
51077
|
+
}
|
|
50742
51078
|
}
|
|
50743
51079
|
getVisibleFigures() {
|
|
50744
51080
|
const sheetId = this.getters.getActiveSheetId();
|
|
@@ -51669,7 +52005,6 @@ css /* scss */ `
|
|
|
51669
52005
|
cursor: pointer;
|
|
51670
52006
|
}
|
|
51671
52007
|
`;
|
|
51672
|
-
let tKey = 1;
|
|
51673
52008
|
class SpreadsheetDashboard extends Component {
|
|
51674
52009
|
static template = "o-spreadsheet-SpreadsheetDashboard";
|
|
51675
52010
|
static components = {
|
|
@@ -51747,13 +52082,9 @@ class SpreadsheetDashboard extends Component {
|
|
|
51747
52082
|
coordinates: rect,
|
|
51748
52083
|
position: { col, row },
|
|
51749
52084
|
action,
|
|
51750
|
-
// we can't rely on position only because a row or a column could
|
|
51751
|
-
// be inserted at any time.
|
|
51752
|
-
tKey: `${tKey}-${col}-${row}`,
|
|
51753
52085
|
});
|
|
51754
52086
|
}
|
|
51755
52087
|
}
|
|
51756
|
-
tKey++;
|
|
51757
52088
|
return cells;
|
|
51758
52089
|
}
|
|
51759
52090
|
getClickableAction(position) {
|
|
@@ -57024,6 +57355,6 @@ const constants = {
|
|
|
57024
57355
|
export { AbstractChart, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
|
|
57025
57356
|
|
|
57026
57357
|
|
|
57027
|
-
__info__.version = "17.0.
|
|
57028
|
-
__info__.date = "2024-04-
|
|
57029
|
-
__info__.hash = "
|
|
57358
|
+
__info__.version = "17.0.20";
|
|
57359
|
+
__info__.date = "2024-04-26T07:37:04.503Z";
|
|
57360
|
+
__info__.hash = "065ac98";
|