Skip to content

Commit

Permalink
feat: add reorderrange to ref-range
Browse files Browse the repository at this point in the history
  • Loading branch information
yuhongz committed Jun 15, 2024
1 parent 06127a7 commit 0929401
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 5 deletions.
24 changes: 20 additions & 4 deletions packages/sheets/src/commands/commands/reorder-range.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,17 @@ import type { IAccessor } from '@wendellhu/redi';
import type { ISheetCommandSharedParams } from '../utils/interface';
import type { IReorderRangeMutationParams } from '../mutations/reorder-range.mutation';
import { ReorderRangeMutation, ReorderRangeUndoMutationFactory } from '../mutations/reorder-range.mutation';
import { SheetInterceptorService } from '../../services/sheet-interceptor/sheet-interceptor.service';

export interface IReorderRangeCommandParams extends ISheetCommandSharedParams {
range: IRange;
order: { [key: number]: number };
}

export const ReorderRangeCommandId = 'sheet.command.reorder-range' as const;

export const ReorderRangeCommand: ICommand<IReorderRangeCommandParams> = {
id: 'sheet.command.reorder-range',
id: ReorderRangeCommandId,
type: CommandType.COMMAND,
handler: (accessor: IAccessor, params: IReorderRangeCommandParams) => {
const { subUnitId, unitId, range, order } = params;
Expand All @@ -47,14 +50,27 @@ export const ReorderRangeCommand: ICommand<IReorderRangeCommandParams> = {
id: ReorderRangeMutation.id,
params: ReorderRangeUndoMutationFactory(reorderMutation.params),
};
const sheetInterceptorService = accessor.get(SheetInterceptorService);
const interceptorCommands = sheetInterceptorService.onCommandExecute({ id: ReorderRangeCommand.id, params });

const redos = [
...(interceptorCommands.preRedos ?? []),
reorderMutation,
...interceptorCommands.redos,
];

const result = sequenceExecute([reorderMutation], commandService);
const undos = [
...(interceptorCommands.preUndos ?? []),
undoReorderMutation,
...interceptorCommands.undos,
];
const result = sequenceExecute(redos, commandService);
if (result.result) {
const undoRedoService = accessor.get(IUndoRedoService);
undoRedoService.pushUndoRedo({
unitID: unitId,
undoMutations: [undoReorderMutation],
redoMutations: [reorderMutation],
undoMutations: undos,
redoMutations: redos,
});
return true;
}
Expand Down
16 changes: 16 additions & 0 deletions packages/sheets/src/services/ref-range/ref-range.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,22 @@ export class RefRangeService extends Disposable {
};
return this._checkRange([effectRange], unitId, subUnitId);
}
case EffectRefRangId.ReorderRangeCommandId: {
const params = command;
const { range, order } = params.params!;
const effectRanges = [];
for (let row = range.startRow; row <= range.endRow; row++) {
if (row in order) {
effectRanges.push({
startRow: row,
endRow: row,
startColumn: range.startColumn,
endColumn: range.endColumn,
});
}
}
return this._checkRange(effectRanges, unitId, subUnitId);
}
}
};
const cbList = getEffectsCbList() || [];
Expand Down
8 changes: 7 additions & 1 deletion packages/sheets/src/services/ref-range/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import type { IMoveColsCommandParams, IMoveRowsCommandParams } from '../../comma
import { MoveColsCommandId, MoveRowsCommandId } from '../../commands/commands/move-rows-cols.command';
import type { IRemoveRowColCommandParams } from '../../commands/commands/remove-row-col.command';
import { RemoveColCommandId, RemoveRowCommandId } from '../../commands/commands/remove-row-col.command';
import type { IReorderRangeCommandParams } from '../../commands/commands/reorder-range.command';
import { ReorderRangeCommandId } from '../../commands/commands/reorder-range.command';

export type IMoveRowsCommand = ICommandInfo<IMoveRowsCommandParams> & { id: typeof MoveRowsCommandId };
export type IMoveColsCommand = ICommandInfo<IMoveColsCommandParams> & { id: typeof MoveColsCommandId };
Expand All @@ -55,6 +57,8 @@ export type IInsertRangeMoveRightCommand = ICommandInfo<InsertRangeMoveRightComm
id: typeof InsertRangeMoveRightCommandId;
};

export type IReorderRangeCommand = ICommandInfo<IReorderRangeCommandParams> & { id: typeof ReorderRangeCommandId };

export type EffectRefRangeParams =
| IMoveRangeCommand
| IInsertRowCommand
Expand All @@ -65,7 +69,8 @@ export type EffectRefRangeParams =
| IInsertRangeMoveDownCommand
| IInsertRangeMoveRightCommand
| IMoveColsCommand
| IMoveRowsCommand;
| IMoveRowsCommand
| IReorderRangeCommand;

export const EffectRefRangId = {
MoveRangeCommandId,
Expand All @@ -79,6 +84,7 @@ export const EffectRefRangId = {
InsertRangeMoveRightCommandId,
MoveColsCommandId,
MoveRowsCommandId,
ReorderRangeCommandId,
} as const;

export enum OperatorType {
Expand Down
43 changes: 43 additions & 0 deletions packages/sheets/src/services/ref-range/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import type {
IMoveRowsCommand,
IOperator,
IRemoveRowColCommand,
IReorderRangeCommand,
} from './type';
import { EffectRefRangId, OperatorType } from './type';

Expand Down Expand Up @@ -499,6 +500,28 @@ export const handleIRemoveRow = (param: IRemoveRowColCommand, targetRange: IRang
}
return operators;
};

export const handleReorderRange = (param: IReorderRangeCommand, targetRange: IRange) => {
const { range, order } = param.params || {};
if (!range || !order) {
return [];
}
const operators: IOperator[] = [];
const targetRow = targetRange.startRow;
for (const k in order) {
if (order[k] === targetRow) {
const toRow = Number(k);
operators.push({
type: OperatorType.VerticalMove,
step: toRow - targetRow,
length: 0,
});
return operators;
}
}
return [];
};

// see docs/tldr/ref-range/insert-rows-cols.tldr
export const handleBaseInsertRange = (_insertRange: IRange, _targetRange: IRange) => {
const insertRange = handleRangeTypeInput(_insertRange);
Expand Down Expand Up @@ -904,6 +927,10 @@ export const handleDefaultRangeChangeWithEffectRefCommands = (range: IRange, com
operator = handleIRemoveRow(commandInfo as IRemoveRowColCommand, range);
break;
}
case EffectRefRangId.ReorderRangeCommandId: {
operator = handleReorderRange(commandInfo as IReorderRangeCommand, range);
break;
}
}

const resultRange = runRefRangeMutations(operator, range);
Expand Down Expand Up @@ -1136,6 +1163,22 @@ export function getEffectedRangesOnCommand(command: EffectRefRangeParams, deps:
}
return [range];
}
case EffectRefRangId.ReorderRangeCommandId: {
const params = command;
const { range, order } = params.params!;
const effectRanges = [];
for (let row = range.startRow; row <= range.endRow; row++) {
if (row in order) {
effectRanges.push({
startRow: row,
endRow: row,
startColumn: range.startColumn,
endColumn: range.endColumn,
});
}
}
return effectRanges;
}
}
}

Expand Down

0 comments on commit 0929401

Please sign in to comment.