mirror of
https://github.com/dream-num/univer.git
synced 2026-08-30 17:21:11 +08:00
fix: fix defined name can't be duplicate with table name (#6312)
This commit is contained in:
@@ -24,7 +24,7 @@ import { FormulaController } from './controller/formula.controller';
|
|||||||
import { SetDependencyController } from './controller/set-dependency.controller';
|
import { SetDependencyController } from './controller/set-dependency.controller';
|
||||||
import { SetFeatureCalculationController } from './controller/set-feature-calculation.controller';
|
import { SetFeatureCalculationController } from './controller/set-feature-calculation.controller';
|
||||||
import { SetOtherFormulaController } from './controller/set-other-formula.controller';
|
import { SetOtherFormulaController } from './controller/set-other-formula.controller';
|
||||||
import { SetSuperTableController } from './controller/set-super-table.controller';
|
// import { SetSuperTableController } from './controller/set-super-table.controller';
|
||||||
import { Lexer } from './engine/analysis/lexer';
|
import { Lexer } from './engine/analysis/lexer';
|
||||||
import { LexerTreeBuilder } from './engine/analysis/lexer-tree-builder';
|
import { LexerTreeBuilder } from './engine/analysis/lexer-tree-builder';
|
||||||
import { AstTreeBuilder } from './engine/analysis/parser';
|
import { AstTreeBuilder } from './engine/analysis/parser';
|
||||||
@@ -87,7 +87,7 @@ export class UniverFormulaEnginePlugin extends Plugin {
|
|||||||
override onReady(): void {
|
override onReady(): void {
|
||||||
touchDependencies(this._injector, [
|
touchDependencies(this._injector, [
|
||||||
[FormulaController],
|
[FormulaController],
|
||||||
[SetSuperTableController],
|
// [SetSuperTableController],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (!this._config?.notExecuteFormula) {
|
if (!this._config?.notExecuteFormula) {
|
||||||
@@ -125,7 +125,7 @@ export class UniverFormulaEnginePlugin extends Plugin {
|
|||||||
[FormulaDataModel],
|
[FormulaDataModel],
|
||||||
//Controllers
|
//Controllers
|
||||||
[FormulaController],
|
[FormulaController],
|
||||||
[SetSuperTableController],
|
// [SetSuperTableController],
|
||||||
[ComputingStatusReporterController],
|
[ComputingStatusReporterController],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,10 @@
|
|||||||
|
|
||||||
import type { ICommand, IMutationInfo, IRange } from '@univerjs/core';
|
import type { ICommand, IMutationInfo, IRange } from '@univerjs/core';
|
||||||
import type { ITableOptions } from '../../types/type';
|
import type { ITableOptions } from '../../types/type';
|
||||||
import { CommandType, generateRandomId, ICommandService, IUndoRedoService, LocaleService, sequenceExecute } from '@univerjs/core';
|
import { CommandType, customNameCharacterCheck, generateRandomId, ICommandService, IUndoRedoService, IUniverInstanceService, LocaleService, sequenceExecute } from '@univerjs/core';
|
||||||
|
import { IDefinedNamesService } from '@univerjs/engine-formula';
|
||||||
import { TableManager } from '../../model/table-manager';
|
import { TableManager } from '../../model/table-manager';
|
||||||
|
import { getExistingNamesSet } from '../../util';
|
||||||
import { AddSheetTableMutation } from '../mutations/add-sheet-table.mutation';
|
import { AddSheetTableMutation } from '../mutations/add-sheet-table.mutation';
|
||||||
import { DeleteSheetTableMutation } from '../mutations/delete-sheet-table.mutation';
|
import { DeleteSheetTableMutation } from '../mutations/delete-sheet-table.mutation';
|
||||||
|
|
||||||
@@ -37,21 +39,38 @@ export const AddSheetTableCommand: ICommand<IAddSheetTableCommandParams> = {
|
|||||||
if (!params) {
|
if (!params) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const undoRedoService = accessor.get(IUndoRedoService);
|
const undoRedoService = accessor.get(IUndoRedoService);
|
||||||
const commandService = accessor.get(ICommandService);
|
const commandService = accessor.get(ICommandService);
|
||||||
const localeService = accessor.get(LocaleService);
|
const localeService = accessor.get(LocaleService);
|
||||||
|
const tableManager = accessor.get(TableManager);
|
||||||
const tableId = params.id ?? generateRandomId();
|
const tableId = params.id ?? generateRandomId();
|
||||||
|
const existingNamesSet = getExistingNamesSet(params.unitId, {
|
||||||
|
univerInstanceService: accessor.get(IUniverInstanceService),
|
||||||
|
tableManager,
|
||||||
|
definedNamesService: accessor.get(IDefinedNamesService),
|
||||||
|
});
|
||||||
|
|
||||||
let tableName = params.name;
|
let tableName = params.name;
|
||||||
if (!tableName) {
|
if (!tableName || !customNameCharacterCheck(tableName, existingNamesSet)) {
|
||||||
const tableManager = accessor.get(TableManager);
|
const prefix = localeService.t('sheets-table.tablePrefix');
|
||||||
const tableCount = tableManager.getTableList(params.unitId).length;
|
let index = tableManager.getTableList(params.unitId).length + 1;
|
||||||
tableName = `${localeService.t('sheets-table.tablePrefix')}${tableCount + 1}`;
|
|
||||||
|
for (const name of existingNamesSet) {
|
||||||
|
if (name.startsWith(prefix)) {
|
||||||
|
const n = Number(name.slice(prefix.length));
|
||||||
|
if (Number.isInteger(n) && n >= index) {
|
||||||
|
index = n + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tableName = `${prefix}${index}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const redos: IMutationInfo[] = [];
|
const redos: IMutationInfo[] = [];
|
||||||
const undos: IMutationInfo[] = [];
|
const undos: IMutationInfo[] = [];
|
||||||
|
|
||||||
const tableManager = accessor.get(TableManager);
|
|
||||||
const { unitId, subUnitId, range } = params;
|
const { unitId, subUnitId, range } = params;
|
||||||
const header = tableManager.getColumnHeader(unitId, subUnitId, range, localeService.t('sheets-table.columnPrefix'));
|
const header = tableManager.getColumnHeader(unitId, subUnitId, range, localeService.t('sheets-table.columnPrefix'));
|
||||||
|
|
||||||
|
|||||||
@@ -14,12 +14,14 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { ICommand, Workbook } from '@univerjs/core';
|
import type { ICommand } from '@univerjs/core';
|
||||||
import type { ITableSetConfig } from '../../types/type';
|
import type { ITableSetConfig } from '../../types/type';
|
||||||
import type { ISetSheetTableMutationParams } from '../mutations/set-sheet-table.mutation';
|
import type { ISetSheetTableMutationParams } from '../mutations/set-sheet-table.mutation';
|
||||||
import { CommandType, customNameCharacterCheck, ICommandService, ILogService, IUndoRedoService, IUniverInstanceService, LocaleService, UniverInstanceType } from '@univerjs/core';
|
import { CommandType, customNameCharacterCheck, ICommandService, ILogService, IUndoRedoService, IUniverInstanceService, LocaleService } from '@univerjs/core';
|
||||||
|
import { IDefinedNamesService } from '@univerjs/engine-formula';
|
||||||
import { TableManager } from '../../model/table-manager';
|
import { TableManager } from '../../model/table-manager';
|
||||||
import { IRangeOperationTypeEnum } from '../../types/type';
|
import { IRangeOperationTypeEnum } from '../../types/type';
|
||||||
|
import { getExistingNamesSet } from '../../util';
|
||||||
import { SetSheetTableMutation } from '../mutations/set-sheet-table.mutation';
|
import { SetSheetTableMutation } from '../mutations/set-sheet-table.mutation';
|
||||||
|
|
||||||
export interface ISetSheetTableCommandParams extends ITableSetConfig {
|
export interface ISetSheetTableCommandParams extends ITableSetConfig {
|
||||||
@@ -37,7 +39,6 @@ export const SetSheetTableCommand: ICommand<ISetSheetTableCommandParams> = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { unitId, tableId, name, updateRange, rowColOperation, theme } = params;
|
const { unitId, tableId, name, updateRange, rowColOperation, theme } = params;
|
||||||
|
|
||||||
const tableManager = accessor.get(TableManager);
|
const tableManager = accessor.get(TableManager);
|
||||||
const table = tableManager.getTableById(unitId, tableId);
|
const table = tableManager.getTableById(unitId, tableId);
|
||||||
|
|
||||||
@@ -45,26 +46,15 @@ export const SetSheetTableCommand: ICommand<ISetSheetTableCommandParams> = {
|
|||||||
|
|
||||||
const oldTableConfig: ITableSetConfig = {};
|
const oldTableConfig: ITableSetConfig = {};
|
||||||
const newTableConfig: ITableSetConfig = {};
|
const newTableConfig: ITableSetConfig = {};
|
||||||
|
|
||||||
const localeService = accessor.get(LocaleService);
|
const localeService = accessor.get(LocaleService);
|
||||||
const univerInstanceService = accessor.get(IUniverInstanceService);
|
const existingNamesSet = getExistingNamesSet(unitId, {
|
||||||
const workbook = univerInstanceService.getCurrentUnitOfType<Workbook>(UniverInstanceType.UNIVER_SHEET);
|
univerInstanceService: accessor.get(IUniverInstanceService),
|
||||||
|
tableManager,
|
||||||
const sheetNameSet = new Set<string>();
|
definedNamesService: accessor.get(IDefinedNamesService),
|
||||||
if (workbook) {
|
});
|
||||||
workbook.getSheets().forEach((sheet) => {
|
|
||||||
sheetNameSet.add(sheet.getName());
|
|
||||||
});
|
|
||||||
|
|
||||||
// Add existing table names to the set to ensure uniqueness
|
|
||||||
const tableList = tableManager.getTableList(unitId);
|
|
||||||
tableList.forEach((tableItem) => {
|
|
||||||
sheetNameSet.add(tableItem.name);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
const isValidName = customNameCharacterCheck(name, sheetNameSet);
|
const isValidName = customNameCharacterCheck(name, existingNamesSet);
|
||||||
if (!isValidName) {
|
if (!isValidName) {
|
||||||
const logService = accessor.get(ILogService);
|
const logService = accessor.get(ILogService);
|
||||||
logService.warn(localeService.t('sheets-table.tableNameError'));
|
logService.warn(localeService.t('sheets-table.tableNameError'));
|
||||||
|
|||||||
@@ -14,9 +14,11 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { ICellData, IDocumentData, Nullable } from '@univerjs/core';
|
import type { ICellData, IDocumentData, IUniverInstanceService, Nullable, Workbook } from '@univerjs/core';
|
||||||
|
import type { IDefinedNamesService } from '@univerjs/engine-formula';
|
||||||
|
import type { TableManager } from './model/table-manager';
|
||||||
import type { ITableConditionFilterItem, ITableFilterItem, ITableManualFilterItem } from './types/type';
|
import type { ITableConditionFilterItem, ITableFilterItem, ITableManualFilterItem } from './types/type';
|
||||||
import { CellValueType } from '@univerjs/core';
|
import { CellValueType, UniverInstanceType } from '@univerjs/core';
|
||||||
import { SheetsTableButtonStateEnum, SheetsTableSortStateEnum, TableColumnFilterTypeEnum } from './types/enum';
|
import { SheetsTableButtonStateEnum, SheetsTableSortStateEnum, TableColumnFilterTypeEnum } from './types/enum';
|
||||||
|
|
||||||
export function getColumnName(columnIndex: number, columnText: string): string {
|
export function getColumnName(columnIndex: number, columnText: string): string {
|
||||||
@@ -97,3 +99,41 @@ export function isManualFilter(filter: ITableFilterItem | undefined): filter is
|
|||||||
}
|
}
|
||||||
return filter.filterType === TableColumnFilterTypeEnum.manual;
|
return filter.filterType === TableColumnFilterTypeEnum.manual;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get existing names including sheet names, table names and defined names to check for duplicates table name.
|
||||||
|
*/
|
||||||
|
export function getExistingNamesSet(unitId: string, options: {
|
||||||
|
univerInstanceService?: IUniverInstanceService;
|
||||||
|
tableManager?: TableManager;
|
||||||
|
definedNamesService?: IDefinedNamesService;
|
||||||
|
}): Set<string> {
|
||||||
|
const { univerInstanceService, tableManager, definedNamesService } = options;
|
||||||
|
const existingNamesSet = new Set<string>();
|
||||||
|
|
||||||
|
// The table names can't be duplicate with existing sheet names.
|
||||||
|
const workbook = univerInstanceService?.getUnit<Workbook>(unitId, UniverInstanceType.UNIVER_SHEET);
|
||||||
|
if (workbook) {
|
||||||
|
workbook.getSheets().forEach((sheet) => {
|
||||||
|
existingNamesSet.add(sheet.getName());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// The table names can't be duplicate with existing table names.
|
||||||
|
const tableList = tableManager?.getTableList(unitId);
|
||||||
|
if (tableList && tableList.length > 0) {
|
||||||
|
tableList.forEach((tableItem) => {
|
||||||
|
existingNamesSet.add(tableItem.name);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// The table names can't be duplicate with existing defined names.
|
||||||
|
const definedNames = definedNamesService?.getDefinedNameMap(unitId);
|
||||||
|
if (definedNames) {
|
||||||
|
Object.values(definedNames).forEach((definedName) => {
|
||||||
|
existingNamesSet.add(definedName.name);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return existingNamesSet;
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import type { ComponentType } from 'react';
|
|||||||
import type { IRangeSelectorProps } from '../../basics/editor/range';
|
import type { IRangeSelectorProps } from '../../basics/editor/range';
|
||||||
import { AbsoluteRefType, IUniverInstanceService, LocaleService, Tools, UniverInstanceType } from '@univerjs/core';
|
import { AbsoluteRefType, IUniverInstanceService, LocaleService, Tools, UniverInstanceType } from '@univerjs/core';
|
||||||
import { borderBottomClassName, borderClassName, Button, clsx, Input, Radio, RadioGroup, Select } from '@univerjs/design';
|
import { borderBottomClassName, borderClassName, Button, clsx, Input, Radio, RadioGroup, Select } from '@univerjs/design';
|
||||||
import { IDefinedNamesService, IFunctionService, isReferenceStrings, isReferenceStringWithEffectiveColumn, LexerTreeBuilder, operatorToken } from '@univerjs/engine-formula';
|
import { IDefinedNamesService, IFunctionService, isReferenceStrings, isReferenceStringWithEffectiveColumn, ISuperTableService, LexerTreeBuilder, operatorToken } from '@univerjs/engine-formula';
|
||||||
import { hasCJKText } from '@univerjs/engine-render';
|
import { hasCJKText } from '@univerjs/engine-render';
|
||||||
import { ErrorIcon } from '@univerjs/icons';
|
import { ErrorIcon } from '@univerjs/icons';
|
||||||
import { SCOPE_WORKBOOK_VALUE_DEFINED_NAME } from '@univerjs/sheets';
|
import { SCOPE_WORKBOOK_VALUE_DEFINED_NAME } from '@univerjs/sheets';
|
||||||
@@ -50,12 +50,12 @@ export const DefinedNameInput = (props: IDefinedNameInputProps) => {
|
|||||||
localSheetId = SCOPE_WORKBOOK_VALUE_DEFINED_NAME,
|
localSheetId = SCOPE_WORKBOOK_VALUE_DEFINED_NAME,
|
||||||
hidden = false, // 是否对用户隐藏,与excel兼容,暂时用不上。
|
hidden = false, // 是否对用户隐藏,与excel兼容,暂时用不上。
|
||||||
id,
|
id,
|
||||||
|
|
||||||
} = props;
|
} = props;
|
||||||
const univerInstanceService = useDependency(IUniverInstanceService);
|
const univerInstanceService = useDependency(IUniverInstanceService);
|
||||||
const workbook = univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!;
|
const workbook = univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!;
|
||||||
const localeService = useDependency(LocaleService);
|
const localeService = useDependency(LocaleService);
|
||||||
const definedNamesService = useDependency(IDefinedNamesService);
|
const definedNamesService = useDependency(IDefinedNamesService);
|
||||||
|
const superTableService = useDependency(ISuperTableService);
|
||||||
const functionService = useDependency(IFunctionService);
|
const functionService = useDependency(IFunctionService);
|
||||||
const lexerTreeBuilder = useDependency(LexerTreeBuilder);
|
const lexerTreeBuilder = useDependency(LexerTreeBuilder);
|
||||||
const componentManager = useDependency(ComponentManager);
|
const componentManager = useDependency(ComponentManager);
|
||||||
@@ -135,7 +135,11 @@ export const DefinedNameInput = (props: IDefinedNameInputProps) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (definedNamesService.getValueByName(unitId, nameValue) != null && (id == null || id.length === 0)) {
|
// The defined name can't be duplicate with existing defined names and table names.
|
||||||
|
if (
|
||||||
|
(definedNamesService.getValueByName(unitId, nameValue) || superTableService.getTableMap(unitId)?.has(nameValue)) &&
|
||||||
|
(id === null || id === undefined || id.length === 0)
|
||||||
|
) {
|
||||||
setValidString(localeService.t('definedName.nameDuplicate'));
|
setValidString(localeService.t('definedName.nameDuplicate'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user