@univerjs/sheets-data-validation-ui 1.0.0-beta.0 → 1.0.0-beta.1

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 (84) hide show
  1. package/lib/cjs/index.js +90 -129
  2. package/lib/cjs/locale/ar-SA.js +1 -36
  3. package/lib/cjs/locale/ca-ES.js +1 -36
  4. package/lib/cjs/locale/de-DE.js +1 -36
  5. package/lib/cjs/locale/en-US.js +1 -36
  6. package/lib/cjs/locale/es-ES.js +1 -36
  7. package/lib/cjs/locale/fa-IR.js +1 -36
  8. package/lib/cjs/locale/fr-FR.js +1 -36
  9. package/lib/cjs/locale/id-ID.js +1 -36
  10. package/lib/cjs/locale/it-IT.js +1 -36
  11. package/lib/cjs/locale/ja-JP.js +1 -36
  12. package/lib/cjs/locale/ko-KR.js +1 -36
  13. package/lib/cjs/locale/pl-PL.js +1 -36
  14. package/lib/cjs/locale/pt-BR.js +1 -36
  15. package/lib/cjs/locale/ru-RU.js +1 -36
  16. package/lib/cjs/locale/sk-SK.js +1 -36
  17. package/lib/cjs/locale/vi-VN.js +1 -36
  18. package/lib/cjs/locale/zh-CN.js +1 -36
  19. package/lib/cjs/locale/zh-HK.js +1 -36
  20. package/lib/cjs/locale/zh-TW.js +1 -36
  21. package/lib/es/index.js +91 -130
  22. package/lib/es/locale/ar-SA.js +1 -36
  23. package/lib/es/locale/ca-ES.js +1 -36
  24. package/lib/es/locale/de-DE.js +1 -36
  25. package/lib/es/locale/en-US.js +1 -36
  26. package/lib/es/locale/es-ES.js +1 -36
  27. package/lib/es/locale/fa-IR.js +1 -36
  28. package/lib/es/locale/fr-FR.js +1 -36
  29. package/lib/es/locale/id-ID.js +1 -36
  30. package/lib/es/locale/it-IT.js +1 -36
  31. package/lib/es/locale/ja-JP.js +1 -36
  32. package/lib/es/locale/ko-KR.js +1 -36
  33. package/lib/es/locale/pl-PL.js +1 -36
  34. package/lib/es/locale/pt-BR.js +1 -36
  35. package/lib/es/locale/ru-RU.js +1 -36
  36. package/lib/es/locale/sk-SK.js +1 -36
  37. package/lib/es/locale/vi-VN.js +1 -36
  38. package/lib/es/locale/zh-CN.js +1 -36
  39. package/lib/es/locale/zh-HK.js +1 -36
  40. package/lib/es/locale/zh-TW.js +1 -36
  41. package/lib/index.css +24 -8
  42. package/lib/index.js +91 -130
  43. package/lib/locale/ar-SA.js +1 -36
  44. package/lib/locale/ca-ES.js +1 -36
  45. package/lib/locale/de-DE.js +1 -36
  46. package/lib/locale/en-US.js +1 -36
  47. package/lib/locale/es-ES.js +1 -36
  48. package/lib/locale/fa-IR.js +1 -36
  49. package/lib/locale/fr-FR.js +1 -36
  50. package/lib/locale/id-ID.js +1 -36
  51. package/lib/locale/it-IT.js +1 -36
  52. package/lib/locale/ja-JP.js +1 -36
  53. package/lib/locale/ko-KR.js +1 -36
  54. package/lib/locale/pl-PL.js +1 -36
  55. package/lib/locale/pt-BR.js +1 -36
  56. package/lib/locale/ru-RU.js +1 -36
  57. package/lib/locale/sk-SK.js +1 -36
  58. package/lib/locale/vi-VN.js +1 -36
  59. package/lib/locale/zh-CN.js +1 -36
  60. package/lib/locale/zh-HK.js +1 -36
  61. package/lib/locale/zh-TW.js +1 -36
  62. package/lib/types/const.d.ts +2 -1
  63. package/lib/types/locale/en-US.d.ts +0 -39
  64. package/lib/umd/index.js +1 -1
  65. package/lib/umd/locale/ar-SA.js +1 -1
  66. package/lib/umd/locale/ca-ES.js +1 -1
  67. package/lib/umd/locale/de-DE.js +1 -1
  68. package/lib/umd/locale/en-US.js +1 -1
  69. package/lib/umd/locale/es-ES.js +1 -1
  70. package/lib/umd/locale/fa-IR.js +1 -1
  71. package/lib/umd/locale/fr-FR.js +1 -1
  72. package/lib/umd/locale/id-ID.js +1 -1
  73. package/lib/umd/locale/it-IT.js +1 -1
  74. package/lib/umd/locale/ja-JP.js +1 -1
  75. package/lib/umd/locale/ko-KR.js +1 -1
  76. package/lib/umd/locale/pl-PL.js +1 -1
  77. package/lib/umd/locale/pt-BR.js +1 -1
  78. package/lib/umd/locale/ru-RU.js +1 -1
  79. package/lib/umd/locale/sk-SK.js +1 -1
  80. package/lib/umd/locale/vi-VN.js +1 -1
  81. package/lib/umd/locale/zh-CN.js +1 -1
  82. package/lib/umd/locale/zh-HK.js +1 -1
  83. package/lib/umd/locale/zh-TW.js +1 -1
  84. package/package.json +13 -13
package/lib/cjs/index.js CHANGED
@@ -162,7 +162,8 @@ const defaultPluginConfig = {};
162
162
  * See the License for the specific language governing permissions and
163
163
  * limitations under the License.
164
164
  */
165
- const DROP_DOWN_DEFAULT_COLOR = "#ECECEC";
165
+ const DROP_DOWN_DEFAULT_COLOR = "gray.100";
166
+ const DROP_DOWN_ICON_COLOR = "gray.600";
166
167
 
167
168
  //#endregion
168
169
  //#region src/controllers/dv-reject-input.controller.ts
@@ -450,7 +451,7 @@ let DataValidationDropdownManagerService = class DataValidationDropdownManagerSe
450
451
  options: list.map((item) => ({
451
452
  label: item.label,
452
453
  value: item.label,
453
- color: showColor || item.color ? item.color || "#ECECEC" : "transparent"
454
+ color: showColor || item.color ? item.color || "gray.100" : "transparent"
454
455
  })),
455
456
  onEdit: handleEdit,
456
457
  defaultValue: cellStr,
@@ -775,7 +776,7 @@ function DropdownPresets({ onChange }) {
775
776
  children: presets.map((values) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
776
777
  type: "button",
777
778
  "aria-label": values.join(" / "),
778
- className: "univer-flex univer-min-h-20 univer-cursor-pointer univer-flex-col univer-items-start univer-gap-1.5 univer-rounded-md univer-border-0 univer-bg-gray-50 univer-p-3 univer-text-left univer-text-sm univer-leading-5 univer-text-gray-900 univer-transition-colors hover:univer-bg-gray-100 focus-visible:univer-outline-none focus-visible:univer-ring-2 focus-visible:univer-ring-primary-600 focus-visible:univer-ring-offset-0 dark:!univer-bg-gray-800 dark:!univer-text-white dark:hover:!univer-bg-gray-700",
779
+ className: "univer-flex univer-min-h-20 univer-cursor-pointer univer-flex-col univer-items-start univer-gap-1.5 univer-rounded-md univer-border-0 univer-bg-gray-50 univer-p-3 univer-text-left univer-text-sm univer-leading-5 univer-text-gray-900 univer-transition-colors hover:univer-bg-gray-100 focus-visible:univer-outline-none focus-visible:univer-ring-2 focus-visible:univer-ring-primary-600 focus-visible:univer-ring-offset-0 dark:!univer-bg-gray-800 dark:!univer-text-gray-0 dark:hover:!univer-bg-gray-700",
779
780
  onClick: () => onChange((0, _univerjs_sheets.serializeListOptions)(values)),
780
781
  children: values.map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
781
782
  className: "univer-w-full univer-break-words",
@@ -990,7 +991,7 @@ const menuSchema = {
990
991
  //#endregion
991
992
  //#region package.json
992
993
  var name = "@univerjs/sheets-data-validation-ui";
993
- var version = "1.0.0-beta.0";
994
+ var version = "1.0.0-beta.1";
994
995
 
995
996
  //#endregion
996
997
  //#region src/views/components/DataValidationOptions.tsx
@@ -1001,7 +1002,7 @@ function DataValidationOptions(props) {
1001
1002
  const [show, setShow] = (0, react.useState)(false);
1002
1003
  const ExtraOptions = extraComponent ? componentManager.get(extraComponent) : null;
1003
1004
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1004
- className: "univer-mb-3 univer-flex univer-cursor-pointer univer-items-center univer-text-sm univer-text-gray-900 dark:!univer-text-white",
1005
+ className: "univer-mb-3 univer-flex univer-cursor-pointer univer-items-center univer-text-sm univer-text-gray-900 dark:!univer-text-gray-0",
1005
1006
  onClick: () => setShow(!show),
1006
1007
  children: [localeService.t("sheets-data-validation-ui.panel.options"), show ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreUpIcon, { className: "univer-ml-1" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreDownIcon, { className: "univer-ml-1" })]
1007
1008
  }), show && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
@@ -1401,7 +1402,7 @@ const DataValidationItem = (props) => {
1401
1402
  };
1402
1403
  }, [markSelectionService]);
1403
1404
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1404
- className: (0, _univerjs_design.clsx)("univer-bg-secondary univer-relative univer--mx-2 univer-box-border univer-flex univer-w-[287px] univer-cursor-pointer univer-flex-col univer-justify-between univer-overflow-hidden univer-rounded-md univer-p-2 univer-pr-9", {
1405
+ className: (0, _univerjs_design.clsx)("univer-bg-secondary univer-relative univer--mx-2 univer-box-border univer-flex univer-w-[287px] univer-cursor-pointer univer-flex-col univer-justify-between univer-overflow-hidden univer-rounded-md univer-p-2 univer-pr-9 rtl:univer-pl-9 rtl:univer-pr-2", {
1405
1406
  "hover:univer-bg-gray-50 dark:hover:!univer-bg-gray-700": !disable,
1406
1407
  "univer-opacity-50": disable
1407
1408
  }),
@@ -1425,7 +1426,7 @@ const DataValidationItem = (props) => {
1425
1426
  },
1426
1427
  children: [
1427
1428
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1428
- className: "univer-truncate univer-text-sm univer-font-medium univer-leading-[22px] univer-text-gray-900 dark:!univer-text-white",
1429
+ className: "univer-truncate univer-text-sm univer-font-medium univer-leading-[22px] univer-text-gray-900 dark:!univer-text-gray-0",
1429
1430
  children: validator === null || validator === void 0 ? void 0 : validator.generateRuleName(rule)
1430
1431
  }),
1431
1432
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -1433,7 +1434,7 @@ const DataValidationItem = (props) => {
1433
1434
  children: rule.ranges.map((range) => (0, _univerjs_engine_formula.serializeRange)(range)).join(",")
1434
1435
  }),
1435
1436
  isHover && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1436
- className: "univer-absolute univer-right-2 univer-top-[19px] univer-flex univer-size-5 univer-items-center univer-justify-center univer-rounded hover:univer-bg-gray-200 dark:!univer-text-gray-300 dark:hover:!univer-bg-gray-700",
1437
+ className: "univer-absolute univer-right-2 univer-top-[19px] univer-flex univer-size-5 univer-items-center univer-justify-center univer-rounded hover:univer-bg-gray-200 rtl:univer-left-2 rtl:univer-right-auto dark:!univer-text-gray-300 dark:hover:!univer-bg-gray-700",
1437
1438
  onClick: handleDelete,
1438
1439
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.DeleteIcon, {})
1439
1440
  })
@@ -1684,7 +1685,7 @@ function CustomFormulaInput(props) {
1684
1685
  error: formula1Res,
1685
1686
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_sheets_formula_ui.FormulaEditor, {
1686
1687
  ref: formulaEditorRef,
1687
- className: (0, _univerjs_design.clsx)("univer-box-border univer-h-8 univer-w-full univer-cursor-pointer univer-items-center univer-rounded-lg univer-bg-white univer-pt-2 univer-transition-colors hover:univer-border-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-white [&>div:first-child]:univer-px-2.5 [&>div]:univer-h-5 [&>div]:univer-ring-transparent", _univerjs_design.borderClassName),
1688
+ className: (0, _univerjs_design.clsx)("univer-box-border univer-h-8 univer-w-full univer-cursor-pointer univer-items-center univer-rounded-lg univer-bg-gray-0 univer-pt-2 univer-transition-colors hover:univer-border-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-gray-0 [&>div:first-child]:univer-px-2.5 [&>div]:univer-h-5 [&>div]:univer-ring-transparent", _univerjs_design.borderClassName),
1688
1689
  initValue: (value === null || value === void 0 ? void 0 : value.formula1) ?? "=",
1689
1690
  unitId,
1690
1691
  subUnitId,
@@ -1765,6 +1766,9 @@ const DEFAULT_COLOR_PRESET = [
1765
1766
  const ColorSelect = (props) => {
1766
1767
  const { value, onChange, disabled } = props;
1767
1768
  const [open, setOpen] = (0, react.useState)(false);
1769
+ const themeService = (0, _univerjs_ui.useDependency)(_univerjs_core.ThemeService);
1770
+ (0, _univerjs_ui.useObservable)(themeService.currentTheme$);
1771
+ const backgroundColor = value.includes(".") && themeService.isValidThemeColor(value) ? themeService.getColorFromTheme(value) : value;
1768
1772
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Dropdown, {
1769
1773
  align: "start",
1770
1774
  disabled,
@@ -1782,10 +1786,10 @@ const ColorSelect = (props) => {
1782
1786
  }, color))
1783
1787
  }),
1784
1788
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1785
- className: (0, _univerjs_design.clsx)("univer-box-border univer-inline-flex univer-h-8 univer-w-16 univer-cursor-pointer univer-items-center univer-justify-between univer-gap-2 univer-rounded-lg univer-bg-white univer-px-2.5 univer-transition-colors univer-duration-200 hover:univer-border-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-white", _univerjs_design.borderClassName),
1789
+ className: (0, _univerjs_design.clsx)("univer-box-border univer-inline-flex univer-h-8 univer-w-16 univer-cursor-pointer univer-items-center univer-justify-between univer-gap-2 univer-rounded-lg univer-bg-gray-0 univer-px-2.5 univer-transition-colors univer-duration-200 hover:univer-border-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-gray-0", _univerjs_design.borderClassName),
1786
1790
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1787
1791
  className: "univer-box-border univer-size-4 univer-rounded univer-text-base",
1788
- style: { background: value }
1792
+ style: { background: backgroundColor }
1789
1793
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreDownIcon, {})]
1790
1794
  })
1791
1795
  });
@@ -1870,7 +1874,7 @@ function ListFormulaInput(props) {
1870
1874
  const strColors = formula2.split(",");
1871
1875
  return strOptions.map((label, i) => ({
1872
1876
  label,
1873
- color: strColors[i] || "#ECECEC",
1877
+ color: strColors[i] || "gray.100",
1874
1878
  isRef: false,
1875
1879
  id: (0, _univerjs_core.generateRandomId)(4)
1876
1880
  }));
@@ -1891,7 +1895,7 @@ function ListFormulaInput(props) {
1891
1895
  };
1892
1896
  const refFinalList = (0, react.useMemo)(() => refOptions.map((label, i) => ({
1893
1897
  label,
1894
- color: refColors[i] || "#ECECEC",
1898
+ color: refColors[i] || "gray.100",
1895
1899
  id: `${i}`,
1896
1900
  isRef: true
1897
1901
  })), [refColors, refOptions]);
@@ -1981,7 +1985,7 @@ function ListFormulaInput(props) {
1981
1985
  error: formula1Res || localError || void 0,
1982
1986
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_sheets_formula_ui.FormulaEditor, {
1983
1987
  ref: formulaEditorRef,
1984
- className: (0, _univerjs_design.clsx)("univer-box-border univer-h-8 univer-w-full univer-cursor-pointer univer-items-center univer-rounded-lg univer-bg-white univer-pt-2 univer-transition-colors hover:univer-border-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-white [&>div:first-child]:univer-px-2.5 [&>div]:univer-h-5 [&>div]:univer-ring-transparent", _univerjs_design.borderClassName),
1988
+ className: (0, _univerjs_design.clsx)("univer-box-border univer-h-8 univer-w-full univer-cursor-pointer univer-items-center univer-rounded-lg univer-bg-gray-0 univer-pt-2 univer-transition-colors hover:univer-border-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-gray-0 [&>div:first-child]:univer-px-2.5 [&>div]:univer-h-5 [&>div]:univer-ring-transparent", _univerjs_design.borderClassName),
1985
1989
  initValue: formulaStr,
1986
1990
  unitId,
1987
1991
  subUnitId,
@@ -2204,52 +2208,36 @@ let DataValidationAutoFillController = class DataValidationAutoFillController ex
2204
2208
  const ruleMatrixCopy = this._sheetDataValidationModel.getRuleObjectMatrix(unitId, subUnitId).clone();
2205
2209
  const virtualRange = (0, _univerjs_sheets_ui.virtualizeDiscreteRanges)([sourceRange, targetRange]);
2206
2210
  const [vSourceRange, vTargetRange] = virtualRange.ranges;
2207
- const { mapFunc } = virtualRange;
2208
- const sourceStartCell = {
2209
- row: vSourceRange.startRow,
2210
- col: vSourceRange.startColumn
2211
- };
2211
+ const { mapRange, projectRange } = virtualRange;
2212
2212
  const repeats = _univerjs_sheets.AutoFillTools.getAutoFillRepeatRange(vSourceRange, vTargetRange);
2213
- const additionMatrix = new _univerjs_core.ObjectMatrix();
2214
- const additionRules = /* @__PURE__ */ new Set();
2215
- repeats.forEach((repeat) => {
2216
- const targetStartCell = repeat.repeatStartCell;
2217
- const relativeRange = repeat.relativeRange;
2218
- const sourceRange = {
2219
- startRow: sourceStartCell.row,
2220
- startColumn: sourceStartCell.col,
2221
- endColumn: sourceStartCell.col,
2222
- endRow: sourceStartCell.row
2223
- };
2224
- const targetRange = {
2225
- startRow: targetStartCell.row,
2226
- startColumn: targetStartCell.col,
2227
- endColumn: targetStartCell.col,
2228
- endRow: targetStartCell.row
2229
- };
2230
- _univerjs_core.Range.foreach(relativeRange, (row, col) => {
2231
- const sourcePositionRange = _univerjs_core.Rectangle.getPositionRange({
2232
- startRow: row,
2233
- startColumn: col,
2234
- endColumn: col,
2235
- endRow: row
2236
- }, sourceRange);
2237
- const { row: sourceRow, col: sourceCol } = mapFunc(sourcePositionRange.startRow, sourcePositionRange.startColumn);
2238
- const ruleId = this._sheetDataValidationModel.getRuleIdByLocation(unitId, subUnitId, sourceRow, sourceCol) || "";
2239
- const targetPositionRange = _univerjs_core.Rectangle.getPositionRange({
2240
- startRow: row,
2241
- startColumn: col,
2242
- endColumn: col,
2243
- endRow: row
2244
- }, targetRange);
2245
- const { row: targetRow, col: targetCol } = mapFunc(targetPositionRange.startRow, targetPositionRange.startColumn);
2246
- additionMatrix.setValue(targetRow, targetCol, ruleId);
2247
- additionRules.add(ruleId);
2213
+ const additionsByRuleId = /* @__PURE__ */ new Map();
2214
+ additionsByRuleId.set("", repeats.flatMap((repeat) => mapRange(_univerjs_core.Rectangle.getPositionRange(repeat.relativeRange, {
2215
+ startRow: repeat.repeatStartCell.row,
2216
+ endRow: repeat.repeatStartCell.row,
2217
+ startColumn: repeat.repeatStartCell.col,
2218
+ endColumn: repeat.repeatStartCell.col
2219
+ }))));
2220
+ this._sheetDataValidationModel.getRules(unitId, subUnitId).forEach((rule) => {
2221
+ const relativeSourceRanges = rule.ranges.flatMap((range) => {
2222
+ const projected = projectRange(range);
2223
+ const intersected = projected && (0, _univerjs_core.getIntersectRange)(projected, vSourceRange);
2224
+ return intersected ? [_univerjs_core.Rectangle.getRelativeRange(intersected, vSourceRange)] : [];
2248
2225
  });
2226
+ const targetRanges = repeats.flatMap((repeat) => relativeSourceRanges.flatMap((sourceRange) => {
2227
+ const copiedRange = (0, _univerjs_core.getIntersectRange)(sourceRange, repeat.relativeRange);
2228
+ if (!copiedRange) return [];
2229
+ return mapRange(_univerjs_core.Rectangle.getPositionRange(copiedRange, {
2230
+ startRow: repeat.repeatStartCell.row,
2231
+ endRow: repeat.repeatStartCell.row,
2232
+ startColumn: repeat.repeatStartCell.col,
2233
+ endColumn: repeat.repeatStartCell.col
2234
+ }));
2235
+ }));
2236
+ if (targetRanges.length) additionsByRuleId.set(rule.uid, targetRanges);
2249
2237
  });
2250
- const additions = Array.from(additionRules).map((id) => ({
2238
+ const additions = Array.from(additionsByRuleId, ([id, ranges]) => ({
2251
2239
  id,
2252
- ranges: (0, _univerjs_core.queryObjectMatrix)(additionMatrix, (value) => value === id)
2240
+ ranges: ranges.length > 1 ? _univerjs_core.Rectangle.mergeRanges(ranges) : ranges
2253
2241
  }));
2254
2242
  ruleMatrixCopy.addRangeRules(additions);
2255
2243
  const { redoMutations, undoMutations } = (0, _univerjs_sheets_data_validation.getDataValidationDiffMutations)(unitId, subUnitId, ruleMatrixCopy.diff(this._sheetDataValidationModel.getRules(unitId, subUnitId)), this._injector, "patched", applyType === _univerjs_sheets.AUTO_FILL_APPLY_TYPE.ONLY_FORMAT);
@@ -2262,13 +2250,8 @@ let DataValidationAutoFillController = class DataValidationAutoFillController ex
2262
2250
  id: _univerjs_sheets_data_validation.DATA_VALIDATION_PLUGIN_NAME,
2263
2251
  onBeforeFillData: (location) => {
2264
2252
  const { source: sourceRange, unitId, subUnitId } = location;
2265
- for (const row of sourceRange.rows) for (const col of sourceRange.cols) {
2266
- const dv = this._sheetDataValidationModel.getRuleByLocation(unitId, subUnitId, row, col);
2267
- if (dv && dv.type === _univerjs_core.DataValidationType.CHECKBOX) {
2268
- this._autoFillService.setDisableApplyType(_univerjs_sheets.AUTO_FILL_APPLY_TYPE.SERIES, true);
2269
- return;
2270
- }
2271
- }
2253
+ const { projectRange } = (0, _univerjs_sheets_ui.virtualizeDiscreteRanges)([sourceRange]);
2254
+ if (this._sheetDataValidationModel.getRules(unitId, subUnitId).some((rule) => rule.type === _univerjs_core.DataValidationType.CHECKBOX && rule.ranges.some((range) => projectRange(range) !== null))) this._autoFillService.setDisableApplyType(_univerjs_sheets.AUTO_FILL_APPLY_TYPE.SERIES, true);
2272
2255
  },
2273
2256
  onFillData: (location, direction, applyType) => {
2274
2257
  if (applyType === _univerjs_sheets.AUTO_FILL_APPLY_TYPE.COPY || applyType === _univerjs_sheets.AUTO_FILL_APPLY_TYPE.ONLY_FORMAT || applyType === _univerjs_sheets.AUTO_FILL_APPLY_TYPE.SERIES) return generalApplyFunc(location, applyType);
@@ -2317,25 +2300,31 @@ let DataValidationCopyPasteController = class DataValidationCopyPasteController
2317
2300
  });
2318
2301
  }
2319
2302
  _collect(unitId, subUnitId, range) {
2320
- const matrix = new _univerjs_core.ObjectMatrix();
2303
+ const rules = /* @__PURE__ */ new Map();
2321
2304
  this._copyInfo = {
2322
2305
  unitId,
2323
2306
  subUnitId,
2324
- matrix
2307
+ rules
2325
2308
  };
2326
2309
  const discreteRange = this._injector.invoke((accessor) => {
2327
2310
  return (0, _univerjs_sheets.rangeToDiscreteRange)(range, accessor, unitId, subUnitId);
2328
2311
  });
2329
2312
  if (!discreteRange) return;
2330
- const { rows, cols } = discreteRange;
2331
- rows.forEach((row, rowIndex) => {
2332
- cols.forEach((col, colIndex) => {
2333
- const ruleId = this._sheetDataValidationModel.getRuleIdByLocation(unitId, subUnitId, row, col);
2334
- matrix.setValue(rowIndex, colIndex, ruleId ?? "");
2313
+ const { projectRange } = (0, _univerjs_sheets_ui.virtualizeDiscreteRanges)([discreteRange]);
2314
+ this._sheetDataValidationModel.getRules(unitId, subUnitId).forEach((rule) => {
2315
+ const projectedRanges = rule.ranges.flatMap((ruleRange) => {
2316
+ const projected = projectRange(ruleRange);
2317
+ return projected ? [projected] : [];
2335
2318
  });
2319
+ if (projectedRanges.length) rules.set(rule.uid, projectedRanges.length > 1 ? _univerjs_core.Rectangle.mergeRanges(projectedRanges) : projectedRanges);
2336
2320
  });
2337
2321
  }
2338
2322
  _generateMutations(pasteFrom, pasteTo, payload) {
2323
+ const copyInfo = this._copyInfo;
2324
+ if (!copyInfo) return {
2325
+ redos: [],
2326
+ undos: []
2327
+ };
2339
2328
  const { unitId: copyUnitId, subUnitId: copySubUnitId, range: copyRange } = pasteFrom;
2340
2329
  const { unitId: pastedUnitId, subUnitId: pastedSubUnitId, range: pastedRange } = pasteTo;
2341
2330
  const { copyType = _univerjs_sheets_ui.COPY_TYPE.COPY } = payload;
@@ -2353,51 +2342,38 @@ let DataValidationCopyPasteController = class DataValidationCopyPasteController
2353
2342
  undos: []
2354
2343
  };
2355
2344
  }
2345
+ const sourceVirtualRange = (0, _univerjs_sheets_ui.virtualizeDiscreteRanges)([copyRange]).ranges[0];
2346
+ const targetVirtualization = (0, _univerjs_sheets_ui.virtualizeDiscreteRanges)([pastedRange]);
2347
+ const targetVirtualRange = targetVirtualization.ranges[0];
2348
+ const repeatRange = (0, _univerjs_sheets_ui.getRepeatRange)(sourceVirtualRange, targetVirtualRange, true);
2349
+ const clearTargetRanges = targetVirtualization.mapRange(targetVirtualRange);
2350
+ const getTargetRanges = (sourceRanges) => repeatRange.flatMap(({ startRange }) => sourceRanges.flatMap((sourceRange) => targetVirtualization.mapRange(_univerjs_core.Rectangle.getPositionRange(sourceRange, startRange))));
2356
2351
  if (pastedUnitId !== copyUnitId || pastedSubUnitId !== copySubUnitId) {
2357
2352
  const ruleMatrix = this._sheetDataValidationModel.getRuleObjectMatrix(pastedUnitId, pastedSubUnitId).clone();
2358
- const additionMatrix = new _univerjs_core.ObjectMatrix();
2359
- const addRules = /* @__PURE__ */ new Set();
2360
- const { ranges: [vCopyRange, vPastedRange], mapFunc } = (0, _univerjs_sheets_ui.virtualizeDiscreteRanges)([copyRange, pastedRange]);
2361
- const repeatRange = (0, _univerjs_sheets_ui.getRepeatRange)(vCopyRange, vPastedRange, true);
2362
2353
  const additionRules = /* @__PURE__ */ new Map();
2363
- repeatRange.forEach(({ startRange }) => {
2364
- var _this$_copyInfo;
2365
- (_this$_copyInfo = this._copyInfo) === null || _this$_copyInfo === void 0 || _this$_copyInfo.matrix.forValue((row, col, ruleId) => {
2366
- const range = _univerjs_core.Rectangle.getPositionRange({
2367
- startRow: row,
2368
- endRow: row,
2369
- startColumn: col,
2370
- endColumn: col
2371
- }, startRange);
2372
- const transformedRuleId = `${copySubUnitId}-${ruleId}`;
2373
- const oldRule = this._sheetDataValidationModel.getRuleById(copyUnitId, copySubUnitId, ruleId);
2374
- if (!this._sheetDataValidationModel.getRuleById(pastedUnitId, pastedSubUnitId, transformedRuleId) && oldRule) additionRules.set(transformedRuleId, {
2375
- ...oldRule,
2376
- uid: transformedRuleId
2377
- });
2378
- const { row: startRow, col: startColumn } = mapFunc(range.startRow, range.startColumn);
2379
- addRules.add(transformedRuleId);
2380
- additionMatrix.setValue(startRow, startColumn, transformedRuleId);
2354
+ const additions = [{
2355
+ id: "",
2356
+ ranges: clearTargetRanges
2357
+ }];
2358
+ copyInfo.rules.forEach((ranges, ruleId) => {
2359
+ const transformedRuleId = `${copySubUnitId}-${ruleId}`;
2360
+ const oldRule = this._sheetDataValidationModel.getRuleById(copyUnitId, copySubUnitId, ruleId);
2361
+ if (!this._sheetDataValidationModel.getRuleById(pastedUnitId, pastedSubUnitId, transformedRuleId) && oldRule) additionRules.set(transformedRuleId, {
2362
+ ...oldRule,
2363
+ uid: transformedRuleId
2364
+ });
2365
+ additions.push({
2366
+ id: transformedRuleId,
2367
+ ranges: getTargetRanges(ranges)
2381
2368
  });
2382
2369
  });
2383
- const additions = Array.from(addRules).map((id) => ({
2384
- id,
2385
- ranges: (0, _univerjs_core.queryObjectMatrix)(additionMatrix, (value) => value === id)
2386
- }));
2387
2370
  ruleMatrix.addRangeRules(additions);
2388
2371
  const { redoMutations, undoMutations } = (0, _univerjs_sheets_data_validation.getDataValidationDiffMutations)(pastedUnitId, pastedSubUnitId, ruleMatrix.diffWithAddition(this._sheetDataValidationModel.getRules(pastedUnitId, pastedSubUnitId), additionRules.values()), this._injector, "patched", false);
2389
2372
  if (copyType === _univerjs_sheets_ui.COPY_TYPE.CUT) {
2390
2373
  const copySheetRuleMatrix = this._sheetDataValidationModel.getRuleObjectMatrix(copyUnitId, copySubUnitId).clone();
2391
- const deleteRangeStartCell = mapFunc(vCopyRange.startRow, vCopyRange.startColumn);
2392
- const deleteRangeEndCell = mapFunc(vCopyRange.endRow, vCopyRange.endColumn);
2393
2374
  copySheetRuleMatrix.addRangeRules([{
2394
2375
  id: "",
2395
- ranges: [{
2396
- startRow: deleteRangeStartCell.row,
2397
- endRow: deleteRangeEndCell.row,
2398
- startColumn: deleteRangeStartCell.col,
2399
- endColumn: deleteRangeEndCell.col
2400
- }]
2376
+ ranges: (0, _univerjs_sheets_ui.virtualizeDiscreteRanges)([copyRange]).mapRange(sourceVirtualRange)
2401
2377
  }]);
2402
2378
  const { redoMutations: cutRedos, undoMutations: cutUndos } = (0, _univerjs_sheets_data_validation.getDataValidationDiffMutations)(copyUnitId, copySubUnitId, copySheetRuleMatrix.diff(this._sheetDataValidationModel.getRules(copyUnitId, copySubUnitId)), this._injector, "patched", false);
2403
2379
  redoMutations.push(...cutRedos);
@@ -2409,27 +2385,13 @@ let DataValidationCopyPasteController = class DataValidationCopyPasteController
2409
2385
  };
2410
2386
  } else {
2411
2387
  const ruleMatrix = this._sheetDataValidationModel.getRuleObjectMatrix(copyUnitId, copySubUnitId).clone();
2412
- const additionMatrix = new _univerjs_core.ObjectMatrix();
2413
- const additionRules = /* @__PURE__ */ new Set();
2414
- const { ranges: [vCopyRange, vPastedRange], mapFunc } = (0, _univerjs_sheets_ui.virtualizeDiscreteRanges)([copyRange, pastedRange]);
2415
- (0, _univerjs_sheets_ui.getRepeatRange)(vCopyRange, vPastedRange, true).forEach(({ startRange }) => {
2416
- var _this$_copyInfo2;
2417
- (_this$_copyInfo2 = this._copyInfo) === null || _this$_copyInfo2 === void 0 || _this$_copyInfo2.matrix.forValue((row, col, ruleId) => {
2418
- const range = _univerjs_core.Rectangle.getPositionRange({
2419
- startRow: row,
2420
- endRow: row,
2421
- startColumn: col,
2422
- endColumn: col
2423
- }, startRange);
2424
- const { row: startRow, col: startColumn } = mapFunc(range.startRow, range.startColumn);
2425
- additionMatrix.setValue(startRow, startColumn, ruleId);
2426
- additionRules.add(ruleId);
2427
- });
2428
- });
2429
- const additions = Array.from(additionRules).map((id) => ({
2388
+ const additions = [{
2389
+ id: "",
2390
+ ranges: clearTargetRanges
2391
+ }, ...Array.from(copyInfo.rules, ([id, ranges]) => ({
2430
2392
  id,
2431
- ranges: (0, _univerjs_core.queryObjectMatrix)(additionMatrix, (value) => value === id)
2432
- }));
2393
+ ranges: getTargetRanges(ranges)
2394
+ }))];
2433
2395
  ruleMatrix.addRangeRules(additions);
2434
2396
  const { redoMutations, undoMutations } = (0, _univerjs_sheets_data_validation.getDataValidationDiffMutations)(pastedUnitId, pastedSubUnitId, ruleMatrix.diff(this._sheetDataValidationModel.getRules(copyUnitId, copySubUnitId)), this._injector, "patched", false);
2435
2397
  return {
@@ -3165,7 +3127,7 @@ var Dropdown = class extends _univerjs_engine_render.Shape {
3165
3127
  width: layout.width,
3166
3128
  height: layout.height,
3167
3129
  radius: RADIUS,
3168
- fill: fill || "#ECECEC"
3130
+ fill: fill || "gray.100"
3169
3131
  });
3170
3132
  ctx.translateWithPrecision(4, layout.ba);
3171
3133
  ctx.font = fontString;
@@ -3212,7 +3174,7 @@ let DropdownMultipleWidget = class DropdownMultipleWidget {
3212
3174
  }
3213
3175
  ctx.save();
3214
3176
  ctx.translateWithPrecision(cellBounding.startX + left, cellBounding.startY + top);
3215
- ctx.fillStyle = "#565656";
3177
+ ctx.fillStyle = DROP_DOWN_ICON_COLOR;
3216
3178
  ctx.fill(downPath$1);
3217
3179
  ctx.restore();
3218
3180
  }
@@ -3411,7 +3373,6 @@ const PADDING_V = 1;
3411
3373
  const MARGIN_H = 6;
3412
3374
  const MARGIN_V = 3;
3413
3375
  const RADIUS_BG = 8;
3414
- const DROP_DOWN_ICON_COLOR = "#565656";
3415
3376
  const downPath = new Path2D("M3.32201 4.84556C3.14417 5.05148 2.85583 5.05148 2.67799 4.84556L0.134292 1.90016C-0.152586 1.56798 0.0505937 1 0.456301 1L5.5437 1C5.94941 1 6.15259 1.56798 5.86571 1.90016L3.32201 4.84556Z");
3416
3377
  function calcPadding(cellWidth, cellHeight, fontWidth, fontHeight, vt, ht, margin = true) {
3417
3378
  let paddingTop = 0;
@@ -3482,7 +3443,7 @@ let DropdownWidget = class DropdownWidget {
3482
3443
  }
3483
3444
  ctx.save();
3484
3445
  ctx.translateWithPrecision(cellBounding.startX + left, cellBounding.startY + top);
3485
- ctx.fillStyle = "#565656";
3446
+ ctx.fillStyle = DROP_DOWN_ICON_COLOR;
3486
3447
  ctx.fill(downPath);
3487
3448
  ctx.restore();
3488
3449
  }
@@ -3576,7 +3537,7 @@ let DropdownWidget = class DropdownWidget {
3576
3537
  _univerjs_engine_render.Rect.drawWith(ctx, {
3577
3538
  width: rectWidth,
3578
3539
  height: rectHeight,
3579
- fill: activeColor || "#ECECEC",
3540
+ fill: activeColor || "gray.100",
3580
3541
  radius: RADIUS_BG
3581
3542
  });
3582
3543
  ctx.save();
@@ -20,20 +20,7 @@ const locale = { "sheets-data-validation-ui": {
20
20
  }
21
21
  },
22
22
  operators: { legal: "نوع قانوني" },
23
- validFail: {
24
- value: "يُرجى إدخال قيمة",
25
- common: "يُرجى إدخال قيمة أو صيغة",
26
- number: "يُرجى إدخال رقم أو صيغة",
27
- formula: "يُرجى إدخال صيغة",
28
- integer: "يُرجى إدخال عدد صحيح أو صيغة",
29
- date: "يُرجى إدخال تاريخ أو صيغة",
30
- list: "يُرجى إدخال خيارات",
31
- listInvalid: "يجب أن يكون مصدر القائمة قائمة مفصولة بالفواصل أو مرجعًا لصف أو عمود واحد",
32
- checkboxEqual: "أدخل قيمًا مختلفة لمحتويات الخلية المحددة وغير المحددة.",
33
- formulaError: "يحتوي نطاق المرجع على بيانات غير مرئية، يُرجى إعادة ضبط النطاق",
34
- listIntersects: "لا يمكن أن يتقاطع النطاق المحدد مع نطاق القواعد",
35
- primitive: "الصيغ غير مسموح بها للقيم المخصصة المحددة وغير المحددة."
36
- },
23
+ validFail: { formulaError: "يحتوي نطاق المرجع على بيانات غير مرئية، يُرجى إعادة ضبط النطاق" },
37
24
  panel: {
38
25
  title: "إدارة التحقق من صحة البيانات",
39
26
  addTitle: "إنشاء تحقق جديد من صحة البيانات",
@@ -56,43 +43,21 @@ const locale = { "sheets-data-validation-ui": {
56
43
  rangeError: "النطاقات غير قانونية",
57
44
  allowBlank: "السماح بالقيم الفارغة"
58
45
  },
59
- any: {
60
- title: "أي قيمة",
61
- error: "محتوى هذه الخلية ينتهك قاعدة التحقق"
62
- },
63
46
  date: { title: "تاريخ" },
64
47
  list: {
65
48
  title: "قائمة منسدلة",
66
- name: "القيمة تحتوي على واحدة من النطاق",
67
- error: "يجب أن يكون الإدخال ضمن النطاق المحدد",
68
- emptyError: "يُرجى إدخال قيمة",
69
49
  add: "إضافة",
70
- dropdown: "تحديد",
71
50
  options: "خيارات",
72
51
  customOptions: "مخصص",
73
52
  refOptions: "من نطاق",
74
- formulaError: "يجب أن يكون مصدر القائمة قائمة بيانات مفصولة بالفواصل، أو مرجعًا لصف أو عمود واحد.",
75
53
  edit: "تحرير"
76
54
  },
77
- listMultiple: {
78
- title: "قائمة منسدلة - متعددة",
79
- dropdown: "تحديد متعدد"
80
- },
81
- textLength: { title: "طول النص" },
82
- decimal: { title: "رقم" },
83
- whole: { title: "عدد صحيح" },
84
55
  checkbox: {
85
56
  title: "خانة اختيار",
86
- error: "محتوى هذه الخلية ينتهك قاعدة التحقق",
87
57
  tips: "استخدم قيمًا مخصصة داخل الخلايا",
88
58
  checked: "القيمة المحددة",
89
59
  unchecked: "القيمة غير المحددة"
90
60
  },
91
- custom: {
92
- title: "صيغة مخصصة",
93
- error: "محتوى هذه الخلية ينتهك قاعدة التحقق",
94
- validFail: "يُرجى إدخال صيغة صالحة"
95
- },
96
61
  alert: {
97
62
  title: "خطأ",
98
63
  ok: "موافق"
@@ -20,20 +20,7 @@ const locale = { "sheets-data-validation-ui": {
20
20
  }
21
21
  },
22
22
  operators: { legal: "és tipus legal" },
23
- validFail: {
24
- value: "Si us plau, introdueix un valor",
25
- common: "Si us plau, introdueix un valor o una fórmula",
26
- number: "Si us plau, introdueix un número o una fórmula",
27
- formula: "Si us plau, introdueix una fórmula",
28
- integer: "Si us plau, introdueix un enter o una fórmula",
29
- date: "Si us plau, introdueix una data o una fórmula",
30
- list: "Si us plau, introdueix opcions",
31
- listInvalid: "La font de la llista ha de ser una llista delimitada o una referència a una sola fila o columna",
32
- checkboxEqual: "Introdueix valors diferents per als continguts de cel·la marcats i desmarcats.",
33
- formulaError: "L’interval de referència conté dades invisibles, ajusta l’interval",
34
- listIntersects: "L’interval seleccionat no pot creuar-se amb l’àmbit de les regles",
35
- primitive: "No es permeten fórmules per a valors personalitzats marcats i desmarcats."
36
- },
23
+ validFail: { formulaError: "L’interval de referència conté dades invisibles, ajusta l’interval" },
37
24
  panel: {
38
25
  title: "Gestió de la validació de dades",
39
26
  addTitle: "Crea una nova validació de dades",
@@ -56,43 +43,21 @@ const locale = { "sheets-data-validation-ui": {
56
43
  rangeError: "Els intervals no són vàlids",
57
44
  allowBlank: "Permet valors en blanc"
58
45
  },
59
- any: {
60
- title: "Qualsevol valor",
61
- error: "El contingut d’aquesta cel·la incompleix la regla de validació"
62
- },
63
46
  date: { title: "Data" },
64
47
  list: {
65
48
  title: "Desplegable",
66
- name: "El valor conté un del rang",
67
- error: "L’entrada ha d’estar dins del rang especificat",
68
- emptyError: "Si us plau, introdueix un valor",
69
49
  add: "Afegeix",
70
- dropdown: "Selecciona",
71
50
  options: "Opcions",
72
51
  customOptions: "Personalitzat",
73
52
  refOptions: "D’un interval",
74
- formulaError: "La font de la llista ha de ser una llista delimitada de dades o una referència a una sola fila o columna.",
75
53
  edit: "Edita"
76
54
  },
77
- listMultiple: {
78
- title: "Desplegable-múltiple",
79
- dropdown: "Selecció múltiple"
80
- },
81
- textLength: { title: "Longitud del text" },
82
- decimal: { title: "Número" },
83
- whole: { title: "Enter" },
84
55
  checkbox: {
85
56
  title: "Casella de selecció",
86
- error: "El contingut d’aquesta cel·la incompleix la seva regla de validació",
87
57
  tips: "Utilitza valors personalitzats dins de les cel·les",
88
58
  checked: "Valor seleccionat",
89
59
  unchecked: "Valor no seleccionat"
90
60
  },
91
- custom: {
92
- title: "Fórmula personalitzada",
93
- error: "El contingut d’aquesta cel·la incompleix la seva regla de validació",
94
- validFail: "Si us plau, introdueix una fórmula vàlida"
95
- },
96
61
  alert: {
97
62
  title: "Error",
98
63
  ok: "OK"
@@ -20,20 +20,7 @@ const locale = { "sheets-data-validation-ui": {
20
20
  }
21
21
  },
22
22
  operators: { legal: "ist gültiger Typ" },
23
- validFail: {
24
- value: "Bitte einen Wert eingeben",
25
- common: "Bitte Wert oder Formel eingeben",
26
- number: "Bitte Zahl oder Formel eingeben",
27
- formula: "Bitte Formel eingeben",
28
- integer: "Bitte Ganzzahl oder Formel eingeben",
29
- date: "Bitte Datum oder Formel eingeben",
30
- list: "Bitte Optionen eingeben",
31
- listInvalid: "Die Listenquelle muss eine durch Trennzeichen getrennte Liste oder ein Bezug auf eine einzelne Zeile oder Spalte sein",
32
- checkboxEqual: "Geben Sie unterschiedliche Werte für angekreuzte und nicht angekreuzte Zelleninhalte ein.",
33
- formulaError: "Der Referenzbereich enthält unsichtbare Daten, bitte passen Sie den Bereich an",
34
- listIntersects: "Der ausgewählte Bereich darf sich nicht mit dem Gültigkeitsbereich der Regeln überschneiden",
35
- primitive: "Formeln sind für benutzerdefinierte angekreuzte und nicht angekreuzte Werte nicht zulässig."
36
- },
23
+ validFail: { formulaError: "Der Referenzbereich enthält unsichtbare Daten, bitte passen Sie den Bereich an" },
37
24
  panel: {
38
25
  title: "Datenüberprüfungsverwaltung",
39
26
  addTitle: "Neue Datenüberprüfung erstellen",
@@ -56,43 +43,21 @@ const locale = { "sheets-data-validation-ui": {
56
43
  rangeError: "Bereiche sind ungültig",
57
44
  allowBlank: "Leere Werte zulassen"
58
45
  },
59
- any: {
60
- title: "Beliebiger Wert",
61
- error: "Der Inhalt dieser Zelle verstößt gegen die Überprüfungsregel"
62
- },
63
46
  date: { title: "Datum" },
64
47
  list: {
65
48
  title: "Dropdown",
66
- name: "Wert enthält einen aus dem Bereich",
67
- error: "Eingabe muss innerhalb des angegebenen Bereichs liegen",
68
- emptyError: "Bitte einen Wert eingeben",
69
49
  add: "Hinzufügen",
70
- dropdown: "Auswählen",
71
50
  options: "Optionen",
72
51
  customOptions: "Benutzerdefiniert",
73
52
  refOptions: "Aus einem Bereich",
74
- formulaError: "Die Listenquelle muss eine durch Trennzeichen getrennte Liste von Daten oder ein Bezug auf eine einzelne Zeile oder Spalte sein.",
75
53
  edit: "Bearbeiten"
76
54
  },
77
- listMultiple: {
78
- title: "Dropdown-Mehrfachauswahl",
79
- dropdown: "Mehrfachauswahl"
80
- },
81
- textLength: { title: "Textlänge" },
82
- decimal: { title: "Zahl" },
83
- whole: { title: "Ganzzahl" },
84
55
  checkbox: {
85
56
  title: "Kontrollkästchen",
86
- error: "Der Inhalt dieser Zelle verstößt gegen die Überprüfungsregel",
87
57
  tips: "Benutzerdefinierte Werte in Zellen verwenden",
88
58
  checked: "Ausgewählter Wert",
89
59
  unchecked: "Nicht ausgewählter Wert"
90
60
  },
91
- custom: {
92
- title: "Benutzerdefinierte Formel",
93
- error: "Der Inhalt dieser Zelle verstößt gegen die Überprüfungsregel",
94
- validFail: "Bitte eine gültige Formel eingeben"
95
- },
96
61
  alert: {
97
62
  title: "Fehler",
98
63
  ok: "OK"