fix: fix auto-fill api opreate in non-active sheet (#6205)

This commit is contained in:
wpxp123456
2025-11-26 16:15:26 +08:00
committed by GitHub
parent 6127c4beda
commit 92593431ae
4 changed files with 55 additions and 29 deletions
@@ -24,6 +24,8 @@ import { IAutoFillService } from '../../services/auto-fill/auto-fill.service';
export interface IAutoFillCommandParams {
sourceRange: IRange;
targetRange: IRange;
unitId?: string; // if not provided, use current unitId
subUnitId?: string; // if not provided, use current subUnitId
applyType?: APPLY_TYPE; // manual apply type
}
@@ -37,7 +39,7 @@ export const AutoFillCommand: ICommand = {
const { sourceRange, targetRange, applyType } = params;
const commandTarget = getSheetCommandTarget(univerInstanceService);
const commandTarget = getSheetCommandTarget(univerInstanceService, params);
if (!commandTarget) return false;
const { subUnitId, unitId } = commandTarget;
@@ -29,7 +29,6 @@ import type {
IRuleConfirmedData,
ISheetAutoFillHook,
} from '../services/auto-fill/type';
import type { IDiscreteRange } from './utils/range-tools';
import {
Direction,
Disposable,
@@ -424,13 +423,12 @@ export class AutoFillController extends Disposable {
}
}
private _getCopyData(source: IDiscreteRange, direction: Direction) {
const worksheet = this._univerInstanceService
.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!
.getActiveSheet();
private _getCopyData(location: IAutoFillLocation, direction: Direction) {
const { unitId, subUnitId, source } = location;
const worksheet = this._univerInstanceService.getUnit<Workbook>(unitId)?.getSheetBySheetId(subUnitId);
if (!worksheet) {
throw new Error('No active sheet found');
throw new Error('No worksheet found');
}
const currentCellDatas = worksheet.getCellMatrix();
@@ -501,8 +499,9 @@ export class AutoFillController extends Disposable {
return copyDataPiece;
}
private _getMergeApplyData(source: IRange, target: IRange, direction: Direction, csLen: number) {
const worksheet = this._univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!.getActiveSheet();
private _getMergeApplyData(source: IRange, target: IRange, direction: Direction, csLen: number, location: IAutoFillLocation) {
const { unitId, subUnitId } = location;
const worksheet = this._univerInstanceService.getUnit<Workbook>(unitId)?.getSheetBySheetId(subUnitId);
if (!worksheet) {
throw new Error('No active sheet found');
@@ -573,11 +572,9 @@ export class AutoFillController extends Disposable {
}
private _presetAndCacheData(location: IAutoFillLocation, direction: Direction) {
const { source, target } = location;
const { unitId, subUnitId, target } = location;
// cache original data of apply range
const worksheet = this._univerInstanceService
.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!
.getActiveSheet();
const worksheet = this._univerInstanceService.getUnit<Workbook>(unitId)?.getSheetBySheetId(subUnitId);
if (!worksheet) {
throw new Error('No active sheet found');
@@ -594,7 +591,7 @@ export class AutoFillController extends Disposable {
applyData.push(row);
});
this._beforeApplyData = applyData;
this._copyData = this._getCopyData(source, direction);
this._copyData = this._getCopyData(location, direction);
this._currentLocation = location;
if (this._shouldDisableSeries(this._copyData)) {
this._autoFillService.setDisableApplyType(APPLY_TYPE.SERIES, true);
@@ -680,9 +677,9 @@ export class AutoFillController extends Disposable {
// deal with styles
let applyMergeRanges: IRange[] = [];
const style = this._univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!.getStyles();
const style = this._univerInstanceService.getUnit<Workbook>(unitId)?.getStyles();
if (hasStyle) {
applyMergeRanges = this._getMergeApplyData(sourceRange, targetRange, direction, csLen);
applyMergeRanges = this._getMergeApplyData(sourceRange, targetRange, direction, csLen, location);
applyDatas.forEach((row) => {
row.forEach((cellData) => {
if (cellData && style) {
+21
View File
@@ -238,6 +238,25 @@ interface IFRangeSheetsUIMixin {
* const fWorksheet = fWorkbook.getActiveSheet();
* const fRange = fWorksheet.getRange('A1:A4');
*
* // Auto-fill without specifying applyType (default behavior)
* await fRange.autoFill(fWorksheet.getRange('A1:A20'))
*
* // Auto-fill with 'COPY' type
* await fRange.autoFill(fWorksheet.getRange('A1:A20'), 'COPY')
*
* // Auto-fill with 'SERIES' type
* await fRange.autoFill(fWorksheet.getRange('A1:A20'), 'SERIES')
* ```
*
* ```ts
* // Operate on a specific worksheet
* const fWorkbook = univerAPI.getActiveWorkbook();
* const fWorksheet = fWorkbook.getSheetBySheetId('sheetId');
* const fRange = fWorksheet.getRange('A1:A4');
*
* // Auto-fill without specifying applyType (default behavior)
* await fRange.autoFill(fWorksheet.getRange('A1:A20'))
*
* // Auto-fill with 'COPY' type
* await fRange.autoFill(fWorksheet.getRange('A1:A20'), 'COPY')
*
@@ -414,6 +433,8 @@ class FRangeSheetsUIMixin extends FRange implements IFRangeSheetsUIMixin {
return this._commandService.executeCommand(AutoFillCommand.id, {
sourceRange: _sourceRange,
targetRange: _targetRange,
unitId: this.getUnitId(),
subUnitId: this.getSheetId(),
applyType,
});
}
@@ -387,7 +387,10 @@ export class AutoFillService extends Disposable implements IAutoFillService {
// eslint-disable-next-line max-lines-per-function
fillData(applyType: APPLY_TYPE) {
this.applyType = applyType;
const { source, target, unitId = this._univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!.getUnitId(), subUnitId = this._univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!.getActiveSheet()?.getSheetId() } = this.autoFillLocation || {};
const activeWorkbook = this._univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET);
const activeUnitId = activeWorkbook?.getUnitId();
const activeSubUnitId = activeWorkbook?.getActiveSheet()?.getSheetId();
const { source, target, unitId = activeUnitId, subUnitId = activeSubUnitId } = this.autoFillLocation || {};
if (!source || !target || !unitId || !subUnitId) {
return false;
@@ -406,19 +409,22 @@ export class AutoFillService extends Disposable implements IAutoFillService {
const activeHooks = this.getActiveHooks();
const workbook = this._univerInstanceService.getUnit<Workbook>(unitId, UniverInstanceType.UNIVER_SHEET)!;
this._commandService.syncExecuteCommand(SetSelectionsOperation.id, {
selections: [
{
primary: { ...(this._selectionManagerService.getCurrentLastSelection()?.primary ?? selection) },
range: {
...selection,
rangeType: RANGE_TYPE.NORMAL,
// If filling the active sheet, update the selection immediately
if (unitId === activeUnitId && subUnitId === activeSubUnitId) {
this._commandService.syncExecuteCommand(SetSelectionsOperation.id, {
selections: [
{
primary: { ...(this._selectionManagerService.getCurrentLastSelection()?.primary ?? selection) },
range: {
...selection,
rangeType: RANGE_TYPE.NORMAL,
},
},
},
],
unitId,
subUnitId,
});
],
unitId,
subUnitId,
});
}
const undos: IMutationInfo[] = [];
const redos: IMutationInfo[] = [];