Skip to content

Commit 97b17b9

Browse files
authored
fix(sheets-formula-ui): handle range selector close (#7603)
1 parent b6dce6c commit 97b17b9

3 files changed

Lines changed: 60 additions & 1 deletion

File tree

packages/sheets-formula-ui/src/views/range-selector/Global.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ export const GlobalRangeSelector = () => {
4040
<RangeSelector
4141
unitId={current?.unitId ?? ''}
4242
subUnitId={current?.subUnitId ?? ''}
43+
maxRangeCount={current?.maxRangeCount}
4344
hideEditor
4445
selectorRef={instance}
46+
onClose={() => current?.callback([])}
4547
onChange={(_, value) => {
4648
current?.callback(value?.split(',').map((i) => deserializeRangeWithSheet(i)) ?? []);
4749
}}

packages/sheets-formula-ui/src/views/range-selector/__tests__/GlobalRangeSelector.spec.tsx

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import { RediContext } from '@univerjs/ui';
3636
import { act, createRef } from 'react';
3737
import { createRoot } from 'react-dom/client';
3838
import { Subject } from 'rxjs';
39-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
39+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4040
import { GlobalRangeSelectorService } from '../../../services/range-selector.service';
4141
import { GlobalRangeSelector } from '../Global';
4242
import { RangeSelector } from '../index';
@@ -275,6 +275,60 @@ describe('GlobalRangeSelector', () => {
275275
]);
276276
});
277277

278+
it('applies maxRangeCount to the global selector dialog', async () => {
279+
const { injector, service } = createGlobalRangeSelectorTestBed();
280+
281+
await act(async () => {
282+
root.render(
283+
<RediContext.Provider value={{ injector }}>
284+
<GlobalRangeSelector />
285+
</RediContext.Provider>
286+
);
287+
await Promise.resolve();
288+
});
289+
290+
await act(async () => {
291+
service.showRangeSelectorDialog({
292+
unitId: 'book-1',
293+
subUnitId: 'sheet-1',
294+
maxRangeCount: 1,
295+
callback: vi.fn(),
296+
});
297+
await Promise.resolve();
298+
});
299+
300+
expect(document.body.textContent).not.toContain('Add range');
301+
});
302+
303+
it('calls the callback with an empty range when the global selector dialog is cancelled', async () => {
304+
const { injector, service } = createGlobalRangeSelectorTestBed();
305+
const callback = vi.fn();
306+
307+
await act(async () => {
308+
root.render(
309+
<RediContext.Provider value={{ injector }}>
310+
<GlobalRangeSelector />
311+
</RediContext.Provider>
312+
);
313+
await Promise.resolve();
314+
});
315+
316+
let promise!: Promise<IUnitRangeName[]>;
317+
await act(async () => {
318+
promise = service.showRangeSelectorDialog({
319+
unitId: 'book-1',
320+
subUnitId: 'sheet-1',
321+
callback,
322+
});
323+
await Promise.resolve();
324+
});
325+
326+
await clickButton('Cancel');
327+
328+
expect(callback).toHaveBeenCalledWith([]);
329+
await expect(promise).resolves.toEqual([]);
330+
});
331+
278332
it('restores the caller selection when a range selector dialog is cancelled', async () => {
279333
const { commandService, injector } = createGlobalRangeSelectorTestBed();
280334
const selectorRef = createRef<IRangeSelectorInstance | null>();

packages/sheets-formula-ui/src/views/range-selector/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export interface IRangeSelectorProps extends IRichTextEditorProps {
6565
hideEditor?: boolean;
6666
forceShowDialogWhenSelectionChanged?: boolean;
6767
resetRange?: ISelectionWithStyle[];
68+
onClose?: () => void;
6869
};
6970

7071
export interface IRangeSelectorDialogProps {
@@ -258,6 +259,7 @@ export function RangeSelector(props: IRangeSelectorProps) {
258259
forceShowDialogWhenSelectionChanged,
259260
hideEditor,
260261
resetRange,
262+
onClose,
261263
} = props;
262264
const [focusing, setFocusing] = useState(autoFocus ?? false);
263265
const [popupVisible, setPopupVisible] = useState(false);
@@ -378,6 +380,7 @@ export function RangeSelector(props: IRangeSelectorProps) {
378380
onClose={() => {
379381
setPopupVisible(false);
380382
setRangeSelectorRanges([]);
383+
onClose?.();
381384
}}
382385
supportAcrossSheet={supportAcrossSheet}
383386
keepSheetReference={keepSheetReference}

0 commit comments

Comments
 (0)