@leankylin-sheet/react 5.2.58 → 5.2.60

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/index.css CHANGED
@@ -1579,8 +1579,9 @@ html::-webkit-scrollbar-button {
1579
1579
  color: #555;
1580
1580
  }
1581
1581
 
1582
- /* 搜索范围下拉 - 与查找/替换输入行同样的布局,select 展开至 input 相同宽度 */
1583
- #leankylin-search-replace #searchTypeSelect {
1582
+ /* 搜索范围/搜索区域下拉 - 与查找/替换输入行同样的布局,select 展开至 input 相同宽度 */
1583
+ #leankylin-search-replace #searchTypeSelect,
1584
+ #leankylin-search-replace #searchRangeSelect {
1584
1585
  display: flex;
1585
1586
  align-items: center;
1586
1587
  gap: 8px;
@@ -1589,11 +1590,13 @@ html::-webkit-scrollbar-button {
1589
1590
  white-space: nowrap;
1590
1591
  }
1591
1592
 
1592
- #leankylin-search-replace #searchTypeSelect > span {
1593
+ #leankylin-search-replace #searchTypeSelect > span,
1594
+ #leankylin-search-replace #searchRangeSelect > span {
1593
1595
  flex-shrink: 0;
1594
1596
  }
1595
1597
 
1596
- #leankylin-search-replace #searchTypeSelect select {
1598
+ #leankylin-search-replace #searchTypeSelect select,
1599
+ #leankylin-search-replace #searchRangeSelect select {
1597
1600
  flex: 1;
1598
1601
  width: auto;
1599
1602
  height: 32px;
@@ -1615,11 +1618,13 @@ html::-webkit-scrollbar-button {
1615
1618
  box-sizing: border-box;
1616
1619
  }
1617
1620
 
1618
- #leankylin-search-replace #searchTypeSelect select:hover {
1621
+ #leankylin-search-replace #searchTypeSelect select:hover,
1622
+ #leankylin-search-replace #searchRangeSelect select:hover {
1619
1623
  border-color: #b0aefe;
1620
1624
  }
1621
1625
 
1622
- #leankylin-search-replace #searchTypeSelect select:focus {
1626
+ #leankylin-search-replace #searchTypeSelect select:focus,
1627
+ #leankylin-search-replace #searchRangeSelect select:focus {
1623
1628
  border-color: #8C89FE;
1624
1629
  box-shadow: 0 0 0 3px rgba(140, 137, 254, 0.12);
1625
1630
  }
@@ -1650,10 +1655,14 @@ html::-webkit-scrollbar-button {
1650
1655
  background-color: #f9f9ff;
1651
1656
  }
1652
1657
 
1653
- /* 关闭按钮 */
1658
+ /* 关闭按钮:始终固定于弹窗右下角,宽度紧凑 */
1654
1659
  #leankylin-search-replace .close-button {
1660
+ position: sticky;
1661
+ bottom: 12px;
1662
+ align-self: flex-end;
1663
+ flex-shrink: 0;
1655
1664
  margin: 12px 0 0;
1656
- padding: 6px 20px;
1665
+ padding: 6px 14px;
1657
1666
  border-radius: 6px;
1658
1667
  font-size: 13px;
1659
1668
  transition: all 0.15s;
@@ -1579,8 +1579,9 @@ html::-webkit-scrollbar-button {
1579
1579
  color: #555;
1580
1580
  }
1581
1581
 
1582
- /* 搜索范围下拉 - 与查找/替换输入行同样的布局,select 展开至 input 相同宽度 */
1583
- #leankylin-search-replace #searchTypeSelect {
1582
+ /* 搜索范围/搜索区域下拉 - 与查找/替换输入行同样的布局,select 展开至 input 相同宽度 */
1583
+ #leankylin-search-replace #searchTypeSelect,
1584
+ #leankylin-search-replace #searchRangeSelect {
1584
1585
  display: flex;
1585
1586
  align-items: center;
1586
1587
  gap: 8px;
@@ -1589,11 +1590,13 @@ html::-webkit-scrollbar-button {
1589
1590
  white-space: nowrap;
1590
1591
  }
1591
1592
 
1592
- #leankylin-search-replace #searchTypeSelect > span {
1593
+ #leankylin-search-replace #searchTypeSelect > span,
1594
+ #leankylin-search-replace #searchRangeSelect > span {
1593
1595
  flex-shrink: 0;
1594
1596
  }
1595
1597
 
1596
- #leankylin-search-replace #searchTypeSelect select {
1598
+ #leankylin-search-replace #searchTypeSelect select,
1599
+ #leankylin-search-replace #searchRangeSelect select {
1597
1600
  flex: 1;
1598
1601
  width: auto;
1599
1602
  height: 32px;
@@ -1615,11 +1618,13 @@ html::-webkit-scrollbar-button {
1615
1618
  box-sizing: border-box;
1616
1619
  }
1617
1620
 
1618
- #leankylin-search-replace #searchTypeSelect select:hover {
1621
+ #leankylin-search-replace #searchTypeSelect select:hover,
1622
+ #leankylin-search-replace #searchRangeSelect select:hover {
1619
1623
  border-color: #b0aefe;
1620
1624
  }
1621
1625
 
1622
- #leankylin-search-replace #searchTypeSelect select:focus {
1626
+ #leankylin-search-replace #searchTypeSelect select:focus,
1627
+ #leankylin-search-replace #searchRangeSelect select:focus {
1623
1628
  border-color: #8C89FE;
1624
1629
  box-shadow: 0 0 0 3px rgba(140, 137, 254, 0.12);
1625
1630
  }
@@ -1650,10 +1655,14 @@ html::-webkit-scrollbar-button {
1650
1655
  background-color: #f9f9ff;
1651
1656
  }
1652
1657
 
1653
- /* 关闭按钮 */
1658
+ /* 关闭按钮:始终固定于弹窗右下角,宽度紧凑 */
1654
1659
  #leankylin-search-replace .close-button {
1660
+ position: sticky;
1661
+ bottom: 12px;
1662
+ align-self: flex-end;
1663
+ flex-shrink: 0;
1655
1664
  margin: 12px 0 0;
1656
- padding: 6px 20px;
1665
+ padding: 6px 14px;
1657
1666
  border-radius: 6px;
1658
1667
  font-size: 13px;
1659
1668
  transition: all 0.15s;
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defaultContext, defaultSettings, getSheetIndex, colLocationByIndex, fixPositionOnFrozenCells, colLocation, getFlowdata, isAllowEdit, handleColumnHeaderMouseDown, handleColSizeHandleMouseDown, handleColFreezeHandleMouseDown, handleContextMenu, selectTitlesMap, selectTitlesRange, fixColumnStyleOverflowInFreeze, rowLocationByIndex, rowLocation, handleRowHeaderMouseDown, handleRowSizeHandleMouseDown, handleRowFreezeHandleMouseDown, fixRowStyleOverflowInFreeze, functionHTMLGenerate, locale, getCellValue, createRangeHightlight, isInlineStringCell, getInlineStringHTML, valueShowEs, escapeHTMLTag, escapeScriptTag, isShowHidenCR, cancelNormalSelected, moveHighlightCell, updateCell, israngeseleciton, handleFormulaInput, onSearchDialogMoveStart, replaceAll, replace, searchAll, searchNext, changeSheet, normalizeSelection, scrollToHighlightCell, isLinkValid, getRangetxt, goToLink, replaceHtml, removeHyperlink, onRangeSelectionModalMoveStart, saveHyperlink, createFilterOptions, onImageMoveStart, onImageResizeStart, showComments, setEditingComment, onCommentBoxMoveStart, onCommentBoxResizeStart, confirmMessage, getRangeByTxt, getDropdownList, setCellValue, setConditionRules, mergeBorder, setDropcownValue, handleCellAreaMouseDown, handleCellAreaMouseMove, handleCellAreaDragOver, handleCellDrop, handleCellAreaDoubleClick, selectAll, showLinkCard, getCellRowColumn, getCellHyperlink, handleOverlayMouseMove, handleOverlayMouseUp, handleKeydownForZoom, handleOverlayTouchStart, handleOverlayTouchMove, handleOverlayTouchEnd, onCellsMoveStart, createDropCellRange, handleDropCellDoubleClick, updateContextWithSheetData, updateContextWithCanvas, initFreeze, Canvas, handleGlobalWheel, setCaretPosition, getDataArr, updateMoreCell, getRegStr, getOptionValue, getSelectRange, applyLocation, updateItem, update, normalizedCellAttr, updateFormat, handleTextSize, handleHorizontalAlign, handleVerticalAlign, handleScreenShot, showImgChooser, insertImage, editComment, deleteComment, showHideComment, showHideAllComments, newComment, handleSum, autoSelectionFormula, handleMerge, handleBorder, handleFreeze, handleSort, createFilter, clearFilter, toolbarItemSelectedFunc, toolbarItemClickHandler, handleTextColor, handleTextBackground, getDataBySelectionNoCopy, getInlineStringNoStyle, rangeHightlightselected, editSheetName, setNextSheet, MAX_ZOOM_RATIO, MIN_ZOOM_RATIO, addSheet, indexToColumnChar, sortSelection, handleCopy, insertRowCol, deleteRowCol, hideSelected, showSelected, api, removeActiveImage, deleteSelectedCellText, jfrefreshgrid, handleLink, deleteSheet, opToPatch, orderbydatafiler, getFilterColumnValues, getFilterColumnColors, saveFilter, cancelActiveImgItem, patchToOp, filterPatch, inverseRowColOptions, ensureSheetIndex, initSheetIndex, handleGlobalKeyDown, handlePasteByLeanklin, groupValuesRefresh } from '@leankylin-sheet/core';
1
+ import { defaultContext, defaultSettings, getSheetIndex, colLocationByIndex, fixPositionOnFrozenCells, colLocation, getFlowdata, isAllowEdit, handleColumnHeaderMouseDown, handleColSizeHandleMouseDown, handleColFreezeHandleMouseDown, handleContextMenu, selectTitlesMap, selectTitlesRange, fixColumnStyleOverflowInFreeze, rowLocationByIndex, rowLocation, handleRowHeaderMouseDown, handleRowSizeHandleMouseDown, handleRowFreezeHandleMouseDown, fixRowStyleOverflowInFreeze, functionHTMLGenerate, locale, getCellValue, createRangeHightlight, isInlineStringCell, getInlineStringHTML, valueShowEs, escapeHTMLTag, escapeScriptTag, isShowHidenCR, cancelNormalSelected, moveHighlightCell, updateCell, israngeseleciton, handleFormulaInput, onSearchDialogMoveStart, replaceAll, replace, searchAll, searchNext, changeSheet, normalizeSelection, scrollToHighlightCell, chatatABC, isLinkValid, getRangetxt, goToLink, replaceHtml, removeHyperlink, onRangeSelectionModalMoveStart, saveHyperlink, createFilterOptions, onImageMoveStart, onImageResizeStart, showComments, setEditingComment, onCommentBoxMoveStart, onCommentBoxResizeStart, confirmMessage, getRangeByTxt, getDropdownList, setCellValue, setConditionRules, mergeBorder, setDropcownValue, handleCellAreaMouseDown, handleCellAreaMouseMove, handleCellAreaDragOver, handleCellDrop, handleCellAreaDoubleClick, selectAll, showLinkCard, getCellRowColumn, getCellHyperlink, handleOverlayMouseMove, handleOverlayMouseUp, handleKeydownForZoom, handleOverlayTouchStart, handleOverlayTouchMove, handleOverlayTouchEnd, onCellsMoveStart, createDropCellRange, handleDropCellDoubleClick, updateContextWithSheetData, updateContextWithCanvas, initFreeze, Canvas, handleGlobalWheel, setCaretPosition, getDataArr, updateMoreCell, getRegStr, getOptionValue, getSelectRange, applyLocation, updateItem, update, normalizedCellAttr, updateFormat, handleTextSize, handleHorizontalAlign, handleVerticalAlign, handleScreenShot, showImgChooser, insertImage, editComment, deleteComment, showHideComment, showHideAllComments, newComment, handleSum, autoSelectionFormula, handleMerge, handleBorder, handleFreeze, handleSort, createFilter, clearFilter, toolbarItemSelectedFunc, toolbarItemClickHandler, handleTextColor, handleTextBackground, getDataBySelectionNoCopy, getInlineStringNoStyle, rangeHightlightselected, editSheetName, setNextSheet, MAX_ZOOM_RATIO, MIN_ZOOM_RATIO, addSheet, indexToColumnChar, sortSelection, handleCopy, insertRowCol, deleteRowCol, hideSelected, showSelected, api, removeActiveImage, deleteSelectedCellText, jfrefreshgrid, handleLink, deleteSheet, opToPatch, orderbydatafiler, getFilterColumnValues, getFilterColumnColors, saveFilter, cancelActiveImgItem, patchToOp, filterPatch, inverseRowColOptions, ensureSheetIndex, initSheetIndex, handleGlobalKeyDown, handlePasteByLeanklin, groupValuesRefresh } from '@leankylin-sheet/core';
2
2
  import React, { useContext, useRef, useState, useMemo, useCallback, useEffect, useLayoutEffect, useImperativeHandle } from 'react';
3
3
  import produce, { applyPatches, enablePatches, produceWithPatches } from 'immer';
4
4
  import _ from 'lodash';
@@ -1585,6 +1585,29 @@ function useAlert() {
1585
1585
  };
1586
1586
  }
1587
1587
 
1588
+ function getSelectionRangeName(selection) {
1589
+ if (selection == null || selection.length === 0) return null;
1590
+ var names = [];
1591
+ var _iterator = _createForOfIteratorHelper(selection),
1592
+ _step;
1593
+ try {
1594
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
1595
+ var item = _step.value;
1596
+ var row = item.row,
1597
+ column = item.column;
1598
+ var row1 = Math.min(row[0], row[1]);
1599
+ var row2 = Math.max(row[0], row[1]);
1600
+ var col1 = Math.min(column[0], column[1]);
1601
+ var col2 = Math.max(column[0], column[1]);
1602
+ names.push(row1 === row2 && col1 === col2 ? "".concat(chatatABC(col1)).concat(row1 + 1) : "".concat(chatatABC(col1)).concat(row1 + 1, ":").concat(chatatABC(col2)).concat(row2 + 1));
1603
+ }
1604
+ } catch (err) {
1605
+ _iterator.e(err);
1606
+ } finally {
1607
+ _iterator.f();
1608
+ }
1609
+ return names.join(",");
1610
+ }
1588
1611
  var SearchReplace = function SearchReplace() {
1589
1612
  var _useContext = useContext(WorkbookContext),
1590
1613
  context = _useContext.context,
@@ -1627,6 +1650,33 @@ var SearchReplace = function SearchReplace() {
1627
1650
  _useState14 = _slicedToArray(_useState13, 2),
1628
1651
  searchType = _useState14[0],
1629
1652
  setSearchType = _useState14[1];
1653
+ var _useState15 = useState("currentSheet"),
1654
+ _useState16 = _slicedToArray(_useState15, 2),
1655
+ searchRange = _useState16[0],
1656
+ setSearchRange = _useState16[1];
1657
+ var _useState17 = useState([]),
1658
+ _useState18 = _slicedToArray(_useState17, 2),
1659
+ searchSelection = _useState18[0],
1660
+ setSearchSelection = _useState18[1];
1661
+ var sheetIndex = getSheetIndex(context, context.currentSheetId);
1662
+ var currentSheetName = sheetIndex == null ? null : context.luckysheetfile[sheetIndex].name;
1663
+ var isRealSelection = useMemo(function () {
1664
+ var selection = context.luckysheet_select_save;
1665
+ return selection != null && selection.length > 0 && !(selection.length === 1 && selection[0].row[0] === selection[0].row[1] && selection[0].column[0] === selection[0].column[1]);
1666
+ }, [context.luckysheet_select_save]);
1667
+ useEffect(function () {
1668
+ if (searchRange !== "selection") return;
1669
+ if (isRealSelection) {
1670
+ setSearchSelection(_.assign([], context.luckysheet_select_save));
1671
+ } else {
1672
+ setSearchRange("currentSheet");
1673
+ }
1674
+ }, [isRealSelection, searchRange, context.luckysheet_select_save]);
1675
+ var selectionRangeName = getSelectionRangeName(context.luckysheet_select_save);
1676
+ var selectionRangeDisplay = findAndReplace.searchRangeSelection;
1677
+ if (selectionRangeName != null) {
1678
+ selectionRangeDisplay = currentSheetName ? "".concat(findAndReplace.searchRangeSelection, " (").concat(currentSheetName, "!").concat(selectionRangeName, ")") : "".concat(findAndReplace.searchRangeSelection, " (").concat(selectionRangeName, ")");
1679
+ }
1630
1680
  var closeDialog = useCallback(function () {
1631
1681
  _.set(refs.globalCache, "searchDialog.mouseEnter", false);
1632
1682
  setContext(function (draftCtx) {
@@ -1724,6 +1774,23 @@ var SearchReplace = function SearchReplace() {
1724
1774
  }, findAndReplace.searchTypeFormula), /*#__PURE__*/React.createElement("option", {
1725
1775
  value: "m"
1726
1776
  }, findAndReplace.searchTypeDisplay))), /*#__PURE__*/React.createElement("div", {
1777
+ id: "searchRangeSelect"
1778
+ }, /*#__PURE__*/React.createElement("span", null, findAndReplace.searchRangeLabel, "\uFF1A"), /*#__PURE__*/React.createElement("select", {
1779
+ value: searchRange,
1780
+ onChange: function onChange(e) {
1781
+ var value = e.target.value;
1782
+ setSearchRange(value);
1783
+ if (value === "selection") {
1784
+ setSearchSelection(_.assign([], context.luckysheet_select_save));
1785
+ }
1786
+ }
1787
+ }, /*#__PURE__*/React.createElement("option", {
1788
+ value: "currentSheet"
1789
+ }, currentSheetName ? "".concat(findAndReplace.searchRangeCurrentSheet, "\uFF08").concat(currentSheetName, "\uFF09") : findAndReplace.searchRangeCurrentSheet), isRealSelection && ( /*#__PURE__*/React.createElement("option", {
1790
+ value: "selection"
1791
+ }, selectionRangeDisplay)), /*#__PURE__*/React.createElement("option", {
1792
+ value: "all"
1793
+ }, findAndReplace.searchRangeAllSheet))), /*#__PURE__*/React.createElement("div", {
1727
1794
  className: "textboxs",
1728
1795
  id: "searchInput"
1729
1796
  }, findAndReplace.findTextbox, "\uFF1A", /*#__PURE__*/React.createElement("input", {
@@ -1787,7 +1854,7 @@ var SearchReplace = function SearchReplace() {
1787
1854
  onClick: function onClick() {
1788
1855
  setContext(function (draftCtx) {
1789
1856
  setSelectedCell(undefined);
1790
- var alertMsg = replaceAll(draftCtx, searchText, replaceText, checkMode, searchType);
1857
+ var alertMsg = replaceAll(draftCtx, searchText, replaceText, checkMode, searchType, searchRange, searchSelection);
1791
1858
  showAlert(alertMsg);
1792
1859
  });
1793
1860
  }
@@ -1797,7 +1864,7 @@ var SearchReplace = function SearchReplace() {
1797
1864
  onClick: function onClick() {
1798
1865
  return setContext(function (draftCtx) {
1799
1866
  setSelectedCell(undefined);
1800
- var alertMsg = replace(draftCtx, searchText, replaceText, checkMode, searchType);
1867
+ var alertMsg = replace(draftCtx, searchText, replaceText, checkMode, searchType, searchRange, searchSelection);
1801
1868
  if (alertMsg != null) {
1802
1869
  showAlert(alertMsg);
1803
1870
  }
@@ -1810,7 +1877,7 @@ var SearchReplace = function SearchReplace() {
1810
1877
  return setContext(function (draftCtx) {
1811
1878
  setSelectedCell(undefined);
1812
1879
  if (!searchText) return;
1813
- var res = searchAll(draftCtx, searchText, checkMode, searchType);
1880
+ var res = searchAll(draftCtx, searchText, checkMode, searchType, searchRange, searchSelection);
1814
1881
  setSearchResult(res);
1815
1882
  if (_.isEmpty(res)) showAlert(findAndReplace.noFindTip);
1816
1883
  });
@@ -1821,14 +1888,11 @@ var SearchReplace = function SearchReplace() {
1821
1888
  onClick: function onClick() {
1822
1889
  return setContext(function (draftCtx) {
1823
1890
  setSearchResult([]);
1824
- var alertMsg = searchNext(draftCtx, searchText, checkMode, searchType);
1891
+ var alertMsg = searchNext(draftCtx, searchText, checkMode, searchType, searchRange, searchSelection);
1825
1892
  if (alertMsg != null) showAlert(alertMsg);
1826
1893
  });
1827
1894
  }
1828
- }, findAndReplace.findBtn))), /*#__PURE__*/React.createElement("div", {
1829
- className: "close-button leankylin-message-box-button button-default",
1830
- onClick: closeDialog
1831
- }, button.close), searchResult.length > 0 && ( /*#__PURE__*/React.createElement("div", {
1895
+ }, findAndReplace.findBtn))), searchResult.length > 0 && ( /*#__PURE__*/React.createElement("div", {
1832
1896
  id: "searchAllbox",
1833
1897
  onScroll: function onScroll(e) {
1834
1898
  return e.stopPropagation();
@@ -1861,7 +1925,10 @@ var SearchReplace = function SearchReplace() {
1861
1925
  });
1862
1926
  }
1863
1927
  }, /*#__PURE__*/React.createElement("span", null, v.sheetName), /*#__PURE__*/React.createElement("span", null, v.cellPosition), /*#__PURE__*/React.createElement("span", null, v.value), /*#__PURE__*/React.createElement("span", null, v.formula), /*#__PURE__*/React.createElement("span", null, v.displayValue));
1864
- })))))), body);
1928
+ })))), /*#__PURE__*/React.createElement("div", {
1929
+ className: "close-button leankylin-message-box-button button-default",
1930
+ onClick: closeDialog
1931
+ }, button.close))), body);
1865
1932
  };
1866
1933
 
1867
1934
  var LinkEditCard = function LinkEditCard(_ref) {
@@ -11676,6 +11743,14 @@ var Workbook = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
11676
11743
  (_mergedSettings$hooks = mergedSettings.hooks) === null || _mergedSettings$hooks === void 0 ? void 0 : (_mergedSettings$hooks2 = _mergedSettings$hooks.afterSelectionChange) === null || _mergedSettings$hooks2 === void 0 ? void 0 : _mergedSettings$hooks2.call(_mergedSettings$hooks, context.currentSheetId, context.luckysheet_select_save[0]);
11677
11744
  }
11678
11745
  }, [context.currentSheetId, context.luckysheet_select_save, mergedSettings.hooks]);
11746
+ var prevSheetIdRef = useRef(context.currentSheetId);
11747
+ useEffect(function () {
11748
+ if (prevSheetIdRef.current !== context.currentSheetId) {
11749
+ var _mergedSettings$hooks3, _mergedSettings$hooks4;
11750
+ (_mergedSettings$hooks3 = mergedSettings.hooks) === null || _mergedSettings$hooks3 === void 0 ? void 0 : (_mergedSettings$hooks4 = _mergedSettings$hooks3.afterSheetChange) === null || _mergedSettings$hooks4 === void 0 ? void 0 : _mergedSettings$hooks4.call(_mergedSettings$hooks3, context.currentSheetId, prevSheetIdRef.current);
11751
+ prevSheetIdRef.current = context.currentSheetId;
11752
+ }
11753
+ }, [context.currentSheetId]);
11679
11754
  var providerValue = useMemo(function () {
11680
11755
  return {
11681
11756
  context: context,
package/dist/index.js CHANGED
@@ -1595,6 +1595,29 @@ function useAlert() {
1595
1595
  };
1596
1596
  }
1597
1597
 
1598
+ function getSelectionRangeName(selection) {
1599
+ if (selection == null || selection.length === 0) return null;
1600
+ var names = [];
1601
+ var _iterator = _createForOfIteratorHelper(selection),
1602
+ _step;
1603
+ try {
1604
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
1605
+ var item = _step.value;
1606
+ var row = item.row,
1607
+ column = item.column;
1608
+ var row1 = Math.min(row[0], row[1]);
1609
+ var row2 = Math.max(row[0], row[1]);
1610
+ var col1 = Math.min(column[0], column[1]);
1611
+ var col2 = Math.max(column[0], column[1]);
1612
+ names.push(row1 === row2 && col1 === col2 ? "".concat(core.chatatABC(col1)).concat(row1 + 1) : "".concat(core.chatatABC(col1)).concat(row1 + 1, ":").concat(core.chatatABC(col2)).concat(row2 + 1));
1613
+ }
1614
+ } catch (err) {
1615
+ _iterator.e(err);
1616
+ } finally {
1617
+ _iterator.f();
1618
+ }
1619
+ return names.join(",");
1620
+ }
1598
1621
  var SearchReplace = function SearchReplace() {
1599
1622
  var _useContext = React.useContext(WorkbookContext),
1600
1623
  context = _useContext.context,
@@ -1637,6 +1660,33 @@ var SearchReplace = function SearchReplace() {
1637
1660
  _useState14 = _slicedToArray(_useState13, 2),
1638
1661
  searchType = _useState14[0],
1639
1662
  setSearchType = _useState14[1];
1663
+ var _useState15 = React.useState("currentSheet"),
1664
+ _useState16 = _slicedToArray(_useState15, 2),
1665
+ searchRange = _useState16[0],
1666
+ setSearchRange = _useState16[1];
1667
+ var _useState17 = React.useState([]),
1668
+ _useState18 = _slicedToArray(_useState17, 2),
1669
+ searchSelection = _useState18[0],
1670
+ setSearchSelection = _useState18[1];
1671
+ var sheetIndex = core.getSheetIndex(context, context.currentSheetId);
1672
+ var currentSheetName = sheetIndex == null ? null : context.luckysheetfile[sheetIndex].name;
1673
+ var isRealSelection = React.useMemo(function () {
1674
+ var selection = context.luckysheet_select_save;
1675
+ return selection != null && selection.length > 0 && !(selection.length === 1 && selection[0].row[0] === selection[0].row[1] && selection[0].column[0] === selection[0].column[1]);
1676
+ }, [context.luckysheet_select_save]);
1677
+ React.useEffect(function () {
1678
+ if (searchRange !== "selection") return;
1679
+ if (isRealSelection) {
1680
+ setSearchSelection(___default['default'].assign([], context.luckysheet_select_save));
1681
+ } else {
1682
+ setSearchRange("currentSheet");
1683
+ }
1684
+ }, [isRealSelection, searchRange, context.luckysheet_select_save]);
1685
+ var selectionRangeName = getSelectionRangeName(context.luckysheet_select_save);
1686
+ var selectionRangeDisplay = findAndReplace.searchRangeSelection;
1687
+ if (selectionRangeName != null) {
1688
+ selectionRangeDisplay = currentSheetName ? "".concat(findAndReplace.searchRangeSelection, " (").concat(currentSheetName, "!").concat(selectionRangeName, ")") : "".concat(findAndReplace.searchRangeSelection, " (").concat(selectionRangeName, ")");
1689
+ }
1640
1690
  var closeDialog = React.useCallback(function () {
1641
1691
  ___default['default'].set(refs.globalCache, "searchDialog.mouseEnter", false);
1642
1692
  setContext(function (draftCtx) {
@@ -1734,6 +1784,23 @@ var SearchReplace = function SearchReplace() {
1734
1784
  }, findAndReplace.searchTypeFormula), /*#__PURE__*/React__default['default'].createElement("option", {
1735
1785
  value: "m"
1736
1786
  }, findAndReplace.searchTypeDisplay))), /*#__PURE__*/React__default['default'].createElement("div", {
1787
+ id: "searchRangeSelect"
1788
+ }, /*#__PURE__*/React__default['default'].createElement("span", null, findAndReplace.searchRangeLabel, "\uFF1A"), /*#__PURE__*/React__default['default'].createElement("select", {
1789
+ value: searchRange,
1790
+ onChange: function onChange(e) {
1791
+ var value = e.target.value;
1792
+ setSearchRange(value);
1793
+ if (value === "selection") {
1794
+ setSearchSelection(___default['default'].assign([], context.luckysheet_select_save));
1795
+ }
1796
+ }
1797
+ }, /*#__PURE__*/React__default['default'].createElement("option", {
1798
+ value: "currentSheet"
1799
+ }, currentSheetName ? "".concat(findAndReplace.searchRangeCurrentSheet, "\uFF08").concat(currentSheetName, "\uFF09") : findAndReplace.searchRangeCurrentSheet), isRealSelection && ( /*#__PURE__*/React__default['default'].createElement("option", {
1800
+ value: "selection"
1801
+ }, selectionRangeDisplay)), /*#__PURE__*/React__default['default'].createElement("option", {
1802
+ value: "all"
1803
+ }, findAndReplace.searchRangeAllSheet))), /*#__PURE__*/React__default['default'].createElement("div", {
1737
1804
  className: "textboxs",
1738
1805
  id: "searchInput"
1739
1806
  }, findAndReplace.findTextbox, "\uFF1A", /*#__PURE__*/React__default['default'].createElement("input", {
@@ -1797,7 +1864,7 @@ var SearchReplace = function SearchReplace() {
1797
1864
  onClick: function onClick() {
1798
1865
  setContext(function (draftCtx) {
1799
1866
  setSelectedCell(undefined);
1800
- var alertMsg = core.replaceAll(draftCtx, searchText, replaceText, checkMode, searchType);
1867
+ var alertMsg = core.replaceAll(draftCtx, searchText, replaceText, checkMode, searchType, searchRange, searchSelection);
1801
1868
  showAlert(alertMsg);
1802
1869
  });
1803
1870
  }
@@ -1807,7 +1874,7 @@ var SearchReplace = function SearchReplace() {
1807
1874
  onClick: function onClick() {
1808
1875
  return setContext(function (draftCtx) {
1809
1876
  setSelectedCell(undefined);
1810
- var alertMsg = core.replace(draftCtx, searchText, replaceText, checkMode, searchType);
1877
+ var alertMsg = core.replace(draftCtx, searchText, replaceText, checkMode, searchType, searchRange, searchSelection);
1811
1878
  if (alertMsg != null) {
1812
1879
  showAlert(alertMsg);
1813
1880
  }
@@ -1820,7 +1887,7 @@ var SearchReplace = function SearchReplace() {
1820
1887
  return setContext(function (draftCtx) {
1821
1888
  setSelectedCell(undefined);
1822
1889
  if (!searchText) return;
1823
- var res = core.searchAll(draftCtx, searchText, checkMode, searchType);
1890
+ var res = core.searchAll(draftCtx, searchText, checkMode, searchType, searchRange, searchSelection);
1824
1891
  setSearchResult(res);
1825
1892
  if (___default['default'].isEmpty(res)) showAlert(findAndReplace.noFindTip);
1826
1893
  });
@@ -1831,14 +1898,11 @@ var SearchReplace = function SearchReplace() {
1831
1898
  onClick: function onClick() {
1832
1899
  return setContext(function (draftCtx) {
1833
1900
  setSearchResult([]);
1834
- var alertMsg = core.searchNext(draftCtx, searchText, checkMode, searchType);
1901
+ var alertMsg = core.searchNext(draftCtx, searchText, checkMode, searchType, searchRange, searchSelection);
1835
1902
  if (alertMsg != null) showAlert(alertMsg);
1836
1903
  });
1837
1904
  }
1838
- }, findAndReplace.findBtn))), /*#__PURE__*/React__default['default'].createElement("div", {
1839
- className: "close-button leankylin-message-box-button button-default",
1840
- onClick: closeDialog
1841
- }, button.close), searchResult.length > 0 && ( /*#__PURE__*/React__default['default'].createElement("div", {
1905
+ }, findAndReplace.findBtn))), searchResult.length > 0 && ( /*#__PURE__*/React__default['default'].createElement("div", {
1842
1906
  id: "searchAllbox",
1843
1907
  onScroll: function onScroll(e) {
1844
1908
  return e.stopPropagation();
@@ -1871,7 +1935,10 @@ var SearchReplace = function SearchReplace() {
1871
1935
  });
1872
1936
  }
1873
1937
  }, /*#__PURE__*/React__default['default'].createElement("span", null, v.sheetName), /*#__PURE__*/React__default['default'].createElement("span", null, v.cellPosition), /*#__PURE__*/React__default['default'].createElement("span", null, v.value), /*#__PURE__*/React__default['default'].createElement("span", null, v.formula), /*#__PURE__*/React__default['default'].createElement("span", null, v.displayValue));
1874
- })))))), body);
1938
+ })))), /*#__PURE__*/React__default['default'].createElement("div", {
1939
+ className: "close-button leankylin-message-box-button button-default",
1940
+ onClick: closeDialog
1941
+ }, button.close))), body);
1875
1942
  };
1876
1943
 
1877
1944
  var LinkEditCard = function LinkEditCard(_ref) {
@@ -11686,6 +11753,14 @@ var Workbook = /*#__PURE__*/React__default['default'].forwardRef(function (_ref,
11686
11753
  (_mergedSettings$hooks = mergedSettings.hooks) === null || _mergedSettings$hooks === void 0 ? void 0 : (_mergedSettings$hooks2 = _mergedSettings$hooks.afterSelectionChange) === null || _mergedSettings$hooks2 === void 0 ? void 0 : _mergedSettings$hooks2.call(_mergedSettings$hooks, context.currentSheetId, context.luckysheet_select_save[0]);
11687
11754
  }
11688
11755
  }, [context.currentSheetId, context.luckysheet_select_save, mergedSettings.hooks]);
11756
+ var prevSheetIdRef = React.useRef(context.currentSheetId);
11757
+ React.useEffect(function () {
11758
+ if (prevSheetIdRef.current !== context.currentSheetId) {
11759
+ var _mergedSettings$hooks3, _mergedSettings$hooks4;
11760
+ (_mergedSettings$hooks3 = mergedSettings.hooks) === null || _mergedSettings$hooks3 === void 0 ? void 0 : (_mergedSettings$hooks4 = _mergedSettings$hooks3.afterSheetChange) === null || _mergedSettings$hooks4 === void 0 ? void 0 : _mergedSettings$hooks4.call(_mergedSettings$hooks3, context.currentSheetId, prevSheetIdRef.current);
11761
+ prevSheetIdRef.current = context.currentSheetId;
11762
+ }
11763
+ }, [context.currentSheetId]);
11689
11764
  var providerValue = React.useMemo(function () {
11690
11765
  return {
11691
11766
  context: context,
@@ -1579,8 +1579,9 @@ html::-webkit-scrollbar-button {
1579
1579
  color: #555;
1580
1580
  }
1581
1581
 
1582
- /* 搜索范围下拉 - 与查找/替换输入行同样的布局,select 展开至 input 相同宽度 */
1583
- #leankylin-search-replace #searchTypeSelect {
1582
+ /* 搜索范围/搜索区域下拉 - 与查找/替换输入行同样的布局,select 展开至 input 相同宽度 */
1583
+ #leankylin-search-replace #searchTypeSelect,
1584
+ #leankylin-search-replace #searchRangeSelect {
1584
1585
  display: flex;
1585
1586
  align-items: center;
1586
1587
  gap: 8px;
@@ -1589,11 +1590,13 @@ html::-webkit-scrollbar-button {
1589
1590
  white-space: nowrap;
1590
1591
  }
1591
1592
 
1592
- #leankylin-search-replace #searchTypeSelect > span {
1593
+ #leankylin-search-replace #searchTypeSelect > span,
1594
+ #leankylin-search-replace #searchRangeSelect > span {
1593
1595
  flex-shrink: 0;
1594
1596
  }
1595
1597
 
1596
- #leankylin-search-replace #searchTypeSelect select {
1598
+ #leankylin-search-replace #searchTypeSelect select,
1599
+ #leankylin-search-replace #searchRangeSelect select {
1597
1600
  flex: 1;
1598
1601
  width: auto;
1599
1602
  height: 32px;
@@ -1615,11 +1618,13 @@ html::-webkit-scrollbar-button {
1615
1618
  box-sizing: border-box;
1616
1619
  }
1617
1620
 
1618
- #leankylin-search-replace #searchTypeSelect select:hover {
1621
+ #leankylin-search-replace #searchTypeSelect select:hover,
1622
+ #leankylin-search-replace #searchRangeSelect select:hover {
1619
1623
  border-color: #b0aefe;
1620
1624
  }
1621
1625
 
1622
- #leankylin-search-replace #searchTypeSelect select:focus {
1626
+ #leankylin-search-replace #searchTypeSelect select:focus,
1627
+ #leankylin-search-replace #searchRangeSelect select:focus {
1623
1628
  border-color: #8C89FE;
1624
1629
  box-shadow: 0 0 0 3px rgba(140, 137, 254, 0.12);
1625
1630
  }
@@ -1650,10 +1655,14 @@ html::-webkit-scrollbar-button {
1650
1655
  background-color: #f9f9ff;
1651
1656
  }
1652
1657
 
1653
- /* 关闭按钮 */
1658
+ /* 关闭按钮:始终固定于弹窗右下角,宽度紧凑 */
1654
1659
  #leankylin-search-replace .close-button {
1660
+ position: sticky;
1661
+ bottom: 12px;
1662
+ align-self: flex-end;
1663
+ flex-shrink: 0;
1655
1664
  margin: 12px 0 0;
1656
- padding: 6px 20px;
1665
+ padding: 6px 14px;
1657
1666
  border-radius: 6px;
1658
1667
  font-size: 13px;
1659
1668
  transition: all 0.15s;