diff --git a/packages/data-validation/src/models/data-validation-manager.ts b/packages/data-validation/src/models/data-validation-manager.ts index 8042a451060..aab752e39a5 100644 --- a/packages/data-validation/src/models/data-validation-manager.ts +++ b/packages/data-validation/src/models/data-validation-manager.ts @@ -135,7 +135,7 @@ export class DataValidationManager extends Dispos return this._dataValidations; } - validator(_content: Nullable, _rule: IDataValidationRule, _pos: any, _onCompele: (status: DataValidationStatus) => void) { + validator(_content: Nullable, _rule: IDataValidationRule, _pos: any, _onComplete: (status: DataValidationStatus, changed: boolean) => void) { return DataValidationStatus.VALID; } } diff --git a/packages/data-validation/src/models/data-validation-model.ts b/packages/data-validation/src/models/data-validation-model.ts index 5e728a28832..71cbde9a496 100644 --- a/packages/data-validation/src/models/data-validation-model.ts +++ b/packages/data-validation/src/models/data-validation-model.ts @@ -158,13 +158,15 @@ export class DataValidationModel, rule: T, pos: any) { const { unitId, subUnitId } = pos; const manager = this.ensureManager(unitId, subUnitId); - return manager.validator(content, rule, pos, (status: DataValidationStatus) => { - this._validStatusChange$.next({ - unitId, - subUnitId, - ruleId: rule.uid, - status, - }); + return manager.validator(content, rule, pos, (status, changed) => { + if (changed) { + this._validStatusChange$.next({ + unitId, + subUnitId, + ruleId: rule.uid, + status, + }); + } }); } @@ -185,4 +187,8 @@ export class DataValidationModel, rule: ISheetDataValidationRule, pos: ISheetLocation, onCompete: (status: DataValidationStatus) => void): DataValidationStatus { + override validator(cellValue: Nullable, rule: ISheetDataValidationRule, pos: ISheetLocationBase, onCompete: (status: DataValidationStatus, changed: boolean) => void): DataValidationStatus { const { col, row, unitId, subUnitId } = pos; const ruleId = rule.uid; const validator = this._dataValidatorRegistryService.getValidatorItem(rule.type); @@ -157,12 +157,14 @@ export class SheetDataValidationManager extends DataValidationManager(unitId, UniverInstanceType.UNIVER_SHEET); + if (!workbook) { + throw new Error(`cannot find current workbook, unitId: ${unitId}`); + } + + const worksheet = workbook.getSheetBySheetId(subUnitId); + if (!worksheet) { + throw new Error(`cannot find current worksheet, sheetId: ${subUnitId}`); + } + + const cellRaw = worksheet.getCellRaw(row, col); + const manager = this._dataValidationModel.ensureManager(unitId, subUnitId) as SheetDataValidationManager; + const rule = manager.getRuleByLocation(row, col); + if (!rule) { + return DataValidationStatus.VALID; + } + + return new Promise((resolve) => { + manager.validator(getCellValueOrigin(cellRaw), rule, { unitId, subUnitId, row, col }, resolve); + }); + } + + async validatorWorksheet(unitId: string, subUnitId: string) { + const manager = this._dataValidationModel.ensureManager(unitId, subUnitId) as SheetDataValidationManager; + const rules = manager.getDataValidations(); + await Promise.all(rules.map((rule) => { + return Promise.all(rule.ranges.map((range) => { + const promises: Promise[] = []; + Range.foreach(range, (row, col) => { + promises.push(this.validatorCell(unitId, subUnitId, row, col)); + }); + return promises; + })); + })); + + return this._dataValidationCacheService.ensureCache(unitId, subUnitId); + } + + async validatorWorkbook(unitId: string) { + const sheetIds = this._dataValidationModel.getSubUnitIds(unitId); + const results = await Promise.all(sheetIds.map((id) => this.validatorWorksheet(unitId, id))); + + const map: Record>> = {}; + + results.forEach((result, i) => { + map[sheetIds[i]] = result; + }); + + return map; + } +}