From cfea213a03125219c0ddf1bcead5492cd09edcd8 Mon Sep 17 00:00:00 2001 From: gggpound Date: Wed, 3 Apr 2024 00:09:11 +0800 Subject: [PATCH] fix(conditional-formatting): delete and undo error --- .../delete-conditional-rule.mutation.ts | 37 +++++++++++++------ .../src/utils/anchor.ts | 8 ++-- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/packages/sheets-conditional-formatting/src/commands/mutations/delete-conditional-rule.mutation.ts b/packages/sheets-conditional-formatting/src/commands/mutations/delete-conditional-rule.mutation.ts index 6da73f37a3ca..4d755353298c 100644 --- a/packages/sheets-conditional-formatting/src/commands/mutations/delete-conditional-rule.mutation.ts +++ b/packages/sheets-conditional-formatting/src/commands/mutations/delete-conditional-rule.mutation.ts @@ -21,6 +21,7 @@ import { } from '@univerjs/core'; import type { IAccessor } from '@wendellhu/redi'; import { ConditionalFormattingRuleModel } from '../../models/conditional-formatting-rule-model'; +import { transformSupportSymmetryAnchor } from '../../utils/anchor'; import type { IAddConditionalRuleMutationParams } from './add-conditional-rule.mutation'; import { AddConditionalRuleMutation } from './add-conditional-rule.mutation'; import type { IMoveConditionalRuleMutationParams } from './move-conditional-rule.mutation'; @@ -34,18 +35,30 @@ export interface IDeleteConditionalRuleMutationParams { export const DeleteConditionalRuleMutationUndoFactory = (accessor: IAccessor, param: IDeleteConditionalRuleMutationParams) => { const conditionalFormattingRuleModel = accessor.get(ConditionalFormattingRuleModel); const { unitId, subUnitId, cfId } = param; - const rule = conditionalFormattingRuleModel.getRule(unitId, subUnitId, cfId); - const ruleList = conditionalFormattingRuleModel.getSubunitRules(unitId, subUnitId); - if (rule) { - const index = ruleList!.findIndex((rule) => rule.cfId === cfId); - const nextRule = ruleList![index - 1]; - const result: IMutationInfo[] = [{ id: AddConditionalRuleMutation.id, - params: { unitId, subUnitId, rule: Tools.deepClone(rule) } as IAddConditionalRuleMutationParams }, - ]; - if (nextRule && index !== 0) { - result.push({ id: MoveConditionalRuleMutation.id, params: { - unitId, subUnitId, cfId, targetCfId: nextRule.cfId, - } as IMoveConditionalRuleMutationParams }); + const ruleList = ([...(conditionalFormattingRuleModel.getSubunitRules(unitId, subUnitId) || [])]); + const index = ruleList.findIndex((item) => item.cfId === cfId); + const beforeRule = ruleList[index - 1]; + if (index > -1) { + const rule = ruleList[index]; + const result: IMutationInfo[] = [{ + id: AddConditionalRuleMutation.id, + params: { unitId, subUnitId, rule: Tools.deepClone(rule) } as IAddConditionalRuleMutationParams, + }]; + ruleList.splice(index, 1); + if (index !== 0) { + const firstRule = ruleList[0]; + if (firstRule) { + const transformResult = transformSupportSymmetryAnchor({ id: firstRule.cfId, type: 'before' }, { id: beforeRule.cfId, type: 'after' }, ruleList, (rule) => rule.cfId); + if (!transformResult) { + return result; + } + const [start, end] = transformResult; + const params: IMoveConditionalRuleMutationParams = { + unitId, subUnitId, start, + end, + }; + result.push({ id: MoveConditionalRuleMutation.id, params }); + } } return result; } diff --git a/packages/sheets-conditional-formatting/src/utils/anchor.ts b/packages/sheets-conditional-formatting/src/utils/anchor.ts index 434b8daf8e2f..dbcb82d30af0 100644 --- a/packages/sheets-conditional-formatting/src/utils/anchor.ts +++ b/packages/sheets-conditional-formatting/src/utils/anchor.ts @@ -77,11 +77,6 @@ export const moveByAnchor = (start: IAnchor, end: IAnchor, ruleLi /** * 只有 [after,after] and [after,before] 能够支持对称操作 - * - * @template T - * @param {IAnchor} anchor - * @param {T[]} ruleList - * @param {(v: T) => string} get */ export const transformSupportSymmetryAnchor = (start: IAnchor, end: IAnchor, ruleList: T[], get: (v: T) => string): [IAnchor, IAnchor] | null => { if (start.type === 'after' && ['after', 'before'].includes(end.type)) { @@ -127,6 +122,9 @@ export const transformSupportSymmetryAnchor = (start: IAnchor, en return null; } } + if (_start.id === _end.id && _start.type === _end.type) { + return null; + } return [_start, _end]; }; export const anchorUndoFactory = (start: IAnchor, end: IAnchor): [IAnchor, IAnchor] | null => {