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