feat(sheets): register other formula (#2045)

* feat: move register-other-formula.service to sheets-formula

* feat: update
This commit is contained in:
zhangw
2024-04-24 12:05:19 +08:00
committed by GitHub
parent 1ff12617f3
commit 4a8ffd944c
13 changed files with 42 additions and 68 deletions
-1
View File
@@ -67,5 +67,4 @@ export { removeDataValidationUndoFactory } from './commands/commands/data-valida
export { TWO_FORMULA_OPERATOR_COUNT } from './types/const/two-formula-operators';
export { DataValidationResourceController } from './controllers/dv-resource.controller';
export { DataValidationSheetController } from './controllers/dv-sheet.controller';
export { DataValidationFormulaMarkDirty, type IDataValidationFormulaMarkDirtyParams } from './commands/mutations/formula.mutation';
export { TextLengthErrorTitleMap } from './types/const/operator-text-map';
-2
View File
@@ -23,7 +23,6 @@ import { AddDataValidationCommand, RemoveAllDataValidationCommand, RemoveDataVal
import { AddDataValidationMutation, RemoveDataValidationMutation, UpdateDataValidationMutation } from './commands/mutations/data-validation.mutation';
import { DataValidationResourceController } from './controllers/dv-resource.controller';
import { DataValidationSheetController } from './controllers/dv-sheet.controller';
import { DataValidationFormulaMarkDirty } from './commands/mutations/formula.mutation';
const PLUGIN_NAME = 'data-validation';
@@ -63,7 +62,6 @@ export class UniverDataValidationPlugin extends Plugin {
RemoveDataValidationCommand,
// mutation
DataValidationFormulaMarkDirty,
AddDataValidationMutation,
UpdateDataValidationMutation,
RemoveDataValidationMutation,
@@ -25,7 +25,6 @@ export { AddSheetDataValidationAndOpenCommand, AddSheetDataValidationCommand, Up
export { DataValidationCacheService } from './services/dv-cache.service';
export { DataValidationFormulaService } from './services/dv-formula.service';
export { DataValidationCustomFormulaService } from './services/dv-custom-formula.service';
export { RegisterOtherFormulaService } from './services/register-formula.service';
export { DataValidationRefRangeController } from './controllers/dv-ref-range.controller';
export { DATA_VALIDATION_PLUGIN_NAME } from './common/const';
export { DataValidationAutoFillController } from './controllers/dv-auto-fill.controller';
@@ -24,7 +24,6 @@ import { AddSheetDataValidationAndOpenCommand, AddSheetDataValidationCommand, Up
import { DataValidationCacheService } from './services/dv-cache.service';
import { DataValidationFormulaService } from './services/dv-formula.service';
import { DataValidationCustomFormulaService } from './services/dv-custom-formula.service';
import { RegisterOtherFormulaService } from './services/register-formula.service';
import { DataValidationRefRangeController } from './controllers/dv-ref-range.controller';
import { enUS, zhCN } from './locale';
import { DATA_VALIDATION_PLUGIN_NAME } from './common/const';
@@ -56,7 +55,6 @@ export class UniverSheetsDataValidationPlugin extends Plugin {
[DataValidationCacheService],
[DataValidationFormulaService],
[DataValidationCustomFormulaService],
[RegisterOtherFormulaService],
[DataValidationDropdownManagerService],
// controller
@@ -15,11 +15,11 @@
*/
import type { IRange, ISheetDataValidationRule } from '@univerjs/core';
import { DataValidationType, Disposable, isFormulaString, IUniverInstanceService, ObjectMatrix, Range } from '@univerjs/core';
import { DataValidationType, Disposable, isFormulaString, ObjectMatrix, Range } from '@univerjs/core';
import { isFormulaTransformable, LexerTreeBuilder, transformFormula } from '@univerjs/engine-formula';
import { Inject } from '@wendellhu/redi';
import { DataValidationModel } from '@univerjs/data-validation';
import { RegisterOtherFormulaService } from './register-formula.service';
import { RegisterOtherFormulaService } from '@univerjs/sheets-formula';
import { DataValidationCacheService } from './dv-cache.service';
interface IDataValidationFormula {
@@ -63,7 +63,6 @@ export class DataValidationCustomFormulaService extends Disposable {
constructor(
@Inject(RegisterOtherFormulaService) private _registerOtherFormulaService: RegisterOtherFormulaService,
@Inject(LexerTreeBuilder) private _lexerTreeBuilder: LexerTreeBuilder,
@IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService,
@Inject(DataValidationModel) private readonly _dataValidationModel: DataValidationModel,
@Inject(DataValidationCacheService) private readonly _dataValidationCacheService: DataValidationCacheService
) {
@@ -81,9 +80,9 @@ export class DataValidationCustomFormulaService extends Disposable {
const { formulaCellMap, ruleFormulaMap } = this._ensureMaps(unitId, subUnitId);
const manager = this._dataValidationModel.ensureManager(unitId, subUnitId);
results.forEach((result) => {
const ruleInfo = ruleFormulaMap.get(result.ruleId);
const ruleInfo = ruleFormulaMap.get(result.extra?.ruleId);
const cellInfo = formulaCellMap.get(result.formulaId);
const rule = manager.getRuleById(result.ruleId);
const rule = manager.getRuleById(result.extra?.ruleId);
if (rule && ruleInfo && !ruleInfo.isTransformable) {
this._dataValidationCacheService.markRangeDirty(unitId, subUnitId, rule.ranges);
@@ -125,14 +124,6 @@ export class DataValidationCustomFormulaService extends Disposable {
formulaCellMap = new Map();
formulaCellUnitMap.set(subUnitId, formulaCellMap);
// if (rules) {
// rules.forEach((rule) => {
// if (rule.type === DataValidationType.CUSTOM) {
// this.addRule(unitId, subUnitId, rule);
// }
// });
// }
}
return {
formulaMap,
@@ -142,7 +133,7 @@ export class DataValidationCustomFormulaService extends Disposable {
};
private _registerFormula(unitId: string, subUnitId: string, ruleId: string, formulaString: string) {
return this._registerOtherFormulaService.registerFormula(unitId, subUnitId, ruleId, formulaString);
return this._registerOtherFormulaService.registerFormula(unitId, subUnitId, formulaString, { ruleId });
};
deleteByRuleId(unitId: string, subUnitId: string, ruleId: string) {
@@ -18,8 +18,8 @@ import type { Nullable } from '@univerjs/core';
import { Disposable, isFormulaString } from '@univerjs/core';
import { Inject } from '@wendellhu/redi';
import { DataValidationModel } from '@univerjs/data-validation';
import type { IDataValidationFormulaResult, IFormulaInfo } from './formula-common';
import { RegisterOtherFormulaService } from './register-formula.service';
import type { IFormulaInfo, IOtherFormulaResult } from '@univerjs/sheets-formula';
import { RegisterOtherFormulaService } from '@univerjs/sheets-formula';
import { DataValidationCacheService } from './dv-cache.service';
type RuleId = string;
@@ -31,7 +31,6 @@ export class DataValidationFormulaService extends Disposable {
constructor(
@Inject(RegisterOtherFormulaService) private _registerOtherFormulaService: RegisterOtherFormulaService,
// @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService,
@Inject(DataValidationCacheService) private readonly _dataValidationCacheService: DataValidationCacheService,
@Inject(DataValidationModel) private readonly _dataValidationModel: DataValidationModel
) {
@@ -48,8 +47,8 @@ export class DataValidationFormulaService extends Disposable {
const formulaMap = this._ensureRuleFormulaMap(unitId, subUnitId);
const manager = this._dataValidationModel.ensureManager(unitId, subUnitId);
results.forEach((result) => {
if (formulaMap.get(result.ruleId)) {
const rule = manager.getRuleById(result.ruleId);
if (formulaMap.get(result.extra?.ruleId)) {
const rule = manager.getRuleById(result.extra?.ruleId);
if (rule) {
this._dataValidationCacheService.markRangeDirty(unitId, subUnitId, rule.ranges);
}
@@ -73,15 +72,6 @@ export class DataValidationFormulaService extends Disposable {
if (!subUnitMap) {
subUnitMap = new Map();
unitMap.set(subUnitId, subUnitMap);
// const worksheet = this._univerInstanceService.getUniverSheetInstance(unitId)?.getSheetBySheetId(subUnitId);
// const rules = worksheet?.getSnapshot().dataValidation;
// if (rules) {
// rules.forEach((rule) => {
// if (rule.type !== DataValidationType.CUSTOM) {
// this.addRule(unitId, subUnitId, rule.uid, rule.formula1, rule.formula2);
// }
// });
// }
}
return subUnitMap;
@@ -96,12 +86,12 @@ export class DataValidationFormulaService extends Disposable {
const formulaRuleMap = this._ensureRuleFormulaMap(unitId, subUnitId);
const item: [IFormulaInfo | undefined, IFormulaInfo | undefined] = [undefined, undefined];
if (isFormula1Legal) {
const id = this._registerOtherFormulaService.registerFormula(unitId, subUnitId, ruleId, formula1!);
const id = this._registerOtherFormulaService.registerFormula(unitId, subUnitId, formula1!, { ruleId });
item[0] = { id, text: formula1! };
}
if (isFormula2Legal) {
const id = this._registerOtherFormulaService.registerFormula(unitId, subUnitId, ruleId, formula2!);
const id = this._registerOtherFormulaService.registerFormula(unitId, subUnitId, formula2!, { ruleId });
item[1] = { id, text: formula2! };
}
formulaRuleMap.set(ruleId, item);
@@ -130,7 +120,7 @@ export class DataValidationFormulaService extends Disposable {
if (oldFormula1?.text !== formula1) {
oldFormula1 && this._registerOtherFormulaService.deleteFormula(unitId, subUnitId, [oldFormula1.id]);
if (isFormulaString(formula1)) {
const formulaId = this._registerOtherFormulaService.registerFormula(unitId, subUnitId, ruleId, formula1!);
const formulaId = this._registerOtherFormulaService.registerFormula(unitId, subUnitId, formula1!, { ruleId });
item[0] = {
text: formula1!,
id: formulaId,
@@ -143,7 +133,7 @@ export class DataValidationFormulaService extends Disposable {
if (oldFormula2?.text !== formula2) {
oldFormula2 && this._registerOtherFormulaService.deleteFormula(unitId, subUnitId, [oldFormula2.id]);
if (isFormulaString(formula2)) {
const formulaId = this._registerOtherFormulaService.registerFormula(unitId, subUnitId, ruleId, formula2!);
const formulaId = this._registerOtherFormulaService.registerFormula(unitId, subUnitId, formula2!, { ruleId });
item[1] = {
text: formula2!,
id: formulaId,
@@ -154,7 +144,7 @@ export class DataValidationFormulaService extends Disposable {
}
}
getRuleFormulaResult(unitId: string, subUnitId: string, ruleId: string): Promise<Nullable<[Nullable<IDataValidationFormulaResult>, Nullable<IDataValidationFormulaResult>]>> {
getRuleFormulaResult(unitId: string, subUnitId: string, ruleId: string): Promise<Nullable<[Nullable<IOtherFormulaResult>, Nullable<IOtherFormulaResult>]>> {
const ruleFormulaMap = this._ensureRuleFormulaMap(unitId, subUnitId);
const formulaInfo = ruleFormulaMap.get(ruleId);
@@ -41,7 +41,7 @@ const debounceExecuteFactory = (commandService: ICommandService) => debounce(
275
);
// eslint-disable-next-line max-lines-per-function
export function DataValidationDetail() {
const [key, setKey] = useState(0);
const dataValidationPanelService = useDependency(DataValidationPanelService);
@@ -17,9 +17,9 @@
import type { IMutation } from '@univerjs/core';
import { CommandType } from '@univerjs/core';
export interface IDataValidationFormulaMarkDirtyParams { [unitId: string]: { [sunUnitId: string]: { [formulaId: string]: boolean } } }
export interface IOtherFormulaMarkDirtyParams { [unitId: string]: { [sunUnitId: string]: { [formulaId: string]: boolean } } }
export const DataValidationFormulaMarkDirty: IMutation<IDataValidationFormulaMarkDirtyParams> = {
export const OtherFormulaMarkDirty: IMutation<IOtherFormulaMarkDirtyParams> = {
type: CommandType.MUTATION,
id: 'sheet.mutation.data-validation-formula-mark-dirty',
handler() {
@@ -31,6 +31,7 @@ import { SearchFunctionOperation } from '../commands/operations/search-function.
import { RenderFormulaPromptContent } from '../views/FormulaPromptContainer';
import { MORE_FUNCTIONS_COMPONENT } from '../views/more-functions/interface';
import { MoreFunctions } from '../views/more-functions/MoreFunctions';
import { OtherFormulaMarkDirty } from '../commands/mutations/formula.mutation';
import { InsertFunctionMenuItemFactory, MoreFunctionsMenuItemFactory, PasteFormulaMenuItemFactory } from './menu';
import {
ChangeRefToAbsoluteShortcut,
@@ -81,6 +82,7 @@ export class FormulaUIController extends Disposable {
HelpFunctionOperation,
SelectEditorFormulaOperation,
ReferenceAbsoluteOperation,
OtherFormulaMarkDirty,
].forEach((command) => this.disposeWithMe(this._commandService.registerCommand(command)));
}
@@ -41,6 +41,7 @@ import { IRegisterFunctionService, RegisterFunctionService } from './services/re
import { NumfmtFormulaDisplayController } from './controllers/numfmt-formula-display.controller';
import { DefinedNameController } from './controllers/defined-name.controller';
import { FormulaRefRangeService } from './services/formula-ref-range.service';
import { RegisterOtherFormulaService } from './services/register-other-formula.service';
/**
* The configuration of the formula UI plugin.
@@ -79,6 +80,7 @@ export class UniverSheetsFormulaPlugin extends Plugin {
[IRegisterFunctionService, { useClass: RegisterFunctionService }],
[FormulaRefRangeService],
[RegisterOtherFormulaService],
// controllers
[FormulaUIController],
+2
View File
@@ -27,3 +27,5 @@ export { RegisterFunctionService } from './services/register-function.service';
export { IRegisterFunctionService } from './services/register-function.service';
export { FormulaRefRangeService } from './services/formula-ref-range.service';
export { SPECIAL_PASTE_FORMULA } from './commands/commands/formula-clipboard.command';
export { RegisterOtherFormulaService } from './services/register-other-formula.service';
export type { IFormulaInfo, IOtherFormulaResult } from './services/formula-common';
@@ -23,12 +23,12 @@ export enum FormulaResultStatus {
ERROR,
}
export interface IDataValidationFormulaResult {
export interface IOtherFormulaResult {
result?: Nullable<ICellData>[][];
status: FormulaResultStatus;
ruleId: string;
formulaId: string;
callbacks: Set<(value: Nullable<ICellData>[][]) => void>;
extra?: Record<string, any>;
}
export interface IFormulaInfo {
@@ -19,17 +19,17 @@ import { Disposable, ICommandService, Tools } from '@univerjs/core';
import type { IRemoveOtherFormulaMutationParams, ISetFormulaCalculationResultMutation, ISetOtherFormulaMutationParams } from '@univerjs/engine-formula';
import { IActiveDirtyManagerService, RemoveOtherFormulaMutation, SetFormulaCalculationResultMutation, SetOtherFormulaMutation } from '@univerjs/engine-formula';
import { bufferTime, filter, map, Subject } from 'rxjs';
import type { IDataValidationFormulaMarkDirtyParams } from '@univerjs/data-validation';
import { DataValidationFormulaMarkDirty } from '@univerjs/data-validation';
import { FormulaResultStatus, type IDataValidationFormulaResult } from './formula-common';
import type { IOtherFormulaMarkDirtyParams } from '../commands/mutations/formula.mutation';
import { OtherFormulaMarkDirty } from '../commands/mutations/formula.mutation';
import { FormulaResultStatus, type IOtherFormulaResult } from './formula-common';
export class RegisterOtherFormulaService extends Disposable {
private _formulaCacheMap: Map<string, Map<string, Map<string, IDataValidationFormulaResult>>> = new Map();
private _formulaCacheMap: Map<string, Map<string, Map<string, IOtherFormulaResult>>> = new Map();
private _formulaChange$ = new Subject<{ unitId: string; subUnitId: string; formulaText: string; formulaId: string }>();
public formulaChange$ = this._formulaChange$.asObservable();
private _formulaResult$ = new Subject<Record<string, Record<string, IDataValidationFormulaResult[]>>>();
private _formulaResult$ = new Subject<Record<string, Record<string, IOtherFormulaResult[]>>>();
public formulaResult$ = this._formulaResult$.asObservable();
constructor(
@@ -64,10 +64,10 @@ export class RegisterOtherFormulaService extends Disposable {
}
private _initFormulaRegister() {
this._activeDirtyManagerService.register(DataValidationFormulaMarkDirty.id,
{ commandId: DataValidationFormulaMarkDirty.id,
this._activeDirtyManagerService.register(OtherFormulaMarkDirty.id,
{ commandId: OtherFormulaMarkDirty.id,
getDirtyData(commandInfo) {
const params = commandInfo.params as IDataValidationFormulaMarkDirtyParams;
const params = commandInfo.params as IOtherFormulaMarkDirtyParams;
return {
dirtyUnitOtherFormulaMap: params,
};
@@ -91,8 +91,8 @@ export class RegisterOtherFormulaService extends Disposable {
const value = result[unitId][subUnitId];
const config: ISetOtherFormulaMutationParams = { unitId, subUnitId, formulaMap: value };
this._commandService.executeCommand(SetOtherFormulaMutation.id, config).then(() => {
this._commandService.executeCommand(DataValidationFormulaMarkDirty.id,
{ [unitId]: { [subUnitId]: value } } as unknown as IDataValidationFormulaMarkDirtyParams);
this._commandService.executeCommand(OtherFormulaMarkDirty.id,
{ [unitId]: { [subUnitId]: value } } as unknown as IOtherFormulaMarkDirtyParams);
});
}
}
@@ -106,15 +106,15 @@ export class RegisterOtherFormulaService extends Disposable {
const params = commandInfo.params as ISetFormulaCalculationResultMutation;
const { unitOtherData } = params;
const results: Record<string, Record<string, IDataValidationFormulaResult[]>> = {};
const results: Record<string, Record<string, IOtherFormulaResult[]>> = {};
for (const unitId in unitOtherData) {
const unitData = unitOtherData[unitId];
const unitResults: Record<string, IDataValidationFormulaResult[]> = {};
const unitResults: Record<string, IOtherFormulaResult[]> = {};
results[unitId] = unitResults;
for (const subUnitId in unitData) {
const cacheMap = this._ensureCacheMap(unitId, subUnitId);
const subUnitData = unitData[subUnitId];
const subUnitResults: IDataValidationFormulaResult[] = [];
const subUnitResults: IOtherFormulaResult[] = [];
unitResults[subUnitId] = subUnitResults;
for (const formulaId in subUnitData) {
const current = subUnitData[formulaId];
@@ -136,16 +136,16 @@ export class RegisterOtherFormulaService extends Disposable {
}));
}
registerFormula(unitId: string, subUnitId: string, ruleId: string, formulaText: string) {
registerFormula(unitId: string, subUnitId: string, formulaText: string, extra?: Record<string, any>) {
const formulaId = this._createFormulaId(unitId, subUnitId);
const cacheMap = this._ensureCacheMap(unitId, subUnitId);
cacheMap.set(formulaId, {
result: undefined,
status: FormulaResultStatus.WAIT,
ruleId,
formulaId,
callbacks: new Set(),
extra,
});
this._formulaChange$.next({
unitId,
@@ -167,7 +167,7 @@ export class RegisterOtherFormulaService extends Disposable {
formulaIdList.forEach((id) => cacheMap.delete(id));
}
getFormulaValue(unitId: string, subUnitId: string, formulaId: string): Promise<Nullable<IDataValidationFormulaResult>> {
getFormulaValue(unitId: string, subUnitId: string, formulaId: string): Promise<Nullable<IOtherFormulaResult>> {
const cacheMap = this._ensureCacheMap(unitId, subUnitId);
const item = cacheMap.get(formulaId);
if (!item) {
@@ -185,14 +185,7 @@ export class RegisterOtherFormulaService extends Disposable {
});
}
async getTempFormulaResult(unitId: string, subUnitId: string, formulaString: string) {
const formulaId = this.registerFormula(unitId, subUnitId, 'temp', formulaString);
const formulaValue = await this.getFormulaValue(unitId, subUnitId, formulaId);
this.deleteFormula(unitId, subUnitId, [formulaId]);
return formulaValue;
}
getFormulaValueSync(unitId: string, subUnitId: string, formulaId: string): Nullable<IDataValidationFormulaResult> {
getFormulaValueSync(unitId: string, subUnitId: string, formulaId: string): Nullable<IOtherFormulaResult> {
const cacheMap = this._ensureCacheMap(unitId, subUnitId);
return cacheMap.get(formulaId);
}