@rowsncolumns/spreadsheet 10.5.17 → 10.6.4

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.
Files changed (202) hide show
  1. package/dist/cjs/api/cf-data-bar.d.ts +73 -0
  2. package/dist/cjs/api/cf-data-bar.d.ts.map +1 -0
  3. package/dist/cjs/api/cf-data-bar.js +182 -0
  4. package/dist/cjs/api/cf-icons.d.ts +73 -0
  5. package/dist/cjs/api/cf-icons.d.ts.map +1 -0
  6. package/dist/cjs/api/cf-icons.js +322 -0
  7. package/dist/cjs/api/cf-overlays.d.ts +89 -3
  8. package/dist/cjs/api/cf-overlays.d.ts.map +1 -1
  9. package/dist/cjs/api/cf-overlays.js +256 -80
  10. package/dist/cjs/api/cf-priority.d.ts +34 -0
  11. package/dist/cjs/api/cf-priority.d.ts.map +1 -0
  12. package/dist/cjs/api/cf-priority.js +94 -0
  13. package/dist/cjs/api/heatmap.d.ts +7 -1
  14. package/dist/cjs/api/heatmap.d.ts.map +1 -1
  15. package/dist/cjs/api/heatmap.js +27 -11
  16. package/dist/cjs/api/selections.d.ts +2 -2
  17. package/dist/cjs/api/validation.d.ts +6 -0
  18. package/dist/cjs/api/validation.d.ts.map +1 -1
  19. package/dist/cjs/api/validation.js +10 -1
  20. package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts +8 -3
  21. package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts.map +1 -1
  22. package/dist/cjs/atoms/index.d.ts +4 -0
  23. package/dist/cjs/atoms/index.d.ts.map +1 -1
  24. package/dist/cjs/atoms/index.js +4 -0
  25. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  26. package/dist/cjs/components/canvas-grid/index.js +194 -51
  27. package/dist/cjs/components/canvas-grid/overflow.d.ts +37 -0
  28. package/dist/cjs/components/canvas-grid/overflow.d.ts.map +1 -0
  29. package/dist/cjs/components/canvas-grid/overflow.js +49 -0
  30. package/dist/cjs/components/canvas-grid/page-breaks.d.ts +15 -0
  31. package/dist/cjs/components/canvas-grid/page-breaks.d.ts.map +1 -0
  32. package/dist/cjs/components/canvas-grid/page-breaks.js +77 -0
  33. package/dist/cjs/components/canvas-grid/typings.d.ts +32 -3
  34. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  35. package/dist/cjs/components/cell/alignment.d.ts +58 -1
  36. package/dist/cjs/components/cell/alignment.d.ts.map +1 -1
  37. package/dist/cjs/components/cell/alignment.js +144 -1
  38. package/dist/cjs/components/cell/cell-background.d.ts +2 -0
  39. package/dist/cjs/components/cell/cell-background.d.ts.map +1 -1
  40. package/dist/cjs/components/cell/cell-background.js +5 -6
  41. package/dist/cjs/components/cell/cell-backgrounds.d.ts.map +1 -1
  42. package/dist/cjs/components/cell/cell-backgrounds.js +5 -1
  43. package/dist/cjs/components/cell/cell-text-runs.js +1 -1
  44. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  45. package/dist/cjs/components/cell/index.js +378 -37
  46. package/dist/cjs/components/cell/number-format-layout.d.ts +35 -0
  47. package/dist/cjs/components/cell/number-format-layout.d.ts.map +1 -0
  48. package/dist/cjs/components/cell/number-format-layout.js +106 -0
  49. package/dist/cjs/components/cell/typings.d.ts +22 -0
  50. package/dist/cjs/components/cell/typings.d.ts.map +1 -1
  51. package/dist/cjs/components/cell-editor/index.js +2 -2
  52. package/dist/cjs/components/cell-filter/index.d.ts.map +1 -1
  53. package/dist/cjs/components/cell-filter/index.js +3 -3
  54. package/dist/cjs/components/cell-overlay/index.d.ts +20 -0
  55. package/dist/cjs/components/cell-overlay/index.d.ts.map +1 -1
  56. package/dist/cjs/components/cell-overlay/index.js +155 -28
  57. package/dist/cjs/components/cf-icon-preview/index.d.ts +16 -0
  58. package/dist/cjs/components/cf-icon-preview/index.d.ts.map +1 -0
  59. package/dist/cjs/components/cf-icon-preview/index.js +48 -0
  60. package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
  61. package/dist/cjs/components/context-menu/index.js +11 -3
  62. package/dist/cjs/components/embeds/embed-component.d.ts.map +1 -1
  63. package/dist/cjs/components/embeds/embed-component.js +3 -2
  64. package/dist/cjs/components/goal-seek-dialog/index.d.ts +15 -5
  65. package/dist/cjs/components/goal-seek-dialog/index.d.ts.map +1 -1
  66. package/dist/cjs/components/goal-seek-dialog/index.js +145 -42
  67. package/dist/cjs/components/hidden-markers/index.d.ts.map +1 -1
  68. package/dist/cjs/components/hidden-markers/index.js +8 -7
  69. package/dist/cjs/components/hidden-markers/style.d.ts +7 -0
  70. package/dist/cjs/components/hidden-markers/style.d.ts.map +1 -1
  71. package/dist/cjs/components/hidden-markers/style.js +13 -2
  72. package/dist/cjs/components/protect-sheet-dialog/index.d.ts +67 -0
  73. package/dist/cjs/components/protect-sheet-dialog/index.d.ts.map +1 -0
  74. package/dist/cjs/components/protect-sheet-dialog/index.js +196 -0
  75. package/dist/cjs/components/toolbar/types.d.ts +1 -1
  76. package/dist/cjs/components/toolbar/types.d.ts.map +1 -1
  77. package/dist/cjs/config.d.ts +13 -1
  78. package/dist/cjs/config.d.ts.map +1 -1
  79. package/dist/cjs/config.js +15 -3
  80. package/dist/cjs/helpers.d.ts +10 -5
  81. package/dist/cjs/helpers.d.ts.map +1 -1
  82. package/dist/cjs/helpers.js +43 -31
  83. package/dist/cjs/hooks/use-border-styles.d.ts.map +1 -1
  84. package/dist/cjs/hooks/use-border-styles.js +5 -28
  85. package/dist/cjs/hooks/use-cell-renderer.d.ts +35 -3
  86. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  87. package/dist/cjs/hooks/use-cell-renderer.js +85 -47
  88. package/dist/cjs/hooks/use-conditional-formatting.d.ts +13 -1
  89. package/dist/cjs/hooks/use-conditional-formatting.d.ts.map +1 -1
  90. package/dist/cjs/hooks/use-conditional-formatting.js +281 -230
  91. package/dist/cjs/index.d.ts +7 -0
  92. package/dist/cjs/index.d.ts.map +1 -1
  93. package/dist/cjs/index.js +13 -1
  94. package/dist/cjs/release-date.js +1 -1
  95. package/dist/cjs/themes.d.ts +8 -0
  96. package/dist/cjs/themes.d.ts.map +1 -1
  97. package/dist/cjs/themes.js +21 -3
  98. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  99. package/dist/cjs/types.d.ts +115 -5
  100. package/dist/cjs/types.d.ts.map +1 -1
  101. package/dist/esm/api/cf-data-bar.d.ts +73 -0
  102. package/dist/esm/api/cf-data-bar.d.ts.map +1 -0
  103. package/dist/esm/api/cf-data-bar.js +178 -0
  104. package/dist/esm/api/cf-icons.d.ts +73 -0
  105. package/dist/esm/api/cf-icons.d.ts.map +1 -0
  106. package/dist/esm/api/cf-icons.js +306 -0
  107. package/dist/esm/api/cf-overlays.d.ts +89 -3
  108. package/dist/esm/api/cf-overlays.d.ts.map +1 -1
  109. package/dist/esm/api/cf-overlays.js +223 -67
  110. package/dist/esm/api/cf-priority.d.ts +34 -0
  111. package/dist/esm/api/cf-priority.d.ts.map +1 -0
  112. package/dist/esm/api/cf-priority.js +61 -0
  113. package/dist/esm/api/heatmap.d.ts +7 -1
  114. package/dist/esm/api/heatmap.d.ts.map +1 -1
  115. package/dist/esm/api/heatmap.js +24 -9
  116. package/dist/esm/api/selections.d.ts +2 -2
  117. package/dist/esm/api/validation.d.ts +6 -0
  118. package/dist/esm/api/validation.d.ts.map +1 -1
  119. package/dist/esm/api/validation.js +6 -0
  120. package/dist/esm/atoms/goal-seek-dialog.atom.d.ts +8 -3
  121. package/dist/esm/atoms/goal-seek-dialog.atom.d.ts.map +1 -1
  122. package/dist/esm/atoms/index.d.ts +4 -0
  123. package/dist/esm/atoms/index.d.ts.map +1 -1
  124. package/dist/esm/atoms/index.js +4 -0
  125. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  126. package/dist/esm/components/canvas-grid/index.js +163 -47
  127. package/dist/esm/components/canvas-grid/overflow.d.ts +37 -0
  128. package/dist/esm/components/canvas-grid/overflow.d.ts.map +1 -0
  129. package/dist/esm/components/canvas-grid/overflow.js +39 -0
  130. package/dist/esm/components/canvas-grid/page-breaks.d.ts +15 -0
  131. package/dist/esm/components/canvas-grid/page-breaks.d.ts.map +1 -0
  132. package/dist/esm/components/canvas-grid/page-breaks.js +50 -0
  133. package/dist/esm/components/canvas-grid/typings.d.ts +32 -3
  134. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  135. package/dist/esm/components/cell/alignment.d.ts +58 -1
  136. package/dist/esm/components/cell/alignment.d.ts.map +1 -1
  137. package/dist/esm/components/cell/alignment.js +110 -1
  138. package/dist/esm/components/cell/cell-background.d.ts +2 -0
  139. package/dist/esm/components/cell/cell-background.d.ts.map +1 -1
  140. package/dist/esm/components/cell/cell-background.js +4 -5
  141. package/dist/esm/components/cell/cell-backgrounds.d.ts.map +1 -1
  142. package/dist/esm/components/cell/cell-backgrounds.js +5 -1
  143. package/dist/esm/components/cell/cell-text-runs.js +2 -2
  144. package/dist/esm/components/cell/index.d.ts.map +1 -1
  145. package/dist/esm/components/cell/index.js +339 -39
  146. package/dist/esm/components/cell/number-format-layout.d.ts +35 -0
  147. package/dist/esm/components/cell/number-format-layout.d.ts.map +1 -0
  148. package/dist/esm/components/cell/number-format-layout.js +99 -0
  149. package/dist/esm/components/cell/typings.d.ts +22 -0
  150. package/dist/esm/components/cell/typings.d.ts.map +1 -1
  151. package/dist/esm/components/cell-editor/index.js +2 -2
  152. package/dist/esm/components/cell-filter/index.d.ts.map +1 -1
  153. package/dist/esm/components/cell-filter/index.js +4 -4
  154. package/dist/esm/components/cell-overlay/index.d.ts +20 -0
  155. package/dist/esm/components/cell-overlay/index.d.ts.map +1 -1
  156. package/dist/esm/components/cell-overlay/index.js +111 -25
  157. package/dist/esm/components/cf-icon-preview/index.d.ts +16 -0
  158. package/dist/esm/components/cf-icon-preview/index.d.ts.map +1 -0
  159. package/dist/esm/components/cf-icon-preview/index.js +41 -0
  160. package/dist/esm/components/context-menu/index.d.ts.map +1 -1
  161. package/dist/esm/components/context-menu/index.js +11 -3
  162. package/dist/esm/components/embeds/embed-component.d.ts.map +1 -1
  163. package/dist/esm/components/embeds/embed-component.js +4 -3
  164. package/dist/esm/components/goal-seek-dialog/index.d.ts +15 -5
  165. package/dist/esm/components/goal-seek-dialog/index.d.ts.map +1 -1
  166. package/dist/esm/components/goal-seek-dialog/index.js +126 -29
  167. package/dist/esm/components/hidden-markers/index.d.ts.map +1 -1
  168. package/dist/esm/components/hidden-markers/index.js +9 -8
  169. package/dist/esm/components/hidden-markers/style.d.ts +7 -0
  170. package/dist/esm/components/hidden-markers/style.d.ts.map +1 -1
  171. package/dist/esm/components/hidden-markers/style.js +8 -1
  172. package/dist/esm/components/protect-sheet-dialog/index.d.ts +67 -0
  173. package/dist/esm/components/protect-sheet-dialog/index.d.ts.map +1 -0
  174. package/dist/esm/components/protect-sheet-dialog/index.js +154 -0
  175. package/dist/esm/components/toolbar/types.d.ts +1 -1
  176. package/dist/esm/components/toolbar/types.d.ts.map +1 -1
  177. package/dist/esm/config.d.ts +13 -1
  178. package/dist/esm/config.d.ts.map +1 -1
  179. package/dist/esm/config.js +13 -1
  180. package/dist/esm/helpers.d.ts +10 -5
  181. package/dist/esm/helpers.d.ts.map +1 -1
  182. package/dist/esm/helpers.js +40 -28
  183. package/dist/esm/hooks/use-border-styles.d.ts.map +1 -1
  184. package/dist/esm/hooks/use-border-styles.js +5 -26
  185. package/dist/esm/hooks/use-cell-renderer.d.ts +35 -3
  186. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  187. package/dist/esm/hooks/use-cell-renderer.js +83 -42
  188. package/dist/esm/hooks/use-conditional-formatting.d.ts +13 -1
  189. package/dist/esm/hooks/use-conditional-formatting.d.ts.map +1 -1
  190. package/dist/esm/hooks/use-conditional-formatting.js +215 -120
  191. package/dist/esm/index.d.ts +7 -0
  192. package/dist/esm/index.d.ts.map +1 -1
  193. package/dist/esm/index.js +7 -0
  194. package/dist/esm/release-date.js +1 -1
  195. package/dist/esm/themes.d.ts +8 -0
  196. package/dist/esm/themes.d.ts.map +1 -1
  197. package/dist/esm/themes.js +20 -3
  198. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  199. package/dist/esm/types.d.ts +115 -5
  200. package/dist/esm/types.d.ts.map +1 -1
  201. package/dist/spreadsheet.min.css +1 -1
  202. package/package.json +4 -4
@@ -6,13 +6,15 @@ var grid_1 = require("@rowsncolumns/grid");
6
6
  var utils_1 = require("@rowsncolumns/utils");
7
7
  var isNil_1 = tslib_1.__importDefault(require("lodash/isNil"));
8
8
  var react_1 = require("react");
9
- var cf_overlays_1 = require("../api/cf-overlays");
9
+ var cf_data_bar_1 = require("../api/cf-data-bar");
10
10
  var cf_engine_1 = require("../api/cf-engine");
11
+ var cf_overlays_1 = require("../api/cf-overlays");
12
+ var cf_priority_1 = require("../api/cf-priority");
11
13
  var cf_window_1 = require("../api/cf-window");
12
14
  var heatmap_1 = require("../api/heatmap");
13
15
  var validation_1 = require("../api/validation");
14
- var themes_1 = require("../themes");
15
16
  var config_1 = require("../config");
17
+ var themes_1 = require("../themes");
16
18
  /**
17
19
  * Merge a lower-priority rule's format under an already-applied one, per
18
20
  * property (Excel's stacking): every property the higher-priority format
@@ -52,8 +54,28 @@ var definedEntries = function (obj) {
52
54
  }
53
55
  return out;
54
56
  };
57
+ /** The k-th value a top/bottom-N rule ranks against, from full-range statistics. */
58
+ var fullRangeRankValue = function (stats, rule) {
59
+ var _a;
60
+ var top = rule.type === "TOP";
61
+ if (stats.sorted) {
62
+ var n = stats.sorted.length;
63
+ if (!n)
64
+ return undefined;
65
+ var k = Math.min(n, Math.max(1, rule.isPercent ? Math.ceil((rule.rank / 100) * n) : rule.rank));
66
+ return top ? stats.sorted[n - k] : stats.sorted[k - 1];
67
+ }
68
+ var value = (_a = stats.rankValue) === null || _a === void 0 ? void 0 : _a.call(stats, rule.rank, top, !!rule.isPercent);
69
+ return value !== undefined && Number.isFinite(value) ? value : undefined;
70
+ };
55
71
  var useConditionalFormatting = function (_a) {
56
- var sheetId = _a.sheetId, theme = _a.theme, conditionalFormats = _a.conditionalFormats, locale = _a.locale, getValidationValue = _a.getValidationValue, isNumberValue = _a.isNumberValue, getSheetRowCount = _a.getSheetRowCount, getSheetColumnCount = _a.getSheetColumnCount, evaluationWindow = _a.window, getConditionalFormatResult = _a.getConditionalFormatResult;
72
+ var sheetId = _a.sheetId, theme = _a.theme, conditionalFormats = _a.conditionalFormats, locale = _a.locale, getValidationValue = _a.getValidationValue, isNumberValue = _a.isNumberValue, getSheetRowCount = _a.getSheetRowCount, getSheetColumnCount = _a.getSheetColumnCount, evaluationWindow = _a.window, getConditionalFormatResult = _a.getConditionalFormatResult, getConditionalFormatRuleStats = _a.getConditionalFormatRuleStats;
73
+ // Whole-range statistics of windowed rules, keyed by rule id. An entry is
74
+ // reused while the rule object and the data getters are unchanged —
75
+ // scrolling (a new window) re-runs the memo below without re-scanning the
76
+ // full range, and any edit (new getter identity) or rule change
77
+ // invalidates it.
78
+ var fullRangeStatsCache = (0, react_1.useRef)(new Map());
57
79
  var previousEffectiveValueMap = (0, react_1.useRef)(undefined);
58
80
  // Lazy initialization
59
81
  var getPreviousValueMap = (0, react_1.useCallback)(function () {
@@ -83,26 +105,13 @@ var useConditionalFormatting = function (_a) {
83
105
  }, [getSheetRowCount, getSheetColumnCount]);
84
106
  return (0, react_1.useMemo)(function () {
85
107
  var e_2, _a;
86
- var _b, _c, _d, _e, _f, _g;
108
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
87
109
  var formattingByCell = new Map();
88
110
  if (!conditionalFormats) {
89
111
  return formattingByCell;
90
112
  }
91
- var sortedRules = conditionalFormats
92
- .map(function (rule, index) { return ({ rule: rule, index: index }); })
93
- .sort(function (left, right) {
94
- var _a, _b;
95
- var leftPriority = (_a = left.rule.priority) !== null && _a !== void 0 ? _a : Number.POSITIVE_INFINITY;
96
- var rightPriority = (_b = right.rule.priority) !== null && _b !== void 0 ? _b : Number.POSITIVE_INFINITY;
97
- if (leftPriority === rightPriority) {
98
- return left.index - right.index;
99
- }
100
- return leftPriority - rightPriority;
101
- })
102
- .map(function (_a) {
103
- var rule = _a.rule;
104
- return rule;
105
- });
113
+ // Excel precedence: the first rule (lowest `priority`) is evaluated first and wins conflicts.
114
+ var sortedRules = (0, cf_priority_1.sortConditionalFormatRules)(conditionalFormats);
106
115
  var rules = evaluationWindow
107
116
  ? (0, cf_window_1.windowConditionalFormatRules)({
108
117
  rules: sortedRules,
@@ -161,13 +170,94 @@ var useConditionalFormatting = function (_a) {
161
170
  finally { if (e_3) throw e_3.error; }
162
171
  }
163
172
  };
173
+ // Every numeric covered cell of a rule on this sheet, across all of its
174
+ // (clamped) ranges — the population Excel resolves cfvo thresholds over.
175
+ var collectRuleNumbers = function (rule) {
176
+ var e_4, _a, e_5, _b;
177
+ var cells = [];
178
+ try {
179
+ for (var _c = tslib_1.__values(rule.ranges), _d = _c.next(); !_d.done; _d = _c.next()) {
180
+ var range = _d.value;
181
+ if ((range === null || range === void 0 ? void 0 : range.sheetId) !== sheetId)
182
+ continue;
183
+ try {
184
+ for (var _e = (e_5 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampRange(range)))), _f = _e.next(); !_f.done; _f = _e.next()) {
185
+ var _g = tslib_1.__read(_f.value, 2), rowIndex = _g[0], columnIndex = _g[1];
186
+ var v = getValidationValue(sheetId, rowIndex, columnIndex, rule);
187
+ if (!(0, isNil_1.default)(v) &&
188
+ typeof v !== "boolean" &&
189
+ isNumberValue(sheetId, rowIndex, columnIndex) &&
190
+ Number.isFinite(Number(v))) {
191
+ cells.push({ rowIndex: rowIndex, columnIndex: columnIndex, value: Number(v) });
192
+ }
193
+ }
194
+ }
195
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
196
+ finally {
197
+ try {
198
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
199
+ }
200
+ finally { if (e_5) throw e_5.error; }
201
+ }
202
+ }
203
+ }
204
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
205
+ finally {
206
+ try {
207
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
208
+ }
209
+ finally { if (e_4) throw e_4.error; }
210
+ }
211
+ return cells;
212
+ };
213
+ // FORMULA cfvo thresholds: a constant or a single same-sheet cell
214
+ // reference (`=$B$1`) — the forms Excel's rule dialog produces.
215
+ var resolveFormula = function (formula) {
216
+ var match = /^=?\s*\$?([A-Z]{1,3})\$?(\d+)\s*$/i.exec(formula);
217
+ if (!match)
218
+ return undefined;
219
+ var cell = (0, utils_1.addressToCell)("".concat(match[1]).concat(match[2]));
220
+ if (!cell)
221
+ return undefined;
222
+ var value = getValidationValue(sheetId, cell.rowIndex, cell.columnIndex);
223
+ var num = typeof value === "boolean" ? NaN : Number(value);
224
+ return (0, isNil_1.default)(value) || value === "" || !Number.isFinite(num)
225
+ ? undefined
226
+ : num;
227
+ };
228
+ var originalRuleById = new Map(sortedRules.map(function (rule) { return [rule.id, rule]; }));
229
+ // Statistics over the rule's FULL range when the window cut it (Excel
230
+ // resolves thresholds over every covered cell, not the visible slice);
231
+ // `undefined` for a rule evaluated whole, whose loaded values are exact.
232
+ var fullRangeStats = function (rule) {
233
+ var _a;
234
+ var original = originalRuleById.get(rule.id);
235
+ if (!original || original === rule)
236
+ return undefined;
237
+ var cache = fullRangeStatsCache.current;
238
+ var hit = cache.get(rule.id);
239
+ if (hit &&
240
+ hit.rule === original &&
241
+ hit.getValidationValue === getValidationValue &&
242
+ hit.isNumberValue === isNumberValue) {
243
+ return hit.stats;
244
+ }
245
+ var stats = (_a = getConditionalFormatRuleStats === null || getConditionalFormatRuleStats === void 0 ? void 0 : getConditionalFormatRuleStats(sheetId, original)) !== null && _a !== void 0 ? _a : (0, cf_overlays_1.buildCfRangeStats)(collectRuleNumbers(original).map(function (cell) { return cell.value; }));
246
+ cache.set(rule.id, {
247
+ rule: original,
248
+ getValidationValue: getValidationValue,
249
+ isNumberValue: isNumberValue,
250
+ stats: stats,
251
+ });
252
+ return stats;
253
+ };
164
254
  // There can be conditions applied
165
255
  // to the same range
166
256
  // So to get previous value, we have to save it
167
257
  // in a key based on condition index
168
258
  var conditionIndex = 0;
169
259
  var _loop_1 = function (rule) {
170
- var e_4, _h, e_5, _j, e_6, _k, e_7, _l, e_8, _m, e_9, _o, e_10, _p, e_11, _q, e_12, _r, e_13, _s, e_14, _t, e_15, _u, e_16, _v, e_17, _w;
260
+ var e_6, _p, e_7, _q, e_8, _r, e_9, _s, e_10, _t, e_11, _u, e_12, _v, e_13, _w, e_14, _x, e_15, _y, e_16, _z, e_17, _0;
171
261
  var engineStamped = (_b = engineStampedRuleIds === null || engineStampedRuleIds === void 0 ? void 0 : engineStampedRuleIds.has(rule.id)) !== null && _b !== void 0 ? _b : false;
172
262
  var ranges = rule.ranges, enabled = rule.enabled, booleanRule = rule.booleanRule, gradientRule = rule.gradientRule, topBottomRule = rule.topBottomRule, distinctRule = rule.distinctRule, iconSetRule = rule.iconSetRule, dataBarRule = rule.dataBarRule;
173
263
  // Only look for enabled rules
@@ -176,7 +266,7 @@ var useConditionalFormatting = function (_a) {
176
266
  }
177
267
  if (booleanRule) {
178
268
  try {
179
- for (var ranges_1 = (e_4 = void 0, tslib_1.__values(ranges)), ranges_1_1 = ranges_1.next(); !ranges_1_1.done; ranges_1_1 = ranges_1.next()) {
269
+ for (var ranges_1 = (e_6 = void 0, tslib_1.__values(ranges)), ranges_1_1 = ranges_1.next(); !ranges_1_1.done; ranges_1_1 = ranges_1.next()) {
180
270
  var range = ranges_1_1.value;
181
271
  // Only pick current sheet
182
272
  if ((range === null || range === void 0 ? void 0 : range.sheetId) !== sheetId) {
@@ -197,8 +287,8 @@ var useConditionalFormatting = function (_a) {
197
287
  if (isAboveBelowAverage) {
198
288
  var numericValues = [];
199
289
  try {
200
- for (var _x = (e_5 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _y = _x.next(); !_y.done; _y = _x.next()) {
201
- var _z = tslib_1.__read(_y.value, 2), rowIndex = _z[0], columnIndex = _z[1];
290
+ for (var _1 = (e_7 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _2 = _1.next(); !_2.done; _2 = _1.next()) {
291
+ var _3 = tslib_1.__read(_2.value, 2), rowIndex = _3[0], columnIndex = _3[1];
202
292
  var value = getValidationValue(sheetId, rowIndex, columnIndex, rule);
203
293
  if (!(0, isNil_1.default)(value) &&
204
294
  isNumberValue(sheetId, rowIndex, columnIndex) &&
@@ -207,17 +297,20 @@ var useConditionalFormatting = function (_a) {
207
297
  }
208
298
  }
209
299
  }
210
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
300
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
211
301
  finally {
212
302
  try {
213
- if (_y && !_y.done && (_j = _x.return)) _j.call(_x);
303
+ if (_2 && !_2.done && (_q = _1.return)) _q.call(_1);
214
304
  }
215
- finally { if (e_5) throw e_5.error; }
305
+ finally { if (e_7) throw e_7.error; }
306
+ }
307
+ var above = conditionType === "NUMBER_ABOVE_AVERAGE";
308
+ var fullStats = fullRangeStats(rule);
309
+ if (fullStats) {
310
+ averageValue = (0, cf_overlays_1.averageBoundFromStats)(fullStats, above, booleanRule.stdDev);
216
311
  }
217
- if (numericValues.length) {
218
- averageValue =
219
- numericValues.reduce(function (sum, entry) { return sum + entry; }, 0) /
220
- numericValues.length;
312
+ else if (numericValues.length) {
313
+ averageValue = (0, cf_overlays_1.averageBound)(numericValues, above, booleanRule.stdDev);
221
314
  }
222
315
  }
223
316
  // Formula path vs sync path: see `isConditionalFormatFormulaRule`
@@ -229,8 +322,8 @@ var useConditionalFormatting = function (_a) {
229
322
  (0, validation_1.shouldUsePreviousValue)((_d = booleanRule === null || booleanRule === void 0 ? void 0 : booleanRule.condition) === null || _d === void 0 ? void 0 : _d.type);
230
323
  try {
231
324
  // Iterate all cells within this range
232
- for (var _0 = (e_6 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _1 = _0.next(); !_1.done; _1 = _0.next()) {
233
- var _2 = tslib_1.__read(_1.value, 2), rowIndex = _2[0], columnIndex = _2[1];
325
+ for (var _4 = (e_8 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _5 = _4.next(); !_5.done; _5 = _4.next()) {
326
+ var _6 = tslib_1.__read(_5.value, 2), rowIndex = _6[0], columnIndex = _6[1];
234
327
  var effectiveValue = getValidationValue(sheetId, rowIndex, columnIndex, rule);
235
328
  var satisfies = false;
236
329
  if (booleanRule === null || booleanRule === void 0 ? void 0 : booleanRule.condition) {
@@ -240,10 +333,15 @@ var useConditionalFormatting = function (_a) {
240
333
  isNumberValue(sheetId, rowIndex, columnIndex)) {
241
334
  var numericValue = Number(effectiveValue);
242
335
  if (Number.isFinite(numericValue)) {
336
+ var inclusive = booleanRule.equalAverage === true;
243
337
  satisfies =
244
338
  conditionType === "NUMBER_ABOVE_AVERAGE"
245
- ? numericValue > averageValue
246
- : numericValue < averageValue;
339
+ ? inclusive
340
+ ? numericValue >= averageValue
341
+ : numericValue > averageValue
342
+ : inclusive
343
+ ? numericValue <= averageValue
344
+ : numericValue < averageValue;
247
345
  }
248
346
  }
249
347
  }
@@ -272,21 +370,21 @@ var useConditionalFormatting = function (_a) {
272
370
  }
273
371
  }
274
372
  }
275
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
373
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
276
374
  finally {
277
375
  try {
278
- if (_1 && !_1.done && (_k = _0.return)) _k.call(_0);
376
+ if (_5 && !_5.done && (_r = _4.return)) _r.call(_4);
279
377
  }
280
- finally { if (e_6) throw e_6.error; }
378
+ finally { if (e_8) throw e_8.error; }
281
379
  }
282
380
  }
283
381
  }
284
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
382
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
285
383
  finally {
286
384
  try {
287
- if (ranges_1_1 && !ranges_1_1.done && (_h = ranges_1.return)) _h.call(ranges_1);
385
+ if (ranges_1_1 && !ranges_1_1.done && (_p = ranges_1.return)) _p.call(ranges_1);
288
386
  }
289
- finally { if (e_4) throw e_4.error; }
387
+ finally { if (e_6) throw e_6.error; }
290
388
  }
291
389
  }
292
390
  else if (gradientRule) {
@@ -294,7 +392,7 @@ var useConditionalFormatting = function (_a) {
294
392
  var values = [];
295
393
  try {
296
394
  // Get colors from all ranges initially
297
- for (var ranges_2 = (e_7 = void 0, tslib_1.__values(ranges)), ranges_2_1 = ranges_2.next(); !ranges_2_1.done; ranges_2_1 = ranges_2.next()) {
395
+ for (var ranges_2 = (e_9 = void 0, tslib_1.__values(ranges)), ranges_2_1 = ranges_2.next(); !ranges_2_1.done; ranges_2_1 = ranges_2.next()) {
298
396
  var range = ranges_2_1.value;
299
397
  // Only pick current sheet
300
398
  if ((range === null || range === void 0 ? void 0 : range.sheetId) !== sheetId) {
@@ -321,18 +419,18 @@ var useConditionalFormatting = function (_a) {
321
419
  values.push(rangeValues);
322
420
  }
323
421
  }
324
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
422
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
325
423
  finally {
326
424
  try {
327
- if (ranges_2_1 && !ranges_2_1.done && (_l = ranges_2.return)) _l.call(ranges_2);
425
+ if (ranges_2_1 && !ranges_2_1.done && (_s = ranges_2.return)) _s.call(ranges_2);
328
426
  }
329
- finally { if (e_7) throw e_7.error; }
427
+ finally { if (e_9) throw e_9.error; }
330
428
  }
331
- var colors = (0, heatmap_1.getGradientColors)(values, gradientRule, theme);
429
+ var colors = (0, heatmap_1.getGradientColors)(values, gradientRule, theme, fullRangeStats(rule));
332
430
  var rangeIndex = 0;
333
431
  try {
334
432
  // Apply colors
335
- for (var ranges_3 = (e_8 = void 0, tslib_1.__values(ranges)), ranges_3_1 = ranges_3.next(); !ranges_3_1.done; ranges_3_1 = ranges_3.next()) {
433
+ for (var ranges_3 = (e_10 = void 0, tslib_1.__values(ranges)), ranges_3_1 = ranges_3.next(); !ranges_3_1.done; ranges_3_1 = ranges_3.next()) {
336
434
  var range = ranges_3_1.value;
337
435
  // Only pick current sheet
338
436
  if (range.sheetId !== sheetId) {
@@ -359,17 +457,17 @@ var useConditionalFormatting = function (_a) {
359
457
  rangeIndex++;
360
458
  }
361
459
  }
362
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
460
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
363
461
  finally {
364
462
  try {
365
- if (ranges_3_1 && !ranges_3_1.done && (_m = ranges_3.return)) _m.call(ranges_3);
463
+ if (ranges_3_1 && !ranges_3_1.done && (_t = ranges_3.return)) _t.call(ranges_3);
366
464
  }
367
- finally { if (e_8) throw e_8.error; }
465
+ finally { if (e_10) throw e_10.error; }
368
466
  }
369
467
  }
370
468
  else if (topBottomRule) {
371
469
  var _loop_2 = function (range) {
372
- var e_18, _11, e_19, _12;
470
+ var e_18, _12, e_19, _13;
373
471
  if (range.sheetId !== sheetId) {
374
472
  return "continue";
375
473
  }
@@ -383,8 +481,8 @@ var useConditionalFormatting = function (_a) {
383
481
  }
384
482
  var numericCells = [];
385
483
  try {
386
- for (var _13 = (e_18 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _14 = _13.next(); !_14.done; _14 = _13.next()) {
387
- var _15 = tslib_1.__read(_14.value, 2), rowIndex = _15[0], columnIndex = _15[1];
484
+ for (var _14 = (e_18 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _15 = _14.next(); !_15.done; _15 = _14.next()) {
485
+ var _16 = tslib_1.__read(_15.value, 2), rowIndex = _16[0], columnIndex = _16[1];
388
486
  var value = getValidationValue(sheetId, rowIndex, columnIndex, rule);
389
487
  if (!(0, isNil_1.default)(value) &&
390
488
  isNumberValue(sheetId, rowIndex, columnIndex) &&
@@ -400,7 +498,7 @@ var useConditionalFormatting = function (_a) {
400
498
  catch (e_18_1) { e_18 = { error: e_18_1 }; }
401
499
  finally {
402
500
  try {
403
- if (_14 && !_14.done && (_11 = _13.return)) _11.call(_13);
501
+ if (_15 && !_15.done && (_12 = _14.return)) _12.call(_14);
404
502
  }
405
503
  finally { if (e_18) throw e_18.error; }
406
504
  }
@@ -416,7 +514,11 @@ var useConditionalFormatting = function (_a) {
416
514
  ? b.value - a.value
417
515
  : a.value - b.value;
418
516
  });
419
- var thresholdValue = (_g = sorted[Math.min(desiredRank - 1, sorted.length - 1)]) === null || _g === void 0 ? void 0 : _g.value;
517
+ // A windowed rule ranks against its full range.
518
+ var fullStats = fullRangeStats(rule);
519
+ var thresholdValue = fullStats
520
+ ? fullRangeRankValue(fullStats, topBottomRule)
521
+ : (_g = sorted[Math.min(desiredRank - 1, sorted.length - 1)]) === null || _g === void 0 ? void 0 : _g.value;
420
522
  if (thresholdValue === undefined) {
421
523
  return "continue";
422
524
  }
@@ -441,28 +543,28 @@ var useConditionalFormatting = function (_a) {
441
543
  catch (e_19_1) { e_19 = { error: e_19_1 }; }
442
544
  finally {
443
545
  try {
444
- if (numericCells_1_1 && !numericCells_1_1.done && (_12 = numericCells_1.return)) _12.call(numericCells_1);
546
+ if (numericCells_1_1 && !numericCells_1_1.done && (_13 = numericCells_1.return)) _13.call(numericCells_1);
445
547
  }
446
548
  finally { if (e_19) throw e_19.error; }
447
549
  }
448
550
  };
449
551
  try {
450
- for (var ranges_4 = (e_9 = void 0, tslib_1.__values(ranges)), ranges_4_1 = ranges_4.next(); !ranges_4_1.done; ranges_4_1 = ranges_4.next()) {
552
+ for (var ranges_4 = (e_11 = void 0, tslib_1.__values(ranges)), ranges_4_1 = ranges_4.next(); !ranges_4_1.done; ranges_4_1 = ranges_4.next()) {
451
553
  var range = ranges_4_1.value;
452
554
  _loop_2(range);
453
555
  }
454
556
  }
455
- catch (e_9_1) { e_9 = { error: e_9_1 }; }
557
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
456
558
  finally {
457
559
  try {
458
- if (ranges_4_1 && !ranges_4_1.done && (_o = ranges_4.return)) _o.call(ranges_4);
560
+ if (ranges_4_1 && !ranges_4_1.done && (_u = ranges_4.return)) _u.call(ranges_4);
459
561
  }
460
- finally { if (e_9) throw e_9.error; }
562
+ finally { if (e_11) throw e_11.error; }
461
563
  }
462
564
  }
463
565
  else if (distinctRule) {
464
566
  try {
465
- for (var ranges_5 = (e_10 = void 0, tslib_1.__values(ranges)), ranges_5_1 = ranges_5.next(); !ranges_5_1.done; ranges_5_1 = ranges_5.next()) {
567
+ for (var ranges_5 = (e_12 = void 0, tslib_1.__values(ranges)), ranges_5_1 = ranges_5.next(); !ranges_5_1.done; ranges_5_1 = ranges_5.next()) {
466
568
  var range = ranges_5_1.value;
467
569
  if (range.sheetId !== sheetId) {
468
570
  continue;
@@ -477,8 +579,8 @@ var useConditionalFormatting = function (_a) {
477
579
  }
478
580
  var occurrences = new Map();
479
581
  try {
480
- for (var _3 = (e_11 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _4 = _3.next(); !_4.done; _4 = _3.next()) {
481
- var _5 = tslib_1.__read(_4.value, 2), rowIndex = _5[0], columnIndex = _5[1];
582
+ for (var _7 = (e_13 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _8 = _7.next(); !_8.done; _8 = _7.next()) {
583
+ var _9 = tslib_1.__read(_8.value, 2), rowIndex = _9[0], columnIndex = _9[1];
482
584
  var value = getValidationValue(sheetId, rowIndex, columnIndex, rule);
483
585
  if ((0, isNil_1.default)(value)) {
484
586
  continue;
@@ -494,24 +596,24 @@ var useConditionalFormatting = function (_a) {
494
596
  occurrences.get(key).push({ rowIndex: rowIndex, columnIndex: columnIndex });
495
597
  }
496
598
  }
497
- catch (e_11_1) { e_11 = { error: e_11_1 }; }
599
+ catch (e_13_1) { e_13 = { error: e_13_1 }; }
498
600
  finally {
499
601
  try {
500
- if (_4 && !_4.done && (_q = _3.return)) _q.call(_3);
602
+ if (_8 && !_8.done && (_w = _7.return)) _w.call(_7);
501
603
  }
502
- finally { if (e_11) throw e_11.error; }
604
+ finally { if (e_13) throw e_13.error; }
503
605
  }
504
606
  var shouldFormat = function (count) {
505
607
  return distinctRule.type === "DUPLICATE" ? count > 1 : count === 1;
506
608
  };
507
609
  try {
508
- for (var _6 = (e_12 = void 0, tslib_1.__values(occurrences.values())), _7 = _6.next(); !_7.done; _7 = _6.next()) {
509
- var cells = _7.value;
610
+ for (var _10 = (e_14 = void 0, tslib_1.__values(occurrences.values())), _11 = _10.next(); !_11.done; _11 = _10.next()) {
611
+ var cells = _11.value;
510
612
  if (!shouldFormat(cells.length)) {
511
613
  continue;
512
614
  }
513
615
  try {
514
- for (var cells_1 = (e_13 = void 0, tslib_1.__values(cells)), cells_1_1 = cells_1.next(); !cells_1_1.done; cells_1_1 = cells_1.next()) {
616
+ for (var cells_1 = (e_15 = void 0, tslib_1.__values(cells)), cells_1_1 = cells_1.next(); !cells_1_1.done; cells_1_1 = cells_1.next()) {
515
617
  var cell = cells_1_1.value;
516
618
  var cellId = (0, grid_1.cellIdentifier)(cell.rowIndex, cell.columnIndex);
517
619
  if (stopCells.has(cellId)) {
@@ -523,218 +625,166 @@ var useConditionalFormatting = function (_a) {
523
625
  }
524
626
  }
525
627
  }
526
- catch (e_13_1) { e_13 = { error: e_13_1 }; }
628
+ catch (e_15_1) { e_15 = { error: e_15_1 }; }
527
629
  finally {
528
630
  try {
529
- if (cells_1_1 && !cells_1_1.done && (_s = cells_1.return)) _s.call(cells_1);
631
+ if (cells_1_1 && !cells_1_1.done && (_y = cells_1.return)) _y.call(cells_1);
530
632
  }
531
- finally { if (e_13) throw e_13.error; }
633
+ finally { if (e_15) throw e_15.error; }
532
634
  }
533
635
  }
534
636
  }
535
- catch (e_12_1) { e_12 = { error: e_12_1 }; }
637
+ catch (e_14_1) { e_14 = { error: e_14_1 }; }
536
638
  finally {
537
639
  try {
538
- if (_7 && !_7.done && (_r = _6.return)) _r.call(_6);
640
+ if (_11 && !_11.done && (_x = _10.return)) _x.call(_10);
539
641
  }
540
- finally { if (e_12) throw e_12.error; }
642
+ finally { if (e_14) throw e_14.error; }
541
643
  }
542
644
  }
543
645
  }
544
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
646
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
545
647
  finally {
546
648
  try {
547
- if (ranges_5_1 && !ranges_5_1.done && (_p = ranges_5.return)) _p.call(ranges_5);
649
+ if (ranges_5_1 && !ranges_5_1.done && (_v = ranges_5.return)) _v.call(ranges_5);
548
650
  }
549
- finally { if (e_10) throw e_10.error; }
651
+ finally { if (e_12) throw e_12.error; }
550
652
  }
551
653
  }
552
654
  else if (iconSetRule) {
553
- var glyphs = cf_overlays_1.ICON_SET_GLYPHS[iconSetRule.iconSet];
554
- if (!glyphs) {
655
+ var iconCount_1 = (_h = cf_overlays_1.ICON_SET_GLYPHS[iconSetRule.iconSet]) === null || _h === void 0 ? void 0 : _h.length;
656
+ if (!iconCount_1) {
555
657
  conditionIndex++;
556
658
  return "continue";
557
659
  }
558
- var orderedGlyphs = iconSetRule.reverse
559
- ? tslib_1.__spreadArray([], tslib_1.__read(glyphs), false).reverse()
560
- : glyphs;
561
- var orderedColors = iconSetRule.reverse
562
- ? tslib_1.__spreadArray([], tslib_1.__read(cf_overlays_1.ICON_SET_COLORS[iconSetRule.iconSet]), false).reverse()
563
- : cf_overlays_1.ICON_SET_COLORS[iconSetRule.iconSet];
564
- var _loop_3 = function (range) {
565
- var e_20, _16, e_21, _17;
566
- if (range.sheetId !== sheetId)
567
- return "continue";
568
- var clampedRange = clampRange(range);
569
- // Aggregate range min/max for PERCENT/PERCENTILE threshold resolution.
570
- var rangeMin = Infinity;
571
- var rangeMax = -Infinity;
572
- var cellValues = [];
573
- try {
574
- for (var _18 = (e_20 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _19 = _18.next(); !_19.done; _19 = _18.next()) {
575
- var _20 = tslib_1.__read(_19.value, 2), rowIndex = _20[0], columnIndex = _20[1];
576
- var v = getValidationValue(sheetId, rowIndex, columnIndex, rule);
577
- if (!(0, isNil_1.default)(v) &&
578
- isNumberValue(sheetId, rowIndex, columnIndex) &&
579
- Number.isFinite(Number(v))) {
580
- var num = Number(v);
581
- cellValues.push({ rowIndex: rowIndex, columnIndex: columnIndex, value: num });
582
- if (num < rangeMin)
583
- rangeMin = num;
584
- if (num > rangeMax)
585
- rangeMax = num;
586
- }
587
- }
588
- }
589
- catch (e_20_1) { e_20 = { error: e_20_1 }; }
590
- finally {
591
- try {
592
- if (_19 && !_19.done && (_16 = _18.return)) _16.call(_18);
593
- }
594
- finally { if (e_20) throw e_20.error; }
660
+ // Thresholds resolve over the rule's whole applies-to range.
661
+ var cellValues = collectRuleNumbers(rule);
662
+ if (cellValues.length === 0) {
663
+ conditionIndex++;
664
+ return "continue";
665
+ }
666
+ var stats_1 = (_j = fullRangeStats(rule)) !== null && _j !== void 0 ? _j : (0, cf_overlays_1.buildCfRangeStats)(cellValues.map(function (cell) { return cell.value; }));
667
+ var thresholds = iconSetRule.thresholds
668
+ .slice(0, iconCount_1 - 1)
669
+ .map(function (t) { return (0, cf_overlays_1.resolveCfThreshold)(t, stats_1, { resolveFormula: resolveFormula }); });
670
+ var strict = iconSetRule.thresholds
671
+ .slice(0, iconCount_1 - 1)
672
+ .map(function (t) { return t.gte === false; });
673
+ var hideValue = iconSetRule.showValue === false;
674
+ // The icon a bucket shows: the custom mix when set, else the
675
+ // family's icon (reversed when asked).
676
+ var bucketIcon = function (bucket) {
677
+ var _a;
678
+ var custom = (_a = iconSetRule.icons) === null || _a === void 0 ? void 0 : _a[bucket];
679
+ if (custom) {
680
+ return custom.iconSet === "NoIcons"
681
+ ? undefined
682
+ : { iconSet: custom.iconSet, iconId: custom.iconId };
595
683
  }
596
- if (cellValues.length === 0)
597
- return "continue";
598
- var sortedThresholds = iconSetRule.thresholds
599
- .map(function (t) { return (0, cf_overlays_1.resolveThreshold)(t, rangeMin, rangeMax); })
600
- .filter(function (n) { return Number.isFinite(n); })
601
- .sort(function (a, b) { return a - b; });
602
- try {
603
- for (var cellValues_2 = (e_21 = void 0, tslib_1.__values(cellValues)), cellValues_2_1 = cellValues_2.next(); !cellValues_2_1.done; cellValues_2_1 = cellValues_2.next()) {
604
- var cell = cellValues_2_1.value;
605
- var bucket = (0, cf_overlays_1.pickIconBucket)(cell.value, sortedThresholds);
606
- var cellId = (0, grid_1.cellIdentifier)(cell.rowIndex, cell.columnIndex);
607
- if (stopCells.has(cellId))
608
- continue;
609
- var glyphIndex = Math.min(bucket, orderedGlyphs.length - 1);
610
- var glyph = orderedGlyphs[glyphIndex];
611
- var color = orderedColors[Math.min(bucket, orderedColors.length - 1)];
684
+ return {
685
+ iconSet: iconSetRule.iconSet,
686
+ iconId: iconSetRule.reverse ? iconCount_1 - 1 - bucket : bucket,
687
+ };
688
+ };
689
+ try {
690
+ for (var cellValues_1 = (e_16 = void 0, tslib_1.__values(cellValues)), cellValues_1_1 = cellValues_1.next(); !cellValues_1_1.done; cellValues_1_1 = cellValues_1.next()) {
691
+ var cell = cellValues_1_1.value;
692
+ var cellId = (0, grid_1.cellIdentifier)(cell.rowIndex, cell.columnIndex);
693
+ if (stopCells.has(cellId))
694
+ continue;
695
+ var icon = bucketIcon((0, cf_overlays_1.pickIconBucket)(cell.value, thresholds, strict));
696
+ if (icon) {
612
697
  layerFormat(cellId, {
613
- // iconSet + iconId are needed by the icon column filter to
614
- // match cells against a specific (iconSet, iconId) target.
615
- // They're harmless to renderers that only read `glyph`.
616
- conditionalIcon: {
617
- glyph: glyph,
618
- color: color,
619
- iconSet: iconSetRule.iconSet,
620
- iconId: glyphIndex,
621
- },
698
+ // iconSet + iconId drive the painter and the icon column
699
+ // filter; `glyph` / `color` are the text stand-ins.
700
+ conditionalIcon: tslib_1.__assign({ glyph: (_l = (_k = cf_overlays_1.ICON_SET_GLYPHS[icon.iconSet]) === null || _k === void 0 ? void 0 : _k[icon.iconId]) !== null && _l !== void 0 ? _l : "", color: (_m = cf_overlays_1.ICON_SET_COLORS[icon.iconSet]) === null || _m === void 0 ? void 0 : _m[icon.iconId], iconSet: icon.iconSet, iconId: icon.iconId }, (hideValue ? { hideValue: hideValue } : {})),
622
701
  });
623
- if (rule.stopIfTrue)
624
- stopCells.add(cellId);
625
- }
626
- }
627
- catch (e_21_1) { e_21 = { error: e_21_1 }; }
628
- finally {
629
- try {
630
- if (cellValues_2_1 && !cellValues_2_1.done && (_17 = cellValues_2.return)) _17.call(cellValues_2);
631
702
  }
632
- finally { if (e_21) throw e_21.error; }
633
- }
634
- };
635
- try {
636
- for (var ranges_6 = (e_14 = void 0, tslib_1.__values(ranges)), ranges_6_1 = ranges_6.next(); !ranges_6_1.done; ranges_6_1 = ranges_6.next()) {
637
- var range = ranges_6_1.value;
638
- _loop_3(range);
703
+ if (rule.stopIfTrue)
704
+ stopCells.add(cellId);
639
705
  }
640
706
  }
641
- catch (e_14_1) { e_14 = { error: e_14_1 }; }
707
+ catch (e_16_1) { e_16 = { error: e_16_1 }; }
642
708
  finally {
643
709
  try {
644
- if (ranges_6_1 && !ranges_6_1.done && (_t = ranges_6.return)) _t.call(ranges_6);
710
+ if (cellValues_1_1 && !cellValues_1_1.done && (_z = cellValues_1.return)) _z.call(cellValues_1);
645
711
  }
646
- finally { if (e_14) throw e_14.error; }
712
+ finally { if (e_16) throw e_16.error; }
647
713
  }
648
714
  }
649
715
  else if (dataBarRule) {
716
+ // Excel resolves a data bar's bounds over the rule's whole applies-to
717
+ // range (every area of a multi-area rule together).
718
+ var cellValues = collectRuleNumbers(rule);
719
+ if (cellValues.length === 0) {
720
+ conditionIndex++;
721
+ return "continue";
722
+ }
723
+ var stats = (_o = fullRangeStats(rule)) !== null && _o !== void 0 ? _o : (0, cf_overlays_1.buildCfRangeStats)(cellValues.map(function (cell) { return cell.value; }));
724
+ var resolvedMin = (0, cf_overlays_1.resolveCfThreshold)(dataBarRule.minpoint, stats, {
725
+ role: "min",
726
+ resolveFormula: resolveFormula,
727
+ });
728
+ var resolvedMax = (0, cf_overlays_1.resolveCfThreshold)(dataBarRule.maxpoint, stats, {
729
+ role: "max",
730
+ resolveFormula: resolveFormula,
731
+ });
732
+ var min = Number.isFinite(resolvedMin) ? resolvedMin : stats.min;
733
+ var max = Number.isFinite(resolvedMax) ? resolvedMax : stats.max;
650
734
  var barColor = (0, themes_1.getStringifiedColor)(dataBarRule.color, theme);
651
735
  var negativeColor = dataBarRule.negativeColor
652
736
  ? (0, themes_1.getStringifiedColor)(dataBarRule.negativeColor, theme)
653
- : undefined;
737
+ : barColor;
654
738
  var borderColor = dataBarRule.borderColor
655
739
  ? (0, themes_1.getStringifiedColor)(dataBarRule.borderColor, theme)
656
740
  : undefined;
741
+ var negativeBorderColor = dataBarRule.negativeBorderColor
742
+ ? (0, themes_1.getStringifiedColor)(dataBarRule.negativeBorderColor, theme)
743
+ : borderColor;
744
+ var axisColor = dataBarRule.axisColor
745
+ ? (0, themes_1.getStringifiedColor)(dataBarRule.axisColor, theme)
746
+ : undefined;
657
747
  var direction = dataBarRule.direction === "rightToLeft"
658
748
  ? "rightToLeft"
659
749
  : "leftToRight";
750
+ var hideValue = dataBarRule.showValue === false;
660
751
  try {
661
- for (var ranges_7 = (e_15 = void 0, tslib_1.__values(ranges)), ranges_7_1 = ranges_7.next(); !ranges_7_1.done; ranges_7_1 = ranges_7.next()) {
662
- var range = ranges_7_1.value;
663
- if (range.sheetId !== sheetId)
752
+ for (var cellValues_2 = (e_17 = void 0, tslib_1.__values(cellValues)), cellValues_2_1 = cellValues_2.next(); !cellValues_2_1.done; cellValues_2_1 = cellValues_2.next()) {
753
+ var cell = cellValues_2_1.value;
754
+ var cellId = (0, grid_1.cellIdentifier)(cell.rowIndex, cell.columnIndex);
755
+ if (stopCells.has(cellId))
664
756
  continue;
665
- var clampedRange = clampRange(range);
666
- var rangeMin = Infinity;
667
- var rangeMax = -Infinity;
668
- var cellValues = [];
669
- try {
670
- for (var _8 = (e_16 = void 0, tslib_1.__values((0, utils_1.iterateCellsInRange)(clampedRange))), _9 = _8.next(); !_9.done; _9 = _8.next()) {
671
- var _10 = tslib_1.__read(_9.value, 2), rowIndex = _10[0], columnIndex = _10[1];
672
- var v = getValidationValue(sheetId, rowIndex, columnIndex, rule);
673
- if (!(0, isNil_1.default)(v) &&
674
- isNumberValue(sheetId, rowIndex, columnIndex) &&
675
- Number.isFinite(Number(v))) {
676
- var num = Number(v);
677
- cellValues.push({ rowIndex: rowIndex, columnIndex: columnIndex, value: num });
678
- if (num < rangeMin)
679
- rangeMin = num;
680
- if (num > rangeMax)
681
- rangeMax = num;
682
- }
683
- }
684
- }
685
- catch (e_16_1) { e_16 = { error: e_16_1 }; }
686
- finally {
687
- try {
688
- if (_9 && !_9.done && (_v = _8.return)) _v.call(_8);
689
- }
690
- finally { if (e_16) throw e_16.error; }
691
- }
692
- if (cellValues.length === 0)
757
+ var geometry = (0, cf_data_bar_1.computeDataBarGeometry)({
758
+ value: cell.value,
759
+ min: min,
760
+ max: max,
761
+ axisPosition: dataBarRule.axisPosition,
762
+ minLength: dataBarRule.minLength,
763
+ maxLength: dataBarRule.maxLength,
764
+ direction: direction,
765
+ });
766
+ if (!geometry)
693
767
  continue;
694
- var min = (0, cf_overlays_1.resolveThreshold)(dataBarRule.minpoint, rangeMin, rangeMax);
695
- var max = (0, cf_overlays_1.resolveThreshold)(dataBarRule.maxpoint, rangeMin, rangeMax);
696
- var resolvedMin = Number.isFinite(min) ? min : rangeMin;
697
- var resolvedMax = Number.isFinite(max) ? max : rangeMax;
698
- try {
699
- for (var cellValues_1 = (e_17 = void 0, tslib_1.__values(cellValues)), cellValues_1_1 = cellValues_1.next(); !cellValues_1_1.done; cellValues_1_1 = cellValues_1.next()) {
700
- var cell = cellValues_1_1.value;
701
- var cellId = (0, grid_1.cellIdentifier)(cell.rowIndex, cell.columnIndex);
702
- if (stopCells.has(cellId))
703
- continue;
704
- var isNegative = cell.value < 0 && negativeColor !== undefined;
705
- var fill = (0, cf_overlays_1.computeDataBarFill)(isNegative ? -cell.value : cell.value, isNegative ? 0 : Math.max(0, resolvedMin), isNegative
706
- ? Math.abs(resolvedMin)
707
- : Math.max(resolvedMin, resolvedMax));
708
- layerFormat(cellId, {
709
- conditionalDataBar: {
710
- color: isNegative
711
- ? negativeColor
712
- : barColor,
713
- fillFraction: fill,
714
- negative: isNegative,
715
- borderColor: borderColor,
716
- direction: direction,
717
- },
718
- });
719
- if (rule.stopIfTrue)
720
- stopCells.add(cellId);
721
- }
722
- }
723
- catch (e_17_1) { e_17 = { error: e_17_1 }; }
724
- finally {
725
- try {
726
- if (cellValues_1_1 && !cellValues_1_1.done && (_w = cellValues_1.return)) _w.call(cellValues_1);
727
- }
728
- finally { if (e_17) throw e_17.error; }
729
- }
768
+ layerFormat(cellId, {
769
+ conditionalDataBar: tslib_1.__assign(tslib_1.__assign({ color: geometry.negative ? negativeColor : barColor, fillFraction: geometry.barEnd - geometry.barStart, negative: geometry.negative, borderColor: geometry.negative
770
+ ? negativeBorderColor
771
+ : borderColor, direction: direction, barStart: geometry.barStart, barEnd: geometry.barEnd, gradient: dataBarRule.gradient !== false }, (geometry.axisPosition !== undefined
772
+ ? {
773
+ axisPosition: geometry.axisPosition,
774
+ axisColor: axisColor !== null && axisColor !== void 0 ? axisColor : "#000000",
775
+ }
776
+ : {})), (hideValue ? { hideValue: hideValue } : {})),
777
+ });
778
+ if (rule.stopIfTrue)
779
+ stopCells.add(cellId);
730
780
  }
731
781
  }
732
- catch (e_15_1) { e_15 = { error: e_15_1 }; }
782
+ catch (e_17_1) { e_17 = { error: e_17_1 }; }
733
783
  finally {
734
784
  try {
735
- if (ranges_7_1 && !ranges_7_1.done && (_u = ranges_7.return)) _u.call(ranges_7);
785
+ if (cellValues_2_1 && !cellValues_2_1.done && (_0 = cellValues_2.return)) _0.call(cellValues_2);
736
786
  }
737
- finally { if (e_15) throw e_15.error; }
787
+ finally { if (e_17) throw e_17.error; }
738
788
  }
739
789
  }
740
790
  conditionIndex++;
@@ -766,6 +816,7 @@ var useConditionalFormatting = function (_a) {
766
816
  getSheetColumnCount,
767
817
  evaluationWindow,
768
818
  getConditionalFormatResult,
819
+ getConditionalFormatRuleStats,
769
820
  ]);
770
821
  };
771
822
  exports.useConditionalFormatting = useConditionalFormatting;