@leankylin-sheet/react 5.2.59 → 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) {
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) {
@@ -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.umd.js CHANGED
@@ -20669,6 +20669,29 @@
20669
20669
  };
20670
20670
  }
20671
20671
 
20672
+ function getSelectionRangeName(selection) {
20673
+ if (selection == null || selection.length === 0) return null;
20674
+ var names = [];
20675
+ var _iterator = _createForOfIteratorHelper(selection),
20676
+ _step;
20677
+ try {
20678
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
20679
+ var item = _step.value;
20680
+ var row = item.row,
20681
+ column = item.column;
20682
+ var row1 = Math.min(row[0], row[1]);
20683
+ var row2 = Math.max(row[0], row[1]);
20684
+ var col1 = Math.min(column[0], column[1]);
20685
+ var col2 = Math.max(column[0], column[1]);
20686
+ 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));
20687
+ }
20688
+ } catch (err) {
20689
+ _iterator.e(err);
20690
+ } finally {
20691
+ _iterator.f();
20692
+ }
20693
+ return names.join(",");
20694
+ }
20672
20695
  var SearchReplace = function SearchReplace() {
20673
20696
  var _useContext = React.useContext(WorkbookContext),
20674
20697
  context = _useContext.context,
@@ -20711,6 +20734,33 @@
20711
20734
  _useState14 = _slicedToArray(_useState13, 2),
20712
20735
  searchType = _useState14[0],
20713
20736
  setSearchType = _useState14[1];
20737
+ var _useState15 = React.useState("currentSheet"),
20738
+ _useState16 = _slicedToArray(_useState15, 2),
20739
+ searchRange = _useState16[0],
20740
+ setSearchRange = _useState16[1];
20741
+ var _useState17 = React.useState([]),
20742
+ _useState18 = _slicedToArray(_useState17, 2),
20743
+ searchSelection = _useState18[0],
20744
+ setSearchSelection = _useState18[1];
20745
+ var sheetIndex = core.getSheetIndex(context, context.currentSheetId);
20746
+ var currentSheetName = sheetIndex == null ? null : context.luckysheetfile[sheetIndex].name;
20747
+ var isRealSelection = React.useMemo(function () {
20748
+ var selection = context.luckysheet_select_save;
20749
+ 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]);
20750
+ }, [context.luckysheet_select_save]);
20751
+ React.useEffect(function () {
20752
+ if (searchRange !== "selection") return;
20753
+ if (isRealSelection) {
20754
+ setSearchSelection(lodash.assign([], context.luckysheet_select_save));
20755
+ } else {
20756
+ setSearchRange("currentSheet");
20757
+ }
20758
+ }, [isRealSelection, searchRange, context.luckysheet_select_save]);
20759
+ var selectionRangeName = getSelectionRangeName(context.luckysheet_select_save);
20760
+ var selectionRangeDisplay = findAndReplace.searchRangeSelection;
20761
+ if (selectionRangeName != null) {
20762
+ selectionRangeDisplay = currentSheetName ? "".concat(findAndReplace.searchRangeSelection, " (").concat(currentSheetName, "!").concat(selectionRangeName, ")") : "".concat(findAndReplace.searchRangeSelection, " (").concat(selectionRangeName, ")");
20763
+ }
20714
20764
  var closeDialog = React.useCallback(function () {
20715
20765
  lodash.set(refs.globalCache, "searchDialog.mouseEnter", false);
20716
20766
  setContext(function (draftCtx) {
@@ -20808,6 +20858,23 @@
20808
20858
  }, findAndReplace.searchTypeFormula), /*#__PURE__*/React__default['default'].createElement("option", {
20809
20859
  value: "m"
20810
20860
  }, findAndReplace.searchTypeDisplay))), /*#__PURE__*/React__default['default'].createElement("div", {
20861
+ id: "searchRangeSelect"
20862
+ }, /*#__PURE__*/React__default['default'].createElement("span", null, findAndReplace.searchRangeLabel, "\uFF1A"), /*#__PURE__*/React__default['default'].createElement("select", {
20863
+ value: searchRange,
20864
+ onChange: function onChange(e) {
20865
+ var value = e.target.value;
20866
+ setSearchRange(value);
20867
+ if (value === "selection") {
20868
+ setSearchSelection(lodash.assign([], context.luckysheet_select_save));
20869
+ }
20870
+ }
20871
+ }, /*#__PURE__*/React__default['default'].createElement("option", {
20872
+ value: "currentSheet"
20873
+ }, currentSheetName ? "".concat(findAndReplace.searchRangeCurrentSheet, "\uFF08").concat(currentSheetName, "\uFF09") : findAndReplace.searchRangeCurrentSheet), isRealSelection && ( /*#__PURE__*/React__default['default'].createElement("option", {
20874
+ value: "selection"
20875
+ }, selectionRangeDisplay)), /*#__PURE__*/React__default['default'].createElement("option", {
20876
+ value: "all"
20877
+ }, findAndReplace.searchRangeAllSheet))), /*#__PURE__*/React__default['default'].createElement("div", {
20811
20878
  className: "textboxs",
20812
20879
  id: "searchInput"
20813
20880
  }, findAndReplace.findTextbox, "\uFF1A", /*#__PURE__*/React__default['default'].createElement("input", {
@@ -20871,7 +20938,7 @@
20871
20938
  onClick: function onClick() {
20872
20939
  setContext(function (draftCtx) {
20873
20940
  setSelectedCell(undefined);
20874
- var alertMsg = core.replaceAll(draftCtx, searchText, replaceText, checkMode, searchType);
20941
+ var alertMsg = core.replaceAll(draftCtx, searchText, replaceText, checkMode, searchType, searchRange, searchSelection);
20875
20942
  showAlert(alertMsg);
20876
20943
  });
20877
20944
  }
@@ -20881,7 +20948,7 @@
20881
20948
  onClick: function onClick() {
20882
20949
  return setContext(function (draftCtx) {
20883
20950
  setSelectedCell(undefined);
20884
- var alertMsg = core.replace(draftCtx, searchText, replaceText, checkMode, searchType);
20951
+ var alertMsg = core.replace(draftCtx, searchText, replaceText, checkMode, searchType, searchRange, searchSelection);
20885
20952
  if (alertMsg != null) {
20886
20953
  showAlert(alertMsg);
20887
20954
  }
@@ -20894,7 +20961,7 @@
20894
20961
  return setContext(function (draftCtx) {
20895
20962
  setSelectedCell(undefined);
20896
20963
  if (!searchText) return;
20897
- var res = core.searchAll(draftCtx, searchText, checkMode, searchType);
20964
+ var res = core.searchAll(draftCtx, searchText, checkMode, searchType, searchRange, searchSelection);
20898
20965
  setSearchResult(res);
20899
20966
  if (lodash.isEmpty(res)) showAlert(findAndReplace.noFindTip);
20900
20967
  });
@@ -20905,14 +20972,11 @@
20905
20972
  onClick: function onClick() {
20906
20973
  return setContext(function (draftCtx) {
20907
20974
  setSearchResult([]);
20908
- var alertMsg = core.searchNext(draftCtx, searchText, checkMode, searchType);
20975
+ var alertMsg = core.searchNext(draftCtx, searchText, checkMode, searchType, searchRange, searchSelection);
20909
20976
  if (alertMsg != null) showAlert(alertMsg);
20910
20977
  });
20911
20978
  }
20912
- }, findAndReplace.findBtn))), /*#__PURE__*/React__default['default'].createElement("div", {
20913
- className: "close-button leankylin-message-box-button button-default",
20914
- onClick: closeDialog
20915
- }, button.close), searchResult.length > 0 && ( /*#__PURE__*/React__default['default'].createElement("div", {
20979
+ }, findAndReplace.findBtn))), searchResult.length > 0 && ( /*#__PURE__*/React__default['default'].createElement("div", {
20916
20980
  id: "searchAllbox",
20917
20981
  onScroll: function onScroll(e) {
20918
20982
  return e.stopPropagation();
@@ -20945,7 +21009,10 @@
20945
21009
  });
20946
21010
  }
20947
21011
  }, /*#__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));
20948
- })))))), body);
21012
+ })))), /*#__PURE__*/React__default['default'].createElement("div", {
21013
+ className: "close-button leankylin-message-box-button button-default",
21014
+ onClick: closeDialog
21015
+ }, button.close))), body);
20949
21016
  };
20950
21017
 
20951
21018
  var LinkEditCard = function LinkEditCard(_ref) {